LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMSBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2lmbmRlZiBfRk9OVENPTkZJR19IXwojZGVmaW5lIF9GT05UQ09ORklHX0hfCgojaW5jbHVkZSA8c3RkYXJnLmg+Cgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIJRmNDaGFyODsKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlGY0NoYXIxNjsKdHlwZWRlZiB1bnNpZ25lZCBpbnQJRmNDaGFyMzI7CnR5cGVkZWYgaW50CQlGY0Jvb2w7CgovKgogKiBDdXJyZW50IEZvbnRjb25maWcgdmVyc2lvbiBudW1iZXIKICovCiNkZWZpbmUgRkNfTUFKT1IJMQojZGVmaW5lIEZDX01JTk9SCTAKI2RlZmluZSBGQ19SRVZJU0lPTgkwCgojZGVmaW5lIEZDX1ZFUlNJT04JKChGQ19NQUpPUiAqIDEwMDAwKSArIChGQ19NSU5PUiAqIDEwMCkgKyAoRkNfUkVWSVNJT04pKQoKI2RlZmluZSBGY1RydWUJCTEKI2RlZmluZSBGY0ZhbHNlCQkwCgojZGVmaW5lIEZDX0ZBTUlMWQkgICAgImZhbWlseSIJCS8qIFN0cmluZyAqLwojZGVmaW5lIEZDX1NUWUxFCSAgICAic3R5bGUiCQkvKiBTdHJpbmcgKi8KI2RlZmluZSBGQ19TTEFOVAkgICAgInNsYW50IgkJLyogSW50ICovCiNkZWZpbmUgRkNfV0VJR0hUCSAgICAid2VpZ2h0IgkJLyogSW50ICovCiNkZWZpbmUgRkNfU0laRQkJICAgICJzaXplIgkJLyogRG91YmxlICovCiNkZWZpbmUgRkNfUElYRUxfU0laRQkgICAgInBpeGVsc2l6ZSIJCS8qIERvdWJsZSAqLwojZGVmaW5lIEZDX1NQQUNJTkcJICAgICJzcGFjaW5nIgkJLyogSW50ICovCiNkZWZpbmUgRkNfRk9VTkRSWQkgICAgImZvdW5kcnkiCQkvKiBTdHJpbmcgKi8KI2RlZmluZSBGQ19BTlRJQUxJQVMJICAgICJhbnRpYWxpYXMiCQkvKiBCb29sIChkZXBlbmRzKSAqLwojZGVmaW5lIEZDX0hJTlRJTkcJICAgICJoaW50aW5nIgkJLyogQm9vbCAodHJ1ZSkgKi8KI2RlZmluZSBGQ19WRVJUSUNBTF9MQVlPVVQgICJ2ZXJ0aWNhbGxheW91dCIJLyogQm9vbCAoZmFsc2UpICovCiNkZWZpbmUgRkNfQVVUT0hJTlQJICAgICJhdXRvaGludCIJCS8qIEJvb2wgKGZhbHNlKSAqLwojZGVmaW5lIEZDX0dMT0JBTF9BRFZBTkNFICAgImdsb2JhbGFkdmFuY2UiCS8qIEJvb2wgKHRydWUpICovCiNkZWZpbmUgRkNfRklMRQkJICAgICJmaWxlIgkJLyogU3RyaW5nICovCiNkZWZpbmUgRkNfSU5ERVgJICAgICJpbmRleCIJCS8qIEludCAqLwojZGVmaW5lIEZDX1JBU1RFUklaRVIJICAgICJyYXN0ZXJpemVyIgkvKiBTdHJpbmcgKi8KI2RlZmluZSBGQ19PVVRMSU5FCSAgICAib3V0bGluZSIJCS8qIEJvb2wgKi8KI2RlZmluZSBGQ19TQ0FMQUJMRQkgICAgInNjYWxhYmxlIgkJLyogQm9vbCAqLwojZGVmaW5lIEZDX1NDQUxFCSAgICAic2NhbGUiCQkvKiBkb3VibGUgKi8KI2RlZmluZSBGQ19EUEkJCSAgICAiZHBpIgkJLyogZG91YmxlICovCiNkZWZpbmUgRkNfUkdCQQkJICAgICJyZ2JhIgkJLyogSW50ICovCiNkZWZpbmUgRkNfTUlOU1BBQ0UJICAgICJtaW5zcGFjZSIJCS8qIEJvb2wgdXNlIG1pbmltdW0gbGluZSBzcGFjaW5nICovCiNkZWZpbmUgRkNfU09VUkNFCSAgICAic291cmNlIgkJLyogU3RyaW5nIChYMTEsIGZyZWV0eXBlKSAqLwojZGVmaW5lIEZDX0NIQVJTRVQJICAgICJjaGFyc2V0IgkJLyogQ2hhclNldCAqLwojZGVmaW5lIEZDX0xBTkcJCSAgICAibGFuZyIJCS8qIFN0cmluZyBPUy8yIENvZGVQYWdlUmFuZ2UgKi8KCiNkZWZpbmUgRkNfRElSX0NBQ0hFX0ZJTEUJICAgICJmb250cy5jYWNoZSIKI2RlZmluZSBGQ19VU0VSX0NBQ0hFX0ZJTEUJICAgICIuZm9udHMuY2FjaGUiCgovKiBBZGp1c3Qgb3V0bGluZSByYXN0ZXJpemVyICovCiNkZWZpbmUgRkNfQ0hBUl9XSURUSAkgICAgImNoYXJ3aWR0aCIJLyogSW50ICovCiNkZWZpbmUgRkNfQ0hBUl9IRUlHSFQJICAgICJjaGFyaGVpZ2h0Ii8qIEludCAqLwojZGVmaW5lIEZDX01BVFJJWAkgICAgIm1hdHJpeCIgICAgLyogRmNNYXRyaXggKi8KCiNkZWZpbmUgRkNfV0VJR0hUX0xJR0hUCSAgICAwCiNkZWZpbmUgRkNfV0VJR0hUX01FRElVTSAgICAxMDAKI2RlZmluZSBGQ19XRUlHSFRfREVNSUJPTEQgIDE4MAojZGVmaW5lIEZDX1dFSUdIVF9CT0xECSAgICAyMDAKI2RlZmluZSBGQ19XRUlHSFRfQkxBQ0sJICAgIDIxMAoKI2RlZmluZSBGQ19TTEFOVF9ST01BTgkgICAgMAojZGVmaW5lIEZDX1NMQU5UX0lUQUxJQwkgICAgMTAwCiNkZWZpbmUgRkNfU0xBTlRfT0JMSVFVRSAgICAxMTAKCiNkZWZpbmUgRkNfUFJPUE9SVElPTkFMCSAgICAwCiNkZWZpbmUgRkNfTU9OTwkJICAgIDEwMAojZGVmaW5lIEZDX0NIQVJDRUxMCSAgICAxMTAKCi8qIHN1Yi1waXhlbCBvcmRlciAqLwojZGVmaW5lIEZDX1JHQkFfTk9ORQkgICAgMAojZGVmaW5lIEZDX1JHQkFfUkdCCSAgICAxCiNkZWZpbmUgRkNfUkdCQV9CR1IJICAgIDIKI2RlZmluZSBGQ19SR0JBX1ZSR0IJICAgIDMKI2RlZmluZSBGQ19SR0JBX1ZCR1IJICAgIDQKCi8qIGxhbmd1YWdlIGdyb3VwcyBmcm9tIHRoZSBPUy8yIENvZGVQYWdlUmFuZ2UgYml0cyAqLwojZGVmaW5lIEZDX0xBTkdfTEFUSU5fMQkJCSJsYXRpbjEiCQkvKiAwICovCiNkZWZpbmUgRkNfTEFOR19MQVRJTl8yX0VBU1RFUk5fRVVST1BFCSJsYXRpbjJlYXN0ZXJuZXVyb3BlIgkvKiAxICovCiNkZWZpbmUgRkNfTEFOR19DWVJJTExJQwkJImN5cmlsbGljIgkJLyogMiAqLwojZGVmaW5lIEZDX0xBTkdfR1JFRUsJCQkiZ3JlZWsiCQkJLyogMyAqLwojZGVmaW5lIEZDX0xBTkdfVFVSS0lTSAkJCSJ0dXJraXNoIgkJLyogNCAqLwojZGVmaW5lIEZDX0xBTkdfSEVCUkVXCQkJImhlYnJldyIJCS8qIDUgKi8KI2RlZmluZSBGQ19MQU5HX0FSQUJJQwkJCSJhcmFiaWMiCQkvKiA2ICovCiNkZWZpbmUgRkNfTEFOR19XSU5ET1dTX0JBTFRJQwkJIndpbmRvd3NiYWx0aWMiCQkvKiA3ICovCiNkZWZpbmUgRkNfTEFOR19WSUVUTkFNRVNFCQkidmlldG5hbWVzZSIJCS8qIDggKi8KLyogOS0xNSByZXNlcnZlZCBmb3IgQWx0ZXJuYXRlIEFOU0kgKi8KI2RlZmluZSBGQ19MQU5HX1RIQUkJCQkidGhhaSIJCQkvKiAxNiAqLwojZGVmaW5lIEZDX0xBTkdfSkFQQU5FU0UJCSJqYXBhbmVzZSIJCS8qIDE3ICovCiNkZWZpbmUgRkNfTEFOR19TSU1QTElGSUVEX0NISU5FU0UJInNpbXBsaWZpZWRjaGluZXNlIgkvKiAxOCAqLwojZGVmaW5lIEZDX0xBTkdfS09SRUFOX1dBTlNVTkcJCSJrb3JlYW53YW5zdW5nIgkJLyogMTkgKi8KI2RlZmluZSBGQ19MQU5HX1RSQURJVElPTkFMX0NISU5FU0UJInRyYWRpdGlvbmFsY2hpbmVzZSIJLyogMjAgKi8KI2RlZmluZSBGQ19MQU5HX0tPUkVBTl9KT0hBQgkJImtvcmVhbmpvaGFiIgkJLyogMjEgKi8KLyogMjItMjggcmVzZXJ2ZWQgZm9yIEFsdGVybmF0ZSBBTlNJICYgT0VNICovCiNkZWZpbmUgRkNfTEFOR19NQUNJTlRPU0gJCSJtYWNpbnRvc2giCQkvKiAyOSAqLwojZGVmaW5lIEZDX0xBTkdfT0VNCQkJIm9lbSIJCQkvKiAzMCAqLwojZGVmaW5lIEZDX0xBTkdfU1lNQk9MCQkJInN5bWJvbCIJCS8qIDMxICovCi8qIDMyLTQ3IHJlc2VydmVkIGZvciBPRU0gKi8KI2RlZmluZSBGQ19MQU5HX0lCTV9HUkVFSwkJImlibWdyZWVrIgkJLyogNDggKi8KI2RlZmluZSBGQ19MQU5HX01TRE9TX1JVU1NJQU4JCSJtc2Rvc3J1c3NpYW4iCQkvKiA0OSAqLwojZGVmaW5lIEZDX0xBTkdfTVNET1NfTk9SRElDCQkibXNkb3Nub3JkaWMiCQkvKiA1MCAqLwojZGVmaW5lIEZDX0xBTkdfQVJBQklDXzg2NCAgICAJCSJhcmFiaWM4NjQiCQkvKiA1MSAqLwojZGVmaW5lIEZDX0xBTkdfTVNET1NfQ0FOQURJQU5fRlJFTkNICSJtc2Rvc2NhbmFkaWFuZnJlbmNoIgkvKiA1MiAqLwojZGVmaW5lIEZDX0xBTkdfSEVCUkVXXzg2MgkJImhlYnJldzg2MiIJCS8qIDUzICovCiNkZWZpbmUgRkNfTEFOR19NU0RPU19JQ0VMQU5ESUMJCSJtc2Rvc2ljZWxhbmRpYyIJLyogNTQgKi8KI2RlZmluZSBGQ19MQU5HX01TRE9TX1BPUlRVR1VFU0UJIm1zZG9zcG9ydHVndWVzZSIJLyogNTUgKi8KI2RlZmluZSBGQ19MQU5HX0lCTV9UVVJLSVNICQkiaWJtdHVya2lzaCIJCS8qIDU2ICovCiNkZWZpbmUgRkNfTEFOR19JQk1fQ1lSSUxMSUMJCSJpYm1jeXJpbGxpYyIJCS8qIDU3ICovCiNkZWZpbmUgRkNfTEFOR19MQVRJTl8yCQkJImxhdGluMiIJCS8qIDU4ICovCiNkZWZpbmUgRkNfTEFOR19NU0RPU19CQUxUSUMJCSJtc2Rvc2JhbHRpYyIJCS8qIDU5ICovCiNkZWZpbmUgRkNfTEFOR19HUkVFS180MzdfRwkJImdyZWVrNDM3ZyIJCS8qIDYwICovCiNkZWZpbmUgRkNfTEFOR19BUkFCSUNfQVNNT183MDgJCSJhcmFiaWNhc21vNzA4IgkJLyogNjEgKi8KI2RlZmluZSBGQ19MQU5HX1dFX0xBVElOXzEJCSJ3ZWxhdGluMSIJCS8qIDYyICovCiNkZWZpbmUgRkNfTEFOR19VUwkJCSJ1cyIJCQkvKiA2MyAqLwoKdHlwZWRlZiBlbnVtIF9GY1R5cGUgewogICAgRmNUeXBlVm9pZCwgCiAgICBGY1R5cGVJbnRlZ2VyLCAKICAgIEZjVHlwZURvdWJsZSwgCiAgICBGY1R5cGVTdHJpbmcsIAogICAgRmNUeXBlQm9vbCwKICAgIEZjVHlwZU1hdHJpeCwKICAgIEZjVHlwZUNoYXJTZXQKfSBGY1R5cGU7Cgp0eXBlZGVmIHN0cnVjdCBfRmNNYXRyaXggewogICAgZG91YmxlIHh4LCB4eSwgeXgsIHl5Owp9IEZjTWF0cml4OwoKI2RlZmluZSBGY01hdHJpeEluaXQobSkJKChtKS0+eHggPSAobSktPnl5ID0gMSwgXAoJCQkgKG0pLT54eSA9IChtKS0+eXggPSAwKQoKLyoKICogQSBkYXRhIHN0cnVjdHVyZSB0byByZXByZXNlbnQgdGhlIGF2YWlsYWJsZSBnbHlwaHMgaW4gYSBmb250LgogKiBUaGlzIGlzIHJlcHJlc2VudGVkIGFzIGEgc3BhcnNlIGJvb2xlYW4gYnRyZWUuCiAqLwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ2hhclNldCBGY0NoYXJTZXQ7Cgp0eXBlZGVmIHN0cnVjdCBfRmNPYmplY3RUeXBlIHsKICAgIGNvbnN0IGNoYXIJKm9iamVjdDsKICAgIEZjVHlwZQl0eXBlOwp9IEZjT2JqZWN0VHlwZTsKCnR5cGVkZWYgc3RydWN0IF9GY0NvbnN0YW50IHsKICAgIGNvbnN0IGNoYXIgICpuYW1lOwogICAgY29uc3QgY2hhcgkqb2JqZWN0OwogICAgaW50CQl2YWx1ZTsKfSBGY0NvbnN0YW50OwoKdHlwZWRlZiBlbnVtIF9GY1Jlc3VsdCB7CiAgICBGY1Jlc3VsdE1hdGNoLCBGY1Jlc3VsdE5vTWF0Y2gsIEZjUmVzdWx0VHlwZU1pc21hdGNoLCBGY1Jlc3VsdE5vSWQKfSBGY1Jlc3VsdDsKCnR5cGVkZWYgc3RydWN0IF9GY1ZhbHVlIHsKICAgIEZjVHlwZQl0eXBlOwogICAgdW5pb24gewoJY29uc3QgRmNDaGFyOAkqczsKCWludAkJaTsKCUZjQm9vbAkJYjsKCWRvdWJsZQkJZDsKCWNvbnN0IEZjTWF0cml4CSptOwoJY29uc3QgRmNDaGFyU2V0CSpjOwogICAgfSB1Owp9IEZjVmFsdWU7Cgp0eXBlZGVmIHN0cnVjdCBfRmNQYXR0ZXJuICAgRmNQYXR0ZXJuOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRm9udFNldCB7CiAgICBpbnQJCW5mb250OwogICAgaW50CQlzZm9udDsKICAgIEZjUGF0dGVybgkqKmZvbnRzOwp9IEZjRm9udFNldDsKCnR5cGVkZWYgc3RydWN0IF9GY09iamVjdFNldCB7CiAgICBpbnQJCW5vYmplY3Q7CiAgICBpbnQJCXNvYmplY3Q7CiAgICBjb25zdCBjaGFyCSoqb2JqZWN0czsKfSBGY09iamVjdFNldDsKICAgIAp0eXBlZGVmIGVudW0gX0ZjTWF0Y2hLaW5kIHsKICAgIEZjTWF0Y2hQYXR0ZXJuLCBGY01hdGNoRm9udCAKfSBGY01hdGNoS2luZDsKCnR5cGVkZWYgZW51bSBfRmNTZXROYW1lIHsKICAgIEZjU2V0U3lzdGVtID0gMCwKICAgIEZjU2V0QXBwbGljYXRpb24gPSAxCn0gRmNTZXROYW1lOwoKI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykgLyogZm9yIEMrKyBWMi4wICovCiNkZWZpbmUgX0ZDRlVOQ1BST1RPQkVHSU4gZXh0ZXJuICJDIiB7CS8qIGRvIG5vdCBsZWF2ZSBvcGVuIGFjcm9zcyBpbmNsdWRlcyAqLwojZGVmaW5lIF9GQ0ZVTkNQUk9UT0VORCB9CiNlbHNlCiNkZWZpbmUgX0ZDRlVOQ1BST1RPQkVHSU4KI2RlZmluZSBfRkNGVU5DUFJPVE9FTkQKI2VuZGlmCgp0eXBlZGVmIHN0cnVjdCBfRmNDb25maWcgICAgRmNDb25maWc7Cgp0eXBlZGVmIHN0cnVjdCBfRmNGaWxlQ2FjaGUgRmNGaWxlQ2FjaGU7Cgp0eXBlZGVmIHN0cnVjdCBfRmNCbGFua3MgICAgRmNCbGFua3M7CgpfRkNGVU5DUFJPVE9CRUdJTgoKLyogZmNibGFua3MuYyAqLwpGY0JsYW5rcyAqCkZjQmxhbmtzQ3JlYXRlICh2b2lkKTsKCnZvaWQKRmNCbGFua3NEZXN0cm95IChGY0JsYW5rcyAqYik7CgpGY0Jvb2wKRmNCbGFua3NBZGQgKEZjQmxhbmtzICpiLCBGY0NoYXIzMiB1Y3M0KTsKCkZjQm9vbApGY0JsYW5rc0lzTWVtYmVyIChGY0JsYW5rcyAqYiwgRmNDaGFyMzIgdWNzNCk7CgovKiBmY2NmZy5jICovCmNoYXIgKgpGY0NvbmZpZ0ZpbGVuYW1lIChjb25zdCBjaGFyICp1cmwpOwogICAgCkZjQ29uZmlnICoKRmNDb25maWdDcmVhdGUgKHZvaWQpOwoKdm9pZApGY0NvbmZpZ0Rlc3Ryb3kgKEZjQ29uZmlnICpjb25maWcpOwoKRmNCb29sCkZjQ29uZmlnU2V0Q3VycmVudCAoRmNDb25maWcgKmNvbmZpZyk7CgpGY0NvbmZpZyAqCkZjQ29uZmlnR2V0Q3VycmVudCAodm9pZCk7CgpGY0Jvb2wKRmNDb25maWdCdWlsZEZvbnRzIChGY0NvbmZpZyAqY29uZmlnKTsKCmNoYXIgKioKRmNDb25maWdHZXREaXJzIChGY0NvbmZpZyAgICpjb25maWcpOwoKY2hhciAqKgpGY0NvbmZpZ0dldENvbmZpZ0ZpbGVzIChGY0NvbmZpZyAgICAqY29uZmlnKTsKCmNoYXIgKgpGY0NvbmZpZ0dldENhY2hlIChGY0NvbmZpZyAgKmNvbmZpZyk7CgpGY0JsYW5rcyAqCkZjQ29uZmlnR2V0QmxhbmtzIChGY0NvbmZpZyAqY29uZmlnKTsKCkZjRm9udFNldCAqCkZjQ29uZmlnR2V0Rm9udHMgKEZjQ29uZmlnCSpjb25maWcsCgkJICBGY1NldE5hbWUJc2V0KTsKCkZjQm9vbApGY0NvbmZpZ0FwcEZvbnRBZGRGaWxlIChGY0NvbmZpZyAgICAqY29uZmlnLAoJCQljb25zdCBjaGFyICAqZmlsZSk7CgpGY0Jvb2wKRmNDb25maWdBcHBGb250QWRkRGlyIChGY0NvbmZpZwkgICAgKmNvbmZpZywKCQkgICAgICAgY29uc3QgY2hhciAgICpkaXIpOwoKdm9pZApGY0NvbmZpZ0FwcEZvbnRDbGVhciAoRmNDb25maWcJICAgICpjb25maWcpOwoKRmNCb29sCkZjQ29uZmlnU3Vic3RpdHV0ZSAoRmNDb25maWcJKmNvbmZpZywKCQkgICAgRmNQYXR0ZXJuCSpwLAoJCSAgICBGY01hdGNoS2luZAlraW5kKTsKCi8qIGZjY2hhcnNldC5jICovCkZjQ2hhclNldCAqCkZjQ2hhclNldENyZWF0ZSAodm9pZCk7Cgp2b2lkCkZjQ2hhclNldERlc3Ryb3kgKEZjQ2hhclNldCAqZmNzKTsKCkZjQm9vbApGY0NoYXJTZXRBZGRDaGFyIChGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCk7CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRDb3B5IChGY0NoYXJTZXQgKnNyYyk7CgpGY0Jvb2wKRmNDaGFyU2V0RXF1YWwgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKTsKCkZjQ2hhclNldCAqCkZjQ2hhclNldEludGVyc2VjdCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpOwoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0VW5pb24gKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKTsKCkZjQ2hhclNldCAqCkZjQ2hhclNldFN1YnRyYWN0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7CgpGY0Jvb2wKRmNDaGFyU2V0SGFzQ2hhciAoY29uc3QgRmNDaGFyU2V0ICpmY3MsIEZjQ2hhcjMyIHVjczQpOwoKRmNDaGFyMzIKRmNDaGFyU2V0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSk7CgpGY0NoYXIzMgpGY0NoYXJTZXRJbnRlcnNlY3RDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpOwoKRmNDaGFyMzIKRmNDaGFyU2V0U3VidHJhY3RDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpOwoKI2lmbmRlZiBGT05UQ09ORklHX05PX0ZSRUVUWVBFCiNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgpGVF9VSW50CkZjRnJlZVR5cGVDaGFySW5kZXggKEZUX0ZhY2UgZmFjZSwgRmNDaGFyMzIgdWNzNCk7CiNlbmRpZgoKLyogZmNkYmcuYyAqLwp2b2lkCkZjUGF0dGVyblByaW50IChGY1BhdHRlcm4gKnApOwoKLyogZmNkZWZhdWx0LmMgKi8Kdm9pZApGY0RlZmF1bHRTdWJzdGl0dXRlIChGY1BhdHRlcm4gKnBhdHRlcm4pOwoKLyogZmNkaXIuYyAqLwpGY0Jvb2wKRmNEaXJTY2FuIChGY0ZvbnRTZXQJKnNldCwKCSAgIEZjRmlsZUNhY2hlCSpjYWNoZSwKCSAgIEZjQmxhbmtzCSpibGFua3MsCgkgICBjb25zdCBjaGFyCSpkaXIsCgkgICBGY0Jvb2wJZm9yY2UpOwoKRmNCb29sCkZjRGlyU2F2ZSAoRmNGb250U2V0ICpzZXQsIGNvbnN0IGNoYXIgKmRpcik7CgovKiBmY2ZyZWV0eXBlLmMgKi8KRmNQYXR0ZXJuICoKRmNGcmVlVHlwZVF1ZXJ5IChjb25zdCBjaGFyICpmaWxlLCBpbnQgaWQsIEZjQmxhbmtzICpibGFua3MsIGludCAqY291bnQpOwoKLyogZmNmcy5jICovCgpGY0ZvbnRTZXQgKgpGY0ZvbnRTZXRDcmVhdGUgKHZvaWQpOwoKdm9pZApGY0ZvbnRTZXREZXN0cm95IChGY0ZvbnRTZXQgKnMpOwoKRmNCb29sCkZjRm9udFNldEFkZCAoRmNGb250U2V0ICpzLCBGY1BhdHRlcm4gKmZvbnQpOwoKLyogZmNpbml0LmMgKi8KRmNCb29sCkZjSW5pdEZvbnRzICh2b2lkKTsKCkZjQm9vbApGY0luaXRDb25maWcgKHZvaWQpOwoKRmNCb29sCkZjSW5pdCAodm9pZCk7CgovKiBmY2xpc3QuYyAqLwpGY09iamVjdFNldCAqCkZjT2JqZWN0U2V0Q3JlYXRlICh2b2lkKTsKCkZjQm9vbApGY09iamVjdFNldEFkZCAoRmNPYmplY3RTZXQgKm9zLCBjb25zdCBjaGFyICpvYmplY3QpOwoKdm9pZApGY09iamVjdFNldERlc3Ryb3kgKEZjT2JqZWN0U2V0ICpvcyk7CgpGY09iamVjdFNldCAqCkZjT2JqZWN0U2V0VmFCdWlsZCAoY29uc3QgY2hhciAqZmlyc3QsIHZhX2xpc3QgdmEpOwoKRmNPYmplY3RTZXQgKgpGY09iamVjdFNldEJ1aWxkIChjb25zdCBjaGFyICpmaXJzdCwgLi4uKTsKCkZjRm9udFNldCAqCkZjRm9udExpc3QgKEZjQ29uZmlnCSpjb25maWcsCgkgICAgRmNQYXR0ZXJuCSpwLAoJICAgIEZjT2JqZWN0U2V0ICpvcyk7CgovKiBmY21hdGNoLmMgKi8KRmNQYXR0ZXJuICoKRmNGb250TWF0Y2ggKEZjQ29uZmlnCSpjb25maWcsCgkgICAgIEZjUGF0dGVybgkqcCwgCgkgICAgIEZjUmVzdWx0CSpyZXN1bHQpOwoKLyogZmNtYXRyaXguYyAqLwpGY01hdHJpeCAqCkZjTWF0cml4Q29weSAoY29uc3QgRmNNYXRyaXggKm1hdCk7CgpGY0Jvb2wKRmNNYXRyaXhFcXVhbCAoY29uc3QgRmNNYXRyaXggKm1hdDEsIGNvbnN0IEZjTWF0cml4ICptYXQyKTsKCnZvaWQKRmNNYXRyaXhNdWx0aXBseSAoRmNNYXRyaXggKnJlc3VsdCwgY29uc3QgRmNNYXRyaXggKmEsIGNvbnN0IEZjTWF0cml4ICpiKTsKCnZvaWQKRmNNYXRyaXhSb3RhdGUgKEZjTWF0cml4ICptLCBkb3VibGUgYywgZG91YmxlIHMpOwoKdm9pZApGY01hdHJpeFNjYWxlIChGY01hdHJpeCAqbSwgZG91YmxlIHN4LCBkb3VibGUgc3kpOwoKdm9pZApGY01hdHJpeFNoZWFyIChGY01hdHJpeCAqbSwgZG91YmxlIHNoLCBkb3VibGUgc3YpOwoKLyogZmNuYW1lLmMgKi8KCkZjQm9vbApGY05hbWVSZWdpc3Rlck9iamVjdFR5cGVzIChjb25zdCBGY09iamVjdFR5cGUgKnR5cGVzLCBpbnQgbnR5cGUpOwoKRmNCb29sCkZjTmFtZVVucmVnaXN0ZXJPYmplY3RUeXBlcyAoY29uc3QgRmNPYmplY3RUeXBlICp0eXBlcywgaW50IG50eXBlKTsKICAgIApjb25zdCBGY09iamVjdFR5cGUgKgpGY05hbWVHZXRPYmplY3RUeXBlIChjb25zdCBjaGFyICpvYmplY3QpOwoKRmNCb29sCkZjTmFtZVJlZ2lzdGVyQ29uc3RhbnRzIChjb25zdCBGY0NvbnN0YW50ICpjb25zdHMsIGludCBuY29uc3RzKTsKCkZjQm9vbApGY05hbWVVbnJlZ2lzdGVyQ29uc3RhbnRzIChjb25zdCBGY0NvbnN0YW50ICpjb25zdHMsIGludCBuY29uc3RzKTsKICAgIApjb25zdCBGY0NvbnN0YW50ICoKRmNOYW1lR2V0Q29uc3RhbnQgKGNoYXIgKnN0cmluZyk7CgpGY0Jvb2wKRmNOYW1lQ29uc3RhbnQgKGNoYXIgKnN0cmluZywgaW50ICpyZXN1bHQpOwoKRmNQYXR0ZXJuICoKRmNOYW1lUGFyc2UgKGNvbnN0IGNoYXIgKm5hbWUpOwoKRmNDaGFyOCAqCkZjTmFtZVVucGFyc2UgKEZjUGF0dGVybiAqcGF0KTsKCi8qIGZjcGF0LmMgKi8KRmNQYXR0ZXJuICoKRmNQYXR0ZXJuQ3JlYXRlICh2b2lkKTsKCkZjUGF0dGVybiAqCkZjUGF0dGVybkR1cGxpY2F0ZSAoRmNQYXR0ZXJuICpwKTsKCnZvaWQKRmNWYWx1ZURlc3Ryb3kgKEZjVmFsdWUgdik7CgpGY1ZhbHVlCkZjVmFsdWVTYXZlIChGY1ZhbHVlIHYpOwoKdm9pZApGY1BhdHRlcm5EZXN0cm95IChGY1BhdHRlcm4gKnApOwoKRmNCb29sCkZjUGF0dGVybkFkZCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjVmFsdWUgdmFsdWUsIEZjQm9vbCBhcHBlbmQpOwogICAgCkZjUmVzdWx0CkZjUGF0dGVybkdldCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpZCwgRmNWYWx1ZSAqdik7CiAgICAKRmNCb29sCkZjUGF0dGVybkRlbCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QpOwoKRmNCb29sCkZjUGF0dGVybkFkZEludGVnZXIgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgaSk7CgpGY0Jvb2wKRmNQYXR0ZXJuQWRkRG91YmxlIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgZG91YmxlIGQpOwoKRmNCb29sCkZjUGF0dGVybkFkZFN0cmluZyAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGNvbnN0IGNoYXIgKnMpOwoKRmNCb29sCkZjUGF0dGVybkFkZE1hdHJpeCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGNvbnN0IEZjTWF0cml4ICpzKTsKCkZjQm9vbApGY1BhdHRlcm5BZGRDaGFyU2V0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgY29uc3QgRmNDaGFyU2V0ICpjKTsKCkZjQm9vbApGY1BhdHRlcm5BZGRCb29sIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgRmNCb29sIGIpOwoKRmNSZXN1bHQKRmNQYXR0ZXJuR2V0SW50ZWdlciAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBpbnQgKmkpOwoKRmNSZXN1bHQKRmNQYXR0ZXJuR2V0RG91YmxlIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIGRvdWJsZSAqZCk7CgpGY1Jlc3VsdApGY1BhdHRlcm5HZXRTdHJpbmcgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgY2hhciAqKmNvbnN0IHMpOwoKRmNSZXN1bHQKRmNQYXR0ZXJuR2V0TWF0cml4IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjTWF0cml4ICoqcyk7CgpGY1Jlc3VsdApGY1BhdHRlcm5HZXRDaGFyU2V0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjQ2hhclNldCAqKmMpOwoKRmNSZXN1bHQKRmNQYXR0ZXJuR2V0Qm9vbCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBGY0Jvb2wgKmIpOwoKRmNQYXR0ZXJuICoKRmNQYXR0ZXJuVmFCdWlsZCAoRmNQYXR0ZXJuICpvcmlnLCB2YV9saXN0IHZhKTsKICAgIApGY1BhdHRlcm4gKgpGY1BhdHRlcm5CdWlsZCAoRmNQYXR0ZXJuICpvcmlnLCAuLi4pOwoKLyogZmNzdHIuYyAqLwoKY2hhciAqCkZjU3RyQ29weSAoY29uc3QgY2hhciAqcyk7CgojZGVmaW5lIEZjVG9Mb3dlcihjKQkoKCdBJyA8PSAoYykgJiYgKGMpIDw9ICdaJykgPyAoYykgLSAnQScgKyAnYScgOiAoYykpCgppbnQKRmNTdHJDbXBJZ25vcmVDYXNlIChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOwoKaW50CkZjVXRmOFRvVWNzNCAoRmNDaGFyOCAgICpzcmNfb3JpZywKCSAgICAgIEZjQ2hhcjMyICAqZHN0LAoJICAgICAgaW50CWxlbik7CgpGY0Jvb2wKRmNVdGY4TGVuIChGY0NoYXI4CSpzdHJpbmcsCgkgICBpbnQJCWxlbiwKCSAgIGludAkJKm5jaGFyLAoJICAgaW50CQkqd2NoYXIpOwoKLyogZmN4bWwuYyAqLwpGY0Jvb2wKRmNDb25maWdQYXJzZUFuZExvYWQgKEZjQ29uZmlnICpjb25maWcsIGNvbnN0IGNoYXIgKmZpbGUsIEZjQm9vbCBjb21wbGFpbik7CgpfRkNGVU5DUFJPVE9FTkQKCiNlbmRpZiAvKiBfRk9OVENPTkZJR19IXyAqLwo=