ICNpbmNsdWRlIDxDb3B5cmlnaHQuaD4KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG1zQXBpRGVmcy5oCioKKiBERVNDUklQVElPTjoKKiAgICAgICBBUEkgZGVmaW5pdGlvbnMgZm9yIFF1YXJ0ZXJEZWNrIERldmljZQoqCiogREVQRU5ERU5DSUVTOgoqCiogRklMRSBSRVZJU0lPTiBOVU1CRVI6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgX19tc0FwaURlZnNfaAojZGVmaW5lIF9fbXNBcGlEZWZzX2gKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmCi8qIE1pY3JvIGRlZmluaXRpb25zICovIAojdW5kZWYgR1RfVVNFX01BRCAKI3VuZGVmIEdUX1JNR01UX0FDQ0VTUyAKI3VuZGVmIENPTkZJR19BVkJfRlBHQSAKI3VuZGVmIENPTkZJR19BVkJfRlBHQV8yCiN1bmRlZiBHVF9QT1JUX01BUF9JTl9ERVYKI2lmZGVmIENIRUNLX0FQSV9TRUxFQ1QKI2luY2x1ZGUgIm1zQXBpU2VsZWN0LmgiCiNlbmRpZgoKI2luY2x1ZGUgPG1zQXBpVHlwZXMuaD4KI2lmZGVmIEdUX1VTRV9NQUQgCiNpbmNsdWRlICJtYWRBcGlEZWZzLmgiCiNlbmRpZgoKI2lmZGVmIERFQlVHX1FECiNkZWZpbmUgREJHX0lORk8oeCkgZ3REYmdQcmludCB4CiNlbHNlCiNkZWZpbmUgREJHX0lORk8oeCk7CiNlbmRpZiAvKiBERUJVR19RRCAqLwoKdHlwZWRlZiBHVF9VMzIgR1RfU0VNOwoKI2RlZmluZSBFVEhFUk5FVF9IRUFERVJfU0laRSAgICBHVF9FVEhFUk5FVF9IRUFERVJfU0laRQojZGVmaW5lIElTX01VTFRJQ0FTVF9NQUMgICAgICAgIEdUX0lTX01VTFRJQ0FTVF9NQUMKI2RlZmluZSBJU19CUk9BRENBU1RfTUFDICAgICAgICBHVF9JU19CUk9BRENBU1RfTUFDCgojZGVmaW5lIEdUX0lOVkFMSURfUEhZICAgICAgICAgICAgMHhGRgojZGVmaW5lIEdUX0lOVkFMSURfUE9SVCAgICAgICAgICAgIDB4RkYKI2RlZmluZSBHVF9JTlZBTElEX1BPUlRfVkVDICAgICAgICAweEZGRkZGRkZGCgojZGVmaW5lIEdUX1VOVVNFRF9QQVJBTShfYSkgICAgICAgIChfYSk9KF9hKQoKLyoKICogICBMb2dpY2FsIFBvcnQgdmFsdWUgYmFzZWQgb24gYSBQb3J0CiAqICAgMyAzIDIgMiAyIDIgMiAyIDIgMiAyIDIgMSAxIDEgMSAxIDEgMSAxIDEgMQogKiAgIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMAogKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKICogIHwwfCAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgcG9ydCAgICAgICB8CiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwogKgogKgogKiAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHNob3VsZCBiZSB1c2VkIHRvIGV4dHJhY3Qgc3BlY2lmaWMgaW5mbwogKiAgIGZyb20gYSBMb2dpY2FsIFBvcnQgaW5kZXgKICovCnR5cGVkZWYgR1RfVTMyIEdUX0xQT1JUOwp0eXBlZGVmIEdUX1UzMiBHVF9FVFlQRTsKCgovKiBEZWZpbmUgdGhlIGRpZmZlcmVudCBkZXZpY2UgdHlwZSB0aGF0IG1heSBleGlzdCBpbiBzeXN0ZW0gICAgICAgICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF84OEU2MDIxICA9IDB4MDIxLAogICAgR1RfODhFNjAzMSAgPSAweDAzMSwKICAgIEdUXzg4RTYwMzUgID0gMHgwMzUsCiAgICBHVF84OEU2MDQ2ICA9IDB4MDQ4LAogICAgR1RfODhFNjA0NyAgPSAweDA0OSwKICAgIEdUXzg4RTYwODUgID0gMHgwNEEsCiAgICBHVF84OEU2MDUxICA9IDB4MDUxLAogICAgR1RfODhFNjA1MiAgPSAweDA1MiwKICAgIEdUXzg4RTYwNTUgID0gMHgwNTUsCiAgICBHVF84OEU2MDYwICA9IDB4MDYwLAogICAgR1RfODhFNjA2MSAgPSAweDA2MSwKICAgIEdUXzg4RTYwNjUgID0gMHgwNjUsCiAgICBHVF84OEU2MDgzICA9IDB4MDgzLAogICAgR1RfODhFNjA5MyAgPSAweDA5MywKICAgIEdUXzg4RTYwNDUgID0gMHgwOTQsCiAgICBHVF84OEU2MDk1ICA9IDB4MDk1LAogICAgR1RfODhFNjA5MiAgPSAweDA5NywKICAgIEdUXzg4RTYwOTYgID0gMHgwOTgsCiAgICBHVF84OEU2MDk3ICA9IDB4MDk5LAogICAgR1RfODhFNjA2MyAgICA9IDB4MTUzLAogICAgR1RfODhFNjEyMSAgICA9IDB4MTA0LAogICAgR1RfODhFNjEyMiAgICA9IDB4MTA1LAogICAgR1RfODhFNjEzMSAgICA9IDB4MTA2LAogICAgR1RfODhFNjEwOCAgICA9IDB4MTA3LAogICAgR1RfODhFNjEyMyAgICA9IDB4MTIxLAogICAgR1RfODhFNjEyNSAgICA9IDB4MTI0LCAgICAvKiB3YXMgODhFNjEyNCAqLwogICAgR1RfODhFNjE0MCAgICA9IDB4MTQxLCAvKiBFbWVyYWxkICovCiAgICBHVF84OEU2MTYxICAgID0gMHgxNjEsIC8qIEVtZXJhbGQgKi8KICAgIEdUXzg4RTYxNjUgICAgPSAweDE2NSwgLyogRW1lcmFsZCAqLwogICAgR1RfODhFNjE3MSAgICA9IDB4MTcxLCAvKiBBbWJlciAqLwogICAgR1RfODhFNjE3NSAgICA9IDB4MTc1LCAvKiBBbWJlciAqLwogICAgR1RfODhFNjE4MSAgICA9IDB4MUEwLAogICAgR1RfODhFNjE1MyAgICA9IDB4MUExLAogICAgR1RfODhFNjE4MyAgICA9IDB4MUEzLAogICAgR1RfODhFNjE1MiAgICA9IDB4MUE0LAogICAgR1RfODhFNjE1NSAgICA9IDB4MUE1LAogICAgR1RfODhFNjE4MiAgICA9IDB4MUE2LAogICAgR1RfODhFNjE4NSAgICA9IDB4MUE3LAogICAgR1RfODhFNjMyMSAgICA9IDB4MzI0LCAgICAvKiB3YXMgODhFNjMyNSAqLyAvKiBBbWJlciAqLwogICAgR1RfODhFNjM1MCAgICA9IDB4MzcxLCAgICAvKiB3YXMgODhFNjM3MSAqLyAvKiBBbWJlciAqLwogICAgR1RfODhFNjM1MSAgICA9IDB4Mzc1LCAvKiBBbWJlciAqLwogICAgR1RfODhFQzAwMCAgICA9IDB4QzAwLCAgICAvKiBNZWxvZHkgMHhjMDAtMHhjMDcgKi8KICAgIEdUXzg4RTMwMjAgICAgPSAweDAwMCwgICAgLyogU3Bpbm5ha2VyIDB4MDAwICovCiAgICBHVF84OEU2MDIwICAgID0gMHgwMjAsICAgIC8qIFNwaW5uYWtlciAweDAyMCAqLwogICAgR1RfODhFNjA3MCAgICA9IDB4MDcwLCAgICAvKiBTcGlubmFrZXIgMHgwNzAgKi8KICAgIEdUXzg4RTYwNzEgICAgPSAweDA3MSwgICAgLyogU3Bpbm5ha2VyIDB4MDcxICovCiAgICBHVF84OEU2MjIwICAgID0gMHgyMjAsICAgIC8qIFNwaW5uYWtlciAweDIyMCAqLwogICAgR1RfODhFNjI1MCAgICA9IDB4MjUwLCAgICAvKiBTcGlubmFrZXIgMHgyNTAgKi8KICAgIEdUX0ZIX1ZQTiAgID0gMHhGNTMsCiAgICBHVF9GRl9FRyAgICA9IDB4RjkxLAogICAgR1RfRkZfSEcgICAgPSAweEY5MywKICAgIEdUXzg4RTYxNzIgICAgPSAweDE3MiwgLyogQWdhdGUgKi8KICAgIEdUXzg4RTYxNzYgICAgPSAweDE3NiwgLyogQWdhdGUgKi8KICAgIEdUXzg4RTYyNDAgICAgPSAweDI0MCwgLyogQWdhdGUgKi8KICAgIEdUXzg4RTYzNTIgICAgPSAweDM1MiwgLyogQWdhdGUgKi8KCUdUX0tXMl9JTlQJPSAweDA0NAkJLyogSW50ZXJuYWwgU3dpeWNoIGluIEtXMiAqLwoKfUdUX0RFVklDRTsKCgovKiBEZWZpbml0aW9uIGZvciB0aGUgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBkZXZpY2UgICAgICAgICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9SRVZfMCA9IDAsCiAgICBHVF9SRVZfMSwKICAgIEdUX1JFVl8yLAogICAgR1RfUkVWXzMKfUdUX0RFVklDRV9SRVY7CgoKLyogVG9EbzogTm8gVXNlZCAqLwp0eXBlZGVmIGVudW0KewogICAgSU5UUl9NT0RFX0RJU0FCTEUgPTAsCiAgICBJTlRSX01PREVfRU5BQkxFCn1JTlRFUlJVUFRfTU9ERTsKCi8qIERlZmluaXRpb24gZm9yIHRoZSBQb3J0IFNwZWVkICovCnR5cGVkZWYgZW51bQp7CiAgICBQT1JUX1NQRUVEXzEwX01CUFMgPSAwLAogICAgUE9SVF9TUEVFRF8xMDBfTUJQUyA9IDEsCiAgICBQT1JUX1NQRUVEXzIwMF9NQlBTID0gMiwgICAgLyogdmFsaWQgb25seSBpZiBkZXZpY2Ugc3VwcG9ydCAqLwogICAgUE9SVF9TUEVFRF8xMDAwX01CUFMgPSAyICwgICAgLyogdmFsaWQgb25seSBpZiBkZXZpY2Ugc3VwcG9ydCAqLwogICAgUE9SVF9TUEVFRF9VTktOT1dOID0gMwp9IEdUX1BPUlRfU1BFRURfTU9ERTsKCi8qIERlZmluaXRpb24gZm9yIHRoZSBmb3JjZWQgUG9ydCBTcGVlZCAqLwp0eXBlZGVmIGVudW0KewogICAgUE9SVF9GT1JDRV9TUEVFRF8xMF9NQlBTID0gMCwKICAgIFBPUlRfRk9SQ0VfU1BFRURfMTAwX01CUFMgPSAxLAogICAgUE9SVF9GT1JDRV9TUEVFRF8yMDBfTUJQUyA9IDIsICAgIC8qIHZhbGlkIG9ubHkgaWYgZGV2aWNlIHN1cHBvcnQgKi8KICAgIFBPUlRfRk9SQ0VfU1BFRURfMTAwMF9NQlBTID0gMiwgICAgLyogdmFsaWQgb25seSBpZiBkZXZpY2Ugc3VwcG9ydCAqLwogICAgUE9SVF9ET19OT1RfRk9SQ0VfU1BFRUQgPTMKfSBHVF9QT1JUX0ZPUkNFRF9TUEVFRF9NT0RFOwoKLyogRGVmaW5pdGlvbiBmb3IgdGhlIGZvcmNlZCBQb3J0IER1cGxleCBtb2RlICovCnR5cGVkZWYgZW51bQp7CiAgICBQT1JUX0RPX05PVF9GT1JDRV9EVVBMRVgsCiAgICBQT1JUX0ZPUkNFX0ZVTExfRFVQTEVYLAogICAgUE9SVF9GT1JDRV9IQUxGX0RVUExFWAp9IEdUX1BPUlRfRk9SQ0VEX0RVUExFWF9NT0RFOwoKLyogRGVmaW5pdGlvbiBmb3IgdGhlIGZvcmNlZCBQb3J0IExpbmsgKi8KdHlwZWRlZiBlbnVtCnsKICAgIFBPUlRfRE9fTk9UX0ZPUkNFX0xJTkssCiAgICBQT1JUX0ZPUkNFX0xJTktfVVAsCiAgICBQT1JUX0ZPUkNFX0xJTktfRE9XTgp9IEdUX1BPUlRfRk9SQ0VEX0xJTktfTU9ERTsKCi8qIERlZmluaXRpb24gZm9yIHRoZSBmb3JjZWQgZmxvdyBjb250cm9sIG1vZGUgKi8KdHlwZWRlZiBlbnVtCnsKICAgIFBPUlRfRE9fTk9UX0ZPUkNFX0ZDLAogICAgUE9SVF9GT1JDRV9GQ19FTkFCTEVELAogICAgUE9SVF9GT1JDRV9GQ19ESVNBQkxFRAp9IEdUX1BPUlRfRk9SQ0VEX0ZDX01PREU7CgovKiBEZWZpbml0aW9uIGZvciB0aGUgUFBVIHN0YXRlICovCnR5cGVkZWYgZW51bQp7CiAgICBQUFVfU1RBVEVfRElTQUJMRURfQVRfUkVTRVQsCiAgICBQUFVfU1RBVEVfQUNUSVZFLAogICAgUFBVX1NUQVRFX0RJU0FCTEVEX0FGVEVSX1JFU0VULAogICAgUFBVX1NUQVRFX1BPTExJTkcKfSBHVF9QUFVfU1RBVEU7CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9QT1JUX0NPTkZJR19NT0RFCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHBvcnQncyBpbnRlcmZhY2UgdHlwZSBjb25maWd1cmF0aW9uIG1vZGUgZGV0ZXJtaW5lZCBhdCAKICogICAgICAgICAgICAgICAgcmVzZXQuIFRoaXMgZGVmaW5pdGlvbiBtYXkgbm90IHJlcHJlc2VudCB0aGUgZGV2aWNlIHVuZGVyIHVzZS4KICogICAgICAgICAgICAgICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0IGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KICoKICovCnR5cGVkZWYgZW51bQp7CiAgICBQT1JUQ0ZHX0dNSUlfMTI1TUhaID0gMCwgICAgICAgIC8qIFB4X0dUWENMSyA9IDEyNU1IeiwgMTAwMEJBU0UgKi8KICAgIFBPUlRDRkdfRkRfTUlJXzBNSFogPSAxLCAgICAgICAgLyogUHhfR1RYQ0xLID0gMCBNSHosIFBvd2VyIFNhdmUgKi8KICAgIFBPUlRDRkdfRkRIRF9NSUlfMjVNSFogPSAyLCAgICAgICAgLyogUHhfR1RYQ0xLID0gMjVNSHosIDEwMEJBU0UgKi8gCiAgICBQT1JUQ0ZHX0ZESERfTUlJXzJfNU1IWiA9IDMsICAgIC8qIFB4X0dUWENMSyA9IDIuNU1IeiwgMTBCQVNFICovCiAgICBQT1JUQ0ZHX0ZEX1NFUkRFUyA9IDQsICAgICAgICAgICAgLyogRGVmYXVsdCB2YWx1ZSAqLwogICAgUE9SVENGR19GRF8xMDAwQkFTRV9YID0gNSwgICAgICAgIAogICAgUE9SVENGR19NR01JSSA9IDYsICAgICAgICAgICAgICAgIC8qIGR1cGxleCwgc3BlZWQgZGV0ZXJtaW5lZCBieSB0aGUgUFBVICovCiAgICBQT1JUQ0ZHX0RJU0FCTEVEID0gNyAgICAgICAgICAgIAp9IEdUX1BPUlRfQ09ORklHX01PREU7CgoKdHlwZWRlZiBlbnVtCnsKICAgIEdUX1NBX0ZJTFRFUklOR19ESVNBQkxFID0gMCwKICAgIEdUX1NBX0RST1BfT05fTE9DSywKICAgIEdUX1NBX0RST1BfT05fVU5MT0NLLAogICAgR1RfU0FfRFJPUF9UT19DUFUKfSBHVF9TQV9GSUxURVJJTkc7CgoKLyogRGVmaW5pdGlvbiBmb3IgdGhlIEluZ3JlZS9FZ3Jlc3MgRnJhbWUgTW9kZSAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfRlJBTUVfTU9ERV9OT1JNQUwgPSAwLCAgICAvKiBOb3JtYWwgTmV0d29yayAqLwogICAgR1RfRlJBTUVfTU9ERV9EU0EsICAgICAgICAgICAgLyogRGlzdHJpYnV0ZWQgU3dpdGNoIEFyY2hpdGVjdHVyZSAqLwogICAgR1RfRlJBTUVfTU9ERV9QUk9WSURFUiwgICAgICAgIC8qIFByb3ZpZGVyICovCiAgICBHVF9GUkFNRV9NT0RFX0VUSEVSX1RZUEVfRFNBICAgIC8qIEV0aGVyIFR5cGUgRFNBICovCn0gR1RfRlJBTUVfTU9ERTsKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfSlVNQk9fTU9ERQogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyBKdW1ibyBGcmFtZSBTaXplIGFsbG93ZWQgdG8gYmUgdHggYW5kIHJ4CiAqCiAqIEZpZWxkczoKICogICAgICBHVF9KVU1CT19NT0RFXzE1MjIgLSBSeCBhbmQgVHggZnJhbWVzIHdpdGggbWF4IGJ5dGUgb2YgMTUyMi4KICogICAgICBHVF9KVU1CT19NT0RFXzIwNDggLSBSeCBhbmQgVHggZnJhbWVzIHdpdGggbWF4IGJ5dGUgb2YgMjA0OC4KICogICAgICBHVF9KVU1CT19NT0RFXzEwMjQwIC0gUnggYW5kIFR4IGZyYW1lcyB3aXRoIG1heCBieXRlIG9mIDEwMjQwLgogKiAgICAgICAgICAgICAgICAgCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfSlVNQk9fTU9ERV8xNTIyID0gMCwKICAgIEdUX0pVTUJPX01PREVfMjA0OCwKICAgIEdUX0pVTUJPX01PREVfMTAyNDAKfSBHVF9KVU1CT19NT0RFOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfUFJJX09WRVJSSURFCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBwcmlvcml0eSBvdmVycmlkZQogKgogKiBGaWVsZHM6CiAqICAgICAgUFJJX09WRVJSSURFX05PTkUgLSBOb3JtYWwgZnJhbWUgcHJpb3JpdHkgcHJvY2Vzc2luZyBvY2N1cnMuCiAqICAgICAgICBQUklfT1ZFUlJJREVfRlJBTUVfUVVFVUUgLQogKiAgICAgICAgICAgIEJvdGggZnJhbWUgYW5kIHF1ZXVlIG92ZXJyaWRlcyB0YWtlIHBsYWNlIG9uIHRoZSBmcmFtZS4KICogICAgICBQUklfT1ZFUlJJREVfRlJBTUUgLSAKICogICAgICAgICAgICBPdmVyd2l0ZSB0aGUgZnJhbWUncyBGUHJpIChmcmFtZSBwcmlvcml0eSkuCiAqICAgICAgICAgICAgSWYgdGhlIGZyYW1lIGVncmVzc2VzIHRhZ2dlZCwgdGhlIHByaW9yaXR5IGluIHRoZSBmcmFtZSB3aWxsIGJlCiAqICAgICAgICAgICAgdGhlIG92ZXJ3cml0dGVuIHByaW9yaXR5IHZhbHVlLgogKiAgICAgICAgUFJJX09WRVJSSURFX1FVRVVFIC0KICogICAgICAgICAgICBPdmVyd2l0ZSB0aGUgZnJhbWUncyBRUHJpIChxdWV1ZSBwcmlvcml0eSkuCiAqICAgICAgICAgICAgUVByaSBpcyB1c2VkIGludGVybmFsbHkgdG8gbWFwIHRoZSBmcmFtZSB0byBvbmUgb2YgdGhlIGVncmVzcwogKiAgICAgICAgICAgIHF1ZXVlcyBpbnNpZGUgdGhlIHN3aXRjaC4KICoKICovCnR5cGVkZWYgZW51bQp7CiAgICBQUklfT1ZFUlJJREVfTk9ORSA9IDAsCiAgICBQUklfT1ZFUlJJREVfRlJBTUVfUVVFVUUsCiAgICBQUklfT1ZFUlJJREVfRlJBTUUsCiAgICBQUklfT1ZFUlJJREVfUVVFVUUKfSBHVF9QUklfT1ZFUlJJREU7CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9GUkFNRV9QT0xJQ1kKICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIHBvbGljeSBvZiB0aGUgZnJhbWUKICoKICogRmllbGRzOgogKiAgICAgIEZSQU1FX1BPTElDWV9OT05FIC0gTm9ybWFsIGZyYW1lIHN3aXRjaGluZwogKiAgICAgIEZSQU1FX1BPTElDWV9NSVJST1IgLSBNaXJyb3IoY29weSkgZnJhbWUgdG8gdGhlIE1pcnJvckRlc3QgcG9ydAogKiAgICAgIEZSQU1FX1BPTElDWV9UUkFQIC0gVHJhcChyZS1kaXJlY3QpIGZyYW1lIHRvIHRoZSBDUFVEZXN0IHBvcnQKICogICAgICBGUkFNRV9QT0xJQ1lfRElTQ0FSRCAtIERpc2NhcmQoZmlsdGVyKSB0aGUgZnJhbWUKICoKICovCnR5cGVkZWYgZW51bQp7CiAgICBGUkFNRV9QT0xJQ1lfTk9ORSA9IDAsCiAgICBGUkFNRV9QT0xJQ1lfTUlSUk9SLAogICAgRlJBTUVfUE9MSUNZX1RSQVAsCiAgICBGUkFNRV9QT0xJQ1lfRElTQ0FSRAp9IEdUX0ZSQU1FX1BPTElDWTsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX1BPTElDWV9UWVBFCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBwb2xpY3kgdHlwZQogKgogKiBGaWVsZHM6CiAqICAgICAgUE9MSUNZX1RZUEVfREEgICAgIC0gUG9saWN5IGJhc2VkIG9uIERlc3RpbmF0aW9uIEFkZHJlc3MKICogICAgICBQT0xJQ1lfVFlQRV9TQSAgICAgLSBQb2xpY3kgYmFzZWQgb24gU291cmNlIEFkZHJlc3MKICogICAgICBQT0xJQ1lfVFlQRV9WVFUgICAgIC0gUG9saWN5IGJhc2VkIG9uIFZJRAogKiAgICAgICAgUE9MSUNZX1RZUEVfRVRZUEUgICAgLSBiYXNlZCBvbiBFdGhlciBUeXBlIG9mIGEgZnJhbWUKICogICAgICAgIFBPTElDWV9UWVBFX1BQUG9FICAgIC0gUG9saWN5IGZvciB0aGUgZnJhbWUgd2l0aCBFdGhlciBUeXBlIG9mIDB4ODg2MwogKiAgICAgICAgUE9MSUNZX1RZUEVfVkJBUyAgICAtIFBvbGljeSBmb3IgdGhlIGZyYW1lIHdpdGggRXRoZXIgVHlwZSBvZiAweDgyMDAKICogICAgICAgIFBPTElDWV9UWVBFX09QVDgyICAgIC0gUG9saWN5IGZvciB0aGUgZnJhbWUgd2l0aCBESENQIE9wdGlvbiA4MgogKiAgICAgICAgUE9MSUNZX1RZUEVfVURQICAgIC0gUG9saWN5IGZvciB0aGUgZnJhbWUgd2l0aCBCcm9hZGNhc3QgSVB2NCBVRFAgb3IKICogICAgICAgICAgICAgICAgICAgICAgICBNdWx0aWNhc3QgSVB2NiBVRFAKICovCnR5cGVkZWYgZW51bQp7CiAgICBQT0xJQ1lfVFlQRV9EQSwKICAgIFBPTElDWV9UWVBFX1NBLAogICAgUE9MSUNZX1RZUEVfVlRVLAogICAgUE9MSUNZX1RZUEVfRVRZUEUsCiAgICBQT0xJQ1lfVFlQRV9QUFBvRSwKICAgIFBPTElDWV9UWVBFX1ZCQVMsCiAgICBQT0xJQ1lfVFlQRV9PUFQ4MiwKICAgIFBPTElDWV9UWVBFX1VEUAp9IEdUX1BPTElDWV9UWVBFOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfUFJJX09WRVJSSURFX0ZUWVBFCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbml0aW9uIG9mIHRoZSBmcmFtZSB0eXBlIGZvciBwcmlvcml0eSBvdmVycmlkZQogKgogKiBGaWVsZHM6CiAqICAgICAgICBGVFlQRV9EU0FfVE9fQ1BVX0JQRFUgLQogKiAgICAgICAgICAgIFVzZWQgb24gbXVsdGljYXN0IERTQSBUb19DUFUgZnJhbWVzIHdpdGggYSBDb2RlIG9mIDB4MCAoQlBEVS9NR01UKS4KICogICAgICAgICAgICBOb3QgdXNlZCBvbiBub24tRFNBIENvbnRyb2wgZnJhbWVzLgogKiAgICAgICAgRlRZUEVfRFNBX1RPX0NQVV9GMlIgLQogKiAgICAgICAgICAgIFVzZWQgb24gRFNBIFRvX0NQVSBmcmFtZXMgd2l0aCBhIENvZGUgb2YgMHgxIChGcmFtZSB0byBSZWdpc3RlcgogKiAgICAgICAgICAgIFJlcGx5KS4gTm90IHVzZWQgb24gbm9uLURTQSBDb250cm9sIGZyYW1lcy4KICogICAgICAgIEZUWVBFX0RTQV9UT19DUFVfSUdNUCAtCiAqICAgICAgICAgICAgVXNlZCBvbiBEU0EgVG9fQ1BVIGZyYW1lcyB3aXRoIGEgQ29kZSBvZiAweDIgKElHTVAvTUxEIFRyYXApCiAqICAgICAgICAgICAgYW5kIG9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZXMgdGhhdCBhcmUgSUdNUCBvciBNTEQgdHJhcHBlZAogKiAgICAgICAgRlRZUEVfRFNBX1RPX0NQVV9UUkFQIC0KICogICAgICAgICAgICBVc2VkIG9uIERTQSBUb19DUFUgZnJhbWVzIHdpdGggYSBDb2RlIG9mIDB4MyAoUG9saWN5IFRyYXApIGFuZAogKiAgICAgICAgICAgIG9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZXMgdGhhdCBhcmUgUG9saWN5IFRyYXBwZWQKICogICAgICAgIEZUWVBFX0RTQV9UT19DUFVfQVJQIC0KICogICAgICAgICAgICBVc2VkIG9uIERTQSBUb19DUFUgZnJhbWVzIHdpdGggYSBDb2RlIG9mIDB4NCAoQVJQIE1pcnJvcikgYW5kCiAqICAgICAgICAgICAgb24gbm9uLURTQSBDb250cm9sIGZyYW1lcyB0aGF0IGFyZSBBUlAgTWlycm9yZWQgKHNlZSBncHJ0U2V0QVJQdG9DUFUgQVBJKS4KICogICAgICAgIEZUWVBFX0RTQV9UT19DUFVfTUlSUk9SIC0KICogICAgICAgICAgICBVc2VkIG9uIERTQSBUb19DUFUgZnJhbWVzIHdpdGggYSBDb2RlIG9mIDB4NSAoUG9saWN5IE1pcnJvcikgYW5kCiAqICAgICAgICAgICAgb24gbm9uLURTQSBDb250cm9sIGZyYW1lcyB0aGF0IGFyZSBQb2xpY3kgTWlycm9yZWQgKHNlZSBncHJ0U2V0UG9saWN5IEFQSSkuCiAqICAgICAgICBGVFlQRV9EU0FfVE9fQ1BVX1JFU0VSVkVEIC0KICogICAgICAgICAgICBVc2VkIG9uIERTQSBUb19DUFUgZnJhbWVzIHdpdGggYSBDb2RlIG9mIDB4NiAoUmVzZXJ2ZWQpLiBOb3QKICogICAgICAgICAgICB1c2VkIG9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZXMuCiAqICAgICAgICBGVFlQRV9EU0FfVE9fQ1BVX1VDQVNUX01HTVQgLQogKiAgICAgICAgICAgIFVzZWQgb24gdW5pY2FzdCBEU0EgVG9fQ1BVIGZyYW1lcyB3aXRoIGEgQ29kZSBvZiAweDAgKHVuaWNhc3QKICogICAgICAgICAgICBNR01UKS4gTm90IHVzZWQgb24gbm9uLURTQSBDb250cm9sIGZyYW1lcy4KICogICAgICAgIEZUWVBFX0RTQV9GUk9NX0NQVSAtCiAqICAgICAgICAgICAgVXNlZCBvbiBEU0EgRnJvbV9DUFUgZnJhbWVzLiBOb3QgdXNlZCBvbiBub24tRFNBIENvbnRyb2wgZnJhbWUKICogICAgICAgIEZUWVBFX0RTQV9DUk9TU19DSElQX0ZDIC0KICogICAgICAgICAgICBVc2VkIG9uIERTQSBDcm9zcyBDaGlwIEZsb3cgQ29udHJvbCBmcmFtZXMgKFRvX1NuaWZmZXIgRmxvdwogKiAgICAgICAgICAgIENvbnRyb2wpLiBOb3QgdXNlZCBvbiBub24tRFNBIENvbnRyb2wgZnJhbWVzLgogKiAgICAgICAgRlRZUEVfRFNBX0NST1NTX0NISVBfRUdSRVNTX01PTiAtCiAqICAgICAgICAgICAgVXNlZCBvbiBEU0EgQ3Jvc3MgQ2hpcCBFZ3Jlc3MgTW9uaXRvciBmcmFtZXMgKFRvX1NuaWZmZXIgVHgpLgogKiAgICAgICAgICAgIE5vdCB1c2VkIG9uIG5vbi1EU0EgQ29udHJvbCBmcmFtZXMuCiAqICAgICAgICBGVFlQRV9EU0FfQ1JPU1NfQ0hJUF9JTkdSRVNTX01PTiAtCiAqICAgICAgICAgICAgVXNlZCBvbiBEU0EgQ3Jvc3MgQ2hpcCBJbmdyZXNzIE1vbml0b3IgZnJhbWVzIChUb19TbmlmZmVyIFJ4KS4KICogICAgICAgICAgICBOb3QgdXNlZCBvbiBub24tRFNBIENvbnRyb2wgZnJhbWVzLgogKiAgICAgICAgRlRZUEVfUE9SVF9FVFlQRV9NQVRDSCAtCiAqICAgICAgICAgICAgVXNlZCBvbiBub3JtYWwgbmV0d29yayBwb3J0cyAoc2VlIGdwcnRTZXRGcmFtZU1vZGUgQVBJKQogKiAgICAgICAgICAgIG9uIGZyYW1lcyB3aG9zZSBFdGhlcnR5cGUgbWF0Y2hlcyB0aGUgcG9ydCdzIFBvcnRFVHlwZSByZWdpc3Rlci4KICogICAgICAgICAgICBOb3QgdXNlZCBvbiBub24tRFNBIENvbnRyb2wgZnJhbWVzLgogKiAgICAgICAgRlRZUEVfQkNBU1RfTk9OX0RTQV9DT05UUk9MIC0KICogICAgICAgICAgICBVc2VkIG9uIE5vbi1EU0EgQ29udHJvbCBmcmFtZXMgdGhhdCBjb250YWluIGEgQnJvYWRjYXN0CiAqICAgICAgICAgICAgZGVzdGluYXRpb24gYWRkcmVzcy4gTm90IHVzZWQgb24gRFNBIENvbnRyb2wgZnJhbWVzLgogKiAgICAgICAgRlRZUEVfUFBQb0VfTk9OX0RTQV9DT05UUk9MIC0KICogICAgICAgICAgICBVc2VkIG9uIE5vbi1EU0EgQ29udHJvbCBmcmFtZXMgdGhhdCBjb250YWluIGFuIEV0aGVyIFR5cGUgMHg4ODYzCiAqICAgICAgICAgICAgKGkuZS4sIFBQUG9FIGZyYW1lcykuIE5vdCB1c2VkIG9uIERTQSBDb250cm9sIGZyYW1lcy4KICogICAgICAgIEZUWVBFX0lQX05PTl9EU0FfQ09OVFJPTCAtCiAqICAgICAgICAgICAgVXNlZCBvbiBOb24tRFNBIENvbnRyb2wgZnJhbWVzIHRoYXQgY29udGFpbiBhbiBJUHY0IG9yIElQdjYgRXRoZXIKICogICAgICAgICAgICBUeXBlLiBOb3QgdXNlZCBvbiBEU0EgQ29udHJvbCBmcmFtZXMuCiAqLwp0eXBlZGVmIGVudW0KewogICAgRlRZUEVfRFNBX1RPX0NQVV9CUERVID0gMCwKICAgIEZUWVBFX0RTQV9UT19DUFVfRjJSLAogICAgRlRZUEVfRFNBX1RPX0NQVV9JR01QLAogICAgRlRZUEVfRFNBX1RPX0NQVV9UUkFQLAogICAgRlRZUEVfRFNBX1RPX0NQVV9BUlAsCiAgICBGVFlQRV9EU0FfVE9fQ1BVX01JUlJPUiwKICAgIEZUWVBFX0RTQV9UT19DUFVfUkVTRVJWRUQsCiAgICBGVFlQRV9EU0FfVE9fQ1BVX1VDQVNUX01HTVQsCiAgICBGVFlQRV9EU0FfRlJPTV9DUFUsCiAgICBGVFlQRV9EU0FfQ1JPU1NfQ0hJUF9GQywKICAgIEZUWVBFX0RTQV9DUk9TU19DSElQX0VHUkVTU19NT04sCiAgICBGVFlQRV9EU0FfQ1JPU1NfQ0hJUF9JTkdSRVNTX01PTiwKICAgIEZUWVBFX1BPUlRfRVRZUEVfTUFUQ0gsCiAgICBGVFlQRV9CQ0FTVF9OT05fRFNBX0NPTlRST0wsCiAgICBGVFlQRV9QUFBvRV9OT05fRFNBX0NPTlRST0wsCiAgICBGVFlQRV9JUF9OT05fRFNBX0NPTlRST0wKfSBHVF9QUklfT1ZFUlJJREVfRlRZUEU7CgoKLyoKICogVHlwZWRlZjogc3RydWN0IEdUX1FQUklfVEJMX0VOVFJZCiAqCiAqIERlc2NyaXB0aW9uOiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0aGUgZW50cnkgb2YgUXVldWUgUHJpb3JpdHkgT3ZlcnJpZGUKICogICAgICAgICAgICAgICAgVGFibGUuCiAqCiAqIEZpZWxkczoKICogICAgICAgIHFQcmlFbiAgICAtIEdUX1RSVUUgdG8gZW5hYmxlIFF1ZXVlIFByaW9yaXR5LCBHVF9GQUxTRSBvdGhlcndpc2UKICogICAgICAgIHFQcmlvcml0eSAtIHByaW9yaXR5IHRvIGJlIG92ZXJyaWRkZW4gKCAwIH4gMyApIG9ubHkgaWYgcVByaUVuIGlzIEdUX1RSVUUKICogICAgICAgICAgICAgICAgICAgIFdoZW4gcVByaUVuIGlzIEdUX0ZBTFNFLCBxUHJpb3JpdHkgc2hvdWxkIGJlIGlnbm9yZWQuCiAqCiAqIE5vdGVzOiBJZiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBxUHJpQXZiRW4sIHFQcmlBdmJFbiBhbmQgcUF2YlByaW9yaXR5IGZpZWxkcwogKiAgICAgICAgd2lsbCBiZSBpZ25vcmVkLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICAgICAgcVByaUVuOwogICAgR1RfVTMyICAgICAgICBxUHJpb3JpdHk7Cn1HVF9RUFJJX1RCTF9FTlRSWTsKCgovKgogKiBUeXBlZGVmOiBzdHJ1Y3QgR1RfRlBSSV9UQkxfRU5UUlkKICoKICogRGVzY3JpcHRpb246IFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIHRoZSBlbnRyeSBvZiBGcmFtZSBQcmlvcml0eSBPdmVycmlkZQogKiAgICAgICAgICAgICAgICBUYWJsZS4KICoKICogRmllbGRzOgogKiAgICAgICAgZlByaUVuICAgIC0gR1RfVFJVRSB0byBlbmFibGUgRnJhbWUgUHJpb3JpdHksIEdUX0ZBTFNFIG90aGVyd2lzZQogKiAgICAgICAgZlByaW9yaXR5IC0gcHJpb3JpdHkgdG8gYmUgb3ZlcnJpZGRlbiAoIDAgfiA3ICkgb25seSBpZiBmUHJpRW4gaXMgR1RfVFJVRQogKiAgICAgICAgICAgICAgICAgICAgV2hlbiBmUHJpRW4gaXMgR1RfRkFMU0UsIGZQcmlvcml0eSBzaG91bGQgYmUgaWdub3JlZC4KICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX0JPT0wgICAgICAgIGZQcmlFbjsKICAgIEdUX1UzMiAgICAgICAgZlByaW9yaXR5Owp9R1RfRlBSSV9UQkxfRU5UUlk7CgoKLyogTWF4aW1hbSBudW1iZXIgb2YgcG9ydHMgYSBzd2l0Y2ggbWF5IGhhdmUuICovCiNkZWZpbmUgTUFYX1NXSVRDSF9QT1JUUyAgICAxMQojZGVmaW5lIFZFUlNJT05fTUFYX0xFTiAgICAgMzAKI2RlZmluZSBNQVhfUU9TX1dFSUdIVFMgICAgICAgIDEyOAoKLyoKICogVHlwZWRlZjogc3RydWN0IEdUX1FvU19XRUlHSFQKICoKICogRGVzY3JpcHRpb246IFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIFByb2dyYW1tYWJsZSBSb3VuZCBSb2JpbiBXZWlnaHRzLgogKgogKiBGaWVsZHM6CiAqICAgICAgbGVuICAgIC0gbGVuZ3RoIG9mIHRoZSB2YWxpZCBxdWV1ZSBkYXRhCiAqICAgICAgICBxdWV1ZSAgLSB1cHRvIDEyOCBxdWV1ZSBkYXRhCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMzIgICAgICAgIGxlbjsKICAgIEdUX1U4ICAgICAgICBxdWV1ZVtNQVhfUU9TX1dFSUdIVFNdOwp9R1RfUW9TX1dFSUdIVDsKCgoKLyoKICogVHlwZWRlZjogc3RydWN0IEdUX1ZFUlNJT04KICoKICogRGVzY3JpcHRpb246IFRoaXMgc3RydWN0IGhvbGRzIHRoZSBwYWNrYWdlIHZlcnNpb24uCiAqCiAqIEZpZWxkczoKICogICAgICB2ZXJzaW9uIC0gc3RyaW5nIGFycmF5IGhvbGRpbmcgdGhlIHZlcnNpb24uCiAqCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VOCAgIHZlcnNpb25bVkVSU0lPTl9NQVhfTEVOXTsKfUdUX1ZFUlNJT047CgoKLyoKICogdHlwZWRlZjogc3RydWN0IEdUX1JNVQogKgogKiBEZXNjcmlwdGlvbjogVGhpcyBzdHJ1Y3QgaG9sZHMgdGhlIFJlbW90ZSBNYW5hZ2VtZW50IFVuaXQgbW9kZS4KICoKICogRmllbGRzOgogKiAgICAgICAgcm11RW4gICAgLSBlbmFibGUgb3IgZGlzYWJsZSBSTVUKICogICAgICAgIHBvcnQgICAgLSBsb2dpY2FsIHBvcnQgd2hlcmUgUk1VIGlzIGVuYWJsZWQKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX0JPT0wgICAgICAgIHJtdUVuOwogICAgR1RfTFBPUlQgICAgcG9ydDsKfSBHVF9STVU7CgoKCi8qCiAqIFR5cGVkZWY6CiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBkaWZmZXJlbnQgc2l6ZXMgb2YgdGhlIE1hYyBhZGRyZXNzIHRhYmxlLgogKgogKiBGaWVsZHM6CiAqICAgICAgQVRVX1NJWkVfMjU2ICAgIC0gICAyNTYgZW50cmllcyBNYWMgYWRkcmVzcyB0YWJsZS4KICogICAgICBBVFVfU0laRV81MTIgICAgLSAgIDUxMiBlbnRyaWVzIE1hYyBhZGRyZXNzIHRhYmxlLgogKiAgICAgIEFUVV9TSVpFXzEwMjQgICAtICAgMTAyNCBlbnRyaWVzIE1hYyBhZGRyZXNzIHRhYmxlLgogKiAgICAgIEFUVV9TSVpFXzIwNDggICAtICAgMjA0OCBlbnRyaWVzIE1hYyBhZGRyZXNzIHRhYmxlLgogKiAgICAgIEFUVV9TSVpFXzQwOTYgICAtICAgNDA5NiBlbnRyaWVzIE1hYyBhZGRyZXNzIHRhYmxlLgogKiAgICAgIEFUVV9TSVpFXzgxOTIgICAtICAgODE5MiBlbnRyaWVzIE1hYyBhZGRyZXNzIHRhYmxlLgogKgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEFUVV9TSVpFXzI1NiwKICAgIEFUVV9TSVpFXzUxMiwKICAgIEFUVV9TSVpFXzEwMjQsCiAgICBBVFVfU0laRV8yMDQ4LAogICAgQVRVX1NJWkVfNDA5NiwKICAgIEFUVV9TSVpFXzgxOTIKfUFUVV9TSVpFOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfUE9SVF9TVFBfU1RBVEUKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBwb3J0IHNwYW5uaW5nIHRyZWUgc3RhdGUuCiAqCiAqIEVudW1lcmF0aW9uczoKICogICBHVF9QT1JUX0RJU0FCTEUgICAgLSBwb3J0IGlzIGRpc2FibGVkLgogKiAgIEdUX1BPUlRfQkxPQ0tJTkcgICAtIHBvcnQgaXMgaW4gYmxvY2tpbmcvbGlzdGVuaW5nIHN0YXRlLgogKiAgIEdUX1BPUlRfTEVBUk5JTkcgICAtIHBvcnQgaXMgaW4gbGVhcm5pbmcgc3RhdGUuCiAqICAgR1RfUE9SVF9GT1JXQVJESU5HIC0gcG9ydCBpcyBpbiBmb3J3YXJkaW5nIHN0YXRlLgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1BPUlRfRElTQUJMRSA9IDAsCiAgICBHVF9QT1JUX0JMT0NLSU5HLAogICAgR1RfUE9SVF9MRUFSTklORywKICAgIEdUX1BPUlRfRk9SV0FSRElORwp9IEdUX1BPUlRfU1RQX1NUQVRFOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfRUdSRVNTX01PREUKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBwb3J0IGVncmVzcyBtb2RlLgogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgR1RfVU5NT0RJRllfRUdSRVNTIC0gZnJhbWVzIGFyZSB0cmFuc21pdGVkIHVubW9kaWZpZWQuCiAqICAgR1RfVEFHR0VEX0VHUkVTUyAgIC0gYWxsIGZyYW1lcyBhcmUgdHJhbnNtaXRlZCB0YWdnZWQuCiAqICAgR1RfVU5UQUdHRURfRUdSRVNTIC0gYWxsIGZyYW1lcyBhcmUgdHJhbnNtaXRlZCB1bnRhZ2dlZC4KICogICBHVF9BRERfVEFHICAgICAgICAgLSBhbHdheXMgYWRkIGEgdGFnLiAob3IgZG91YmxlIHRhZykKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9VTk1PRElGWV9FR1JFU1MgPSAwLAogICAgR1RfVU5UQUdHRURfRUdSRVNTLAogICAgR1RfVEFHR0VEX0VHUkVTUywKICAgIEdUX0FERF9UQUcKfSBHVF9FR1JFU1NfTU9ERTsKCi8qICB0eXBlZGVmOiBlbnVtIEdUX0RPVDFRX01PREUgKi8KCnR5cGVkZWYgZW51bQp7CiAgICBHVF9ESVNBQkxFID0gMCwKICAgIEdUX0ZBTExCQUNLLAogICAgR1RfQ0hFQ0ssCiAgICBHVF9TRUNVUkUKfSBHVF9ET1QxUV9NT0RFOwoKCi8qIHR5cGVkZWY6IGVudW0gR1RfU1dfTU9ERSAqLwoKdHlwZWRlZiBlbnVtCnsKICAgIEdUX0NQVV9BVFRBVENIRUQgPSAwLCAvKiBwb3J0cyBjb21lIHVwIGRpc2FibGVkICovCiAgICBHVF9CQUNLT0ZGLCAgICAgICAgICAgLyogRUVQUk9NIGF0dGFjIG1vZGUgd2l0aCBvbGQgaGFsZiBkdXBsZXggYmFja29mZiBtb2RlICovCiAgICBHVF9TVEFORF9BTE9ORSwgICAgICAgLyogcG9ydHMgY29tZSB1cCBlbmFibGVkLCBpZ25vcmUgRUVQUk9NICovCiAgICBHVF9FRVBST01fQVRUQVRDSEVEICAgLyogRUVQUk9NIGRlZmluZWQgcHJvdCBzdGF0ZXMgKi8KfSBHVF9TV19NT0RFOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfQVRVX09QRVJBUklPTgogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgZGlmZmVyZW50IEFUVSBhbmQgVlRVIG9wZXJhdGlvbnMKICoKICogRmllbGRzOgogKiAgICAgIEZMVVNIX0FMTCAgICAgICAgICAgLSBGbHVzaCBhbGwgZW50cmllcy4KICogICAgICBGTFVTSF9VTkxPQ0tFRCAgICAgIC0gRmx1c2ggYWxsIHVubG9ja2VkIGVudHJpZXMgaW4gQVRVLgogKiAgICAgIExPQURfUFVSR0VfRU5UUlkgICAgLSBMb2FkIC8gUHVyZ2UgZW50cnkuCiAqICAgICAgR0VUX05FWFRfRU5UUlkgICAgICAtIEdldCBuZXh0IEFUVSBvciBWVFUgIGVudHJ5LgogKiAgICAgIEZMVVNIX0FMTF9JTl9EQiAgICAgLSBGbHVzaCBhbGwgZW50cmllcyBpbiBhIHBhcnRpY3VsYXIgREJOdW0uCiAqICAgICAgRkxVU0hfVU5MT0NLRURfSU5fREIgLSBGbHVzaCBhbGwgdW5sb2NrZWQgZW50cmllcyBpbiBhIHBhcnRpY3VsYXIgREJOdW0uCiAqICAgICAgU0VSVklDRV9WSU9MQVRPTlMgICAtIHNldmljZSB2aW9sYXRpb25zIG9mIFZUVQogKgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEZMVVNIX0FMTCA9IDEsICAgICAgICAvKiBmb3IgYm90aCBhdHUgYW5kIHZ0dSAqLwogICAgRkxVU0hfVU5MT0NLRUQsICAgICAgICAvKiBmb3IgYXR1IG9ubHkgKi8KICAgIExPQURfUFVSR0VfRU5UUlksICAgIC8qIGZvciBib3RoIGF0dSBhbmQgdnR1ICovCiAgICBHRVRfTkVYVF9FTlRSWSwgICAgICAgIC8qIGZvciBib3RoIGF0dSBhbmQgdnR1ICovCiAgICBGTFVTSF9BTExfSU5fREIsICAgIC8qIGZvciBhdHUgb25seSAqLwogICAgRkxVU0hfVU5MT0NLRURfSU5fREIsICAgIC8qIGZvciBhdHUgb25seSAqLwogICAgU0VSVklDRV9WSU9MQVRJT05TICAgICAvKiBmb3IgdnR1IG9ubHkgKi8KfSBHVF9BVFVfT1BFUkFUSU9OLCBHVF9WVFVfT1BFUkFUSU9OOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfRkxVU0hfQ01ECiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiB1bml0IGZsdXNoIG9wZXJhdGlvbi4KICoKICogRW51bWVyYXRpb25zOgogKiAgIEdUX0ZMVVNIX0FMTCAgICAgICAtIGZsdXNoIGFsbCBlbnRyaWVzLgogKiAgIEdUX0ZMVVNIX0FMTF9VTkJMSyAtIGZsdXNoIGFsbCB1bmJsb2NrZWQgKG9yIHVubG9ja2VkKS4KICogICBHVF9GTFVTSF9BTExfVU5MT0NLRUQgLSBmbHVzaCBhbGwgdW5ibG9ja2VkIChvciB1bmxvY2tlZCkuCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfRkxVU0hfQUxMICAgICAgID0gMSwKICAgIEdUX0ZMVVNIX0FMTF9VTkJMSyA9IDIsCiAgICBHVF9GTFVTSF9BTExfVU5MT0NLRUQgPSAyCn1HVF9GTFVTSF9DTUQ7CgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX01PVkVfQ01ECiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiB1bml0IG1vdmUgb3IgcmVtb3ZlIG9wZXJhdGlvbi4KICogICAgIFdoZW4gZGVzdGluYXRpb24gcG9ydCBpcyBzZXQgdG8gMHhGLCBSZW1vdmUgb3BlcmF0aW9uIG9jY3Vycy4KICoKICogRW51bWVyYXRpb25zOgogKiAgIEdUX01PVkVfQUxMICAgICAgIC0gbW92ZSBhbGwgZW50cmllcy4KICogICBHVF9NT1ZFX0FMTF9VTkJMSyAtIG1vdmUgYWxsIHVuYmxvY2tlZCAob3IgdW5sb2NrZWQpLgogKiAgIEdUX01PVkVfQUxMX1VOTE9DS0VEIC0gbW92ZSBhbGwgdW5ibG9ja2VkIChvciB1bmxvY2tlZCkuCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfTU9WRV9BTEwgICAgICAgPSAxLAogICAgR1RfTU9WRV9BTExfVU5CTEsgPSAyLAogICAgR1RfTU9WRV9BTExfVU5MT0NLRUQgPSAyCn1HVF9NT1ZFX0NNRDsKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0FUVV9VQ19TVEFURQogKgogKiBEZXNjcmlwdGlvbjoKICogICAgICBFbnVtZXJhdGlvbiBvZiB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiB1bml0IGVudHJ5IHN0YXRlIG9mIHVuaWNhc3QKICogICAgICBlbnRyaXMuCiAqCiAqIEVudW1lcmF0aW9uczoKICogICAgICAgIEdUX1VDX0lOVkFMSUQgICAtIGludmFsaWQgZW50cnkuCiAqICAgICAgICBHVF9VQ19EWU5BTUlDICAgLSB1bmljYXN0IGR5bmFtaWMgZW50cnkuCiAqICAgICAgICBHVF9VQ19OT19QUklfVE9fQ1BVX1NUQVRJQ19OUkwgCiAqICAgICAgICAgICAgICAgIC0gc3RhdGljIHVuaWNhc3QgZW50cnkgdGhhdCB3aWxsIGJlIGZvcndhcmRlZCB0byBDUFUgd2l0aG91dCAKICogICAgICAgICAgICAgICAgICAgIGZvcmNpbmcgcHJpb3JpdHkgYW5kIHdpdGhvdXQgcmF0ZSBsaW1pdGluZy4KICogICAgICAgIEdUX1VDX1RPX0NQVV9TVEFUSUNfTlJMIAogKiAgICAgICAgICAgICAgICAtIHN0YXRpYyB1bmljYXN0IGVudHJ5IHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQgdG8gQ1BVIHdpdGhvdXQKICogICAgICAgICAgICAgICAgICAgIHJhdGUgbGltaXRpbmcuCiAqICAgICAgICBHVF9VQ19OT19QUklfU1RBVElDX05STCAKICogICAgICAgICAgICAgICAgLSBzdGF0aWMgdW5pY2FzdCBlbnRyeSB3aXRob3V0IGZvcmNpbmcgcHJpb3JpdHkgYW5kIHdpdGhvdXQuCiAqICAgICAgICAgICAgICAgICAgICByYXRlIGxpbWl0aW5nLgogKiAgICAgICAgR1RfVUNfTk9fUFJJX1NUQVRJQ19BVkJfRU5UUlkgCiAqICAgICAgICAgICAgICAgIC0gc3RhdGljIHVuaWNhc3QgQVZCIGVudHJ5IHdpdGhvdXQgZm9yY2luZyBwcmlvcml0eSBpZiBNYWNBdmIgaXMgZW5hYmxlZC4KICogICAgICAgIEdUX1VDX1NUQVRJQ19OUkwgICAgLSBzdGF0aWMgdW5pY2FzdCBlbnRyeSB3aXRob3V0IHJhdGUgbGltaXRpbmcuCiAqICAgICAgICBHVF9VQ19TVEFUSUNfQVZCX0VOVFJZIC0gc3RhdGljIHVuaWNhc3QgQVZCIGVudHJ5IGlmIE1hY0F2YiBpcyBlbmFibGVkIC4KICogICAgICAgIEdUX1VDX05PX1BSSV9UT19DUFVfU1RBVElDCiAqICAgICAgICAgICAgICAgIC0gc3RhdGljIHVuaWNhc3QgZW50cnkgdGhhdCB3aWxsIGJlIGZvcndhcmRlZCB0byBDUFUgd2l0aG91dCAKICogICAgICAgICAgICAgICAgICAgIGZvcmNpbmcgcHJpb3JpdHkuCiAqICAgICAgICBHVF9VQ19UT19DUFVfU1RBVElDIC0gc3RhdGljIHVuaWNhc3QgZW50cnkgdGhhdCB3aWxsIGJlIGZvcndhcmRlZCB0byBDUFUuCiAqICAgICAgICBHVF9VQ19OT19QUklfU1RBVElDIC0gc3RhdGljIHVuaWNhc3QgZW50cnkgd2l0aG91dCBmb3JjaW5nIHByaW9yaXR5LgogKiAgICAgICAgR1RfVUNfU1RBVElDICAgIC0gc3RhdGljIHVuaWNhc3QgZW50cnkuCiAqCiAqIE5vdGU6IFBsZWFzZSByZWZlciB0byB0aGUgZGV2aWNlIGRhdGFzaGVldCBmb3IgZGV0YWlsZWQgdW5pY2FzdCBlbnRyeSBzdGF0ZXMKICogICAgICAgIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1VDX0lOVkFMSUQgICAgICA9IDAsCiAgICBHVF9VQ19EWU5BTUlDICAgICAgPSAweDEsCgogICAgR1RfVUNfTk9fUFJJX1RPX0NQVV9TVEFUSUNfTlJMICAgID0gMHg4LAogICAgR1RfVUNfVE9fQ1BVX1NUQVRJQ19OUkwgICAgICAgICAgICA9IDB4OSwKICAgIEdUX1VDX05PX1BSSV9TVEFUSUNfTlJMICAgICAgICAgICAgPSAweEEsCiAgICBHVF9VQ19OT19QUklfU1RBVElDX0FWQl9FTlRSWSAgICA9IDB4QSwKICAgIEdUX1VDX1NUQVRJQ19OUkwgICAgICAgICAgICAgICAgID0gMHhCLAogICAgR1RfVUNfU1RBVElDX0FWQl9FTlRSWSAgICAgICAgICAgID0gMHhCLAoKICAgIEdUX1VDX05PX1BSSV9UT19DUFVfU1RBVElDICAgID0gMHhDLAogICAgR1RfVUNfVE9fQ1BVX1NUQVRJQyAgICAgICAgID0gMHhELAogICAgR1RfVUNfTk9fUFJJX1NUQVRJQyAgICAgICAgID0gMHhFLAogICAgR1RfVUNfU1RBVElDICAgICAgICAgICAgICAgICAgPSAweEYKfSBHVF9BVFVfVUNfU1RBVEU7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9BVFVfTUNfU1RBVEUKICoKICogRGVzY3JpcHRpb246CiAqICAgICAgRW51bWVyYXRpb24gb2YgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gdW5pdCBlbnRyeSBzdGF0ZSBvZiBtdWx0aWNhc3QKICogICAgICBlbnRyaXMuCiAqCiAqIEVudW1lcmF0aW9uczoKICogICAgICBHVF9NQ19JTlZBTElEICAgICAgICAgLSBpbnZhbGlkIGVudHJ5LgogKiAgICAgIEdUX01DX01HTV9TVEFUSUMgICAgICAtIHN0YXRpYyBtdWx0aWNhc3QgbWFuYWdlbWVudCBlbnRyaWVzLgogKiAgICAgIEdUX01DX1NUQVRJQyAgICAgICAgICAtIHN0YXRpYyBtdWx0aWNhc3QgcmVndWxhciBlbnRyaXMuCiAqICAgICAgR1RfTUNfU1RBVElDX0FWQl9FTlRSWS0gc3RhdGljIEFWQiBlbnRyeSBpZiBNYWNBdmIgaXMgZW5hbGJlZC4KICogICAgICBHVF9NQ19QUklPX01HTV9TVEFUSUMgLSBzdGF0aWMgbXVsdGljYXN0IG1hbmFnZW1lbnQgZW50cmllcyB3aXRoCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkuCiAqICAgICAgR1RfTUNfUFJJT19TVEFUSUMgICAgIC0gc3RhdGljIG11bHRpY2FzdCByZWd1bGFyIGVudHJpcyB3aXRoIHByaW9yaXR5LgogKiAgICAgIEdUX01DX1BSSU9fU1RBVElDX0FWQl9FTlRSWSAgICAgIC0gc3RhdGljIG11bHRpY2FzdCBBVkIgRW50cnkgd2l0aCBwcmlvcml0eSBpZiBNYWNBdmIgaXMgZW5hYmxlZAogKiAgICAgIEdUX01DX1BSSU9fU1RBVElDX1VOTElNSVRFRF9SQVRFIC0gc3RhdGljIG11bHRpY2FzdCByZWd1bGFyIGVudHJpcyB3aXRoIHByaW9yaXR5CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgd2l0aG91dCByYXRlIGxpbWl0aW5nLgogKiAgICAgIEdUX01DX01HTV9TVEFUSUNfVU5MSU1JVEVEX1JBVEUgICAgIC0gc3RhdGljIG11bHRpY2FzdCBtYW5hZ2VtZW50IGVudHJpZXMgd2l0aG91dAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBsaW1pdGluZy4KICogICAgICBHVF9NQ19TVEFUSUNfVU5MSU1JVEVEX1JBVEUgICAgICAtIHN0YXRpYyBtdWx0aWNhc3QgcmVndWxhciBlbnRyaXMgd2l0aG91dAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBsaW1pdGluZy4KICogICAgICBHVF9NQ19QUklPX01HTV9TVEFUSUNfVU5MSU1JVEVEX1JBVEUgLSBzdGF0aWMgbXVsdGljYXN0IG1hbmFnZW1lbnQgZW50cmllcyB3aXRoCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgYW5kIHdpdGhvdXQgcmF0ZSBsaW1pdGluZy4KICoKICogTm90ZTogUGxlYXNlIHJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0IGZvciBkZXRhaWxlZCBtdWx0aWNhc3QgZW50cnkgc3RhdGVzCiAqICAgICAgICB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4KICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9NQ19JTlZBTElEICAgICAgICAgPSAwLAogICAgR1RfTUNfTUdNX1NUQVRJQ19VTkxJTUlURURfUkFURSA9IDB4NCwKICAgIEdUX01DX1NUQVRJQ19VTkxJTUlURURfUkFURSAgICA9IDB4NSwKICAgIEdUX01DX1NUQVRJQ19BVkJfRU5UUlkgICAgPSAweDUsCiAgICBHVF9NQ19NR01fU1RBVElDICAgICAgPSAweDYsCiAgICBHVF9NQ19TVEFUSUMgICAgICAgICAgPSAweDcsCiAgICBHVF9NQ19QUklPX01HTV9TVEFUSUNfVU5MSU1JVEVEX1JBVEUgPSAweEMsCiAgICBHVF9NQ19QUklPX1NUQVRJQ19VTkxJTUlURURfUkFURSAgICA9IDB4RCwKICAgIEdUX01DX1BSSU9fU1RBVElDX0FWQl9FTlRSWSAgICA9IDB4RCwKICAgIEdUX01DX1BSSU9fTUdNX1NUQVRJQyA9IDB4RSwKICAgIEdUX01DX1BSSU9fU1RBVElDICAgICA9IDB4Rgp9IEdUX0FUVV9NQ19TVEFURTsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX0FUVV9FWFRfUFJJCiAqCiAqICBEZXNjcmlwdGlvbjogCiAqICAgICAgICBFeHRhbmRlZCBwcmlvcml0eSBpbmZvcm1hdGlvbiBmb3IgdGhlIGFkZHJlc3MgdGFybnNsYXRvbiB1bml0IGVudHJ5LgogKgogKiAgICAgICAgbWFjRlByaSBkYXRhIGlzIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGZyYW1lIHByaW9yaXR5IG9uIGFueSBmcmFtZSBhc3NvY2lhdGVkCiAqICAgICAgICB3aXRoIHRoaXMgTUFDLCBpZiB0aGUgdXNlTWFjRlByaSBpcyBHVF9UUlVFIGFuZCB0aGUgcG9ydCdzIFNBIGFuZC9vciAKICogICAgICAgIERBIEZQcmlPdmVycmlkZSBhcmUgZW5hYmxlZC4gU0EgRnJhbWUgUHJpb3JpdHkgT3ZlcnJpZGVzIGNhbiBvbmx5IG9jY3VyIG9uIAogKiAgICAgICAgTUFDIGFkZHJlc3NlcyB0aGF0IGFyZSBTdGF0aWMgb3Igd2hlcmUgdGhlIFBvcnQgaXMgTG9ja2VkLCBhbmQgd2hlcmUgdGhlIHBvcnQgCiAqICAgICAgICBpcyBtYXBwZWQgc291cmNlIHBvcnQgZm9yIHRoZSBNQUMgYWRkcmVzcy4KICoKICogICAgICAgIG1hY1FQcmkgZGF0YSBpcyB1c2VkIHRvIG92ZXJyaWRlIHRoZSBxdWV1ZSBwcmlvcml0eSBvbiBhbnkgZnJhbWUgYXNzb2NpYXRlZAogKiAgICAgICAgd2l0aCB0aGlzIE1BQywgaWYgdGhlIEVudHJ5U3RhdGUgaW5kaWNhdGVzIFF1ZXVlIFByaW9yaXR5IE92ZXJyaWRlIGFuZCB0aGUgCiAqICAgICAgICBwb3J0J3MgU0EgYW5kL29yIERBIFFQcmlPdmVycmlkZSBhcmUgZW5hYmxlZC4gCiAqCiAqICBGaWVsZHM6CiAqICAgICAgdXNlTWFjRlByaSAtIFVzZSBNQUMgZnJhbWUgcHJpb3JpdHkgb3ZlcnJpZGUuIFdoZW4gdGhpcyBpcyBHVF9UUlVFLAogKiAgICAgICAgICAgICAgICAgICAgIE1hY0ZQcmkgZGF0YSBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZnJhbWUgcHJpb3JpdHkgb24KICogICAgICAgICAgICAgICAgICAgICBhbnkgZnJhbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTUFDLgogKiAgICAgIG1hY0ZQcmkgICAgLSBNQUMgZnJhbWUgcHJpb3JpdHkgZGF0YSAoMCB+IDcpLgogKiAgICAgIG1hY1FQcmkgICAgLSBNQUMgcXVldWUgcHJpb3JpdHkgZGF0YSAoMCB+IDMpLgogKgogKiAgQ29tbWVudDoKICogICAgICBQbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZSBkYXRhc2hlZXQgdG8gZmluZCBvdXQgaWYgdGhpcyBmZWF0dXJlIGlzIHN1cHBvcnRlZC4KICogICAgICAgIFdoZW4gdGhpcyBzdHJ1Y3R1cmUgaXMgaW1wbGVtZW50ZWQsIHRoZSBmb2xsb3dpbmdzIGFyZSB0aGUgZGV2aWNlcyBzdXBwb3J0aW5nIAogKiAgICAgICAgdGhpcyBmZWF0dXJlOgogKiAgICAgICAgICAgIDg4RTYwNjUsIDg4RTYwMzUsIGFuZCA4OEU2MDU1IHN1cHBvcnQgYWxsIGV4dGFuZGVkIHByaW9yaXR5IGRhdGEuCiAqICAgICAgICAgICAgODhFNjA2MSBhbmQgODhFNjAzMSBzdXBwb3J0IG9ubHkgbWFjUVByaSBkYXRhCiAqICAgICAgICAgICAgODhFQzAwMCBhbmQgODhFMzAyMCBmYW1pbHkgdXNlIG9ubHkgbWFjRlByaSBkYXRhCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgICAgICAgICAgdXNlTWFjRlByaTsKICAgIEdUX1U4ICAgICAgICAgICAgIG1hY0ZQcmk7CiAgICBHVF9VOCAgICAgICAgICAgICBtYWNRUHJpOwp9IEdUX0FUVV9FWFRfUFJJOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfQVRVX0VOVFJZCiAqCiAqICBEZXNjcmlwdGlvbjogYWRkcmVzcyB0YXJuc2xhdG9uIHVuaXQgRW50cnkKICoKICogIEZpZWxkczoKICogICAgICBtYWNBZGRyICAgIC0gbWFjIGFkZHJlc3MKICogICAgICB0cnVua01lbWJlci0gR1RfVFJVRSBpZiBlbnRyeSBiZWxvbmdzIHRvIGEgVHJ1bmsuIFRoaXMgZmllbGQgd2lsbCBiZQogKiAgICAgICAgICAgICAgICAgICAgIGlnbm9yZWQgaWYgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgVHJ1bmsuCiAqICAgICAgcG9ydFZlYyAgICAtIHBvcnQgVmVjdG9yLiAKICogICAgICAgICAgICAgICAgICAgICBJZiB0cnVua01lbWJlciBmaWVsZCBpcyBHVF9UUlVFLCB0aGlzIHZhbHVlIHJlcHJlc2VudHMgdHJ1bmsgSUQuCiAqICAgICAgcHJpbyAgICAgICAtIGVudHJ5IHByaW9yaXR5LgogKiAgICAgIGVudHJ5U3RhdGUgLSB0aGUgZW50cnkgc3RhdGUuCiAqICAgICAgICBEQk51bSAgICAgICAtIEFUVSBNQUMgQWRkcmVzcyBEYXRhYmFzZSBudW1iZXIuIElmIG11bHRpcGxlIGFkZHJlc3MgCiAqICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VzIGFyZSBub3QgYmVpbmcgdXNlZCwgREJOdW0gc2hvdWxkIGJlIHplcm8uCiAqICAgICAgICAgICAgICAgICAgICAgSWYgbXVsdGlwbGUgYWRkcmVzcyBkYXRhYmFzZXMgYXJlIGJlaW5nIHVzZWQsIHRoaXMgdmFsdWUKICogICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2V0IHRvIHRoZSBkZXNpcmVkIGFkZHJlc3MgZGF0YWJhc2UgbnVtYmVyLgogKiAgICAgICAgZXhQcmlvICAgICAtIGV4dGFuZGVkIHByaW9yaXR5IGluZm9ybWF0aW9uLiBJZiBkZXZpY2Ugc3VwcG9ydCBleHRhbmRlZCAKICogICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwgcHJpbyBmaWVsZCBzaG91bGQgYmUgaWdub3JlZC4KICoKICogIENvbW1lbnQ6CiAqICAgICAgVGhlIGVudHJ5U3RhdGUgdW5pb24gVHlwZSBpcyBkZXRlcm1pbmUgYWNjb3JkaW5nIHRvIHRoZSBNYWMgVHlwZS4KICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX0VUSEVSQUREUiAgICAgbWFjQWRkcjsKICAgIEdUX0JPT0wgICAgICAgICAgICB0cnVua01lbWJlcjsKICAgIEdUX1UzMiAgICAgICAgICAgIHBvcnRWZWM7CiAgICBHVF9VOCAgICAgICAgICAgIHByaW87CiAgICBHVF9VOCAgICAgICAgICAgIHJlc2VydmVkOwogICAgR1RfVTE2ICAgICAgICAgICAgREJOdW07CiAgICB1bmlvbgogICAgewogICAgICAgIEdUX0FUVV9VQ19TVEFURSB1Y0VudHJ5U3RhdGU7CiAgICAgICAgR1RfQVRVX01DX1NUQVRFIG1jRW50cnlTdGF0ZTsKICAgIH0gZW50cnlTdGF0ZTsKICAgIEdUX0FUVV9FWFRfUFJJICAgIGV4UHJpbzsKfSBHVF9BVFVfRU5UUlk7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9WVFVfREFUQQogKgogKiAgRGVzY3JpcHRpb246IFZMQU4gIHRhcm5zbGF0b24gdW5pdCBEYXRhIFJlZ2lzdGVyCiAqCiAqICBGaWVsZHM6CiAqICAgICAgbWVtYmVyVGFnUCAtIE1lbWJlcnNoaXAgYW5kIEVncmVzcyBUYWdnaW5nCiAqICAgICAgICAgICAgICAgICAgIG1lbWJlclRhZ1BbMF0gaXMgZm9yIFBvcnQgMCwgTWVtYmVyVGFnUFsxXSBpcyBmb3IgcG9ydCAxLCBhbmQgc28gb24gCiAqCiAqICBDb21tZW50OgogKiAgICAgTUFYX1NXSVRDSF9QT1JUUyBpcyAxMCBmb3IgT2N0YW5lLgogKiAgICAgSW4gdGhlIGNhc2Ugb2YgRnVsbFNhaWwsIHRoZXJlIGFyZSAzIHBvcnRzLiBTbywgdGhlIHJlc3QgNyBpcyBpZ25vcmVkIGluIG1lbWViZXJUYWdQCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VOCAgICAgbWVtYmVyVGFnUFtNQVhfU1dJVENIX1BPUlRTXTsKICAgIEdUX1U4ICAgICBwb3J0U3RhdGVQW01BWF9TV0lUQ0hfUE9SVFNdOwp9IEdUX1ZUVV9EQVRBOwoKLyoKICogIGRlZmluaXRpb24gZm9yIE1FTUJFUl9UQUcKICovCiNkZWZpbmUgTUVNQkVSX0VHUkVTU19VTk1PRElGSUVEICAgIDAKI2RlZmluZSBOT1RfQV9NRU1CRVIgICAgICAgICAgICAgICAgMQojZGVmaW5lIE1FTUJFUl9FR1JFU1NfVU5UQUdHRUQgICAgICAgIDIKI2RlZmluZSBNRU1CRVJfRUdSRVNTX1RBR0dFRCAgICAgICAgMwoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9WVFVfRVhUX0lORk8KICoKICogIERlc2NyaXB0aW9uOiAKICogICAgICAgIEV4dGFuZGVkIFZUVSBFbnRyeSBpbmZvcm1hdGlvbiBmb3IgUHJpb3JpdHkgT3ZlcnJpZGUgYW5kIE5vbiBSYXRlIExpbWl0LgogKiAgICAgICAgRnJhbWUgUHJpb3JpdHkgaXMgdXNlZCB0byBhcyB0aGUgdGFnJ3MgUFJJIGJpdHMgaWYgdGhlIGZyYW1lIGVncmVzc2VzCiAqICAgICAgICB0aGUgc3dpdGNoIHRhZ2dlZC4gVGhlIGVncmVzc3MgcXVldWUgdGhlIGZyYW1lIGlzIHN3aXRjaCBpbnRvIGlzIG5vdAogKiAgICAgICAgbW9kaWZpZWQgYnkgdGhlIEZyYW1lIFByaW9yaXR5IE92ZXJyaWRlLgogKiAgICAgICAgUXVldWUgUHJpb3JpdHkgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGVncmVzcyBxdWV1ZSB0aGUgZnJhbWUgaXMKICogICAgICAgIHN3aXRjaGVkIGludG8uIElmIHRoZSBmcmFtZSBlZ3Jlc3NlcyB0YWdnZWQsIHRoZSBwcmlvcml0eSBpbiB0aGUgZnJhbWUgCiAqICAgICAgICB3aWxsIG5vdCBiZSBtb2RpZmllZCBieSBhIFF1ZXVlIFByaW9yaXR5IE92ZXJyaWRlLgogKiAgICAgICAgTm9uUmF0ZUxpbWl0IGZvciBWSUQgaXMgdXNlZCB0byBpbmRpY2F0ZSBhbnkgZnJhbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIAogKiAgICAgICAgVklEIGFyZSB0byBieXBhc3MgaW5ncmVzcyBhbmQgZWdyZXNzIHJhdGUgbGltaXRpbmcsIGlmIHRoZSBpbmdyZXNzIAogKiAgICAgICAgcG9ydCdzIFZJRCBOUmF0ZUxpbWl0IGlzIGFsc28gZW5hYmxlZC4KICoKICogIEZpZWxkczoKICogICAgICB1c2VWSURGUHJpIC0gVXNlIFZJRCBmcmFtZSBwcmlvcml0eSBvdmVycmlkZS4gV2hlbiB0aGlzIGlzIEdUX1RSVUUgYW5kIAogKiAgICAgICAgICAgICAgICAgICAgIFZJREZQcmlPdmVycmlkZSBvZiB0aGUgaW5ncmVzcyBwb3J0IG9mIHRoZSBmcmFtZSBpcyBlbmFibGVkLAogKiAgICAgICAgICAgICAgICAgICAgIHZpZEZQcmkgZGF0YSBpcyB1c2VkIHRvIG92ZXJyaWRlIHRoZSBmcmFtZSBwcmlvcml0eSBvbgogKiAgICAgICAgICAgICAgICAgICAgIGFueSBmcmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBWSUQuCiAqICAgICAgdmlkRlByaSAgICAtIFZJRCBmcmFtZSBwcmlvcml0eSBkYXRhICgwIH4gNykuCiAqICAgICAgdXNlVklEUVByaSAtIFVzZSBWSUQgcXVldWUgcHJpb3JpdHkgb3ZlcnJpZGUuIFdoZW4gdGhpcyBpcyBHVF9UUlVFIGFuZAogKiAgICAgICAgICAgICAgICAgICAgIFZJRFFQcmlPdmVycmlkZSBvZiB0aGUgaW5ncmVzcyBwb3J0IG9mIHRoZSBmcmFtZSBpcyBlbmFibGVkLAogKiAgICAgICAgICAgICAgICAgICAgIHZpZFFQcmkgZGF0YSBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgcXVldWUgcHJpb3JpdHkgb24KICogICAgICAgICAgICAgICAgICAgICBhbnkgZnJhbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVklELgogKiAgICAgIHZpZFFQcmkgICAgLSBWSUQgcXVldWUgcHJpb3JpdHkgZGF0YSAoMCB+IDMpLgogKiAgICAgIHZpZE5SYXRlTGltaXQgLSBieXBhc3MgcmF0ZSBpbmdyZXNzIGFuZCBlZ3Jlc3MgbGltaXRpbmcKICoKICogIENvbW1lbnQ6CiAqICAgICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0IHRvIGZpbmQgb3V0IGlmIHRoaXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQuCiAqICAgICAgICBXaGVuIHRoaXMgc3RydWN0dXJlIGlzIGltcGxlbWVudGVkLCB0aGUgZm9sbG93aW5ncyBhcmUgdGhlIGRldmljZXMgc3VwcG9ydGluZyAKICogICAgICAgIHRoaXMgZmVhdHVyZToKICogICAgICAgICAgICA4OEU2MDY1LCA4OEU2MDM1LCBhbmQgODhFNjA1NSBzdXBwb3J0IGFsbCBkYXRhLgogKiAgICAgICAgICAgIDg4RTYwNjEgYW5kIDg4RTYwMzEgc3VwcG9ydCBvbmx5IHZpZE5SYXRlTGltaXQuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgICAgICAgICAgdXNlVklERlByaTsKICAgIEdUX1U4ICAgICAgICAgICAgIHZpZEZQcmk7CiAgICBHVF9CT09MICAgICAgICAgICAgdXNlVklEUVByaTsKICAgIEdUX1U4ICAgICAgICAgICAgIHZpZFFQcmk7CiAgICBHVF9CT09MICAgICAgICAgICAgdmlkTlJhdGVMaW1pdDsKfSBHVF9WVFVfRVhUX0lORk87CgogCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfVlRVX0VOVFJZCiAqCiAqICBEZXNjcmlwdGlvbjogVkxBTiB0YXJuc2xhdG9uIHVuaXQgRW50cnkKICogICAgICAgIEVhY2ggZmllbGQgaW4gdGhlIHN0cnVjdHVyZSBpcyBkZXZpY2Ugc3BlY2lmaWMsIGkuZS4sIHNvbWUgZmllbGRzIG1heSBub3QKICogICAgICAgIGJlIHN1cHBvcnRlZCBieSB0aGUgdXNlZCBzd2l0Y2ggZGV2aWNlLiBJbiBzdWNoIGNhc2UsIHRob3NlIGZpZWxkcyBhcmUKICogICAgICAgIGlnbm9yZWQgYnkgdGhlIERTRFQgZHJpdmVyLiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRhdGFzaGVldCBmb3IgdGhlIGxpc3Qgb2YKICogICAgICAgIHN1cHBvcnRlZCBmaWVsZHMuCiAqCiAqICBGaWVsZHM6CiAqICAgICAgREJOdW0gICAgICAtIGRhdGFiYXNlIG51bWJlciBvciBGSUQgKGZvcndhcmRpbmcgaW5mb3JtYXRpb24gZGF0YWJhc2UpCiAqICAgICAgdmlkICAgICAgICAtIFZMQU4gSUQgCiAqICAgICAgdnR1RGF0YSAgICAtIFZUVSBkYXRhCiAqICAgICAgICB2aWRQcmlPdmVycmlkZSAtIG92ZXJyaWRlIHRoZSBwcmlvcml0eSBvbiBhbnkgZnJhbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVklECiAqICAgICAgICB2aWRQcmlvcml0eSAtIFZJRCBQcmlvcml0eSBiaXRzICgwIH4gNykKICogICAgICAgIHNpZCAgICAgICAgICAgLSA4MDIuMXMgUG9ydCBTdGF0ZSBEYXRhYmFzZSBJRAogKiAgICAgICAgdmlkUG9saWN5ICAtIGluZGljYXRlIHRoYXQgdGhlIGZyYW1lIHdpdGggdGhpcyBWSUQgdXNlcyBWSUQgUG9saWN5CiAqICAgICAgICAgICAgICAgICAgICAgKHNlZSBncHJ0U2V0UG9saWN5IEFQSSkuCiAqICAgICAgICB2aWRFeEluZm8gIC0gZXh0YW5kZWQgaW5mb3JtYXRpb24gZm9yIFZUVSBlbnRyeS4gSWYgdGhlIGRldmljZSBzdXBwb3J0cyBleHRhbmRlZCAKICogICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiwgdmlkUHJpb3JpdHlPdmVycmlkZSBhbmQgdmlkUHJpb3JpdHkgdmFsdWVzIGFyZSAKICogICAgICAgICAgICAgICAgICAgICBpZ25vcmVkLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTE2ICAgICAgICBEQk51bTsKICAgIEdUX1UxNiAgICAgICAgdmlkOwogICAgR1RfVlRVX0RBVEEgICB2dHVEYXRhOwogICAgR1RfQk9PTCAgICAgICAgICB2aWRQcmlPdmVycmlkZTsKICAgIEdUX1U4ICAgICAgICAgIHZpZFByaW9yaXR5OwogICAgR1RfVTggICAgICAgICAgc2lkOwogICAgR1RfQk9PTCAgICAgICAgICB2aWRQb2xpY3k7CiAgICBHVF9WVFVfRVhUX0lORk8gICAgdmlkRXhJbmZvOwp9IEdUX1ZUVV9FTlRSWTsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX1NUVV9PUEVSQVJJT04KICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIFNUVSBvcGVyYXRpb25zCiAqCiAqIEZpZWxkczoKICogICAgICBMT0FEX1BVUkdFX1NUVV9FTlRSWSAgICAtIExvYWQgLyBQdXJnZSBlbnRyeS4KICogICAgICBHRVRfTkVYVF9TVFVfRU5UUlkgICAgICAtIEdldCBuZXh0IFNUVSAgZW50cnkuCiAqCiAqLwp0eXBlZGVmIGVudW0KewogICAgTE9BRF9QVVJHRV9TVFVfRU5UUlkgPSA1LAogICAgR0VUX05FWFRfU1RVX0VOVFJZID02IAp9IEdUX1NUVV9PUEVSQVRJT047CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9TVFVfRU5UUlkKICoKICogIERlc2NyaXB0aW9uOiA4MDIuMXMgUG9ydCBTdGF0ZSBJbmZvcm1hdGlvbiBEYXRhYmFzZSAoU1RVKSBFbnRyeQogKgogKiAgRmllbGRzOgogKiAgICAgIHNpZCAgICAgICAtIFNUVSBJRCAKICogICAgICAgIHBvcnRTdGF0ZSAtIFBlciBWTEFOIFBvcnQgU3RhdGVzIGZvciBlYWNoIHBvcnQuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMTYgICAgICAgICAgICAgICAgc2lkOwogICAgR1RfUE9SVF9TVFBfU1RBVEUgICAgcG9ydFN0YXRlW01BWF9TV0lUQ0hfUE9SVFNdOwp9IEdUX1NUVV9FTlRSWTsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1ZUVV9JTlRfU1RBVFVTCiAqCiAqICBEZXNjcmlwdGlvbjogVkxBTiB0YXJuc2xhdG9uIHVuaXQgaW50ZXJydXB0IHN0YXR1cwogKgogKiAgRmllbGRzOgogKiAgICAgIGludENhdXNlICAtIFZUVSBJbnRlcnJ1cHQgQ2F1c2UKICogICAgICAgICAgICAgICAgICAgIEdUX1ZUVV9GVUxMX1ZJT0xBVElPTixHVF9NRU1FQkVSX1ZJT0xBVElPTixvcgogKiAgICAgICAgICAgICAgICAgICAgR1RfTUlTU19WSU9MQVRJT04KICogICAgICBTUElEICAgICAgLSBzb3VyY2UgcG9ydCBudW1iZXIKICogICAgICAgICAgICAgICAgICAgICBpZiBpbnRDYXVzZSBpcyBHVF9WVFVfRlVMTF9WSU9MQVRJT04sIGl0IG1lYW5zIG5vdGhpbmcKICogICAgICB2aWQgICAgICAgLSBWTEFOIElEIAogKiAgICAgICAgICAgICAgICAgICAgIGlmIGludENhdXNlIGlzIEdUX1ZUVV9GVUxMX1ZJT0xBVElPTiwgaXQgbWVhbnMgbm90aGluZwogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTE2ICAgdnR1SW50Q2F1c2U7CiAgICBHVF9VOCAgICBzcGlkOwogICAgR1RfVTE2ICAgdmlkOwp9IEdUX1ZUVV9JTlRfU1RBVFVTOwoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9BVFVfSU5UX1NUQVRVUwogKgogKiAgRGVzY3JpcHRpb246IFZMQU4gdGFybnNsYXRvbiB1bml0IGludGVycnVwdCBzdGF0dXMKICoKICogIEZpZWxkczoKICogICAgICBpbnRDYXVzZSAgLSBBVFUgSW50ZXJydXB0IENhdXNlCiAqICAgICAgICAgICAgICAgICAgICBHVF9GVUxMX1ZJT0xBVElPTixHVF9NRU1FQkVSX1ZJT0xBVElPTiwKICogICAgICAgICAgICAgICAgICAgIEdUX01JU1NfVklPTEFUSU9OLCBHVF9BR0VfVklPTEFUSU9OLCBvciAKICogICAgICAgICAgICAgICAgICAgIEdUX0FHRV9PVVRfVklPTEFUSU9OCiAqICAgICAgU1BJRCAgICAgIC0gc291cmNlIHBvcnQgbnVtYmVyCiAqICAgICAgICAgICAgICAgICAgICAgaWYgaW50Q2F1c2UgaXMgR1RfRlVMTF9WSU9MQVRJT04sIGl0IG1lYW5zIG5vdGhpbmcKICogICAgICBEQk51bSAgICAgLSBEQiBOdW0gKG9yIEZJRCkKICogICAgICAgICAgICAgICAgICAgICBpZiBpbnRDYXVzZSBpcyBHVF9GVUxMX1ZJT0xBVElPTiwgaXQgbWVhbnMgbm90aGluZwogKiAgICAgICAgbWFjQWRkciAgICAgIC0gTUFDIEFkZHJlc3MKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UxNiAgIGF0dUludENhdXNlOwogICAgR1RfVTggICAgc3BpZDsKICAgIEdUX1U4ICAgIGRiTnVtOwogICAgR1RfRVRIRVJBRERSICBtYWNBZGRyOwp9IEdUX0FUVV9JTlRfU1RBVFVTOwoKLyoKKiBEZWZpbml0aW9uIGZvciBWVFUgaW50ZXJydXB0CiovCiNkZWZpbmUgR1RfTUVNQkVSX1ZJT0xBVElPTiAgICAgICAgMHg0CiNkZWZpbmUgR1RfTUlTU19WSU9MQVRJT04gICAgICAgIDB4MgojZGVmaW5lIEdUX1ZUVV9GVUxMX1ZJT0xBVElPTiAgICAweDEKLyoKKiBEZWZpbml0aW9ucyBmb3IgQVRVIGludGVycnVwdCBpbiBHaWdhYml0IHN3aXRjaCBhcmUgdGhlIHNhbWUgYXMgCiogdGhlIG9uZXMgZm9yIFZUVSBpbnRlcnJ1cHQuIEhlcmUgd2UganVzdCByZWRlZmluZSB0aGUgRlVMTF9WSU9MQVRJT04gZm9yCiogYm90aCBWVFUgYW5kIEFUVS4KKi8KI2RlZmluZSBHVF9GVUxMX1ZJT0xBVElPTiAgICAgICAgMHgxCgojZGVmaW5lIEdUX0FHRV9WSU9MQVRJT04gICAgICAgIDB4OAojZGVmaW5lIEdUX0FHRV9PVVRfVklPTEFUSU9OICAgIDB4MTAKCgovKgoKICAqIFR5cGVkZWY6IGVudW0gR1RfUFZUX09QRVJBVElPTgogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgUFZUIChDcm9zcyBDaGlwIFBvcnQgVkxBTiBUYWJsZSkgT3BlcmF0aW9uIHR5cGUKICoKICogRmllbGRzOgogKiAgICAgIFBWVF9JTklUSUFMSVpFIC0gSW5pdGlhbGl6ZSBhbGwgcmVzb3VyY2VzIHRvIHRoZSBpbml0YWwgc3RhdGUKICogICAgICBQVlRfV1JJVEUgICAgICAtIFdyaXRlIHRvIHRoZSBzZWxlY3RlZCBQVlQgZW50cnkKICogICAgICBQVlRfUkVBRCAgICAgICAtIFJlYWQgZnJvbSB0aGUgc2VsZWN0ZWQgUFZUIGVudHJ5CiAqLwp0eXBlZGVmIGVudW0KewogICAgUFZUX0lOSVRJQUxJWkUgICAgID0gMHgxLAogICAgUFZUX1dSSVRFICAgICAgICA9IDB4MywKICAgIFBWVF9SRUFEICAgICAgICA9IDB4NAp9IEdUX1BWVF9PUEVSQVRJT047CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QVlRfT1BfREFUQQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgcmVxdWlyZWQgYnkgUFZUIChDcm9zcyBDaGlwIFBvcnQgVkxBTiBUYWJsZSkgT3BlcmF0aW9uCiAqCiAqICBGaWVsZHM6CiAqICAgICAgcHZ0QWRkciAtIHBvaW50ZXIgdG8gdGhlIGRlc2lyZWQgZW50cnkgb2YgUFZUCiAqICAgICAgcHZ0RGF0YSAtIENyb3NzIENoaXAgUG9ydCBWTEFOIGRhdGEgZm9yIHRoZSBlbnRyeSBwb2ludGVkIGJ5IHB2dEFkZHIKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UzMiAgICBwdnRBZGRyOwogICAgR1RfVTMyICAgIHB2dERhdGE7Cn0gR1RfUFZUX09QX0RBVEE7CgoKLyoKICogIHR5cGVkZWY6IGVudW0gR1RfUElSTF9GQ19ERUFTU0VSVAogKgogKiAgRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBwb3J0IGZsb3cgY29udHJvbCBkZS1hc3NlcnRpb24gbW9kZSBvbiBQSVJMLgogKgogKiAgRW51bWVyYXRpb25zOgogKiAgICAgIEdUX1BJUkxfRkNfREVBU1NFUlRfRU1QVFkgLQogKiAgICAgICAgICAgICAgICBEZS1hc3NlcnQgd2hlbiB0aGUgaW5ncmVzcyByYXRlIHJlc291cmNlIGhhcyBiZWNvbWUgZW1wdHkKICogICAgICAgIEdUX1BJUkxfRkNfREVBU1NFUlRfQ0JTX0xJTUlUIC0KICogICAgICAgICAgICAgICAgRGUtYXNzZXJ0IHdoZW4gdGhlIGluZ3Jlc3MgcmF0ZSByZXNvdXJjZSBoYXMgZW5vdWdoIHJvb20gYXMKICogICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBDQlNMaW1pdC4KICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9QSVJMX0ZDX0RFQVNTRVJUX0VNUFRZID0gMCwKICAgIEdUX1BJUkxfRkNfREVBU1NFUlRfQ0JTX0xJTUlUCn0gR1RfUElSTF9GQ19ERUFTU0VSVDsKCgovKgogKiAgdHlwZWRlZjogZW51bSBHVF9QSVJMX0VMSU1JVF9NT0RFCiAqCiAqICBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgdGhlIHBvcnQgZWdyZXNzIHJhdGUgbGltaXQgY291bnRpbmcgbW9kZS4KICoKICogIEVudW1lcmF0aW9uczoKICogICAgICBHVF9QSVJMX0VMSU1JVF9GUkFNRSAtCiAqICAgICAgICAgICAgICAgIENvdW50IHRoZSBudW1iZXIgb2YgZnJhbWVzCiAqICAgICAgR1RfUElSTF9FTElNSVRfTEFZRVIxIC0KICogICAgICAgICAgICAgICAgQ291bnQgYWxsIExheWVyIDEgYnl0ZXM6IAogKiAgICAgICAgICAgICAgICBQcmVhbWJsZSAoOGJ5dGVzKSArIEZyYW1lJ3MgREEgdG8gQ1JDICsgSUZHICgxMmJ5dGVzKQogKiAgICAgIEdUX1BJUkxfRUxJTUlUX0xBWUVSMiAtCiAqICAgICAgICAgICAgICAgIENvdW50IGFsbCBMYXllciAyIGJ5dGVzOiBGcmFtZSdzIERBIHRvIENSQwogKiAgICAgIEdUX1BJUkxfRUxJTUlUX0xBWUVSMyAtCiAqICAgICAgICAgICAgICAgIENvdW50IGFsbCBMYXllciAzIGJ5dGVzOiAKICogICAgICAgICAgICAgICAgRnJhbWUncyBEQSB0byBDUkMgLSAxOCAtIDQgKGlmIGZyYW1lIGlzIHRhZ2dlZCkKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9QSVJMX0VMSU1JVF9GUkFNRSA9IDAsCiAgICBHVF9QSVJMX0VMSU1JVF9MQVlFUjEsCiAgICBHVF9QSVJMX0VMSU1JVF9MQVlFUjIsCiAgICBHVF9QSVJMX0VMSU1JVF9MQVlFUjMKfSBHVF9QSVJMX0VMSU1JVF9NT0RFOwoKCi8qIHR5cGVkZWY6IGVudW0gR1RfUkFURV9MSU1JVF9NT0RFCiAqIFRoZSBpbmdyZXNzIGxpbWl0IG1vZGUgaW4gdGhlIHJhdGUgY29udHJvbCByZWdpc3RlciAoMHhBKQogKi8KCnR5cGVkZWYgZW51bQp7CiAgICBHVF9MSU1UX0FMTCA9IDAsICAgICAgICAgLyogbGltaXQgYW5kIGNvdW50IGFsbCBmcmFtZXMgKi8KICAgIEdUX0xJTUlUX0ZMT09ELCAgICAgICAgICAvKiBsaW1pdCBhbmQgY291bnQgQnJvYWRjYXN0LCBNdWx0aWNhc3QgYW5kIGZsb29kZWQgdW5pY2FzdCBmcmFtZXMgKi8KICAgIEdUX0xJTUlUX0JSRENTVF9NTFRDU1QsICAgIC8qIGxpbWl0IGFuZCBjb3VudCBCcm9hZGNhc3QgYW5kIE11bHRpY2FzdCBmcmFtZXMgKi8KICAgIEdUX0xJTUlUX0JSRENTVCAgICAgICAgICAgLyogbGltaXQgYW5kIGNvdW50IEJyb2FkY2FzdCBmcmFtZXMgKi8KfSBHVF9SQVRFX0xJTUlUX01PREU7CgovKiB0eXBlZGVmOiBlbnVtIEdUX1BSSTBfUkFURQogKiBUaGUgaW5ncmVzcyBkYXRhIHJhdGUgbGltaXQgZm9yIHByaW9yaXR5IDAgZnJhbWVzIAogKi8KCnR5cGVkZWYgZW51bQp7CiAgICBHVF9OT19MSU1JVCA9IDAsICAgICAvKiBOb3QgbGltaXRlZCAgICovCiAgICBHVF8xMjhLLCAgICAgICAgICAgICAgLyogMTI4SyBiaXRzL3NlYyAqLwogICAgR1RfMjU2SywgICAgICAgICAgICAgIC8qIDI1NksgYml0cy9zZWMgKi8KICAgIEdUXzUxMkssICAgICAgICAgICAgICAvKiA1MTIgYml0cy9zZWMgKi8KICAgIEdUXzFNLCAgICAgICAgICAgICAgLyogMU0gIGJpdHMvc2VjICovCiAgICBHVF8yTSwgICAgICAgICAgICAgIC8qIDJNICBiaXRzL3NlYyAqLwogICAgR1RfNE0sICAgICAgICAgICAgICAvKiA0TSAgYml0cy9zZWMgKi8KICAgIEdUXzhNLCAgICAgICAgICAgICAgLyogOE0gIGJpdHMvc2VjICovCiAgICBHVF8xNk0sICAgICAgICAgICAgICAvKiAxNk0gIGJpdHMvc2VjLCBOb3RlOiBzdXBwb3J0ZWQgb25seSBieSBHaWdhYml0IEV0aGVybmV0IFN3aXRjaCAqLwogICAgR1RfMzJNLCAgICAgICAgICAgICAgLyogMzJNICBiaXRzL3NlYywgTm90ZTogc3VwcG9ydGVkIG9ubHkgYnkgR2lnYWJpdCBFdGhlcm5ldCBTd2l0Y2ggKi8KICAgIEdUXzY0TSwgICAgICAgICAgICAgIC8qIDY0TSAgYml0cy9zZWMsIE5vdGU6IHN1cHBvcnRlZCBvbmx5IGJ5IEdpZ2FiaXQgRXRoZXJuZXQgU3dpdGNoICovCiAgICBHVF8xMjhNLCAgICAgICAgICAgICAgLyogMTI4TSAgYml0cy9zZWMsIE5vdGU6IHN1cHBvcnRlZCBvbmx5IGJ5IEdpZ2FiaXQgRXRoZXJuZXQgU3dpdGNoICovCiAgICBHVF8yNTZNICAgICAgICAgICAgICAvKiAyNTZNICBiaXRzL3NlYywgTm90ZTogc3VwcG9ydGVkIG9ubHkgYnkgR2lnYWJpdCBFdGhlcm5ldCBTd2l0Y2ggKi8KfSBHVF9QUkkwX1JBVEUsR1RfRUdSRVNTX1JBVEU7CgoKLyoKICogVHlwZWRlZjogdW5pb24gR1RfRVJBVEVfVFlQRQogKgogKiBEZXNjcmlwdGlvbjogRWdyZXNzIFJhdGUKICoKICogRmllbGRzOgogKiAgICAgIGRlZmluZWRSYXRlIC0gR1RfRUdSRVNTX1JBVEUgZW51bSB0eXBlIHNob3VsZCBiZSB1c2VkIG9uIHRoZSBmb2xsb3dpbmcgZGV2aWNlczoKICogICAgICAgICAgICAgICAgICAgICAgICA4OEU2MjE4LCA4OEU2MzE4LCA4OEU2MDYzLCA4OEU2MDgzLCA4OEU2MTgxLCA4OEU2MTgzLCA4OEU2MDkzCiAqICAgICAgICAgICAgICAgICAgICAgICAgODhFNjA5NSwgODhFNjE4NSwgODhFNjEwOCwgODhFNjA2NSwgODhFNjA2MSwgYW5kIHRoZWlyIHZhcmlhdGlvbnMuCiAqICAgICAga2JSYXRlICAgICAgLSByYXRlIGluIGticHMgdGhhdCBzaG91bGQgYmUgdXNlZCBvbiB0aGUgZm9sbG93aW5nIGRldmljZXM6CiAqICAgICAgICAgICAgICAgICAgICAgICAgODhFNjA5NywgODhFNjA5NiB3aXRoIGNvdW50IG1vZGUgb2Ygbm9uIGZyYW1lLCBzdWNoIGFzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxMX0xBWUVSMSwgQUxMX0xBWUVSMiwgYW5kIEFMTF9MQVlFUjMKICogICAgICAgICAgICAgICAgICAgICAgICA2NGticHMgfiAxTWJwcyAgICA6IGluY3JlbWVudHMgb2YgNjRrYnBzLAogKiAgICAgICAgICAgICAgICAgICAgICAgIDFNYnBzIH4gMTAwTWJwcyAgIDogaW5jcmVtZW50cyBvZiAxTWJwcywgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgMTAwTWJwcyB+IDEwMDBNYnBzOiBpbmNyZW1lbnRzIG9mIDEwTWJwcwogKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlZm9yZSwgdGhlIHZhbGlkIHZhbHVlcyBhcmU6CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LCAxMjgsIDE5MiwgMjU2LCAzMjAsIDM4NCwuLi4sIDk2MCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCwgMjAwMCwgMzAwMCwgNDAwMCwgLi4uLCAxMDAwMDAsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDAwMCwgMTIwMDAwLCAxMzAwMDAsIC4uLiwgMTAwMDAwMC4KICogICAgICBmUmF0ZSAgICAgICAgIC0gZnJhbWUgcGVyIHNlY29uZCB0aGF0IHNob3VsZCBiZSB1c2VkIG9uIHRoZSBmb2xsb3dpbmcgZGV2aWNlczoKICogICAgICAgICAgICAgICAgICAgICAgICA4OEU2MDk3LCA4OEU2MDk2IHdpdGggY291bnQgbW9kZSBvZiBmcmFtZSAoR1RfUElSTF9DT1VOVF9GUkFNRSkKICovCnR5cGVkZWYgdW5pb24KewogICAgR1RfRUdSRVNTX1JBVEUgICAgZGVmaW5lZFJhdGU7CiAgICBHVF9VMzIgICAgICAgICAgICBrYlJhdGU7CiAgICBHVF9VMzIgICAgICAgICAgICBmUmF0ZTsKfSBHVF9FUkFURV9UWVBFOwoKLyoKICogRm9ybXVsYSBmb3IgUmF0ZSBMaW1pdCBvZiBHaWdhYml0IFN3aXRjaCBmYW1pbHkgYW5kIEVuaGFuY2VkIEZhc3RFdGhlcm5ldCBTd2l0Y2gKICovCiNkZWZpbmUgR1RfR0VUX1JBVEVfTElNSVQoX2ticHMpICAgIFwKICAgICAgICAoKF9rYnBzKT8oODAwMDAwMCAvICgyOCAqIChfa2JwcykpKTowKQojZGVmaW5lIEdUX0dFVF9SQVRFX0xJTUlUMihfa2JwcykgICAgXAogICAgICAgICgoX2ticHMpPyg4MDAwMDAwIC8gKDMyICogKF9rYnBzKSkgKyAoODAwMDAwMCAlICgzMiAqIChfa2JwcykpPzE6MCkpOjApCiNkZWZpbmUgR1RfR0VUX1JBVEVfTElNSVQzKF9rYnBzKSAgICBcCiAgICAgICAgKChfa2Jwcyk/KDgwMDAwMDAgLyAoNDAgKiAoX2ticHMpKSArICg4MDAwMDAwICUgKDQwICogKF9rYnBzKSk/MTowKSk6MCkKCiNkZWZpbmUgTUFYX1JBVEVfTElNSVQgICAgICAgIDI1NjAwMCAgICAvKiB1bml0IG9mIEticHMgKi8KI2RlZmluZSBNSU5fUkFURV9MSU1JVCAgICAgICAgNjUgICAgICAgIC8qIHVuaXQgb2YgS2JwcyAqLwoKCiNkZWZpbmUgR1RfR0VUX1JBVEVfTElNSVRfUEVSX0ZSQU1FKF9mcmFtZXMsIF9kZWMpICAgIFwKICAgICAgICAoKF9mcmFtZXMpPygxMDAwMDAwMDAwIC8gKDMyICogKF9mcmFtZXMpKSArICgxMDAwMDAwMDAwICUgKDMyICogKF9mcmFtZXMpKT8xOjApKTowKQoKI2RlZmluZSBHVF9HRVRfUkFURV9MSU1JVF9QRVJfQllURShfa2JwcywgX2RlYykgICAgXAogICAgICAgICgoX2ticHMpPygoODAwMDAwMCooX2RlYykpIC8gKDMyICogKF9rYnBzKSkgKyAoKDgwMDAwMDAqKF9kZWMpKSAlICgzMiAqIChfa2JwcykpPzE6MCkpOjApCgovKiAKICogdHlwZWRlZjogZW51bSBHVF9CVVJTVF9TSVpFCiAqIFRoZSBpbmdyZXNzIGRhdGEgcmF0ZSBsaW1pdCBidXJzdCBzaXplIHdpbmRvd3Mgc2VsZWN0aW9uCiAqLwoKdHlwZWRlZiBlbnVtCnsKICAgIEdUX0JVUlNUX1NJWkVfMTJLID0gMCwgICAgIC8qIDEySyBieXRlIGJ1cnN0IHNpemUgKi8KICAgIEdUX0JVUlNUX1NJWkVfMjRLLCAgICAgICAgLyogMjRLIGJ5dGUgYnVyc3Qgc2l6ZSAqLwogICAgR1RfQlVSU1RfU0laRV80OEssICAgICAgICAvKiA0OEsgYnl0ZSBidXJzdCBzaXplICovCiAgICBHVF9CVVJTVF9TSVpFXzk2SyAgICAgICAgICAvKiA5NksgYnl0ZSBidXJzdCBzaXplICovCn0gR1RfQlVSU1RfU0laRTsKCi8qIAogKiB0eXBlZGVmOiBlbnVtIEdUX0JVUlNUX1JBVEUKICogVGhlIGluZ3Jlc3MgZGF0YSByYXRlIGxpbWl0IGJhc2VkIG9uIGJ1cnN0IHNpemUKICovCgp0eXBlZGVmIGVudW0KewogICAgR1RfQlVSU1RfTk9fTElNSVQgPSAwLCAgICAgLyogTm90IGxpbWl0ZWQgICAqLwogICAgR1RfQlVSU1RfNjRLLCAgICAgICAgICAvKiA2NEsgYml0cy9zZWMgKi8KICAgIEdUX0JVUlNUXzEyOEssICAgICAgLyogMTI4SyBiaXRzL3NlYyAqLwogICAgR1RfQlVSU1RfMjU2SywgICAgICAvKiAyNTZLIGJpdHMvc2VjICovCiAgICBHVF9CVVJTVF8zODRLLCAgICAgIC8qIDM4NEsgYml0cy9zZWMgKi8KICAgIEdUX0JVUlNUXzUxMkssICAgICAgLyogNTEyIGJpdHMvc2VjICovCiAgICBHVF9CVVJTVF82NDBLLCAgICAgIC8qIDY0MEsgYml0cy9zZWMgKi8KICAgIEdUX0JVUlNUXzc2OEssICAgICAgLyogNzY4SyBiaXRzL3NlYyAqLwogICAgR1RfQlVSU1RfODk2SywgICAgICAvKiA4OTZLIGJpdHMvc2VjICovCiAgICBHVF9CVVJTVF8xTSwgICAgICAgIC8qIDFNICBiaXRzL3NlYyAqLwogICAgR1RfQlVSU1RfMTUwMEssICAgICAgLyogMS41TSBiaXRzL3NlYyAqLwogICAgR1RfQlVSU1RfMk0sICAgICAgICAvKiAyTSAgYml0cy9zZWMgKi8KICAgIEdUX0JVUlNUXzRNLCAgICAgICAgLyogNE0gIGJpdHMvc2VjICovCiAgICBHVF9CVVJTVF84TSwgICAgICAgICAgIC8qIDhNICBiaXRzL3NlYyAqLwogICAgR1RfQlVSU1RfMTZNLCAgICAgICAgICAvKiAxNk0gIGJpdHMvc2VjICovCiAgICBHVF9CVVJTVF8zMk0sICAgICAgICAgIC8qIDMyTSAgYml0cy9zZWMgKi8KICAgIEdUX0JVUlNUXzY0TSwgICAgICAgICAgLyogNjRNICBiaXRzL3NlYyAqLwogICAgR1RfQlVSU1RfMTI4TSwgICAgICAgICAvKiAxMjhNICBiaXRzL3NlYyAqLwogICAgR1RfQlVSU1RfMjU2TSAgICAgICAgICAvKiAyNTZNICBiaXRzL3NlYyAqLwp9IEdUX0JVUlNUX1JBVEU7CgovKgogKiBGb3JtdWxhIGZvciBidXJzdCBiYXNlZCBSYXRlIExpbWl0CiAqLwojZGVmaW5lIEdUX0dFVF9CVVJTVF9SQVRFX0xJTUlUKF9ic2l6ZSxfa2JwcykgICAgXAogICAgICAgICgoX2ticHMpPygoKF9ic2l6ZSkrMSkqODAwMDAwMCAvICgzMiAqIChfa2JwcykpICsgICAgICAgICBcCiAgICAgICAgICAgICAgICAoKChfYnNpemUpKzEpKjgwMDAwMDAgJSAoMzIgKiAoX2ticHMpKT8xOjApKSAgICBcCiAgICAgICAgICAgICAgICA6MCkKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfUElSTF9PUEVSQVRJT04KICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIFBJUkwgKFBvcnQgSW5ncmVzcyBSYXRlIExpbWl0KSBPcGVyYXRpb24gdHlwZQogKgogKiBGaWVsZHM6CiAqICAgICAgUElSTF9JTklUX0FMTF9SRVNPVVJDRSAtIEluaXRpYWxpemUgYWxsIHJlc291cmNlcyB0byB0aGUgaW5pdGFsIHN0YXRlCiAqICAgICAgUElSTF9JTklUX1JFU09VUkNFICAgICAtIEluaXRpYWxpemUgc2VsZWN0ZWQgcmVzb3VyY2VzIHRvIHRoZSBpbml0YWwgc3RhdGUKICogICAgICBQSVJMX1dSSVRFX1JFU09VUkNFICAgIC0gV3JpdGUgdG8gdGhlIHNlbGVjdGVkIHJlc291cmNlL3JlZ2lzdGVyCiAqICAgICAgUElSTF9SRUFEX1JFU09VUkNFICAgICAtIFJlYWQgZnJvbSB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UvcmVnaXN0ZXIKICovCnR5cGVkZWYgZW51bQp7CiAgICBQSVJMX0lOSVRfQUxMX1JFU09VUkNFICAgICA9IDB4MSwKICAgIFBJUkxfSU5JVF9SRVNPVVJDRSAgICAgICAgPSAweDIsCiAgICBQSVJMX1dSSVRFX1JFU09VUkNFICAgICAgICA9IDB4MywKICAgIFBJUkxfUkVBRF9SRVNPVVJDRSAgICAgICAgPSAweDQKfSBHVF9QSVJMX09QRVJBVElPTiwgR1RfUElSTDJfT1BFUkFUSU9OOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUElSTF9PUF9EQVRBCiAqCiAqICBEZXNjcmlwdGlvbjogZGF0YSByZXF1aXJlZCBieSBQSVJMIE9wZXJhdGlvbgogKgogKiAgRmllbGRzOgogKiAgICAgIGlybFVuaXQgICAtIEluZ3Jlc3MgUmF0ZSBMaW1pdCBVbml0IHRoYXQgZGVmaW5lcyBvbmUgb2YgSVJMIHJlc291cmNlcy4KICogICAgICBpcmxSZWcgICAgLSBJbmdyZXNzIFJhdGUgTGltaXQgUmVnaXN0ZXIuCiAqICAgICAgaXJsRGF0YSAgIC0gSW5ncmVzcyBSYXRlIExpbWl0IERhdGEuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMzIgICAgaXJsVW5pdDsKICAgIEdUX1UzMiAgICBpcmxSZWc7CiAgICBHVF9VMzIgICAgaXJsRGF0YTsKfSBHVF9QSVJMX09QX0RBVEE7CgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BJUkwyX09QX0RBVEEKICoKICogIERlc2NyaXB0aW9uOiBkYXRhIHJlcXVpcmVkIGJ5IFBJUkwgT3BlcmF0aW9uCiAqCiAqICBGaWVsZHM6CiAqICAgICAgaXJsUG9ydCAgIC0gSW5ncmVzcyBSYXRlIExpbWl0aW5nIHBvcnQgKHBoeXNpY2FsIHBvcnQgbnVtYmVyKS4KICogICAgICBpcmxSZXMgICAgLSBJbmdyZXNzIFJhdGUgTGltaXQgUmVzb3VyY2UuCiAqICAgICAgaXJsUmVnICAgIC0gSW5ncmVzcyBSYXRlIExpbWl0IFJlZ2lzdGVyLgogKiAgICAgIGlybERhdGEgICAtIEluZ3Jlc3MgUmF0ZSBMaW1pdCBEYXRhLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgIGlybFBvcnQ7CiAgICBHVF9VMzIgICAgaXJsUmVzOwogICAgR1RfVTMyICAgIGlybFJlZzsKICAgIEdUX1UzMiAgICBpcmxEYXRhOwp9IEdUX1BJUkwyX09QX0RBVEE7CgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX1BJUkxfQUNUSU9OCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBBY3Rpb24gdGhhdCBzaG91bGQgYmUgdGFrZW4gd2hlbgogKiAgICAgICAgdGhlcmUgdGhlcmUgYXJlIG5vdCBlbm91Z2ggdG9rZW5zIHRvIGFjY2VwdCB0aGUgZW50aXJlIGluY29taW5nIGZyYW1lCiAqCiAqIEZpZWxkczoKICogICAgICAgIFBJUkxfQUNUSU9OX0FDQ0VQVCAtIGFjY2VwdCB0aGUgZnJhbWUKICogICAgICAgIFBJUkxfQUNUSU9OX1VTRV9MSU1JVF9BQ1RJT04gLSB1c2UgRVNCIExpbWl0IEFjdGlvbgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIFBJUkxfQUNUSU9OX1VTRV9MSU1JVF9BQ1RJT04gPSAweDAsCiAgICBQSVJMX0FDVElPTl9BQ0NFUFQgICAgID0gMHgxCn0gR1RfUElSTF9BQ1RJT047CgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX0VTQl9MSU1JVF9BQ1RJT04KICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIEVTQiBMaW1pdCBBY3Rpb24gdGhhdCBzaG91bGQgYmUgdGFrZW4gd2hlbgogKiAgICAgICAgdGhlIGluY29taW5nIHBvcnQgaW5mb3JtYXRpb24gcmF0ZSBleGNlZWRzIHRoZSBFQlNfTGltaXQuCiAqCiAqIEZpZWxkczoKICogICAgICAgIEVTQl9MSU1JVF9BQ1RJT05fRFJPUCAtIGRyb3AgcGFja2V0cwogKiAgICAgICAgRVNCX0xJTUlUX0FDVElPTl9GQyAgIC0gc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0CiAqLwp0eXBlZGVmIGVudW0KewogICAgRVNCX0xJTUlUX0FDVElPTl9EUk9QICAgICA9IDB4MCwKICAgIEVTQl9MSU1JVF9BQ1RJT05fRkMgICAgICAgID0gMHgxCn0gR1RfRVNCX0xJTUlUX0FDVElPTjsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX0JVQ0tFVF9SQVRFX1RZUEUKICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIEJ1Y2tldCBSYXRlIFR5cGUKICoKICogRmllbGRzOgogKiAgICAgICAgQlVDS0VUX1RZUEVfVFJBRkZJQ19CQVNFRCAgICAtIGJ1Y2tldCBpcyB0cmFmZmljIHR5cGUgYmFzZWQKICogICAgICAgIEJVQ0tFVF9UWVBFX1JBVEVfQkFTRUQgICAgICAgIC0gYnVja2V0IGlzIHJhdGUgYmFzZWQKICovCnR5cGVkZWYgZW51bQp7CiAgICBCVUNLRVRfVFlQRV9UUkFGRklDX0JBU0VEICAgID0gMHgwLAogICAgQlVDS0VUX1RZUEVfUkFURV9CQVNFRCAgICAgICAgPSAweDEKfSBHVF9CVUNLRVRfUkFURV9UWVBFOwoKLyoKICogRGVmaW5pdGlvbiBmb3IgR1RfQlVDS0VUX1RZUEVfVFJBRkZJQ19CQVNFRAogKgogKiBEZXNjcmlwdGlvbjogRGVmaW5lcyB0aGUgVHJhZmZpYyBUeXBlIHRoYXQgaXMgdXNlZCB3aGVuIEJ1Y2tldCBSYXRlIFR5cGUKICogICAgICAgIGlzIHRyYWZmaWMgdHlwZSBiYXNlZCAoQlVDS0VUX1RZUEVfVFJBRkZJQ19CQVNFRCkuCiAqICAgICAgICBQbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZSBkYXRhc2hlZXQgaW4gb3JkZXIgdG8gY2hlY2sgd2hpY2ggdHJhZmZpYwogKiAgICAgICAgdHlwZXMgYXJlIHN1cHBvcnRlZC4KICoKICogRGVmaW5pdGlvbjoKICogICAgICAgIEJVQ0tFVF9UUkFGRklDX1VOS05PV05fVU5JQ0FTVCAgICAtIHVua25vd24gdW5pY2FzdCBmcmFtZQogKiAgICAgICAgQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9NVUxUSUNBU1QtIHVua25vd24gbXVsdGljYXN0IGZyYW1lCiAqICAgICAgICBCVUNLRVRfVFJBRkZJQ19CUk9BRENBU1QgICAgICAgIC0gYnJvYWRjYXN0IGZyYW1lCiAqICAgICAgICBCVUNLRVRfVFJBRkZJQ19NVUxUSUNBU1QgICAgICAgIC0gbXVsdGljYXN0IGZyYW1lCiAqICAgICAgICBCVUNLRVRfVFJBRkZJQ19VTklDQVNUICAgICAgICAgICAgLSB1bmljYXN0IGZyYW1lCiAqICAgICAgICBCVUNLRVRfVFJBRkZJQ19NR01UX0ZSQU1FICAgICAgICAtIG1hbmFnZW1lbnQgZnJhbWUKICogICAgICAgIEJVQ0tFVF9UUkFGRklDX0FSUCAgICAgICAgICAgICAgICAtIGFycCBmcmFtZQogKiAgICAgICAgQlVDS0VUX1RSQUZGSUNfVENQX0RBVEEgICAgICAgICAgICAtIFRDUCBEYXRhCiAqICAgICAgICBCVUNLRVRfVFJBRkZJQ19UQ1BfQ1RSTCAgICAgICAgICAgIC0gVENQIEN0cmwgKGlmIGFueSBvZiB0aGUgVENQIEZsYWdzWzU6MF0gYXJlIHNldCkKICogICAgICAgIEJVQ0tFVF9UUkFGRklDX1VEUCAgICAgICAgICAgICAgICAtIFVEUAogKiAgICAgICAgQlVDS0VUX1RSQUZGSUNfTk9OX1RDUFVEUCAgICAgICAgLSBjb3ZlcnMgSUdNUCxJQ01QLEdSRSxJR1JQLEwyVFAKICogICAgICAgIEJVQ0tFVF9UUkFGRklDX0lNUyAgICAgICAgICAgICAgICAtIEluZ3Jlc3MgTW9uaXRvciBTb3VyY2UKICogICAgICAgIEJVQ0tFVF9UUkFGRklDX1BPTElDWV9NSVJST1IgICAgLSBQb2xpY3kgTWlycm9yCiAqICAgICAgICBCVUNLRVRfVFJBRkZJQ19QTElDWV9UUkFQICAgICAgICAtIFBvbGljeSBUcmFwCiAqLwojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX1VOS05PV05fVU5JQ0FTVCAgICAgIDB4MDEKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19VTktOT1dOX01VTFRJQ0FTVCAgICAweDAyCiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfQlJPQURDQVNUICAgICAgICAgICAgMHgwNAojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX01VTFRJQ0FTVCAgICAgICAgICAgIDB4MDgKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19VTklDQVNUICAgICAgICAgICAgICAgIDB4MTAKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19NR01UX0ZSQU1FICAgICAgICAgICAgMHgyMAojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX0FSUCAgICAgICAgICAgICAgICAgICAgMHg0MAojZGVmaW5lIEJVQ0tFVF9UUkFGRklDX1RDUF9EQVRBICAgICAgICAgICAgICAgIDB4MTAwCiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfVENQX0NUUkwgICAgICAgICAgICAgICAgMHgyMDAKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19VRFAgICAgICAgICAgICAgICAgICAgIDB4NDAwCiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfTk9OX1RDUFVEUCAgICAgICAgICAgIDB4ODAwCiNkZWZpbmUgQlVDS0VUX1RSQUZGSUNfSU1TICAgICAgICAgICAgICAgICAgICAweDEwMDAKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19QT0xJQ1lfTUlSUk9SICAgICAgICAweDIwMDAKI2RlZmluZSBCVUNLRVRfVFJBRkZJQ19QTElDWV9UUkFQICAgICAgICAgICAgMHg0MDAwCgovKgogKiAgdHlwZWRlZjogZW51bSBHVF9QSVJMX0NPVU5UX01PREUKICoKICogIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgcG9ydCBlZ3Jlc3MgcmF0ZSBsaW1pdCBjb3VudGluZyBtb2RlLgogKgogKiAgRW51bWVyYXRpb25zOgogKiAgICAgIEdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMSAtCiAqICAgICAgICAgICAgICAgIENvdW50IGFsbCBMYXllciAxIGJ5dGVzOiAKICogICAgICAgICAgICAgICAgUHJlYW1ibGUgKDhieXRlcykgKyBGcmFtZSdzIERBIHRvIENSQyArIElGRyAoMTJieXRlcykKICogICAgICBHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjIgLQogKiAgICAgICAgICAgICAgICBDb3VudCBhbGwgTGF5ZXIgMiBieXRlczogRnJhbWUncyBEQSB0byBDUkMKICogICAgICBHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjMgLQogKiAgICAgICAgICAgICAgICBDb3VudCBhbGwgTGF5ZXIgMyBieXRlczogCiAqICAgICAgICAgICAgICAgIEZyYW1lJ3MgREEgdG8gQ1JDIC0gMTggLSA0IChpZiBmcmFtZSBpcyB0YWdnZWQpCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfUElSTF9DT1VOVF9BTExfTEFZRVIxID0gMCwKICAgIEdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMiwKICAgIEdUX1BJUkxfQ09VTlRfQUxMX0xBWUVSMwp9IEdUX1BJUkxfQ09VTlRfTU9ERTsKCi8qCiAqICB0eXBlZGVmOiBlbnVtIEdUX1BJUkwyX0NPVU5UX01PREUKICoKICogIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgcG9ydCBlZ3Jlc3MgcmF0ZSBsaW1pdCBjb3VudGluZyBtb2RlLgogKgogKiAgRW51bWVyYXRpb25zOgogKiAgICAgIEdUX1BJUkwyX0NPVU5UX0ZSQU1FIC0KICogICAgICAgICAgICAgICAgQ291bnQgdGhlIG51bWJlciBvZiBmcmFtZXMKICogICAgICBHVF9QSVJMMl9DT1VOVF9BTExfTEFZRVIxIC0KICogICAgICAgICAgICAgICAgQ291bnQgYWxsIExheWVyIDEgYnl0ZXM6IAogKiAgICAgICAgICAgICAgICBQcmVhbWJsZSAoOGJ5dGVzKSArIEZyYW1lJ3MgREEgdG8gQ1JDICsgSUZHICgxMmJ5dGVzKQogKiAgICAgIEdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjIgLQogKiAgICAgICAgICAgICAgICBDb3VudCBhbGwgTGF5ZXIgMiBieXRlczogRnJhbWUncyBEQSB0byBDUkMKICogICAgICBHVF9QSVJMMl9DT1VOVF9BTExfTEFZRVIzIC0KICogICAgICAgICAgICAgICAgQ291bnQgYWxsIExheWVyIDMgYnl0ZXM6IAogKiAgICAgICAgICAgICAgICBGcmFtZSdzIERBIHRvIENSQyAtIDE4IC0gNCAoaWYgZnJhbWUgaXMgdGFnZ2VkKQogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1BJUkwyX0NPVU5UX0ZSQU1FID0gMCwKICAgIEdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjEsCiAgICBHVF9QSVJMMl9DT1VOVF9BTExfTEFZRVIyLAogICAgR1RfUElSTDJfQ09VTlRfQUxMX0xBWUVSMwp9IEdUX1BJUkwyX0NPVU5UX01PREU7CgoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUElSTF9SRVNPVVJDRQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIFBJUkwgUmVzb3VyY2UKICoKICogIEZpZWxkczoKICogICAgICBhY2NvdW50UUNvbmYgICAgLSBhY2NvdW50IGRpc2NhcmRlZCBmcmFtZXMgZHVlIHRvIHF1ZXVlIGNvbmdlc3Rpb24KICogICAgICBhY2NvdW50RmlsdGVyZWQgLSBhY2NvdW50IGZpbHRlcmVkIGZyYW1lcwogKiAgICAgICAgZWJzTGltaXRBY3Rpb24gIC0gYWN0aW9uIHNob3VsZCBiZSB0YWtlbiB3aGVuIHRoZSBpbmNvbWluZyByYXRlIGV4Y2VlZHMKICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlYnNMaW1pdC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQl9MSU1JVF9BQ1RJT05fRFJPUCAtIGRyb3AgcGFja2V0cwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNCX0xJTUlUX0FDVElPTl9GQyAgIC0gc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0CiAqICAgICAgICBlYnNMaW1pdCAgICAgICAgLSBFeGNlc3MgQnVyc3QgU2l6ZSBsaW1pdCAoIDAgfiAweEZGRkZGRikKICogICAgICAgIGNic0xpbWl0ICAgICAgICAtIENvbW1pdHRlZCBCVXJzdCBTaXplIGxpbWl0IChleHBlY3RlZCB0byBiZSAya0J5dGVzKQogKiAgICAgICAgYmt0UmF0ZUZhY3RvciAgIC0gYnVja2V0IHJhdGUgZmFjdG9yID0gYnVja2V0RGVjcmVtZW50L3VwZGF0ZUludGVydmFsLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdXBkYXRlSW50ZXJ2YWwgaW5kaWNhdGVzIHRoZSByYXRlIGF0IHdoaWNoIHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldCBuZWVkcyB0byBiZSB1cGRhdGVkIHdpdGggdG9rZW5zLCBvciAxL0NJUiwgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBDSVIgaXMgdGhlIGNvbW1pdHRlZCBpbmZvcm1hdGlvbiByYXRlIGluIGticHMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXREZWNyZW1lbnQgaW5kaWNhdGVzIHRoZSBhbW91bnQgb2YgdG9rZW5zIHRoYXQgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkIHRvIGJlIHJlbW92ZWQgcGVyIGVhY2ggYnVja2V0IGRlY3JlbWVudC4KICogICAgICAgIGJrdEluY3JlbWVudCAgICAtIHRoZSBhbW91bnQgb2YgdG9rZW5zIHRoYXQgbmVlZCB0byBiZSBhZGRlZCBmb3IgZWFjaCAKICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgb2YgcGFja2V0IGluZm9ybWF0aW9uLgogKiAgICAgICAgYmt0UmF0ZVR5cGUgICAgICAgIC0gYnVja2V0IGlzIGVpdGhlciByYXRlIGJhc2VkIG9yIHRyYWZmaWMgdHlwZSBiYXNlZC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UWVBFX1JBVEVfQkFTRUQsIG9yCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFlQRV9UUkFGRklDX0JBU0VECiAqICAgICAgICBia3RUeXBlTWFzayAgICAgICAgLSB1c2VkIGlmIGJrdFJhdGVUeXBlIGlzIEJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQuIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnM6CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19VTktOT1dOX1VOSUNBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19VTktOT1dOX01VTFRJQ0FTVCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX0JST0FEQ0FTVCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX01VTFRJQ0FTVCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX1VOSUNBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19NR01UX0ZSQU1FLCBhbmQKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX0FSUAogKiAgICAgICAgYnl0ZVRvYmVDb3VudGVkICAgIC0gYnl0ZXMgdG8gYmUgY291bnRlZCBmb3IgYWNjb3VudGluZwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTF9DT1VOVF9BTExfTEFZRVIxLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTF9DT1VOVF9BTExfTEFZRVIyLCBvcgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTF9DT1VOVF9BTExfTEFZRVIzCiAqCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgICAgICBhY2NvdW50UUNvbmY7CiAgICBHVF9CT09MICAgICAgICBhY2NvdW50RmlsdGVyZWQ7CiAgICBHVF9FU0JfTElNSVRfQUNUSU9OIGVic0xpbWl0QWN0aW9uOwogICAgR1RfVTMyICAgICAgICBlYnNMaW1pdDsKICAgIEdUX1UzMiAgICAgICAgY2JzTGltaXQ7CiAgICBHVF9VMzIgICAgICAgIGJrdFJhdGVGYWN0b3I7CiAgICBHVF9VMzIgICAgICAgIGJrdEluY3JlbWVudDsKICAgIEdUX0JVQ0tFVF9SQVRFX1RZUEUgICAgYmt0UmF0ZVR5cGU7CiAgICBHVF9VMzIgICAgICAgIGJrdFR5cGVNYXNrOwogICAgR1RfUElSTF9DT1VOVF9NT0RFICAgIGJ5dGVUb2JlQ291bnRlZDsKfSBHVF9QSVJMX1JFU09VUkNFOwoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QSVJMX0NVU1RPTV9SQVRFX0xJTUlUCiAqCiAqICBEZXNjcmlwdGlvbjogVGhlIHBhcmFtZXRlcnMgdGhhdCBkZWNpZGVzIEluZ3Jlc3MgUmF0ZSBMaW1pdCB2YXJ5IGRlcGVuZGluZyBvbgogKiAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24uIFNpbmNlIERTRFQgZHJpdmVyIGNhbm5vdCBjb3ZlciBhbGwgdGhlIGNhc2VzLAogKiAgICAgICAgICAgICAgICB0aGlzIHN0cnVjdHVyZSBpcyBwcm92aWRlZCBmb3IgdGhlIGN1c3RvbSBwYXJhbWV0ZXIgc2V0dGluZy4KICogICAgICAgICAgICAgICAgSG93ZXZlciwgaW4gbW9zdCBjYXNlcywgdXNlciBtYXkgaW5nb3JlIHRoaXMgc3RydWN0dXJlIGJ5IHNldHRpbmcKICogICAgICAgICAgICAgICAgaXNWYWxpZCB0byBHVF9GQUxTRS4gSWYgSW5ncmVzcyBSYXRlIExpbWl0IGlzIHRvbyBtdWNoIG9mZiBmcm9tCiAqICAgICAgICAgICAgICAgIHRoZSBleHBlY3RlZCByYXRlLCBwbGVhc2UgY29udGFjdCBGQUUgYW5kIGdldHMgdGhlIGNvcnJlY3QgZWJzTGltaXQsCiAqICAgICAgICAgICAgICAgIGNic0xpbWl0LGJrdEluY3JlbWVudCwgYW5kIGJrdFJhdGVGYWN0b3IgdmFsdWUgYW5kIHVzZSB0aGlzIHN0cnVjdHVyZSAKICogICAgICAgICAgICAgICAgdG8gZG8gY3VzdG9tIHBhcmFtZXRlciBzZXR0aW5nLgogKgogKiAgICAgICAgaXNWYWxpZCAgICAgICAgIC0gSWYgR1RfVFJVRSwgdGhlIHBhcmFtZXJzIGluIHRoaXMgc3RydWN0dXJlIGFyZSB1c2VkIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcHJvZ3JhbSBQSVJMIFJlc291cmNlJ3MgUmF0ZSBMaW1pdC4gQW5kIGluZ3Jlc3NSYXRlCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBHVF9QSVJMX0JVQ0tFVF9EQVRBIHN0cnVjdHVyZSBhcmUgaWdub3JlZC4KICogICAgICAgICAgICAgICAgICAgICAgICAgIElmIEdUX0ZBTFNFLCBpbmdyZXNzUmF0ZSBpbiBHVF9QSVJMX0JVQ0tFVF9EQVRBIHN0cnVjdHVyZSAKICogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgZm9yIFJlc291cmNlJ3MgUmF0ZSBMaW1pdC4KICogICAgICAgIGVic0xpbWl0ICAgICAgICAtIEV4Y2VzcyBCdXJzdCBTaXplIGxpbWl0ICggMCB+IDB4RkZGRkZGKQogKiAgICAgICAgY2JzTGltaXQgICAgICAgIC0gQ29tbWl0dGVkIEJ1cnN0IFNpemUgbGltaXQgKGV4cGVjdGVkIHRvIGJlIDJrQnl0ZXMpCiAqICAgICAgICBia3RJbmNyZW1lbnQgICAgLSB0aGUgYW1vdW50IG9mIHRva2VucyB0aGF0IG5lZWQgdG8gYmUgYWRkZWQgZm9yIGVhY2ggCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIG9mIHBhY2tldCBpbmZvcm1hdGlvbi4KICogICAgICAgIGJrdFJhdGVGYWN0b3IgICAtIGJ1Y2tldCByYXRlIGZhY3RvciA9IGJ1Y2tldERlY3JlbWVudC91cGRhdGVJbnRlcnZhbCwKICogICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHVwZGF0ZUludGVydmFsIGluZGljYXRlcyB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQgbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIHRva2Vucywgb3IgMS9DSVIsIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgQ0lSIGlzIHRoZSBjb21taXR0ZWQgaW5mb3JtYXRpb24gcmF0ZSBpbiBrYnBzLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0RGVjcmVtZW50IGluZGljYXRlcyB0aGUgYW1vdW50IG9mIHRva2VucyB0aGF0IAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBiZSByZW1vdmVkIHBlciBlYWNoIGJ1Y2tldCBkZWNyZW1lbnQuCiovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX0JPT0wgICAgICAgIGlzVmFsaWQ7CiAgICBHVF9VMzIgICAgICAgIGVic0xpbWl0OwogICAgR1RfVTMyICAgICAgICBjYnNMaW1pdDsKICAgIEdUX1UzMiAgICAgICAgYmt0SW5jcmVtZW50OwogICAgR1RfVTMyICAgICAgICBia3RSYXRlRmFjdG9yOwp9IEdUX1BJUkxfQ1VTVE9NX1JBVEVfTElNSVQ7CgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BJUkxfQlVDS0VUX0RBVEEKICoKICogIERlc2NyaXB0aW9uOiBkYXRhIHN0cnVjdHVyZSBmb3IgUElSTCBCdWNrZXQgcHJvZ3JhbWluZyB0aGF0IGlzIHJlc291cmNlIGJhc2VkCiAqCiAqICBGaWVsZHM6CiAqICAgICAgICBpbmdyZXNzUmF0ZSAgICAgICAtIGNvbW1pdGVkIGluZ3Jlc3MgcmF0ZSBpbiBrYnBzLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgNjRrYnBzIH4gMU1icHMgICAgOiBpbmNyZW1lbnRzIG9mIDY0a2JwcywKICogICAgICAgICAgICAgICAgICAgICAgICAgIDFNYnBzIH4gMTAwTWJwcyAgIDogaW5jcmVtZW50cyBvZiAxTWJwcywgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAxMDBNYnBzIH4gMjAwTWJwcyA6IGluY3JlbWVudHMgb2YgMTBNYnBzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZWZvcmUsIHRoZSB2YWxpZCB2YWx1ZXMgYXJlOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQsIDEyOCwgMTkyLCAyNTYsIDMyMCwgMzg0LC4uLiwgOTYwLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCwgMjAwMCwgMzAwMCwgNDAwMCwgLi4uLCAxMDAwMDAsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAwMDAsIDEyMDAwMCwgMTMwMDAwLCAuLi4sIDIwMDAwMC4KICogICAgICAgIGN1c3RvbVNldHVwICAgICAgIC0gY3VzdG9tIGluZ3Jlc3MgcmF0ZSBwYXJhbWV0ZXIgc2V0dXAuIHBsZWFzZSByZWZlciB0bwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTF9DVVNUT01fUkFURV9MSU1JVCBzdHJ1Y3R1cmUuCiAqICAgICAgYWNjb3VudFFDb25mICAgIC0gYWNjb3VudCBkaXNjYXJkZWQgZnJhbWVzIGR1ZSB0byBxdWV1ZSBjb25nZXN0aW9uCiAqICAgICAgYWNjb3VudEZpbHRlcmVkIC0gYWNjb3VudCBmaWx0ZXJlZCBmcmFtZXMKICogICAgICAgIGVzYkxpbWl0QWN0aW9uICAgICAtIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gd2hlbiB0aGUgaW5jb21pbmcgcmF0ZSBleGNlZWRzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGltaXQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0JfTElNSVRfQUNUSU9OX0RST1AgLSBkcm9wIHBhY2tldHMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQl9MSU1JVF9BQ1RJT05fRkMgICAtIHNlbmQgZmxvdyBjb250cm9sIHBhY2tldAogKiAgICAgICAgZmNEZWFzc2VydE1vZGUgICAgLSBwb3J0IGZsb3cgY29udHJvbCBkZS1hc3NlcnRpb24gbW9kZSB3aGVuIGxpbWl0QWN0aW9uIGlzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gRVNCX0xJTUlUX0FDVElPTl9GQy4KICogICAgICAgICAgICAgICAgICAgICAgICAgIGZjRGVhc3NlcnRNb2RlWzBdIGZvciBwb3J0IDAsIGZjRGVhc3NlcnRNb2RlWzFdIGZvciAKICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgMSwgZXRjLiBJZiBwb3J0IHggZG9lcyBub3Qgc2hhcmUgdGhlIGJ1Y2tldCwKICogICAgICAgICAgICAgICAgICAgICAgICAgIGZjRGVhc3NlcnRNb2RlW3hdIGRhdGEgd2lsbCBiZSBpZ25vcmVkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTF9GQ19ERUFTU0VSVF9FTVBUWSAtCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGUtYXNzZXJ0IHdoZW4gdGhlIGluZ3Jlc3MgcmF0ZSByZXNvdXJjZSBoYXMgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjb21lIGVtcHR5LgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTF9GQ19ERUFTU0VSVF9DQlNfTElNSVQgLQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlLWFzc2VydCB3aGVuIHRoZSBpbmdyZXNzIHJhdGUgcmVzb3VyY2UgaGFzIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVub3VnaCByb29tIGFzIHNwZWNpZmllZCBieSB0aGUgQ0JTTGltaXQuCiAqICAgICAgICBia3RSYXRlVHlwZSAgICAgICAgLSBidWNrZXQgaXMgZWl0aGVyIHJhdGUgYmFzZWQgb3IgdHJhZmZpYyB0eXBlIGJhc2VkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RZUEVfUkFURV9CQVNFRCwgb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQKICogICAgICAgIGJrdFR5cGVNYXNrICAgICAgICAtIHVzZWQgaWYgYmt0UmF0ZVR5cGUgaXMgQlVDS0VUX1RZUEVfVFJBRkZJQ19CQVNFRC4gCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX1VOS05PV05fVU5JQ0FTVCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX1VOS05PV05fTVVMVElDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfQlJPQURDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfTVVMVElDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVU5JQ0FTVCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX01HTVRfRlJBTUUsIGFuZAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfQVJQCiAqICAgICAgICBieXRlVG9iZUNvdW50ZWQgICAgLSBieXRlcyB0byBiZSBjb3VudGVkIGZvciBhY2NvdW50aW5nCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjEsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjIsIG9yCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMX0NPVU5UX0FMTF9MQVlFUjMKICoKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UzMiAgICAgICAgaW5ncmVzc1JhdGU7CiAgICBHVF9QSVJMX0NVU1RPTV9SQVRFX0xJTUlUIGN1c3RvbVNldHVwOwogICAgR1RfQk9PTCAgICAgICAgYWNjb3VudFFDb25mOwogICAgR1RfQk9PTCAgICAgICAgYWNjb3VudEZpbHRlcmVkOwogICAgR1RfRVNCX0xJTUlUX0FDVElPTiBlYnNMaW1pdEFjdGlvbjsKICAgIEdUX1BJUkxfRkNfREVBU1NFUlQgZmNEZWFzc2VydE1vZGVbTUFYX1NXSVRDSF9QT1JUU107CiAgICBHVF9CVUNLRVRfUkFURV9UWVBFICAgIGJrdFJhdGVUeXBlOwogICAgR1RfVTMyICAgICAgICBia3RUeXBlTWFzazsKICAgIEdUX1BJUkxfQ09VTlRfTU9ERSAgICBieXRlVG9iZUNvdW50ZWQ7Cn0gR1RfUElSTF9EQVRBOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUElSTDJfUkVTT1VSQ0UKICoKICogIERlc2NyaXB0aW9uOiBkYXRhIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBQSVJMIFJlc291cmNlCiAqCiAqICBGaWVsZHM6CiAqICAgICAgYWNjb3VudFFDb25mICAgIC0gYWNjb3VudCBkaXNjYXJkZWQgZnJhbWVzIGR1ZSB0byBxdWV1ZSBjb25nZXN0aW9uCiAqICAgICAgYWNjb3VudEZpbHRlcmVkIC0gYWNjb3VudCBmaWx0ZXJlZCBmcmFtZXMKICogICAgICBtZ210TnJsRW4gICAgICAgICAtIGV4Y2x1ZGUgbWFuYWdlbWVudCBmcmFtZSBmcm9tIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBjYWxjdWxhdGlvbgogKiAgICAgIHNhTnJsRW4gICAgICAgICAtIGV4Y2x1ZGUgZnJvbSBpbmdyZXNzIHJhdGUgbGltaXRpbmcgY2FsY3VsYXRpb24gaWYgdGhlIFNBIG9mIHRoZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgaXMgaW4gQVRVIHdpdGggRW50cnlTdGF0ZSB0aGF0IGluZGljYXRlcyBOb24gUmF0ZSBMaW1pdGVkLgogKiAgICAgIGRhTnJsRW4gICAgICAgICAtIGV4Y2x1ZGUgZnJvbSBpbmdyZXNzIHJhdGUgbGltaXRpbmcgY2FsY3VsYXRpb24gaWYgdGhlIERBIG9mIHRoZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgaXMgaW4gQVRVIHdpdGggRW50cnlTdGF0ZSB0aGF0IGluZGljYXRlcyBOb24gUmF0ZSBMaW1pdGVkLgogKiAgICAgICAgc2FtcGxpbmdNb2RlICAgIC0gc2FtcGxlIG9uZSBvdXQgb2Ygc28gbWFueSBmcmFtZXMvYnl0ZXMgZm9yIGEgc3RyZWFtIG9mIGZyYW1lcwogKiAgICAgICAgYWN0aW9uTW9kZSAgICAgICAgLSBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHdoZW4gdGhlcmUgYXJlIG5vdCBlbm91Z2ggdG9rZW5zCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhY2NlcHQgdGhlIGVudGlyZSBpbmNvbWluZyBmcmFtZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElSTF9BQ1RJT05fQUNDRVBUIC0gYWNjZXB0IHRoZSBmcmFtZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElSTF9BQ1RJT05fVVNFX0xJTUlUX0FDVElPTiAtIHVzZSBsaW1pdEFjdGlvbgogKiAgICAgICAgZWJzTGltaXRBY3Rpb24gIC0gYWN0aW9uIHNob3VsZCBiZSB0YWtlbiB3aGVuIHRoZSBpbmNvbWluZyByYXRlIGV4Y2VlZHMKICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlYnNMaW1pdC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQl9MSU1JVF9BQ1RJT05fRFJPUCAtIGRyb3AgcGFja2V0cwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNCX0xJTUlUX0FDVElPTl9GQyAgIC0gc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0CiAqICAgICAgICBlYnNMaW1pdCAgICAgICAgLSBFeGNlc3MgQnVyc3QgU2l6ZSBsaW1pdCAoIDAgfiAweEZGRkZGRikKICogICAgICAgIGNic0xpbWl0ICAgICAgICAtIENvbW1pdHRlZCBCVXJzdCBTaXplIGxpbWl0IChleHBlY3RlZCB0byBiZSAya0J5dGVzKQogKiAgICAgICAgYmt0UmF0ZUZhY3RvciAgIC0gYnVja2V0IHJhdGUgZmFjdG9yID0gYnVja2V0RGVjcmVtZW50L3VwZGF0ZUludGVydmFsLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdXBkYXRlSW50ZXJ2YWwgaW5kaWNhdGVzIHRoZSByYXRlIGF0IHdoaWNoIHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldCBuZWVkcyB0byBiZSB1cGRhdGVkIHdpdGggdG9rZW5zLCBvciAxL0NJUiwgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBDSVIgaXMgdGhlIGNvbW1pdHRlZCBpbmZvcm1hdGlvbiByYXRlIGluIGticHMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXREZWNyZW1lbnQgaW5kaWNhdGVzIHRoZSBhbW91bnQgb2YgdG9rZW5zIHRoYXQgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkIHRvIGJlIHJlbW92ZWQgcGVyIGVhY2ggYnVja2V0IGRlY3JlbWVudC4KICogICAgICAgIGJrdEluY3JlbWVudCAgICAtIHRoZSBhbW91bnQgb2YgdG9rZW5zIHRoYXQgbmVlZCB0byBiZSBhZGRlZCBmb3IgZWFjaCAKICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgb2YgcGFja2V0IGluZm9ybWF0aW9uLgogKiAgICAgICAgZmNEZWFzc2VydE1vZGUgICAgLSBmbG93IGNvbnRyb2wgZGUtYXNzZXJ0aW9uIG1vZGUgd2hlbiBsaW1pdEFjdGlvbiBpcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIEVTQl9MSU1JVF9BQ1RJT05fRkMuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMX0ZDX0RFQVNTRVJUX0VNUFRZIC0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZS1hc3NlcnQgd2hlbiB0aGUgaW5ncmVzcyByYXRlIHJlc291cmNlIGhhcyAKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNvbWUgZW1wdHkuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMX0ZDX0RFQVNTRVJUX0NCU19MSU1JVCAtCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGUtYXNzZXJ0IHdoZW4gdGhlIGluZ3Jlc3MgcmF0ZSByZXNvdXJjZSBoYXMgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5vdWdoIHJvb20gYXMgc3BlY2lmaWVkIGJ5IHRoZSBDQlNMaW1pdC4KICogICAgICAgIGJrdFJhdGVUeXBlICAgICAgICAtIGJ1Y2tldCBpcyBlaXRoZXIgcmF0ZSBiYXNlZCBvciB0cmFmZmljIHR5cGUgYmFzZWQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFlQRV9SQVRFX0JBU0VELCBvcgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RZUEVfVFJBRkZJQ19CQVNFRAogKiAgICAgIHByaU9ScHQgICAgICAgICAtIGRldGVybWluZSB0aGUgaW5jb21pbmcgZnJhbWVzIHRoYXQgZ2V0IHJhdGUgbGltaXRlZCB1c2luZwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpbmdyZXNzIHJhdGUgcmVzb3VyY2UuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1RSVUUgLSB0eXBlTWFzayBPUiBwcmlNYXNrCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX0ZBTFNFIC0gdHlwZU1hc2sgQU5EIHByaU1hc2sKICogICAgICAgIHByaU1hc2sgICAgICAgICAtIHByaW9yaXR5IGJpdCBtYXNrIHRoYXQgZWFjaCBiaXQgaW5kaWNhdGVzIG9uZSBvZiB0aGUgZm91cgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUgcHJpb3JpdGllcy4gU2V0dGluZyBlYWNoIG9uZSBvZiB0aGVzZSBiaXRzIGluZGljYXRlcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGlzIHBhcnRpY3VsYXIgcmF0ZSByZXNvdXJjZSBpcyBzbGF0ZWQgdG8gYWNjb3VudCBmb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nIGZyYW1lcyB3aXRoIHRoZSBlbmFibGVkIGJpdHMnIHByaW9yaXR5LgogKiAgICAgICAgYmt0VHlwZU1hc2sgICAgICAgIC0gdXNlZCBpZiBia3RSYXRlVHlwZSBpcyBCVUNLRVRfVFlQRV9UUkFGRklDX0JBU0VELiAKICogICAgICAgICAgICAgICAgICAgICAgICAgIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9VTklDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVU5LTk9XTl9NVUxUSUNBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19CUk9BRENBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19NVUxUSUNBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19VTklDQVNULAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfTUdNVF9GUkFNRSwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX0FSUCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX1RDUF9EQVRBLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVENQX0NUUkwsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19VRFAsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19OT05fVENQVURQLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfSU1TLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfUE9MSUNZX01JUlJPUiwgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19QTElDWV9UUkFQCiAqICAgICAgICBieXRlVG9iZUNvdW50ZWQgICAgLSBieXRlcyB0byBiZSBjb3VudGVkIGZvciBhY2NvdW50aW5nCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMMl9DT1VOVF9GUkFNRSwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjEsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMMl9DT1VOVF9BTExfTEFZRVIyLCBvcgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTDJfQ09VTlRfQUxMX0xBWUVSMwogKgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICAgICAgYWNjb3VudFFDb25mOwogICAgR1RfQk9PTCAgICAgICAgYWNjb3VudEZpbHRlcmVkOwogICAgR1RfQk9PTCAgICAgICAgbWdtdE5ybEVuOwogICAgR1RfQk9PTCAgICAgICAgc2FOcmxFbjsKICAgIEdUX0JPT0wgICAgICAgIGRhTnJsRW47CiAgICBHVF9CT09MICAgICAgICBzYW1wbGluZ01vZGU7CiAgICBHVF9QSVJMX0FDVElPTiAgICBhY3Rpb25Nb2RlOwogICAgR1RfRVNCX0xJTUlUX0FDVElPTiBlYnNMaW1pdEFjdGlvbjsKICAgIEdUX1UzMiAgICAgICAgZWJzTGltaXQ7CiAgICBHVF9VMzIgICAgICAgIGNic0xpbWl0OwogICAgR1RfVTMyICAgICAgICBia3RSYXRlRmFjdG9yOwogICAgR1RfVTMyICAgICAgICBia3RJbmNyZW1lbnQ7CiAgICBHVF9QSVJMX0ZDX0RFQVNTRVJUIGZjRGVhc3NlcnRNb2RlOwogICAgR1RfQlVDS0VUX1JBVEVfVFlQRSAgICBia3RSYXRlVHlwZTsKICAgIEdUX0JPT0wgICAgICAgIHByaU9ScHQ7CiAgICBHVF9VMzIgICAgICAgIHByaU1hc2s7CiAgICBHVF9VMzIgICAgICAgIGJrdFR5cGVNYXNrOwogICAgR1RfUElSTDJfQ09VTlRfTU9ERSAgICBieXRlVG9iZUNvdW50ZWQ7Cn0gR1RfUElSTDJfUkVTT1VSQ0U7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QSVJMMl9CVUNLRVRfREFUQQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgc3RydWN0dXJlIGZvciBQSVJMMiBCdWNrZXQgcHJvZ3JhbWluZyB0aGF0IGlzIHBvcnQgYmFzZWQuCiAqCiAqICBGaWVsZHM6CiAqICAgICAgICBpbmdyZXNzUmF0ZSAgICAgICAtIGNvbW1pdGVkIGluZ3Jlc3MgcmF0ZSBpbiBrYnBzLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgNjRrYnBzIH4gMU1icHMgICAgOiBpbmNyZW1lbnRzIG9mIDY0a2JwcywKICogICAgICAgICAgICAgICAgICAgICAgICAgIDFNYnBzIH4gMTAwTWJwcyAgIDogaW5jcmVtZW50cyBvZiAxTWJwcywgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAxMDBNYnBzIH4gMjAwTWJwcyA6IGluY3JlbWVudHMgb2YgMTBNYnBzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZWZvcmUsIHRoZSB2YWxpZCB2YWx1ZXMgYXJlOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQsIDEyOCwgMTkyLCAyNTYsIDMyMCwgMzg0LC4uLiwgOTYwLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCwgMjAwMCwgMzAwMCwgNDAwMCwgLi4uLCAxMDAwMDAsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAwMDAsIDEyMDAwMCwgMTMwMDAwLCAuLi4sIDIwMDAwMC4KICogICAgICAgIGN1c3RvbVNldHVwICAgICAgIC0gY3VzdG9tIGluZ3Jlc3MgcmF0ZSBwYXJhbWV0ZXIgc2V0dXAuIHBsZWFzZSByZWZlciB0bwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTF9DVVNUT01fUkFURV9MSU1JVCBzdHJ1Y3R1cmUuCiAqICAgICAgYWNjb3VudFFDb25mICAgIC0gYWNjb3VudCBkaXNjYXJkZWQgZnJhbWVzIGR1ZSB0byBxdWV1ZSBjb25nZXN0aW9uCiAqICAgICAgYWNjb3VudEZpbHRlcmVkIC0gYWNjb3VudCBmaWx0ZXJlZCBmcmFtZXMKICogICAgICBtZ210TnJsRW4gICAgICAgICAtIGV4Y2x1ZGUgbWFuYWdlbWVudCBmcmFtZSBmcm9tIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBjYWxjdWxhdGlvbgogKiAgICAgIHNhTnJsRW4gICAgICAgICAtIGV4Y2x1ZGUgZnJvbSBpbmdyZXNzIHJhdGUgbGltaXRpbmcgY2FsY3VsYXRpb24gaWYgdGhlIFNBIG9mIHRoZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgaXMgaW4gQVRVIHdpdGggRW50cnlTdGF0ZSB0aGF0IGluZGljYXRlcyBOb24gUmF0ZSBMaW1pdGVkLgogKiAgICAgIGRhTnJsRW4gICAgICAgICAtIGV4Y2x1ZGUgZnJvbSBpbmdyZXNzIHJhdGUgbGltaXRpbmcgY2FsY3VsYXRpb24gaWYgdGhlIERBIG9mIHRoZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgaXMgaW4gQVRVIHdpdGggRW50cnlTdGF0ZSB0aGF0IGluZGljYXRlcyBOb24gUmF0ZSBMaW1pdGVkLgogKiAgICAgICAgc2FtcGxpbmdNb2RlICAgIC0gc2FtcGxlIG9uZSBvdXQgb2Ygc28gbWFueSBmcmFtZXMvYnl0ZXMgZm9yIGEgc3RyZWFtIG9mIGZyYW1lcwogKiAgICAgICAgYWN0aW9uTW9kZSAgICAgICAgLSBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHdoZW4gdGhlcmUgYXJlIG5vdCBlbm91Z2ggdG9rZW5zCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhY2NlcHQgdGhlIGVudGlyZSBpbmNvbWluZyBmcmFtZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElSTF9BQ1RJT05fQUNDRVBUIC0gYWNjZXB0IHRoZSBmcmFtZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElSTF9BQ1RJT05fVVNFX0xJTUlUX0FDVElPTiAtIHVzZSBsaW1pdEFjdGlvbgogKiAgICAgICAgZWJzTGltaXRBY3Rpb24gICAgIC0gYWN0aW9uIHNob3VsZCBiZSB0YWtlbiB3aGVuIHRoZSBpbmNvbWluZyByYXRlIGV4Y2VlZHMKICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW1pdC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQl9MSU1JVF9BQ1RJT05fRFJPUCAtIGRyb3AgcGFja2V0cwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNCX0xJTUlUX0FDVElPTl9GQyAgIC0gc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0CiAqICAgICAgICBmY0RlYXNzZXJ0TW9kZSAgICAtIGZsb3cgY29udHJvbCBkZS1hc3NlcnRpb24gbW9kZSB3aGVuIGxpbWl0QWN0aW9uIGlzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gRVNCX0xJTUlUX0FDVElPTl9GQy4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkxfRkNfREVBU1NFUlRfRU1QVFkgLQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlLWFzc2VydCB3aGVuIHRoZSBpbmdyZXNzIHJhdGUgcmVzb3VyY2UgaGFzIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY29tZSBlbXB0eS4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkxfRkNfREVBU1NFUlRfQ0JTX0xJTUlUIC0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZS1hc3NlcnQgd2hlbiB0aGUgaW5ncmVzcyByYXRlIHJlc291cmNlIGhhcyAKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbm91Z2ggcm9vbSBhcyBzcGVjaWZpZWQgYnkgdGhlIENCU0xpbWl0LgogKiAgICAgICAgYmt0UmF0ZVR5cGUgICAgICAgIC0gYnVja2V0IGlzIGVpdGhlciByYXRlIGJhc2VkIG9yIHRyYWZmaWMgdHlwZSBiYXNlZC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UWVBFX1JBVEVfQkFTRUQsIG9yCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFlQRV9UUkFGRklDX0JBU0VECiAqICAgICAgcHJpT1JwdCAgICAgICAgIC0gZGV0ZXJtaW5lIHRoZSBpbmNvbWluZyBmcmFtZXMgdGhhdCBnZXQgcmF0ZSBsaW1pdGVkIHVzaW5nCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGluZ3Jlc3MgcmF0ZSByZXNvdXJjZS4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfVFJVRSAtIHR5cGVNYXNrIE9SIHByaU1hc2sKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfRkFMU0UgLSB0eXBlTWFzayBBTkQgcHJpTWFzawogKiAgICAgICAgcHJpTWFzayAgICAgICAgIC0gcHJpb3JpdHkgYml0IG1hc2sgdGhhdCBlYWNoIGJpdCBpbmRpY2F0ZXMgb25lIG9mIHRoZSBmb3VyCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBwcmlvcml0aWVzLiBTZXR0aW5nIGVhY2ggb25lIG9mIHRoZXNlIGJpdHMgaW5kaWNhdGVzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoaXMgcGFydGljdWxhciByYXRlIHJlc291cmNlIGlzIHNsYXRlZCB0byBhY2NvdW50IGZvcgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgZnJhbWVzIHdpdGggdGhlIGVuYWJsZWQgYml0cycgcHJpb3JpdHkuCiAqICAgICAgICBia3RUeXBlTWFzayAgICAgICAgLSB1c2VkIGlmIGJrdFJhdGVUeXBlIGlzIEJVQ0tFVF9UWVBFX1RSQUZGSUNfQkFTRUQuIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnM6CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19VTktOT1dOX1VOSUNBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19VTktOT1dOX01VTFRJQ0FTVCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX0JST0FEQ0FTVCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX01VTFRJQ0FTVCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX1VOSUNBU1QsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19NR01UX0ZSQU1FLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfQVJQLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVDS0VUX1RSQUZGSUNfVENQX0RBVEEsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19UQ1BfQ1RSTCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX1VEUCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX05PTl9UQ1BVRFAsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19JTVMsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUNLRVRfVFJBRkZJQ19QT0xJQ1lfTUlSUk9SLCBhbmQKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVQ0tFVF9UUkFGRklDX1BMSUNZX1RSQVAKICogICAgICAgIGJ5dGVUb2JlQ291bnRlZCAgICAtIGJ5dGVzIHRvIGJlIGNvdW50ZWQgZm9yIGFjY291bnRpbmcKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkwyX0NPVU5UX0ZSQU1FLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfUElSTDJfQ09VTlRfQUxMX0xBWUVSMSwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUX1BJUkwyX0NPVU5UX0FMTF9MQVlFUjIsIG9yCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMMl9DT1VOVF9BTExfTEFZRVIzCiAqCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMzIgICAgICAgIGluZ3Jlc3NSYXRlOwogICAgR1RfUElSTF9DVVNUT01fUkFURV9MSU1JVCBjdXN0b21TZXR1cDsKICAgIEdUX0JPT0wgICAgICAgIGFjY291bnRRQ29uZjsKICAgIEdUX0JPT0wgICAgICAgIGFjY291bnRGaWx0ZXJlZDsKICAgIEdUX0JPT0wgICAgICAgIG1nbXROcmxFbjsKICAgIEdUX0JPT0wgICAgICAgIHNhTnJsRW47CiAgICBHVF9CT09MICAgICAgICBkYU5ybEVuOwogICAgR1RfQk9PTCAgICAgICAgc2FtcGxpbmdNb2RlOwogICAgR1RfUElSTF9BQ1RJT04gICAgYWN0aW9uTW9kZTsKICAgIEdUX0VTQl9MSU1JVF9BQ1RJT04gZWJzTGltaXRBY3Rpb247CiAgICBHVF9QSVJMX0ZDX0RFQVNTRVJUIGZjRGVhc3NlcnRNb2RlOwogICAgR1RfQlVDS0VUX1JBVEVfVFlQRSAgICBia3RSYXRlVHlwZTsKICAgIEdUX0JPT0wgICAgICAgIHByaU9ScHQ7CiAgICBHVF9VMzIgICAgICAgIHByaU1hc2s7CiAgICBHVF9VMzIgICAgICAgIGJrdFR5cGVNYXNrOwogICAgR1RfUElSTDJfQ09VTlRfTU9ERSAgICBieXRlVG9iZUNvdW50ZWQ7Cn0gR1RfUElSTDJfREFUQTsKCgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QSVJMX0NVU1RPTV9UU01fQ0ZHCiAqCiAqICBEZXNjcmlwdGlvbjogVGhlIHBhcmFtZXRlcnMgdGhhdCBkZWNpZGVzIEluZ3Jlc3MgUmF0ZSBMaW1pdCBmb3IgQVZCIGZyYW1lcyB2YXJ5IAogKiAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBhcHBsaWNhdGlvbi4gU2luY2UgRFNEVCBkcml2ZXIgY2Fubm90IGNvdmVyIGFsbCB0aGUgY2FzZXMsCiAqICAgICAgICAgICAgICAgIHRoaXMgc3RydWN0dXJlIGlzIHByb3ZpZGVkIGZvciB0aGUgY3VzdG9tIHBhcmFtZXRlciBzZXR0aW5nLgogKiAgICAgICAgICAgICAgICBIb3dldmVyLCBpbiBtb3N0IGNhc2VzLCB1c2VyIG1heSBpbmdvcmUgdGhpcyBzdHJ1Y3R1cmUgYnkgc2V0dGluZwogKiAgICAgICAgICAgICAgICBpc1ZhbGlkIHRvIEdUX0ZBTFNFLiBJZiBJbmdyZXNzIFJhdGUgTGltaXQgaXMgdG9vIG11Y2ggb2ZmIGZyb20KICogICAgICAgICAgICAgICAgdGhlIGV4cGVjdGVkIHJhdGUsIHBsZWFzZSBjb250YWN0IEZBRSBhbmQgZ2V0cyB0aGUgY29ycmVjdCBlYnNMaW1pdCwKICogICAgICAgICAgICAgICAgY2JzTGltaXQsIENUUyBpbnRlcnZhbCwgYW5kIGFjdGlvbiBtb2RlIHZhbHVlIGFuZCB1c2UgdGhpcyBzdHJ1Y3R1cmUgCiAqICAgICAgICAgICAgICAgIHRvIGRvIGN1c3RvbSBwYXJhbWV0ZXIgc2V0dGluZy4KICoKICogICAgICAgIGlzVmFsaWQgICAgICAgICAtIElmIEdUX1RSVUUsIHRoZSBwYXJhbWVycyBpbiB0aGlzIHN0cnVjdHVyZSBhcmUgdXNlZCAKICogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHByb2dyYW0gUElSTCBSZXNvdXJjZSdzIFJhdGUgTGltaXQuIEFuZCBpbmdyZXNzUmF0ZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gR1RfUElSTF9UU01fREFUQSBzdHJ1Y3R1cmUgYXJlIGlnbm9yZWQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBHVF9GQUxTRSwgaW5ncmVzc1JhdGUgaW4gR1RfUElSTF9UU01fREFUQSBzdHJ1Y3R1cmUgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkIGZvciBSZXNvdXJjZSdzIFJhdGUgTGltaXQuCiAqICAgICAgICBlYnNMaW1pdCAgICAgICAgLSBFeGNlc3MgQnVyc3QgU2l6ZSBsaW1pdCAoMCB+IDB4RkZGRikKICogICAgICAgIGNic0xpbWl0ICAgICAgICAtIENvbW1pdHRlZCBCdXJzdCBTaXplIGxpbWl0ICgwIH4gMHhGRkZGKQogKiAgICAgICAgY3RzSW50diAgICAgICAgIC0gQ2xhc3MgVGltZSBTbG90IEludGVydmFsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gaW50ZXJ2YWwgaXMgNjIuNXVzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gaW50ZXJ2YWwgaXMgMTI1dXMKICogICAgICAgICAgICAgICAgICAgICAgICAgIDIgLSBpbnRlcnZhbCBpcyAyNTB1cwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgMyAtIGludGVydmFsIGlzIDEwMDB1cwogKiAgICAgICAgYWN0aW9uTW9kZSAgICAgICAgLSBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHdoZW4gdGhlcmUgYXJlIG5vdCBlbm91Z2ggdG9rZW5zCiAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhY2NlcHQgdGhlIGVudGlyZSBpbmNvbWluZyBmcmFtZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElSTF9BQ1RJT05fQUNDRVBUIC0gYWNjZXB0IHRoZSBmcmFtZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElSTF9BQ1RJT05fVVNFX0xJTUlUX0FDVElPTiAtIHVzZSBsaW1pdEFjdGlvbgoqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgICAgICBpc1ZhbGlkOwogICAgR1RfVTMyICAgICAgICBlYnNMaW1pdDsKICAgIEdUX1UzMiAgICAgICAgY2JzTGltaXQ7CiAgICBHVF9VMzIgICAgICAgIGN0c0ludHY7CiAgICBHVF9QSVJMX0FDVElPTiAgICAgICAgYWN0aW9uTW9kZTsKfSBHVF9QSVJMX0NVU1RPTV9UU01fQ0ZHOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUElSTDJfVFNNX0RBVEEKICoKICogIERlc2NyaXB0aW9uOiBkYXRhIHN0cnVjdHVyZSBmb3IgUElSTDIgVFNNIEluZ3Jlc3MgUmF0ZSBMaW1pdC4KICoKICogIEZpZWxkczoKICogICAgICAgIGVic0xpbWl0ICAgICAgICAtIEV4Y2VzcyBCdXJzdCBTaXplIGxpbWl0ICgwIH4gMHhGRkZGKQogKiAgICAgICAgY2JzTGltaXQgICAgICAgIC0gQ29tbWl0dGVkIEJ1cnN0IFNpemUgbGltaXQgKDAgfiAweEZGRkYpCiAqICAgICAgICBjdHNJbnR2ICAgICAgICAgLSBDbGFzcyBUaW1lIFNsb3QgSW50ZXJ2YWwKICogICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBpbnRlcnZhbCBpcyA2Mi41dXMKICogICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBpbnRlcnZhbCBpcyAxMjV1cwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIGludGVydmFsIGlzIDI1MHVzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAzIC0gaW50ZXJ2YWwgaXMgMTAwMHVzCiAqICAgICAgICBhY3Rpb25Nb2RlICAgICAgICAtIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gd2hlbiB0aGVyZSBhcmUgbm90IGVub3VnaCB0b2tlbnMKICogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFjY2VwdCB0aGUgZW50aXJlIGluY29taW5nIGZyYW1lCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVJMX0FDVElPTl9BQ0NFUFQgLSBhY2NlcHQgdGhlIGZyYW1lCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVJMX0FDVElPTl9VU0VfTElNSVRfQUNUSU9OIC0gdXNlIGxpbWl0QWN0aW9uCiAqICAgICAgICAgbWdtdE5ybEVuICAgICAgICAgLSBleGNsdWRlIG1hbmFnZW1lbnQgZnJhbWUgZnJvbSBpbmdyZXNzIHJhdGUgbGltaXRpbmcgY2FsY3VsYXRpb24KICogICAgICAgIHByaU1hc2sgICAgICAgICAtIHByaW9yaXR5IGJpdCBtYXNrIHRoYXQgZWFjaCBiaXQgaW5kaWNhdGVzIG9uZSBvZiB0aGUgZm91cgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUgcHJpb3JpdGllcy4gU2V0dGluZyBlYWNoIG9uZSBvZiB0aGVzZSBiaXRzIGluZGljYXRlcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGlzIHBhcnRpY3VsYXIgcmF0ZSByZXNvdXJjZSBpcyBzbGF0ZWQgdG8gYWNjb3VudCBmb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nIGZyYW1lcyB3aXRoIHRoZSBlbmFibGVkIGJpdHMnIHByaW9yaXR5LgogKgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICAgICAgdHNtTW9kZTsKICAgIEdUX1UzMiAgICAgICAgZWJzTGltaXQ7CiAgICBHVF9VMzIgICAgICAgIGNic0xpbWl0OwogICAgR1RfVTMyICAgICAgICBjdHNJbnR2OwogICAgR1RfUElSTF9BQ1RJT04gICAgICAgIGFjdGlvbk1vZGU7CiAgICBHVF9CT09MICAgICAgICBtZ210TnJsRW47CiAgICBHVF9VMzIgICAgICAgIHByaU1hc2s7Cn0gR1RfUElSTDJfVFNNX1JFU09VUkNFOwoKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1BJUkwyX1RTTV9EQVRBCiAqCiAqICBEZXNjcmlwdGlvbjogZGF0YSBzdHJ1Y3R1cmUgZm9yIFBJUkwyIFRTTSBJbmdyZXNzIFJhdGUgTGltaXQuCiAqCiAqICBGaWVsZHM6CiAqICAgICAgICB0c21Nb2RlICAgICAgICAgICAgLSBlbmFibGUvZGlzYWJsZSBUU00gbW9kZS4gCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgaWdub3JlZCBpZiBkaWFibGUKICogICAgICAgIGluZ3Jlc3NSYXRlICAgICAgIC0gY29tbWl0ZWQgaW5ncmVzcyByYXRlIGluIGticHMuKG1pbiA2NCBmb3IgNjRrYnBzKQogKiAgICAgICAgY3VzdG9tU2V0dXAgICAgICAgLSBjdXN0b20gaW5ncmVzcyByYXRlIHBhcmFtZXRlciBzZXR1cC4gcGxlYXNlIHJlZmVyIHRvCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBHVF9QSVJMX0NVU1RPTV9UU01fQ0ZHIHN0cnVjdHVyZS4KICogICAgICAgIG1nbXROcmxFbiAgICAgICAgLSBleGNsdWRlIG1hbmFnZW1lbnQgZnJhbWUgZnJvbSBpbmdyZXNzIHJhdGUgbGltaXRpbmcgY2FsY3VsYXRpb24KICogICAgICAgIHByaU1hc2sgICAgICAgICAtIHByaW9yaXR5IGJpdCBtYXNrIHRoYXQgZWFjaCBiaXQgaW5kaWNhdGVzIG9uZSBvZiB0aGUgZm91cgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUgcHJpb3JpdGllcy4gU2V0dGluZyBlYWNoIG9uZSBvZiB0aGVzZSBiaXRzIGluZGljYXRlcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGlzIHBhcnRpY3VsYXIgcmF0ZSByZXNvdXJjZSBpcyBzbGF0ZWQgdG8gYWNjb3VudCBmb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nIGZyYW1lcyB3aXRoIHRoZSBlbmFibGVkIGJpdHMnIHByaW9yaXR5LgogKgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICAgICAgdHNtTW9kZTsKICAgIEdUX1UzMiAgICAgICAgaW5ncmVzc1JhdGU7CiAgICBHVF9QSVJMX0NVU1RPTV9UU01fQ0ZHIGN1c3RvbVNldHVwOwogICAgR1RfQk9PTCAgICAgICAgbWdtdE5ybEVuOwogICAgR1RfVTMyICAgICAgICBwcmlNYXNrOwp9IEdUX1BJUkwyX1RTTV9EQVRBOwoKCgojZGVmaW5lIE1BWF9QVFBfQ09OU0VDVVRJVkVfUkVBRCAgICA0CgoKLyoKICogVHlwZWRlZjogZW51bSBHVF9QVFBfT1BFUkFUSU9OCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBQVFAgKFByZWNpc2UgVGltZSBQcm90b2NvbCkgT3BlcmF0aW9uIHR5cGUKICoKICogRmllbGRzOgogKiAgICAgIFBUUF9XUklURV9EQVRBICAgICAgICAgICAgIC0gV3JpdGUgZGF0YSB0byB0aGUgUFRQIHJlZ2lzdGVyCiAqICAgICAgUFRQX1JFQURfREFUQSAgICAgICAgICAgIC0gUmVhZCBkYXRhIGZyb20gUFRQIHJlZ2lzdGVyCiAqICAgICAgUFRQX1JFQURfTVVMVElQTEVfREFUQSAgICAtIFJlYWQgbXVsdGlwbGUgZGF0YSBmcm9tIFBUUCByZWdpc3RlcgogKiAgICAgIFBUUF9SRUFEX1RJTUVTVEFNUF9EQVRBICAgIC0gUmVhZCB0aW1lc3RhbXAgZGF0YSBmcm9tIFBUUCByZWdpc3RlcgogKiAgICAgICAgICAgICAgICAgICAgdmFsaWQgYml0IHdpbGwgYmUgcmVzZXQgYWZ0ZXIgcmVhZAogKi8KdHlwZWRlZiBlbnVtCnsKICAgIFBUUF9XUklURV9EQVRBICAgICAgICAgICAgID0gMHgzLAogICAgUFRQX1JFQURfREFUQSAgICAgICAgICAgICAgPSAweDQsCiAgICBQVFBfUkVBRF9NVUxUSVBMRV9EQVRBICAgID0gMHg2LAogICAgUFRQX1JFQURfVElNRVNUQU1QX0RBVEEgICAgPSAweDgsCn0gR1RfUFRQX09QRVJBVElPTjsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX1BUUF9TUEVDCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBQVFAgKFByZWNpc2UgVGltZSBQcm90b2NvbCkgU1BFQyB0eXBlCiAqCiAqIEZpZWxkczoKICogICAgICBQVFBfSUVFRV8xNTg4ICAgICAgICAgLSBJRUVFIDE1ODgKICogICAgICBQVFBfSUVFRV84MDJfMUFTICAgIC0gSUVFRSA4MDIuMWFzCiAqLwp0eXBlZGVmIGVudW0KewogICAgUFRQX0lFRUVfMTU4OCAgICAgICAgPSAweDAsCiAgICBQVFBfSUVFRV84MDJfMUFTICAgID0gMHgxCn0gR1RfUFRQX1NQRUM7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QVFBfT1BfREFUQQogKgogKiAgRGVzY3JpcHRpb246IGRhdGEgcmVxdWlyZWQgYnkgUFRQIE9wZXJhdGlvbgogKgogKiAgRmllbGRzOgogKiAgICAgIHB0cFBvcnQgICAgICAgIC0gcGh5c2ljYWwgcG9ydCBvZiB0aGUgZGV2aWNlCiAqICAgICAgcHRwQWRkciAgICAgLSByZWdpc3RlciBhZGRyZXNzCiAqICAgICAgcHRwRGF0YSAgICAgLSBkYXRhIGZvciBwdHAgcmVnaXN0ZXIuCiAqICAgICAgcHRwTXVsdGlEYXRhLSB1c2VkIGZvciBtdWx0aXBsZSByZWFkIG9wZXJhdGlvbi4KICogICAgICBuRGF0YSAgICAgICAgIC0gbnVtYmVyIG9mIGRhdGEgdG8gYmUgcmVhZCBvbiBtdWx0aXBsZSByZWFkIG9wZXJhdGlvbi4KICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UzMiAgICBwdHBQb3J0OwogICAgR1RfVTMyICAgIHB0cEJsb2NrOwogICAgR1RfVTMyICAgIHB0cEFkZHI7CiAgICBHVF9VMzIgICAgcHRwRGF0YTsKICAgIEdUX1UzMiAgICBwdHBNdWx0aURhdGFbTUFYX1BUUF9DT05TRUNVVElWRV9SRUFEXTsKICAgIEdUX1UzMiAgICBuRGF0YTsKfSBHVF9QVFBfT1BfREFUQTsKCgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QVFBfR0xPQkFMX0NPTkZJRwogKgogKiAgRGVzY3JpcHRpb246IFBUUCBnbG9iYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAqCiAqICBGaWVsZHM6CiAqICAgICAgcHRwRVR5cGUgICAgLSBQVFAgRXRoZXIgVHlwZQogKiAgICAgIG1zZ0lkVFNFbiAgICAgLSBNZXNzYWdlIElEcyB0aGF0IG5lZWRzIHRpbWUgc3RhbXAKICogICAgICB0c0FyclB0ciAgICAgLSBUaW1lIHN0YW1wIGFycml2YWwgdGltZSBjb3VudGVyIHBvaW50ZXIgKGVpdGhlciBBcnIwVGltZSBvciBBcnIxVGltZSkKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UzMiAgICBwdHBFVHlwZTsKICAgIEdUX1UzMiAgICBtc2dJZFRTRW47CiAgICBHVF9VMzIgICAgdHNBcnJQdHI7Cn0gR1RfUFRQX0dMT0JBTF9DT05GSUc7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QVFBfUE9SVF9DT05GSUcKICoKICogIERlc2NyaXB0aW9uOiBQVFAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciBlYWNoIHBvcnQKICoKICogIEZpZWxkczoKICogICAgICB0cmFuc1NwZWMgICAgLSBUaGlzIGlzIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB2YXJpb3VzIHRpbWluZyBwcm90b2NvbHMuCiAqICAgICAgZGlzVFNwZWMgICAgIC0gRGlzYWJsZSBUcmFuc3BvcnQgc3BlY2lmaWMgY2hlY2sKICogICAgICBldEp1bXAgICAgICAgICAtIG9mZnNldCB0byBFdGhlciB0eXBlIHN0YXJ0IGFkZHJlc3MgaW4gYnl0ZXMKICogICAgICBpcEp1bXAgICAgICAgICAtIG9mZnNldCB0byBJUCBoZWFkZXIgc3RhcnQgYWRkcmVzcyBjb3VudGluZyBmcm9tIEV0aGVyIHR5cGUgb2Zmc2V0CiAqICAgICAgcHRwQXJySW50RW4gICAgLSBQVFAgcG9ydCBhcnJpdmFsIGludGVycnVwdCBlbmFibGUKICogICAgICBwdHBEZXBJbnRFbiAgICAtIFBUUCBwb3J0IGRlcGFydHVyZSBpbnRlcnJ1cHQgZW5hYmxlCiAqICAgICAgZGlzVFNPdmVyd3JpdGUgLSBkaXNhYmxlIHRpbWUgc3RhbXAgY291bnRlciBvdmVyd3JpdGluZyB1bnRpbCB0aGUgY29ycmVzcG9uZGluZwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXIgdmFsaWQgYml0IGlzIGNsZWFyZWQuCiAqICAgICAgYXJyVFNNb2RlICAgICAgLSBQVFAgYXJyaXZhbCBUUyBtb2RlLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfUFRQX1NQRUMgICAgdHJhbnNTcGVjOwogICAgR1RfQk9PTCAgICAgICAgZGlzVFNwZWM7CiAgICBHVF9VMzIgICAgICAgICBldEp1bXA7CiAgICBHVF9VMzIgICAgICAgICBpcEp1bXA7CiAgICBHVF9CT09MICAgICAgICBwdHBBcnJJbnRFbjsKICAgIEdUX0JPT0wgICAgICAgIHB0cERlcEludEVuOwogICAgR1RfQk9PTCAgICAgICAgZGlzVFNPdmVyd3JpdGU7CglHVF9VMzIgICAgICAgICBhcnJUU01vZGU7Cn0gR1RfUFRQX1BPUlRfQ09ORklHOwoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QVFBfQ09ORklHCiAqCiAqICBEZXNjcmlwdGlvbjogUFRQIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogKgogKiAgRmllbGRzOgogKiAgICAgIHB0cEVUeXBlICAgIC0gUFRQIEV0aGVyIFR5cGUKICogICAgICBtc2dJZFRTRW4gICAgIC0gTWVzc2FnZSBJRHMgdGhhdCBuZWVkcyB0aW1lIHN0YW1wCiAqICAgICAgdHNBcnJQdHIgICAgIC0gVGltZSBzdGFtcCBhcnJpdmFsIHRpbWUgY291bnRlciBwb2ludGVyIChlaXRoZXIgQXJyMFRpbWUgb3IgQXJyMVRpbWUpCiAqICAgICAgcHRwQXJySW50RW4gICAgLSBQVFAgcG9ydCBhcnJpdmFsIGludGVycnVwdCBlbmFibGUKICogICAgICBwdHBEZXBJbnRFbiAgICAtIFBUUCBwb3J0IGRlcGFydHVyZSBpbnRlcnJ1cHQgZW5hYmxlCiAqICAgICAgdHJhbnNTcGVjICAgIC0gVGhpcyBpcyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdmFyaW91cyB0aW1pbmcgcHJvdG9jb2xzLgogKiAgICAgIG1zZ0lkU3RhcnRCaXQgICAgIC0gTWVzc2FnZSBJRCBzdGFydGluZyBiaXQgaW4gdGhlIFBUUCBjb21tb24gaGVhZGVyCiAqICAgICAgZGlzVFNPdmVyd3JpdGUgICAgIC0gZGlzYWJsZSB0aW1lIHN0YW1wIGNvdW50ZXIgb3ZlcndyaXRpbmcgdW50aWwgdGhlIGNvcnJlc3BvbmRpbmcKICogICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyIHZhbGlkIGJpdCBpcyBjbGVhcmVkLgogKiAgICAgIHB0cFBvcnRDb25maWcgICAgICAtIFBUUCBwb3J0IGNvbmZpZ3VyYXRpb24gYXJyYXkuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMzIgICAgcHRwRVR5cGU7CiAgICBHVF9VMzIgICAgbXNnSWRUU0VuOwogICAgR1RfVTMyICAgIHRzQXJyUHRyOwoKICAgIEdUX1UzMiAgICBwdHBBcnJJbnRFbjsKICAgIEdUX1UzMiAgICBwdHBEZXBJbnRFbjsKICAgIEdUX1BUUF9TUEVDICAgIHRyYW5zU3BlYzsKICAgIEdUX1UzMiAgICBtc2dJZFN0YXJ0Qml0OwogICAgR1RfQk9PTCAgICBkaXNUU092ZXJ3cml0ZTsKCUdUX1BUUF9QT1JUX0NPTkZJRyAgICAgIHB0cFBvcnRDb25maWdbTUFYX1NXSVRDSF9QT1JUU107Cn0gR1RfUFRQX0NPTkZJRzsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX1BUUF9USU1FCiAqCiAqIERlc2NyaXB0aW9uOiBEZWZpbmVzIHRoZSBQVFAgVGltZSB0byBiZSByZWFkCiAqCiAqIEZpZWxkczoKICogICAgICBQVFBfV1JJVEVfREFUQSAgICAgICAgICAgICAtIFdyaXRlIGRhdGEgdG8gdGhlIFBUUCByZWdpc3RlcgogKiAgICAgIFBUUF9SRUFEX0RBVEEgICAgICAgICAgICAtIFJlYWQgZGF0YSBmcm9tIFBUUCByZWdpc3RlcgogKiAgICAgIFBUUF9SRUFEX01VTFRJUExFX0RBVEEgICAgLSBSZWFkIG11bHRpcGxlIGRhdGEgZnJvbSBQVFAgcmVnaXN0ZXIKICovCnR5cGVkZWYgZW51bQp7CiAgICBQVFBfQVJSMF9USU1FID0gMHgwLAogICAgUFRQX0FSUjFfVElNRSA9IDB4MSwKICAgIFBUUF9ERVBfVElNRSA9IDB4Mgp9IEdUX1BUUF9USU1FOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfUFRQX0lOVF9TVEFUVVMKICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIFBUUCBQb3J0IGludGVycnVwdCBzdGF0dXMgZm9yIHRpbWUgc3RhbXAKICoKICogRmllbGRzOgogKiAgICAgIFBUUF9JTlRfTk9STUFMICAgICAgICAtIE5vIGVycm9yIGNvbmRpdGlvbiBvY2N1cnJlZAogKiAgICAgIFBUUF9JTlRfT1ZFUldSSVRFICAgICAtIFBUUCBsb2dpYyBoYXMgdG8gcHJvY2VzcyBtb3JlIHRoYW4gb25lIFBUUCBmcmFtZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG5lZWRzIHRpbWUgc3RhbXBpbmcgYmVmb3JlIHRoZSBjdXJyZW50IHJlYWQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHRoZSBsYXRlc3Qgb25lIGlzIHNhdmVkLgogKiAgICAgIFBUUF9JTlRfRFJPUCAgICAgICAgICAtIFBUUCBsb2dpYyBoYXMgdG8gcHJvY2VzcyBtb3JlIHRoYW4gb25lIFBUUCBmcmFtZQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG5lZWRzIHRpbWUgc3RhbXBpbmcgYmVmb3JlIHRoZSBjdXJyZW50IHJlYWQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHRoZSBvbGRlc3Qgb25lIGlzIHNhdmVkLgogKgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIFBUUF9JTlRfTk9STUFMICAgICAgICAgPSAweDAsCiAgICBQVFBfSU5UX09WRVJXUklURSAgICAgPSAweDEsCiAgICBQVFBfSU5UX0RST1AgICAgICAgICA9IDB4Mgp9IEdUX1BUUF9JTlRfU1RBVFVTOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfUFRQX1RTX1NUQVRVUwogKgogKiAgRGVzY3JpcHRpb246IFBUUCBwb3J0IHN0YXR1cyBvZiB0aW1lIHN0YW1wCiAqCiAqICBGaWVsZHM6CiAqICAgICAgaXNWYWxpZCAgICAgICAgLSB0aW1lIHN0YW1wIGlzIHZhbGlkCiAqICAgICAgc3RhdHVzICAgICAgICAtIHRpbWUgc3RhbXAgZXJyb3Igc3RhdHVzCiAqICAgICAgdGltZVN0YW1wZWQgICAgLSB0aW1lIHN0YW1wIHZhbHVlIG9mIGEgUFRQIGZyYW1lIHRoYXQgbmVlZHMgdG8gYmUgdGltZSBzdGFtcGVkCiAqICAgICAgcHRwU2VxSWQgICAgLSBzZXF1ZW5jZSBJRCBvZiB0aGUgZnJhbWUgd2hvc2UgdGltZSBzdGFtcCBpbmZvcm1hdGlvbiBoYXMgYmVlbiBjYXB0dXJlZAogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICBpc1ZhbGlkOwogICAgR1RfVTMyICAgIHRpbWVTdGFtcGVkOwogICAgR1RfVTMyICAgIHB0cFNlcUlkOwogICAgR1RfUFRQX0lOVF9TVEFUVVMgICAgc3RhdHVzOwp9IEdUX1BUUF9UU19TVEFUVVM7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QVFBfUE9SVF9ESVNDQVJEX1NUQVRTCiAqCiAqICBEZXNjcmlwdGlvbjogUFRQIHBvcnQgZGlzY2FyZCBzdGF0aXN0aWNzLiBUaGUgY291bnRlciAoNCBiaXQgd2lkZSkgd3JhcHMgYXJvdW5kIGFmdGVyIDE1LiAKICoKICogIEZpZWxkczoKICogICAgICB0c0RlcERpc0N0ciAgICAtIFBUUCBkZXBhcnR1cmUgZnJhbWUgZGlzY2FyZCBjb3VudGVyIGZvciBQVFAgZnJhbWVzIHRoYXQgbmVlZCB0aW1lIHN0YW1waW5nLgogKiAgICAgIG50c0RlcERpc0N0ciAgICAtIFBUUCBkZXBhcnR1cmUgZnJhbWUgZGlzY2FyZCBjb3VudGVyIGZvciBQVFAgZnJhbWVzIHRoYXQgZG8gbm90IG5lZWQgdGltZSBzdGFtcGluZy4KICogICAgICB0c0FyckRpc0N0ciAgICAtIFBUUCBhcnJpdmFsIGZyYW1lIGRpc2NhcmQgY291bnRlciBmb3IgUFRQIGZyYW1lcyB0aGF0IG5lZWQgdGltZSBzdGFtcGluZy4KICogICAgICBudHNBcnJEaXNDdHIgICAgLSBQVFAgYXJyaXZhbCBmcmFtZSBkaXNjYXJkIGNvdW50ZXIgZm9yIFBUUCBmcmFtZXMgdGhhdCBkbyBub3QgbmVlZCB0aW1lIHN0YW1waW5nLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgIHRzRGVwRGlzQ3RyOwogICAgR1RfVTMyICAgIG50c0RlcERpc0N0cjsKICAgIEdUX1UzMiAgICB0c0FyckRpc0N0cjsKICAgIEdUX1UzMiAgICBudHNBcnJEaXNDdHI7Cn0gR1RfUFRQX1BPUlRfRElTQ0FSRF9TVEFUUzsKCi8qIEZyb20gQWdhdGUsIHRvIGFkZCBhcnJpdmFsIFRTIG1vZGUsIHRvIGluc2VydCBUUyBpbnRvIGZyYW1lICovCnR5cGVkZWYgZW51bQp7CiAgICBQVFBfQVJSX1RTX01PREVfRElBQkxFICA9IDAsICAgLyogUFRQIEFycml2YWwgbW9kZTogZGlzYWJsZSBUUyBtb2RlIG1vZGlmaWNhdGlvbiAqLwogICAgUFRQX0FSUl9UU19NT0RFX0ZSTV9FTkQgPSAxLCAgIC8qIFBUUCBBcnJpdmFsIG1vZGU6IFRTIGF0IGVuZCBvZiBmcmFtZSAqLwogICAgUFRQX0FSUl9UU19NT0RFX0xPQ181ICAgPSA0LCAgIC8qIFBUUCBBcnJpdmFsIG1vZGU6IFRTIGF0IG9mZnNldCA1IGluIGNvbW1vbiBoZWFkZXIgKi8KICAgIFBUUF9BUlJfVFNfTU9ERV9MT0NfMTcgID0gMTYsICAvKiBQVFAgQXJyaXZhbCBtb2RlOiBUUyBhdCBvZmZzZXQgMTcgaW4gY29tbW9uIGhlYWRlciAqLwogICAgUFRQX0FSUl9UU19NT0RFX0xPQ18zNSAgPSAzNCwgIC8qIFBUUCBBcnJpdmFsIG1vZGU6IFRTIGF0IG9mZnNldCAzNSBpbiBjb21tb24gaGVhZGVyICovCiAgICBQVFBfQVJSX1RTX01PREVfTE9DX2ZmICAgICAgICAgLyogUFRQIEFycml2YWwgbW9kZTogVFMgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUgKi8KfSBHVF9QVFBfQVJSX1RTX01PREU7CgoKCiNpZmRlZiBDT05GSUdfQVZCX0ZQR0EKCnR5cGVkZWYgZW51bQp7CiAgICBQVFBfQ0xPQ0tfU1JDX0FEX0RFVklDRSA9IDAsICAgIC8qIFBUUCBDbG9jayBzb3VyY2UgaXMgZnJvbSBBL0QgZGV2aWNlICovCiAgICBQVFBfQ0xPQ0tfU1JDX0ZQR0EgICAgICAgICAgICAgICAgLyogUFRQIENsb2NrIHNvdXJjZSBpcyBmcm9tIENlc2l1bSBGUEdBICovCn0gR1RfUFRQX0NMT0NLX1NSQzsKCnR5cGVkZWYgZW51bQp7CiAgICBQVFBfUDlfTU9ERV9HTUlJID0gMCwgICAgIC8qIFBvcnQgOSB1c2VzIEdNSUkgY29ubmVjdCB0byA4OEUxMTExICovCiAgICBQVFBfUDlfTU9ERV9NSUksICAgICAgICAvKiBQb3J0IDkgdXNlcyBNSUkgY29ubmVjdCB0byA4OEUxMTExICovCiAgICBQVFBfUDlfTU9ERV9NSUlfQ09OTkVDVE9SLCAgICAgICAgLyogUG9ydCA5IGNvbm5lY3QgdG8gTUlJIGNvbm5lY3RvciAqLwogICAgUFRQX1A5X01PREVfSlVNUEVSICAgICAgICAvKiBVc2UgSnVtcGVyIHNldHVwICovCn0gR1RfUFRQX1A5X01PREU7Cgp0eXBlZGVmIGVudW0KewogICAgR1RfUFRQX1NJR05fTkVHQVRJVkUgPSAwLCAgICAvKiBhcHBseSBNaW51cyBzaWduIHRvIHRoZSBEdXR5IEN5Y2xlICovCiAgICBHVF9QVFBfU0lHTl9QTFVTICAgICAgICAgICAgLyogYXBwbHkgUGx1cyBzaWduIHRvIHRoZSBEdXR5IEN5Y2xlICovCn0gR1RfUFRQX1NJR047Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9QVFBfU0lHTiAgICBhZGpTaWduOyAgICAvKiBkZXRlcm1pbmUgdGhlIHBsdXMvbWludXMgc2lnbiBvZiB0aGUgZHV0eSBjeWNsZSBhZGogKi8KICAgIEdUX1UzMiAgICBjeWNsZVN0ZXA7ICAgICAgICAvKiBudW1iZXIgb2Ygc3RlcHMgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIGluIGFkanVzdGluZyB0aGUgZHV0eSBjeWNsZSBoaWdoIHRpbWUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIDhLSHogY2xvY2sgY3ljbGUuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIHZhbHVlcyBhcmUgMCB+IDcgKi8KICAgIEdUX1UzMiAgICBjeWNsZUludGVydmFsOyAgICAvKiBkZWZpbmUgdGhlIGludGVydmFsIG9mIGNsb2NrIGN5Y2xlcyBmb3Igd2hpY2ggYSBkdXR5IGN5Y2xlIGFkaiB3aWxsIG9jY3VyICovCiAgICBHVF9VMzIgICAgY3ljbGVBZGp1c3Q7ICAgIC8qIGRlZmluZSB0aGUgbnVtYmVyIG9mIDhLSHogY2xvY2sgY3ljbGVzIGZvciB3aGljaCBkdXR5IGN5Y2xlIGFkaiB3aWxsIG9jY3VyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIGVhY2ggUFRQIGNsb2NrIGNseWNsZSBpbnRlcnZhbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgKGN5Y2xlQWRqdXN0IDw9IGN5Y2xlSW50ZXJ2YWwpIGZvciBwcm9wZXIgb3BlcmF0aW9uICovCn0gR1RfUFRQX0NMT0NLX0FESlVTVE1FTlQ7CgojZW5kaWYKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfVEFJX0VWRU5UX0NPTkZJRwogKgogKiAgRGVzY3JpcHRpb246IFRBSSBldmVudCBjYXB0dXJlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogKgogKiAgRmllbGRzOgogKiAgICAgIGV2ZW50T3ZlcndyaXRlICAgIC0gZXZlbnQgY2FwdHVyZSBvdmVyd3JpdGUKICogICAgICBldmVudEN0clN0YXJ0ICAgICAtIGV2ZW50IGNvdW50ZXIgc3RhcnQKICogICAgICBldmVudFBoYXNlICAgICAgICAtIGV2ZW50IHBoYXNlLCBXaGVuIDB4MSB0aGUgYWN0aXZlIHBoYXNlIG9mIHRoZSBQVFBfRVZSRVEgaW5wdXQgCiAqICAgICAgICBpcyBpbnZlcnRlZCB0byBiZSBhY3RpdmUgbG93LiBXaGVuIDB4MCB0aGUgYWN0aXZlIHBoYXNlIG9mIHRoZSBQVFBfRVZSRVEgaW5wdXQgCiAqICAgICAgICBpcyBub3JtYWwgYWN0aXZlaGlnaAogKiAgICAgIGludEVuICAgICAgICAgICAgIC0gZXZlbnQgY2FwdHVyZSBpbnRlcnJ1cHQgZW5hYmxlCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgIGV2ZW50T3ZlcndyaXRlOwogICAgR1RfQk9PTCAgICBldmVudEN0clN0YXJ0OwogICAgR1RfQk9PTCAgICBldmVudFBoYXNlOwogICAgR1RfQk9PTCAgICBpbnRFbjsKfSBHVF9UQUlfRVZFTlRfQ09ORklHOwoKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfVEFJX0VWRU5UX1NUQVRVUwogKgogKiAgRGVzY3JpcHRpb246IFRBSSBldmVudCBjYXB0dXJlIHN0YXR1cwogKgogKiAgRmllbGRzOgogKiAgICAgIGlzVmFsaWQgICAgICAgIC0gZXZlbnRUaW1lIGlzIHZhbGlkCiAqICAgICAgZXZlbnRUaW1lICAgICAtIFBUUCBnbG9iYWwgdGltZSB3aGVuIGV2ZW50IGlzIHJlZ2lzdGVyZWQuCiAqICAgICAgZXZlbnRDdHIgICAgLSBldmVudCBjYXB0dXJlIGNvdW50ZXIuIGluY3JlYW1lbnRlZCBvbmx5IGlmIGV2ZW50Q3RyU3RhcnQgaXMgc2V0LgogKiAgICAgIGV2ZW50RXJyICAgIC0gaXNWYWxpZCBpcyBhbHJlYWR5IHNldCB3aGVuIGEgbmV3IGV2ZW50IGlzIG9ic2VydmVkLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfQk9PTCAgICBpc1ZhbGlkOwogICAgR1RfVTMyICAgIGV2ZW50VGltZTsKICAgIEdUX1UzMiAgICBldmVudEN0cjsKICAgIEdUX0JPT0wgICAgZXZlbnRFcnI7Cn0gR1RfVEFJX0VWRU5UX1NUQVRVUzsKCgp0eXBlZGVmIGVudW0KewogICAgR1RfVEFJX1RSSUdfUEVSSU9ESUNfUFVSU0UgPSAwLCAgICAvKiBnZW5lcmF0ZSBwZXJpb2RpYyBwdXJzZSAqLwogICAgR1RfVEFJX1RSSUdfT05fR0lWRU5fVElNRSAgICAgICAgLyogZ2VuZXJhdGUgcHVyc2Ugd2hlbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRQIGdsb2JhbCB0aW1lIG1hdGNoZXMgd2l0aCBnaXZlbiB0aW1lICovCn0gR1RfVEFJX1RSSUdfTU9ERTsKCnR5cGVkZWYgZW51bQp7CiAgICBHVF9UQUlfTVVMVElfUFRQX1NZTkNfRElTQUJMRSA9IDAsICAvKiB0aGUgRXZlbnRSZXF1ZXN0IGFuZCBUcmlnZ2VyR2VuIGludGVyZmFjZXMgb3BlcmF0ZSBub3JtYWxseS4gKi8KICAgIEdUX1RBSV9NVUxUSV9QVFBfU1lOQ19FTkFCTEUgICAgICAgIC8qIHRoZSBsb2dpYyBkZXRlY3RzIGEgbG93IHRvIGhpZ2ggdHJhbnNpdGlvbiBvbiAKCQkJCQkJCQkJCXRoZSBFdmVudFJlcXVlc3QgKEdQSU8pIGFuZCB0cmFuc2ZlcnMgdGhlIHZhbHVlIAoJCQkJCQkJCQkJaW4gVHJpZ0dlbkFtdFszMTowXSAoVEFJIEdsb2JhbCBDb25maWcgMHgyLCAweDMpIGludG8gCgkJCQkJCQkJCQl0aGUgUFRQIEdsb2JhbCBUaW1lIHJlZ2lzdGVyWzMxOjBdLiBUaGUgRXZlbnRDYXBUaW1lWzMxOjBdCgkJCQkJCQkJCQkoVEFJIGdsb2JhbCBTdGF0dXMgMHhBLCAweEIpIGlzIGFsc28gdXBkYXRlZCBhdCB0aGF0IAoJCQkJCQkJCQkJaW5zdGFudC4gKi8KfSBHVF9UQUlfTVVMVElfUFRQX1NZTkNfTU9ERTsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1RBSV9DTE9DS19TRUxFQ1QKICoKICogIERlc2NyaXB0aW9uOiBUQUkgQ2xvY2sgc2VsZWN0CiAqCiAqICBGaWVsZHM6CiAqICAgICAgcHJpUmVjQ2xrU2VsICAgICAgLSBTeW5jaHJvbm91cyBFdGhlcm5ldCBQcmltYXJ5IFJlY292ZXJlZCBDbG9jayBTZWxlY3QuCiAqICAgICAgICBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgaW50ZXJuYWwgUEhZIG51bWJlciB3aG9zZSByZWNvdmVyZWQgY2xvY2sgd2lsbCBiZQogKiAgICAgICAgcHJlc2VudGVkIG9uIHRoZSBTRV9SQ0xLMCBwaW4uIFRoZSByZXNldCB2YWx1ZSBvZiAweDcgc2VsZWN0cyBubyBjbG9jayBhbmQKICogICAgICAgIHRoZSBwaW4gaXMgdHJpLXN0YXRlZC4KICogICAgICBzeW5jUmVjQ2xrU2VsICAgICAtIFN5bmNocm9ub3VzIEV0aGVybmV0IFNlY29uZGFyeSBSZWNvdmVyZWQgQ2xvY2sgU2VsZWN0LgogKiAgICAgIHB0cEV4dENsayAgICAgICAgIC0gUFRQIGV4dGVybmFsIENsb2NrIHNlbGVjdAogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTggICAgcHJpUmVjQ2xrU2VsOwogICAgR1RfVTggICAgc3luY1JlY0Nsa1NlbDsKICAgIEdUX0JPT0wgIHB0cEV4dENsazsKfSBHVF9UQUlfQ0xPQ0tfU0VMRUNUOwoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9UQUlfVFJJR0dFUl9DT05GSUcKICoKICogIERlc2NyaXB0aW9uOiBUQUkgdHJpZ2dlciBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAqCiAqICBGaWVsZHM6CiAqICAgICAgaW50RW4gICAgICAgICAtIHRyaWdnZXIgZ2VuZXJhdG9yIGludGVycnVwdCBlbmFibGUKICogICAgICB0cmlnUGhhc2UgICAgIC0gdHJpZ2dlciBwaGFzZSwgV2hlbiAweDEgdGhlIGFjdGl2ZSBwaGFzZSBvZiB0aGUgUFRQX1RSSUcgb3V0cHV0IAogKiAgICAgICAgaXMgaW52ZXJ0ZWQgdG8gYmUgYWN0aXZlIGxvdy4gV2hlbiAweDAgdGhlIGFjdGl2ZSBwaGFzZSBvZiB0aGUgUFRQX1RSSUcgb3V0cHV0IAogKiAgICAgICAgaXMgbm9ybWFsIGFjdGl2ZSBoaWdoLgogKiAgICAgIG1vZGUgICAgICAgIC0gdHJpZ2dlciBtb2RlLCBlaXRoZXIgR1RfVEFJX1RSSUdfUEVSSU9ESUNfUFVSU0Ugb3IgCiAqICAgICAgICAgICAgICAgICAgICAgIEdUX1RBSV9UUklHX09OX0dJVkVOX1RJTUUKICogICAgICB0cmlnR2VuQW10ICAgICAtIGlmIG1vZGUgaXMgR1RfVEFJX1RSSUdfUEVSSU9ESUNfUFVSU0UsCiAqICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdmFsdWUgaXMgdXNlZCBhcyBhIGNsb2NrIHBlcmlvZCBpbiBUU0Nsa1BlciBpbmNyZW1lbnRzCiAqICAgICAgICAgICAgICAgICAgICAgIElmIG1vZGUgaXMgR1RfVEFJX1RSSUdfT05fR0lWRU5fVElNRSwKICogICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGNvbXBhcmUgd2l0aCBQVFAgZ2xvYmFsIHRpbWUuCiAqICAgICAgcHVsc2VXaWR0aCAgICAgICAgLSBwdWxzZSB3aWR0aCBpbiB1bml0cyBvZiBUU0Nsa1Blci4KICogICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMSB+IDB4Ri4gSWYgaXQncyAwLCBubyBjaGFuZ2VzIG1hZGUuCiAqICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdmFsdWUgaXMgdmFsaWQgb25seSBpbiBHVF9UQUlfVFJJR19PTl9HSVZFTl9USU1FIG1vZGUuCiAqICAgICAgdHJpZ0Nsa0NvbXAgICAgLSB0cmlnZ2VyIG1vZGUgY2xvY2sgY29tcGVuc2F0aW9uIGFtb3VudCBpbiBwaWNvIHNlYy4KICogICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBpcyB2YWxpZCBvbmx5IGluIEdUX1RBSV9UUklHX1BFUklPRElDX1BVUlNFIG1vZGUuCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgIGludEVuOwogICAgR1RfQk9PTCAgICB0cmlnUGhhc2U7CiAgICBHVF9UQUlfVFJJR19NT0RFICAgICBtb2RlOwogICAgR1RfVTMyICAgIHRyaWdHZW5BbXQ7CiAgICBHVF9VMzIgICAgcHVsc2VXaWR0aDsKICAgIEdUX1UzMiAgICB0cmlnQ2xrQ29tcDsKfSBHVF9UQUlfVFJJR0dFUl9DT05GSUc7CgoKCi8qIEFWQiBmdW5jdGlvbnMgKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX0FWQl9ISV9GUFJJLCAgICAgICAgLyogQVZCIEhpIEZyYW1lIFByaW9yaXR5ICovCiAgICBHVF9BVkJfSElfUVBSSSwgICAgICAgIC8qIEFWQiBIaSBRdWV1ZSBQcmlvcml0eSAqLwogICAgR1RfQVZCX0xPX0ZQUkksICAgICAgICAvKiBBVkIgTG8gRnJhbWUgUHJpb3JpdHkgKi8KICAgIEdUX0FWQl9MT19RUFJJLCAgICAgICAgLyogQVZCIExvIFF1ZXVlIFByaW9yaXR5ICovCiAgICBHVF9MRUdBQ1lfSElfRlBSSSwgICAgLyogTGVnYWN5IEhpIEZyYW1lIFByaW9yaXR5ICovCiAgICBHVF9MRUdBQ1lfSElfUVBSSSwgICAgLyogTGVnYWN5IEhpIFF1ZXVlIFByaW9yaXR5ICovCiAgICBHVF9MRUdBQ1lfTE9fRlBSSSwgICAgLyogTGVnYWN5IExvIEZyYW1lIFByaW9yaXR5ICovCiAgICBHVF9MRUdBQ1lfTE9fUVBSSSAgICAvKiBMZWdhY3kgTG8gUXVldWUgUHJpb3JpdHkgKi8KfSBHVF9BVkJfUFJJX1RZUEU7CgoKdHlwZWRlZiBlbnVtCnsKICAgIEdUX0FWQl9MRUdBQ1lfTU9ERSwgICAgICAgICAgICAvKiBhbGwgZnJhbWVzIGVudGVyaW5nIHRoZSBwb3J0IGFyZSBjb25zaWRlcmVkIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kgKi8KICAgIEdUX0FWQl9TVEFOREFSRF9BVkJfTU9ERSwgICAgLyogYW55IHRhZ2dlZCBmcmFtZSB0aGF0IGVuZHMgdXAgd2l0aCBhbiBBVkIgZnJhbWUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5IGlzIGNvbnNpZGVyZWQgQVZCICovCiAgICBHVF9BVkJfRU5IQU5DRURfQVZCX01PREUsICAgIC8qIGFueSBmcmFtZSB0aGF0IGVuZHMgdXAgd2l0aCBhbiBBVkIgZnJhbWUgcHJpb3JpdHkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIERBIGlzIGNvbnRhaW5lZCBpbiB0aGUgQVRVIHdpdGggYW4gQVZCIEVudHJ5IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSBpcyBjb25zaWRlcmVkIEFWQiAqLwogICAgR1RfQVZCX1NFQ1VSRV9BVkJfTU9ERSAgICAgICAgLyogYW55IGZyYW1lIHRoYXQgZW5kcyB1cCB3aXRoIGFuIEFWQiBmcmFtZSBwcmlvcml0eSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgREEgaXMgY29udGFpbmVkIGluIHRoZSBBVFUgd2l0aCBhbiBBVkIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5IHN0YXRlIGFuZCB3aG9zZSBEUFYgaGFzIHRoaXMgc291cmNlIHBvcnQncyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IHNldCB0byBhIG9uZSBpcyBjb25zaWRlcmVkIEFWQi4gKi8KfSBHVF9BVkJfTU9ERTsKCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX0FWQl9GUkFNRV9QT0xJQ1kKICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIHBvbGljeSBvZiB0aGUgZnJhbWUKICoKICogRmllbGRzOgogKiAgICAgIEFWQl9GUkFNRV9QT0xJQ1lfTk9ORSAtIE5vcm1hbCBmcmFtZSBzd2l0Y2hpbmcKICogICAgICBBVkJfRlJBTUVfUE9MSUNZX01JUlJPUiAtIE1pcnJvcihjb3B5KSBmcmFtZSB0byB0aGUgTWlycm9yRGVzdCBwb3J0CiAqICAgICAgQVZCX0ZSQU1FX1BPTElDWV9UUkFQIC0gVHJhcChyZS1kaXJlY3QpIGZyYW1lIHRvIHRoZSBDUFVEZXN0IHBvcnQKICoKICovCnR5cGVkZWYgZW51bQp7CiAgICBBVkJfRlJBTUVfUE9MSUNZX05PTkUgPSAwLAogICAgQVZCX0ZSQU1FX1BPTElDWV9NSVJST1IsCiAgICBBVkJfRlJBTUVfUE9MSUNZX1RSQVAKfSBHVF9BVkJfRlJBTUVfUE9MSUNZOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfQVZCX0ZSQU1FX1RZUEUKICoKICogRGVzY3JpcHRpb246IAogKiAgICAgICAgRGVmaW5lcyB0aGUgQVZCIGZyYW1lIHR5cGUuCiAqICAgICAgICBBVkIgSGkgRnJhbWUgaXMgb25lIHRoYXQgREEgb2YgdGhlIGZyYW1lIGlzIGNvbnRhaW5lZCBpbiB0aGUgQVRVIHdpdGggYW4gCiAqICAgICAgICBFbnRyeSBTdGF0ZSB0aGF0IGluZGljYXRlcyBBVkIgd2l0aCBwcmlvcml0eSBvdmVycmlkZSB3aGVyZSB0aGUgb3ZlcnJpZGRlbiAKICogICAgICAgIHByaW9yaXR5IGVxdWFscyB0aGUgSGkgQVZCIGZyYW1lIHByaW9yaXR5KHJlZmVyIHRvIGdhdmJHZXRQcmlvcml0eSBBUEkpIGFuZCAKICogICAgICAgIHdoZW4gdGhlIHBvcnQncyBEQSBBdmJPdmVycmlkZSBpcyBlbmFibGVkLgogKiAgICAgICAgQVZCIExvIEZyYW1lIGlzIG9uZSB0aGF0IERBIG9mIHRoZSBmcmFtZSBpcyBjb250YWluZWQgaW4gdGhlIEFUVSB3aXRoIGFuIAogKiAgICAgICAgRW50cnkgU3RhdGUgdGhhdCBpbmRpY2F0ZXMgQVZCIHdpdGggcHJpb3JpdHkgb3ZlcnJpZGUgd2hlcmUgdGhlIG92ZXJyaWRkZW4gCiAqICAgICAgICBwcmlvcml0eSBlcXVhbHMgdGhlIExvIEFWQiBmcmFtZSBwcmlvcml0eShyZWZlciB0byBnYXZiR2V0UHJpb3JpdHkgQVBJKSBhbmQgCiAqICAgICAgICB3aGVuIHRoZSBwb3J0J3MgREEgQXZiT3ZlcnJpZGUgaXMgZW5hYmxlZC4KICoKICogRmllbGRzOgogKiAgICAgIEFWQl9ISV9GUkFNRSAgICAtIEFWQiBIaSBGcmFtZQogKiAgICAgIEFWQl9MT19GUkFNRSAgICAtIEFWQiBMbyBGcmFtZQogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEFWQl9ISV9GUkFNRSwKICAgIEFWQl9MT19GUkFNRQp9IEdUX0FWQl9GUkFNRV9UWVBFOwoKCi8qCiAqIFR5cGVkZWY6IGVudW0gR1RfVENBTV9PUEVSQVRJT04KICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIFRDQU0gKFRlcm5hcnkgQ29udGVudCBBZGRyZXNzYWJsZSBNZW1vcnkpIE9wZXJhdGlvbiB0eXBlCiAqCiAqIEZpZWxkczoKICogICBUQ0FNX0ZMVVNIX0FMTCAgICAgICAtIEZsdXNoIGFsbCBlbnRyaWVzCiAqICAgVENBTV9GTFVTSF9FTlRSWSAgICAgLSBGbHVzaCBvciBpbnZhbGlkYXRlIGEgc2luZ2xlIFRDQU0gZW50cnkKICogICBUQ0FNX0xPQURfRU5UUlkgICAgICAtIExvYWQgcW4gZW50cnkncyBwYWdlIC0gb3IgUHVyZ2UgYW4gZW50cnkKICogICBUQ0FNX0dFVF9ORVhUX0VOVFJZICAtIEdldCBOZXh0IChyZWFkIG5leHQgdmFsaWQgZW50cnkgLSBhbGwgcGFnZXMpCiAqICAgVENBTV9SRUFEX0VOVFJZICAgICAgLSBSZWFkIGFuIGVudHJ5J3MgcGFnZSAocGVyZm9ybSBhIGRpcmVjdCByZWFkIG9mIGFuIGVudHJ5KQogKi8KdHlwZWRlZiBlbnVtCnsKICAgIFRDQU1fRkxVU0hfQUxMICAgICAgID0gMHgxLAogICAgVENBTV9GTFVTSF9FTlRSWSAgICAgPSAweDIsCiAgICBUQ0FNX0xPQURfRU5UUlkgICAgICA9IDB4MywKICAgIFRDQU1fUFVSR0VfRU5UUlkgICAgID0gMHg2LAogICAgVENBTV9HRVRfTkVYVF9FTlRSWSAgPSAweDQsCiAgICBUQ0FNX1JFQURfRU5UUlkgICAgICA9IDB4NQp9IEdUX1RDQU1fT1BFUkFUSU9OOwoKdHlwZWRlZiBlbnVtCnsKICAgIEZSQU1FX1RZUEVfTk9STUFMICA9IDAsCiAgICBGUkFNRV9UWVBFX0RTQSAgICAgPSAxLAogICAgRlJBTUVfVFlQRV9QUk9WSURFID0gMiwKICAgIEZSQU1FX1RZUEVfUkVTID0gMywKfSBHVF9GUkFNRV9UWVBFOwoKLyogVGhlIFAzIHJlZ2lzdGVyIDMxIHdvcmsgYXMgZm9sbG93cyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgc2VxdWVuY2U6Cm8gMHgwMEZGID0gUmVzZXQgc3RhdGUsIG5vIGhpdHMgeWV0Cm8gMHgwMDAwID0gNDgtYnl0ZSBUQ0FNIGhpdCBvbiBFbnRyeSAweDAwCm8gMHgwMjAxID0gOTYtYnl0ZSBUQ0FNIGhpdCBvbiBFbnRyaWVzIDB4MDEgKGxvdykgYW5kIDB4MDIgKGhpZ2gpCm8gMHgwMDAzID0gNDgtYnl0ZSBUQ0FNIGhpdCBvbiBFbnRyeSAweDAzCm8gMHgwODA5ID0gOTYtYnl0ZSBUQ0FNIGhpdCBvbiBFbnRyaWVzIDB4MDkgKGxvdykgYW5kIDB4MDggKGhpZ2gpCm8gMHgwMDA5ID0gNDgtYnl0ZSBUQ0FNIGhpdCBvbiBFbnRyeSAweDA5IHdpdGggYSBUQ0FNIG1pc3Mgb24gdGhlIGhpZ2ggNDgtYnl0ZXMKbyAweDAwRkYgPSBNaXNzIG9uIDFzdCA0OCBieXRlIGxvb2t1cAoqLwp0eXBlZGVmIGVudW0KewogICAgVENBTV9ISVRfUkVTRVQgID0gMHhGRiwKICAgIFRDQU1fSElUXzQ4X0UwICA9IDB4MDAsCiAgICBUQ0FNX0hJVF85Nl9FMSAgPSAweDIwMSwKICAgIFRDQU1fSElUXzQ4X0UzICA9IDB4MDMsCiAgICBUQ0FNX0hJVF85Nl9FOSAgPSAweDgwOSwKICAgIFRDQU1fSElUXzQ4X01JU1MgID0gMHgwRkYsCn0gR1RfVENBTV9ISVRfU1RBVFVTOwoKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX1RDQU1fREFUQQogKgogKiAgRGVzY3JpcHRpb246IFRDQU0gS2V5IERhdGEgYW5kIEZyYW1lIE1hdGNoIERhdGEuIAogKiAgVGhlIGJ5dGVzIGFyZSBpbiB0aGUgbG93ZXIgOCBiaXRzIG9mIGVhY2ggMTYtYml0IHJlZ2lzdGVyLiBUaGUgdXBwZXIgOCBiaXRzIG9mCiAqICBlYWNoIHJlZ2lzdGVyIGFyZSB0aGUgTWFzayBiaXRzIGZvciB0aGUgbG93ZXIgOCBiaXRzIHdoZXJlIGJpdCAxNSBpcyB0aGUgbWFzayAKICogIGZvciBiaXQgNywgYml0IDE0IGlzIHRoZSBtYXNrIGZvciBiaXQgNiwgZXRjLiBUaGUgaW5kaXZpZHVhbCBwYWlycyBvZiBkYXRhIGJpdHMgCiAqICBhbmQgbWFzayBiaXRzIHdvcmsgdG9nZXRoZXIgYXMgZm9sbG93czoKICogICAgTWFzayBEYXRhIE1lYW5pbmcKICogICAgICAwIDAgRG9uknQgQ2FyZS4gVGhlIGRhdGEgYml0IGNhbiBiZSBhIG9uZSBvciBhIHplcm8gZm9yIGEgVENBTSBoaXQgdG8gb2NjdXIuCiAqICAgICAgMSAwIEhpdCBvbiAwLiBUaGUgZGF0YSBiaXQgbXVzdCBiZSBhIHplcm8gZm9yIGEgVENBTSBoaXQgdG8gb2NjdXIuCiAqICAgICAgMSAxIEhpdCBvbiAxLiBUaGUgZGF0YSBiaXQgbXVzdCBiZSBhIG9uZSBmb3IgYSBUQ0FNIGhpdCB0byBvY2N1ci4KICogICAgICAwIDEgTmV2ZXIgSGl0LiBVc2VkIHRvIHByZXZlbnQgYSBUQ0FNIGhpdCBmcm9tIG9jY3VycmluZyBmcm9tIHRoaXMgZW50cnkuCiAqICAgIFRoZSBOZXZlciBIaXQgdmFsdWUgaXMgdXNlZCB0byBGbHVzaCB0aGUgVENBTSBvciBQdXJnZSBhIFRDQU0gZW50cnkuIAogKiAgICBPbiBhIFRDQU0gRmx1c2ggb3IgUHVyZ2UsIHRoaXMgdmFsdWUgaXQgd3JpdHRlbiB0byB0aGUgMXN0IFRDQU0gYnl0ZSBvbmx5IAogKiAgICAob2Zmc2V0IDB4MDIgb24gVENBTSBwYWdlIDEpLiBPbiBhIFRDQU0gRmx1c2ggQWxsIG9yIG9uIGEgVENBTSBGbHVzaAogKiAgICBhbiBlbnRyeSwgYWxsIG90aGVyIFRDQU0gZGF0YSBhbmQgbWFzayBieXRlcyBhcmUgd3JpdHRlbiB0byBhIHZhbHVlIG9mIDB4MDAwMCAKICogICAgYW5kIHNvIGFyZSB0aGUgQWN0aW9uIGJ5dGVzLgogKgogKiAgRmllbGRzOgogKiAgICAgIGZyYW1lVHlwZSAgICAgIC0gRnJhbWUgVHlwZS4gVGhlc2UgYml0cyBhcmUgdXNlZCB0byBkZWZpbmUgdGhlIEZyYW1lIHR5cGUgb3IgbW9kZSAKICogICAgICBmcmFtZVR5cGVNYXNrICAtIEZyYW1lIFR5cGUgTWFzay4gIAogKiAgICAgIHNwdiAgICAgIC0gU291cmNlIFBvcnQgVmVjdG9yLiBUaGVzZSBiaXRzIGFyZSB1c2VkIHRvIGRlZmluZSB3aGljaCBzd2l0Y2ggcG9ydHMgCiAqICAgICAgICAgICAgICAgICBjYW4gdXNlIHRoaXMgVENBTSBlbnRyeS4gCiAqICAgICAgc3B2TWFzayAgLSBTb3VyY2UgUG9ydCBWZWN0b3IgTWFzay4gIAogKiAgICAgIHBwcmkgICAgICAtIFdoZW4gdGhlIFRDQU0gZW50cnmScyBGcmFtZU1vZGUgYml0cyBhcmUgUHJvdmlkZXIgVGFnZ2VkLCB0aGVzZSBiaXRzIGFyZQogKiAgICAgICAgICAgICAgICAgIFByb3ZpZGVyIFByaW9yaXR5IGJpdHMuIAogKiAgICAgIHBwcmlNYXNrICAtIFByb3ZpZGVyIFByaW9yaXR5IE1hc2suICAKICogICAgICBwdmlkICAgICAgLSBXaGVuIHRoZSBUQ0FNIGVudHJ5knMgRnJhbWVNb2RlIGJpdHMgYXJlIFByb3ZpZGVyIFRhZ2dlZCwgdGhlc2UgYml0cyBhcmUKICogICAgICAgICAgICAgICAgICBQcm92aWRlciBWSUQgYml0cy4uIAogKiAgICAgIHB2aWRNYXNrICAtIFByb3ZpZGVyIFZJRCBNYXNrLiAgCiAqICAgICAgZnJhbWVPY3RldCAgICAgIC0gRnJhbWUgT2N0ZXQgMS00OCBvciA0OS05Ni4gVGhlc2UgYXJlIHRoZSBtYXRjaCBkYXRhIGZvciBvY3RldCAKICogICAgICAgICAgICAgICAgICAgICAgICAxLTQ4IG9mIHRoZSBmcmFtZSBpZiB0aGUgVENBTSBlbnRyeSBpcyBmb3IgdGhlIGZpcnN0IDQ4IGJ5dGVzIAogKiAgICAgICAgICAgICAgICAgICAgICAgIG9mIGEgZnJhbWUuIElmIHRoaXMgVENBTSBlbnRyeSBpcyBmb3IgdGhlIHNlY29uZCA0OCBieXRlcyBvZiAKICogICAgICAgICAgICAgICAgICAgICAgICBhIGZyYW1lIHRoaXMgaXMgdGhlIG1hdGNoIGRhdGEgZm9yIG9jdGV0IDQ5IChvciA5NykuCiAqICAgICAgZnJhbWVPY3RldE1hc2sgIC0gRnJhbWUgT2N0ZXQgTWFzay4gIAogKiAgICAgIGNvbnRpbnUgIC0gQ29udGludWUgdGhpcyBUQ0FNIGVudHJ5LiBUaGlzIGJpdCBzaG91bGQgb25seSBiZSBhIDEgb24gVENBTSBlbnRyaWVzIAogKiAgICAgICAgICAgICAgICB0aGF0IGNvdmVyIHRoZSBmaXJzdCA0OCBieXRlcyBvZiBhIGZyYW1lIHRoYXQgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgdG8KICogICAgICAgICAgICAgICAgYWxzbyBtYXRjaCBieXRlcyA0OSB0byA5NiBvZiB0aGUgZnJhbWUgb3Igb24gYW55IHN1YnNlcXVlbnQgY29udGludWF0aW9uCiAqICAgICAgICAgICAgICAgIGJleW9uZCBieXRlIDk2IG9mIHRoZSBmcmFtZS4KICogICAgICBpbnRlcnJ1cHQgIC0gSW50ZXJydXB0IG9uIGEgVENBTSBoaXQuIFdoZW4gdGhpcyBiaXQgaXMgc2V0IHRvIGEgb25lIG9uIGEgVENBTSBlbnRyeSAKICogICAgICAgICAgICAgICAgICAgKHdoZXJlIHRoZSBDb250aW51ZSBiaXQgaXMgYSB6ZXJvKSwgYSBUQ0FNIGhpdCBpbnRlcnJ1cHQgd2lsbCBiZSAKICogICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW5ldmVyIGEgbWF0Y2ggb2NjdXJzIHRvIHRoaXMgZW50cnkuCiAqICAgICAgSW5jVGNhbUN0ciAgIC0gSW5jcmVtZW50IHRoZSBwb3J0knMgVENBTSBDb3VudGVyIG9uIGEgVENBTSBoaXQuCiAqICAgICAgdmlkT3ZlcnJpZGUgIC0gVklEIE92ZXJyaWRlIEVuYWJsZS4KICogICAgICB2aWREYXRhICAgIC0gVklEIE92ZXJyaWRlIERhdGEuCiAqICAgICAgbmV4dElkICAgICAtIE5leHQgSW5kZXggb3IgRmxvdyBJRC4KICogICAgICBxcHJpT3ZlcnJpZGUgIC0gUVBSSSBPdmVycmlkZSBFbmFibGUuCiAqICAgICAgcXByaURhdGEgICAgICAtIFFQUkkgT3ZlcnJpZGUgRGF0YS4KICogICAgICBmcHJpT3ZlcnJpZGUgIC0gRlBSSSBPdmVycmlkZSBFbmFibGUuCiAqICAgICAgZnByaURhdGEgICAgICAtIEZQUkkgT3ZlcnJpZGUgRGF0YS4KICogICAgICBxcHJpQXZiT3ZlcnJpZGUgIC0gUVBSSV9BVkIgT3ZlcnJpZGUgRW5hYmxlLgogKiAgICAgIHFwcmlBdmJEYXRhICAgICAgLSBRUFJJX0FWQiBPdmVycmlkZSBEYXRhLgogKiAgICAgIGRwdk92ZXJyaWRlICAtIERQViBPdmVycmlkZSBFbmFibGUuCiAqICAgICAgZHB2RGF0YSAgICAgIC0gRFBWIE92ZXJyaWRlIERhdGEuCiAqICAgICAgZmFjdGlvbk92ZXJyaWRlICAtIEZyYW1lIEFjdGlvbiBPdmVycmlkZSBFbmFibGUuCiAqICAgICAgZmFjdGlvbkRhdGEgICAgICAtIEZyYW1lIEFjdGlvbiBPdmVycmlkZSBEYXRhLgogKiAgICAgIGxkQmFsYW5jZU92ZXJyaWRlICAtIExvYWQgQmFsYW5jZSBPdmVycmlkZSBFbmFibGUuCiAqICAgICAgbGRCYWxhbmNlRGF0YSAgICAgIC0gTG9hZCBCYWxhbmNlIE92ZXJyaWRlIERhdGEuCiAqICAgICAgZGVidWdQb3J0ICAgIC0gRGVidWcgUG9ydCBOdW1iZXIuCiAqICAgICAgaGlnaEhpdCAgICAgIC0gVENBTSBFbnRyeSBmb3IgSGlnaCA0OC1ieXRlIEhpdC4uCiAqICAgICAgbG93SGl0ICAgICAgIC0gVENBTSBFbnRyeSBmb3IgSGlnaCA0OC1ieXRlIEhpdC4uCiovCgoKdHlwZWRlZiB1bmlvbgovKnR5cGVkZWYgc3RydWN0ICovCnsKCUdUX1U4ICBmcmFtZVsyNDhdOwoJc3RydWN0IF9QQVJBIHsKICAgIEdUX1U4ICAgICAgICBmcmFtZVR5cGU7CiAgICBHVF9VOCAgICAgICAgZnJhbWVUeXBlTWFzazsKICAgIEdUX1U4ICAgICAgICBzcHY7CiAgICBHVF9VOCAgICAgICAgc3B2TWFzazsKICAgIEdUX1U4ICAgICAgICBwcHJpOwogICAgR1RfVTggICAgICAgIHBwcmlNYXNrOwogICAgR1RfVTE2ICAgICAgIHB2aWQ7CiAgICBHVF9VMTYgICAgICAgcHZpZE1hc2s7CiAgICBHVF9VOCAgICAgICAgZnJhbWVPY3RldFs0OF07CiAgICBHVF9VOCAgICAgICAgZnJhbWVPY3RldE1hc2tbNDhdOwogICAgR1RfVTggICAgICAgIGNvbnRpbnU7CiAgICBHVF9VOCAgICAgICAgaW50ZXJydXB0OwogICAgR1RfVTggICAgICAgIEluY1RjYW1DdHI7CiAgICBHVF9VOCAgICAgICAgdmlkT3ZlcnJpZGU7CiAgICBHVF9VMTYgICAgICAgdmlkRGF0YTsKICAgIEdUX1U4ICAgICAgICBuZXh0SWQ7CiAgICBHVF9VOCAgICAgICAgcXByaU92ZXJyaWRlOwogICAgR1RfVTggICAgICAgIHFwcmlEYXRhOwogICAgR1RfVTggICAgICAgIGZwcmlPdmVycmlkZTsKICAgIEdUX1U4ICAgICAgICBmcHJpRGF0YTsKICAgIEdUX1U4ICAgICAgICBxcHJpQXZiT3ZlcnJpZGU7CiAgICBHVF9VOCAgICAgICAgcXByaUF2YkRhdGE7CiAgICBHVF9VOCAgICAgICAgZHB2T3ZlcnJpZGU7CiAgICBHVF9VOCAgICAgICAgZHB2RGF0YTsKICAgIEdUX1U4ICAgICAgICBmYWN0aW9uT3ZlcnJpZGU7CiAgICBHVF9VMTYgICAgICAgZmFjdGlvbkRhdGE7CiAgICBHVF9VOCAgICAgICAgbGRCYWxhbmNlT3ZlcnJpZGU7CiAgICBHVF9VOCAgICAgICAgbGRCYWxhbmNlRGF0YTsKICAgIEdUX1U4ICAgICAgICBkZWJ1Z1BvcnQ7CiAgICBHVF9VOCAgICAgICAgaGlnaEhpdDsKICAgIEdUX1U4ICAgICAgICBsb3dIaXQ7Cgl9ICBwYXJhRnJtOwp9IEdUX1RDQU1fREFUQTsKCi8qCiAqICB0eXBlZGVmOiBzdHJ1Y3QgR1RfVENBTV9PUF9EQVRBCiAqCiAqICBEZXNjcmlwdGlvbjogZGF0YSByZXF1aXJlZCBieSBUQ0FNIChUZXJuYXJ5IENvbnRlbnQgQWRkcmVzc2FibGUgTWVtb3J5KSBPcGVyYXRpb24KICoKICogIEZpZWxkczoKICogICAgICB0Y2FtUGFnZSAtIHBhZ2UgIG9mIFRDQU0KICogICAgICB0Y2FtRW50cnkgLSBwb2ludGVyIHRvIHRoZSBkZXNpcmVkIGVudHJ5IG9mIFRDQU0KICogICAgICB0Y2FtRGF0YSAtIFRDQU0gZGF0YSBmb3IgdGhlIGVudHJ5IHBvaW50ZWQgYnkgdGNhbUVudHJ5CiAqLwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgIHRjYW1QYWdlOwogICAgR1RfVTMyICAgIHRjYW1FbnRyeTsKICAgIEdUX1RDQU1fREFUQSAgICAqdGNhbURhdGFQOyAKfSBHVF9UQ0FNX09QX0RBVEE7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9FVkVOVF9UWVBFCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgYXZhaWxhYmxlIGhhcmR3YXJlIGRyaXZlbiBldmVudHMuCiAqCiAqIEVudW1lcmF0aW9uczoKICogICBHVF9BVkJfSU5UICAgIC0gQVZCIEludGVycnVwdCBFbmFibGUKICogICBHVF9ERVZJQ0VfSU5UIC0gRGV2aWNlIEludGVycnVwdCAoR1RfREVWSUNFX0lOVF9UWVBFKSBFbmFibGUKICogICBHVF9TVEFUU19ET05FIC0gU3RhdGlzdGljcyBPcGVyYXRpb24gRG9uZSBpbnRlcnJydXB0IEVuYWJsZSAKICogICBHVF9WVFVfUFJPQiAtIFZMQU4gUHJvYmxlbS9WaW9sYXRpb24gSW50ZXJydXB0IEVuYWJsZQogKiAgIEdUX1ZUVV9ET05FIC0gVkFMTiBUYWJsZSBPcGVyYXRpb24gRG9uZSBJbnRlcnJ1cHQgRW5hYmxlCiAqICAgR1RfQVRVX1BST0IgLSBBVFUgUHJvYmxlbS9WaW9sYXRpb24gSW50ZXJydXB0IEVuYWJsZSwgZm9yIEdpZ2FiaXQgU3dpdGNoCiAqICAgR1RfQVRVX0ZVTEwgLSBBVFUgZnVsbCBpbnRlcnJ1cHQgZW5hYmxlLCBmb3IgRmFzdCBFdGhlcm5ldCBTd2l0Y2gKICogICBHVF9BVFVfRE9ORSAtIEFUVSBEb25lIGludGVycnVwdCBlbmFibGUuCiAqICAgR1RfUEhZX0lOVCAgLSBQSFkgaW50ZXJydXB0IGVuYWJsZSwgZm9yIEZhc3QgRXRoZXJuZXQgU3dpdGNoCiAqICAgR1RfRUVfSU5UICAgLSBFRVBST00gRG9uZSBpbnRlcnJ1cHQgZW5hYmxlLgogKi8KI2RlZmluZSBHVF9BVkJfSU5UICAgICAgICAgICAgICAgMHgxMDAKI2RlZmluZSBHVF9ERVZJQ0VfSU5UICAgICAgICAgICAweDgwCiNkZWZpbmUgR1RfU1RBVFNfRE9ORSAgICAgICAgICAgMHg0MAojZGVmaW5lIEdUX1ZUVV9QUk9CICAgICAgICAgICAgIDB4MjAKI2RlZmluZSBHVF9WVFVfRE9ORSAgICAgICAgICAgICAweDEwCiNkZWZpbmUgR1RfQVRVX1BST0IgICAgICAgICAweDgKI2RlZmluZSBHVF9BVFVfRlVMTCAgICAgICAgIDB4OAojZGVmaW5lIEdUX0FUVV9ET05FICAgICAgICAgICAgMHg0CiNkZWZpbmUgR1RfUEhZX0lOVEVSUlVQVCAgICAweDIgICAgICAgIC8qIERldmljZSBtYXkgbm90IHN1cHBvcnQgUEhZIEludC4gUGxlYXNlIHJlZmVyIHRvIGRhdGFzaGVldC4gKi8KI2RlZmluZSBHVF9FRV9JTlRFUlJVUFQgICAgICAgIDB4MQoKI2RlZmluZSBHVF9JTlRfTUFTSyAgICAgICAgICAgIFwKICAgICAgICAoR1RfQVZCX0lOVCB8IEdUX0RFVklDRV9JTlQgfCBHVF9TVEFUU19ET05FIHwgR1RfVlRVX1BST0IgfCBHVF9WVFVfRE9ORSB8IEdUX0FUVV9GVUxMIHwgICAgIFwKICAgICAgICBHVF9BVFVfRE9ORSB8IEdUX1BIWV9JTlRFUlJVUFQgfCBHVF9FRV9JTlRFUlJVUFQpCiNkZWZpbmUgR1RfTk9fSU5URVJOQUxfUEhZX0lOVF9NQVNLICAgICAgICBcCiAgICAgICAgKEdUX0FWQl9JTlQgfCBHVF9ERVZJQ0VfSU5UIHwgR1RfU1RBVFNfRE9ORSB8IEdUX1ZUVV9QUk9CIHwgR1RfVlRVX0RPTkUgfCBHVF9BVFVfUFJPQiB8ICAgICBcCiAgICAgICAgR1RfQVRVX0RPTkUgfCBHVF9FRV9JTlRFUlJVUFQpCgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9ERVZfRVZFTlQKICoKICogIERlc2NyaXB0aW9uOiBEZXZpY2UgaW50ZXJydXB0IHN0YXR1cwogKgogKiAgRmllbGRzOgogKiAgICAgIGV2ZW50ICAgICAtIERldmljZSBJbnRlcnJ1cHRzIHRvIGJlIGVuYWJsZWQKICogICAgICAgICAgICAgICAgICAgIEdUX0RFVl9JTlRfV0FUQ0hET0csIEdUX0RFVl9JTlRfSkFNTElNSVQsCiAqICAgICAgICAgICAgICAgICAgICBHVF9ERVZfSU5UX0RVUExFWF9NSVNNQVRDSCwgYW5kL29yIEdUX0RFVl9JTlRfU0VSREVTX0xJTksKICogICAgICBwb3J0TGlzdCAgLSBTRVJERVMgcG9ydCBsaXN0IHdoZXJlIEdUX0RFVl9JTlRfU0VSREVTX0xJTksgaW50ZXJydXB0IG5lZWRzCiAqICAgICAgICAgICAgICAgICAgICB0byBiZSBhc3NlcnRlZC4gSXQncyBpbiB2ZWN0b3IgZm9ybWF0LCBCaXQgMTAgaXMgZm9yIHBvcnQgMTAsIAogKiAgICAgICAgICAgICAgICAgICAgQml0IDkgaXMgZm9yIHBvcnQgOSwgZXRjLgogKiAgICAgICAgICAgICAgICAgICAgdmFsaWQgb25seSBpZiBHVF9ERVZfSU5UX1NFUkRFU19MSU5LIGJpdCBpcyBzZXQuCiAqICAgICAgcGh5TGlzdCAgIC0gUGh5IGxpc3Qgd2hlcmUgR1RfREVWX0lOVF9QSFkgaW50ZXJydXB0IG5lZWRzIHRvIGJlIGFzc2VydGVkLgogKiAgICAgICAgICAgICAgICAgICAgSXQncyBpbiB2ZWN0b3IgZm9ybWF0LCBCaXQgMCBpcyBmb3IgcG9ydCAwLCAKICogICAgICAgICAgICAgICAgICAgIEJpdCAxIGlzIGZvciBwb3J0IDEsIGV0Yy4KICogICAgICAgICAgICAgICAgICAgIHZhbGlkIG9ubHkgaWYgR1RfREVWX0lOVF9QSFkgYml0IGlzIHNldC4KICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UzMiAgICAgICAgZXZlbnQ7CiAgICBHVF9VMzIgICAgICAgIHBvcnRMaXN0OwogICAgR1RfVTMyICAgICAgICBwaHlMaXN0Owp9IEdUX0RFVl9FVkVOVDsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX0RFVl9JTlRfU1RBVFVTCiAqCiAqICBEZXNjcmlwdGlvbjogRGV2aWNlIGludGVycnVwdCBzdGF0dXMKICoKICogIEZpZWxkczoKICogICAgICBpbnRDYXVzZSAgLSBEZXZpY2UgSW50ZXJydXB0IENhdXNlCiAqICAgICAgICAgICAgICAgICAgICBHVF9ERVZfSU5UX1dBVENIRE9HLCBHVF9ERVZfSU5UX0pBTUxJTUlULAogKiAgICAgICAgICAgICAgICAgICAgR1RfREVWX0lOVF9EVVBMRVhfTUlTTUFUQ0gsIGFuZC9vciBHVF9ERVZfSU5UX1NFUkRFU19MSU5LCiAqICAgICAgICBwb3J0ICAgICAgLSBsb2dpY2FsIHBvcnQgd2hlcmUgR1RfREVWX0lOVF9EVVBMRVhfTUlTTUFUQ0ggb2NjdXJyZWQuCiAqICAgICAgICAgICAgICAgICAgICB2YWxpZCBvbmx5IGlmIEdUX0RFVl9JTlRfRFVQTEVYX01JU01BVENIIGlzIHNldC4KICogICAgICBsaW5rSW50ICAgLSBTRVJERVMgcG9ydCBsaXN0IHdoZXJlIEdUX0RFVl9JTlRfU0VSREVTX0xJTksgaW50ZXJydXB0IGlzCiAqICAgICAgICAgICAgICAgICAgICBhc3NlcnRlZC4gSXQncyBpbiB2ZWN0b3IgZm9ybWF0LCBCaXQgMTAgaXMgZm9yIHBvcnQgMTAsIAogKiAgICAgICAgICAgICAgICAgICAgQml0IDkgaXMgZm9yIHBvcnQgOSwgZXRjLgogKiAgICAgICAgICAgICAgICAgICAgdmFsaWQgb25seSBpZiBHVF9ERVZfSU5UX1NFUkRFU19MSU5LIGJpdCBpcyBzZXQuCiAqICAgICAgICAgICAgICAgICAgICBUaGVzZSBiaXRzIGFyZSBvbmx5IHZhbGlkIG9mIHRoZSBwb3J0IHRoYXQgaXMgaW4gMTAwMEJhc2UtWCBtb2RlLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTMyICAgICAgICBkZXZJbnRDYXVzZTsKICAgIEdUX0xQT1JUICAgIHBvcnQ7CiAgICBHVF9VMzIgICAgICAgIGxpbmtJbnQ7CiAgICBHVF9VMzIgICAgICAgIHBoeUludDsKfSBHVF9ERVZfSU5UX1NUQVRVUzsKCgovKgoqIEdUX0RFVklDRV9JTlQKKgoqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBEZXZpY2UgaW50ZXJydXB0CiogICAgR1RfREVWX0lOVF9XQVRDSERPRyAgICAgICAgLSBXYXRjaERvZyBldmVudCBpbnRlcnJ1cHQgKFdhdGNoRG9nIGV2ZW50IGNhbiBiZQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZCB3aXRoIGd3ZFNldEV2ZW50IEFQSSkKKiAgICBHVF9ERVZfSU5UX0pBTUxJTUlUICAgICAgICAtIGFueSBvZiB0aGUgcG9ydHMgZGV0ZWN0IGFuIEluZ3Jlc3MgSmFtIExpbWl0IHZpb2xhdGlvbgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwcnRTZXRQYXVzZUxpbWl0SW4gQVBJKQoqICAgIEdUX0RFVl9JTlRfRFVQTEVYX01JU01BVENIICAgIC0gYW55IG9mIHRoZSBwb3J0cyBkZXRlY3QgYSBkdXBsZXggbWlzbWF0Y2ggCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiwgdGhlIGxvY2FsIHBvcnQgaXMgaW4gaGFsZiBkdXBsZXggbW9kZSB3aGlsZSAKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW5rIHBhcnRuZXIgaXMgaW4gZnVsbCBkdXBsZXggbW9kZSkKKiAgICBHVF9ERVZfSU5UX1NFUkRFU19MSU5LICAgIC0gU0VSREVTIGxpbmsgY2hhZ2UgaW50ZXJydXB0LgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW4gaW50ZXJydXB0IG9jY3VycyB3aGVuIGEgU0VSREVTIHBvcnQgY2hhbmdlcyBsaW5rIAoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIChsaW5rIHVwIG9yIGxpbmsgZG93bikKKi8KCiNkZWZpbmUgR1RfREVWX0lOVF9XQVRDSERPRyAgICAgICAgICAgIDB4OAojZGVmaW5lIEdUX0RFVl9JTlRfSkFNTElNSVQgICAgICAgICAgICAweDQKI2RlZmluZSBHVF9ERVZfSU5UX0RVUExFWF9NSVNNQVRDSCAgICAweDIKI2RlZmluZSBHVF9ERVZfSU5UX1NFUkRFU19MSU5LICAgICAgICAweDEKI2RlZmluZSBHVF9ERVZfSU5UX1dBS0VfRVZFTlQgICAgICAgICAweDEKI2RlZmluZSBHVF9ERVZfSU5UX1BIWSAgICAgICAgICAgICAgICAweDEwCgovKgoqIEdUX1dBVENIRE9HX0VWRU5UCioKKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgV2F0Y2hEb2cgZXZlbnQKKiAgICAgICAgR1RfV0RfUUMgIC0gUXVldWUgQ29udHJvbGxlciBXYXRjaCBEb2cgZW5hYmxlLgoqICAgICAgICAgICAgICAgICAgICBXaGVuIGVuYWJsZWQsIHRoZSBRQydzIHdhdGNoIGRvZyBjaXJjdWl0IGNoZWNrcyBmb3IgbGluawoqICAgICAgICAgICAgICAgICAgICBsaXN0IGVycm9ycyBhbmQgYW55IGVycm9ycyBmb3VuZCBpbiB0aGUgUUMuCiogICAgICAgIEdUX1dEX0VHUkVTUyAtIEVncmVzcyBXYXRjaCBEb2cgZW5hYmxlLgoqICAgICAgICAgICAgICAgICAgICBXaGVuIGVuYWJsZWQsIGVhY2ggcG9ydCdzIGVncmVzcyBjaXJjdWl0IGNoZWNrcyBmb3IgcHJvYmxlbXMKKiAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiB0aGUgcG9ydCBhbmQgdGhlIFF1ZXVlIENvbnRyb2xsZXIuCiogICAgICAgIEdUX1dEX0ZPUkNFIC0gRm9yY2UgYSBXYXRjaCBEb2cgZXZlbnQuCiovCgojZGVmaW5lIEdUX1dEX1FDICAgICAgICAweDEKI2RlZmluZSBHVF9XRF9FR1JFU1MgICAgMHgyCiNkZWZpbmUgR1RfV0RfRk9SQ0UgICAgICAgIDB4NAoKCi8qCiogdHlwZWRlZjogc3RydWN0IEdUX1dEX0VWRU5UX0hJU1RPUlkKKgoqIERlc2NyaXB0aW9uOiBXYXRjaERvZyBFdmVudCBIaXN0b3J5IChjbGVhcmVkIG9ubHkgYnkgYSBoYXJkd2FyZSByZXNldCkKKiAgICAgICAgd2RFdmVudCAgIC0gV2hlbiBpdCdzIHNldCB0byBHVF9UUlVFLCBzb21lIGVuYWJsZWQgV2F0Y2ggRG9nIGV2ZW50IG9jY3VycmVkLgoqICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGV2ZW50cyBhcmUgcG9zc2libGU6CiogICAgICAgICAgICAgICAgICAgICAgICBRQyBXYXRjaERvZyBFdmVudCAoR1RfV0RfUUMpCiogICAgICAgICAgICAgICAgICAgICAgICBFZ3Jlc3MgV2F0Y2hEb2cgRXZlbnQgKEdUX1dEX0VHUkVTUykKKiAgICAgICAgICAgICAgICAgICAgICAgIEZvcmNlZCBXYXRjaERvZyBFdmVudCAoR1RfV0RfRk9SQ0UpCiogICAgICAgIGVncmVzc0V2ZW50LUlmIGFueSBwb3J0J3MgZWdyZXNzIGxvZ2ljIGRldGVjdHMgYW4gZWdyZXNzIHdhdGNoIGRvZyBpc3N1ZSwKKiAgICAgICAgICAgICAgICAgICAgdGhpcyBmaWVsZCBpcyBzZXQgdG8gR1RfVFJVRSwgcmVnYXJkbGVzcyBvZiB0aGUgZW5hYmxpbmcgR1RfV0RfRUdSRVNTCiogICAgICAgICAgICAgICAgICAgIGV2ZW50LgoqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgIHdkRXZlbnQ7CiAgICBHVF9CT09MIGVncmVzc0V2ZW50Owp9IEdUX1dEX0VWRU5UX0hJU1RPUlk7CgoKLyoKKiB0eXBlZGVmOiBlbnVtIEdUX1BIWV9JTlQKKgoqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBQSFkgaW50ZXJydXB0CiovCgojZGVmaW5lIEdUX1NQRUVEX0NIQU5HRUQgICAgICAgICAweDQwMDAKI2RlZmluZSBHVF9EVVBMRVhfQ0hBTkdFRCAgICAgICAgMHgyMDAwCiNkZWZpbmUgR1RfUEFHRV9SRUNFSVZFRCAgICAgICAgMHgxMDAwCiNkZWZpbmUgR1RfQVVUT19ORUdfQ09NUExFVEVEICAgIDB4ODAwCiNkZWZpbmUgR1RfTElOS19TVEFUVVNfQ0hBTkdFRCAgICAweDQwMAojZGVmaW5lIEdUX1NZTUJPTF9FUlJPUiAgICAgICAgICAgIDB4MjAwCiNkZWZpbmUgR1RfRkFMU0VfQ0FSUklFUiAgICAgICAgMHgxMDAKI2RlZmluZSBHVF9GSUZPX0ZMT1cgICAgICAgICAgICAweDgwCiNkZWZpbmUgR1RfQ1JPU1NPVkVSX0NIQU5HRUQgICAgMHg0MAojZGVmaW5lIEdUX1BPTEFSSVRZX0NIQU5HRUQgICAgICAgIDB4MgojZGVmaW5lIEdUX0pBQkJFUiAgICAgICAgICAgICAgICAweDEKCiNkZWZpbmUgR1RfQVVUT19ORUdfRVJST1IgICAgICAgIDB4ODAwMAojZGVmaW5lIEdUX0RPV05TSElGVF9ERVRFQ1QgICAgICAgIDB4MjAKI2RlZmluZSBHVF9FTkVSR1lfREVURUNUICAgICAgICAweDEwCgovKgoqIHR5cGVkZWY6IGVudW0gR1RfUEhZX0FVVE9fTU9ERQoqCiogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIEF1dG9uZWdvdGlhdGlvbiBtb2RlLgoqICAgIEF1dG8gZm9yIGJvdGggc3BlZWQgYW5kIGR1cGxleC4KKiAgICBBdXRvIGZvciBzcGVlZCBvbmx5IGFuZCBGdWxsIGR1cGxleC4KKiAgICBBdXRvIGZvciBzcGVlZCBvbmx5IGFuZCBIYWxmIGR1cGxleC4gKDEwMDBNYnBzIGlzIG5vdCBzdXBwb3J0ZWQpCiogICAgQXV0byBmb3IgZHVwbGV4IG9ubHkgYW5kIHNwZWVkIDEwMDBNYnBzLgoqICAgIEF1dG8gZm9yIGR1cGxleCBvbmx5IGFuZCBzcGVlZCAxMDBNYnBzLgoqICAgIEF1dG8gZm9yIGR1cGxleCBvbmx5IGFuZCBzcGVlZCAxME1icHMuCiogICAgMTAwME1icHMgRnVsbCBkdXBsZXguCiogICAgMTAwTWJwcyBGdWxsIGR1cGxleC4KKiAgICAxMDBNYnBzIEhhbGYgZHVwbGV4LgoqICAgIDEwTWJwcyBGdWxsIGR1cGxleC4KKiAgICAxME1icHMgSGFsZiBkdXBsZXguCiovCgp0eXBlZGVmIGVudW0KewogICAgU1BFRURfQVVUT19EVVBMRVhfQVVUTywKICAgIFNQRUVEXzEwMDBfRFVQTEVYX0FVVE8sCiAgICBTUEVFRF8xMDBfRFVQTEVYX0FVVE8sCiAgICBTUEVFRF8xMF9EVVBMRVhfQVVUTywKICAgIFNQRUVEX0FVVE9fRFVQTEVYX0ZVTEwsCiAgICBTUEVFRF9BVVRPX0RVUExFWF9IQUxGLAogICAgU1BFRURfMTAwMF9EVVBMRVhfRlVMTCwKICAgIFNQRUVEXzEwMDBfRFVQTEVYX0hBTEYsCiAgICBTUEVFRF8xMDBfRFVQTEVYX0ZVTEwsCiAgICBTUEVFRF8xMDBfRFVQTEVYX0hBTEYsCiAgICBTUEVFRF8xMF9EVVBMRVhfRlVMTCwKICAgIFNQRUVEXzEwX0RVUExFWF9IQUxGCn1HVF9QSFlfQVVUT19NT0RFOwoKCi8qCiogdHlwZWRlZjogZW51bSBHVF9QSFlfUEFVU0VfTU9ERQoqCiogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIFBhdXNlIE1vZGUgaW4gdGhlIFBoeS4KKgoqIEVudW1lcmF0aW9uczoKKiAgICBHVF9QSFlfTk9fUEFVU0UgICAgICAgIC0gZGlzYWJsZSBwYXVzZQoqICAgIEdUX1BIWV9QQVVTRSAgICAgICAgLSBzdXBwb3J0IHBhdXNlCiogICAgR1RfUEhZX0FTWU1NRVRSSUNfUEFVU0UgICAgLSBzdXBwb3J0IGFzeW1tZXRyaWMgcGF1c2UKKiAgICBHVF9QSFlfQk9USF9QQVVTRSAgICAtIHN1cHBvcnQgYm90aCBwYXVzZSBhbmQgYXN5bW1ldHJpYyBwYXVzZQoqLwp0eXBlZGVmIGVudW0KewogICAgR1RfUEhZX05PX1BBVVNFID0gMCwKICAgIEdUX1BIWV9QQVVTRSwKICAgIEdUX1BIWV9BU1lNTUVUUklDX1BBVVNFLAogICAgR1RfUEhZX0JPVEhfUEFVU0UKfSBHVF9QSFlfUEFVU0VfTU9ERTsKCgovKgoqIHR5cGVkZWY6IGVudW0gR1RfUEhZX1NQRUVECioKKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgUGh5IFNwZWVkCioKKiBFbnVtZXJhdGlvbnM6CiogICAgUEhZX1NQRUVEXzEwX01CUFMgICAtIDEwTWJwcwoqICAgIFBIWV9TUEVFRF8xMDBfTUJQUyAgICAtIDEwME1icHMKKiAgICBQSFlfU1BFRURfMTAwMF9NQlBTIC0gMTAwME1icHMKKi8KdHlwZWRlZiBlbnVtCnsKICAgIFBIWV9TUEVFRF8xMF9NQlBTLAogICAgUEhZX1NQRUVEXzEwMF9NQlBTLAogICAgUEhZX1NQRUVEXzEwMDBfTUJQUwp9IEdUX1BIWV9TUEVFRDsKCgovKgoqIHR5cGVkZWY6IGVudW0gR1RfU0VSREVTX01PREUKKgoqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBTZXJkZXMgbW9kZQoqCiogRW51bWVyYXRpb25zOgoqICAgIFBIWV9TRVJERVNfMTAwRlggICAgIC0gMTAwIEZYCiogICAgUEhZX1NFUkRFU18xMDAwWCAgICAgLSAxMDAwIFgKKiAgICBQSFlfU0VSREVTX1NHTUlJX1BIWSAtIFNHTUlJIFBIWQoqICAgIFBIWV9TRVJERVNfU0dNSUlfTUFDIC0gU0dNSUkgTUFDCiovCnR5cGVkZWYgZW51bQp7CiAgICBQSFlfU0VSREVTXzEwMEZYID0gMCwKICAgIFBIWV9TRVJERVNfMTAwMFgsICAgIAogICAgUEhZX1NFUkRFU19TR01JSV9QSFksCiAgICBQSFlfU0VSREVTX1NHTUlJX01BQwp9IEdUX1NFUkRFU19NT0RFOwoKCi8qCiogdHlwZWRlZjogZW51bSBHVF9FREVURUNUX01PREUKKgoqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBFbmVyZ3kgRGV0ZWN0IG1vZGUKKgoqIEVudW1lcmF0aW9uczoKKiAgICBHVF9FREVURUNUX09GRiAgICAgICAgLSBFbmVyZ3kgRGV0ZWN0IGRpc2FibGVkCiogICAgR1RfRURFVEVDVF9TRU5TRV9QVUxTRSAgICAtIEVuZXJneSBEZXRlY3QgZW5hYmxlZCB3aXRoIHNlbnNlIGFuZCBwdWxzZQoqICAgIEdUX0VERVRFQ1RfU0VOU0UgICAgLSBFbmVyZ3kgRGV0ZWN0IGVuYWJsZWQgb25seSB3aXRoIHNlbnNlCiovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9FREVURUNUX09GRiA9IDAsCiAgICBHVF9FREVURUNUX1NFTlNFX1BVTFNFLAogICAgR1RfRURFVEVDVF9TRU5TRQp9IEdUX0VERVRFQ1RfTU9ERTsKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfSU5HUkVTU19NT0RFCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgcG9ydCBpbmdyZXNzIG1vZGUuCiAqCiAqIEVudW1lcmF0aW9uczoKICogICBHVF9VTk1PRElGWV9JTkdSRVNTIC0gZnJhbWVzIGFyZSByZWNlaXZlIHVubW9kaWZpZWQuCiAqICAgR1RfVFJBSUxFUl9JTkdSRVNTICAtIGFsbCBmcmFtZXMgYXJlIHJlY2VpdmVkIHdpdGggdHJhaWxlci4KICogICBHVF9VTlRBR0dFRF9JTkdSRVNTICAtIHJlbW92ZSB0YWcgb24gcmVjZWl2ZSAoZm9yIGRvdWJsZSB0YWdnaW5nKS4KICogICBHVF9DUFVQT1JUX0lOR1JFU1MgLSBubyB0cmFpbGVyLiB1c2VkIHRvIGlkZW50aWZ5IHRoZSBDUFUgcG9ydCBmb3IgSUdNUC9NTEQgU25vb3BpbmcKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9VTk1PRElGWV9JTkdSRVNTID0gMCwgIC8qIDB4MDAgKi8KICAgIEdUX1RSQUlMRVJfSU5HUkVTUywgICAgICAgLyogMHgwMSAqLwogICAgR1RfVU5UQUdHRURfSU5HUkVTUywgICAgICAvKiAweDEwICovCiAgICBHVF9DUFVQT1JUX0lOR1JFU1MgICAgICAgIC8qIDB4MTEgKi8KfSBHVF9JTkdSRVNTX01PREU7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9FR1JFU1NfRkxPT0QKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBwb3J0IGluZ3Jlc3MgbW9kZS4KICoKICogRW51bWVyYXRpb25zOgogKiAgIEdUX0JMT0NLX0VHUkVTU19VTktOT1dOIC0gZG8gbm90IGVncmVzcyBmcmFtZSB3aXRoIHVua25vd24gREEKICogICBHVF9CTE9DS19FR1JFU1NfVU5LTk9XTl9NVUxUSUNBU1QgLSBkbyBub3QgZWdyZXNzIGZyYW1lIHdpdGggdW5rbm93biBtdWx0aWNhc3QgREEKICogICBHVF9CTE9DS19FR1JFU1NfVU5LTk9XTl9VTklJQ0FTVCAtIGRvIG5vdCBlZ3Jlc3MgZnJhbWUgd2l0aCB1bmtub3duIHVuaWNhc3QgREEKICogICBHVF9CTE9DS19FR1JFU1NfTk9ORSAtIGVncmVzcyBhbGwgZnJhbWVzIHdpdGggdW5rbm93biBEQQogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX0JMT0NLX0VHUkVTU19VTktOT1dOID0gMCwKICAgIEdUX0JMT0NLX0VHUkVTU19VTktOT1dOX01VTFRJQ0FTVCwKICAgIEdUX0JMT0NLX0VHUkVTU19VTktOT1dOX1VOSUNBU1QsCiAgICBHVF9CTE9DS19FR1JFU1NfTk9ORQp9IEdUX0VHUkVTU19GTE9PRDsKCgovKgogKiAgdHlwZWRlZjogZW51bSBHVF9NQ19SQVRFCiAqCiAqICBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgdGhlIHBvcnQgaW5ncmVzcyBtb2RlLgogKgogKiAgRW51bWVyYXRpb25zOgogKiAgICAgIEdUX01DXzNfUEVSQ0VOVF9STCAgIC0gbXVsdGljYXN0IHJhdGUgaXMgbGltaXRlZCB0byAzIHBlcmNlbnQuCiAqICAgICAgR1RfTUNfNl9QRVJDRU5UX1JMICAgLSBtdWx0aWNhc3QgcmF0ZSBpcyBsaW1pdGVkIHRvIDYgcGVyY2VudC4KICogICAgICBHVF9NQ18xMl9QRVJDRU5UX1JMICAtIG11bHRpY2FzdCByYXRlIGlzIGxpbWl0ZWQgdG8gMTIgcGVyY2VudC4KICogICAgICBHVF9NQ18xMDBfUEVSQ0VOVF9STCAtIHVubGltaXRlZCBtdWx0aWNhc3QgcmF0ZS4KICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9NQ18zX1BFUkNFTlRfUkwgPSAwLAogICAgR1RfTUNfNl9QRVJDRU5UX1JMLAogICAgR1RfTUNfMTJfUEVSQ0VOVF9STCwKICAgIEdUX01DXzEwMF9QRVJDRU5UX1JMLAp9IEdUX01DX1JBVEU7CgoKLyoKICogIHR5cGVkZWY6IGVudW0gR1RfSU5HUkVTU19SQVRFX01PREUKICoKICogIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgcG9ydCBpbmdyZXNzIHJhdGUgbGltaXQgbW9kZS4KICoKICogIEVudW1lcmF0aW9uczoKICogICAgICBHVF9SQVRFX1BSSV9CQVNFICAgLSBQcmlvcml0eSBiYXNlZCByYXRlIGxpbWl0aW5nCiAqICAgICAgICBHVF9SQVRFX0JVUlNUX0JBU0UgLSBCdXJzdCBTaXplIGJhc2VkIHJhdGUgbGltaXRpbmcKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9SQVRFX1BSSV9CQVNFID0gMCwKICAgIEdUX1JBVEVfQlVSU1RfQkFTRQp9IEdUX0lOR1JFU1NfUkFURV9NT0RFOwoKCi8qCiAqICB0eXBlZGVmOiBlbnVtIEdUX1BPUlRfU0NIRURfTU9ERQogKgogKiAgRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHBvcnQgc2NoZWR1bGluZyBtb2RlCiAqCiAqICBGaWVsZHM6CiAqICAgICAgICAgR1RfUE9SVF9TQ0hFRF9XRUlHSFRFRF9SUkIgLSB1c2UgOCw0LDIsMSB3ZWlnaHRlZCBmYWlyIHNjaGVkdWxpbmcKICogICAgICAgICBHVF9QT1JUX1NDSEVEX1NUUklDVF9QUkkgLSB1c2UgYSBzdHJpY3QgcHJpb3JpdHkgc2NoZW1lCiAqICAgICAgICAgR1RfUE9SVF9TQ0hFRF9TVFJJQ1RfUFJJMyAtIHVzZSBhIHN0cmljdCBmb3IgcHJpb3JpdHkgMyBhbmQgd2VpZ2h0ZWQgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQgcm9iaW4gZm9yIHRoZSBwcmlvcml0eSAyLDEsYW5kIDAKICogICAgICAgICBHVF9QT1JUX1NDSEVEX1NUUklDVF9QUkkyXzMgLSB1c2UgYSBzdHJpY3QgZm9yIHByaW9yaXR5IDIsMyBhbmQgd2VpZ2h0ZWQgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQgcm9iaW4gZm9yIHRoZSBwcmlvcml0eSAxLGFuZCAwCiAqCiAqICBDb21tZW50OgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1BPUlRfU0NIRURfV0VJR0hURURfUlJCID0gMCwKICAgIEdUX1BPUlRfU0NIRURfU1RSSUNUX1BSSSwKICAgIEdUX1BPUlRfU0NIRURfU1RSSUNUX1BSSTMsCiAgICBHVF9QT1JUX1NDSEVEX1NUUklDVF9QUkkyXzMKfSBHVF9QT1JUX1NDSEVEX01PREU7CgoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QT1JUX1NUQVQKICoKICogIERlc2NyaXB0aW9uOiBwb3J0IHN0YXRpc3RpYyBzdHJ1Y3QuCiAqCiAqICBGaWVsZHM6CiAqICAgICAgcnhDdHIgICAtIHBvcnQgcmVjZWl2ZSBjb3VudGVyLgogKiAgICAgIHR4Q3RyICAgLSBwb3J0IHRyYW5zbWl0IGNvdW50ZXIuCiAqICAgICAgZHJvcHBlZCAtIGRyb3BwZWQgZnJhbWUgY291bnRlci4KICoKICogIENvbW1lbnQ6CiAqICAgICAgICBkcm9wcGVkIGZyYW1lIGNvdW50ZXIgaXMgc3VwcG9ydGVkIGJ5IG9ubHkgbGltaXRlZCBkZXZpY2VzLgogKiAgICAgICAgQXQgdGhpcyBtb21lbnQsIDg4RTYwNjEvODhFNjA2NSBhcmUgdGhlIGRldmljZXMgc3VwcG9ydGluZwogKiAgICAgICAgZHJvcHBlZCBmcmFtZSBjb3VudGVyLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTE2ICByeEN0cjsKICAgIEdUX1UxNiAgdHhDdHI7CiAgICBHVF9VMTYgIGRyb3BwZWQ7Cn0gR1RfUE9SVF9TVEFUOwoKLyoKICogIHR5cGVkZWY6IHN0cnVjdCBHVF9QT1JUX1NUQVQyCiAqCiAqICBEZXNjcmlwdGlvbjogcG9ydCBzdGF0aXN0aWMgc3RydWN0LgogKgogKiAgRmllbGRzOgogKiAgICAgIGluRGlzY2FyZExvIC0gSW5EaXNjYXJkcyBMb3cgRnJhbWUgQ291bnRlcgogKiAgICAgIGluRGlzY2FyZEhpIC0gSW5EaXNjYXJkcyBIaWdoIEZyYW1lIENvdW50ZXIKICogICAgICBpbkZpbHRlcmVkICAtIEluRmlsdGVyZWQgRnJhbWUgQ291bnRlcgogKiAgICAgIG91dEZpbHRlcmVkIC0gT3V0RmlsdGVyZWQgRnJhbWUgQ291bnRlcgogKgogKiAgQ29tbWVudDoKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UxNiAgaW5EaXNjYXJkTG87CiAgICBHVF9VMTYgIGluRGlzY2FyZEhpOwogICAgR1RfVTE2ICBpbkZpbHRlcmVkOwogICAgR1RfVTE2ICBvdXRGaWx0ZXJlZDsKfSBHVF9QT1JUX1NUQVQyOwoKCi8qCiAqKiAgdHlwZWRlZjogc3RydWN0IEdUX1BPUlRfUV9DT1VOVEVSUwogKioKICoqICBEZXNjcmlwdGlvbjogcG9ydCBxdWV1ZSBzdGF0aXN0aWMgc3RydWN0LgogKioKICoqICBGaWVsZHM6CiAqKiAgICAgIE91dFFfU2l6ZSAtIHBvcnQgZWdyZXNzIHF1ZXVlIHNpemUgY29pCiAqKiAgICAgIFJzdl9TaXplICAtIGluZ3Jlc3MgcmVzZXJ2ZWQgZSBjb3VudGVyCiAqKgogKiovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UxNiAgT3V0UV9TaXplOwogICAgR1RfVTE2ICBSc3ZfU2l6ZTsKfSBHVF9QT1JUX1FfU1RBVDsKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQ1RSX01PREUKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIHRoZSBwb3J0IGNvdW50ZXJzIG1vZGUuCiAqCiAqIEVudW1lcmF0aW9uczoKICogICBHVF9DVFJfQUxMICAgIC0gSW4gdGhpcyBtb2RlIHRoZSBjb3VudGVycyBjb3VudHMgUnggcmVjZWl2ZSBhbmQgdHJhbnNtaXQKICogICAgICAgICAgICAgICAgICAgZnJhbWVzLgogKiAgIEdUX0NUUl9FUlJPUlMgLSBJbiB0aGlzIG1vZGUgdGhlIGNvdW50ZXJzIGNvdW50cyBSeCBFcnJvcnMgYW5kIGNvbGxpc2lvbnMuCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfQ1RSX0FMTCA9IDAsCiAgICBHVF9DVFJfRVJST1JTLAp9IEdUX0NUUl9NT0RFOwoKdHlwZWRlZiBzdHJ1Y3QgX0dUX1FEX0RFViBHVF9RRF9ERVY7CgovKgogKiBzZW1hcGhvcmUgcmVsYXRlZCBkZWZpbml0aW9ucy4KICogVXNlciBBcHBsaWNhdGlvbnMgbWF5IHJlZ2lzdGVyIFNlbWFwaG9yZSBmdW5jdGlvbnMgdXNpbmcgZm9sbG93aW5nIGRlZmluaXRpb25zCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfU0VNX0VNUFRZLAogICAgR1RfU0VNX0ZVTEwKfSBHVF9TRU1fQkVHSU5fU1RBVEU7Cgp0eXBlZGVmIEdUX1NFTSAoKkZHVF9TRU1fQ1JFQVRFKSgKICAgICAgICAgICAgICAgICAgICAgICAgR1RfU0VNX0JFR0lOX1NUQVRFIHN0YXRlKTsKdHlwZWRlZiBHVF9TVEFUVVMgKCpGR1RfU0VNX0RFTEVURSkoCiAgICAgICAgICAgICAgICAgICAgICAgIEdUX1NFTSBzZW1JZCk7CnR5cGVkZWYgR1RfU1RBVFVTICgqRkdUX1NFTV9UQUtFKSgKICAgICAgICAgICAgICAgICAgICAgICAgR1RfU0VNIHNlbUlkLCBHVF9VMzIgdGltT3V0KTsKdHlwZWRlZiBHVF9TVEFUVVMgKCpGR1RfU0VNX0dJVkUpKAogICAgICAgICAgICAgICAgICAgICAgICBHVF9TRU0gc2VtSWQpOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgRkdUX1NFTV9DUkVBVEUgICAgc2VtQ3JlYXRlOyAgICAgLyogY3JlYXRlIHNlbWFwb3JlICovCiAgICBGR1RfU0VNX0RFTEVURSAgICBzZW1EZWxldGU7ICAgICAvKiBkZWxldGUgdGhlIHNlbWFwb3JlICovCiAgICBGR1RfU0VNX1RBS0UgICAgc2VtVGFrZTsgICAgLyogdHJ5IHRvIGdldCBhIHNlbWFwb3JlICovCiAgICBGR1RfU0VNX0dJVkUgICAgc2VtR2l2ZTsgICAgLyogcmV0dXJuIHNlbWFwaG9yZSAqLwp9R1RfU0VNX1JPVVRJTkVTOwoKLyoKICogZGVmaW5pdGlvbnMgZm9yIHJlZ2lzdGVyaW5nIEhhcmR3YXJlIGFjY2VzcyBmdW5jdGlvbi4KICoKKi8KLyojaWZkZWYgR1RfUk1HTVRfQUNDRVNTICovCiNpZiAxCi8qCiAqICAqIERlZmluaXRpb24gZm9yIHRoZSBkaXJlY3Rpb24gaW4gSFdfREVWX1JXX1JFRyBzdHJ1Y3R1cmUuCiAqICAqLwojZGVmaW5lIEhXX1JFR19SRUFEICAgICAgICAgICAgICAgICAgICAgMAojZGVmaW5lIEhXX1JFR19XUklURSAgICAgICAgICAgIDEKI2RlZmluZSBIV19SRUdfV0FJVF9USUxMXzAgICAgICAyCiNkZWZpbmUgSFdfUkVHX1dBSVRfVElMTF8xICAgICAgMyAgICAgICAKCi8qIEhXX0FDQ0VTU19SRUFEX1JFRyBhbmQgSFdfQUNDRVNTX1dSSVRFX1JFRyAqLwp0eXBlZGVmIHN0cnVjdCBfSFdfREVWX1JXX1JFRwp7CiAgdW5zaWduZWQgbG9uZyBjbWQ7ICAvKklOUFVUOkhXX1JFR19SRUFELCBIV19SRUdfV1JJVEUsIEhXX1JFR19XQUlUX1RJTExfMCBvciBIV19SRUdfV0FJVF9USUxMXzEgKi8KICB1bnNpZ25lZCBsb25nIGFkZHI7IC8qSU5QVVQ6U01JIEFkZHJlc3MgKi8KICB1bnNpZ25lZCBsb25nIHJlZzsgIC8qSU5QVVQ6UmVnaXN0ZXIgb2Zmc2V0ICovCiAgdW5zaWduZWQgbG9uZyBkYXRhOyAvKklOUFVULE9VVFBVVDpWYWx1ZSBpbiB0aGUgUmVnaXN0ZXIgb3IgQml0IG51bWJlciAqLwp9IEhXX0RFVl9SV19SRUc7CgojZGVmaW5lICBNQVhfQUNDRVNTX1JFR19OVU0gIDEyCgp0eXBlZGVmIHN0cnVjdCBfSFdfREVWX1JFR19BQ0NFU1MKewogICAgICAgIHVuc2lnbmVkIGxvbmcgICBlbnRyaWVzOyAgIAogICAgICAgIEhXX0RFVl9SV19SRUcgICByd19yZWdfbGlzdFtNQVhfQUNDRVNTX1JFR19OVU1dOyAvKiBJTlBVVCxPVVRQVVQ6IFJlZyBBY2Nlc3MgaW5mb3JtYXRpb24gKi8KfSBIV19ERVZfUkVHX0FDQ0VTUzsKCgp0eXBlZGVmIEdUX0JPT0wgKCpGR1RfSFdfQUNDRVNTKShHVF9RRF9ERVYqIGRldiwgSFdfREVWX1JFR19BQ0NFU1MgKnJlZ0xpc3QpOwojZW5kaWYKCi8qCiAqIGRlZmluaXRpb25zIGZvciByZWdpc3RlcmluZyBNSUkgYWNjZXNzIGZ1bmN0aW9ucy4KICoKKi8KdHlwZWRlZiBHVF9CT09MICgqRkdUX1JFQURfTUlJKSgKICAgICAgICAgICAgICAgICAgICAgICAgR1RfUURfREVWKiAgIGRldiwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBoeUFkZHIsIAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWlpUmVnLCAKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiB2YWx1ZSk7CnR5cGVkZWYgR1RfQk9PTCAoKkZHVF9XUklURV9NSUkpKAogICAgICAgICAgICAgICAgICAgICAgICBHVF9RRF9ERVYqICAgZGV2LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGh5QWRkciwgCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtaWlSZWcsIAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpOwp0eXBlZGVmIEdUX0JPT0wgKCpGR1RfSU5UX0hBTkRMRVIpKAogICAgICAgICAgICAgICAgICAgICAgICBHVF9RRF9ERVYqICAgZGV2LAogICAgICAgICAgICAgICAgICAgICAgICBHVF9VMTYqKTsKCnR5cGVkZWYgc3RydWN0IF9CU1BfRlVOQ1RJT05TCnsKICAgIEdUX1UzMiAgICAgICAgaHdBY2Nlc3NNb2Q7ICAgIC8qIEhhcmR3YXJlIGFjY2VzcyBtb2RlICovCiAgICBGR1RfUkVBRF9NSUkgICAgIHJlYWRNaWk7ICAgIC8qIHJlYWQgTUlJIFJlZ2lzdGVycyAqLwogICAgRkdUX1dSSVRFX01JSSAgICAgd3JpdGVNaWk7ICAgIC8qIHdyaXRlIE1JSSBSZWdpc3RlcnMgKi8KI2lmZGVmIEdUX1JNR01UX0FDQ0VTUwogICAgRkdUX0hXX0FDQ0VTUyAgIGh3QWNjZXNzOyAgICAvKiBIYXJkd2FyZSBhY2Nlc3MgZnVuY3Rpb24gKi8KI2VuZGlmCiAgICBGR1RfU0VNX0NSRUFURSAgICBzZW1DcmVhdGU7ICAgICAvKiBjcmVhdGUgc2VtYXBvcmUgKi8KICAgIEZHVF9TRU1fREVMRVRFICAgIHNlbURlbGV0ZTsgICAgIC8qIGRlbGV0ZSB0aGUgc2VtYXBvcmUgKi8KICAgIEZHVF9TRU1fVEFLRSAgICBzZW1UYWtlOyAgICAvKiB0cnkgdG8gZ2V0IGEgc2VtYXBvcmUgKi8KICAgIEZHVF9TRU1fR0lWRSAgICBzZW1HaXZlOyAgICAvKiByZXR1cm4gc2VtYXBob3JlICovCn1CU1BfRlVOQ1RJT05TOwoKCi8qCiAqICAgIFR5cGUgZGVmaW5pdGlvbiBmb3IgTUlCIGNvdW50ZXIgb3BlcmF0aW9uCiovCnR5cGVkZWYgZW51bSAKewogICAgU1RBVFNfRkxVU0hfQUxMLCAgICAgICAgLyogRmx1c2ggYWxsIGNvdW50ZXJzIGZvciBhbGwgcG9ydHMgKi8KICAgIFNUQVRTX0ZMVVNIX1BPUlQsICAgICAgICAvKiBGbHVzaCBhbGwgY291bnRlcnMgZm9yIGEgcG9ydCAqLwogICAgU1RBVFNfUkVBRF9DT1VOVEVSLCAgICAgICAgLyogUmVhZCBhIHNwZWNpZmljIGNvdW50ZXIgZnJvbSBhIHBvcnQgKi8KICAgIFNUQVRTX1JFQURfUkVBTFRJTUVfQ09VTlRFUiwgICAgLyogUmVhZCBhIHJlYWx0aW1lIGNvdW50ZXIgZnJvbSBhIHBvcnQgKi8KICAgIFNUQVRTX1JFQURfQUxMICAgICAgICAgICAgLyogUmVhZCBhbGwgY291bnRlcnMgZnJvbSBhIHBvcnQgKi8KCn0gR1RfU1RBVFNfT1BFUkFUSU9OOwoKdHlwZWRlZiBzdHJ1Y3QgX0dUX1NUQVRTX0NPVU5URVJfU0VUCnsKICAgIEdUX1UzMiAgICBJblVuaWNhc3RzOwogICAgR1RfVTMyICAgIEluQnJvYWRjYXN0czsKICAgIEdUX1UzMiAgICBJblBhdXNlOwogICAgR1RfVTMyICAgIEluTXVsdGljYXN0czsKICAgIEdUX1UzMiAgICBJbkZDU0VycjsKICAgIEdUX1UzMiAgICBBbGlnbkVycjsKICAgIEdUX1UzMiAgICBJbkdvb2RPY3RldHM7CiAgICBHVF9VMzIgICAgSW5CYWRPY3RldHM7CiAgICBHVF9VMzIgICAgVW5kZXJzaXplOwogICAgR1RfVTMyICAgIEZyYWdtZW50czsKICAgIEdUX1UzMiAgICBJbjY0T2N0ZXRzOyAgICAgICAgLyogNjQgT2N0ZXRzICovCiAgICBHVF9VMzIgICAgSW4xMjdPY3RldHM7ICAgIC8qIDY1IHRvIDEyNyBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBJbjI1NU9jdGV0czsgICAgLyogMTI4IHRvIDI1NSBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBJbjUxMU9jdGV0czsgICAgLyogMjU2IHRvIDUxMSBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBJbjEwMjNPY3RldHM7ICAgIC8qIDUxMiB0byAxMDIzIE9jdGV0cyAqLwogICAgR1RfVTMyICAgIEluTWF4T2N0ZXRzOyAgICAvKiAxMDI0IHRvIE1heCBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBKYWJiZXI7CiAgICBHVF9VMzIgICAgT3ZlcnNpemU7CiAgICBHVF9VMzIgICAgSW5EaXNjYXJkczsKICAgIEdUX1UzMiAgICBGaWx0ZXJlZDsKICAgIEdUX1UzMiAgICBPdXRVbmljYXN0czsKICAgIEdUX1UzMiAgICBPdXRCcm9hZGNhc3RzOwogICAgR1RfVTMyICAgIE91dFBhdXNlOwogICAgR1RfVTMyICAgIE91dE11bHRpY2FzdHM7CiAgICBHVF9VMzIgICAgT3V0RkNTRXJyOwogICAgR1RfVTMyICAgIE91dEdvb2RPY3RldHM7CiAgICBHVF9VMzIgICAgT3V0NjRPY3RldHM7ICAgIC8qIDY0IE9jdGV0cyAqLwogICAgR1RfVTMyICAgIE91dDEyN09jdGV0czsgICAgLyogNjUgdG8gMTI3IE9jdGV0cyAqLwogICAgR1RfVTMyICAgIE91dDI1NU9jdGV0czsgICAgLyogMTI4IHRvIDI1NSBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBPdXQ1MTFPY3RldHM7ICAgIC8qIDI1NiB0byA1MTEgT2N0ZXRzICovCiAgICBHVF9VMzIgICAgT3V0MTAyM09jdGV0czsgICAgLyogNTEyIHRvIDEwMjMgT2N0ZXRzICovCiAgICBHVF9VMzIgICAgT3V0TWF4T2N0ZXRzOyAgICAvKiAxMDI0IHRvIE1heCBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBDb2xsaXNpb25zOwogICAgR1RfVTMyICAgIExhdGU7CiAgICBHVF9VMzIgICAgRXhjZXNzaXZlOwogICAgR1RfVTMyICAgIE11bHRpcGxlOwogICAgR1RfVTMyICAgIFNpbmdsZTsKICAgIEdUX1UzMiAgICBEZWZlcnJlZDsKICAgIEdUX1UzMiAgICBPdXREaXNjYXJkczsKCn0gR1RfU1RBVFNfQ09VTlRFUl9TRVQ7CgoKdHlwZWRlZiBlbnVtCnsKICAgIFNUQVRTX0luVW5pY2FzdHMgPSAwLAogICAgU1RBVFNfSW5Ccm9hZGNhc3RzLAogICAgU1RBVFNfSW5QYXVzZSwKICAgIFNUQVRTX0luTXVsdGljYXN0cywKICAgIFNUQVRTX0luRkNTRXJyLAogICAgU1RBVFNfQWxpZ25FcnIsCiAgICBTVEFUU19Jbkdvb2RPY3RldHMsCiAgICBTVEFUU19JbkJhZE9jdGV0cywKICAgIFNUQVRTX1VuZGVyc2l6ZSwKICAgIFNUQVRTX0ZyYWdtZW50cywKICAgIFNUQVRTX0luNjRPY3RldHMsCiAgICBTVEFUU19JbjEyN09jdGV0cywKICAgIFNUQVRTX0luMjU1T2N0ZXRzLAogICAgU1RBVFNfSW41MTFPY3RldHMsCiAgICBTVEFUU19JbjEwMjNPY3RldHMsCiAgICBTVEFUU19Jbk1heE9jdGV0cywKICAgIFNUQVRTX0phYmJlciwKICAgIFNUQVRTX092ZXJzaXplLAogICAgU1RBVFNfSW5EaXNjYXJkcywKICAgIFNUQVRTX0ZpbHRlcmVkLAogICAgU1RBVFNfT3V0VW5pY2FzdHMsCiAgICBTVEFUU19PdXRCcm9hZGNhc3RzLAogICAgU1RBVFNfT3V0UGF1c2UsCiAgICBTVEFUU19PdXRNdWx0aWNhc3RzLAogICAgU1RBVFNfT3V0RkNTRXJyLAogICAgU1RBVFNfT3V0R29vZE9jdGV0cywKICAgIFNUQVRTX091dDY0T2N0ZXRzLAogICAgU1RBVFNfT3V0MTI3T2N0ZXRzLAogICAgU1RBVFNfT3V0MjU1T2N0ZXRzLAogICAgU1RBVFNfT3V0NTExT2N0ZXRzLAogICAgU1RBVFNfT3V0MTAyM09jdGV0cywKICAgIFNUQVRTX091dE1heE9jdGV0cywKICAgIFNUQVRTX0NvbGxpc2lvbnMsCiAgICBTVEFUU19MYXRlLAogICAgU1RBVFNfRXhjZXNzaXZlLAogICAgU1RBVFNfTXVsdGlwbGUsCiAgICBTVEFUU19TaW5nbGUsCiAgICBTVEFUU19EZWZlcnJlZCwKICAgIFNUQVRTX091dERpc2NhcmRzCgp9IEdUX1NUQVRTX0NPVU5URVJTOwovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0hJU1RPR1JBTV9NT0RFCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiB0aGUgaGlzdG9ncmFtIGNvdW50ZXJzIG1vZGUuCiAqCiAqIEVudW1lcmF0aW9uczoKICogICBHVF9DT1VOVF9SWF9PTkxZIC0gSW4gdGhpcyBtb2RlLCBSeCBIaXN0b2dyYW0gQ291bnRlcnMgYXJlIGNvdW50ZWQuCiAqICAgR1RfQ09VTlRfVFhfT05MWSAtIEluIHRoaXMgbW9kZSwgVHggSGlzdG9ncmFtIENvdW50ZXJzIGFyZSBjb3VudGVkLgogKiAgIEdUX0NPVU5UX1JYX1RYICAgLSBJbiB0aGlzIG1vZGUsIFJ4IGFuZCBUeCBIaXN0b2dyYW0gQ291bnRlcnMgYXJlIGNvdW50ZWQuCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfQ09VTlRfUlhfT05MWSA9IDAsCiAgICBHVF9DT1VOVF9UWF9PTkxZLAogICAgR1RfQ09VTlRfUlhfVFgKfSBHVF9ISVNUT0dSQU1fTU9ERTsKCi8qCiAgICBDb3VudGVyIHNldCAyIGlzIHVzZWQgYnkgODhFNjE4MwoqLwp0eXBlZGVmIHN0cnVjdCBfR1RfU1RBVFNfQ09VTlRFUl9TRVQyCnsKICAgIEdUX1UzMiAgICBJbkdvb2RPY3RldHNIaTsKICAgIEdUX1UzMiAgICBJbkdvb2RPY3RldHNMbzsKICAgIEdUX1UzMiAgICBJbkJhZE9jdGV0czsKICAgIEdUX1UzMiAgICBPdXREaXNjYXJkczsKICAgIEdUX1UzMiAgICBJbkdvb2RGcmFtZXM7CiAgICBHVF9VMzIgICAgSW5CYWRGcmFtZXM7CiAgICBHVF9VMzIgICAgSW5Ccm9hZGNhc3RzOwogICAgR1RfVTMyICAgIEluTXVsdGljYXN0czsKICAgIC8qIAogICAgICAgIEhpc3RvZ3JhbSBDb3VudGVycyA6IFJ4IE9ubHksIFR4IE9ubHksIG9yIGJvdGggUnggYW5kIFR4IAogICAgICAgIChyZWZlciB0byBIaXN0b2dyYW0gTW9kZSkgCiAgICAqLwogICAgR1RfVTMyICAgIE9jdGV0czY0OyAgICAgICAgLyogNjQgT2N0ZXRzICovCiAgICBHVF9VMzIgICAgT2N0ZXRzMTI3OyAgICAgICAgLyogNjUgdG8gMTI3IE9jdGV0cyAqLwogICAgR1RfVTMyICAgIE9jdGV0czI1NTsgICAgICAgIC8qIDEyOCB0byAyNTUgT2N0ZXRzICovCiAgICBHVF9VMzIgICAgT2N0ZXRzNTExOyAgICAgICAgLyogMjU2IHRvIDUxMSBPY3RldHMgKi8KICAgIEdUX1UzMiAgICBPY3RldHMxMDIzOyAgICAgICAgLyogNTEyIHRvIDEwMjMgT2N0ZXRzICovCiAgICBHVF9VMzIgICAgT2N0ZXRzTWF4OyAgICAgICAgLyogMTAyNCB0byBNYXggT2N0ZXRzICovCiAgICBHVF9VMzIgICAgT3V0T2N0ZXRzSGk7CiAgICBHVF9VMzIgICAgT3V0T2N0ZXRzTG87CiAgICBHVF9VMzIgICAgT3V0RnJhbWVzOwogICAgR1RfVTMyICAgIEV4Y2Vzc2l2ZTsKICAgIEdUX1UzMiAgICBPdXRNdWx0aWNhc3RzOwogICAgR1RfVTMyICAgIE91dEJyb2FkY2FzdHM7CiAgICBHVF9VMzIgICAgSW5CYWRNQUNDdHJsOwoKICAgIEdUX1UzMiAgICBPdXRQYXVzZTsKICAgIEdUX1UzMiAgICBJblBhdXNlOwogICAgR1RfVTMyICAgIEluRGlzY2FyZHM7CiAgICBHVF9VMzIgICAgVW5kZXJzaXplOwogICAgR1RfVTMyICAgIEZyYWdtZW50czsKICAgIEdUX1UzMiAgICBPdmVyc2l6ZTsKICAgIEdUX1UzMiAgICBKYWJiZXI7CiAgICBHVF9VMzIgICAgTUFDUmN2RXJyOwogICAgR1RfVTMyICAgIEluRkNTRXJyOwogICAgR1RfVTMyICAgIENvbGxpc2lvbnM7CiAgICBHVF9VMzIgICAgTGF0ZTsKCn0gR1RfU1RBVFNfQ09VTlRFUl9TRVQyOwoKCnR5cGVkZWYgZW51bQp7CiAgICBTVEFUUzJfSW5Hb29kT2N0ZXRzSGkgPSAwLAogICAgU1RBVFMyX0luR29vZE9jdGV0c0xvLAogICAgU1RBVFMyX0luQmFkT2N0ZXRzLAogICAgCiAgICBTVEFUUzJfT3V0RGlzY2FyZHMsCiAgICBTVEFUUzJfSW5Hb29kRnJhbWVzLAogICAgU1RBVFMyX0luQmFkRnJhbWVzLAogICAgU1RBVFMyX0luQnJvYWRjYXN0cywKICAgIFNUQVRTMl9Jbk11bHRpY2FzdHMsCiAgICBTVEFUUzJfNjRPY3RldHMsCiAgICBTVEFUUzJfMTI3T2N0ZXRzLAogICAgU1RBVFMyXzI1NU9jdGV0cywKICAgIFNUQVRTMl81MTFPY3RldHMsCiAgICBTVEFUUzJfMTAyM09jdGV0cywKICAgIFNUQVRTMl9NYXhPY3RldHMsCiAgICBTVEFUUzJfT3V0T2N0ZXRzSGksCiAgICBTVEFUUzJfT3V0T2N0ZXRzTG8sCiAgICBTVEFUUzJfT3V0RnJhbWVzLAogICAgU1RBVFMyX0V4Y2Vzc2l2ZSwKICAgIFNUQVRTMl9PdXRNdWx0aWNhc3RzLAogICAgU1RBVFMyX091dEJyb2FkY2FzdHMsCiAgICBTVEFUUzJfSW5CYWRNQUNDdHJsLAogICAgU1RBVFMyX091dFBhdXNlLAogICAgU1RBVFMyX0luUGF1c2UsCiAgICBTVEFUUzJfSW5EaXNjYXJkcywKICAgIFNUQVRTMl9VbmRlcnNpemUsCiAgICBTVEFUUzJfRnJhZ21lbnRzLAogICAgU1RBVFMyX092ZXJzaXplLAogICAgU1RBVFMyX0phYmJlciwKICAgIFNUQVRTMl9NQUNSY3ZFcnIsCiAgICBTVEFUUzJfSW5GQ1NFcnIsCiAgICBTVEFUUzJfQ29sbGlzaW9ucywKICAgIFNUQVRTMl9MYXRlCgp9IEdUX1NUQVRTX0NPVU5URVJTMjsKCi8qCiAgICBDb3VudGVyIHNldCAzIGlzIHVzZWQgYnkgODhFNjA5MyBhbmQgODhFNjA2NQoqLwp0eXBlZGVmIHN0cnVjdCBfR1RfU1RBVFNfQ09VTlRFUl9TRVQzCnsKICAgIEdUX1UzMiAgICBJbkdvb2RPY3RldHNMbzsgICAgLyogb2Zmc2V0IDAgKi8KICAgIEdUX1UzMiAgICBJbkdvb2RPY3RldHNIaTsgICAgLyogb2Zmc2V0IDEsIG5vdCBzdXBwb3J0ZWQgYnkgODhFNjA2NSAqLwogICAgR1RfVTMyICAgIEluQmFkT2N0ZXRzOyAgICAgICAgLyogb2Zmc2V0IDIgKi8KICAgIEdUX1UzMiAgICBPdXRGQ1NFcnI7ICAgICAgICAgICAgLyogb2Zmc2V0IDMgKi8KICAgIEdUX1UzMiAgICBJblVuaWNhc3RzOyAgICAgICAgICAgIC8qIG9mZnNldCA0ICovCiAgICBHVF9VMzIgICAgRGVmZXJyZWQ7ICAgICAgICAgICAgLyogb2Zmc2V0IDUgKi8KICAgIEdUX1UzMiAgICBJbkJyb2FkY2FzdHM7ICAgICAgICAvKiBvZmZzZXQgNiAqLwogICAgR1RfVTMyICAgIEluTXVsdGljYXN0czsgICAgICAgIC8qIG9mZnNldCA3ICovCiAgICAvKiAKICAgICAgICBIaXN0b2dyYW0gQ291bnRlcnMgOiBSeCBPbmx5LCBUeCBPbmx5LCBvciBib3RoIFJ4IGFuZCBUeCAKICAgICAgICAocmVmZXIgdG8gSGlzdG9ncmFtIE1vZGUpIAogICAgKi8KICAgIEdUX1UzMiAgICBPY3RldHM2NDsgICAgICAgIC8qIDY0IE9jdGV0cywgb2Zmc2V0IDggKi8KICAgIEdUX1UzMiAgICBPY3RldHMxMjc7ICAgICAgICAvKiA2NSB0byAxMjcgT2N0ZXRzLCBvZmZzZXQgOSAqLwogICAgR1RfVTMyICAgIE9jdGV0czI1NTsgICAgICAgIC8qIDEyOCB0byAyNTUgT2N0ZXRzLCBvZmZzZXQgMTAgKi8KICAgIEdUX1UzMiAgICBPY3RldHM1MTE7ICAgICAgICAvKiAyNTYgdG8gNTExIE9jdGV0cywgb2Zmc2V0IDExICovCiAgICBHVF9VMzIgICAgT2N0ZXRzMTAyMzsgICAgICAgIC8qIDUxMiB0byAxMDIzIE9jdGV0cywgb2Zmc2V0IDEyICovCiAgICBHVF9VMzIgICAgT2N0ZXRzTWF4OyAgICAgICAgLyogMTAyNCB0byBNYXggT2N0ZXRzLCBvZmZzZXQgMTMgKi8KICAgIEdUX1UzMiAgICBPdXRPY3RldHNMbzsgICAgLyogb2Zmc2V0IDE0ICovCiAgICBHVF9VMzIgICAgT3V0T2N0ZXRzSGk7ICAgIC8qIG9mZnNldCAxNSwgbm90IHN1cHBvcnRlZCBieSA4OEU2MDY1ICovCiAgICBHVF9VMzIgICAgT3V0VW5pY2FzdHM7ICAgIC8qIG9mZnNldCAxNiAqLwogICAgR1RfVTMyICAgIEV4Y2Vzc2l2ZTsgICAgICAgIC8qIG9mZnNldCAxNyAqLwogICAgR1RfVTMyICAgIE91dE11bHRpY2FzdHM7ICAgIC8qIG9mZnNldCAxOCAqLwogICAgR1RfVTMyICAgIE91dEJyb2FkY2FzdHM7ICAgIC8qIG9mZnNldCAxOSAqLwogICAgR1RfVTMyICAgIFNpbmdsZTsgICAgICAgICAgICAvKiBvZmZzZXQgMjAgKi8KCiAgICBHVF9VMzIgICAgT3V0UGF1c2U7ICAgICAgICAvKiBvZmZzZXQgMjEgKi8KICAgIEdUX1UzMiAgICBJblBhdXNlOyAgICAgICAgICAgIC8qIG9mZnNldCAyMiAqLwogICAgR1RfVTMyICAgIE11bHRpcGxlOyAgICAgICAgLyogb2Zmc2V0IDIzICovCiAgICBHVF9VMzIgICAgVW5kZXJzaXplOyAgICAgICAgLyogb2Zmc2V0IDI0ICovCiAgICBHVF9VMzIgICAgRnJhZ21lbnRzOyAgICAgICAgLyogb2Zmc2V0IDI1ICovCiAgICBHVF9VMzIgICAgT3ZlcnNpemU7ICAgICAgICAvKiBvZmZzZXQgMjYgKi8KICAgIEdUX1UzMiAgICBKYWJiZXI7ICAgICAgICAgICAgLyogb2Zmc2V0IDI3ICovCiAgICBHVF9VMzIgICAgSW5NQUNSY3ZFcnI7ICAgIC8qIG9mZnNldCAyOCAqLwogICAgR1RfVTMyICAgIEluRkNTRXJyOyAgICAgICAgLyogb2Zmc2V0IDI5ICovCiAgICBHVF9VMzIgICAgQ29sbGlzaW9uczsgICAgICAgIC8qIG9mZnNldCAzMCAqLwogICAgR1RfVTMyICAgIExhdGU7ICAgICAgICAgICAgICAgIC8qIG9mZnNldCAzMSAqLwoKfSBHVF9TVEFUU19DT1VOVEVSX1NFVDM7CgoKdHlwZWRlZiBlbnVtCnsKICAgIFNUQVRTM19Jbkdvb2RPY3RldHNMbyA9IDAsCiAgICBTVEFUUzNfSW5Hb29kT2N0ZXRzSGksCiAgICBTVEFUUzNfSW5CYWRPY3RldHMsCiAgICAKICAgIFNUQVRTM19PdXRGQ1NFcnIsCiAgICBTVEFUUzNfSW5VbmljYXN0cywKICAgIFNUQVRTM19EZWZlcnJlZCwgICAgICAgICAgICAvKiBvZmZzZXQgNSAqLwogICAgU1RBVFMzX0luQnJvYWRjYXN0cywKICAgIFNUQVRTM19Jbk11bHRpY2FzdHMsCiAgICBTVEFUUzNfNjRPY3RldHMsCiAgICBTVEFUUzNfMTI3T2N0ZXRzLAogICAgU1RBVFMzXzI1NU9jdGV0cywgICAgICAgICAgICAvKiBvZmZzZXQgMTAgKi8KICAgIFNUQVRTM181MTFPY3RldHMsCiAgICBTVEFUUzNfMTAyM09jdGV0cywKICAgIFNUQVRTM19NYXhPY3RldHMsCiAgICBTVEFUUzNfT3V0T2N0ZXRzTG8sCiAgICBTVEFUUzNfT3V0T2N0ZXRzSGksCiAgICBTVEFUUzNfT3V0VW5pY2FzdHMsICAgICAgICAvKiBvZmZzZXQgMTYgKi8KICAgIFNUQVRTM19FeGNlc3NpdmUsCiAgICBTVEFUUzNfT3V0TXVsdGljYXN0cywKICAgIFNUQVRTM19PdXRCcm9hZGNhc3RzLAogICAgU1RBVFMzX1NpbmdsZSwKICAgIFNUQVRTM19PdXRQYXVzZSwKICAgIFNUQVRTM19JblBhdXNlLAogICAgU1RBVFMzX011bHRpcGxlLAogICAgU1RBVFMzX1VuZGVyc2l6ZSwgICAgICAgICAgICAvKiBvZmZzZXQgMjQgKi8KICAgIFNUQVRTM19GcmFnbWVudHMsCiAgICBTVEFUUzNfT3ZlcnNpemUsCiAgICBTVEFUUzNfSmFiYmVyLAogICAgU1RBVFMzX0luTUFDUmN2RXJyLAogICAgU1RBVFMzX0luRkNTRXJyLAogICAgU1RBVFMzX0NvbGxpc2lvbnMsCiAgICBTVEFUUzNfTGF0ZSAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IDMxICovCgp9IEdUX1NUQVRTX0NPVU5URVJTMzsKCi8qIFN3aXRjaCBNYWMvV29sL1dvZiBkZWZpbml0aW9ucyAqLwoKLyoKICogdHlwZWRlZjogc3RydWN0IEdUXzEwMDBUX01BU1RFUl9TTEFWRQogKgogKiBEZXNjcmlwdGlvbjogMTAwMEJhc2UtVCBNYXN0ZXIvU2xhdmUgQ29uZmlndXJhdGlvbgogKgogKiBGaWVsZHM6CiAqICAgICAgYXV0b0NvbmZpZyAgIC0gR1RfVFJVRSBmb3IgYXV0by1jb25maWcsIEdUX0ZBTFNFIGZvciBtYW51YWwgc2V0dXAuCiAqICAgICAgbWFzdGVyUHJlZmVyIC0gR1RfVFJVRSBpZiBNYXN0ZXIgY29uZmlndXJhdGlvbiBpcyBwcmVmZXJyZWQuCiAqCiAqLwp0eXBlZGVmIHN0cnVjdCBfR1RfMTAwMFRfTUFTVEVSX1NMQVZFCnsKICAgIEdUX0JPT0wgICAgYXV0b0NvbmZpZzsKICAgIEdUX0JPT0wgbWFzdGVyUHJlZmVyOwp9IEdUXzEwMDBUX01BU1RFUl9TTEFWRTsKCgojZGVmaW5lIEdUX01ESV9QQUlSX05VTSAgICAgICAgIDQgICAgLyogKDEsMiksKDMsNiksKDQsNSksKDcsOCkgKi8KI2RlZmluZSBHVF9DSEFOTkVMX1BBSVJfTlVNICAgICAyICAgIC8qIChjaGFubmVsIEEsQiksKGNoYW5uZWwgQyxEKSAqLwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfUEhZX0xJTktfU1RBVFVTCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBMaW5rIFN0YXR1cwogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgICAgICBHVF9QSFlfTElOS19PRkYgICAgICAgIC0gTm8gTGluawogKiAgICAgICAgR1RfUEhZX0xJTktfQ09QUEVSICAgIC0gTGluayBvbiBDb3BwZXIKICogICAgICAgIEdUX1BIWV9MSU5LX0ZJQkVSICAgIC0gTGluayBvbiBGaWJlcgogKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1BIWV9MSU5LX09GRiA9IDAsCiAgICBHVF9QSFlfTElOS19DT1BQRVIgPSAxLAogICAgR1RfUEhZX0xJTktfRklCRVIgPSAyCn0gR1RfUEhZX0xJTktfU1RBVFVTOwoKCi8qIERlZmluaXRpb24gZm9yIHBhY2tldCBnZW5lcmF0b3IgKi8KCi8qIFBheWxvYWQgKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1BHX1BBWUxPQURfUkFORE9NID0gMCwgICAgLyogUHNldWRvLXJhbmRvbSAqLwogICAgR1RfUEdfUEFZTE9BRF81QUE1ICAgICAgICAvKiA1QSxBNSw1QSxBNSwuLi4gKi8KfSBHVF9QR19QQVlMT0FEOwoKLyogTGVuZ3RoICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9QR19MRU5HVEhfNjQgPSAwLCAgICAgICAgLyogNjQgYnl0ZXMgKi8KICAgIEdUX1BHX0xFTkdUSF8xNTE0Cn0gR1RfUEdfTEVOR1RIOwoKLyogRXJyb3IgKi8KdHlwZWRlZiBlbnVtCnsKICAgIEdUX1BHX1RYX05PUk1BTCA9IDAsICAgICAgICAvKiBObyBFcnJvciAqLwogICAgR1RfUEdfVFhfRVJST1IgICAgICAgICAgICAvKiBUeCBwYWNrZXRzIHdpdGggQ1JDIGVycm9yIGFuZCBTeW1ib2wgZXJyb3IgKi8KfSBHVF9QR19UWDsKCi8qIFN0cnVjdHVyZSBmb3IgcGFja2V0IGdlbmVyYXRvciAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9QR19QQVlMT0FEICBwYXlsb2FkOwogICAgR1RfUEdfTEVOR1RIICAgbGVuZ3RoOwogICAgR1RfUEdfVFggICAgICAgdHg7Cn0gR1RfUEc7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9URVNUX1NUQVRVUwogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgVkNUIHRlc3Qgc3RhdHVzCiAqCiAqIEVudW1lcmF0aW9uczoKICogICAgICBHVF9URVNUX0ZBSUwgICAgLSB2aXJ0dWFsIGNhYmxlIHRlc3QgZmFpbGVkLgogKiAgICAgIEdUX05PUk1BTF9DQUJMRSAtIG5vcm1hbCBjYWJsZS4KICogICAgICBHVF9JTVBFREFOQ0VfTUlTTUFUQ0ggLSBpbXBlZGFuY2UgbWlzbWF0Y2guCiAqICAgICAgR1RfT1BFTl9DQUJMRSAgIC0gb3BlbiBpbiBjYWJsZS4KICogICAgICBHVF9TSE9SVF9DQUJMRSAgLSBzaG9ydCBpbiBjYWJsZS4KICoKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9URVNUX0ZBSUwsCiAgICBHVF9OT1JNQUxfQ0FCTEUsCiAgICBHVF9JTVBFREFOQ0VfTUlTTUFUQ0gsCiAgICBHVF9PUEVOX0NBQkxFLAogICAgR1RfU0hPUlRfQ0FCTEUsCn0gR1RfVEVTVF9TVEFUVVM7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9OT1JNQUxfQ0FCTEVfTEVOCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBmb3Igbm9ybWFsIGNhYmxlIGxlbmd0aAogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgICAgR1RfTEVTU19USEFOXzUwTSAtIGNhYmxlIGxlbmd0aCBsZXNzIHRoYW4gNTAgbWV0ZXIuCiAqICAgICAgR1RfNTBNXzgwTSAgICAgICAtIGNhYmxlIGxlbmd0aCBiZXR3ZWVuIDUwIC0gODAgbWV0ZXIuCiAqICAgICAgR1RfODBNXzExME0gICAgICAtIGNhYmxlIGxlbmd0aCBiZXR3ZWVuIDgwIC0gMTEwIG1ldGVyLgogKiAgICAgIEdUXzExME1fMTQwTSAgICAgLSBjYWJsZSBsZW5ndGggYmV0d2VlbiAxMTAgLSAxNDAgbWV0ZXIuCiAqICAgICAgR1RfTU9SRV9USEFOXzE0MCAtIGNhYmxlIGxlbmd0aCBtb3JlIHRoYW4gMTQwIG1ldGVyLgogKiAgICAgIEdUX1VOS05PV05fTEVOICAgLSB1bmtub3duIGxlbmd0aC4KICoKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9MRVNTX1RIQU5fNTBNLAogICAgR1RfNTBNXzgwTSwKICAgIEdUXzgwTV8xMTBNLAogICAgR1RfMTEwTV8xNDBNLAogICAgR1RfTU9SRV9USEFOXzE0MCwKICAgIEdUX1VOS05PV05fTEVOLAoKfSBHVF9OT1JNQUxfQ0FCTEVfTEVOOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQ0FCTEVfTEVOCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBjYWJsZSBsZW5ndGgKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgIG5vcm1DYWJsZUxlbiAtIGNhYmxlIGxlbmdodCBmb3Igbm9ybWFsIGNhYmxlLgogKiAgICAgIGVyckNhYmxlTGVuICAtIGZvciBjYWJsZSBmYWlsdXJlIHRoZSBlc3RpbWF0ZSBmYXVsdCBkaXN0YW5jZSBpbiBtZXRlcnMuCiAqCiAqLwp0eXBlZGVmIHVuaW9uCnsKICAgIEdUX05PUk1BTF9DQUJMRV9MRU4gbm9ybUNhYmxlTGVuOwogICAgR1RfVTggICAgICAgICAgICAgICBlcnJDYWJsZUxlbjsKCn0gR1RfQ0FCTEVfTEVOOwoKLyoKICogdHlwZWRlZjogc3RydWN0IEdUX0NBQkxFX1NUQVRVUwogKgogKiBEZXNjcmlwdGlvbjogdmlydHVhbCBjYWJsZSBkaWFnbm9zdGljIHN0YXR1cyBwZXIgTURJIHBhaXIuCiAqCiAqIEZpZWxkczoKICogICAgICBjYWJsZVN0YXR1cyAtIFZDVCBjYWJsZSBzdGF0dXMuCiAqICAgICAgY2FibGVMZW4gICAgLSBWQ1QgY2FibGUgbGVuZ3RoLgogKiAgICBwaHlUeXBlICAgICAgICAtIHR5cGUgb2YgcGh5ICgxMDBNIHBoeSBvciBHaWdhYml0IHBoeSkKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1RFU1RfU1RBVFVTICBjYWJsZVN0YXR1c1tHVF9NRElfUEFJUl9OVU1dOwogICAgR1RfQ0FCTEVfTEVOICAgIGNhYmxlTGVuW0dUX01ESV9QQUlSX05VTV07CiAgICBHVF9VMTYgICAgICAgIHBoeVR5cGU7Cgp9IEdUX0NBQkxFX1NUQVRVUzsKCgovKgogKiB0eXBlZGVmOiBlbnVtIEdUX0NBQkxFX1RZUEUKICoKICogRGVzY3JpcHRpb246IEVudW1lcmF0aW9uIG9mIENhYmxlIFR5cGUKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgICAgR1RfU1RSQUlHSFRfQ0FCTEUgICAgXyBzdHJhaWdodCBjYWJsZQogKiAgICAgIEdUX0NST1NTT1ZFUl9DQUJMRSAgICAgLSBjcm9zc292ZXIgY2FibGUKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9TVFJBSUdIVF9DQUJMRSwKICAgIEdUX0NST1NTT1ZFUl9DQUJMRQoKfSBHVF9DQUJMRV9UWVBFOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfUlhfQ0hBTk5FTAogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgUmVjZWl2ZXIgQ2hhbm5lbCBBc3NpZ25tZW50CiAqCiAqIEVudW1lcmF0aW9uczoKICogICAgICAgIEdUX0NIQU5ORUxfQSAgIC0gQ2hhbm5lbCBBCiAqICAgICAgICBHVF9DSEFOTkVMX0IgICAtIENoYW5uZWwgQgogKiAgICAgICAgR1RfQ0hBTk5FTF9DICAgLSBDaGFubmVsIEMKICogICAgICAgIEdUX0NIQU5ORUxfRCAgIC0gQ2hhbm5lbCBECiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfQ0hBTk5FTF9BLAogICAgR1RfQ0hBTk5FTF9CLAogICAgR1RfQ0hBTk5FTF9DLAogICAgR1RfQ0hBTk5FTF9ECn0gR1RfUlhfQ0hBTk5FTDsKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfUE9MQVJJVFlfU1RBVFVTCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBwb2xhcml0eSBzdGF0dXMKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgICAgR1RfUE9TSVRJVkUgICAgLSBwb3NpdGl2ZSBwb2xhcml0eQogKiAgICAgIEdUX05FR0FUSVZFICAgIC0gbmVnYXRpdmUgcG9sYXJpdHkKICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9QT1NJVElWRSwKICAgIEdUX05FR0FUSVZFCgp9IEdUX1BPTEFSSVRZX1NUQVRVUzsKCgovKgogKiB0eXBlZGVmOiBzdHJ1Y3QgR1RfMTAwMEJUX0VYVEVOREVEX1NUQVRVUwogKgogKiBEZXNjcmlwdGlvbjogQ3VycmVudGx5IHRoZSAxMDAwQmFzZS1UIFBDUyBjYW4gZGV0ZXJtaW5lIHRoZSBjYWJsZSBwb2xhcml0eQogKiAgICAgICAgIG9uIHBhaXJzIEEsQixDLEQ7IGNyb3Nzb3ZlciBvbiBwYWlycyBBLEIgYW5kIEMsRDsgYW5kIHNrZXcgYW1vbmcgCiAqICAgICAgICB0aGUgcGFyZXMuIFRoZXNlIHN0YXR1cyBlbmhhbmNlIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSB2aXJ0dWFsIGNhYmxlIHRlc3RlcgogKgogKiBGaWVsZHM6CiAqICAgICAgaXNWYWxpZCAgICAgICAgLSBHVF9UUlVFIGlmIHRoaXMgc3RydWN0dXJlIGhhdmUgdmFsaWQgaW5mb3JtYXRpb24sIAogKiAgICAgICAgICAgICAgICAgICAgICAgR1RfRkFMU0Ugb3RoZXJ3aXNlLgogKiAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB2YWxpZCBvbmx5IGlmIDEwMDBCQVNFLVQgTGluayBpcyB1cC4KICogICAgICBwYWlyU3dhcCAgICAtIEdUX0NST1NTT1ZFUl9DQUJMRSwgaWYgdGhlIGNhYmxlIGlzIGNyb3Nzb3ZlciwKICogICAgICAgICAgICAgICAgICAgICAgR1RfU1RSQUlHSFRfQ0FCTEUsIG90aGVyd2lzZQogKiAgICAgICAgcGFpclBvbGFyaXR5LSBHVF9QT1NJVElWRSwgaWYgcG9sYXJpdHkgaXMgcG9zaXRpdmUsCiAqICAgICAgICAgICAgICAgICAgICAgIEdUX05FR0FUSVZFLCBvdGhlcndpc2UKICogICAgICAgIHBhaXJTa2V3ICAgIC0gcGFpciBza2V3IGluIHVuaXRzIG9mIG5zCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgICAgICAgICAgICAgIGlzVmFsaWQ7CiAgICBHVF9DQUJMRV9UWVBFICAgICAgICBwYWlyU3dhcFtHVF9DSEFOTkVMX1BBSVJfTlVNXTsKICAgIEdUX1BPTEFSSVRZX1NUQVRVUyAgICBwYWlyUG9sYXJpdHlbR1RfTURJX1BBSVJfTlVNXTsKICAgIEdUX1UzMiAgICAgICAgICAgICAgICBwYWlyU2tld1tHVF9NRElfUEFJUl9OVU1dOwoKfSBHVF8xMDAwQlRfRVhURU5ERURfU1RBVFVTOwoKLyoKICogdHlwZWRlZjogc3RydWN0IEdUX0FEVl9FWFRFTkRFRF9TVEFUVVMKICoKICogRGVzY3JpcHRpb246IEN1cnJlbnRseSB0aGUgMTAwMEJhc2UtVCBQQ1MgY2FuIGRldGVybWluZSB0aGUgY2FibGUgcG9sYXJpdHkKICogICAgICAgICBvbiBwYWlycyBBLEIsQyxEOyBjcm9zc292ZXIgb24gcGFpcnMgQSxCIGFuZCBDLEQ7IGFuZCBza2V3IGFtb25nIAogKiAgICAgICAgdGhlIHBhcmVzLiBUaGVzZSBzdGF0dXMgZW5oYW5jZSB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgdmlydHVhbCBjYWJsZSB0ZXN0ZXIKICoKICogRmllbGRzOgogKiAgICAgIGlzVmFsaWQgICAgICAgIC0gR1RfVFJVRSBpZiB0aGlzIHN0cnVjdHVyZSBoYXZlIHZhbGlkIGluZm9ybWF0aW9uLCAKICogICAgICAgICAgICAgICAgICAgICAgIEdUX0ZBTFNFIG90aGVyd2lzZS4KICogICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdmFsaWQgb25seSBpZiAxMDAwQkFTRS1UIExpbmsgaXMgdXAuCiAqICAgICAgcGFpclN3YXAgICAgLSBSZWNlaXZlIGNoYW5uZWwgYXNzaWduZW1lbnQKICogICAgICAgIHBhaXJQb2xhcml0eS0gR1RfUE9TSVRJVkUsIGlmIHBvbGFyaXR5IGlzIHBvc2l0aXZlLAogKiAgICAgICAgICAgICAgICAgICAgICBHVF9ORUdBVElWRSwgb3RoZXJ3aXNlCiAqICAgICAgICBwYWlyU2tldyAgICAtIHBhaXIgc2tldyBpbiB1bml0cyBvZiBucwogKiAgICAgICAgY2FibGVMZW4gICAgLSBjYWJsZSBsZW5ndGggYmFzZWQgb24gRFNQCiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9CT09MICAgICAgICAgICAgaXNWYWxpZDsKICAgIEdUX1JYX0NIQU5ORUwgICAgICBwYWlyU3dhcFtHVF9NRElfUEFJUl9OVU1dOwogICAgR1RfUE9MQVJJVFlfU1RBVFVTIHBhaXJQb2xhcml0eVtHVF9NRElfUEFJUl9OVU1dOwogICAgR1RfVTMyICAgICAgICAgICAgIHBhaXJTa2V3W0dUX01ESV9QQUlSX05VTV07CiAgICBHVF9VMzIgICAgICAgICAgICAgICAgY2FibGVMZW5bR1RfTURJX1BBSVJfTlVNXTsKfSBHVF9BRFZfRVhURU5ERURfU1RBVFVTOwoKCi8qCiAqIGlmIGlzR2lnUGh5IGluIEdUX0NBQkxFX1NUQVRVUyBpcyBub3QgR1RfVFJVRSwgY2FibGVTdGF0dXMgYW5kIGNhYmxlTGVuIAogKiB3aWxsIGhhdmUgb25seSAyIHBhaXJzIGF2YWlsYWJsZS4KICogT25lIGlzIFJYIFBhaXIgYW5kIHRoZSBvdGhlciBpcyBUWCBQYWlyLgogKi8KI2RlZmluZSBNRElfUlhfUEFJUiAgICAgICAgMCAgICAvKiBjYWJsZVN0YXR1c1swXSBvciBjYWJsZUxlblswXSAqLwojZGVmaW5lIE1ESV9UWF9QQUlSICAgICAgICAxICAgIC8qIGNhYmxlU3RhdHVzWzFdIG9yIGNhYmxlTGVuWzFdICovCgovKiBkZWZpbml0aW9uIGZvciBQaHkgVHlwZSAqLwojZGVmaW5lIFBIWV8xMDBNICAgICAgICAwIC8qIDEwLzEwME0gcGh5LCBFMzA4MiBvciBFMzA4MyAqLwojZGVmaW5lIFBIWV8xMDAwTSAgICAgICAgMSAvKiBHaWdhYml0IHBoeSwgdGhlIHJlc3QgcGh5cyAqLwojZGVmaW5lIFBIWV8xMDAwME0gICAgICAgIDIgLyogMTAgR2lnYWJpdCBwaHksIHVudXNlZCAqLwojZGVmaW5lIFBIWV8xMDAwTV9CICAgICAgICAzIC8qIEdpZ2FiaXQgcGh5IHdoaWNoIG5lZWRzIHdvcmstYXJvdW5kICovCiNkZWZpbmUgUEhZXzEwMDBNX01QICAgIDQgLyogR2lnYWJpdCBwaHkgd2l0aCBtdWx0aXBsZSBwYWdlIG1vZGUgKi8KCgovKiBEZWZpbml0aW9uIGZvciBBZHZhbmNlIFZpcnR1YWwgQ2FibGUgVGVzdCAqLwoKLyoKICogdHlwZWRlZjogZW51bSBHVF9BRFZfVkNUX1RSQU5TX0NIQU5fU0VMCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBBZHZhbmNlZCBWQ1QgVHJhbnNtaXR0ZXIgY2hhbm5lbCBzZWxlY3QKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgICAgR1RfQURWX1ZDVF9OT19DUk9TU1BBSVIgLSBUcmFuc21pdHRlciBjaGFubmVsIHNlbGVjdCBpcyAwMDAKICogICAgICAgIEdUX0FEVl9WQ1RfQ1JPU1NQQUlSICAgIC0gVHJhbnNtaXR0ZXIgY2hhbm5lbHNlbGVjdCBpcyAxMDAvMTAxLzExMC8xMTEKICovCnR5cGVkZWYgZW51bQp7CiAgICAvKiBBZHZhbmNlZCBWQ1QgTW9kZSAqLwogICAgR1RfQURWX1ZDVF9UQ1NfTk9fQ1JPU1NQQUlSICAgICAgICA9IDAsCiAgICBHVF9BRFZfVkNUX1RDU19DUk9TU1BBSVJfMCAgICAgICAgICAgID0gMHg0LAogICAgR1RfQURWX1ZDVF9UQ1NfQ1JPU1NQQUlSXzEgICAgICAgICAgICA9IDB4NSwKICAgIEdUX0FEVl9WQ1RfVENTX0NST1NTUEFJUl8yICAgICAgICAgICAgPSAweDYsCiAgICBHVF9BRFZfVkNUX1RDU19DUk9TU1BBSVJfMyAgICAgICAgICAgID0gMHg3Cn0gR1RfQURWX1ZDVF9UUkFOU19DSEFOX1NFTDsKCgp0eXBlZGVmIGVudW0KewogICAgLyogQWR2YW5jZWQgVkNUIE1vZGUgKi8KICAgIEdUX0FEVl9WQ1RfU0FWR18yICAgICAgICA9IDAsCiAgICBHVF9BRFZfVkNUX1NBVkdfNCAgICAgICAgPSAxLAogICAgR1RfQURWX1ZDVF9TQVZHXzggICAgICAgID0gMiwKICAgIEdUX0FEVl9WQ1RfU0FWR18xNiAgICAgICAgPSAzLAogICAgR1RfQURWX1ZDVF9TQVZHXzMyICAgICAgICA9IDQsCiAgICBHVF9BRFZfVkNUX1NBVkdfNjQgICAgICAgID0gNSwKICAgIEdUX0FEVl9WQ1RfU0FWR18xMjggICAgPSA2LAogICAgR1RfQURWX1ZDVF9TQVZHXzI1NiAgICA9IDcKfSBHVF9BRFZfVkNUX1NBTVBMRV9BVkc7Cgp0eXBlZGVmIGVudW0KewogICAgLyogQWR2YW5jZWQgVkNUIE1vZGUgKi8KICAgIEdUX0FEVl9WQ1RfTUFYX1BFQUsgICAgICAgID0weDAwLAogICAgR1RfQURWX1ZDVF9GSVJTVF9QRUFLICAgICAgICA9MHgwMSwKfSBHVF9BRFZfVkNUX01PRDsKCgp0eXBlZGVmIHVuc2lnbmVkIGludCBHVF9BRFZfVkNUX1BFQUtERVRfSFlTVDsKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQURWX1ZDVF9NT0RFCiAqCiAqIERlc2NyaXB0aW9uOiBFbnVtZXJhdGlvbiBvZiBBZHZhbmNlZCBWQ1QgTW9kZSBhbmQgVHJhbnNtaXR0ZXIgY2hhbm5lbCBzZWxlY3QKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgIEdUX0FEVl9WQ1RfRklSU1RfUEVBSyAgIC0gZmlyc3QgcGVhayBhYm92ZSBhIGNlcnRhaW4gdGhyZXNob2xkIGlzIHJlcG9ydGVkLgogKiAgICAgIEdUX0FEVl9WQ1RfTUFYX1BFQUsgICAgIC0gbWF4aW11bSBwZWFrIGFib3ZlIGEgY2VydGFpbiB0aHJlc2hvbGQgaXMgcmVwb3J0ZWQuCiAqICAgICAgICBHVF9BRFZfVkNUX09GRlNFICAgICAgICAgLSBvZmZzZXQKICogICAgICAgIEdUX0FEVl9WQ1RfU0FNUExFX1BPSU5UIC0gc2FtcGxlIHBvaW50CiAqCiAqICAgICAgICBHVF9BRFZfVkNUX05PX0NST1NTUEFJUiAtIFRyYW5zbWl0dGVyIGNoYW5uZWwgc2VsZWN0IGlzIDAwMAogKiAgICAgICAgR1RfQURWX1ZDVF9DUk9TU1BBSVIgICAgLSBUcmFuc21pdHRlciBjaGFubmVsc2VsZWN0IGlzIDEwMC8xMDEvMTEwLzExMQogKiAgIEV4YW1wbGU6IG1vZGUgPSBHVF9BRFZfVkNUX0ZJUlNUX1BFQUsgfCBHVF9BRFZfVkNUX0NST1NTUEFJUi4KICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX0FEVl9WQ1RfTU9EICAgICAgICAgICAgICAgICAgICBtb2RlOwogICAgR1RfQURWX1ZDVF9UUkFOU19DSEFOX1NFTCAgICAgIHRyYW5zQ2hhblNlbDsKICAgIEdUX0FEVl9WQ1RfU0FNUExFX0FWRyAgICAgICAgICAgIHNhbXBsZUF2ZzsKICAgIEdUX0FEVl9WQ1RfUEVBS0RFVF9IWVNUICAgICAgICBwZWFrRGV0SHlzdDsKfSBHVF9BRFZfVkNUX01PREU7CgoKLyoKICogdHlwZWRlZjogZW51bSBHVF9BRFZfVkNUX1NUQVRVUwogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gb2YgQWR2YW5jZWQgVkNUIHN0YXR1cwogKgogKiBFbnVtZXJhdGlvbnM6CiAqICAgICAgR1RfQURWX1ZDVF9GQUlMICAgICAtIGFkdmFuY2VkIHZpcnR1YWwgY2FibGUgdGVzdCBmYWlsZWQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJsZSBsZW5naCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KICogICAgICBHVF9BRFZfVkNUX05PUk1BTCAgIC0gbm9ybWFsIGNhYmxlLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FibGUgbGVuZ2ggbWF5IG5vdCBiZSBkZXRlcm1pbmVkLgogKiAgICAgIEdUX0FEVl9WQ1RfSU1QX0dSRUFURVJfVEhBTl8xMTUgLSBpbXBlZGFuY2UgbWlzbWF0Y2ggPiAxMTUgb2htcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FibGUgbGVuZ2ggaXMgdmFsaWQuCiAqICAgICAgR1RfQURWX1ZDVF9JTVBfTEVTU19USEFOXzg1IC0gaW1wZWRhbmNlIG1pc21hdGNoIDwgODUgb2htcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FibGUgbGVuZ2ggaXMgdmFsaWQuCiAqICAgICAgR1RfQURWX1ZDVF9PUEVOICAgICAgLSBjYWJsZSBvcGVuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJsZSBsZW5naCBpcyB2YWxpZC4KICogICAgICBHVF9BRFZfVkNUX1NIT1JUICAgICAgLSBjYWJsZSBzaG9ydGVkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJsZSBsZW5naCBpcyB2YWxpZC4KICogICAgICBHVF9BRFZfVkNUX0NST1NTX1BBSVJfU0hPUlQgLSBjcm9zcyBwYWlyIHNob3J0LgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FibGUgbGVuZ2ggZm9yIGVhY2ggY2hhbm5lbCBpcyB2YWxpZC4KICovCnR5cGVkZWYgZW51bQp7CiAgICBHVF9BRFZfVkNUX0ZBSUwsCiAgICBHVF9BRFZfVkNUX05PUk1BTCwKICAgIEdUX0FEVl9WQ1RfSU1QX0dSRUFURVJfVEhBTl8xMTUsCiAgICBHVF9BRFZfVkNUX0lNUF9MRVNTX1RIQU5fODUsCiAgICBHVF9BRFZfVkNUX09QRU4sCiAgICBHVF9BRFZfVkNUX1NIT1JULAogICAgR1RfQURWX1ZDVF9DUk9TU19QQUlSX1NIT1JUCn0gR1RfQURWX1ZDVF9TVEFUVVM7CgoKLyoKICogdHlwZWRlZjogc3RydWN0IEdUX0NST1NTX1BBSVJfTElTVAogKgogKiBEZXNjcmlwdGlvbjogc3RydWN1dHVyZSBmb3IgY3Jvc3MgcGFpciBzaG9ydCBjaGFubmVscy4KICoKICogRmllbGRzOgogKiAgICAgIGNoYW5uZWwgLSBjcm9zcyBwYWlyIHNob3J0IGNoYW5uZWwgbGlzdAogKiAgICAgICAgICAgICAgICBjaGFubmVsW2ldIGlzIEdUX1RSVUUgaWYgdGhlIGNoYW5uZWxbaV0gaXMgY3Jvc3MgcGFpciBzaG9ydAogKiAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IGNoYW5uZWwgdW5kZXIgdGVzdC4KICogICAgICBkaXN0MmZhdWx0IC0gZXN0aW1hdGVkIGRpc3RhbmNlIHRvIHRoZSBzaG9ydGVkIGxvY2F0aW9uLgogKiAgICAgICAgICAgICAgICAgICB2YWxpZCBvbmx5IGlmIHJlbGF0ZWQgY2hhbm5lbCAoYWJvdmUpIGlzIEdUX1RSVUUuCiAqLwp0eXBlZGVmIHN0cnVjdCBfR1RfQ1JPU1NfU0hPUlRfTElTVAp7CiAgICBHVF9CT09MICAgIGNoYW5uZWxbR1RfTURJX1BBSVJfTlVNXTsKICAgIEdUXzE2ICAgICBkaXN0MmZhdWx0W0dUX01ESV9QQUlSX05VTV07Cn0gR1RfQ1JPU1NfU0hPUlRfTElTVDsKCgovKgogKiB0eXBlZGVmOiBzdHJ1Y3QgR1RfQURWX0NBQkxFX1NUQVRVUwogKgogKiBEZXNjcmlwdGlvbjogc3RydWN1dHVyZSBmb3IgYWR2YW5jZWQgY2FibGUgc3RhdHVzLgogKgogKiBGaWVsZHM6CiAqICAgICAgY2FibGVTdGF0dXMgLSBWQ1QgY2FibGUgc3RhdHVzIGZvciBlYWNoIGNoYW5uZWwuCiAqICAgICAgY3Jvc3NTaG9ydCAgLSBjcm9zcyBwYWlyIHNob3J0IGxpc3QgZm9yIGVhY2ggY2hhbm5lbC4gCiAqICAgICAgICAgICAgICAgICAgICBWYWxpZCBvbmx5IGlmIHJlbGF0aXZlIGNhYmxlU3RhdHVzIGlzIEdUX0FEVl9WQ1RfQ1JPU1NfUEFJUl9TSE9SVC4KICogICAgICBkaXN0MmZhdWx0ICAtIGVzdGltYXRlZCBkaXN0YW5jZSB0byBmYXVsdCBmb3IgZWFjaCBjaGFubmVsLgogKiAgICAgICAgICAgICAgICAgICAgVmFsaWQgaWYgcmVsYXRpdmUgY2FibGVTdGF0dXMgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmdzOgogKiAgICAgICAgICAgICAgICAgICAgICBHVF9BRFZfVkNUX05PUk1BTAogKiAgICAgICAgICAgICAgICAgICAgICBHVF9BRFZfVkNUX0lNUF9HUkVBVEVSX1RIQU5fMTE1CiAqICAgICAgICAgICAgICAgICAgICAgIEdUX0FEVl9WQ1RfSU1QX0xFU1NfVEhBTl84NSwKICogICAgICAgICAgICAgICAgICAgICAgR1RfQURWX1ZDVF9PUEVOLCBvcgogKiAgICAgICAgICAgICAgICAgICAgICAgIEdUX0FEVl9WQ1RfU0hPUlQKICAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9BRFZfVkNUX1NUQVRVUyAgIGNhYmxlU3RhdHVzW0dUX01ESV9QQUlSX05VTV07CiAgICB1bmlvbiB7CiAgICAgICAgR1RfQ1JPU1NfU0hPUlRfTElTVCBjcm9zc1Nob3J0OwogICAgICAgIEdUXzE2ICAgICBkaXN0MmZhdWx0OwogICAgfXVbR1RfTURJX1BBSVJfTlVNXTsKfSBHVF9BRFZfQ0FCTEVfU1RBVFVTOwoKCi8qCiAqIERlZmluaXRpb246CiAqICAgICAgICBHVF9MRURfTElOS19BQ1RfU1BFRUQgICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSBsaW5rLCBibGluayA9IGFjdGl2aXR5LCBibGluayBzcGVlZCA9IGxpbmsgc3BlZWQKICogICAgICAgIEdUX0xFRF9MSU5LX0FDVCAgICAgICAgICAgICAtIG9mZiA9IG5vIGxpbmssIG9uID0gbGluaywgYmxpbmsgPSBhY3Rpdml0eQogKiAgICAgICAgR1RfTEVEX0xJTksgICAgICAgICAgICAgICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSBsaW5rCiAqICAgICAgICBHVF9MRURfMTBfTElOS19BQ1QgICAgICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSAxMCwgYmxpbmsgPSBhY3Rpdml0eQogKiAgICAgICAgR1RfTEVEXzEwX0xJTksgICAgICAgICAgICAtIG9mZiA9IG5vIGxpbmssIG9uID0gMTAKICogICAgICAgIEdUX0xFRF8xMDBfTElOS19BQ1QgICAgICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSAxMDAgbGluaywgYmxpbmsgPSBhY3Rpdml0eQogKiAgICAgICAgR1RfTEVEXzEwMF9MSU5LICAgICAgICAgICAgLSBvZmYgPSBubyBsaW5rLCBvbiA9IDEwMCBsaW5rCiAqICAgICAgICBHVF9MRURfMTAwMF9MSU5LX0FDVCAgICAtIG9mZiA9IG5vIGxpbmssIG9uID0gMTAwMCBsaW5rLCBibGluayA9IGFjdGl2aXR5CiAqICAgICAgICBHVF9MRURfMTAwMF9MSU5LICAgICAgICAtIG9mZiA9IG5vIGxpbmssIG9uID0gMTAwMCBsaW5rCiAqICAgICAgICBHVF9MRURfMTBfMTAwX0xJTktfQUNUICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSAxMCBvciAxMDAgbGluaywgYmxpbmsgPSBhY3Rpdml0eQogKiAgICAgICAgR1RfTEVEXzEwXzEwMF9MSU5LICAgICAgICAtIG9mZiA9IG5vIGxpbmssIG9uID0gMTAgb3IgMTAwIGxpbmsKICogICAgICAgIEdUX0xFRF8xMF8xMDAwX0xJTktfQUNUICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSAxMCBvciAxMDAwIGxpbmssIGJsaW5rID0gYWN0aXZpdHkKICogICAgICAgIEdUX0xFRF8xMF8xMDAwX0xJTksgICAgICAgIC0gb2ZmID0gbm8gbGluaywgb24gPSAxMCBvciAxMDAwIGxpbmsKICogICAgICAgIEdUX0xFRF8xMDBfMTAwMF9MSU5LX0FDVC0gb2ZmID0gbm8gbGluaywgb24gPSAxMDAgb3IgMTAwMCBsaW5rLCBibGluayA9IGFjdGl2aXR5CiAqICAgICAgICBHVF9MRURfMTAwXzEwMDBfTElOSyAgICAtIG9mZiA9IG5vIGxpbmssIG9uID0gMTAwIG9yIDEwMDAgbGluawogKiAgICAgICAgR1RfTEVEX1NQRUNJQUwgICAgICAgICAgICAtIHNwZWNpYWwgbGVkcwogKiAgICAgICAgR1RfTEVEX0RVUExFWF9DT0wgICAgICAgIC0gb2ZmID0gaGFsZiBkdXBseCwgb24gPSBmdWxsIGR1cGxleCwgYmxpbmsgPSBjb2xsaXNpb24KICogICAgICAgIEdUX0xFRF9BQ1RJVklUWSAgICAgICAgICAgIC0gb2ZmID0gbm8gbGluaywgYmxpbmsgb24gPSBhY3Rpdml0eQogKiAgICAgICAgR1RfTEVEX1BUUF9BQ1QgICAgICAgICAgICAtIGJsaW5rIG9uID0gUFRQIGFjdGl2aXR5CiAqICAgICAgICBHVF9MRURfRk9SQ0VfQkxJTksgICAgICAgIC0gZm9yY2UgYmxpbmsKICogICAgICAgIEdUX0xFRF9GT1JDRV9PRkYgICAgICAgIC0gZm9yY2Ugb2ZmCiAqICAgICAgICBHVF9MRURfRk9SQ0VfT04gICAgICAgICAgICAtIGZvcmNlIG9uCiovCiNkZWZpbmUgR1RfTEVEX0xJTktfQUNUX1NQRUVEICAgICAgICAxCiNkZWZpbmUgR1RfTEVEX0xJTktfQUNUICAgICAgICAgICAgMgojZGVmaW5lIEdUX0xFRF9MSU5LICAgICAgICAgICAgICAgIDMKI2RlZmluZSBHVF9MRURfMTBfTElOS19BQ1QgICAgICAgICAgICA0CiNkZWZpbmUgR1RfTEVEXzEwX0xJTksgICAgICAgICAgICAgICAgNQojZGVmaW5lIEdUX0xFRF8xMDBfTElOS19BQ1QgICAgICAgIDYKI2RlZmluZSBHVF9MRURfMTAwX0xJTksgICAgICAgICAgICA3CiNkZWZpbmUgR1RfTEVEXzEwMDBfTElOS19BQ1QgICAgICAgIDgKI2RlZmluZSBHVF9MRURfMTAwMF9MSU5LICAgICAgICAgICAgOQojZGVmaW5lIEdUX0xFRF8xMF8xMDBfTElOS19BQ1QgICAgICAgIDEwCiNkZWZpbmUgR1RfTEVEXzEwXzEwMF9MSU5LICAgICAgICAgICAgMTEKI2RlZmluZSBHVF9MRURfMTBfMTAwMF9MSU5LX0FDVCAgICAxMgojZGVmaW5lIEdUX0xFRF8xMF8xMDAwX0xJTksgICAgICAgIDEzCiNkZWZpbmUgR1RfTEVEXzEwMF8xMDAwX0xJTktfQUNUICAgIDE0CiNkZWZpbmUgR1RfTEVEXzEwMF8xMDAwX0xJTksgICAgICAgIDE1CiNkZWZpbmUgR1RfTEVEX1NQRUNJQUwgICAgICAgICAgICAgICAgMTYKI2RlZmluZSBHVF9MRURfRFVQTEVYX0NPTCAgICAgICAgICAgIDE3CiNkZWZpbmUgR1RfTEVEX0FDVElWSVRZICAgICAgICAgICAgMTgKI2RlZmluZSBHVF9MRURfUFRQX0FDVCAgICAgICAgICAgICAgICAxOQojZGVmaW5lIEdUX0xFRF9GT1JDRV9CTElOSyAgICAgICAgICAgIDIwCiNkZWZpbmUgR1RfTEVEX0ZPUkNFX09GRiAgICAgICAgICAgIDIxCiNkZWZpbmUgR1RfTEVEX0ZPUkNFX09OICAgICAgICAgICAgMjIKI2RlZmluZSBHVF9MRURfUkVTRVJWRSAgICAgICAgICAgICAgICAyMwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfTEVEX0NGRwogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gZm9yIExFRCBjb25maWd1cmF0aW9uIHR5cGUKICoKICogRW51bWVyYXRpb25zOgogKiAgICAgICAgR1RfTEVEX0NGR19MRUQwICAgICAgICAtIHJlYWQvd3JpdGUgbGVkMCB2YWx1ZSAoR1RfTEVEX3h4eCBkZWZpbml0aW9uKQogKiAgICAgICAgR1RfTEVEX0NGR19MRUQxICAgICAgICAtIHJlYWQvd3JpdGUgbGVkMSB2YWx1ZQogKiAgICAgICAgR1RfTEVEX0NGR19MRUQyICAgICAgICAtIHJlYWQvd3JpdGUgbGVkMiB2YWx1ZQogKiAgICAgICAgR1RfTEVEX0NGR19MRUQzICAgICAgICAtIHJlYWQvd3JpdGUgbGVkMyB2YWx1ZQogKiAgICAgICAgR1RfTEVEX0NGR19QVUxTRV9TVFJFVENIICAgIC0gcmVhZC93cml0ZSBwdWxzZSBzdHJldGNoICgwIH4gNCkKICogICAgICAgIEdUX0xFRF9DRkdfQkxJTktfUkFURSAgICAgICAgLSByZWFkL3dyaXRlIGJsaW5rIHJhdGUgICAgKDAgfiA1KQogKiAgICAgICAgR1RfTEVEX0NGR19TUEVDSUFMX0NPTlRST0wgICAgLSByZWFkL3dyaXRlIHNwZWNpYWwgY29udHJvbCAocG9ydCB2ZWN0b3IpCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfTEVEX0NGR19MRUQwLAogICAgR1RfTEVEX0NGR19MRUQxLAogICAgR1RfTEVEX0NGR19MRUQyLAogICAgR1RfTEVEX0NGR19MRUQzLAogICAgR1RfTEVEX0NGR19QVUxTRV9TVFJFVENILAogICAgR1RfTEVEX0NGR19CTElOS19SQVRFLAogICAgR1RfTEVEX0NGR19TUEVDSUFMX0NPTlRST0wKfSBHVF9MRURfQ0ZHOwoKCi8qCiAqIHR5cGVkZWY6IGVudW0gR1RfQVZCX1JFQ09WRVJFRF9DTE9DSwogKgogKiBEZXNjcmlwdGlvbjogRW51bWVyYXRpb24gZm9yIHJlY292ZXJlZCBjbG9jayB0eXBlCiAqCiAqIEVudW1lcmF0aW9uczoKICogICAgICAgIEdUX1BSSU1BUllfUkVDT1ZFUkVEX0NMT0NLICAgICAgICAgLSBwcmltYXJ5IHJlY292ZXJlZCBjbG9jawogKiAgICAgICAgR1RfU0VDT05EQVJZX1JFQ09WRVJFRF9DTE9DSyAgICAgLSBzZWNvbmRhcnkgcmVjb3ZlcmVkIGNsb2NrCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfUFJJTUFSWV9SRUNPVkVSRURfQ0xPQ0ssCiAgICBHVF9TRUNPTkRBUllfUkVDT1ZFUkVEX0NMT0NLCn0gR1RfQVZCX1JFQ09WRVJFRF9DTE9DSzsKCgovKiBEZWZpbmUgUUFWIGludGVycnVwdCBiaXRzICovCgojZGVmaW5lIEdUX1FBVl9JTlRfU1RBVFVTX0VOUV9MTVRfQklUICAgICAgICAgICAgMHg4MDAwICAgIC8qIEVuUSBMaW1pdCBJbnRlcnJ1cHQgRW5hYmxlICovCiNkZWZpbmUgR1RfUUFWX0lOVF9TVEFUVVNfSVNPX0RFTF9CSVQgICAgICAgICAgICAweDA0MDAgICAgLyogSXNvIERlbGF5IEludGVycnVwdCBFbmFibGUgKi8KI2RlZmluZSBHVF9RQVZfSU5UX1NUQVRVU19JU09fRElTX0JJVCAgICAgICAgICAgIDB4MDIwMCAgLyogSXNvIERpc2NhcmQgSW50ZXJydXB0IEVuYWJsZSAqLwojZGVmaW5lIEdUX1FBVl9JTlRfU1RBVFVTX0lTT19MSU1JVF9FWF9CSVQgICAgICAgIDB4MDEwMCAgLyogSXNvIFBhY2tldCBNZW1vcnkgRXhjZWVkZWQgSW50ZXJydXB0IEVuYWJsZSAqLwoKI2RlZmluZSBHVF9RQVZfSU5UX0VOQUJMRV9FTlFfTE1UX0JJVCAgICAgICAgICAgIDB4ODAgIC8qIEVuUSBMaW1pdCBJbnRlcnJ1cHQgRW5hYmxlICovCiNkZWZpbmUgR1RfUUFWX0lOVF9FTkFCTEVfSVNPX0RFTF9CSVQgICAgICAgICAgICAweDA0ICAvKiBJc28gRGVsYXkgSW50ZXJydXB0IEVuYWJsZSAqLwojZGVmaW5lIEdUX1FBVl9JTlRfRU5BQkxFX0lTT19ESVNfQklUICAgICAgICAgICAgMHgwMiAgLyogSXNvIERpc2NhcmQgSW50ZXJydXB0IEVuYWJsZSAqLwojZGVmaW5lIEdUX1FBVl9JTlRfRU5BQkxFX0lTT19MSU1JVF9FWF9CSVQgICAgICAgIDB4MDEgIC8qIElzbyBQYWNrZXQgTWVtb3J5IEV4Y2VlZGVkIEludGVycnVwdCBFbmFibGUgKi8KCgovKgogKiBUeXBlZGVmOiBlbnVtIEdUX0VFUFJPTV9PUEVSQVRJT04KICoKICogRGVzY3JpcHRpb246IERlZmluZXMgdGhlIEVFUFJPTSBPcGVyYXRpb24gdHlwZQogKgogKiBGaWVsZHM6CiAqICAgICAgUFRQX1dSSVRFX0RBVEEgICAgICAgICAgICAgLSBXcml0ZSBkYXRhIHRvIHRoZSBFRVBST00gcmVnaXN0ZXIKICogICAgICBQVFBfUkVBRF9EQVRBICAgICAgICAgICAgLSBSZWFkIGRhdGEgZnJvbSBFRVBST00gcmVnaXN0ZXIKICogICAgICBQVFBfUkVTVEFSVCAgICAgICAgICAgICAgICAtIFJlc3RhcnQgRUVQUk9NIG9wcml0aW9uCiAqLwp0eXBlZGVmIGVudW0KewogICAgR1RfRUVQUk9NX05PX09QICAgICAgICAgICAgICAgICAgICAgPSAweDAsCiAgICBHVF9FRVBST01fV1JJVEVfREFUQSAgICAgICAgICAgICA9IDB4MywKICAgIEdUX0VFUFJPTV9SRUFEX0RBVEEgICAgICAgICAgICAgID0gMHg0LAogICAgR1RfRUVQUk9NX1JFU1RBUlQgICAgICAgICAgICAgICAgPSAweDYsCiAgICBHVF9FRVBST01fSEFMVCAgICAgICAgICAgICAgICAgICAgPSAweDcsCn0gR1RfRUVQUk9NX09QRVJBVElPTjsKCgovKgogKiAgdHlwZWRlZjogc3RydWN0IEdUX0VFUFJPTV9PUF9EQVRBCiAqCiAqICBEZXNjcmlwdGlvbjogZGF0YSByZXF1aXJlZCBieSBFRVBST00gT3BlcmF0aW9uCiAqCiAqICBGaWVsZHM6CiAqICAgICAgZWVwcm9tUG9ydCAgICAgICAgLSBwaHlzaWNhbCBwb3J0IG9mIHRoZSBkZXZpY2UKICogICAgICBlZXByb21BZGRyICAgICAtIHJlZ2lzdGVyIGFkZHJlc3MKICogICAgICBlZXByb21EYXRhICAgICAtIGRhdGEgZm9yIHB0cCByZWdpc3Rlci4KICovCnR5cGVkZWYgc3RydWN0CnsKICAgIEdUX1UzMiAgICBlZXByb21Qb3J0OwogICAgR1RfVTMyICAgIGVlcHJvbUJsb2NrOwogICAgR1RfVTMyICAgIGVlcHJvbUFkZHI7CiAgICBHVF9VMzIgICAgZWVwcm9tRGF0YTsKfSBHVF9FRVBST01fT1BfREFUQTsKCiNkZWZpbmUgR1RfRUVQUk9NX09QX1NUX1JVTk5JTkdfTUFTSyAgICAgICAgMHg4MDAKI2RlZmluZSBHVF9FRVBST01fT1BfU1RfV1JJVEVfRU5fTUFTSyAgICAgICAgMHg0MDAKCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfU0NSQVRfMCAgICAweDAwIC8qIFNjcmF0Y2ggQnl0ZSAwICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfU0NSQVRfMSAgICAweDAxIC8qIFNjcmF0Y2ggQnl0ZSAxICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfR1BJT19DRkcgICAgMHg2MCAvKiBHUElPIENvbmZpZ3VyYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDYxID0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19HUElPX0RJUiAgICAweDYyIC8qIEdQSU8gRGlyZWN0aW9uICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfR1BJT19EQVQgICAgMHg2MyAvKiBHUElPIERhdGEgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19DRkdfREFUMCAgICAweDcwIC8qIENPTkZJRyBEYXRhIDAgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19DRkdfREFUMSAgICAweDcxIC8qIENPTkZJRyBEYXRhIDEgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19DRkdfREFUMiAgICAweDcyIC8qIENPTkZJRyBEYXRhIDIgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19DRkdfREFUMyAgICAweDczIC8qIENPTkZJRyBEYXRhIDMgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19TWU5DRSAgICAgICAgMHg3QyAvKiBTeW5jRSAmIFRBSUNMSzEyNZJzIERyaXZlICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfUDVfQ0xLICAgIDB4N0QgLyogUDWScyAmIENMSzEyNZJzIENsb2NrIERyaXZlICovCiNkZWZpbmUgR1RfU0NSQVRfTUlTQ19SRUdfUDZfQ0xLICAgIDB4N0UgLyogUDaScyBDbG9jayBEcml2ZSAqLwojZGVmaW5lIEdUX1NDUkFUX01JU0NfUkVHX0VFUFJPTSAgICAweDdGIC8qIEVFUFJPTSBQYWQgZHJpdmUgKi8KI2RlZmluZSBHVF9TQ1JBVF9NSVNDX1JFR19NQVggICAgICAgIDB4ODAgLyogTWF4aW11biByZWdpc3RlciBwb2ludGVyICovCgojZGVmaW5lIEdUX0dQSU9fQklUXzAgICAgMHgxCiNkZWZpbmUgR1RfR1BJT19CSVRfMSAgICAweDIKI2RlZmluZSBHVF9HUElPX0JJVF8yICAgIDB4NAojZGVmaW5lIEdUX0dQSU9fQklUXzMgICAgMHg4CiNkZWZpbmUgR1RfR1BJT19CSVRfNCAgICAweDEwCiNkZWZpbmUgR1RfR1BJT19CSVRfNSAgICAweDIwCiNkZWZpbmUgR1RfR1BJT19CSVRfNiAgICAweDQwCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VOCAgICAgICAgIHVzZXIgOiAzOwogICAgR1RfVTggICAgICAgICBhZGRyIDogNTsKfUdUX0NPTkZJR19EQVRBXzA7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VOCAgICAgICAgIGxlZCAgOiAyOwogICAgR1RfVTggICAgICAgICBmb3VyY29sIDogMTsKICAgIEdUX1U4ICAgICAgICAgbm9ybUN4IDogMTsKICAgIEdUX1U4ICAgICAgICAganVtYm8gOiAxOwogICAgR1RfVTggICAgICAgICBlZV93ZSA6IDE7CiAgICBHVF9VOCAgICAgICAgIGZkX2Zsb3cgOiAxOwogICAgR1RfVTggICAgICAgICBoZF9mbG93IDogMTsKfUdUX0NPTkZJR19EQVRBXzE7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VOCAgICAgICAgIHA1X21vZCA6IDM7CiAgICBHVF9VOCAgICAgICAgIGJpdDQgICAgIDogMTsKICAgIEdUX1U4ICAgICAgICAgcDZfbW9kIDogMzsKfUdUX0NPTkZJR19EQVRBXzI7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VOCAgICAgICAgIHJtdV9tb2QgOiAyOwp9R1RfQ09ORklHX0RBVEFfMzsKCnR5cGVkZWYgc3RydWN0CnsKICAgIHVuaW9uIHsKICAgICAgICBHVF9VOCAgICAgICAgICAgICAgICBCeXRlOwogICAgICAgIEdUX0NPTkZJR19EQVRBXzAgICAgRGF0YTsKICAgIH0gY2ZnRGF0YTA7CiAgICB1bmlvbiB7CiAgICAgICAgR1RfVTggICAgICAgICAgICAgICAgQnl0ZTsKICAgICAgICBHVF9DT05GSUdfREFUQV8wICAgIERhdGE7CiAgICB9IGNmZ0RhdGExOwogICAgdW5pb24gewogICAgICAgIEdUX1U4ICAgICAgICAgICAgICAgIEJ5dGU7CiAgICAgICAgR1RfQ09ORklHX0RBVEFfMCAgICBEYXRhOwogICAgfSBjZmdEYXRhMjsKICAgIHVuaW9uIHsKICAgICAgICBHVF9VOCAgICAgICAgICAgICAgICBCeXRlOwogICAgICAgIEdUX0NPTkZJR19EQVRBXzAgICAgRGF0YTsKICAgIH0gY2ZnRGF0YTM7Cn1HVF9DT05GSUdfREFUQTsKCgovKiBkZWZpbml0aW9uIGZvciBUcnVua2luZyAqLwojZGVmaW5lIElTX1RSVU5LX0lEX1ZBTElEKF9kZXYsIF9pZCkgICAgKCgoX2lkKSA8IDE2KSA/IDEgOiAwKQoKCi8qIGRlZmluaXRpb24gZm9yIGRldmljZSBzY2FuIG1vZGUgKi8KI2RlZmluZSBTTUlfQVVUT19TQ0FOX01PREUgICAgICAgIDAgICAgLyogU2NhbiAwIG9yIDB4MTAgYmFzZSBhZGRyZXNzIHRvIGZpbmQgdGhlIFFEICovCiNkZWZpbmUgU01JX01BTlVBTF9NT0RFICAgICAgICAgICAgMSAgICAvKiBVc2UgUUQgbG9jYXRlZCBhdCBtYW51YWxseSBkZWZpbmVkIGJhc2UgYWRkciAqLwojZGVmaW5lIFNNSV9NVUxUSV9BRERSX01PREUgICAgICAgIDIgICAgLyogVXNlIFFEIGF0IGJhc2UgYWRkciBhbmQgdXNlIGluZGlyZWN0IGFjY2VzcyAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBHVF9VMzIgICAgc2Nhbk1vZGU7ICAgIC8qIGNoZWNrIGRlZmluaXRpb24gZm9yIGRldmljZSBzY2FuIG1vZGUgKi8KICAgIEdUX1UzMiAgICBiYXNlQWRkcjsgICAgLyogbWVhbmluZ2Z1bCBpZiBzY2FuTW9kZSBpcyBub3QgU01JX0FVVE9fU0NBTl9NT0RFICovCn0gR1RfU0NBTl9NT0RFOwoKCiNkZWZpbmUgR1RfU0tJUF9JTklUX1NFVFVQICAgIDB4NzM2YjY5NzAKCi8qCiAqIFR5cGVkZWY6IHN0cnVjdCBHVF9TWVNfQ09ORklHCiAqCiAqIERlc2NyaXB0aW9uOiBTeXN0ZW0gY29uZmlndXJhdGlvbiBQYXJhbWV0ZXJzIHN0cnVjdC4KICoKICogRmllbGRzOgogKiAgICBkZXZOdW0gICAgICAgIC0gU3dpdGNoIERldmljZSBOdW1iZXIgCiAqICBjcHVQb3J0TnVtICAtIFRoZSBwaHlzaWNhbCBwb3J0IHVzZWQgdG8gY29ubmVjdCB0aGUgZGV2aWNlIHRvIENQVS4KICogICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcG9ydCB0byB3aGljaCBwYWNrZXRzIGRlc3RpbmVkIHRvIENQVSBhcmUKICogICAgICAgICAgICAgICAgZm9yd2FyZGVkLgogKiAgaW5pdFBvcnRzICAgLSBXaGV0aGVyIHRvIGluaXRpYWxpemUgdGhlIHBvcnRzIHN0YXRlLgogKiAgICAgICAgICAgICAgICBHVF9GQUxTRSAgICAtIGxlYXZlIGluIGRlZmF1bHQgc3RhdGUuCiAqICAgICAgICAgICAgICAgIEdUX1RSVUUgICAgIC0gSW5pdGlhbGl6ZSB0byBGb3J3YXJkaW5nIHN0YXRlLgogKiAgc2tpcEluaXRTZXR1cCAtIHNraXAgaW5pdCBzZXR1cCwgaWYgdmFsdWUgaXMgR1RfU0tJUF9JTklUX1NFVFVQCiAqICAgICAgICAgICAgICAgICAgcGVyZm9ybSBpbml0IHNldHVwLCBvdGhlcndpc2UKICogICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemluZyBwb3J0IHN0YXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzIHZhcmlhYmxlLgogKiAgICBCU1BGdW5jdGlvbnMgICAgLSBHcm91cCBvZiBCU1Agc3BlY2lmaWMgZnVuY3Rpb25zLgogKiAgICAgICAgICAgICAgICBTTUkgUmVhZC9Xcml0ZSBhbmQgU2VtYXBob3JlIFJlbGF0ZWQgZnVuY3Rpb25zLgogKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgR1RfVTggICAgICAgICBkZXZOdW07CiAgICBHVF9VOCAgICAgICAgIGNwdVBvcnROdW07CiAgICBHVF9CT09MICAgICAgIGluaXRQb3J0czsKICAgIEJTUF9GVU5DVElPTlMgQlNQRnVuY3Rpb25zOwogICAgR1RfU0NBTl9NT0RFICBtb2RlOwogICAgR1RfVTMyICAgICAgICBza2lwSW5pdFNldHVwOwp9R1RfU1lTX0NPTkZJRzsKCiNpZmRlZiBHVF9STUdNVF9BQ0NFU1MKdHlwZWRlZiBlbnVtCnsKIEhXX0FDQ0VTU19NT0RFX1NNSSA9IDAsICAgIC8qIFVzZSBTTUkgKi8KIEhXX0FDQ0VTU19NT0RFX0YyUiA9IDEsICAgIC8qIFVzZSBNYXJ2ZWxsIFJNR01UKEYyUikgZnVuY3Rpb24gKi8KfSBGR1RfSFdfQUNDRVNTX01PRDsgICAgLyogSGFyZHdhcmUgYWNjZXNzIG1vZGUgKi8KI2VuZGlmCgovKgogKiBUeXBlZGVmOiBzdHJ1Y3QgR1RfUURfREVWCiAqCiAqIERlc2NyaXB0aW9uOiBJbmNsdWRlcyBUYXBpIGxheWVyIHN3aXRjaCBjb25maWd1cmF0aW9uIGRhdGEuCiAqCiAqIEZpZWxkczoKICogICBkZXZpY2VJZCAgICAgICAtIFRoZSBkZXZpY2UgdHlwZSBpZGVudGlmaWVyLgogKiAgIHJldmlzaW9uICAgICAgIC0gVGhlIGRldmljZSByZXZpc2lvbiBudW1iZXIuCiAqICAgYmFzZVJlZ0FkZHIgICAgLSBTd2l0Y2ggQmFzZSBSZWdpc3RlciBhZGRyZXNzLgogKiAgIG51bU9mUG9ydHMgICAgIC0gTnVtYmVyIG9mIGFjdGl2ZSBwb3J0cy4KICogICBtYXhQb3J0cyAgICAgICAtIG1heCBwb3J0cy4gVGhpcyBmaWVsZCBpcyBvbmx5IGZvciBkcml2ZXIncyB1c2UuCiAqICAgY3B1UG9ydE51bSAgICAgLSBMb2dpY2FsIHBvcnQgbnVtYmVyIHdob3NlIHBoeXNpY2FsIHBvcnQgaXMgY29ubmVjdGVkIHRvIHRoZSBDUFUuCiAqICAgbWF4UGh5TnVtICAgICAgLSBtYXggY29uZmlndXJhYmxlIFBoeSBhZGRyZXNzLgogKiAgIHN0cE1vZGUgICAgICAgIC0gY3VycmVudCBzd2l0Y2ggU1RQIG1vZGUgKDAgbm9uZSwgMSBlbiwgMiBkaXMpCiAqICAgYWNjZXNzTW9kZSAgICAgICAgLSBzaG93cyBob3cgdG8gZmluZCBhbmQgYWNjZXNzIHRoZSBkZXZpY2UuCiAqICAgcGh5QWRkciAgICAgICAgLSBTTUkgYWRkcmVzcyB1c2VkIHRvIGFjY2VzcyBTd2l0Y2ggcmVnaXN0ZXJzKG9ubHkgZm9yIFNNSV9NVUxUSV9BRERSX01PREUpLgogKiAgIHZhbGlkUG9ydFZlYyAgIC0gdmFsaWQgcG9ydCBsaXN0IGluIHZlY3RvciBmb3JtYXQKICogICB2YWxpZFBoeVZlYyAgICAtIHZhbGlkIHBoeSBsaXN0IGluIHZlY3RvciBmb3JtYXQKICogICB2YWxpZFNlcmRlc1ZlYyAgICAtIHZhbGlkIHNlcmRlcyBsaXN0IGluIHZlY3RvciBmb3JtYXQKICogICBkZXZHcm91cCAgICAgICAgLSB0aGUgZGV2aWNlIGdyb3VwCiAqICAgZGV2TmFtZSAgICAgICAgLSBuYW1lIG9mIHRoZSBkZXZpY2UgaW4gZ3JvdXAgMAogKiAgIGRldk5hbWUxICAgICAgICAtIG5hbWUgb2YgdGhlIGRldmljZSBpbiBncm91cCAxCiAqICAgZGV2U3RvcmFnZSAgICAgICAgLSBkcml2ZXIgaW50ZXJuYWwgdXNlIChob2xkIHZhcmlvdXMgdGVtcCBpbmZvcm1hdGlvbikKICogICBtdWx0aUFkZHJTZW0gICAtIFNlbWFwaG9yZSBmb3IgQWNjZXNzaW5nIFNNSSBEZXZpY2UKICogICBhdHVSZWdzU2VtICAgICAtIFNlbWFwaG9yZSBmb3IgQVRVIGFjY2VzcwogKiAgIHZ0dVJlZ3NTZW0gICAgIC0gU2VtYXBob3JlIGZvciBWVFUgYWNjZXNzCiAqICAgc3RhdHNSZWdzU2VtICAgLSBTZW1hcGhvcmUgZm9yIFJNT04gY291bnRlciBhY2Nlc3MKICogICBwaXJsUmVnc1NlbSAgICAtIFNlbWFwaG9yZSBmb3IgUElSTCBSZXNvdXJjZSBhY2Nlc3MKICogICBwdHBSZWdzU2VtICAgICAtIFNlbWFwaG9yZSBmb3IgUFRQIFJlc291cmNlIGFjY2VzcwogKiAgIHRibFJlZ3NTZW0gICAgIC0gU2VtYXBob3JlIGZvciB2YXJpb3VzIFRhYmxlIFJlc291cmNlIGFjY2VzcywKICogICAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgVHJ1bmsgVGFibGVzIGFuZCBEZXZpY2UgVGFibGUKICogICBlZXByb21SZWdzU2VtICAtIFNlbWFwaG9yZSBmb3IgZWVwcm9tIGNvbnRyb2wgYWNjZXNzCiAqICAgcGh5UmVnc1NlbSAgICAgLSBTZW1hcGhvcmUgZm9yIFBIWSBEZXZpY2UgYWNjZXNzCiAqICAgaHdBY2Nlc3NSZWdzU2VtIC0gU2VtYXBob3JlIGZvciBSZW1vdGUgbWFuYWdlbWVudCBhY2Nlc3MKICogICBmZ3RId0FjY2Vzc01vZCAtIFNlbGVjdCByZWdpc3RlciBhY2Nlc3MgbW9kZTogUmVhZC9Xcml0ZSBvciBIYXJkd2FyZSBhY2Nlc3MgZnVuY3Rpb24KICogICBmZ3RSZWFkTWlpICAgICAtIHBsYXRmb3JtIHNwZWNpZmljIFNNSSByZWdpc3RlciBSZWFkIGZ1bmN0aW9uCiAqICAgZmd0V3JpdGVNaWkgICAgLSBwbGF0Zm9ybSBzcGVjaWZpYyBTTUkgcmVnaXN0ZXIgV3JpdGUgZnVuY3Rpb24KICogICBmZ3RId0FjY2VzcyAgICAtIHBsYXRmb3JtIHNwZWNpZmljIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbgogKiAgIHNlbUNyZWF0ZSAgICAgIC0gZnVuY3Rpb24gdG8gY3JlYXRlIHNlbWFwb3JlCiAqICAgc2VtRGVsZXRlICAgICAgLSBmdW5jdGlvbiB0byBkZWxldGUgdGhlIHNlbWFwb3JlCiAqICAgc2VtVGFrZSAgICAgICAgLSBmdW5jdGlvbiB0byBnZXQgYSBzZW1hcG9yZQogKiAgIHNlbUdpdmUgICAgICAgIC0gZnVuY3Rpb24gdG8gcmV0dXJuIHNlbWFwaG9yZQogKiAgIGFwcERhdGEgICAgICAgIC0gYXBwbGljYXRpb24gZGF0YSB0aGF0IHVzZXIgbWF5IHVzZQogKi8Kc3RydWN0IF9HVF9RRF9ERVYKewogICAgR1RfREVWSUNFICAgZGV2aWNlSWQ7CiAgICBHVF9MUE9SVCAgICBjcHVQb3J0TnVtOwogICAgR1RfVTggICAgICAgcmV2aXNpb247CiAgICBHVF9VOCAgICAgICAgZGV2TnVtOwogICAgR1RfVTggICAgICAgIGRldkVuYWJsZWQ7CiAgICBHVF9VOCAgICAgICBiYXNlUmVnQWRkcjsKICAgIEdUX1U4ICAgICAgIG51bU9mUG9ydHM7CiAgICBHVF9VOCAgICAgICAgbWF4UG9ydHM7CiAgICBHVF9VOCAgICAgICBtYXhQaHlOdW07CiAgICBHVF9VOCAgICAgICAgc3RwTW9kZTsKICAgIEdUX1U4ICAgICAgICBhY2Nlc3NNb2RlOwogICAgR1RfVTggICAgICAgIHBoeUFkZHI7CiAgICBHVF9VMTYgICAgICAgIHJlc2VydmVkOwogICAgR1RfVTE2ICAgICAgICB2YWxpZFBvcnRWZWM7CiAgICBHVF9VMTYgICAgICAgIHZhbGlkUGh5VmVjOwogICAgR1RfVTE2ICAgICAgICB2YWxpZFNlcmRlc1ZlYzsKICAgIEdUX1UxNiAgICAgICAgZGV2R3JvdXA7CiAgICBHVF9VMzIgICAgICAgIGRldk5hbWU7CiAgICBHVF9VMzIgICAgICAgIGRldk5hbWUxOwogICAgR1RfVTMyICAgICAgICBkZXZTdG9yYWdlOwogICAgR1RfU0VNICAgICAgICBtdWx0aUFkZHJTZW07CiAgICBHVF9TRU0gICAgICAgIGF0dVJlZ3NTZW07CiAgICBHVF9TRU0gICAgICAgIHZ0dVJlZ3NTZW07CiAgICBHVF9TRU0gICAgICAgIHN0YXRzUmVnc1NlbTsKICAgIEdUX1NFTSAgICAgICAgcGlybFJlZ3NTZW07CiAgICBHVF9TRU0gICAgICAgIHB0cFJlZ3NTZW07CiAgICBHVF9TRU0gICAgICAgIHRibFJlZ3NTZW07CiAgICBHVF9TRU0gICAgICAgIGVlcHJvbVJlZ3NTZW07CiAgICBHVF9TRU0gICAgICAgIHBoeVJlZ3NTZW07CiAgICBHVF9TRU0gICAgICAgIGh3QWNjZXNzUmVnc1NlbTsKCiAgICBGR1RfUkVBRF9NSUkgIGZndFJlYWRNaWk7CiAgICBGR1RfV1JJVEVfTUlJIGZndFdyaXRlTWlpOwojaWZkZWYgR1RfUk1HTVRfQUNDRVNTCiAgICBGR1RfSFdfQUNDRVNTX01PRCBmZ3RId0FjY2Vzc01vZDsgICAgLyogSGFyZHdhcmUgYWNjZXNzIG1vZGUgKi8KICAgIEZHVF9IV19BQ0NFU1MgZmd0SHdBY2Nlc3M7ICAgIC8qIEhhcmR3YXJlIGFjY2VzcyAgKi8KI2VuZGlmCgogICAgRkdUX1NFTV9DUkVBVEUgIHNlbUNyZWF0ZTsgICAgIC8qIGNyZWF0ZSBzZW1hcGhvcmUgKi8KICAgIEZHVF9TRU1fREVMRVRFICBzZW1EZWxldGU7ICAgICAvKiBkZWxldGUgdGhlIHNlbWFwaG9yZSAqLwogICAgRkdUX1NFTV9UQUtFICAgIHNlbVRha2U7ICAgIC8qIHRyeSB0byBnZXQgYSBzZW1hcGhvcmUgKi8KICAgIEZHVF9TRU1fR0lWRSAgICBzZW1HaXZlOyAgICAvKiByZXR1cm4gc2VtYXBob3JlICovCiAgICB2b2lkKiAgICAgICAgICAgYXBwRGF0YTsKCiAgICAvKiBNb2RpZmllZCB0byBhZGQgcG9ydCBtYXBwaW5nIGZ1bmN0aW9ucyBpbnRvIGRldmljZSBzc3lzdGVtIGNvbmZpZ3VyYXRpb24uICovCiNpZmRlZiBHVF9QT1JUX01BUF9JTl9ERVYKICAgIEdUX1U4ICAgICAgICAgICAoKmxwb3J0MnBvcnQpICAgKEdUX1UxNiBwb3J0VmVjLCBHVF9MUE9SVCBwb3J0KTsKICAgIEdUX0xQT1JUICAgICAgICAoKnBvcnQybHBvcnQpICAgKEdUX1UxNiBwb3J0VmVjLCBHVF9VOCBod1BvcnQpOwogICAgR1RfVTMyICAgICAgICAgICgqbHBvcnR2ZWMycG9ydHZlYykgKEdUX1UxNiBwb3J0VmVjLCBHVF9VMzIgbFZlYyk7CiAgICBHVF9VMzIgICAgICAgICAgKCpwb3J0dmVjMmxwb3J0dmVjKSAoR1RfVTE2IHBvcnRWZWMsIEdUX1UzMiBwVmVjKTsKI2VuZGlmCgogICAgR1RfQk9PTCAgICAgICB1c2VfbWFkOyAgICAgLyogdXNlIE1BRCBkcml2ZXIgdG8gcHJvY2VzcyBQaHkgKi8KI2lmZGVmIEdUX1VTRV9NQUQgCglNQURfREVWCW1hZF9kZXY7CiNlbmRpZgp9OwoKCgoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgojZW5kaWYgLyogX19tc0FwaV9oICovCg==