LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL2ZvbnRjb25maWcvZm9udGNvbmZpZy5oLHYgMS4yMyAyMDAyLzA3LzI4IDEwOjUwOjU4IGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAxIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaWZuZGVmIF9GT05UQ09ORklHX0hfCiNkZWZpbmUgX0ZPTlRDT05GSUdfSF8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCnR5cGVkZWYgdW5zaWduZWQgY2hhcglGY0NoYXI4Owp0eXBlZGVmIHVuc2lnbmVkIHNob3J0CUZjQ2hhcjE2Owp0eXBlZGVmIHVuc2lnbmVkIGludAlGY0NoYXIzMjsKdHlwZWRlZiBpbnQJCUZjQm9vbDsKCi8qCiAqIEN1cnJlbnQgRm9udGNvbmZpZyB2ZXJzaW9uIG51bWJlcgogKi8KI2RlZmluZSBGQ19NQUpPUgkxCiNkZWZpbmUgRkNfTUlOT1IJMAojZGVmaW5lIEZDX1JFVklTSU9OCTEKCiNkZWZpbmUgRkNfVkVSU0lPTgkoKEZDX01BSk9SICogMTAwMDApICsgKEZDX01JTk9SICogMTAwKSArIChGQ19SRVZJU0lPTikpCgojZGVmaW5lIEZjVHJ1ZQkJMQojZGVmaW5lIEZjRmFsc2UJCTAKCiNkZWZpbmUgRkNfRkFNSUxZCSAgICAiZmFtaWx5IgkJLyogU3RyaW5nICovCiNkZWZpbmUgRkNfU1RZTEUJICAgICJzdHlsZSIJCS8qIFN0cmluZyAqLwojZGVmaW5lIEZDX1NMQU5UCSAgICAic2xhbnQiCQkvKiBJbnQgKi8KI2RlZmluZSBGQ19XRUlHSFQJICAgICJ3ZWlnaHQiCQkvKiBJbnQgKi8KI2RlZmluZSBGQ19TSVpFCQkgICAgInNpemUiCQkvKiBEb3VibGUgKi8KI2RlZmluZSBGQ19BU1BFQ1QJICAgICJhc3BlY3QiCQkvKiBEb3VibGUgKi8KI2RlZmluZSBGQ19QSVhFTF9TSVpFCSAgICAicGl4ZWxzaXplIgkJLyogRG91YmxlICovCiNkZWZpbmUgRkNfU1BBQ0lORwkgICAgInNwYWNpbmciCQkvKiBJbnQgKi8KI2RlZmluZSBGQ19GT1VORFJZCSAgICAiZm91bmRyeSIJCS8qIFN0cmluZyAqLwojZGVmaW5lIEZDX0FOVElBTElBUwkgICAgImFudGlhbGlhcyIJCS8qIEJvb2wgKGRlcGVuZHMpICovCiNkZWZpbmUgRkNfSElOVElORwkgICAgImhpbnRpbmciCQkvKiBCb29sICh0cnVlKSAqLwojZGVmaW5lIEZDX1ZFUlRJQ0FMX0xBWU9VVCAgInZlcnRpY2FsbGF5b3V0IgkvKiBCb29sIChmYWxzZSkgKi8KI2RlZmluZSBGQ19BVVRPSElOVAkgICAgImF1dG9oaW50IgkJLyogQm9vbCAoZmFsc2UpICovCiNkZWZpbmUgRkNfR0xPQkFMX0FEVkFOQ0UgICAiZ2xvYmFsYWR2YW5jZSIJLyogQm9vbCAodHJ1ZSkgKi8KI2RlZmluZSBGQ19GSUxFCQkgICAgImZpbGUiCQkvKiBTdHJpbmcgKi8KI2RlZmluZSBGQ19JTkRFWAkgICAgImluZGV4IgkJLyogSW50ICovCiNkZWZpbmUgRkNfRlRfRkFDRQkgICAgImZ0ZmFjZSIJCS8qIEZUX0ZhY2UgKi8KI2RlZmluZSBGQ19SQVNURVJJWkVSCSAgICAicmFzdGVyaXplciIJLyogU3RyaW5nICovCiNkZWZpbmUgRkNfT1VUTElORQkgICAgIm91dGxpbmUiCQkvKiBCb29sICovCiNkZWZpbmUgRkNfU0NBTEFCTEUJICAgICJzY2FsYWJsZSIJCS8qIEJvb2wgKi8KI2RlZmluZSBGQ19TQ0FMRQkgICAgInNjYWxlIgkJLyogZG91YmxlICovCiNkZWZpbmUgRkNfRFBJCQkgICAgImRwaSIJCS8qIGRvdWJsZSAqLwojZGVmaW5lIEZDX1JHQkEJCSAgICAicmdiYSIJCS8qIEludCAqLwojZGVmaW5lIEZDX01JTlNQQUNFCSAgICAibWluc3BhY2UiCQkvKiBCb29sIHVzZSBtaW5pbXVtIGxpbmUgc3BhY2luZyAqLwojZGVmaW5lIEZDX1NPVVJDRQkgICAgInNvdXJjZSIJCS8qIFN0cmluZyAoWDExLCBmcmVldHlwZSkgKi8KI2RlZmluZSBGQ19DSEFSU0VUCSAgICAiY2hhcnNldCIJCS8qIENoYXJTZXQgKi8KI2RlZmluZSBGQ19MQU5HCQkgICAgImxhbmciCQkvKiBTdHJpbmcgT1MvMiBDb2RlUGFnZVJhbmdlICovCgojZGVmaW5lIEZDX0RJUl9DQUNIRV9GSUxFCSAgICAiZm9udHMuY2FjaGUiCiNkZWZpbmUgRkNfVVNFUl9DQUNIRV9GSUxFCSAgICAiLmZvbnRzLmNhY2hlIgoKLyogQWRqdXN0IG91dGxpbmUgcmFzdGVyaXplciAqLwojZGVmaW5lIEZDX0NIQVJfV0lEVEgJICAgICJjaGFyd2lkdGgiCS8qIEludCAqLwojZGVmaW5lIEZDX0NIQVJfSEVJR0hUCSAgICAiY2hhcmhlaWdodCIvKiBJbnQgKi8KI2RlZmluZSBGQ19NQVRSSVgJICAgICJtYXRyaXgiICAgIC8qIEZjTWF0cml4ICovCgojZGVmaW5lIEZDX1dFSUdIVF9MSUdIVAkgICAgMAojZGVmaW5lIEZDX1dFSUdIVF9NRURJVU0gICAgMTAwCiNkZWZpbmUgRkNfV0VJR0hUX0RFTUlCT0xEICAxODAKI2RlZmluZSBGQ19XRUlHSFRfQk9MRAkgICAgMjAwCiNkZWZpbmUgRkNfV0VJR0hUX0JMQUNLCSAgICAyMTAKCiNkZWZpbmUgRkNfU0xBTlRfUk9NQU4JICAgIDAKI2RlZmluZSBGQ19TTEFOVF9JVEFMSUMJICAgIDEwMAojZGVmaW5lIEZDX1NMQU5UX09CTElRVUUgICAgMTEwCgojZGVmaW5lIEZDX1BST1BPUlRJT05BTAkgICAgMAojZGVmaW5lIEZDX01PTk8JCSAgICAxMDAKI2RlZmluZSBGQ19DSEFSQ0VMTAkgICAgMTEwCgovKiBzdWItcGl4ZWwgb3JkZXIgKi8KI2RlZmluZSBGQ19SR0JBX05PTkUJICAgIDAKI2RlZmluZSBGQ19SR0JBX1JHQgkgICAgMQojZGVmaW5lIEZDX1JHQkFfQkdSCSAgICAyCiNkZWZpbmUgRkNfUkdCQV9WUkdCCSAgICAzCiNkZWZpbmUgRkNfUkdCQV9WQkdSCSAgICA0Cgp0eXBlZGVmIGVudW0gX0ZjVHlwZSB7CiAgICBGY1R5cGVWb2lkLCAKICAgIEZjVHlwZUludGVnZXIsIAogICAgRmNUeXBlRG91YmxlLCAKICAgIEZjVHlwZVN0cmluZywgCiAgICBGY1R5cGVCb29sLAogICAgRmNUeXBlTWF0cml4LAogICAgRmNUeXBlQ2hhclNldCwKICAgIEZjVHlwZUZURmFjZQp9IEZjVHlwZTsKCnR5cGVkZWYgc3RydWN0IF9GY01hdHJpeCB7CiAgICBkb3VibGUgeHgsIHh5LCB5eCwgeXk7Cn0gRmNNYXRyaXg7CgojZGVmaW5lIEZjTWF0cml4SW5pdChtKQkoKG0pLT54eCA9IChtKS0+eXkgPSAxLCBcCgkJCSAobSktPnh5ID0gKG0pLT55eCA9IDApCgovKgogKiBBIGRhdGEgc3RydWN0dXJlIHRvIHJlcHJlc2VudCB0aGUgYXZhaWxhYmxlIGdseXBocyBpbiBhIGZvbnQuCiAqIFRoaXMgaXMgcmVwcmVzZW50ZWQgYXMgYSBzcGFyc2UgYm9vbGVhbiBidHJlZS4KICovCgp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyU2V0IEZjQ2hhclNldDsKCnR5cGVkZWYgc3RydWN0IF9GY09iamVjdFR5cGUgewogICAgY29uc3QgY2hhcgkqb2JqZWN0OwogICAgRmNUeXBlCXR5cGU7Cn0gRmNPYmplY3RUeXBlOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ29uc3RhbnQgewogICAgY29uc3QgRmNDaGFyOCAgKm5hbWU7CiAgICBjb25zdCBjaGFyCSpvYmplY3Q7CiAgICBpbnQJCXZhbHVlOwp9IEZjQ29uc3RhbnQ7Cgp0eXBlZGVmIGVudW0gX0ZjUmVzdWx0IHsKICAgIEZjUmVzdWx0TWF0Y2gsIEZjUmVzdWx0Tm9NYXRjaCwgRmNSZXN1bHRUeXBlTWlzbWF0Y2gsIEZjUmVzdWx0Tm9JZAp9IEZjUmVzdWx0OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjVmFsdWUgewogICAgRmNUeXBlCXR5cGU7CiAgICB1bmlvbiB7Cgljb25zdCBGY0NoYXI4CSpzOwoJaW50CQlpOwoJRmNCb29sCQliOwoJZG91YmxlCQlkOwoJY29uc3QgRmNNYXRyaXgJKm07Cgljb25zdCBGY0NoYXJTZXQJKmM7Cgl2b2lkCQkqZjsKICAgIH0gdTsKfSBGY1ZhbHVlOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjUGF0dGVybiAgIEZjUGF0dGVybjsKCnR5cGVkZWYgc3RydWN0IF9GY0ZvbnRTZXQgewogICAgaW50CQluZm9udDsKICAgIGludAkJc2ZvbnQ7CiAgICBGY1BhdHRlcm4JKipmb250czsKfSBGY0ZvbnRTZXQ7Cgp0eXBlZGVmIHN0cnVjdCBfRmNPYmplY3RTZXQgewogICAgaW50CQlub2JqZWN0OwogICAgaW50CQlzb2JqZWN0OwogICAgY29uc3QgY2hhcgkqKm9iamVjdHM7Cn0gRmNPYmplY3RTZXQ7CiAgICAKdHlwZWRlZiBlbnVtIF9GY01hdGNoS2luZCB7CiAgICBGY01hdGNoUGF0dGVybiwgRmNNYXRjaEZvbnQgCn0gRmNNYXRjaEtpbmQ7Cgp0eXBlZGVmIGVudW0gX0ZjU2V0TmFtZSB7CiAgICBGY1NldFN5c3RlbSA9IDAsCiAgICBGY1NldEFwcGxpY2F0aW9uID0gMQp9IEZjU2V0TmFtZTsKCnR5cGVkZWYgc3RydWN0IF9GY0F0b21pYyBGY0F0b21pYzsKCiNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpIC8qIGZvciBDKysgVjIuMCAqLwojZGVmaW5lIF9GQ0ZVTkNQUk9UT0JFR0lOIGV4dGVybiAiQyIgewkvKiBkbyBub3QgbGVhdmUgb3BlbiBhY3Jvc3MgaW5jbHVkZXMgKi8KI2RlZmluZSBfRkNGVU5DUFJPVE9FTkQgfQojZWxzZQojZGVmaW5lIF9GQ0ZVTkNQUk9UT0JFR0lOCiNkZWZpbmUgX0ZDRlVOQ1BST1RPRU5ECiNlbmRpZgoKdHlwZWRlZiBlbnVtIHsgRmNFbmRpYW5CaWcsIEZjRW5kaWFuTGl0dGxlIH0gRmNFbmRpYW47Cgp0eXBlZGVmIHN0cnVjdCBfRmNDb25maWcgICAgRmNDb25maWc7Cgp0eXBlZGVmIHN0cnVjdCBfRmNHbG9iYWxDYWNoZQlGY0ZpbGVDYWNoZTsKCnR5cGVkZWYgc3RydWN0IF9GY0JsYW5rcyAgICBGY0JsYW5rczsKCnR5cGVkZWYgc3RydWN0IF9GY1N0ckxpc3QgICBGY1N0ckxpc3Q7Cgp0eXBlZGVmIHN0cnVjdCBfRmNTdHJTZXQgICAgRmNTdHJTZXQ7CgpfRkNGVU5DUFJPVE9CRUdJTgoKRmNCb29sCkZjRGlyQ2FjaGVWYWxpZCAoY29uc3QgRmNDaGFyOCAqY2FjaGVfZmlsZSk7CgovKiBmY2JsYW5rcy5jICovCkZjQmxhbmtzICoKRmNCbGFua3NDcmVhdGUgKHZvaWQpOwoKdm9pZApGY0JsYW5rc0Rlc3Ryb3kgKEZjQmxhbmtzICpiKTsKCkZjQm9vbApGY0JsYW5rc0FkZCAoRmNCbGFua3MgKmIsIEZjQ2hhcjMyIHVjczQpOwoKRmNCb29sCkZjQmxhbmtzSXNNZW1iZXIgKEZjQmxhbmtzICpiLCBGY0NoYXIzMiB1Y3M0KTsKCi8qIGZjY2ZnLmMgKi8KRmNDaGFyOCAqCkZjQ29uZmlnRmlsZW5hbWUgKGNvbnN0IEZjQ2hhcjggKnVybCk7CiAgICAKRmNDb25maWcgKgpGY0NvbmZpZ0NyZWF0ZSAodm9pZCk7Cgp2b2lkCkZjQ29uZmlnRGVzdHJveSAoRmNDb25maWcgKmNvbmZpZyk7CgpGY0Jvb2wKRmNDb25maWdTZXRDdXJyZW50IChGY0NvbmZpZyAqY29uZmlnKTsKCkZjQ29uZmlnICoKRmNDb25maWdHZXRDdXJyZW50ICh2b2lkKTsKCkZjQm9vbApGY0NvbmZpZ1VwdG9EYXRlIChGY0NvbmZpZyAqY29uZmlnKTsKICAgIApGY0Jvb2wKRmNDb25maWdCdWlsZEZvbnRzIChGY0NvbmZpZyAqY29uZmlnKTsKCkZjU3RyTGlzdCAqCkZjQ29uZmlnR2V0Rm9udERpcnMgKEZjQ29uZmlnICAgKmNvbmZpZyk7CgpGY1N0ckxpc3QgKgpGY0NvbmZpZ0dldENvbmZpZ0RpcnMgKEZjQ29uZmlnICAgKmNvbmZpZyk7CgpGY1N0ckxpc3QgKgpGY0NvbmZpZ0dldENvbmZpZ0ZpbGVzIChGY0NvbmZpZyAgICAqY29uZmlnKTsKCkZjQ2hhcjggKgpGY0NvbmZpZ0dldENhY2hlIChGY0NvbmZpZyAgKmNvbmZpZyk7CgpGY0JsYW5rcyAqCkZjQ29uZmlnR2V0QmxhbmtzIChGY0NvbmZpZyAqY29uZmlnKTsKCmludApGY0NvbmZpZ0dldFJlc2NhbkludmVydmFsIChGY0NvbmZpZyAqY29uZmlnKTsKCkZjQm9vbApGY0NvbmZpZ1NldFJlc2NhbkludmVydmFsIChGY0NvbmZpZyAqY29uZmlnLCBpbnQgcmVzY2FuSW50ZXJ2YWwpOwoKRmNGb250U2V0ICoKRmNDb25maWdHZXRGb250cyAoRmNDb25maWcJKmNvbmZpZywKCQkgIEZjU2V0TmFtZQlzZXQpOwoKRmNCb29sCkZjQ29uZmlnQXBwRm9udEFkZEZpbGUgKEZjQ29uZmlnICAgICpjb25maWcsCgkJCWNvbnN0IEZjQ2hhcjggICpmaWxlKTsKCkZjQm9vbApGY0NvbmZpZ0FwcEZvbnRBZGREaXIgKEZjQ29uZmlnCSAgICAqY29uZmlnLAoJCSAgICAgICBjb25zdCBGY0NoYXI4ICAgKmRpcik7Cgp2b2lkCkZjQ29uZmlnQXBwRm9udENsZWFyIChGY0NvbmZpZwkgICAgKmNvbmZpZyk7CgpGY0Jvb2wKRmNDb25maWdTdWJzdGl0dXRlIChGY0NvbmZpZwkqY29uZmlnLAoJCSAgICBGY1BhdHRlcm4JKnAsCgkJICAgIEZjTWF0Y2hLaW5kCWtpbmQpOwoKLyogZmNjaGFyc2V0LmMgKi8KRmNDaGFyU2V0ICoKRmNDaGFyU2V0Q3JlYXRlICh2b2lkKTsKCnZvaWQKRmNDaGFyU2V0RGVzdHJveSAoRmNDaGFyU2V0ICpmY3MpOwoKRmNCb29sCkZjQ2hhclNldEFkZENoYXIgKEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KTsKCkZjQ2hhclNldCAqCkZjQ2hhclNldENvcHkgKEZjQ2hhclNldCAqc3JjKTsKCkZjQm9vbApGY0NoYXJTZXRFcXVhbCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpOwoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0SW50ZXJzZWN0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRVbmlvbiAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpOwoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0U3VidHJhY3QgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKTsKCkZjQm9vbApGY0NoYXJTZXRIYXNDaGFyIChjb25zdCBGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCk7CgpGY0NoYXIzMgpGY0NoYXJTZXRDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphKTsKCkZjQ2hhcjMyCkZjQ2hhclNldEludGVyc2VjdENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7CgpGY0NoYXIzMgpGY0NoYXJTZXRTdWJ0cmFjdENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7CgpGY0Jvb2wKRmNDaGFyU2V0SXNTdWJzZXQgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKTsKCiNkZWZpbmUgRkNfQ0hBUlNFVF9NQVBfU0laRSAoMjU2LzMyKQojZGVmaW5lIEZDX0NIQVJTRVRfRE9ORQkoKEZjQ2hhcjMyKSAtMSkKCkZjQ2hhcjMyCkZjQ2hhclNldEZpcnN0UGFnZSAoY29uc3QgRmNDaGFyU2V0ICphLCAKCQkgICAgRmNDaGFyMzIJICAgIG1hcFtGQ19DSEFSU0VUX01BUF9TSVpFXSwKCQkgICAgRmNDaGFyMzIJICAgICpuZXh0KTsKCkZjQ2hhcjMyCkZjQ2hhclNldE5leHRQYWdlIChjb25zdCBGY0NoYXJTZXQgICphLCAKCQkgICBGY0NoYXIzMgkgICAgbWFwW0ZDX0NIQVJTRVRfTUFQX1NJWkVdLAoJCSAgIEZjQ2hhcjMyCSAgICAqbmV4dCk7CgoKLyogZmNkYmcuYyAqLwp2b2lkCkZjVmFsdWVQcmludCAoRmNWYWx1ZSB2KTsKCnZvaWQKRmNQYXR0ZXJuUHJpbnQgKEZjUGF0dGVybiAqcCk7Cgp2b2lkCkZjRm9udFNldFByaW50IChGY0ZvbnRTZXQgKnMpOwoKLyogZmNkZWZhdWx0LmMgKi8Kdm9pZApGY0RlZmF1bHRTdWJzdGl0dXRlIChGY1BhdHRlcm4gKnBhdHRlcm4pOwoKLyogZmNkaXIuYyAqLwpGY0Jvb2wKRmNGaWxlU2NhbiAoRmNGb250U2V0CSAgICAqc2V0LAoJICAgIEZjU3RyU2V0CSAgICAqZGlycywKCSAgICBGY0ZpbGVDYWNoZQkgICAgKmNhY2hlLAoJICAgIEZjQmxhbmtzCSAgICAqYmxhbmtzLAoJICAgIGNvbnN0IEZjQ2hhcjggICAqZmlsZSwKCSAgICBGY0Jvb2wJICAgIGZvcmNlKTsKCkZjQm9vbApGY0RpclNjYW4gKEZjRm9udFNldAkgICAgKnNldCwKCSAgIEZjU3RyU2V0CSAgICAqZGlycywKCSAgIEZjRmlsZUNhY2hlCSAgICAqY2FjaGUsCgkgICBGY0JsYW5rcwkgICAgKmJsYW5rcywKCSAgIGNvbnN0IEZjQ2hhcjggICAgKmRpciwKCSAgIEZjQm9vbAkgICAgZm9yY2UpOwoKRmNCb29sCkZjRGlyU2F2ZSAoRmNGb250U2V0ICpzZXQsIEZjU3RyU2V0ICpkaXJzLCBjb25zdCBGY0NoYXI4ICpkaXIpOwoKLyogZmNmcmVldHlwZS5jICovCkZjUGF0dGVybiAqCkZjRnJlZVR5cGVRdWVyeSAoY29uc3QgRmNDaGFyOCAqZmlsZSwgaW50IGlkLCBGY0JsYW5rcyAqYmxhbmtzLCBpbnQgKmNvdW50KTsKCi8qIGZjZnMuYyAqLwoKRmNGb250U2V0ICoKRmNGb250U2V0Q3JlYXRlICh2b2lkKTsKCnZvaWQKRmNGb250U2V0RGVzdHJveSAoRmNGb250U2V0ICpzKTsKCkZjQm9vbApGY0ZvbnRTZXRBZGQgKEZjRm9udFNldCAqcywgRmNQYXR0ZXJuICpmb250KTsKCi8qIGZjaW5pdC5jICovCkZjQ29uZmlnICoKRmNJbml0TG9hZENvbmZpZyAodm9pZCk7CgpGY0NvbmZpZyAqCkZjSW5pdExvYWRDb25maWdBbmRGb250cyAodm9pZCk7CgpGY0Jvb2wKRmNJbml0ICh2b2lkKTsKCmludApGY0dldFZlcnNpb24gKHZvaWQpOwoKRmNCb29sCkZjSW5pdFJlaW5pdGlhbGl6ZSAodm9pZCk7CgpGY0Jvb2wKRmNJbml0QnJpbmdVcHRvRGF0ZSAodm9pZCk7CgovKiBmY2xpc3QuYyAqLwpGY09iamVjdFNldCAqCkZjT2JqZWN0U2V0Q3JlYXRlICh2b2lkKTsKCkZjQm9vbApGY09iamVjdFNldEFkZCAoRmNPYmplY3RTZXQgKm9zLCBjb25zdCBjaGFyICpvYmplY3QpOwoKdm9pZApGY09iamVjdFNldERlc3Ryb3kgKEZjT2JqZWN0U2V0ICpvcyk7CgpGY09iamVjdFNldCAqCkZjT2JqZWN0U2V0VmFCdWlsZCAoY29uc3QgY2hhciAqZmlyc3QsIHZhX2xpc3QgdmEpOwoKRmNPYmplY3RTZXQgKgpGY09iamVjdFNldEJ1aWxkIChjb25zdCBjaGFyICpmaXJzdCwgLi4uKTsKCkZjRm9udFNldCAqCkZjRm9udFNldExpc3QgKEZjQ29uZmlnCSAgICAqY29uZmlnLAoJICAgICAgIEZjRm9udFNldCAgICAqKnNldHMsCgkgICAgICAgaW50CSAgICBuc2V0cywKCSAgICAgICBGY1BhdHRlcm4gICAgKnAsCgkgICAgICAgRmNPYmplY3RTZXQgICpvcyk7CgpGY0ZvbnRTZXQgKgpGY0ZvbnRMaXN0IChGY0NvbmZpZwkqY29uZmlnLAoJICAgIEZjUGF0dGVybgkqcCwKCSAgICBGY09iamVjdFNldCAqb3MpOwoKLyogZmNhdG9taWMuYyAqLwoKRmNBdG9taWMgKgpGY0F0b21pY0NyZWF0ZSAoY29uc3QgRmNDaGFyOCAgICpmaWxlKTsKCkZjQm9vbApGY0F0b21pY0xvY2sgKEZjQXRvbWljICphdG9taWMpOwoKRmNDaGFyOCAqCkZjQXRvbWljTmV3RmlsZSAoRmNBdG9taWMgKmF0b21pYyk7CgpGY0NoYXI4ICoKRmNBdG9taWNPcmlnRmlsZSAoRmNBdG9taWMgKmF0b21pYyk7CgpGY0Jvb2wKRmNBdG9taWNSZXBsYWNlT3JpZyAoRmNBdG9taWMgKmF0b21pYyk7Cgp2b2lkCkZjQXRvbWljRGVsZXRlTmV3IChGY0F0b21pYyAqYXRvbWljKTsKCnZvaWQKRmNBdG9taWNVbmxvY2sgKEZjQXRvbWljICphdG9taWMpOwoKdm9pZApGY0F0b21pY0Rlc3Ryb3kgKEZjQXRvbWljICphdG9taWMpOwoKLyogZmNtYXRjaC5jICovCkZjUGF0dGVybiAqCkZjRm9udFNldE1hdGNoIChGY0NvbmZpZyAgICAqY29uZmlnLAoJCUZjRm9udFNldCAgICoqc2V0cywKCQlpbnQJICAgIG5zZXRzLAoJCUZjUGF0dGVybiAgICpwLAoJCUZjUmVzdWx0ICAgICpyZXN1bHQpOwoKRmNQYXR0ZXJuICoKRmNGb250TWF0Y2ggKEZjQ29uZmlnCSpjb25maWcsCgkgICAgIEZjUGF0dGVybgkqcCwgCgkgICAgIEZjUmVzdWx0CSpyZXN1bHQpOwoKRmNQYXR0ZXJuICoKRmNGb250UmVuZGVyUHJlcGFyZSAoRmNDb25maWcJICAgICpjb25maWcsCgkJICAgICBGY1BhdHRlcm4JICAgICpwYXQsCgkJICAgICBGY1BhdHRlcm4JICAgICpmb250KTsKCkZjRm9udFNldCAqCkZjRm9udFNldFNvcnQgKEZjQ29uZmlnCSAgICAqY29uZmlnLAoJICAgICAgIEZjRm9udFNldCAgICAqKnNldHMsCgkgICAgICAgaW50CSAgICBuc2V0cywKCSAgICAgICBGY1BhdHRlcm4gICAgKnAsCgkgICAgICAgRmNCb29sCSAgICB0cmltLAoJICAgICAgIEZjQ2hhclNldCAgICAqKmNzcCwKCSAgICAgICBGY1Jlc3VsdAkgICAgKnJlc3VsdCk7CgpGY0ZvbnRTZXQgKgpGY0ZvbnRTb3J0IChGY0NvbmZpZwkgKmNvbmZpZywKCSAgICBGY1BhdHRlcm4gICAgKnAsCgkgICAgRmNCb29sCSB0cmltLAoJICAgIEZjQ2hhclNldCAgICAqKmNzcCwKCSAgICBGY1Jlc3VsdAkgKnJlc3VsdCk7Cgp2b2lkCkZjRm9udFNldFNvcnREZXN0cm95IChGY0ZvbnRTZXQgKmZzKTsKCi8qIGZjbWF0cml4LmMgKi8KRmNNYXRyaXggKgpGY01hdHJpeENvcHkgKGNvbnN0IEZjTWF0cml4ICptYXQpOwoKRmNCb29sCkZjTWF0cml4RXF1YWwgKGNvbnN0IEZjTWF0cml4ICptYXQxLCBjb25zdCBGY01hdHJpeCAqbWF0Mik7Cgp2b2lkCkZjTWF0cml4TXVsdGlwbHkgKEZjTWF0cml4ICpyZXN1bHQsIGNvbnN0IEZjTWF0cml4ICphLCBjb25zdCBGY01hdHJpeCAqYik7Cgp2b2lkCkZjTWF0cml4Um90YXRlIChGY01hdHJpeCAqbSwgZG91YmxlIGMsIGRvdWJsZSBzKTsKCnZvaWQKRmNNYXRyaXhTY2FsZSAoRmNNYXRyaXggKm0sIGRvdWJsZSBzeCwgZG91YmxlIHN5KTsKCnZvaWQKRmNNYXRyaXhTaGVhciAoRmNNYXRyaXggKm0sIGRvdWJsZSBzaCwgZG91YmxlIHN2KTsKCi8qIGZjbmFtZS5jICovCgpGY0Jvb2wKRmNOYW1lUmVnaXN0ZXJPYmplY3RUeXBlcyAoY29uc3QgRmNPYmplY3RUeXBlICp0eXBlcywgaW50IG50eXBlKTsKCkZjQm9vbApGY05hbWVVbnJlZ2lzdGVyT2JqZWN0VHlwZXMgKGNvbnN0IEZjT2JqZWN0VHlwZSAqdHlwZXMsIGludCBudHlwZSk7CiAgICAKY29uc3QgRmNPYmplY3RUeXBlICoKRmNOYW1lR2V0T2JqZWN0VHlwZSAoY29uc3QgY2hhciAqb2JqZWN0KTsKCkZjQm9vbApGY05hbWVSZWdpc3RlckNvbnN0YW50cyAoY29uc3QgRmNDb25zdGFudCAqY29uc3RzLCBpbnQgbmNvbnN0cyk7CgpGY0Jvb2wKRmNOYW1lVW5yZWdpc3RlckNvbnN0YW50cyAoY29uc3QgRmNDb25zdGFudCAqY29uc3RzLCBpbnQgbmNvbnN0cyk7CiAgICAKY29uc3QgRmNDb25zdGFudCAqCkZjTmFtZUdldENvbnN0YW50IChGY0NoYXI4ICpzdHJpbmcpOwoKRmNCb29sCkZjTmFtZUNvbnN0YW50IChGY0NoYXI4ICpzdHJpbmcsIGludCAqcmVzdWx0KTsKCkZjUGF0dGVybiAqCkZjTmFtZVBhcnNlIChjb25zdCBGY0NoYXI4ICpuYW1lKTsKCkZjQ2hhcjggKgpGY05hbWVVbnBhcnNlIChGY1BhdHRlcm4gKnBhdCk7CgovKiBmY3BhdC5jICovCkZjUGF0dGVybiAqCkZjUGF0dGVybkNyZWF0ZSAodm9pZCk7CgpGY1BhdHRlcm4gKgpGY1BhdHRlcm5EdXBsaWNhdGUgKEZjUGF0dGVybiAqcCk7Cgp2b2lkCkZjUGF0dGVyblJlZmVyZW5jZSAoRmNQYXR0ZXJuICpwKTsKCnZvaWQKRmNWYWx1ZURlc3Ryb3kgKEZjVmFsdWUgdik7CgpGY0Jvb2wKRmNWYWx1ZUVxdWFsIChGY1ZhbHVlIHZhLCBGY1ZhbHVlIHZiKTsKCkZjVmFsdWUKRmNWYWx1ZVNhdmUgKEZjVmFsdWUgdik7Cgp2b2lkCkZjUGF0dGVybkRlc3Ryb3kgKEZjUGF0dGVybiAqcCk7CgpGY0Jvb2wKRmNQYXR0ZXJuRXF1YWwgKGNvbnN0IEZjUGF0dGVybiAqcGEsIGNvbnN0IEZjUGF0dGVybiAqcGIpOwoKRmNCb29sCkZjUGF0dGVybkVxdWFsU3Vic2V0IChjb25zdCBGY1BhdHRlcm4gKnBhLCBjb25zdCBGY1BhdHRlcm4gKnBiLCBjb25zdCBGY09iamVjdFNldCAqb3MpOwoKRmNDaGFyMzIKRmNQYXR0ZXJuSGFzaCAoY29uc3QgRmNQYXR0ZXJuICpwKTsKCkZjQm9vbApGY1BhdHRlcm5BZGQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBGY1ZhbHVlIHZhbHVlLCBGY0Jvb2wgYXBwZW5kKTsKICAgIApGY0Jvb2wKRmNQYXR0ZXJuQWRkV2VhayAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjVmFsdWUgdmFsdWUsIEZjQm9vbCBhcHBlbmQpOwogICAgCkZjUmVzdWx0CkZjUGF0dGVybkdldCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpZCwgRmNWYWx1ZSAqdik7CiAgICAKRmNCb29sCkZjUGF0dGVybkRlbCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QpOwoKRmNCb29sCkZjUGF0dGVybkFkZEludGVnZXIgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgaSk7CgpGY0Jvb2wKRmNQYXR0ZXJuQWRkRG91YmxlIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgZG91YmxlIGQpOwoKRmNCb29sCkZjUGF0dGVybkFkZFN0cmluZyAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGNvbnN0IEZjQ2hhcjggKnMpOwoKRmNCb29sCkZjUGF0dGVybkFkZE1hdHJpeCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGNvbnN0IEZjTWF0cml4ICpzKTsKCkZjQm9vbApGY1BhdHRlcm5BZGRDaGFyU2V0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgY29uc3QgRmNDaGFyU2V0ICpjKTsKCkZjQm9vbApGY1BhdHRlcm5BZGRCb29sIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgRmNCb29sIGIpOwoKRmNSZXN1bHQKRmNQYXR0ZXJuR2V0SW50ZWdlciAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBpbnQgKmkpOwoKRmNSZXN1bHQKRmNQYXR0ZXJuR2V0RG91YmxlIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIGRvdWJsZSAqZCk7CgpGY1Jlc3VsdApGY1BhdHRlcm5HZXRTdHJpbmcgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgRmNDaGFyOCAqKiBzKTsKCkZjUmVzdWx0CkZjUGF0dGVybkdldE1hdHJpeCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBGY01hdHJpeCAqKnMpOwoKRmNSZXN1bHQKRmNQYXR0ZXJuR2V0Q2hhclNldCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBGY0NoYXJTZXQgKipjKTsKCkZjUmVzdWx0CkZjUGF0dGVybkdldEJvb2wgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgRmNCb29sICpiKTsKCkZjUGF0dGVybiAqCkZjUGF0dGVyblZhQnVpbGQgKEZjUGF0dGVybiAqb3JpZywgdmFfbGlzdCB2YSk7CiAgICAKRmNQYXR0ZXJuICoKRmNQYXR0ZXJuQnVpbGQgKEZjUGF0dGVybiAqb3JpZywgLi4uKTsKCi8qIGZjc3RyLmMgKi8KCkZjQ2hhcjggKgpGY1N0ckNvcHkgKGNvbnN0IEZjQ2hhcjggKnMpOwoKRmNDaGFyOCAqCkZjU3RyQ29weUZpbGVuYW1lIChjb25zdCBGY0NoYXI4ICpzKTsKICAgIAojZGVmaW5lIEZjVG9Mb3dlcihjKQkoKCdBJyA8PSAoYykgJiYgKGMpIDw9ICdaJykgPyAoYykgLSAnQScgKyAnYScgOiAoYykpCgppbnQKRmNTdHJDbXBJZ25vcmVDYXNlIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpOwoKaW50CkZjU3RyQ21wIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpOwoKaW50CkZjVXRmOFRvVWNzNCAoRmNDaGFyOCAgICpzcmNfb3JpZywKCSAgICAgIEZjQ2hhcjMyICAqZHN0LAoJICAgICAgaW50CWxlbik7CgpGY0Jvb2wKRmNVdGY4TGVuIChGY0NoYXI4CSpzdHJpbmcsCgkgICBpbnQJCWxlbiwKCSAgIGludAkJKm5jaGFyLAoJICAgaW50CQkqd2NoYXIpOwoKI2RlZmluZSBGQ19VVEY4X01BWF9MRU4JNgoKaW50CkZjVWNzNFRvVXRmOCAoRmNDaGFyMzIJdWNzNCwKCSAgICAgIEZjQ2hhcjgJZGVzdFtGQ19VVEY4X01BWF9MRU5dKTsKCmludApGY1V0ZjE2VG9VY3M0IChGY0NoYXI4CSpzcmNfb3JpZywKCSAgICAgICBGY0VuZGlhbgllbmRpYW4sCgkgICAgICAgRmNDaGFyMzIgKmRzdCwKCSAgICAgICBpbnQJbGVuKTsJICAgIC8qIGluIGJ5dGVzICovCgpGY0Jvb2wKRmNVdGYxNkxlbiAoRmNDaGFyOAkqc3RyaW5nLAoJICAgIEZjRW5kaWFuCWVuZGlhbiwKCSAgICBpbnQJCWxlbiwJICAgIC8qIGluIGJ5dGVzICovCgkgICAgaW50CQkqbmNoYXIsCgkgICAgaW50CQkqd2NoYXIpOwoKRmNDaGFyOCAqCkZjU3RyRGlybmFtZSAoY29uc3QgRmNDaGFyOCAqZmlsZSk7CgpGY0NoYXI4ICoKRmNTdHJCYXNlbmFtZSAoY29uc3QgRmNDaGFyOCAqZmlsZSk7CgpGY1N0clNldCAqCkZjU3RyU2V0Q3JlYXRlICh2b2lkKTsKCkZjQm9vbApGY1N0clNldE1lbWJlciAoRmNTdHJTZXQgKnNldCwgY29uc3QgRmNDaGFyOCAqcyk7CgpGY0Jvb2wKRmNTdHJTZXRBZGQgKEZjU3RyU2V0ICpzZXQsIGNvbnN0IEZjQ2hhcjggKnMpOwoKRmNCb29sCkZjU3RyU2V0QWRkRmlsZW5hbWUgKEZjU3RyU2V0ICpzZXQsIGNvbnN0IEZjQ2hhcjggKnMpOwoKRmNCb29sCkZjU3RyU2V0RGVsIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKTsKCnZvaWQKRmNTdHJTZXREZXN0cm95IChGY1N0clNldCAqc2V0KTsKCkZjU3RyTGlzdCAqCkZjU3RyTGlzdENyZWF0ZSAoRmNTdHJTZXQgKnNldCk7CgpGY0NoYXI4ICoKRmNTdHJMaXN0TmV4dCAoRmNTdHJMaXN0ICpsaXN0KTsKCnZvaWQKRmNTdHJMaXN0RG9uZSAoRmNTdHJMaXN0ICpsaXN0KTsKCi8qIGZjeG1sLmMgKi8KRmNCb29sCkZjQ29uZmlnUGFyc2VBbmRMb2FkIChGY0NvbmZpZyAqY29uZmlnLCBjb25zdCBGY0NoYXI4ICpmaWxlLCBGY0Jvb2wgY29tcGxhaW4pOwoKX0ZDRlVOQ1BST1RPRU5ECgojZW5kaWYgLyogX0ZPTlRDT05GSUdfSF8gKi8K