LyoKICogRml4ZWQgZnVuY3Rpb24gcGlwZWxpbmUgcmVwbGFjZW1lbnQgdXNpbmcgR0xfQVRJX2ZyYWdtZW50X3NoYWRlcgogKgogKiBDb3B5cmlnaHQgMjAwOCBTdGVmYW4gRPZzaW5nZXIoZm9yIENvZGVXZWF2ZXJzKQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCiNpbmNsdWRlICJ3aW5lZDNkX3ByaXZhdGUuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZF9zaGFkZXIpOwoKLyogU29tZSBwcml2YXRlIGRlZmluZXMsIENvbnN0YW50IGFzc29jaWF0aW9ucywgZXRjLgogKiBFbnYgYnVtcCBtYXRyaXggYW5kIHBlciBzdGFnZSBjb25zdGFudCBzaG91bGQgYmUgaW5kZXBlbmRlbnQsCiAqIGEgc3RhZ2UgdGhhdCBidW1wIG1hcHMgY2FuJ3QgcmVhZCB0aGUgcGVyIHN0YXRlIGNvbnN0YW50CiAqLwojZGVmaW5lIEFUSV9GRlBfQ09OU1RfQlVNUE1BVChpKSAoR0xfQ09OXzBfQVRJICsgaSkKI2RlZmluZSBBVElfRkZQX0NPTlNUX0NPTlNUQU5UMCBHTF9DT05fMF9BVEkKI2RlZmluZSBBVElfRkZQX0NPTlNUX0NPTlNUQU5UMSBHTF9DT05fMV9BVEkKI2RlZmluZSBBVElfRkZQX0NPTlNUX0NPTlNUQU5UMiBHTF9DT05fMl9BVEkKI2RlZmluZSBBVElfRkZQX0NPTlNUX0NPTlNUQU5UMyBHTF9DT05fM19BVEkKI2RlZmluZSBBVElfRkZQX0NPTlNUX0NPTlNUQU5UNCBHTF9DT05fNF9BVEkKI2RlZmluZSBBVElfRkZQX0NPTlNUX0NPTlNUQU5UNSBHTF9DT05fNV9BVEkKI2RlZmluZSBBVElfRkZQX0NPTlNUX1RGQUNUT1IgICBHTF9DT05fNl9BVEkKCi8qIEdMX0FUSV9mcmFnbWVudF9zaGFkZXIgc3BlY2lmaWMgZml4ZWQgZnVuY3Rpb24gcGlwZWxpbmUgZGVzY3JpcHRpb24uICJJbmhlcml0cyIgZnJvbSB0aGUgY29tbW9uIG9uZSAqLwpzdHJ1Y3QgYXRpZnNfZmZwX2Rlc2MKewogICAgc3RydWN0IGZmcF9kZXNjIHBhcmVudDsKICAgIEdMdWludCBzaGFkZXI7CiAgICB1bnNpZ25lZCBpbnQgbnVtX3RleHR1cmVzX3VzZWQ7Cn07CgpzdHJ1Y3QgYXRpZnNfcHJpdmF0ZV9kYXRhCnsKICAgIHN0cnVjdCBoYXNoX3RhYmxlX3QgKmZyYWdtZW50X3NoYWRlcnM7IC8qIEEgaGFzaHRhYmxlIHRvIHRyYWNrIGZyYWdtZW50IHBpcGVsaW5lIHJlcGxhY2VtZW50IHNoYWRlcnMgKi8KCn07CgpzdGF0aWMgY29uc3QgY2hhciAqZGVidWdfZHN0bW9kKEdMdWludCBtb2QpIHsKICAgIHN3aXRjaChtb2QpIHsKICAgICAgICBjYXNlIEdMX05PTkU6ICAgICAgICAgICAgICAgcmV0dXJuICJHTF9OT05FIjsKICAgICAgICBjYXNlIEdMXzJYX0JJVF9BVEk6ICAgICAgICAgcmV0dXJuICJHTF8yWF9CSVRfQVRJIjsKICAgICAgICBjYXNlIEdMXzRYX0JJVF9BVEk6ICAgICAgICAgcmV0dXJuICJHTF80WF9CSVRfQVRJIjsKICAgICAgICBjYXNlIEdMXzhYX0JJVF9BVEk6ICAgICAgICAgcmV0dXJuICJHTF84WF9CSVRfQVRJIjsKICAgICAgICBjYXNlIEdMX0hBTEZfQklUX0FUSTogICAgICAgcmV0dXJuICJHTF9IQUxGX0JJVF9BVEkiOwogICAgICAgIGNhc2UgR0xfUVVBUlRFUl9CSVRfQVRJOiAgICByZXR1cm4gIkdMX1FVQVJURVJfQklUX0FUSSI7CiAgICAgICAgY2FzZSBHTF9FSUdIVEhfQklUX0FUSTogICAgIHJldHVybiAiR0xfRUlHSFRIX0JJVF9BVEkiOwogICAgICAgIGNhc2UgR0xfU0FUVVJBVEVfQklUX0FUSTogICByZXR1cm4gIkdMX1NBVFVSQVRFX0JJVF9BVEkiOwogICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVuZXhwZWN0ZWQgbW9kaWZpZXJcbiI7CiAgICB9Cn0KCnN0YXRpYyBjb25zdCBjaGFyICpkZWJ1Z19hcmdtb2QoR0x1aW50IG1vZCkgewogICAgc3dpdGNoKG1vZCkgewogICAgICAgIGNhc2UgR0xfTk9ORToKICAgICAgICAgICAgcmV0dXJuICJHTF9OT05FIjsKCiAgICAgICAgY2FzZSBHTF8yWF9CSVRfQVRJOgogICAgICAgICAgICByZXR1cm4gIkdMXzJYX0JJVF9BVEkiOwogICAgICAgIGNhc2UgR0xfQ09NUF9CSVRfQVRJOgogICAgICAgICAgICByZXR1cm4gIkdMX0NPTVBfQklUX0FUSSI7CiAgICAgICAgY2FzZSBHTF9ORUdBVEVfQklUX0FUSToKICAgICAgICAgICAgcmV0dXJuICJHTF9ORUdBVEVfQklUX0FUSSI7CiAgICAgICAgY2FzZSBHTF9CSUFTX0JJVF9BVEk6CiAgICAgICAgICAgIHJldHVybiAiR0xfQklBU19CSVRfQVRJIjsKCiAgICAgICAgY2FzZSBHTF8yWF9CSVRfQVRJIHwgR0xfQ09NUF9CSVRfQVRJOgogICAgICAgICAgICByZXR1cm4gIkdMXzJYX0JJVF9BVEkgfCBHTF9DT01QX0JJVF9BVEkiOwogICAgICAgIGNhc2UgR0xfMlhfQklUX0FUSSB8IEdMX05FR0FURV9CSVRfQVRJOgogICAgICAgICAgICByZXR1cm4gIkdMXzJYX0JJVF9BVEkgfCBHTF9ORUdBVEVfQklUX0FUSSI7CiAgICAgICAgY2FzZSBHTF8yWF9CSVRfQVRJIHwgR0xfQklBU19CSVRfQVRJOgogICAgICAgICAgICByZXR1cm4gIkdMXzJYX0JJVF9BVEkgfCBHTF9CSUFTX0JJVF9BVEkiOwogICAgICAgIGNhc2UgR0xfQ09NUF9CSVRfQVRJIHwgR0xfTkVHQVRFX0JJVF9BVEk6CiAgICAgICAgICAgIHJldHVybiAiR0xfQ09NUF9CSVRfQVRJIHwgR0xfTkVHQVRFX0JJVF9BVEkiOwogICAgICAgIGNhc2UgR0xfQ09NUF9CSVRfQVRJIHwgR0xfQklBU19CSVRfQVRJOgogICAgICAgICAgICByZXR1cm4gIkdMX0NPTVBfQklUX0FUSSB8IEdMX0JJQVNfQklUX0FUSSI7CiAgICAgICAgY2FzZSBHTF9ORUdBVEVfQklUX0FUSSB8IEdMX0JJQVNfQklUX0FUSToKICAgICAgICAgICAgcmV0dXJuICJHTF9ORUdBVEVfQklUX0FUSSB8IEdMX0JJQVNfQklUX0FUSSI7CgogICAgICAgIGNhc2UgR0xfQ09NUF9CSVRfQVRJIHwgR0xfTkVHQVRFX0JJVF9BVEkgfCBHTF9CSUFTX0JJVF9BVEk6CiAgICAgICAgICAgIHJldHVybiAiR0xfQ09NUF9CSVRfQVRJIHwgR0xfTkVHQVRFX0JJVF9BVEkgfCBHTF9CSUFTX0JJVF9BVEkiOwogICAgICAgIGNhc2UgR0xfMlhfQklUX0FUSSB8IEdMX05FR0FURV9CSVRfQVRJIHwgR0xfQklBU19CSVRfQVRJOgogICAgICAgICAgICByZXR1cm4gIkdMXzJYX0JJVF9BVEkgfCBHTF9ORUdBVEVfQklUX0FUSSB8IEdMX0JJQVNfQklUX0FUSSI7CiAgICAgICAgY2FzZSBHTF8yWF9CSVRfQVRJIHwgR0xfQ09NUF9CSVRfQVRJIHwgR0xfQklBU19CSVRfQVRJOgogICAgICAgICAgICByZXR1cm4gIkdMXzJYX0JJVF9BVEkgfCBHTF9DT01QX0JJVF9BVEkgfCBHTF9CSUFTX0JJVF9BVEkiOwogICAgICAgIGNhc2UgR0xfMlhfQklUX0FUSSB8IEdMX0NPTVBfQklUX0FUSSB8IEdMX05FR0FURV9CSVRfQVRJOgogICAgICAgICAgICByZXR1cm4gIkdMXzJYX0JJVF9BVEkgfCBHTF9DT01QX0JJVF9BVEkgfCBHTF9ORUdBVEVfQklUX0FUSSI7CgogICAgICAgIGNhc2UgR0xfMlhfQklUX0FUSSB8IEdMX0NPTVBfQklUX0FUSSB8IEdMX05FR0FURV9CSVRfQVRJIHwgR0xfQklBU19CSVRfQVRJOgogICAgICAgICAgICByZXR1cm4gIkdMXzJYX0JJVF9BVEkgfCBHTF9DT01QX0JJVF9BVEkgfCBHTF9ORUdBVEVfQklUX0FUSSB8IEdMX0JJQVNfQklUX0FUSSI7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAiVW5leHBlY3RlZCBhcmdtb2QgY29tYmluYXRpb25cbiI7CiAgICB9Cn0Kc3RhdGljIGNvbnN0IGNoYXIgKmRlYnVnX3JlZ2lzdGVyKEdMdWludCByZWcpIHsKICAgIHN3aXRjaChyZWcpIHsKICAgICAgICBjYXNlIEdMX1JFR18wX0FUSTogICAgICAgICAgICAgICAgICByZXR1cm4gIkdMX1JFR18wX0FUSSI7CiAgICAgICAgY2FzZSBHTF9SRUdfMV9BVEk6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9SRUdfMV9BVEkiOwogICAgICAgIGNhc2UgR0xfUkVHXzJfQVRJOiAgICAgICAgICAgICAgICAgIHJldHVybiAiR0xfUkVHXzJfQVRJIjsKICAgICAgICBjYXNlIEdMX1JFR18zX0FUSTogICAgICAgICAgICAgICAgICByZXR1cm4gIkdMX1JFR18zX0FUSSI7CiAgICAgICAgY2FzZSBHTF9SRUdfNF9BVEk6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9SRUdfNF9BVEkiOwogICAgICAgIGNhc2UgR0xfUkVHXzVfQVRJOiAgICAgICAgICAgICAgICAgIHJldHVybiAiR0xfUkVHXzVfQVRJIjsKCiAgICAgICAgY2FzZSBHTF9DT05fMF9BVEk6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9DT05fMF9BVEkiOwogICAgICAgIGNhc2UgR0xfQ09OXzFfQVRJOiAgICAgICAgICAgICAgICAgIHJldHVybiAiR0xfQ09OXzFfQVRJIjsKICAgICAgICBjYXNlIEdMX0NPTl8yX0FUSTogICAgICAgICAgICAgICAgICByZXR1cm4gIkdMX0NPTl8yX0FUSSI7CiAgICAgICAgY2FzZSBHTF9DT05fM19BVEk6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9DT05fM19BVEkiOwogICAgICAgIGNhc2UgR0xfQ09OXzRfQVRJOiAgICAgICAgICAgICAgICAgIHJldHVybiAiR0xfQ09OXzRfQVRJIjsKICAgICAgICBjYXNlIEdMX0NPTl81X0FUSTogICAgICAgICAgICAgICAgICByZXR1cm4gIkdMX0NPTl81X0FUSSI7CiAgICAgICAgY2FzZSBHTF9DT05fNl9BVEk6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9DT05fNl9BVEkiOwogICAgICAgIGNhc2UgR0xfQ09OXzdfQVRJOiAgICAgICAgICAgICAgICAgIHJldHVybiAiR0xfQ09OXzdfQVRJIjsKCiAgICAgICAgY2FzZSBHTF9aRVJPOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9aRVJPIjsKICAgICAgICBjYXNlIEdMX09ORTogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkdMX09ORSI7CiAgICAgICAgY2FzZSBHTF9QUklNQVJZX0NPTE9SOiAgICAgICAgICAgICAgcmV0dXJuICJHTF9QUklNQVJZX0NPTE9SIjsKICAgICAgICBjYXNlIEdMX1NFQ09OREFSWV9JTlRFUlBPTEFUT1JfQVRJOiByZXR1cm4gIkdMX1NFQ09OREFSWV9JTlRFUlBPTEFUT1JfQVRJIjsKCiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHJlZ2lzdGVyXG4iOwogICAgfQp9CgpzdGF0aWMgY29uc3QgY2hhciAqZGVidWdfc3dpenpsZShHTHVpbnQgc3dpenpsZSkgewogICAgc3dpdGNoKHN3aXp6bGUpIHsKICAgICAgICBjYXNlIEdMX1NXSVpaTEVfU1RSX0FUSTogICAgICAgIHJldHVybiAiR0xfU1dJWlpMRV9TVFJfQVRJIjsKICAgICAgICBjYXNlIEdMX1NXSVpaTEVfU1RRX0FUSTogICAgICAgIHJldHVybiAiR0xfU1dJWlpMRV9TVFFfQVRJIjsKICAgICAgICBjYXNlIEdMX1NXSVpaTEVfU1RSX0RSX0FUSTogICAgIHJldHVybiAiR0xfU1dJWlpMRV9TVFJfRFJfQVRJIjsKICAgICAgICBjYXNlIEdMX1NXSVpaTEVfU1RRX0RRX0FUSTogICAgIHJldHVybiAiR0xfU1dJWlpMRV9TVFFfRFFfQVRJIjsKICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidW5rbm93biBzd2l6emxlIjsKICAgIH0KfQoKc3RhdGljIGNvbnN0IGNoYXIgKmRlYnVnX3JlcChHTHVpbnQgcmVwKSB7CiAgICBzd2l0Y2gocmVwKSB7CiAgICAgICAgY2FzZSBHTF9OT05FOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkdMX05PTkUiOwogICAgICAgIGNhc2UgR0xfUkVEOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9SRUQiOwogICAgICAgIGNhc2UgR0xfR1JFRU46ICAgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9HUkVFTiI7CiAgICAgICAgY2FzZSBHTF9CTFVFOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkdMX0JMVUUiOwogICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIGFyZ3JlcCI7CiAgICB9Cn0KCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OICgqZ2xfaW5mbykKc3RhdGljIEdMdWludCByZWdpc3Rlcl9mb3JfYXJnKERXT1JEIGFyZywgV2luZUQzRF9HTF9JbmZvICpnbF9pbmZvLCB1bnNpZ25lZCBpbnQgc3RhZ2UsIEdMdWludCAqbW9kLCBHTHVpbnQgKnJlcCwgR0x1aW50IHRtcGFyZykgewogICAgR0xlbnVtIHJldDsKCiAgICBpZihtb2QpICptb2QgPSBHTF9OT05FOwogICAgaWYoYXJnID09IEFSR19VTlVTRUQpIHJldHVybiAtMTsgLyogVGhpcyBpcyB0aGUgbWFya2VyIGZvciB1bnVzZWQgcmVnaXN0ZXJzICovCgogICAgc3dpdGNoKGFyZyAmIFdJTkVEM0RUQV9TRUxFQ1RNQVNLKSB7CiAgICAgICAgY2FzZSBXSU5FRDNEVEFfRElGRlVTRToKICAgICAgICAgICAgcmV0ID0gR0xfUFJJTUFSWV9DT0xPUjsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzRFRBX0NVUlJFTlQ6CiAgICAgICAgICAgIC8qIE5vdGUgdGhhdCB1c2luZyBHTF9SRUdfMF9BVEkgZm9yIHRoZSBwYXNzZWQgb24gcmVnaXN0ZXIgaXMgc2FmZSBiZWNhdXNlCiAgICAgICAgICAgICAqIHRleHR1cmUwIGlzIHJlYWQgYXQgc3RhZ2UwLCBzbyBpbiB0aGUgd29yc3QgY2FzZSBpdCBpcyByZWFkIGluIHRoZQogICAgICAgICAgICAgKiBpbnN0cnVjdGlvbiB3cml0aW5nIHRvIHJlZzAuIEFmdGVyd2FyZHMgdGV4dHVyZTAgaXMgbm90IHVzZWQgYW55IGxvbmdlci4KICAgICAgICAgICAgICogSWYgd2UncmUgcmVhZGluZyBmcm9tIGN1cnJlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmKHN0YWdlID09IDApIHsKICAgICAgICAgICAgICAgIHJldCA9IEdMX1BSSU1BUllfQ09MT1I7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXQgPSBHTF9SRUdfMF9BVEk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzRFRBX1RFWFRVUkU6CiAgICAgICAgICAgIHJldCA9IEdMX1JFR18wX0FUSSArIHN0YWdlOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEVEFfVEZBQ1RPUjoKICAgICAgICAgICAgcmV0ID0gQVRJX0ZGUF9DT05TVF9URkFDVE9SOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEVEFfU1BFQ1VMQVI6CiAgICAgICAgICAgIHJldCA9IEdMX1NFQ09OREFSWV9JTlRFUlBPTEFUT1JfQVRJOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEVEFfVEVNUDoKICAgICAgICAgICAgcmV0ID0gdG1wYXJnOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEVEFfQ09OU1RBTlQ6CiAgICAgICAgICAgIEZJWE1FKCJVbmhhbmRsZWQgc291cmNlIGFyZ3VtZW50IFdJTkVEM0RUQV9URU1QXG4iKTsKICAgICAgICAgICAgcmV0ID0gR0xfQ09OXzBfQVRJOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIlVua25vd24gc291cmNlIGFyZ3VtZW50ICVkXG4iLCBhcmcpOwogICAgICAgICAgICByZXQgPSBHTF9aRVJPOwogICAgfQoKICAgIGlmKGFyZyAmIFdJTkVEM0RUQV9DT01QTEVNRU5UKSB7CiAgICAgICAgaWYobW9kKSAqbW9kIHw9IEdMX0NPTVBfQklUX0FUSTsKICAgIH0KICAgIGlmKGFyZyAmIFdJTkVEM0RUQV9BTFBIQVJFUExJQ0FURSkgewogICAgICAgIGlmKHJlcCkgKnJlcCA9IEdMX0FMUEhBOwogICAgfSBlbHNlIHsKICAgICAgICBpZihyZXApICpyZXAgPSBHTF9OT05FOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIEdMdWludCBmaW5kX3RtcHJlZyhzdHJ1Y3QgdGV4dHVyZV9zdGFnZV9vcCBvcFtNQVhfVEVYVFVSRVNdKSB7CiAgICBpbnQgbG93ZXN0X3JlYWQgPSAtMTsKICAgIGludCBsb3dlc3Rfd3JpdGUgPSAtMTsKICAgIGludCBpOwogICAgQk9PTCB0ZXhfdXNlZFtNQVhfVEVYVFVSRVNdOwoKICAgIG1lbXNldCh0ZXhfdXNlZCwgMCwgc2l6ZW9mKHRleF91c2VkKSk7CiAgICBmb3IoaSA9IDA7IGkgPCBNQVhfVEVYVFVSRVM7IGkrKykgewogICAgICAgIGlmKG9wW2ldLmNvcCA9PSBXSU5FRDNEVE9QX0RJU0FCTEUpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZihsb3dlc3RfcmVhZCA9PSAtMSAmJgogICAgICAgICAgKG9wW2ldLmNhcmcxID09IFdJTkVEM0RUQV9URU1QIHx8IG9wW2ldLmNhcmcyID09IFdJTkVEM0RUQV9URU1QIHx8IG9wW2ldLmNhcmcwID09IFdJTkVEM0RUQV9URU1QIHx8CiAgICAgICAgICAgb3BbaV0uYWFyZzEgPT0gV0lORUQzRFRBX1RFTVAgfHwgb3BbaV0uYWFyZzIgPT0gV0lORUQzRFRBX1RFTVAgfHwgb3BbaV0uYWFyZzAgPT0gV0lORUQzRFRBX1RFTVApKSB7CiAgICAgICAgICAgIGxvd2VzdF9yZWFkID0gaTsKICAgICAgICB9CgogICAgICAgIGlmKGxvd2VzdF93cml0ZSA9PSAtMSAmJiBvcFtpXS5kc3QgPT0gdGVtcHJlZykgewogICAgICAgICAgICBsb3dlc3Rfd3JpdGUgPSBpOwogICAgICAgIH0KCiAgICAgICAgaWYob3BbaV0uY2FyZzEgPT0gV0lORUQzRFRBX1RFWFRVUkUgfHwgb3BbaV0uY2FyZzIgPT0gV0lORUQzRFRBX1RFWFRVUkUgfHwgb3BbaV0uY2FyZzAgPT0gV0lORUQzRFRBX1RFWFRVUkUgfHwKICAgICAgICAgICBvcFtpXS5hYXJnMSA9PSBXSU5FRDNEVEFfVEVYVFVSRSB8fCBvcFtpXS5hYXJnMiA9PSBXSU5FRDNEVEFfVEVYVFVSRSB8fCBvcFtpXS5hYXJnMCA9PSBXSU5FRDNEVEFfVEVYVFVSRSkgewogICAgICAgICAgICB0ZXhfdXNlZFtpXSA9IFRSVUU7CiAgICAgICAgfQogICAgfQoKICAgIC8qIFRlbXAgcmVnIG5vdCByZWFkPyBXZSBkb24ndCBuZWVkIGl0LCByZXR1cm4gR0xfTk9ORSAqLwogICAgaWYobG93ZXN0X3JlYWQgPT0gLTEpIHJldHVybiBHTF9OT05FOwoKICAgIGlmKGxvd2VzdF93cml0ZSA+PSBsb3dlc3RfcmVhZCkgewogICAgICAgIEZJWE1FKCJUZW1wIHJlZ2lzdGVyIHJlYWQgYmVmb3JlIGJlaW5nIHdyaXR0ZW5cbiIpOwogICAgfQoKICAgIGlmKGxvd2VzdF93cml0ZSA9PSAtMSkgewogICAgICAgIC8qIFRoaXMgbmVlZHMgYSB0ZXN0LiBNYXliZSB3ZSBhcmUgc3VwcG9zZWQgdG8gcmV0dXJuIDAuMC8wLjAvMC4wLzAuMCwgb3IgZmFpbCBkcmF3cHJpbSwgb3Igd2hhdGV2ZXIgKi8KICAgICAgICBGSVhNRSgiVGVtcCByZWdpc3RlciByZWFkIHdpdGhvdXQgYmVpbmcgd3JpdHRlblxuIik7CiAgICAgICAgcmV0dXJuIEdMX1JFR18xX0FUSTsKICAgIH0gZWxzZSBpZihsb3dlc3Rfd3JpdGUgPj0gMSkgewogICAgICAgIC8qIElmIHdlJ3JlIHdyaXRpbmcgdG8gdGhlIHRlbXAgcmVnIGF0IGVhcmxpZXN0IGluIHN0YWdlIDEsIHdlIGNhbiB1c2UgcmVnaXN0ZXIgMSBmb3IgdGhlIHRlbXAgcmVzdWx0LgogICAgICAgICAqIHRoZXJlIG1heSBiZSB0ZXh0dXJlIGRhdGEgc3RvcmVkIGluIHJlZyAxLCBidXQgd2UgZG8gbm90IG5lZWQgaXQgYW55IGxvbmdlciBzaW5jZSBzdGFnZSAxIGFscmVhZHkKICAgICAgICAgKiByZWFkIGl0CiAgICAgICAgICovCiAgICAgICAgcmV0dXJuIEdMX1JFR18xX0FUSTsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogU2VhcmNoIGZvciBhIGZyZWUgdGV4dHVyZSByZWdpc3Rlci4gV2UgaGF2ZSA2IHJlZ2lzdGVycyBhdmFpbGFibGUuIEdMX1JFR18wX0FUSSBpcyBhbHJlYWR5IHVzZWQKICAgICAgICAgKiBmb3IgdGhlIHJlZ3VsYXIgcmVzdWx0CiAgICAgICAgICovCiAgICAgICAgZm9yKGkgPSAxOyBpIDwgNjsgaSsrKSB7CiAgICAgICAgICAgIGlmKCF0ZXhfdXNlZFtpXSkgewogICAgICAgICAgICAgICAgcmV0dXJuIEdMX1JFR18wX0FUSSArIGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyogV2hhdCB0byBkbyBoZXJlPyBSZXBvcnQgaXQgaW4gVmFsaWRhdGVEZXZpY2U/ICovCiAgICAgICAgRklYTUUoIkNvdWxkIG5vdCBmaW5kIGEgcmVnaXN0ZXIgZm9yIHRoZSB0ZW1wb3JhcnkgcmVnaXN0ZXJcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQp9CgpzdGF0aWMgR0x1aW50IGdlbl9hdGlfc2hhZGVyKHN0cnVjdCB0ZXh0dXJlX3N0YWdlX29wIG9wW01BWF9URVhUVVJFU10sIFdpbmVEM0RfR0xfSW5mbyAqZ2xfaW5mbykgewogICAgR0x1aW50IHJldCA9IEdMX0VYVENBTEwoZ2xHZW5GcmFnbWVudFNoYWRlcnNBVEkoMSkpOwogICAgdW5zaWduZWQgaW50IHN0YWdlOwogICAgR0x1aW50IGFyZzAsIGFyZzEsIGFyZzIsIGV4dHJhcmc7CiAgICBHTHVpbnQgZHN0bW9kLCBhcmdtb2QwLCBhcmdtb2QxLCBhcmdtb2QyLCBhcmdtb2RleHRyYTsKICAgIEdMdWludCByZXAwLCByZXAxLCByZXAyOwogICAgR0x1aW50IHN3aXp6bGU7CiAgICBHTHVpbnQgdG1wYXJnID0gZmluZF90bXByZWcob3ApOwogICAgR0x1aW50IGRzdHJlZzsKCiAgICBpZighcmV0KSB7CiAgICAgICAgRVJSKCJGYWlsZWQgdG8gZ2VuZXJhdGUgYSBHTF9BVElfZnJhZ21lbnRfc2hhZGVyIHNoYWRlciBpZFxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBHTF9FWFRDQUxMKGdsQmluZEZyYWdtZW50U2hhZGVyQVRJKHJldCkpOwogICAgY2hlY2tHTGNhbGwoIkdMX0VYVENBTEwoZ2xCaW5kRnJhZ21lbnRTaGFkZXJBVEkocmV0KSkiKTsKCiAgICBUUkFDRSgiZ2xCZWdpbkZyYWdtZW50U2hhZGVyQVRJKClcbiIpOwogICAgR0xfRVhUQ0FMTChnbEJlZ2luRnJhZ21lbnRTaGFkZXJBVEkoKSk7CiAgICBjaGVja0dMY2FsbCgiR0xfRVhUQ0FMTChnbEJlZ2luRnJhZ21lbnRTaGFkZXJBVEkoKSkiKTsKCiAgICAvKiBQYXNzIDE6IEdlbmVyYXRlIHNhbXBsaW5nIGluc3RydWN0aW9ucyBmb3IgcGVydHVyYmF0aW9uIG1hcHMgKi8KICAgICAgZm9yKHN0YWdlID0gMDsgc3RhZ2UgPCBHTF9MSU1JVFModGV4dHVyZXMpOyBzdGFnZSsrKSB7CiAgICAgICAgaWYob3Bbc3RhZ2VdLmNvcCA9PSBXSU5FRDNEVE9QX0RJU0FCTEUpIGJyZWFrOwogICAgICAgIGlmKG9wW3N0YWdlXS5jb3AgIT0gV0lORUQzRFRPUF9CVU1QRU5WTUFQICYmCiAgICAgICAgICAgb3Bbc3RhZ2VdLmNvcCAhPSBXSU5FRDNEVE9QX0JVTVBFTlZNQVBMVU1JTkFOQ0UpIGNvbnRpbnVlOwoKICAgICAgICBUUkFDRSgiZ2xTYW1wbGVNYXBBVEkoR0xfUkVHXyVkX0FUSSwgR0xfVEVYVFVSRV8lZF9BUkIsIEdMX1NXSVpaTEVfU1RSX0FUSSlcbiIsCiAgICAgICAgICAgICAgc3RhZ2UsIHN0YWdlKTsKICAgICAgICBHTF9FWFRDQUxMKGdsU2FtcGxlTWFwQVRJKEdMX1JFR18wX0FUSSArIHN0YWdlLAogICAgICAgICAgICAgICAgICAgR0xfVEVYVFVSRTBfQVJCICsgc3RhZ2UsCiAgICAgICAgICAgICAgICAgICBHTF9TV0laWkxFX1NUUl9BVEkpKTsKICAgICAgICBpZihvcFtzdGFnZSArIDFdLnByb2plY3RlZCA9PSBwcm9qX25vbmUpIHsKICAgICAgICAgICAgc3dpenpsZSA9IEdMX1NXSVpaTEVfU1RSX0FUSTsKICAgICAgICB9IGVsc2UgaWYob3Bbc3RhZ2UgKyAxXS5wcm9qZWN0ZWQgPT0gcHJval9jb3VudDQpIHsKICAgICAgICAgICAgc3dpenpsZSA9IEdMX1NXSVpaTEVfU1RRX0RRX0FUSTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzd2l6emxlID0gR0xfU1dJWlpMRV9TVFJfRFJfQVRJOwogICAgICAgIH0KICAgICAgICBUUkFDRSgiZ2xQYXNzVGV4Q29vcmRBVEkoR0xfUkVHXyVkX0FUSSwgR0xfVEVYVFVSRV8lZF9BUkIsICVzKVxuIiwKICAgICAgICAgICAgICBzdGFnZSArIDEsIHN0YWdlICsgMSwgZGVidWdfc3dpenpsZShzd2l6emxlKSk7CiAgICAgICAgR0xfRVhUQ0FMTChnbFBhc3NUZXhDb29yZEFUSShHTF9SRUdfMF9BVEkgKyBzdGFnZSArIDEsCiAgICAgICAgICAgICAgICAgICBHTF9URVhUVVJFMF9BUkIgKyBzdGFnZSArIDEsCiAgICAgICAgICAgICAgICAgICBzd2l6emxlKSk7CgogICAgICAgIC8qIFdlIG5lZWQgR0xfUkVHXzVfQVRJIGFzIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyIHRvIHN3aXp6bGUgdGhlIGJ1bXAgbWF0cml4LiBTbyB3ZSBydW4gaW50bwogICAgICAgICAqIGlzc3VlcyBpZiB3ZSdyZSBidW1wIG1hcHBpbmcgb24gc3RhZ2UgNCBvciA1CiAgICAgICAgICovCiAgICAgICAgaWYoc3RhZ2UgPj0gNCkgewogICAgICAgICAgICBGSVhNRSgiQnVtcCBtYXBwaW5nIGluIHN0YWdlICVkXG4iLCBzdGFnZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIFBhc3MgMjogR2VuZXJhdGUgcGVydHVyYmF0aW9uIGNhbGN1bGF0aW9ucyAqLwogICAgZm9yKHN0YWdlID0gMDsgc3RhZ2UgPCBHTF9MSU1JVFModGV4dHVyZXMpOyBzdGFnZSsrKSB7CiAgICAgICAgaWYob3Bbc3RhZ2VdLmNvcCA9PSBXSU5FRDNEVE9QX0RJU0FCTEUpIGJyZWFrOwogICAgICAgIGlmKG9wW3N0YWdlXS5jb3AgIT0gV0lORUQzRFRPUF9CVU1QRU5WTUFQICYmCiAgICAgICAgICAgb3Bbc3RhZ2VdLmNvcCAhPSBXSU5FRDNEVE9QX0JVTVBFTlZNQVBMVU1JTkFOQ0UpIGNvbnRpbnVlOwoKICAgICAgICAvKiBOaWNlIHRoaW5nLCB3ZSBnZXQgdGhlIGNvbG9yIGNvcnJlY3Rpb24gZm9yIGZyZWUgOi0pICovCiAgICAgICAgaWYob3Bbc3RhZ2VdLmNvbG9yX2NvcnJlY3Rpb24gPT0gV0lORUQzREZNVF9WOFU4KSB7CiAgICAgICAgICAgIGFyZ21vZGV4dHJhID0gR0xfMlhfQklUX0FUSSB8IEdMX0JJQVNfQklUX0FUSTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcmdtb2RleHRyYSA9IDA7CiAgICAgICAgfQoKICAgICAgICBUUkFDRSgiZ2xDb2xvckZyYWdtZW50T3AzQVRJKEdMX0RPVDJfQUREX0FUSSwgR0xfUkVHXyVkX0FUSSwgR0xfUkVEX0JJVF9BVEksIEdMX05PTkUsIEdMX1JFR18lZF9BVEksIEdMX05PTkUsICVzLCBBVElfRkZQX0NPTlNUX0JVTVBNQVQoJWQpLCBHTF9OT05FLCBHTF9OT05FLCBHTF9SRUdfJWRfQVRJLCBHTF9SRUQsIEdMX05PTkUpXG4iLAogICAgICAgICAgICAgIHN0YWdlICsgMSwgc3RhZ2UsIGRlYnVnX2FyZ21vZChhcmdtb2RleHRyYSksIHN0YWdlLCBzdGFnZSArIDEpOwogICAgICAgIEdMX0VYVENBTEwoZ2xDb2xvckZyYWdtZW50T3AzQVRJKEdMX0RPVDJfQUREX0FUSSwgR0xfUkVHXzBfQVRJICsgc3RhZ2UgKyAxLCBHTF9SRURfQklUX0FUSSwgR0xfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9SRUdfMF9BVEkgKyBzdGFnZSwgR0xfTk9ORSwgYXJnbW9kZXh0cmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRJX0ZGUF9DT05TVF9CVU1QTUFUKHN0YWdlKSwgR0xfTk9ORSwgR0xfMlhfQklUX0FUSSB8IEdMX0JJQVNfQklUX0FUSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9SRUdfMF9BVEkgKyBzdGFnZSArIDEsIEdMX1JFRCwgR0xfTk9ORSkpOwoKICAgICAgICAvKiBGSVhNRTogSG93IGNhbiBJIG1ha2UgR0xfRE9UMl9BRERfQVRJIHJlYWQgdGhlIGZhY3RvcnMgZnJvbSBibHVlIGFuZCBhbHBoYT8gSXQgZGVmYXVsdHMgdG8gcmVkIGFuZCBncmVlbiwKICAgICAgICAgKiBhbmQgaXQgaXMgZmFpcmx5IGVhc3kgdG8gbWFrZSBpdCByZWFkIEdMX0JMVUUgb3IgQkxfQUxQSEEsIGJ1dCBJIGNhbid0IGdldCBhbiBSICogQiArIEcgKiBBLiBTbyB3ZSdyZSB3YXN0aW5nCiAgICAgICAgICogb25lIHJlZ2lzdGVyIGFuZCB0d28gaW5zdHJ1Y3Rpb25zIGluIHRoaXMgcGFzcyBmb3IgYSBzaW1wbGUgc3dpenpsaW5nIG9wZXJhdGlvbi4KICAgICAgICAgKiBGb3Igc3RhcnRlcnMgaXQgbWlnaHQgYmUgZ29vZCBlbm91Z2ggdG8gbWVyZ2UgdGhlIHR3byBtb3ZzIGludG8gb25lLCBidXQgZXZlbiB0aGF0IGlzbid0IHBvc3NpYmxlIDotKAogICAgICAgICAqCiAgICAgICAgICogTk9URTogR0xfQkxVRSB8IEdMX0FMUEhBIGlzIG5vdCBwb3NzaWJsZS4gSXQgZG9lc24ndCB0aHJvdyBhIGNvbXBpbGF0aW9uIGVycm9yLCBidXQgYW4gT1Igb3BlcmF0aW9uIG9uIHRoZQogICAgICAgICAqIGNvbnN0YW50cyBkb2Vzbid0IG1ha2Ugc2Vuc2UsIGNvbnNpZGVyaW5nIHRoZWlyIHZhbHVlcy4KICAgICAgICAgKi8KICAgICAgICBUUkFDRSgiZ2xDb2xvckZyYWdtZW50T3AxQVRJKEdMX01PVl9BVEksIEdMX1JFR181X0FUSSwgR0xfUkVEX0JJVF9BVEksIEdMX05PTkUsIEFUSV9GRlBfQ09OU1RfQlVNUE1BVCglZCksIEdMX0JMVUUsIEdMX05PTkUpXG4iLCBzdGFnZSk7CiAgICAgICAgR0xfRVhUQ0FMTChnbENvbG9yRnJhZ21lbnRPcDFBVEkoR0xfTU9WX0FUSSwgR0xfUkVHXzVfQVRJLCBHTF9SRURfQklUX0FUSSwgR0xfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVElfRkZQX0NPTlNUX0JVTVBNQVQoc3RhZ2UpLCBHTF9CTFVFLCBHTF9OT05FKSk7CiAgICAgICAgVFJBQ0UoImdsQ29sb3JGcmFnbWVudE9wMUFUSShHTF9NT1ZfQVRJLCBHTF9SRUdfNV9BVEksIEdMX0dSRUVOX0JJVF9BVEksIEdMX05PTkUsIEFUSV9GRlBfQ09OU1RfQlVNUE1BVCglZCksIEdMX0FMUEhBLCBHTF9OT05FKVxuIiwgc3RhZ2UpOwogICAgICAgIEdMX0VYVENBTEwoZ2xDb2xvckZyYWdtZW50T3AxQVRJKEdMX01PVl9BVEksIEdMX1JFR181X0FUSSwgR0xfR1JFRU5fQklUX0FUSSwgR0xfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUSV9GRlBfQ09OU1RfQlVNUE1BVChzdGFnZSksIEdMX0FMUEhBLCBHTF9OT05FKSk7CiAgICAgICAgVFJBQ0UoImdsQ29sb3JGcmFnbWVudE9wM0FUSShHTF9ET1QyX0FERF9BVEksIEdMX1JFR18lZF9BVEksIEdMX0dSRUVOX0JJVF9BVEksIEdMX05PTkUsIEdMX1JFR18lZF9BVEksIEdMX05PTkUsICVzLCBHTF9SRUdfNV9BVEksIEdMX05PTkUsIEdMX05PTkUsIEdMX1JFR18lZF9BVEksIEdMX0dSRUVOLCBHTF9OT05FKVxuIiwKICAgICAgICAgICAgICBzdGFnZSArIDEsIHN0YWdlLCBkZWJ1Z19hcmdtb2QoYXJnbW9kZXh0cmEpLCBzdGFnZSArIDEpOwogICAgICAgIEdMX0VYVENBTEwoZ2xDb2xvckZyYWdtZW50T3AzQVRJKEdMX0RPVDJfQUREX0FUSSwgR0xfUkVHXzBfQVRJICsgc3RhZ2UgKyAxLCBHTF9HUkVFTl9CSVRfQVRJLCBHTF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JFR18wX0FUSSArIHN0YWdlLCBHTF9OT05FLCBhcmdtb2RleHRyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9SRUdfNV9BVEksIEdMX05PTkUsIEdMXzJYX0JJVF9BVEkgfCBHTF9CSUFTX0JJVF9BVEksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfUkVHXzBfQVRJICsgc3RhZ2UgKyAxLCBHTF9HUkVFTiwgR0xfTk9ORSkpOwogICAgfQoKICAgIC8qIFBhc3MgMzogR2VuZXJhdGUgc2FtcGxpbmcgaW5zdHJ1Y3Rpb25zIGZvciByZWd1bGFyIHRleHR1cmVzICovCiAgICBmb3Ioc3RhZ2UgPSAwOyBzdGFnZSA8IEdMX0xJTUlUUyh0ZXh0dXJlcyk7IHN0YWdlKyspIHsKICAgICAgICBpZihvcFtzdGFnZV0uY29wID09IFdJTkVEM0RUT1BfRElTQUJMRSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmKG9wW3N0YWdlXS5wcm9qZWN0ZWQgPT0gcHJval9ub25lKSB7CiAgICAgICAgICAgIHN3aXp6bGUgPSBHTF9TV0laWkxFX1NUUl9BVEk7CiAgICAgICAgfSBlbHNlIGlmKG9wW3N0YWdlXS5wcm9qZWN0ZWQgPT0gcHJval9jb3VudDMpIHsKICAgICAgICAgICAgc3dpenpsZSA9IEdMX1NXSVpaTEVfU1RSX0RSX0FUSTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzd2l6emxlID0gR0xfU1dJWlpMRV9TVFFfRFFfQVRJOwogICAgICAgIH0KCiAgICAgICAgaWYoKG9wW3N0YWdlXS5jYXJnMCAmIFdJTkVEM0RUQV9TRUxFQ1RNQVNLKSA9PSBXSU5FRDNEVEFfVEVYVFVSRSB8fAogICAgICAgICAgIChvcFtzdGFnZV0uY2FyZzEgJiBXSU5FRDNEVEFfU0VMRUNUTUFTSykgPT0gV0lORUQzRFRBX1RFWFRVUkUgfHwKICAgICAgICAgICAob3Bbc3RhZ2VdLmNhcmcyICYgV0lORUQzRFRBX1NFTEVDVE1BU0spID09IFdJTkVEM0RUQV9URVhUVVJFIHx8CiAgICAgICAgICAgKG9wW3N0YWdlXS5hYXJnMCAmIFdJTkVEM0RUQV9TRUxFQ1RNQVNLKSA9PSBXSU5FRDNEVEFfVEVYVFVSRSB8fAogICAgICAgICAgIChvcFtzdGFnZV0uYWFyZzEgJiBXSU5FRDNEVEFfU0VMRUNUTUFTSykgPT0gV0lORUQzRFRBX1RFWFRVUkUgfHwKICAgICAgICAgICAob3Bbc3RhZ2VdLmFhcmcyICYgV0lORUQzRFRBX1NFTEVDVE1BU0spID09IFdJTkVEM0RUQV9URVhUVVJFIHx8CiAgICAgICAgICAgIG9wW3N0YWdlXS5jb3AgPT0gV0lORUQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQSkgewoKICAgICAgICAgICAgaWYoc3RhZ2UgPiAwICYmCiAgICAgICAgICAgICAgIChvcFtzdGFnZSAtIDFdLmNvcCA9PSBXSU5FRDNEVE9QX0JVTVBFTlZNQVAgfHwKICAgICAgICAgICAgICAgIG9wW3N0YWdlIC0gMV0uY29wID09IFdJTkVEM0RUT1BfQlVNUEVOVk1BUExVTUlOQU5DRSkpIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJnbFNhbXBsZU1hcEFUSShHTF9SRUdfJWRfQVRJLCBHTF9SRUdfJWRfQVRJLCBHTF9TV0laWkxFX1NUUl9BVEkpXG4iLAogICAgICAgICAgICAgICAgICAgICAgc3RhZ2UsIHN0YWdlKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xTYW1wbGVNYXBBVEkoR0xfUkVHXzBfQVRJICsgc3RhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JFR18wX0FUSSArIHN0YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9TV0laWkxFX1NUUl9BVEkpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJnbFNhbXBsZU1hcEFUSShHTF9SRUdfJWRfQVRJLCBHTF9URVhUVVJFXyVkX0FSQiwgJXMpXG4iLAogICAgICAgICAgICAgICAgICAgIHN0YWdlLCBzdGFnZSwgZGVidWdfc3dpenpsZShzd2l6emxlKSk7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsU2FtcGxlTWFwQVRJKEdMX1JFR18wX0FUSSArIHN0YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfVEVYVFVSRTBfQVJCICsgc3RhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l6emxlKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogUGFzcyA0OiBHZW5lcmF0ZSB0aGUgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMgKi8KICAgIGZvcihzdGFnZSA9IDA7IHN0YWdlIDwgTUFYX1RFWFRVUkVTOyBzdGFnZSsrKSB7CiAgICAgICAgaWYob3Bbc3RhZ2VdLmNvcCA9PSBXSU5FRDNEVE9QX0RJU0FCTEUpIHsKICAgICAgICAgICAgaWYoc3RhZ2UgPT0gMCkgewogICAgICAgICAgICAgICAgLyogSGFuZGxlIGNvbXBsZXRlIHRleHR1cmUgZGlzYWJsaW5nIGdyYWNlZnVsbHkgKi8KICAgICAgICAgICAgICAgIFRSQUNFKCJnbENvbG9yRnJhZ21lbnRPcDFBVEkoR0xfTU9WX0FUSSwgR0xfUkVHXzBfQVRJLCBHTF9OT05FLCBHTF9OT05FLCBHTF9QUklNQVJZX0NPTE9SLCBHTF9OT05FLCBHTF9OT05FKVxuIik7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29sb3JGcmFnbWVudE9wMUFUSShHTF9NT1ZfQVRJLCBHTF9SRUdfMF9BVEksIEdMX05PTkUsIEdMX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9QUklNQVJZX0NPTE9SLCBHTF9OT05FLCBHTF9OT05FKSk7CiAgICAgICAgICAgICAgICBUUkFDRSgiZ2xBbHBoYUZyYWdtZW50T3AxQVRJKEdMX01PVl9BVEksIEdMX1JFR18wX0FUSSwgR0xfTk9ORSwgR0xfUFJJTUFSWV9DT0xPUiwgR0xfTk9ORSwgR0xfTk9ORSlcbiIpOwogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEFscGhhRnJhZ21lbnRPcDFBVEkoR0xfTU9WX0FUSSwgR0xfUkVHXzBfQVRJLCBHTF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfUFJJTUFSWV9DT0xPUiwgR0xfTk9ORSwgR0xfTk9ORSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYob3Bbc3RhZ2VdLmRzdCA9PSB0ZW1wcmVnKSB7CiAgICAgICAgICAgIC8qIElmIHdlJ3JlIHdyaXRpbmcgdG8gRDNEVEFfVEVNUCwgYnV0IG5ldmVyIHJlYWRpbmcgZnJvbSBpdCB3ZSBkb24ndCBoYXZlIHRvIHdyaXRlIHRoZXJlIGluIHRoZSBmaXJzdCBwbGFjZS4KICAgICAgICAgICAgICogc2tpcCB0aGUgZW50aXJlIHN0YWdlLCB0aGlzIHNhdmVzIHNvbWUgR1BVIHRpbWUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmKHRtcGFyZyA9PSBHTF9OT05FKSBjb250aW51ZTsKCiAgICAgICAgICAgIGRzdHJlZyA9IHRtcGFyZzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkc3RyZWcgPSBHTF9SRUdfMF9BVEk7CiAgICAgICAgfQoKICAgICAgICBhcmcwID0gcmVnaXN0ZXJfZm9yX2FyZyhvcFtzdGFnZV0uY2FyZzAsIGdsX2luZm8sIHN0YWdlLCAmYXJnbW9kMCwgJnJlcDAsIHRtcGFyZyk7CiAgICAgICAgYXJnMSA9IHJlZ2lzdGVyX2Zvcl9hcmcob3Bbc3RhZ2VdLmNhcmcxLCBnbF9pbmZvLCBzdGFnZSwgJmFyZ21vZDEsICZyZXAxLCB0bXBhcmcpOwogICAgICAgIGFyZzIgPSByZWdpc3Rlcl9mb3JfYXJnKG9wW3N0YWdlXS5jYXJnMiwgZ2xfaW5mbywgc3RhZ2UsICZhcmdtb2QyLCAmcmVwMiwgdG1wYXJnKTsKICAgICAgICBkc3Rtb2QgPSBHTF9OT05FOwogICAgICAgIGFyZ21vZGV4dHJhID0gR0xfTk9ORTsKICAgICAgICBleHRyYXJnID0gR0xfTk9ORTsKCiAgICAgICAgc3dpdGNoKG9wW3N0YWdlXS5jb3ApIHsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX1NFTEVDVEFSRzI6CiAgICAgICAgICAgICAgICBhcmcxID0gYXJnMjsKICAgICAgICAgICAgICAgIGFyZ21vZDEgPSBhcmdtb2QyOwogICAgICAgICAgICAgICAgcmVwMSA9IHJlcDI7CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9TRUxFQ1RBUkcxOgogICAgICAgICAgICAgICAgVFJBQ0UoImdsQ29sb3JGcmFnbWVudE9wMUFUSShHTF9NT1ZfQVRJLCAlcywgR0xfTk9ORSwgR0xfTk9ORSwgJXMsICVzLCAlcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3Rlcihkc3RyZWcpLCBkZWJ1Z19yZWdpc3RlcihhcmcxKSwgZGVidWdfcmVwKHJlcDEpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMSkpOwogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbG9yRnJhZ21lbnRPcDFBVEkoR0xfTU9WX0FUSSwgZHN0cmVnLCBHTF9OT05FLCBHTF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgcmVwMSwgYXJnbW9kMSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTU9EVUxBVEU0WDoKICAgICAgICAgICAgICAgIGlmKGRzdG1vZCA9PSBHTF9OT05FKSBkc3Rtb2QgPSBHTF80WF9CSVRfQVRJOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTU9EVUxBVEUyWDoKICAgICAgICAgICAgICAgIGlmKGRzdG1vZCA9PSBHTF9OT05FKSBkc3Rtb2QgPSBHTF8yWF9CSVRfQVRJOwogICAgICAgICAgICAgICAgZHN0bW9kIHw9IEdMX1NBVFVSQVRFX0JJVF9BVEk7CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURToKICAgICAgICAgICAgICAgIFRSQUNFKCJnbENvbG9yRnJhZ21lbnRPcDJBVEkoR0xfTVVMX0FUSSwgJXMsIEdMX05PTkUsICVzLCAlcywgJXMsICVzLCAlcywgJXMsICVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGRzdHJlZyksIGRlYnVnX2RzdG1vZChkc3Rtb2QpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMSksIGRlYnVnX3JlcChyZXAxKSwgZGVidWdfYXJnbW9kKGFyZ21vZDEpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMiksIGRlYnVnX3JlcChyZXAyKSwgZGVidWdfYXJnbW9kKGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb2xvckZyYWdtZW50T3AyQVRJKEdMX01VTF9BVEksIGRzdHJlZywgR0xfTk9ORSwgZHN0bW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgcmVwMSwgYXJnbW9kMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzIsIHJlcDIsIGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0FERFNJR05FRDJYOgogICAgICAgICAgICAgICAgZHN0bW9kID0gR0xfMlhfQklUX0FUSTsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0FERFNJR05FRDoKICAgICAgICAgICAgICAgIGFyZ21vZGV4dHJhID0gR0xfQklBU19CSVRfQVRJOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQUREOgogICAgICAgICAgICAgICAgZHN0bW9kIHw9IEdMX1NBVFVSQVRFX0JJVF9BVEk7CiAgICAgICAgICAgICAgICBUUkFDRSgiZ2xDb2xvckZyYWdtZW50T3AyQVRJKEdMX0FERF9BVEksICVzLCBHTF9OT05FLCAlcywgJXMsICVzLCAlcywgJXMsICVzLCAlcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3Rlcihkc3RyZWcpLCBkZWJ1Z19kc3Rtb2QoZHN0bW9kKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19yZXAocmVwMSksIGRlYnVnX2FyZ21vZChhcmdtb2QxKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzIpLCBkZWJ1Z19yZXAocmVwMiksIGRlYnVnX2FyZ21vZChhcmdtb2RleHRyYSB8IGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb2xvckZyYWdtZW50T3AyQVRJKEdMX0FERF9BVEksIEdMX1JFR18wX0FUSSwgR0xfTk9ORSwgZHN0bW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgcmVwMSwgYXJnbW9kMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzIsIHJlcDIsIGFyZ21vZGV4dHJhIHwgYXJnbW9kMikpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfU1VCVFJBQ1Q6CiAgICAgICAgICAgICAgICBkc3Rtb2QgfD0gR0xfU0FUVVJBVEVfQklUX0FUSTsKICAgICAgICAgICAgICAgIFRSQUNFKCJnbENvbG9yRnJhZ21lbnRPcDJBVEkoR0xfU1VCX0FUSSwgJXMsIEdMX05PTkUsICVzLCAlcywgJXMsICVzLCAlcywgJXMsICVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGRzdHJlZyksIGRlYnVnX2RzdG1vZChkc3Rtb2QpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMSksIGRlYnVnX3JlcChyZXAxKSwgZGVidWdfYXJnbW9kKGFyZ21vZDEpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMiksIGRlYnVnX3JlcChyZXAyKSwgZGVidWdfYXJnbW9kKGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb2xvckZyYWdtZW50T3AyQVRJKEdMX1NVQl9BVEksIGRzdHJlZywgR0xfTk9ORSwgZHN0bW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgcmVwMSwgYXJnbW9kMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzIsIHJlcDIsIGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0FERFNNT09USDoKICAgICAgICAgICAgICAgIGFyZ21vZGV4dHJhID0gYXJnbW9kMSAmIEdMX0NPTVBfQklUX0FUSSA/IGFyZ21vZDEgJiB+R0xfQ09NUF9CSVRfQVRJIDogYXJnbW9kMSB8IEdMX0NPTVBfQklUX0FUSTsKICAgICAgICAgICAgICAgIFRSQUNFKCJnbENvbG9yRnJhZ21lbnRPcDNBVEkoR0xfTUFEX0FUSSwgJXMsIEdMX05PTkUsIEdMX1NBVFVSQVRFX0JJVF9BVEksICVzLCAlcywgJXMsICVzLCAlcywgJXMsICVzLCAlcywgJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoZHN0cmVnKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzIpLCBkZWJ1Z19yZXAocmVwMiksIGRlYnVnX2FyZ21vZChhcmdtb2QyKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19yZXAocmVwMSksIGRlYnVnX2FyZ21vZChhcmdtb2RleHRyYSksCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3RlcihhcmcxKSwgZGVidWdfcmVwKHJlcDEpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMSkpOwogICAgICAgICAgICAgICAgLyogRHN0ID0gYXJnMSArICogYXJnMigxIC1hcmcgMSkKICAgICAgICAgICAgICAgICAqICAgICA9IGFyZzIgKiAoMSAtIGFyZzEpICsgYXJnMQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29sb3JGcmFnbWVudE9wM0FUSShHTF9NQURfQVRJLCBkc3RyZWcsIEdMX05PTkUsIEdMX1NBVFVSQVRFX0JJVF9BVEksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyLCByZXAyLCBhcmdtb2QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgcmVwMSwgYXJnbW9kZXh0cmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLCByZXAxLCBhcmdtb2QxKSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9CTEVORENVUlJFTlRBTFBIQToKICAgICAgICAgICAgICAgIGlmKGV4dHJhcmcgPT0gR0xfTk9ORSkgZXh0cmFyZyA9IHJlZ2lzdGVyX2Zvcl9hcmcoV0lORUQzRFRBX0NVUlJFTlQsIGdsX2luZm8sIHN0YWdlLCBOVUxMLCBOVUxMLCAtMSk7CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9CTEVOREZBQ1RPUkFMUEhBOgogICAgICAgICAgICAgICAgaWYoZXh0cmFyZyA9PSBHTF9OT05FKSBleHRyYXJnID0gcmVnaXN0ZXJfZm9yX2FyZyhXSU5FRDNEVEFfVEZBQ1RPUiwgZ2xfaW5mbywgc3RhZ2UsIE5VTEwsIE5VTEwsIC0xKTsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBOgogICAgICAgICAgICAgICAgaWYoZXh0cmFyZyA9PSBHTF9OT05FKSBleHRyYXJnID0gcmVnaXN0ZXJfZm9yX2FyZyhXSU5FRDNEVEFfVEVYVFVSRSwgZ2xfaW5mbywgc3RhZ2UsIE5VTEwsIE5VTEwsIC0xKTsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0JMRU5ERElGRlVTRUFMUEhBOgogICAgICAgICAgICAgICAgaWYoZXh0cmFyZyA9PSBHTF9OT05FKSBleHRyYXJnID0gcmVnaXN0ZXJfZm9yX2FyZyhXSU5FRDNEVEFfRElGRlVTRSwgZ2xfaW5mbywgc3RhZ2UsIE5VTEwsIE5VTEwsIC0xKTsKICAgICAgICAgICAgICAgIFRSQUNFKCJnbENvbG9yRnJhZ21lbnRPcDNBVEkoR0xfTEVSUF9BVEksICVzLCBHTF9OT05FLCBHTF9OT05FLCAlcywgR0xfQUxQSEEsIEdMX05PTkUsICVzLCAlcywgJXMsICVzLCAlcywgJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoZHN0cmVnKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGV4dHJhcmcpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMSksIGRlYnVnX3JlcChyZXAxKSwgZGVidWdfYXJnbW9kKGFyZ21vZDEpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMiksIGRlYnVnX3JlcChyZXAyKSwgZGVidWdfYXJnbW9kKGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb2xvckZyYWdtZW50T3AzQVRJKEdMX0xFUlBfQVRJLCBkc3RyZWcsIEdMX05PTkUsIEdMX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXJnLCBHTF9BTFBIQSwgR0xfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEsIHJlcDEsIGFyZ21vZDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyLCByZXAyLCBhcmdtb2QyKSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQVBNOgogICAgICAgICAgICAgICAgYXJnMCA9IHJlZ2lzdGVyX2Zvcl9hcmcoV0lORUQzRFRBX1RFWFRVUkUsIGdsX2luZm8sIHN0YWdlLCBOVUxMLCBOVUxMLCAtMSk7CiAgICAgICAgICAgICAgICBUUkFDRSgiZ2xDb2xvckZyYWdtZW50T3AzQVRJKEdMX01BRF9BVEksICVzLCBHTF9OT05FLCBHTF9OT05FLCAlcywgJXMsICVzLCAlcywgR0xfQUxQSEEsIEdMX0NPTVBfQklUX0FUSSwgJXMsICVzLCAlcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3Rlcihkc3RyZWcpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMiksIGRlYnVnX3JlcChyZXAyKSwgZGVidWdfYXJnbW9kKGFyZ21vZDIpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMCksCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3RlcihhcmcxKSwgZGVidWdfcmVwKHJlcDEpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMSkpOwogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbG9yRnJhZ21lbnRPcDNBVEkoR0xfTUFEX0FUSSwgZHN0cmVnLCBHTF9OT05FLCBHTF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMiwgcmVwMiwgIGFyZ21vZDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcwLCBHTF9BTFBIQSwgR0xfQ09NUF9CSVRfQVRJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgcmVwMSwgIGFyZ21vZDEpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgLyogRDNEVE9QX1BSRU1PRFVMQVRFID8/Pz8gKi8KCiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SOgogICAgICAgICAgICAgICAgYXJnbW9kZXh0cmEgPSBhcmdtb2QxICYgR0xfQ09NUF9CSVRfQVRJID8gYXJnbW9kMSAmIH5HTF9DT01QX0JJVF9BVEkgOiBhcmdtb2QxIHwgR0xfQ09NUF9CSVRfQVRJOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTU9EVUxBVEVBTFBIQV9BRERDT0xPUjoKICAgICAgICAgICAgICAgIGlmKCFhcmdtb2RleHRyYSkgYXJnbW9kZXh0cmEgPSBhcmdtb2QxOwogICAgICAgICAgICAgICAgVFJBQ0UoImdsQ29sb3JGcmFnbWVudE9wM0FUSShHTF9NQURfQVRJLCAlcywgR0xfTk9ORSwgR0xfU0FUVVJBVEVfQklUX0FUSSwgJXMsICVzLCAlcywgJXMsIEdMX0FMUEhBLCAlcywgJXMsICVzLCAlcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3Rlcihkc3RyZWcpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMiksIGRlYnVnX3JlcChyZXAyKSwgZGVidWdfYXJnbW9kKGFyZ21vZDIpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMSksIGRlYnVnX2FyZ21vZChhcmdtb2RleHRyYSksIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19yZXAocmVwMSksIGRlYnVnX2FyZ21vZChhcmcxKSk7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29sb3JGcmFnbWVudE9wM0FUSShHTF9NQURfQVRJLCBkc3RyZWcsIEdMX05PTkUsIEdMX1NBVFVSQVRFX0JJVF9BVEksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyLCByZXAyLCAgYXJnbW9kMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEsIEdMX0FMUEhBLCBhcmdtb2RleHRyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEsIHJlcDEsICBhcmdtb2QxKSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBOgogICAgICAgICAgICAgICAgYXJnbW9kZXh0cmEgPSBhcmdtb2QxICYgR0xfQ09NUF9CSVRfQVRJID8gYXJnbW9kMSAmIH5HTF9DT01QX0JJVF9BVEkgOiBhcmdtb2QxIHwgR0xfQ09NUF9CSVRfQVRJOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTU9EVUxBVEVDT0xPUl9BRERBTFBIQToKICAgICAgICAgICAgICAgIGlmKCFhcmdtb2RleHRyYSkgYXJnbW9kZXh0cmEgPSBhcmdtb2QxOwogICAgICAgICAgICAgICAgVFJBQ0UoImdsQ29sb3JGcmFnbWVudE9wM0FUSShHTF9NQURfQVRJLCAlcywgR0xfTk9ORSwgR0xfU0FUVVJBVEVfQklUX0FUSSwgJXMsICVzLCAlcywgJXMsICVzLCAlcywgJXMsIEdMX0FMUEhBLCAlcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3Rlcihkc3RyZWcpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMiksIGRlYnVnX3JlcChyZXAyKSwgZGVidWdfYXJnbW9kKGFyZ21vZDIpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMSksIGRlYnVnX3JlcChyZXAxKSwgZGVidWdfYXJnbW9kKGFyZ21vZGV4dHJhKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMSkpOwogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbG9yRnJhZ21lbnRPcDNBVEkoR0xfTUFEX0FUSSwgZHN0cmVnLCBHTF9OT05FLCBHTF9TQVRVUkFURV9CSVRfQVRJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMiwgcmVwMiwgIGFyZ21vZDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLCByZXAxLCAgYXJnbW9kZXh0cmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLCBHTF9BTFBIQSwgYXJnbW9kMSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfRE9UUFJPRFVDVDM6CiAgICAgICAgICAgICAgICBUUkFDRSgiZ2xDb2xvckZyYWdtZW50T3AyQVRJKEdMX0RPVDNfQVRJLCAlcywgR0xfTk9ORSwgR0xfNFhfQklUX0FUSSB8IEdMX1NBVFVSQVRFX0JJVF9BVEksICVzLCAlcywgJXMsICVzLCAlcywgJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoZHN0cmVnKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19yZXAocmVwMSksIGRlYnVnX2FyZ21vZChhcmdtb2QxIHwgR0xfQklBU19CSVRfQVRJKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzIpLCBkZWJ1Z19yZXAocmVwMiksIGRlYnVnX2FyZ21vZChhcmdtb2QyIHwgR0xfQklBU19CSVRfQVRJKSk7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29sb3JGcmFnbWVudE9wMkFUSShHTF9ET1QzX0FUSSwgZHN0cmVnLCBHTF9OT05FLCBHTF80WF9CSVRfQVRJIHwgR0xfU0FUVVJBVEVfQklUX0FUSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEsIHJlcDEsIGFyZ21vZDEgfCBHTF9CSUFTX0JJVF9BVEksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyLCByZXAyLCBhcmdtb2QyIHwgR0xfQklBU19CSVRfQVRJKSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9NVUxUSVBMWUFERDoKICAgICAgICAgICAgICAgIFRSQUNFKCJnbENvbG9yRnJhZ21lbnRPcDNBVEkoR0xfTUFEX0FUSSwgJXMsIEdMX05PTkUsIEdMX1NBVFVSQVRFX0JJVF9BVEksICVzLCAlcywgJXMsICVzLCAlcywgJXMsICVzLCAlcywgJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoZHN0cmVnKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19yZXAocmVwMSksIGRlYnVnX2FyZ21vZChhcmdtb2QxKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzIpLCBkZWJ1Z19yZXAocmVwMiksIGRlYnVnX2FyZ21vZChhcmdtb2QyKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzApLCBkZWJ1Z19yZXAocmVwMCksIGRlYnVnX2FyZ21vZChhcmdtb2QwKSk7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQ29sb3JGcmFnbWVudE9wM0FUSShHTF9NQURfQVRJLCBkc3RyZWcsIEdMX05PTkUsIEdMX1NBVFVSQVRFX0JJVF9BVEksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLCByZXAxLCBhcmdtb2QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMiwgcmVwMiwgYXJnbW9kMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzAsIHJlcDAsIGFyZ21vZDApKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0xFUlA6CiAgICAgICAgICAgICAgICBUUkFDRSgiZ2xDb2xvckZyYWdtZW50T3AzQVRJKEdMX0xFUlBfQVRJLCAlcywgR0xfTk9ORSwgR0xfTk9ORSwgJXMsICVzLCAlcywgJXMsICVzLCAlcywgJXMsICVzLCAlcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3Rlcihkc3RyZWcpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMSksIGRlYnVnX3JlcChyZXAxKSwgZGVidWdfYXJnbW9kKGFyZ21vZDEpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMiksIGRlYnVnX3JlcChyZXAyKSwgZGVidWdfYXJnbW9kKGFyZ21vZDIpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMCksIGRlYnVnX3JlcChyZXAwKSwgZGVidWdfYXJnbW9kKGFyZ21vZDApKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xDb2xvckZyYWdtZW50T3AzQVRJKEdMX0xFUlBfQVRJLCBkc3RyZWcsIEdMX05PTkUsIEdMX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcwLCByZXAwLCBhcmdtb2QwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgcmVwMSwgYXJnbW9kMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzIsIHJlcDIsIGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0JVTVBFTlZNQVA6CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFOgogICAgICAgICAgICAgICAgLyogVGhvc2UgYXJlIGhhbmRsZWQgaW4gdGhlIGZpcnN0IHBhc3Mgb2YgdGhlIHNoYWRlcihnZW5lcmF0aW9uIHBhc3MgMSBhbmQgMikgYWxyZWFkeSAqLwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OiBGSVhNRSgiVW5oYW5kbGVkIGNvbG9yIG9wZXJhdGlvbiAlZCBvbiBzdGFnZSAlZFxuIiwgb3Bbc3RhZ2VdLmNvcCwgc3RhZ2UpOwogICAgICAgIH0KCiAgICAgICAgYXJnMCA9IHJlZ2lzdGVyX2Zvcl9hcmcob3Bbc3RhZ2VdLmFhcmcwLCBnbF9pbmZvLCBzdGFnZSwgJmFyZ21vZDAsIE5VTEwsIHRtcGFyZyk7CiAgICAgICAgYXJnMSA9IHJlZ2lzdGVyX2Zvcl9hcmcob3Bbc3RhZ2VdLmFhcmcxLCBnbF9pbmZvLCBzdGFnZSwgJmFyZ21vZDEsIE5VTEwsIHRtcGFyZyk7CiAgICAgICAgYXJnMiA9IHJlZ2lzdGVyX2Zvcl9hcmcob3Bbc3RhZ2VdLmFhcmcyLCBnbF9pbmZvLCBzdGFnZSwgJmFyZ21vZDIsIE5VTEwsIHRtcGFyZyk7CiAgICAgICAgZHN0bW9kID0gR0xfTk9ORTsKICAgICAgICBhcmdtb2RleHRyYSA9IEdMX05PTkU7CiAgICAgICAgZXh0cmFyZyA9IEdMX05PTkU7CgogICAgICAgIHN3aXRjaChvcFtzdGFnZV0uYW9wKSB7CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9ESVNBQkxFOgogICAgICAgICAgICAgICAgLyogR2V0IHRoZSBwcmltYXJ5IGNvbG9yIHRvIHRoZSBvdXRwdXQgaWYgb24gc3RhZ2UgMCwgb3RoZXJ3aXNlIGxlYXZlIHJlZ2lzdGVyIDAgdW50b3VjaGVkICovCiAgICAgICAgICAgICAgICBpZihzdGFnZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoImdsQWxwaGFGcmFnbWVudE9wMUFUSShHTF9NT1ZfQVRJLCBHTF9SRUdfMF9BVEksIEdMX05PTkUsIEdMX1BSSU1BUllfQ09MT1IsIEdMX05PTkUsIEdMX05PTkUpXG4iKTsKICAgICAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQWxwaGFGcmFnbWVudE9wMUFUSShHTF9NT1ZfQVRJLCBHTF9SRUdfMF9BVEksIEdMX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9QUklNQVJZX0NPTE9SLCBHTF9OT05FLCBHTF9OT05FKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9TRUxFQ1RBUkcyOgogICAgICAgICAgICAgICAgYXJnMSA9IGFyZzI7CiAgICAgICAgICAgICAgICBhcmdtb2QxID0gYXJnbW9kMjsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX1NFTEVDVEFSRzE6CiAgICAgICAgICAgICAgICBUUkFDRSgiZ2xBbHBoYUZyYWdtZW50T3AxQVRJKEdMX01PVl9BVEksICVzLCAgICAgICAgICBHTF9OT05FLCAlcywgR0xfTk9ORSwgJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoZHN0cmVnKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMSkpOwogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEFscGhhRnJhZ21lbnRPcDFBVEkoR0xfTU9WX0FUSSwgZHN0cmVnLCBHTF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgR0xfTk9ORSwgYXJnbW9kMSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTU9EVUxBVEU0WDoKICAgICAgICAgICAgICAgIGlmKGRzdG1vZCA9PSBHTF9OT05FKSBkc3Rtb2QgPSBHTF80WF9CSVRfQVRJOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTU9EVUxBVEUyWDoKICAgICAgICAgICAgICAgIGlmKGRzdG1vZCA9PSBHTF9OT05FKSBkc3Rtb2QgPSBHTF8yWF9CSVRfQVRJOwogICAgICAgICAgICAgICAgZHN0bW9kIHw9IEdMX1NBVFVSQVRFX0JJVF9BVEk7CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURToKICAgICAgICAgICAgICAgIFRSQUNFKCJnbEFscGhhRnJhZ21lbnRPcDJBVEkoR0xfTVVMX0FUSSwgJXMsICAgICAgICAgICVzLCAlcywgR0xfTk9ORSwgJXMsICVzLCBHTF9OT05FLCAlcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3Rlcihkc3RyZWcpLCBkZWJ1Z19kc3Rtb2QoZHN0bW9kKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMSksCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3RlcihhcmcyKSwgZGVidWdfYXJnbW9kKGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBbHBoYUZyYWdtZW50T3AyQVRJKEdMX01VTF9BVEksIGRzdHJlZywgZHN0bW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgR0xfTk9ORSwgYXJnbW9kMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzIsIEdMX05PTkUsIGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0FERFNJR05FRDJYOgogICAgICAgICAgICAgICAgZHN0bW9kID0gR0xfMlhfQklUX0FUSTsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0FERFNJR05FRDoKICAgICAgICAgICAgICAgIGFyZ21vZGV4dHJhID0gR0xfQklBU19CSVRfQVRJOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfQUREOgogICAgICAgICAgICAgICAgZHN0bW9kIHw9IEdMX1NBVFVSQVRFX0JJVF9BVEk7CiAgICAgICAgICAgICAgICBUUkFDRSgiZ2xBbHBoYUZyYWdtZW50T3AyQVRJKEdMX0FERF9BVEksICVzLCAgICAgICAgICAlcywgJXMsIEdMX05PTkUsICVzLCAlcywgR0xfTk9ORSwgJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoZHN0cmVnKSwgZGVidWdfZHN0bW9kKGRzdG1vZCksCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3RlcihhcmcxKSwgZGVidWdfYXJnbW9kKGFyZ21vZDEpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMiksIGRlYnVnX2FyZ21vZChhcmdtb2RleHRyYSB8IGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBbHBoYUZyYWdtZW50T3AyQVRJKEdMX0FERF9BVEksIGRzdHJlZywgZHN0bW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgR0xfTk9ORSwgYXJnbW9kMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzIsIEdMX05PTkUsIGFyZ21vZGV4dHJhIHwgYXJnbW9kMikpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfU1VCVFJBQ1Q6CiAgICAgICAgICAgICAgICBkc3Rtb2QgfD0gR0xfU0FUVVJBVEVfQklUX0FUSTsKICAgICAgICAgICAgICAgIFRSQUNFKCJnbEFscGhhRnJhZ21lbnRPcDJBVEkoR0xfU1VCX0FUSSwgJXMsIEdMX05PTkUsICVzLCAlcywgR0xfTk9ORSwgJXMsICVzLCBHTF9OT05FLCAlcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3Rlcihkc3RyZWcpLCBkZWJ1Z19kc3Rtb2QoZHN0bW9kKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMSksCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3RlcihhcmcyKSwgZGVidWdfYXJnbW9kKGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBbHBoYUZyYWdtZW50T3AyQVRJKEdMX1NVQl9BVEksIGRzdHJlZywgZHN0bW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgR0xfTk9ORSwgYXJnbW9kMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzIsIEdMX05PTkUsIGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0FERFNNT09USDoKICAgICAgICAgICAgICAgIGFyZ21vZGV4dHJhID0gYXJnbW9kMSAmIEdMX0NPTVBfQklUX0FUSSA/IGFyZ21vZDEgJiB+R0xfQ09NUF9CSVRfQVRJIDogYXJnbW9kMSB8IEdMX0NPTVBfQklUX0FUSTsKICAgICAgICAgICAgICAgIFRSQUNFKCJnbEFscGhhRnJhZ21lbnRPcDNBVEkoR0xfTUFEX0FUSSwgJXMsICAgICAgICAgIEdMX1NBVFVSQVRFX0JJVF9BVEksICVzLCBHTF9OT05FLCAlcywgJXMsIEdMX05PTkUsICVzLCAlcywgR0xfTk9ORSwgJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoZHN0cmVnKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzIpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMiksCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3RlcihhcmcxKSwgZGVidWdfYXJnbW9kKGFyZ21vZGV4dHJhKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMSkpOwogICAgICAgICAgICAgICAgLyogRHN0ID0gYXJnMSArICogYXJnMigxIC1hcmcgMSkKICAgICAgICAgICAgICAgICAqICAgICA9IGFyZzIgKiAoMSAtIGFyZzEpICsgYXJnMQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQWxwaGFGcmFnbWVudE9wM0FUSShHTF9NQURfQVRJLCBkc3RyZWcsIEdMX1NBVFVSQVRFX0JJVF9BVEksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyLCBHTF9OT05FLCBhcmdtb2QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgR0xfTk9ORSwgYXJnbW9kZXh0cmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLCBHTF9OT05FLCBhcmdtb2QxKSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9CTEVORENVUlJFTlRBTFBIQToKICAgICAgICAgICAgICAgIGlmKGV4dHJhcmcgPT0gR0xfTk9ORSkgZXh0cmFyZyA9IHJlZ2lzdGVyX2Zvcl9hcmcoV0lORUQzRFRBX0NVUlJFTlQsIGdsX2luZm8sIHN0YWdlLCBOVUxMLCBOVUxMLCAtMSk7CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9CTEVOREZBQ1RPUkFMUEhBOgogICAgICAgICAgICAgICAgaWYoZXh0cmFyZyA9PSBHTF9OT05FKSBleHRyYXJnID0gcmVnaXN0ZXJfZm9yX2FyZyhXSU5FRDNEVEFfVEZBQ1RPUiwgZ2xfaW5mbywgc3RhZ2UsIE5VTEwsIE5VTEwsIC0xKTsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBOgogICAgICAgICAgICAgICAgaWYoZXh0cmFyZyA9PSBHTF9OT05FKSBleHRyYXJnID0gcmVnaXN0ZXJfZm9yX2FyZyhXSU5FRDNEVEFfVEVYVFVSRSwgZ2xfaW5mbywgc3RhZ2UsIE5VTEwsIE5VTEwsIC0xKTsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0JMRU5ERElGRlVTRUFMUEhBOgogICAgICAgICAgICAgICAgaWYoZXh0cmFyZyA9PSBHTF9OT05FKSBleHRyYXJnID0gcmVnaXN0ZXJfZm9yX2FyZyhXSU5FRDNEVEFfRElGRlVTRSwgZ2xfaW5mbywgc3RhZ2UsIE5VTEwsIE5VTEwsIC0xKTsKICAgICAgICAgICAgICAgIFRSQUNFKCJnbEFscGhhRnJhZ21lbnRPcDNBVEkoR0xfTEVSUF9BVEksICVzLCAgICAgICAgICBHTF9OT05FLCAlcywgR0xfQUxQSEEsIEdMX05PTkUsICVzLCBHTF9OT05FLCAlcywgJXMsIEdMX05PTkUsICVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGRzdHJlZyksCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3RlcihleHRyYXJnKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMSksCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3RlcihhcmcyKSwgZGVidWdfYXJnbW9kKGFyZ21vZDIpKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBbHBoYUZyYWdtZW50T3AzQVRJKEdMX0xFUlBfQVRJLCBkc3RyZWcsIEdMX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXJnLCBHTF9BTFBIQSwgR0xfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEsIEdMX05PTkUsIGFyZ21vZDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyLCBHTF9OT05FLCBhcmdtb2QyKSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQVBNOgogICAgICAgICAgICAgICAgYXJnMCA9IHJlZ2lzdGVyX2Zvcl9hcmcoV0lORUQzRFRBX1RFWFRVUkUsIGdsX2luZm8sIHN0YWdlLCBOVUxMLCBOVUxMLCAtMSk7CiAgICAgICAgICAgICAgICBUUkFDRSgiZ2xBbHBoYUZyYWdtZW50T3AzQVRJKEdMX01BRF9BVEksICVzLCAgICAgICAgICBHTF9OT05FLCAlcywgR0xfTk9ORSwgJXMsICVzLCBHTF9BTFBIQSwgR0xfQ09NUF9CSVRfQVRJLCAlcywgR0xfTk9ORSwgJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoZHN0cmVnKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzIpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMiksCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3RlcihhcmcwKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMSkpOwogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEFscGhhRnJhZ21lbnRPcDNBVEkoR0xfTUFEX0FUSSwgZHN0cmVnLCBHTF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMiwgR0xfTk9ORSwgIGFyZ21vZDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcwLCBHTF9BTFBIQSwgR0xfQ09NUF9CSVRfQVRJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgR0xfTk9ORSwgIGFyZ21vZDEpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgLyogRDNEVE9QX1BSRU1PRFVMQVRFID8/Pz8gKi8KCiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9ET1RQUk9EVUNUMzoKICAgICAgICAgICAgICAgIFRSQUNFKCJnbEFscGhhRnJhZ21lbnRPcDJBVEkoR0xfRE9UM19BVEksICVzLCAgICAgICAgICBHTF80WF9CSVRfQVRJIHwgR0xfU0FUVVJBVEVfQklUX0FUSSwgJXMsIEdMX05PTkUsICVzLCAlcywgR0xfTk9ORSwgJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoZHN0cmVnKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzEpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMSB8IEdMX0JJQVNfQklUX0FUSSksCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3RlcihhcmcyKSwgZGVidWdfYXJnbW9kKGFyZ21vZDIgfCBHTF9CSUFTX0JJVF9BVEkpKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBbHBoYUZyYWdtZW50T3AyQVRJKEdMX0RPVDNfQVRJLCBkc3RyZWcsIEdMXzRYX0JJVF9BVEkgfCBHTF9TQVRVUkFURV9CSVRfQVRJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgR0xfTk9ORSwgYXJnbW9kMSB8IEdMX0JJQVNfQklUX0FUSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzIsIEdMX05PTkUsIGFyZ21vZDIgfCBHTF9CSUFTX0JJVF9BVEkpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX01VTFRJUExZQUREOgogICAgICAgICAgICAgICAgVFJBQ0UoImdsQWxwaGFGcmFnbWVudE9wM0FUSShHTF9NQURfQVRJLCAlcywgICAgICAgICAgR0xfU0FUVVJBVEVfQklUX0FUSSwgJXMsIEdMX05PTkUsICVzLCAlcywgR0xfTk9ORSwgJXMsICVzLCBHTF9OT05FLCAlcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3Rlcihkc3RyZWcpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMSksIGRlYnVnX2FyZ21vZChhcmdtb2QxKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzIpLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMiksCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3RlcihhcmcwKSwgZGVidWdfYXJnbW9kKGFyZ21vZDApKTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBbHBoYUZyYWdtZW50T3AzQVRJKEdMX01BRF9BVEksIGRzdHJlZywgICAgICAgICAgR0xfU0FUVVJBVEVfQklUX0FUSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgR0xfTk9ORSwgYXJnbW9kMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMiwgR0xfTk9ORSwgYXJnbW9kMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMCwgR0xfTk9ORSwgYXJnbW9kMCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTEVSUDoKICAgICAgICAgICAgICAgIFRSQUNFKCJnbEFscGhhRnJhZ21lbnRPcDNBVEkoR0xfTEVSUF9BVEksICVzLCAgICAgICAgICBHTF9TQVRVUkFURV9CSVRfQVRJLCAlcywgR0xfTk9ORSwgJXMsICVzLCBHTF9OT05FLCAlcywgJXMsIEdMX05PTkUsICVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGRzdHJlZyksCiAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19yZWdpc3RlcihhcmcxKSwgZGVidWdfYXJnbW9kKGFyZ21vZDEpLAogICAgICAgICAgICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXIoYXJnMiksIGRlYnVnX2FyZ21vZChhcmdtb2QyKSwKICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyKGFyZzApLCBkZWJ1Z19hcmdtb2QoYXJnbW9kMCkpOwogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEFscGhhRnJhZ21lbnRPcDNBVEkoR0xfTEVSUF9BVEksIGRzdHJlZywgR0xfU0FUVVJBVEVfQklUX0FUSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEsIEdMX05PTkUsIGFyZ21vZDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyLCBHTF9OT05FLCBhcmdtb2QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMCwgR0xfTk9ORSwgYXJnbW9kMCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUjoKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX01PRFVMQVRFQUxQSEFfQUREQ09MT1I6CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9NT0RVTEFURUNPTE9SX0FEREFMUEhBOgogICAgICAgICAgICBjYXNlIFdJTkVEM0RUT1BfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQToKICAgICAgICAgICAgY2FzZSBXSU5FRDNEVE9QX0JVTVBFTlZNQVA6CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFOgogICAgICAgICAgICAgICAgRVJSKCJBcHBsaWNhdGlvbiB1c2VzIGFuIGludmFsaWQgYWxwaGEgb3BlcmF0aW9uXG4iKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDogRklYTUUoIlVuaGFuZGxlZCBhbHBoYSBvcGVyYXRpb24gJWQgb24gc3RhZ2UgJWRcbiIsIG9wW3N0YWdlXS5hb3AsIHN0YWdlKTsKICAgICAgICB9CiAgICB9CgogICAgVFJBQ0UoImdsRW5kRnJhZ21lbnRTaGFkZXJBVEkoKVxuIik7CiAgICBHTF9FWFRDQUxMKGdsRW5kRnJhZ21lbnRTaGFkZXJBVEkoKSk7CiAgICBjaGVja0dMY2FsbCgiR0xfRVhUQ0FMTChnbEVuZEZyYWdtZW50U2hhZGVyQVRJKCkpIik7CiAgICByZXR1cm4gcmV0Owp9CiN1bmRlZiBHTElORk9fTE9DQVRJT04KCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPmFkYXB0ZXItPmdsX2luZm8Kc3RhdGljIHZvaWQgc2V0X3RleF9vcF9hdGlmcyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIElXaW5lRDNERGV2aWNlSW1wbCAgICAgICAgICAqVGhpcyA9IHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2U7CiAgICBzdHJ1Y3QgYXRpZnNfZmZwX2Rlc2MgICAgICAgKmRlc2M7CiAgICBzdHJ1Y3QgZmZwX3NldHRpbmdzIHNldHRpbmdzOwogICAgc3RydWN0IGF0aWZzX3ByaXZhdGVfZGF0YSAgICpwcml2ID0gKHN0cnVjdCBhdGlmc19wcml2YXRlX2RhdGEgKikgVGhpcy0+ZnJhZ21lbnRfcHJpdjsKICAgIERXT1JEIG1hcHBlZF9zdGFnZTsKICAgIHVuc2lnbmVkIGludCBpOwoKICAgIGdlbl9mZnBfb3Aoc3RhdGVibG9jaywgJnNldHRpbmdzLCBUUlVFKTsKICAgIGRlc2MgPSAoc3RydWN0IGF0aWZzX2ZmcF9kZXNjICopIGZpbmRfZmZwX3NoYWRlcihwcml2LT5mcmFnbWVudF9zaGFkZXJzLCAmc2V0dGluZ3MpOwogICAgaWYoIWRlc2MpIHsKICAgICAgICBkZXNjID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZigqZGVzYykpOwogICAgICAgIGlmKCFkZXNjKSB7CiAgICAgICAgICAgIEVSUigiT3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZGVzYy0+bnVtX3RleHR1cmVzX3VzZWQgPSAwOwogICAgICAgIGZvcihpID0gMDsgaSA8IEdMX0xJTUlUUyh0ZXh0dXJlX3N0YWdlcyk7IGkrKykgewogICAgICAgICAgICBpZihzZXR0aW5ncy5vcFtpXS5jb3AgPT0gV0lORUQzRFRPUF9ESVNBQkxFKSBicmVhazsKICAgICAgICAgICAgZGVzYy0+bnVtX3RleHR1cmVzX3VzZWQgPSBpOwogICAgICAgIH0KCiAgICAgICAgbWVtY3B5KCZkZXNjLT5wYXJlbnQuc2V0dGluZ3MsICZzZXR0aW5ncywgc2l6ZW9mKHNldHRpbmdzKSk7CiAgICAgICAgZGVzYy0+c2hhZGVyID0gZ2VuX2F0aV9zaGFkZXIoc2V0dGluZ3Mub3AsICZHTElORk9fTE9DQVRJT04pOwogICAgICAgIGFkZF9mZnBfc2hhZGVyKHByaXYtPmZyYWdtZW50X3NoYWRlcnMsICZkZXNjLT5wYXJlbnQpOwogICAgICAgIFRSQUNFKCJBbGxvY2F0ZWQgZml4ZWQgZnVuY3Rpb24gcmVwbGFjZW1lbnQgc2hhZGVyIGRlc2NyaXB0b3IgJXBcbiIsIGRlc2MpOwogICAgfQoKICAgIC8qIEdMX0FUSV9mcmFnbWVudF9zaGFkZXIgZGVwZW5kcyBvbiB0aGUgR0xfVEVYVFVSRV94RCBlbmFibGUgc2V0dGluZ3MuIFVwZGF0ZSB0aGUgdGV4dHVyZSBzdGFnZXMKICAgICAqIHVzZWQgYnkgdGhpcyBzaGFkZXIKICAgICAqLwogICAgZm9yKGkgPSAwOyBpIDwgZGVzYy0+bnVtX3RleHR1cmVzX3VzZWQ7IGkrKykgewogICAgICAgIG1hcHBlZF9zdGFnZSA9IFRoaXMtPnRleFVuaXRNYXBbaV07CiAgICAgICAgaWYobWFwcGVkX3N0YWdlICE9IC0xKSB7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSkpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xBY3RpdmVUZXh0dXJlQVJCIik7CiAgICAgICAgICAgIHRleHR1cmVfYWN0aXZhdGVfZGltZW5zaW9ucyhpLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICB9CiAgICB9CgogICAgR0xfRVhUQ0FMTChnbEJpbmRGcmFnbWVudFNoYWRlckFUSShkZXNjLT5zaGFkZXIpKTsKfQoKc3RhdGljIHZvaWQgc3RhdGVfdGV4ZmFjdG9yX2F0aWZzKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgZmxvYXQgY29sWzRdOwogICAgRDNEQ09MT1JUT0dMRkxPQVQ0KHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19URVhUVVJFRkFDVE9SXSwgY29sKTsKCiAgICBHTF9FWFRDQUxMKGdsU2V0RnJhZ21lbnRTaGFkZXJDb25zdGFudEFUSShBVElfRkZQX0NPTlNUX1RGQUNUT1IsIGNvbCkpOwogICAgY2hlY2tHTGNhbGwoImdsU2V0RnJhZ21lbnRTaGFkZXJDb25zdGFudEFUSShBVElfRkZQX0NPTlNUX1RGQUNUT1IsIGNvbCkiKTsKfQoKc3RhdGljIHZvaWQgc2V0X2J1bXBtYXQoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBEV09SRCBzdGFnZSA9IChzdGF0ZSAtIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCAwKSkgLyBXSU5FRDNEX0hJR0hFU1RfVEVYVFVSRV9TVEFURTsKICAgIGZsb2F0IG1hdFsyXVsyXTsKCiAgICBtYXRbMF1bMF0gPSAqKChmbG9hdCAqKSAmc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMF0pOwogICAgbWF0WzFdWzBdID0gKigoZmxvYXQgKikgJnN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19CVU1QRU5WTUFUMDFdKTsKICAgIG1hdFswXVsxXSA9ICooKGZsb2F0ICopICZzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQlVNUEVOVk1BVDEwXSk7CiAgICBtYXRbMV1bMV0gPSAqKChmbG9hdCAqKSAmc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMV0pOwogICAgLyogR0xfQVRJX2ZyYWdtZW50X3NoYWRlciBhbGxvd3Mgb25seSBjb25zdGFudHMgZnJvbSAwLjAgdG8gMS4wLCBidXQgdGhlIGJ1bXBtYXQKICAgICAqIGNvbnN0YW50cyBjYW4gYmUgaW4gYW55IHJhbmdlLiBXaGlsZSB0aGV5IHNob3VsZCBzdGF5IGJldHdlZW4gWy0xLjAgYW5kIDEuMF0gYmVjYXVzZQogICAgICogU2hhZGVyIE1vZGVsIDEueCBwaXhlbCBzaGFkZXJzIGFyZSBjbGFtcGVkIHRvIHRoYXQgcmFuZ2UgbmVnYXRpdmUgdmFsdWVzIGFyZSB1c2VkIG9jY2FzaW9uYWxseSwKICAgICAqIGZvciBleGFtcGxlIGJ5IG91ciBkM2Q5IHRlc3QuIFNvIHRvIGdldCBuZWdhdGl2ZSB2YWx1ZXMgc2NhbGUgLTE7MSB0byAwOzEgYW5kIHVuZG8gdGhhdCBpbiB0aGUKICAgICAqIHNoYWRlcihpdCBpcyBmcmVlKS4gVGhpcyBtaWdodCBwb3RlbnRpYWxseSByZWR1Y2UgcHJlY2lzaW9uLiBIb3dldmVyLCBpZiB0aGUgaGFyZHdhcmUgZG9lcwogICAgICogc3VwcG9ydCBwcm9wZXIgZmxvYXRzIGl0IHNob3VsZG4ndCwgYW5kIGlmIGl0IGRvZXNuJ3Qgd2UgY2FuJ3QgZ2V0IGFueXRoaW5nIGJldHRlciBhbnl3YXkKICAgICAqLwogICAgbWF0WzBdWzBdID0gKG1hdFswXVswXSArIDEuMCkgKiAwLjU7CiAgICBtYXRbMV1bMF0gPSAobWF0WzFdWzBdICsgMS4wKSAqIDAuNTsKICAgIG1hdFswXVsxXSA9IChtYXRbMF1bMV0gKyAxLjApICogMC41OwogICAgbWF0WzFdWzFdID0gKG1hdFsxXVsxXSArIDEuMCkgKiAwLjU7CiAgICBHTF9FWFRDQUxMKGdsU2V0RnJhZ21lbnRTaGFkZXJDb25zdGFudEFUSShBVElfRkZQX0NPTlNUX0JVTVBNQVQoc3RhZ2UpLCAoZmxvYXQgKikgbWF0KSk7CiAgICBjaGVja0dMY2FsbCgiZ2xTZXRGcmFnbWVudFNoYWRlckNvbnN0YW50QVRJKEFUSV9GRlBfQ09OU1RfQlVNUE1BVChzdGFnZSksIG1hdCkiKTsKfQoKc3RhdGljIHZvaWQgdGV4dHJhbnNmb3JtKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9QSVhFTFNIQURFUikpIHsKICAgICAgICBzZXRfdGV4X29wX2F0aWZzKHN0YXRlLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgIH0KfQoKI3VuZGVmIEdMSU5GT19MT0NBVElPTgoKc3RhdGljIGNvbnN0IHN0cnVjdCBTdGF0ZUVudHJ5VGVtcGxhdGUgYXRpZnNfZnJhZ21lbnRzdGF0ZV90ZW1wbGF0ZVtdID0gewogICAge1NUQVRFX1JFTkRFUihXSU5FRDNEUlNfVEVYVFVSRUZBQ1RPUiksICAgICAgICAgICAgICAgeyBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1RFWFRVUkVGQUNUT1IpLCAgICAgICAgICAgICAgc3RhdGVfdGV4ZmFjdG9yX2F0aWZzICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0NPTE9SQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0NPTE9SQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0NPTE9SQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0FMUEhBQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0FMUEhBQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0FMUEhBQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX1JFU1VMVEFSRyksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0NPTE9SQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0NPTE9SQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0NPTE9SQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0FMUEhBQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0FMUEhBQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0FMUEhBQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX1JFU1VMVEFSRyksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX0NPTE9SQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX0NPTE9SQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX0NPTE9SQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX0FMUEhBQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX0FMUEhBQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX0FMUEhBQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX1JFU1VMVEFSRyksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMiwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0NPTE9SQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0NPTE9SQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0NPTE9SQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0FMUEhBQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0FMUEhBQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0FMUEhBQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX1JFU1VMVEFSRyksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0NPTE9SQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0NPTE9SQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0NPTE9SQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0FMUEhBQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0FMUEhBQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0FMUEhBQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX1JFU1VMVEFSRyksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX0NPTE9SQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX0NPTE9SQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX0NPTE9SQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX0FMUEhBQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX0FMUEhBQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX0FMUEhBQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX1JFU1VMVEFSRyksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0NPTE9SQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0NPTE9SQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0NPTE9SQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0FMUEhBQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0FMUEhBQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0FMUEhBQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX1JFU1VMVEFSRyksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNiwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNiwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNiwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNiwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0NPTE9SQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0NPTE9SQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0NPTE9SQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0FMUEhBQVJHMSksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0FMUEhBQVJHMiksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0FMUEhBQVJHMCksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX1JFU1VMVEFSRyksICAgICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgc2V0X3RleF9vcF9hdGlmcyAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSksICAgICAgeyBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgc2V0X2J1bXBtYXQgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyBTVEFURV9TQU1QTEVSKDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9TQU1QTEVSKDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcl90ZXhkaW0gICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyBTVEFURV9TQU1QTEVSKDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9TQU1QTEVSKDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcl90ZXhkaW0gICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyBTVEFURV9TQU1QTEVSKDIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9TQU1QTEVSKDIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcl90ZXhkaW0gICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyBTVEFURV9TQU1QTEVSKDMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9TQU1QTEVSKDMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcl90ZXhkaW0gICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyBTVEFURV9TQU1QTEVSKDQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9TQU1QTEVSKDQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcl90ZXhkaW0gICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyBTVEFURV9TQU1QTEVSKDUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9TQU1QTEVSKDUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcl90ZXhkaW0gICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyBTVEFURV9TQU1QTEVSKDYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9TQU1QTEVSKDYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcl90ZXhkaW0gICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyBTVEFURV9TQU1QTEVSKDcpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9TQU1QTEVSKDcpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcl90ZXhkaW0gICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgwLFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSx7U1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSwgdGV4dHJhbnNmb3JtICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgxLFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSx7U1RBVEVfVEVYVFVSRVNUQUdFKDEsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSwgdGV4dHJhbnNmb3JtICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgyLFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSx7U1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSwgdGV4dHJhbnNmb3JtICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSgzLFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSx7U1RBVEVfVEVYVFVSRVNUQUdFKDMsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSwgdGV4dHJhbnNmb3JtICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg0LFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSx7U1RBVEVfVEVYVFVSRVNUQUdFKDQsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSwgdGV4dHJhbnNmb3JtICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg1LFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSx7U1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSwgdGV4dHJhbnNmb3JtICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg2LFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSx7U1RBVEVfVEVYVFVSRVNUQUdFKDYsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSwgdGV4dHJhbnNmb3JtICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAge1NUQVRFX1RFWFRVUkVTVEFHRSg3LFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSx7U1RBVEVfVEVYVFVSRVNUQUdFKDcsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTKSwgdGV4dHJhbnNmb3JtICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgezAgLyogVGVybWluYXRlICovLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAp9OwoKc3RhdGljIHZvaWQgYXRpZnNfZW5hYmxlKElXaW5lRDNERGV2aWNlICppZmFjZSwgQk9PTCBlbmFibGUpIHsKICAgIGlmKGVuYWJsZSkgewogICAgICAgIGdsRW5hYmxlKEdMX0ZSQUdNRU5UX1NIQURFUl9BVEkpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9GUkFHTUVOVF9TSEFERVJfQVRJKSIpOwogICAgfSBlbHNlIHsKICAgICAgICBnbERpc2FibGUoR0xfRlJBR01FTlRfU0hBREVSX0FUSSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9GUkFHTUVOVF9TSEFERVJfQVRJKSIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBhdGlmc19nZXRfY2FwcyhXSU5FRDNEREVWVFlQRSBkZXZ0eXBlLCBXaW5lRDNEX0dMX0luZm8gKmdsX2luZm8sIHN0cnVjdCBmcmFnbWVudF9jYXBzICpjYXBzKSB7CiAgICBjYXBzLT5UZXh0dXJlT3BDYXBzID0gIFdJTkVEM0RURVhPUENBUFNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFRFWE9QQ0FQU19TRUxFQ1RBUkcxICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVEVYT1BDQVBTX1NFTEVDVEFSRzIgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RURVhPUENBUFNfTU9EVUxBVEU0WCAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFRFWE9QQ0FQU19NT0RVTEFURTJYICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVEVYT1BDQVBTX01PRFVMQVRFICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RURVhPUENBUFNfQUREU0lHTkVEMlggICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFRFWE9QQ0FQU19BRERTSUdORUQgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVEVYT1BDQVBTX0FERCAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RURVhPUENBUFNfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFRFWE9QQ0FQU19BRERTTU9PVEggICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVEVYT1BDQVBTX0JMRU5EQ1VSUkVOVEFMUEhBICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RURVhPUENBUFNfQkxFTkRGQUNUT1JBTFBIQSAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFRFWE9QQ0FQU19CTEVORFRFWFRVUkVBTFBIQSAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVEVYT1BDQVBTX0JMRU5ERElGRlVTRUFMUEhBICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RURVhPUENBUFNfQkxFTkRURVhUVVJFQUxQSEFQTSAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFRFWE9QQ0FQU19NT0RVTEFURUFMUEhBX0FERENPTE9SICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVEVYT1BDQVBTX01PRFVMQVRFQ09MT1JfQUREQUxQSEEgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RURVhPUENBUFNfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFRFWE9QQ0FQU19NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVEVYT1BDQVBTX0RPVFBST0RVQ1QzICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RURVhPUENBUFNfTVVMVElQTFlBREQgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFRFWE9QQ0FQU19MRVJQICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVEVYT1BDQVBTX0JVTVBFTlZNQVA7CgogICAgLyogVE9ETzogSW1wbGVtZW50IFdJTkVEM0RURVhPUENBUFNfQlVNUEVOVk1BUExVTUlOQU5DRQogICAgYW5kIFdJTkVEM0RURVhPUENBUFNfUFJFTU9EVUxBVEUgKi8KCiAgICAvKiBHTF9BVElfZnJhZ21lbnRfc2hhZGVyIGFsd2F5cyBzdXBwb3J0cyA2IHRleHR1cmVzLCB3aGljaCB3YXMgdGhlIGxpbWl0IG9uIHIyMDAgY2FyZHMKICAgICAqIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIGlzIGV4Y2x1c2l2ZWx5IGZvY3VzZWQgb24obGF0ZXIgY2FyZHMgaGF2ZSBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbSkuCiAgICAgKiBJZiB0aGUgY3VycmVudCBjYXJkIGhhcyBtb3JlIHRoYW4gOCBmaXhlZCBmdW5jdGlvbiB0ZXh0dXJlcyBpbiBPcGVuR0wncyByZWd1bGFyIGZpeGVkCiAgICAgKiBmdW5jdGlvbiBwaXBlbGluZSB0aGVuIHRoZSBBVElfZnJhZ21lbnRfc2hhZGVyIGJhY2tlbmQgaW1wb3NlcyBhIHN0cmljdGVyIGxpbWl0LiBUaGlzCiAgICAgKiBzaG91bGRuJ3QgYmUgdG9vIGhhcmQgc2luY2UgTnZpZGlhIGNhcmRzIGhhdmUgYSBsaW1pdCBvZiA0IHRleHR1cmVzIHdpdGggdGhlIGRlZmF1bHQgZmZwCiAgICAgKiBwaXBlbGluZSwgYW5kIGFsbW9zdCBhbGwgZ2FtZXMgYXJlIGhhcHB5IHdpdGggdGhhdC4gV2UgY2FuIGhvd2V2ZXIgc3VwcG9ydCB1cCB0byA4CiAgICAgKiB0ZXh0dXJlIHN0YWdlcyBiZWNhdXNlIHdlIGhhdmUgYSAybmQgcGFzcyBsaW1pdCBvZiA4IGluc3RydWN0aW9ucywgYW5kIHBlciBzdGFnZSB3ZSB1c2UKICAgICAqIG9ubHkgMSBpbnN0cnVjdGlvbi4KICAgICAqCiAgICAgKiBUaGUgcHJvcGVyIGZpeCBmb3IgdGhpcyBpcyBub3QgdG8gdXNlIEdMX0FUSV9mcmFnbWVudF9zaGFkZXIgb24gY2FyZHMgbmV3ZXIgdGhhbiB0aGUKICAgICAqIHIyMDAgc2VyaWVzIGFuZCB1c2UgYW4gQVJCIG9yIEdMU0wgc2hhZGVyIGluc3RlYWQKICAgICAqLwogICAgY2Fwcy0+TWF4VGV4dHVyZUJsZW5kU3RhZ2VzICAgPSA4OwogICAgY2Fwcy0+TWF4U2ltdWx0YW5lb3VzVGV4dHVyZXMgPSA2OwoKICAgIGNhcHMtPlByaW1pdGl2ZU1pc2NDYXBzIHw9IFdJTkVEM0RQTUlTQ0NBUFNfVFNTQVJHVEVNUDsKfQoKc3RhdGljIEhSRVNVTFQgYXRpZnNfYWxsb2MoSVdpbmVEM0REZXZpY2UgKmlmYWNlKSB7CiAgICBJV2luZUQzRERldmljZUltcGwgKlRoaXMgPSAoSVdpbmVEM0REZXZpY2VJbXBsICopIGlmYWNlOwogICAgc3RydWN0IGF0aWZzX3ByaXZhdGVfZGF0YSAqcHJpdjsKCiAgICBUaGlzLT5mcmFnbWVudF9wcml2ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihzdHJ1Y3QgYXRpZnNfcHJpdmF0ZV9kYXRhKSk7CiAgICBpZighVGhpcy0+ZnJhZ21lbnRfcHJpdikgewogICAgICAgIEVSUigiT3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CiAgICB9CiAgICBwcml2ID0gKHN0cnVjdCBhdGlmc19wcml2YXRlX2RhdGEgKikgVGhpcy0+ZnJhZ21lbnRfcHJpdjsKICAgIHByaXYtPmZyYWdtZW50X3NoYWRlcnMgPSBoYXNoX3RhYmxlX2NyZWF0ZShmZnBfcHJvZ3JhbV9rZXlfaGFzaCwgZmZwX3Byb2dyYW1fa2V5X2NvbXBhcmUpOwogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OIFRoaXMtPmFkYXB0ZXItPmdsX2luZm8Kc3RhdGljIHZvaWQgYXRpZnNfZnJlZV9mZnBzaGFkZXIodm9pZCAqdmFsdWUsIHZvaWQgKmRldmljZSkgewogICAgSVdpbmVEM0REZXZpY2VJbXBsICpUaGlzID0gZGV2aWNlOwogICAgc3RydWN0IGF0aWZzX2ZmcF9kZXNjICplbnRyeV9hdGkgPSB2YWx1ZTsKCiAgICBFTlRFUl9HTCgpOwogICAgR0xfRVhUQ0FMTChnbERlbGV0ZUZyYWdtZW50U2hhZGVyQVRJKGVudHJ5X2F0aS0+c2hhZGVyKSk7CiAgICBjaGVja0dMY2FsbCgiZ2xEZWxldGVGcmFnbWVudFNoYWRlckFUSShlbnRyeS0+c2hhZGVyKSIpOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZW50cnlfYXRpKTsKICAgIExFQVZFX0dMKCk7Cn0KCnN0YXRpYyB2b2lkIGF0aWZzX2ZyZWUoSVdpbmVEM0REZXZpY2UgKmlmYWNlKSB7CiAgICBJV2luZUQzRERldmljZUltcGwgKlRoaXMgPSAoSVdpbmVEM0REZXZpY2VJbXBsICopIGlmYWNlOwogICAgc3RydWN0IGF0aWZzX3ByaXZhdGVfZGF0YSAqcHJpdiA9IChzdHJ1Y3QgYXRpZnNfcHJpdmF0ZV9kYXRhICopIFRoaXMtPmZyYWdtZW50X3ByaXY7CgogICAgaGFzaF90YWJsZV9kZXN0cm95KHByaXYtPmZyYWdtZW50X3NoYWRlcnMsIGF0aWZzX2ZyZWVfZmZwc2hhZGVyLCBUaGlzKTsKCiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwcml2KTsKICAgIFRoaXMtPmZyYWdtZW50X3ByaXYgPSBOVUxMOwp9CiN1bmRlZiBHTElORk9fTE9DQVRJT04KCnN0YXRpYyBCT09MIGF0aWZzX2NvbnZfc3VwcG9ydGVkKFdJTkVEM0RGT1JNQVQgZm10KSB7CiAgICBUUkFDRSgiQ2hlY2tpbmcgc2hhZGVyIGZvcm1hdCBzdXBwb3J0IGZvciBmb3JtYXQgJXM6IiwgZGVidWdfZDNkZm9ybWF0KGZtdCkpOwogICAgc3dpdGNoKGZtdCkgewogICAgICAgIGNhc2UgV0lORUQzREZNVF9WOFU4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9WMTZVMTY6CiAgICAgICAgICAgIFRSQUNFKCJbT0tdXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgVFJBQ0UoIltGQUlMRURcbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9Cn0KCmNvbnN0IHN0cnVjdCBmcmFnbWVudF9waXBlbGluZSBhdGlmc19mcmFnbWVudF9waXBlbGluZSA9IHsKICAgIGF0aWZzX2VuYWJsZSwKICAgIGF0aWZzX2dldF9jYXBzLAogICAgYXRpZnNfYWxsb2MsCiAgICBhdGlmc19mcmVlLAogICAgYXRpZnNfY29udl9zdXBwb3J0ZWQsCiAgICBhdGlmc19mcmFnbWVudHN0YXRlX3RlbXBsYXRlLAogICAgVFJVRSAvKiBXZSBjYW4gZGlzYWJsZSBwcm9qZWN0ZWQgdGV4dHVyZXMgKi8KfTsK