LyoKICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQGZpbGUgICBNNEFJUl9BUEkuYwogKiBAYnJpZWYgIEFyZWEgb2YgSW50ZXJlc3QgUmVzaXplciAgQVBJCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKI2RlZmluZSBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAojZGVmaW5lIE00QUlSX1lVVjQyMEFfRk9STUFUX1NVUFBPUlRFRAoKLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUElMQVRJT04gQ0hFQ0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmbmRlZiBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAojaWZuZGVmIE00QUlSX0JHUjU2NV9GT1JNQVRfU1VQUE9SVEVECiNpZm5kZWYgTTRBSVJfUkdCNTY1X0ZPUk1BVF9TVVBQT1JURUQKI2lmbmRlZiBNNEFJUl9CR1I4ODhfRk9STUFUX1NVUFBPUlRFRAojaWZuZGVmIE00QUlSX1JHQjg4OF9GT1JNQVRfU1VQUE9SVEVECiNpZm5kZWYgTTRBSVJfSlBHX0ZPUk1BVF9TVVBQT1JURUQKCiNlcnJvciAiUGxlYXNlIGRlZmluZSBhdCBsZWFzdCBvbmUgaW5wdXQgZm9ybWF0IGZvciB0aGUgQUlSIGNvbXBvbmVudCIKCiNlbmRpZgojZW5kaWYKI2VuZGlmCiNlbmRpZgojZW5kaWYKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCiNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCiNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCiNpbmNsdWRlICJNNEFJUl9BUEkuaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgSU5URVJOQUwgVFlQRVMgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKioqKiovCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBlbnVtICAgICAgICAgTTRBSVJfU3RhdGVzCiAqIEBicmllZiAgICAgICBUaGUgZm9sbG93aW5nIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGludGVybmFsIHN0YXRlcyBvZiB0aGUgQUlSLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwp0eXBlZGVmIGVudW0KewogICAgTTRBSVJfa0NyZWF0ZWQsICAgICAgICAvKio8IFN0YXRlIGFmdGVyIE00QUlSX2NyZWF0ZSBoYXMgYmVlbiBjYWxsZWQgKi8KICAgIE00QUlSX2tDb25maWd1cmVkICAgICAgLyoqPCBTdGF0ZSBhZnRlciBNNEFJUl9jb25maWd1cmUgaGFzIGJlZW4gY2FsbGVkICovCn1NNEFJUl9TdGF0ZXM7CgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogc3RydWN0ICAgICAgICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0CiAqIEBicmllZiAgICAgICAgIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHRoZSBpbnRlcm5hbCBjb250ZXh0IG9mIHRoZSBBSVIuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnR5cGVkZWYgc3RydWN0CnsKICAgIE00QUlSX1N0YXRlcyAgICAgICAgICAgIG1fc3RhdGU7ICAgICAgICAvKio8IEludGVybmFsIHN0YXRlICovCiAgICBNNEFJUl9JbnB1dEZvcm1hdFR5cGUgICBtX2lucHV0Rm9ybWF0OyAgLyoqPCBJbnB1dCBmb3JtYXQgbGlrZSBZVVY0MjBQbGFuYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0I1NjUsIEpQRywgZXRjIC4uLiAqLwogICAgTTRBSVJfUGFyYW1zICAgICAgICAgICAgbV9wYXJhbXM7ICAgICAgIC8qKjwgQ3VycmVudCBpbnB1dCBQYXJhbWV0ZXIgb2YgIHRoZSBwcm9jZXNzaW5nICovCiAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeF9pbmNbNF07ICAgLyoqPCByYXRpbyBiZXR3ZWVuIGlucHV0IGFuZCBvdXB1dCB3aWR0aCBmb3IgWVVWICovCiAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9pbmNbNF07ICAgLyoqPCByYXRpbyBiZXR3ZWVuIGlucHV0IGFuZCBvdXB1dCBoZWlnaHQgZm9yIFlVViAqLwogICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnRbNF07ICAgIC8qKjwgaG9yaXpvbnRhbCBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlICovCiAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9hY2N1bV9zdGFydFs0XTsgICAgLyoqPCBWZXJ0aWNhbCBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlICovCiAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeF9hY2N1bVs0XTsgLyoqPCBzYXZlIG9mIGhvcml6b250YWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl95X2FjY3VtWzRdOyAvKio8IHNhdmUgb2YgdmVydGljYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KICAgIE00T1NBX1VJbnQ4KiAgICAgICAgICAgIHB1OF9kYXRhX2luWzRdOyAvKio8IFNhdmUgb2YgaW5wdXQgcGxhbmUgcG9pbnRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUgKi8KICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fcHJvY1Jvd3M7ICAgICAvKio8IE51bWJlciBvZiBwcm9jZXNzZWQgcm93cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHN0cmlwZSBtb2RlIG9ubHkgKi8KICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgbV9iT25seUNvcHk7ICAvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSBqdXN0IHBlcmZvcm0gYSBjb3B5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uICovCiAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIG1fYkZsaXBYOyAgICAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRvIHJldmVydCBwcm9jZXNzaW5nIG9yZGVyIGluIFgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgKi8KICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgbV9iRmxpcFk7ICAgICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IHByb2Nlc3Npbmcgb3JkZXIgaW4gWQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyAqLwogICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JSZXZlcnRYWTsgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyB0byByZXZlcnQgWCBhbmQgWSBwcm9jZXNzaW5nIG9yZGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKy05MLAgcm90YXRpb24pICovCn1NNEFJUl9JbnRlcm5hbENvbnRleHQ7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcilcCiAgICAgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKSByZXR1cm4gKChNNE9TQV9FUlIpKHJldHZhbCkpOwoKCi8qKioqKioqKioqKioqKioqKioqKioqIE00QUlSIFBVQkxJQyBBUEkgSU1QTEVNRU5UQVRJT04gKioqKioqKioqKioqKioqKioqKiovCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE00T1NBX0VSUiBNNEFJUl9jcmVhdGUoTTRPU0FfQ29udGV4dCogcENvbnRleHQsTTRBSVJfSW5wdXRGb3JtYXRUeXBlIGlucHV0Rm9ybWF0KQogKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIuCiAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAoSU4vT1VUKSBBZGRyZXNzIG9mIHRoZSBjb250ZXh0IHRvIGNyZWF0ZQogKiBAcGFyYW0gICAgaW5wdXRGb3JtYXQ6ICAgKElOKSBpbnB1dCBmb3JtYXQgdHlwZS4KICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgogKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuIEludmFsaWQgZm9ybWF0VHlwZQogKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBpcyBhdmFpbGFibGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpCnsKICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SIDsKICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSBNNE9TQV9OVUxMIDsKCiAgICAvKiBDaGVjayB0aGF0IHRoZSBhZGRyZXNzIG9uIHRoZSBjb250ZXh0IGlzIG5vdCBOVUxMICovCiAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7CgogICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7CgogICAgLyogSW50ZXJuYWwgQ29udGV4dCBjcmVhdGlvbiAqLwogICAgcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00QUlSX0ludGVybmFsQ29udGV4dCksCiAgICAgICAgIE00QUlSLChNNE9TQV9DaGFyICopIkFJUiBpbnRlcm5hbCBjb250ZXh0IikgOwogICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIHBDKSA7CgoKICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBmb3JtYXQgaXMgc3VwcG9ydGVkICovCiAgICBzd2l0Y2goaW5wdXRGb3JtYXQpCiAgICB7CiNpZmRlZiBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAogICAgICAgIGNhc2UgTTRBSVJfa1lVVjQyMFA6CiAgICAgICAgYnJlYWsgOwojZW5kaWYKI2lmZGVmIE00QUlSX1lVVjQyMEFfRk9STUFUX1NVUFBPUlRFRAogICAgICAgIGNhc2UgTTRBSVJfa1lVVjQyMEFQOgogICAgICAgIGJyZWFrIDsKI2VuZGlmCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgZXJyID0gTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOwogICAgICAgICAgICBnb3RvIE00QUlSX2NyZWF0ZV9jbGVhbnVwIDsKICAgIH0KCiAgICAvKio8IFNhdmUgaW5wdXQgZm9ybWF0IGFuZCB1cGRhdGUgc3RhdGUgKi8KICAgIHBDLT5tX2lucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXQ7CiAgICBwQy0+bV9zdGF0ZSA9IE00QUlSX2tDcmVhdGVkOwoKICAgIC8qIFJldHVybiB0aGUgY29udGV4dCB0byB0aGUgY2FsbGVyICovCiAgICAqcENvbnRleHQgPSBwQyA7CgogICAgcmV0dXJuIE00Tk9fRVJST1IgOwoKTTRBSVJfY3JlYXRlX2NsZWFudXA6CiAgICAvKiBFcnJvciBtYW5hZ2VtZW50IDogd2UgZGVzdHJveSB0aGUgY29udGV4dCBpZiBuZWVkZWQgKi8KICAgIGlmKE00T1NBX05VTEwgIT0gcEMpCiAgICB7CiAgICAgICAgZnJlZShwQykgOwogICAgfQoKICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwoKICAgIHJldHVybiBlcnIgOwp9CgoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCiAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGRlc3Ryb3lzIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIgY29tcG9uZW50CiAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZSB0byBkZXN0cm95CiAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgogKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiBJbnRlcm5hbCBzdGF0ZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGlzIGZ1bmN0aW9uIGNhbGwuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCk00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCnsKICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dCA7CgogICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwoKICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCiAgICB7CiAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwogICAgfQogICAgZnJlZShwQykgOwoKICAgIHJldHVybiBNNE5PX0VSUk9SIDsKCn0KCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBNNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiB3aWxsIGNvbmZpZ3VyZSB0aGUgQUlSLgogKiBAbm90ZSAgICBJdCB3aWxsIHNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBjb29yZGluYXRlcyBhbmQgc2l6ZXMsCiAqICAgICAgICAgIGFuZCBpbmRpY2F0ZXMgaWYgd2Ugd2lsbCBwcm9jZWVkIGluIHN0cmlwZSBvciBub3QuCiAqICAgICAgICAgIEluIGNhc2UgYSBNNEFJUl9nZXQgaW4gc3RyaXBlIG1vZGUgd2FzIG9uIGdvaW5nLCBpdCB3aWxsIGNhbmNlbCB0aGlzIHByZXZpb3VzCiAqICAgICAgICAgIHByb2Nlc3NpbmcgYW5kIHJlc2V0IHRoZSBnZXQgcHJvY2Vzcy4KICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgICAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCiAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2JPdXRwdXRTdHJpcGU6KElOKSBTdHJpcGUgbW9kZS4KICogQHBhcmFtICAgIHBQYXJhbXMtPm1faW5wdXRDb29yZDogICAgKElOKSBYLFkgY29vcmRpbmF0ZXMgb2YgdGhlIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0LgogKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9pbnB1dFNpemU6ICAgIChJTikgaW5wdXQgUk9JIHNpemUuCiAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX291dHB1dFNpemU6ICAgIChJTikgb3V0cHV0IHNpemUuCiAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgogKiBAcmV0dXJuICAgIE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDogdGhlIHJlcXVlc3RlZCBpbnB1dCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCnsKICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dCA7CiAgICBNNE9TQV9VSW50MzIgICAgaSx1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwogICAgTTRPU0FfVUludDMyICAgIG5iX3BsYW5lczsKCiAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7CgogICAgaWYoTTRBSVJfa1lVVjQyMEFQID09IHBDLT5tX2lucHV0Rm9ybWF0KQogICAgewogICAgICAgIG5iX3BsYW5lcyA9IDQ7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgbmJfcGxhbmVzID0gMzsKICAgIH0KCiAgICAvKio8IENoZWNrIHN0YXRlICovCiAgICBpZigoTTRBSVJfa0NyZWF0ZWQgIT0gcEMtPm1fc3RhdGUpJiYoTTRBSVJfa0NvbmZpZ3VyZWQgIT0gcEMtPm1fc3RhdGUpKQogICAgewogICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKICAgIH0KCiAgICAvKiogU2F2ZSBwYXJhbWV0ZXJzICovCiAgICBwQy0+bV9wYXJhbXMgPSAqcFBhcmFtczsKCiAgICAvKiBDaGVjayBmb3IgdGhlIGlucHV0Jm91dHB1dCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCiAgICAgICAgaWYoICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSYweDEpICAgIHx8CiAgICAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSYweDEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FJUl9JTExFR0FMX0ZSQU1FX1NJWkU7CiAgICAgICAgfQoKICAgICBpZiggKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkmMHgxKSAgICB8fAogICAgICAgICAgICAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSYweDEpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FJUl9JTExFR0FMX0ZSQU1FX1NJWkU7CiAgICAgICAgfQogICAgaWYoKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgPT0gKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkpCiAgICAgICAgJiYoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkgPT0gKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpKSkKICAgIHsKICAgICAgICAvKio8IE5vIHJlc2l6ZSBpbiB0aGlzIGNhc2UsIHdlIHdpbGwganVzdCBjb3B5IGlucHV0IGluIG91dHB1dCAqLwogICAgICAgIHBDLT5tX2JPbmx5Q29weSA9IE00T1NBX1RSVUU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcEMtPm1fYk9ubHlDb3B5ID0gTTRPU0FfRkFMU0U7CgogICAgICAgIC8qKjwgSW5pdGlhbGl6ZSBpbnRlcm5hbCB2YXJpYWJsZXMgdXNlZCBmb3IgcmVzaXplIGZpbHRlciAqLwogICAgICAgIGZvcihpPTA7aTxuYl9wbGFuZXM7aSsrKQogICAgICAgIHsKCiAgICAgICAgICAgIHUzMl93aWR0aF9pbiA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg6XAogICAgICAgICAgICAgICAgKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKzEpPj4xOwogICAgICAgICAgICB1MzJfaGVpZ2h0X2luID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ6XAogICAgICAgICAgICAgICAgKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCsxKT4+MTsKICAgICAgICAgICAgdTMyX3dpZHRoX291dCA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOlwKICAgICAgICAgICAgICAgIChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgrMSk+PjE7CiAgICAgICAgICAgIHUzMl9oZWlnaHRfb3V0ID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OlwKICAgICAgICAgICAgICAgIChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KzEpPj4xOwoKICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGguKi8KICAgICAgICAgICAgICAgIGlmICh1MzJfd2lkdGhfb3V0ID49IHUzMl93aWR0aF9pbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfaW5jW2ldICAgPSAoKHUzMl93aWR0aF9pbi0xKSAqIDB4MTAwMDApIC8gKHUzMl93aWR0aF9vdXQtMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2luY1tpXSAgID0gKHUzMl93aWR0aF9pbiAqIDB4MTAwMDApIC8gKHUzMl93aWR0aF9vdXQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodC4qLwogICAgICAgICAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2luY1tpXSAgID0gKCh1MzJfaGVpZ2h0X2luIC0gMSkgKiAweDEwMDAwKSAvICh1MzJfaGVpZ2h0X291dC0xKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldID0gKHUzMl9oZWlnaHRfaW4gKiAweDEwMDAwKSAvICh1MzJfaGVpZ2h0X291dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCiAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9pbmNbaV0gPj0gMHgxMDAwMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQKICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9ubmFsIG9uIHRoZSAxNSBsb3cgYml0cwogICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gcEMtPnUzMl95X2luY1tpXSAmIDB4ZmZmZjsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPSAweDEwMDAwOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID4+PSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKio8IFRha2UgaW50byBhY2NvdW50IHRoYXQgWSBjb29yZGluYXRlIGNhbiBiZSBvZGQKICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBwdXQgYSAwLjUgb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yIFUgYW5kIFYgcGxhbmUgYXMgdGhlcmUgYSAyIHRpbWVzIHN1Yi1zYW1wbGVkIHZzIFkqLwogICAgICAgICAgICAgICAgaWYoKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV95JjB4MSkmJigoaT09MSl8fChpPT0yKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldICs9IDB4ODAwMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCiAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuCiAgICAgICAgICAgICAgICAgICAgMCBhbmQgMC41CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3hfaW5jW2ldID49IDB4MTAwMDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gcEMtPnUzMl94X2luY1tpXSAmIDB4ZmZmZjsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSAweDEwMDAwOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID4+PSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKio8IFRha2UgaW50byBhY2NvdW50IHRoYXQgWCBjb29yZGluYXRlIGNhbiBiZSBvZGQKICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBwdXQgYSAwLjUgb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgZm9yIFUgYW5kIFYgcGxhbmUgYXMgdGhlcmUgYSAyIHRpbWVzIHN1Yi1zYW1wbGVkIHZzIFkqLwogICAgICAgICAgICAgICAgaWYoKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV94JjB4MSkmJigoaT09MSl8fChpPT0yKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldICs9IDB4ODAwMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqPCBSZXNldCB2YXJpYWJsZSB1c2VkIGZvciBzdHJpcGUgbW9kZSAqLwogICAgcEMtPm1fcHJvY1Jvd3MgPSAwOwoKICAgIC8qKjwgSW5pdGlhbGl6ZSB2YXIgZm9yIFgvWSBwcm9jZXNzaW5nIG9yZGVyIGFjY29yZGluZyB0byBvcmllbnRhdGlvbiAqLwogICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfRkFMU0U7CiAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9GQUxTRTsKICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX0ZBTFNFOwogICAgc3dpdGNoKHBQYXJhbXMtPm1fb3V0cHV0T3JpZW50YXRpb24pCiAgICB7CiAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OgogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgogICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0OgogICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwogICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbUxlZnQ6CiAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodEJvdHRvbToKICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0Qm90dG9tOgogICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwogICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CiAgICB9CiAgICAvKio8IFVwZGF0ZSBzdGF0ZSAqLwogICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ29uZmlndXJlZDsKCiAgICByZXR1cm4gTTROT19FUlJPUiA7Cn0KCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBNNE9TQV9FUlIgTTRBSVJfZ2V0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0KQogKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSB0aGUgcmVxdWVzdGVkIHJlc2l6ZWQgYXJlYSBvZiBpbnRlcmVzdCBhY2NvcmRpbmcgdG8KICogICAgICAgICAgc2V0dGluZ3MgIHByb3ZpZGVkIGluIE00QUlSX2NvbmZpZ3VyZS4KICogQG5vdGUgICAgSW4gY2FzZSB0aGUgaW5wdXQgZm9ybWF0IHR5cGUgaXMgSlBFRywgaW5wdXQgcGxhbmUocykKICogICAgICAgICAgaW4gcEluIGlzIG5vdCB1c2VkLiBJbiBub3JtYWwgbW9kZSwgZGltZW5zaW9uIHNwZWNpZmllZCBpbiBvdXRwdXQgcGxhbmUocykgc3RydWN0dXJlCiAqICAgICAgICAgIG11c3QgYmUgdGhlIHNhbWUgdGhhbiB0aGUgb25lIHNwZWNpZmllZCBpbiBNNEFJUl9jb25maWd1cmUuIEluIHN0cmlwZSBtb2RlLCBvbmx5IHRoZQogKiAgICAgICAgICB3aWR0aCB3aWxsIGJlIHRoZSBzYW1lLCBoZWlnaHQgd2lsbCBiZSB0YWtlbiBhcyB0aGUgc3RyaXBlIGhlaWdodCAodHlwaWNhbGx5IDE2KS4KICogICAgICAgICAgSW4gbm9ybWFsIG1vZGUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbCBvbmNlIHRvIGdldCB0aGUgZnVsbCBvdXRwdXQgcGljdHVyZS4KICogICAgICAgICAgSW4gc3RyaXBlIG1vZGUsIGl0IGlzIGNhbGxlZCBmb3IgZWFjaCBzdHJpcGUgdGlsbCB0aGUgd2hvbGUgcGljdHVyZSBoYXMgYmVlbgogKiAgICAgICAgICByZXRyaWV2ZWQsYW5kICB0aGUgcG9zaXRpb24gb2YgdGhlIG91dHB1dCBzdHJpcGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlCiAqICAgICAgICAgIGlzIGludGVybmFsbHkgaW5jcmVtZW50ZWQgYXQgZWFjaCBzdGVwLgogKiAgICAgICAgICBBbnkgY2FsbCB0byBNNEFJUl9jb25maWd1cmUgZHVyaW5nIHN0cmlwZSBwcm9jZXNzIHdpbGwgcmVzZXQgdGhpcyBvbmUgdG8gdGhlCiAqICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBpY3R1cmUuCiAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZQogKiBAcGFyYW0gICAgcEluOiAgICAgICAgICAgIChJTikgUGxhbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5wdXQgUGxhbmUocykuCiAqIEBwYXJhbSAgICBwT3V0OiAgICAgICAgKElOL09VVCkgIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIG91dHB1dCBQbGFuZShzKS4KICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgogKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgogKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCk00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCnsKICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dCA7CiAgICBNNE9TQV9VSW50MzIgaSxqLGssdTMyX3hfZnJhYyx1MzJfeV9mcmFjLHUzMl94X2FjY3VtLHUzMl95X2FjY3VtLHUzMl9zaGlmdDsKICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X2RhdGFfaW4sICpwdThfZGF0YV9pbl9vcmcsICpwdThfZGF0YV9pbl90bXAsICpwdThfZGF0YV9vdXQ7CiAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9zcmNfdG9wOwogICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbTsKICAgIE00T1NBX1VJbnQzMiAgICB1MzJfdGVtcF92YWx1ZTsKICAgIE00T1NBX0ludDMyICAgIGkzMl90bXBfb2Zmc2V0OwogICAgTTRPU0FfVUludDMyICAgIG5iX3BsYW5lczsKCgoKICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKCiAgICAvKio8IENoZWNrIHN0YXRlICovCiAgICBpZihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkKICAgIHsKICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7CiAgICB9CgogICAgaWYoTTRBSVJfa1lVVjQyMEFQID09IHBDLT5tX2lucHV0Rm9ybWF0KQogICAgewogICAgICAgIG5iX3BsYW5lcyA9IDQ7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgbmJfcGxhbmVzID0gMzsKICAgIH0KCiAgICAvKio8IExvb3Agb24gZWFjaCBQbGFuZSAqLwogICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCiAgICB7CgogICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KCiAgICAgICAgdTMyX3NoaWZ0ID0gKChpPT0wKXx8KGk9PTMpKT8wOjE7IC8qKjwgRGVwZW5kIG9uIEx1bWEgb3IgQ2hyb21hICovCgogICAgICAgIGlmKChNNE9TQV9GQUxTRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKVwKICAgICAgICAgICAgfHwoKE00T1NBX1RSVUUgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSkmJigwID09IHBDLT5tX3Byb2NSb3dzKSkpCiAgICAgICAgewogICAgICAgICAgICAvKio8IEZvciBpbnB1dCwgdGFrZSBjYXJlIGFib3V0IFJPSSAqLwogICAgICAgICAgICBwdThfZGF0YV9pbiAgICAgPSBwSW5baV0ucGFjX2RhdGEgKyBwSW5baV0udV90b3BsZWZ0IFwKICAgICAgICAgICAgICAgICsgKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV94Pj51MzJfc2hpZnQpCiAgICAgICAgICAgICAgICAgICAgICAgICsgKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV95ID4+IHUzMl9zaGlmdCkgKiBwSW5baV0udV9zdHJpZGU7CgogICAgICAgICAgICAvKiogR28gYXQgZW5kIG9mIGxpbmUvY29sdW1uIGluIGNhc2UgWC9ZIHNjYW5uaW5nIGlzIGZsaXBwZWQgKi8KICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9iRmxpcFgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9ICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj51MzJfc2hpZnQpIC0xIDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX2JGbGlwWSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PnUzMl9zaGlmdCkgLTEpXAogICAgICAgICAgICAgICAgICAgICAqIHBJbltpXS51X3N0cmlkZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqPCBJbml0aWFsaXplIGFjY3VtdWxhdG9ycyBpbiBjYXNlIHdlIGFyZSB1c2luZyBpdCAoYmlsaW5lYXIgaW50ZXJwb2xhdGlvbikgKi8KICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5tX2JPbmx5Q29weSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldID0gcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldOwogICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKio8IEluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUgZm9yIG90aGVyIHRoYW4gZmlyc3Qgc3RyaXBlLCB3ZSBuZWVkIHRvIHJlY292ZXIgaW5wdXQKICAgICAgICAgICAgICAgICBwb2ludGVyIGZyb20gaW50ZXJuYWwgY29udGV4dCAqLwogICAgICAgICAgICBwdThfZGF0YV9pbiA9IHBDLT5wdThfZGF0YV9pbltpXTsKICAgICAgICB9CgogICAgICAgIC8qKjwgSW4gZXZlcnkgbW9kZSwgb3V0cHV0IGRhdGEgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBwbGFuZSAqLwogICAgICAgIHB1OF9kYXRhX291dCAgICA9IHBPdXRbaV0ucGFjX2RhdGEgKyBwT3V0W2ldLnVfdG9wbGVmdDsKCiAgICAgICAgLyoqPCBJbml0aWFsaXplIGlucHV0IG9mZnNldCBhcHBsaWVkIGFmdGVyIGVhY2ggcGl4ZWwgKi8KICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFkpCiAgICAgICAgewogICAgICAgICAgICBpMzJfdG1wX29mZnNldCA9IHBJbltpXS51X3N0cmlkZTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaTMyX3RtcF9vZmZzZXQgPSAtcEluW2ldLnVfc3RyaWRlOwogICAgICAgIH0KCiAgICAgICAgLyoqPCBJbiB0aGlzIGNhc2UsIG5vIGJpbGluZWFyIGludGVycG9sYXRpb24gaXMgbmVlZGVkIGFzIGlucHV0IGFuZCBvdXRwdXQgZGltZW5zaW9ucwogICAgICAgICAgICBhcmUgdGhlIHNhbWUgKi8KICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+bV9iT25seUNvcHkpCiAgICAgICAgewogICAgICAgICAgICAvKio8IE5vICstOTCwIHJvdGF0aW9uICovCiAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyoqPCBObyBmbGlwIG9uIFggYWJzY2lzc2EgKi8KICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKio8IENvcHkgb25lIHdob2xlIGxpbmUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcHU4X2RhdGFfb3V0LCAodm9pZCAqKXB1OF9kYXRhX2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRbaV0udV93aWR0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwogICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBZKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSBwSW5baV0udV9zdHJpZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiAtPSBwSW5baV0udV9zdHJpZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCiAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcGl4ZWwgb2YgMSByb3cgKi8KICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9ICpwdThfZGF0YV9pbi0tOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwogICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gKHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gcE91dFtpXS51X3dpZHRoICsgaTMyX3RtcF9vZmZzZXQ7CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKio8IEhlcmUgd2UgaGF2ZSBhICstOTCwIHJvdGF0aW9uICovCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwogICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX3RtcCA9IHB1OF9kYXRhX2luOwoKICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBwaXhlbCBvZiAxIHJvdyAqLwogICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKnB1OF9kYXRhX2luX3RtcDsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIGlucHV0IHBvaW50ZXIgaW4gb3JkZXIgdG8gZ28gdG8gbmV4dC9wYXN0IGxpbmUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fdG1wICs9IGkzMl90bXBfb2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gKHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGgpOwogICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiAtLTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqPCBCaWxpbmVhciBpbnRlcnBvbGF0aW9uICovCiAgICAgICAgZWxzZQogICAgICAgIHsKCiAgICAgICAgaWYoMyAhPSBpKSAgICAvKio8IG90aGVyIHRoYW4gYWxwaGEgcGxhbmUgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qKk5vICstOTCwIHJvdGF0aW9uICovCiAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwogICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHBDLT51MzJfeV9hY2N1bVtpXT4+MTIpJjE1OwoKICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCiAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07CgoKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCBmYWN0b3IgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAodTMyX3hfYWNjdW0gPj4gMTYpKSAtMSA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCBmYWN0b3IgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwoKICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gKz0gcEMtPnUzMl95X2luY1tpXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfYWNjdW1baV0+PjE2KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3lfYWNjdW1baV0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICY9IDB4ZmZmZjsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICAgICAvKiogKy05MLAgcm90YXRpb24gKi8KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl9vcmcgPSBwdThfZGF0YV9pbjsKCiAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcm93ICovCiAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyogaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCiAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9IChwQy0+dTMyX3hfYWNjdW1baV0+PjEyKSYxNTsKCiAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCiAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07CgogICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpKSAtIDE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7CgogICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCiAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldICs9IHBDLT51MzJfeF9pbmNbaV07CgogICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW5fb3JnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQogICAgICAgICAgICB9LyoqIDMgIT0gaSAqLwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgLyoqTm8gKy05MLAgcm90YXRpb24gKi8KICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCiAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwogICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAocEMtPnUzMl95X2FjY3VtW2ldPj4xMikmMTU7CgogICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXTsKCgoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQogICAgICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCBmYWN0b3IgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAodTMyX3hfYWNjdW0gPj4gMTYpKSAtMSA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgZmFjdG9yICovCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7CgogICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwogICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSArPSBwQy0+dTMyX3lfaW5jW2ldOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9hY2N1bVtpXT4+MTYpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeV9hY2N1bVtpXSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gJj0gMHhmZmZmOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0gLyoqPCBNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkgKi8KICAgICAgICAgICAgLyoqICstOTCwIHJvdGF0aW9uICovCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fb3JnID0gcHU4X2RhdGFfaW47CgogICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHJvdyAqLwogICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwogICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAocEMtPnUzMl94X2FjY3VtW2ldPj4xMikmMTU7CgogICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwogICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwoKICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCiAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQogICAgICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KSkgLSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwogICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7CgogICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCiAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldICs9IHBDLT51MzJfeF9pbmNbaV07CgogICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW5fb3JnOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gLyoqPCBNNE9TQV9UUlVFID09IHBDLT5tX2JSZXZlcnRYWSAqLwogICAgICAgIH0vKiogMyA9PSBpICovCiAgICAgICAgICAgIH0KICAgICAgICAvKio8IEluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUsIHNhdmUgY3VycmVudCBpbnB1dCBwb2ludGVyICovCiAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKQogICAgICAgIHsKICAgICAgICAgICAgcEMtPnB1OF9kYXRhX2luW2ldID0gcHU4X2RhdGFfaW47CiAgICAgICAgfQogICAgfQoKICAgIC8qKjwgVXBkYXRlIG51bWJlciBvZiBwcm9jZXNzZWQgcm93cywgcmVzZXQgaXQgaWYgd2UgaGF2ZSBmaW5pc2hlZAogICAgICAgICB3aXRoIHRoZSB3aG9sZSBwcm9jZXNzaW5nICovCiAgICBwQy0+bV9wcm9jUm93cyArPSBwT3V0WzBdLnVfaGVpZ2h0OwogICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQogICAgewogICAgICAgIGlmKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPD0gcEMtPm1fcHJvY1Jvd3MpICAgIHBDLT5tX3Byb2NSb3dzID0gMDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZihwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPD0gcEMtPm1fcHJvY1Jvd3MpICAgIHBDLT5tX3Byb2NSb3dzID0gMDsKICAgIH0KCiAgICByZXR1cm4gTTROT19FUlJPUiA7Cgp9CgoKCg==