From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Cecilio Pardo Newsgroups: gmane.emacs.bugs Subject: bug#73730: 31.0.50; Support for color fonts on MS-Windows Date: Wed, 16 Oct 2024 23:35:34 +0200 Message-ID: <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------CMM8u6zkSLlV8TvGrxxH8USa" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="26733"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mozilla Thunderbird Cc: 73730@debbugs.gnu.org To: Eli Zaretskii , Ken Brown Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Wed Oct 16 23:37:38 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1t1Bi5-0006oe-IE for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 16 Oct 2024 23:37:38 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1t1BhH-0008IX-De; Wed, 16 Oct 2024 17:36:47 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t1BhD-0008Dz-SG for bug-gnu-emacs@gnu.org; Wed, 16 Oct 2024 17:36:43 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1t1BhC-0002kH-CM for bug-gnu-emacs@gnu.org; Wed, 16 Oct 2024 17:36:42 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=In-Reply-To:From:References:MIME-Version:Date:To:Subject; bh=37ats5nTrLhFNG2P/bXnYzydIkISUjC+OgvwWRctQNQ=; b=QOBz8PyFdRyTD8swtixJ+KIRcq8sQMMBzXWPyalpTR0InyvyQ9I2/lO1NjEMSTucOq+SNN9G8Jbuu9MawYJYrv3VR358UUcrZpqSDl9GIxm3nRAe82juEU9UgsIVTGNjaSibbW0ZjTKJcbeWbWjzPS9l09GN9R1r0a9DBtEXRzunbqWwZ6RY/kAQKelYgAt8vkQCUnGcB+WhriLy3G/dnAkF9lF3m/HocH5XIFNcv2bXYCF0zdkc8fLV9Cv0sDqepmXQMOAqXNfZsxTr+DLuMwDgWDHFCFPBWNuQK0Vh8GyWL/08t61MsWzn5BAuCa6uyaPwe/wemxn1PSfCC6Xo1Q==; Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1t1BhV-0006hy-Ug for bug-gnu-emacs@gnu.org; Wed, 16 Oct 2024 17:37:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Cecilio Pardo Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 16 Oct 2024 21:37:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 73730 X-GNU-PR-Package: emacs Original-Received: via spool by 73730-submit@debbugs.gnu.org id=B73730.172911457025673 (code B ref 73730); Wed, 16 Oct 2024 21:37:01 +0000 Original-Received: (at 73730) by debbugs.gnu.org; 16 Oct 2024 21:36:10 +0000 Original-Received: from localhost ([127.0.0.1]:60703 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t1Bgd-0006fz-LV for submit@debbugs.gnu.org; Wed, 16 Oct 2024 17:36:09 -0400 Original-Received: from mail.imayhem.com ([82.223.54.191]:48253 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t1BgZ-0006fQ-CZ for 73730@debbugs.gnu.org; Wed, 16 Oct 2024 17:36:05 -0400 Original-Received: from [192.168.68.105] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 220D68010A; Wed, 16 Oct 2024 21:35:36 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.105] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Content-Language: es-ES In-Reply-To: <861q0gqpkf.fsf@gnu.org> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:293691 Archived-At: This is a multi-part message in MIME format. --------------CMM8u6zkSLlV8TvGrxxH8USa Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Still not done with this, but I am sending a new patch to fix the bug with w32-find-non-USB-fonts. It calls text_extents with a font of size 0. Checking for that seems to solve the problem. Also, most of the style changes are done. - With MingGW64, use dwrite_3.h normally. - renamed w32-inhibit-direct-write to w32-inhibit-dwrite, and some other things. BTW, why does that variable show as undocumented with describe-variables? What am I doing wrong? Pending: - NEWS entry. - Instead of aborting on failure, just disable DirectWrite and let emacs continue. This will take some work. - mingw warnings. > >> + glyph_run.bidiLevel = 0; > ^^^^^^^^^^^^^ > Is this because otherwise DirectWrite will possibly reorder the > glyphs or something? Did you test this with R2L text, e.g. by > displaying TUTORIAL.he? I did try, and it looks OK, but are there any > color fonts that cover the Hebrew block, so I could be sure everything > works in that case? > > More generally, what color fonts can be used with this build on > Windows for characters other than Emoji, in addition to Segoe UI > Emoji? The documentation describes this field as the "implicit resolved level of the glyph run". Odd levels indicate RTL, and the function asks for the right side position as origin, so I think they would be reordered. As there is no reference to bidi in w32font.c, I assumed glyphs reach this layer prepared to be rendered ltr. I think the only color font that Windows has is the emoji one. I'll try to find some other to test this. >> +void *w32_font_get_dwrite_cache (struct font *font, float *font_size); >> +void w32_font_set_dwrite_cache (struct font *font, void *cache, float font_size); > > Why aren't these functions defined in w32dwrite.c? They need to know about the uniscribe_font struct, which is defined there. --------------CMM8u6zkSLlV8TvGrxxH8USa Content-Type: text/plain; charset=UTF-8; name="0001-Implement-drawing-text-with-DirectWrite-on-MS-Window.patch" Content-Disposition: attachment; filename*0="0001-Implement-drawing-text-with-DirectWrite-on-MS-Window.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBmNTk1YmVkM2U5ODRiNjU3NGU1OTQ2N2IyY2Q4M2VmZTM1MWZiYzVjIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDZWNpbGlvIFBhcmRvIDxjcGFyZG9AaW1heWhlbS5j b20+CkRhdGU6IFdlZCwgOSBPY3QgMjAyNCAxMTo0MDoyOCArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIEltcGxlbWVudCBkcmF3aW5nIHRleHQgd2l0aCBEaXJlY3RXcml0ZSBvbiBNUy1XaW5k b3dzLgoKVGhpcyBhZGRzIHN1cHBvcnQgZm9yIGNvbG9yIGZvbnRzLgoKKiBjb25maWd1cmUu YWM6IEFkZCBzcmMvdzMyZHJpdGUgdG8gVzMyX09CSi4KKiBzcmMvdzMyZHdyaXRlLmM6IFRo aXMgaXMgYSBuZXcgZmlsZS4KKHczMi1pbml0aWFsaXplLWRpcmVjdC13cml0ZSk6IE5ldyBm dW5jdGlvbiwgaW5pdGlhbGl6ZSB0aGUgRGlyZWN0V3JpdGUKbGlicmFyeSBpZiBpdCBpcyBh dmFpbGFibGUsIGFuZCByZXF1aXJlZCBnbG9iYWwgdmFyaWFibGVzLgoodzMyX3VzZV9kaXJl Y3Rfd3JpdGUpOiBOZXcgZnVuY3Rpb24sIGNoZWNrIGlmIERpcmVjdFdyaXRlIGlzIGF2YWls YWJsZQphbmQgYWN0aXZhdGVkIGJ5IHRoZSB1c2VyLgoodzMyX2R3cml0ZV9lbmNvZGVfY2hh cik6IE5ldyBmdW5jdGlvbiwgcmVwbGFjZW1lbnQgZm9yIGhhcmZidXp6J3MKZW5jb2RlX2No YXIuCih3MzJfZHdyaXRlX3RleHRfZXh0ZW50cyk6IE5ldyBmdW5jdGlvbiwgcmVwbGFjZW1l bnQgZm9yIHczMmZvbnQKdGV4dF9leHRlbnRzLgoodzMyX2R3cml0ZV9kcmF3KTogTmV3IGZ1 bmN0aW9uLCByZXBsYWNlbWVudCBmb3IgdzMyZm9udCBkcmF3LgoodzMyX2R3cml0ZV9mcmVl X2NhY2hlZF9mYWNlKTogTmV3IGZ1bmN0aW9uLCB1c2VkIG9uIHRoZSBmb250IGRlbGV0aW9u CnByb2Nlc3MgdG8gYWxzbyBkZWxldGUgRGlyZWN0V3JpdGUgZGF0YS4KKHZlcmlmeV9ocik6 IE5ldyBmdW5jdGlvbiwgdmVyaWZ5IENPTSBtZXRob2QgcmVzdWx0cy4KKiBzcmMvdzMyZm9u dC5jICh3MzJmb250X3RleHRfZXh0ZW50cyk6IElmIERpcmVjdFdyaXRlIGlzIGVuYWJsZWQs IGNhbGwKdzMyX2R3cml0ZV90ZXh0X2V4dGVudHMuCih3MzJmb250X2RyYXcpOiBJZiBEaXJl Y3RXcml0ZSBpcyBlbmFibGVkLCBjYWxsIHczMl9kd3JpdGVfZHJhdy4KKiBzcmMvdzMydW5p c2NyaWJlLmM6ICh3MzJoYl9lbmNvZGVfY2hhcik6IElmIERpcmVjdFdyaXRlIGlzIGVuYWJs ZWQsCmNhbGwgdzMyX2R3cml0ZV9lbmNvZGVfY2hhci4KKHN5bXNfb2ZfdzMydW5pc2NyaWJl X2Zvcl9wZHVtcGVyKTogSW5pdGlhbGl6ZSBEaXJlY3RXcml0ZS4KKHVuaXNjcmliZV9jbG9z ZSk6IEZyZWUgRGlyZWN0V3JpdGUgZGF0YSBmb3IgdGhlIGZvbnQuCi0tLQogY29uZmlndXJl LmFjICAgICAgIHwgICAyICstCiBzcmMvdzMyZHdyaXRlLmMgICAgfCA5MjggKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBzcmMvdzMyZm9udC5jICAg ICAgfCAgNTMgKystCiBzcmMvdzMyZm9udC5oICAgICAgfCAgMTMgKwogc3JjL3czMnVuaXNj cmliZS5jIHwgIDMwICsrCiA1IGZpbGVzIGNoYW5nZWQsIDEwMTIgaW5zZXJ0aW9ucygrKSwg MTQgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3czMmR3cml0ZS5jCgpk aWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCmluZGV4IDhhNWJhN2Ri M2QxLi5iYTljZDhmMGNkNSAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZp Z3VyZS5hYwpAQCAtMzE3Miw3ICszMTcyLDcgQEAgQUNfREVGVU4KICAgQUNfQ0hFQ0tfVE9P TChbV0lORFJFU10sIFt3aW5kcmVzXSwKICAgICAgICAgICAgICAgICBbQUNfTVNHX0VSUk9S KFtObyByZXNvdXJjZSBjb21waWxlciBmb3VuZC5dKV0pCiAgIFczMl9PQko9InczMmZucy5v IHczMm1lbnUubyB3MzJyZWcubyB3MzJmb250Lm8gdzMydGVybS5vIgotICBXMzJfT0JKPSIk VzMyX09CSiB3MzJ4Zm5zLm8gdzMyc2VsZWN0Lm8gdzMydW5pc2NyaWJlLm8gdzMyY3lnd2lu eC5vIgorICBXMzJfT0JKPSIkVzMyX09CSiB3MzJ4Zm5zLm8gdzMyc2VsZWN0Lm8gdzMydW5p c2NyaWJlLm8gdzMyZHdyaXRlLm8gdzMyY3lnd2lueC5vIgogICBFTUFDU1JFUz0iZW1hY3Mu cmVzIgogICBjYXNlICIkY2Fub25pY2FsIiBpbgogICAgIHg4Nl82NC0qLSopIEVNQUNTX01B TklGRVNUPSJlbWFjcy14NjQubWFuaWZlc3QiIDs7CmRpZmYgLS1naXQgYS9zcmMvdzMyZHdy aXRlLmMgYi9zcmMvdzMyZHdyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAuLjFmODEwMmRlNzY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3czMmR3cml0 ZS5jCkBAIC0wLDAgKzEsOTI4IEBACisvKiBTdXBwb3J0IGZvciB1c2luZyBEaXJlY3RXcml0 ZSBvbiBNUy1XaW5kb3dzIHRvIGRyYXcgdGV4dC4gIFRoaXMKKyAgIGFsbG93cyBmb3IgY29s b3IgZm9udHMuCisgICBDb3B5cmlnaHQgKEMpIDIwMjQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFjcy4KKworR05VIEVt YWNzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt b2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBl aXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKK3lvdXIgb3B0aW9uKSBh bnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIEVtYWNzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UK K2Fsb25nIHdpdGggR05VIEVtYWNzLiAgSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5v cmcvbGljZW5zZXMvPi4gICovCisKKy8qCisgIFRoaXMgcmVxdWlyZXMgdGhlIEhhcmZCdXp6 IGZvbnQgYmFja2VuZCB0byBiZSBhdmFpbGFibGUuCisKKyAgSXQgd29ya3MgYnkgbW9kaWZ5 aW5nIHRoZSBIYXJmQnV6eiBiYWNrZW5kIHRvIHVzZSBEaXJlY3RXcml0ZSBhdAorICBzb21l IHBvaW50cywgaWYgaXQgaXMgYXZhaWxhYmxlOgorCisgIC0gV2hlbiBlbmNvZGluZyBjaGFy YWN0ZXJzOiB3MzJoYl9lbmNvZGVfY2hhcgorICAtIFdoZW4gbWVhc3VyaW5nIHRleHQ6IHcz MmZvbnRfdGV4dF9leHRlbnRzCisgIC0gV2hlbiBkcmF3aW5nIHRleHQ6IHczMmZvbnRfZHJh dworCisgIERpcmVjdFdyaXRlIGlzIHNldHVwIGJ5IGNhbGxpbmcgdzMyX2luaXRpYWxpemVf ZGlyZWN0X3dyaXRlLiAgRnJvbQorICB0aGF0IHBvaW50LCB0aGUgZnVuY3Rpb24gdzMyX3Vz ZV9kaXJlY3Rfd3JpdGUgd2lsbCByZXR1cm4gdHJ1ZSBpZgorICBEaXJlY3RXcml0ZSBpcyB0 byBiZSB1c2VkLgorCisgIERpcmVjdFdyaXRlIGlzIGF2YWlsYWJsZSBzaW5jZSBXaW5kb3dz IDcsIGJ1dCB3ZSBkb24ndCBhY3RpdmF0ZSBpdCBvbgorICB2ZXJzaW9ucyBiZWZvcmUgOC4x LCBiZWNhdXNlIGNvbG9yIGZvbnRzIGFyZSBvbmx5IGF2YWlsYWJsZSBzaW5jZSB0aGF0LiAg Ki8KKworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1 ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgPGluaXRndWlkLmg+CisjaW5jbHVkZSA8b2xl Mi5oPgorI2luY2x1ZGUgPHVua253bi5oPgorCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNs dWRlICJ3MzJmb250LmgiCisjaW5jbHVkZSAidzMyY29tbW9uLmgiCisjaW5jbHVkZSAidzMy dGVybS5oIgorCisjaWZuZGVmIE1JTkdXX1c2NAorCisvKiBUaGUgZm9sbG93aW5nIGRlZmlu aXRpb25zIHdvdWxkIGJlIGluY2x1ZGVkIGZyb20gZHdyaXRlXzMuaCwgYnV0IGl0CisgICBp cyBub3QgYXZhaWxhYmxlIHdoZW4gYnVpbGRpbmcgd2l0aCBtaW5ndy5vcmcncyBNaW5HVy4g IE1ldGhvZHMgdGhhdAorICAgd2UgZG9uJ3QgdXNlIGFyZSBkZWNsYXJlZCB3aXRoIHRoZSBF TUFDU19EV1JJVEVfVU5VU0VEIG1hY3JvLCB0bworICAgYXZvaWQgYnJpbmdpbmcgaW4gbW9y ZSB0eXBlcyB0aGF0IHdvdWxkIG5lZWQgdG8gYmUgZGVjbGFyZWQuCisqLworCisjZGVmaW5l IEVNQUNTX0RXUklURV9VTlVTRUQobmFtZSkgdm9pZCAoU1RETUVUSE9EQ0FMTFRZUEUgKm5h bWUpKHZvaWQpCisKKyNkZWZpbmUgRFdSSVRFX0VfTk9DT0xPUiBfSFJFU1VMVF9UWVBFREVG XygweDg4OTg1MDBDTCkKKwordHlwZWRlZiBlbnVtIERXUklURV9QSVhFTF9HRU9NRVRSWSB7 CisgICAgRFdSSVRFX1BJWEVMX0dFT01FVFJZX0ZMQVQgPSAwLAorICAgIERXUklURV9QSVhF TF9HRU9NRVRSWV9SR0IgPSAxLAorICAgIERXUklURV9QSVhFTF9HRU9NRVRSWV9CR1IgPSAy Cit9IERXUklURV9QSVhFTF9HRU9NRVRSWTsKKwordHlwZWRlZiBlbnVtIERXUklURV9SRU5E RVJJTkdfTU9ERSB7CisgICAgRFdSSVRFX1JFTkRFUklOR19NT0RFX0RFRkFVTFQgPSAwLAor ICAgIERXUklURV9SRU5ERVJJTkdfTU9ERV9BTElBU0VEID0gMSwKKyAgICBEV1JJVEVfUkVO REVSSU5HX01PREVfR0RJX0NMQVNTSUMgPSAyLAorICAgIERXUklURV9SRU5ERVJJTkdfTU9E RV9HRElfTkFUVVJBTCA9IDMsCisgICAgRFdSSVRFX1JFTkRFUklOR19NT0RFX05BVFVSQUwg PSA0LAorICAgIERXUklURV9SRU5ERVJJTkdfTU9ERV9OQVRVUkFMX1NZTU1FVFJJQyA9IDUs CisgICAgRFdSSVRFX1JFTkRFUklOR19NT0RFX09VVExJTkUgPSA2Cit9IERXUklURV9SRU5E RVJJTkdfTU9ERTsKKwordHlwZWRlZiBlbnVtIERXUklURV9NRUFTVVJJTkdfTU9ERSB7Cisg ICAgRFdSSVRFX01FQVNVUklOR19NT0RFX05BVFVSQUwgPSAwLAorICAgIERXUklURV9NRUFT VVJJTkdfTU9ERV9HRElfQ0xBU1NJQyA9IDEsCisgICAgRFdSSVRFX01FQVNVUklOR19NT0RF X0dESV9OQVRVUkFMID0gMgorfSBEV1JJVEVfTUVBU1VSSU5HX01PREU7CisKK3R5cGVkZWYg ZW51bSBEV1JJVEVfVEVYVF9BTlRJQUxJQVNfTU9ERSB7CisgICAgRFdSSVRFX1RFWFRfQU5U SUFMSUFTX01PREVfQ0xFQVJUWVBFID0gMCwKKyAgICBEV1JJVEVfVEVYVF9BTlRJQUxJQVNf TU9ERV9HUkFZU0NBTEUgPSAxCit9IERXUklURV9URVhUX0FOVElBTElBU19NT0RFOworCit0 eXBlZGVmIGVudW0gRFdSSVRFX0ZBQ1RPUllfVFlQRSB7CisgICAgRFdSSVRFX0ZBQ1RPUllf VFlQRV9TSEFSRUQgPSAwLAorICAgIERXUklURV9GQUNUT1JZX1RZUEVfSVNPTEFURUQgPSAx Cit9IERXUklURV9GQUNUT1JZX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IERXUklURV9GT05U X01FVFJJQ1MgeworICAgIFVJTlQxNiBkZXNpZ25Vbml0c1BlckVtOworICAgIFVJTlQxNiBh c2NlbnQ7CisgICAgVUlOVDE2IGRlc2NlbnQ7CisgICAgSU5UMTYgbGluZUdhcDsKKyAgICBV SU5UMTYgY2FwSGVpZ2h0OworICAgIFVJTlQxNiB4SGVpZ2h0OworICAgIElOVDE2IHVuZGVy bGluZVBvc2l0aW9uOworICAgIFVJTlQxNiB1bmRlcmxpbmVUaGlja25lc3M7CisgICAgSU5U MTYgc3RyaWtldGhyb3VnaFBvc2l0aW9uOworICAgIFVJTlQxNiBzdHJpa2V0aHJvdWdoVGhp Y2tuZXNzOworfSBEV1JJVEVfRk9OVF9NRVRSSUNTOworCit0eXBlZGVmIHN0cnVjdCBEV1JJ VEVfR0xZUEhfTUVUUklDUyB7CisgICAgSU5UMzIgbGVmdFNpZGVCZWFyaW5nOworICAgIFVJ TlQzMiBhZHZhbmNlV2lkdGg7CisgICAgSU5UMzIgcmlnaHRTaWRlQmVhcmluZzsKKyAgICBJ TlQzMiB0b3BTaWRlQmVhcmluZzsKKyAgICBVSU5UMzIgYWR2YW5jZUhlaWdodDsKKyAgICBJ TlQzMiBib3R0b21TaWRlQmVhcmluZzsKKyAgICBJTlQzMiB2ZXJ0aWNhbE9yaWdpblk7Cit9 IERXUklURV9HTFlQSF9NRVRSSUNTOworCit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRlUmVu ZGVyaW5nUGFyYW1zIElEV3JpdGVSZW5kZXJpbmdQYXJhbXM7Cit0eXBlZGVmIGludGVyZmFj ZSBJRFdyaXRlRm9udCBJRFdyaXRlRm9udDsKK3R5cGVkZWYgaW50ZXJmYWNlIElEV3JpdGVH ZGlJbnRlcm9wIElEV3JpdGVHZGlJbnRlcm9wOwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0 ZUZhY3RvcnkgSURXcml0ZUZhY3Rvcnk7Cit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRlRmFj dG9yeTIgSURXcml0ZUZhY3RvcnkyOwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0ZUZvbnRG YWNlIElEV3JpdGVGb250RmFjZTsKK3R5cGVkZWYgaW50ZXJmYWNlIElEV3JpdGVCaXRtYXBS ZW5kZXJUYXJnZXQgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDsKK3R5cGVkZWYgaW50ZXJm YWNlIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJn ZXQxOwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9y IElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvcjsKKworREVGSU5FX0dVSUQoSUlEX0lE V3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxLCAweDc5MWU4Mjk4LCAweDNlZjMsIDB4NDIzMCwg MHg5OCwweDgwLCAweGM5LDB4YmQsMHhlYywweGM0LDB4MjAsMHg2NCk7CitERUZJTkVfR1VJ RChJSURfSURXcml0ZUZhY3RvcnkyLCAweDA0MzlmYzYwLCAweGNhNDQsIDB4NDk5NCwgMHg4 ZCwweGVlLCAweDNhLDB4OWEsMHhmNywweGI3LDB4MzIsMHhlYyk7CitERUZJTkVfR1VJRChJ SURfSURXcml0ZUZhY3RvcnksIDB4Yjg1OWVlNWEsIDB4ZDgzOCwgMHg0YjViLCAweGEyLDB4 ZTgsIDB4MWEsMHhkYywweDdkLDB4OTMsMHhkYiwweDQ4KTsKKwordHlwZWRlZiBzdHJ1Y3Qg RFdSSVRFX0dMWVBIX09GRlNFVCB7CisgICAgRkxPQVQgYWR2YW5jZU9mZnNldDsKKyAgICBG TE9BVCBhc2NlbmRlck9mZnNldDsKK30gRFdSSVRFX0dMWVBIX09GRlNFVDsKKwordHlwZWRl ZiBzdHJ1Y3QgRFdSSVRFX0dMWVBIX1JVTiB7CisgICAgSURXcml0ZUZvbnRGYWNlICpmb250 RmFjZTsKKyAgICBGTE9BVCBmb250RW1TaXplOworICAgIFVJTlQzMiBnbHlwaENvdW50Owor ICAgIGNvbnN0IFVJTlQxNiAqZ2x5cGhJbmRpY2VzOworICAgIGNvbnN0IEZMT0FUICpnbHlw aEFkdmFuY2VzOworICAgIGNvbnN0IERXUklURV9HTFlQSF9PRkZTRVQgKmdseXBoT2Zmc2V0 czsKKyAgICBXSU5CT09MIGlzU2lkZXdheXM7CisgICAgVUlOVDMyIGJpZGlMZXZlbDsKK30g IERXUklURV9HTFlQSF9SVU47CisKK3R5cGVkZWYgc3RydWN0IF9EM0RDT0xPUlZBTFVFIHsK KyAgZmxvYXQgcjsKKyAgZmxvYXQgZzsKKyAgZmxvYXQgYjsKKyAgZmxvYXQgYTsKK30gRDNE Q09MT1JWQUxVRTsKKwordHlwZWRlZiBEM0RDT0xPUlZBTFVFIERXUklURV9DT0xPUl9GOwor Cit0eXBlZGVmIHN0cnVjdCBEV1JJVEVfQ09MT1JfR0xZUEhfUlVOIHsKKyAgICBEV1JJVEVf R0xZUEhfUlVOIGdseXBoUnVuOworICAgIHZvaWQgKmdseXBoUnVuRGVzY3JpcHRpb247Cisg ICAgRkxPQVQgYmFzZWxpbmVPcmlnaW5YOworICAgIEZMT0FUIGJhc2VsaW5lT3JpZ2luWTsK KyAgICBEV1JJVEVfQ09MT1JfRiBydW5Db2xvcjsKKyAgICBVSU5UMTYgcGFsZXR0ZUluZGV4 OworfSBEV1JJVEVfQ09MT1JfR0xZUEhfUlVOOworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRl Rm9udEZhY2VWdGJsIHsKKyAgQkVHSU5fSU5URVJGQUNFCisKKyAgSFJFU1VMVCAoU1RETUVU SE9EQ0FMTFRZUEUgKlF1ZXJ5SW50ZXJmYWNlKQorICAgIChJRFdyaXRlRm9udEZhY2UgKlRo aXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNURE1FVEhP RENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVGb250RmFjZSAqVGhpcyk7CisgIFVMT05HIChT VERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZUZvbnRGYWNlICpUaGlzKTsKKwor ICBFTUFDU19EV1JJVEVfVU5VU0VEKEdldFR5cGUpOworICBFTUFDU19EV1JJVEVfVU5VU0VE KEdldEZpbGVzKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRChHZXRJbmRleCk7CisgIEVNQUNT X0RXUklURV9VTlVTRUQoR2V0U2ltdWxhdGlvbnMpOworICBFTUFDU19EV1JJVEVfVU5VU0VE KElzU3ltYm9sRm9udCk7CisKKyAgdm9pZCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldE1ldHJp Y3MpCisgICAgKElEV3JpdGVGb250RmFjZSAqVGhpcywgRFdSSVRFX0ZPTlRfTUVUUklDUyAq bWV0cmljcyk7CisKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0R2x5cGhDb3VudCk7Cisg IEVNQUNTX0RXUklURV9VTlVTRUQgKEdldERlc2lnbkdseXBoTWV0cmljcyk7CisKKyAgSFJF U1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldEdseXBoSW5kaWNlcykKKyAgICAoSURXcml0 ZUZvbnRGYWNlICpUaGlzLCBjb25zdCBVSU5UMzIgKmNvZGVwb2ludHMsIFVJTlQzMiBjb3Vu dCwKKyAgICAgVUlOVDE2ICpnbHlwaF9pbmRpY2VzKTsKKworICBFTUFDU19EV1JJVEVfVU5V U0VEIChUcnlHZXRGb250VGFibGUpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChSZWxlYXNl Rm9udFRhYmxlKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0R2x5cGhSdW5PdXRsaW5l KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0UmVjb21tZW5kZWRSZW5kZXJpbmdNb2Rl KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0R2RpQ29tcGF0aWJsZU1ldHJpY3MpOwor CisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpHZXRHZGlDb21wYXRpYmxlR2x5cGhN ZXRyaWNzKQorICAgIChJRFdyaXRlRm9udEZhY2UgKlRoaXMsCisgICAgIEZMT0FUIGVtU2l6 ZSwKKyAgICAgRkxPQVQgcGl4ZWxzX3Blcl9kaXAsCisgICAgIHZvaWQgKnRyYW5zZm9ybSwK KyAgICAgV0lOQk9PTCB1c2VfZ2RpX25hdHVyYWwsCisgICAgIGNvbnN0IFVJTlQxNiAqZ2x5 cGhfaW5kaWNlcywKKyAgICAgVUlOVDMyIGdseXBoX2NvdW50LAorICAgICBEV1JJVEVfR0xZ UEhfTUVUUklDUyAqbWV0cmljcywKKyAgICAgV0lOQk9PTCBpc19zaWRld2F5cyk7CisgIEVO RF9JTlRFUkZBQ0UKK30gSURXcml0ZUZvbnRGYWNlVnRibDsKKworaW50ZXJmYWNlIElEV3Jp dGVGb250RmFjZSB7CisgICAgQ09OU1RfVlRCTCBJRFdyaXRlRm9udEZhY2VWdGJsKiBscFZ0 Ymw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zVnRibCB7 CisgIEJFR0lOX0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpR dWVyeUludGVyZmFjZSkKKyAgICAoSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAqVGhpcywgUkVG SUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZ UEUgKkFkZFJlZikoSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAqVGhpcyk7CisgIFVMT05HIChT VERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAqVGhp cyk7CisKKyAgRkxPQVQgKFNURE1FVEhPRENBTExUWVBFICpHZXRHYW1tYSkKKyAgICAoSURX cml0ZVJlbmRlcmluZ1BhcmFtcyAqVGhpcyk7CisgIEZMT0FUIChTVERNRVRIT0RDQUxMVFlQ RSAqR2V0RW5oYW5jZWRDb250cmFzdCkKKyAgICAoSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAq VGhpcyk7CisgIEZMT0FUIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0Q2xlYXJUeXBlTGV2ZWwp CisgICAgKElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKlRoaXMpOworICBpbnQgKFNURE1FVEhP RENBTExUWVBFICpHZXRQaXhlbEdlb21ldHJ5KQorICAgIChJRFdyaXRlUmVuZGVyaW5nUGFy YW1zICpUaGlzKTsKKyAgRU5EX0lOVEVSRkFDRQorfSBJRFdyaXRlUmVuZGVyaW5nUGFyYW1z VnRibDsKKworaW50ZXJmYWNlIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgeworICAgIENPTlNU X1ZUQkwgSURXcml0ZVJlbmRlcmluZ1BhcmFtc1Z0YmwqIGxwVnRibDsKK307CisKK3R5cGVk ZWYgc3RydWN0IElEV3JpdGVGb250VnRibCB7CisgIEJFR0lOX0lOVEVSRkFDRQorCisgIEhS RVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAoSURXcml0 ZUZvbnQgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcg KFNURE1FVEhPRENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVGb250ICpUaGlzKTsKKyAgVUxP TkcgKFNURE1FVEhPRENBTExUWVBFICpSZWxlYXNlKShJRFdyaXRlRm9udCAqVGhpcyk7CisK KyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0Rm9udEZhbWlseSk7CisgIEVNQUNTX0RXUklU RV9VTlVTRUQgKEdldFdlaWdodCk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldFN0cmV0 Y2gpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRTdHlsZSk7CisgIEVNQUNTX0RXUklU RV9VTlVTRUQgKElzU3ltYm9sRm9udCk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldEZh Y2VOYW1lcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldEluZm9ybWF0aW9uYWxTdHJp bmdzKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0U2ltdWxhdGlvbnMpOworCisgIHZv aWQgKFNURE1FVEhPRENBTExUWVBFICpHZXRNZXRyaWNzKQorICAgIChJRFdyaXRlRm9udCAq VGhpcywgRFdSSVRFX0ZPTlRfTUVUUklDUyAqbWV0cmljcyk7CisKKyAgRU1BQ1NfRFdSSVRF X1VOVVNFRChIYXNDaGFyYWN0ZXIpOworCisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBF ICpDcmVhdGVGb250RmFjZSkKKyAgICAoSURXcml0ZUZvbnQgKlRoaXMsIElEV3JpdGVGb250 RmFjZSAqKmZhY2UpOworCisgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUZvbnRWdGJsOwor CitpbnRlcmZhY2UgSURXcml0ZUZvbnQgeworICAgIENPTlNUX1ZUQkwgSURXcml0ZUZvbnRW dGJsKiBscFZ0Ymw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlQml0bWFwUmVuZGVy VGFyZ2V0VnRibCB7CisgIEJFR0lOX0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNURE1FVEhP RENBTExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRlclRh cmdldCAqVGhpcywgUkVGSUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOworICBVTE9ORyAo U1RETUVUSE9EQ0FMTFRZUEUgKkFkZFJlZikoSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAq VGhpcyk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZUJp dG1hcFJlbmRlclRhcmdldCAqVGhpcyk7CisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZ UEUgKkRyYXdHbHlwaFJ1bikKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAqVGhp cywKKyAgICAgRkxPQVQgYmFzZWxpbmVPcmlnaW5YLAorICAgICBGTE9BVCBiYXNlbGluZU9y aWdpblksCisgICAgIERXUklURV9NRUFTVVJJTkdfTU9ERSBtZWFzdXJpbmdfbW9kZSwKKyAg ICAgY29uc3QgRFdSSVRFX0dMWVBIX1JVTiAqZ2x5cGhfcnVuLAorICAgICBJRFdyaXRlUmVu ZGVyaW5nUGFyYW1zICpwYXJhbXMsCisgICAgIENPTE9SUkVGIHRleHRDb2xvciwKKyAgICAg UkVDVCAqYmxhY2tib3hfcmVjdCk7CisKKyAgSERDIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0 TWVtb3J5REMpKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKlRoaXMpOworCisgIEVNQUNT X0RXUklURV9VTlVTRUQgKEdldFBpeGVsc1BlckRpcCk7CisKKyAgSFJFU1VMVCAoU1RETUVU SE9EQ0FMTFRZUEUgKlNldFBpeGVsc1BlckRpcCkKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRl clRhcmdldCAqVGhpcywgRkxPQVQgcGl4ZWxzX3Blcl9kaXApOworCisgIEVNQUNTX0RXUklU RV9VTlVTRUQgKEdldEN1cnJlbnRUcmFuc2Zvcm0pOworICBFTUFDU19EV1JJVEVfVU5VU0VE IChTZXRDdXJyZW50VHJhbnNmb3JtKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0U2l6 ZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKFJlc2l6ZSk7CisgIEVORF9JTlRFUkZBQ0UK K30gSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldFZ0Ymw7CisKK2ludGVyZmFjZSBJRFdyaXRl Qml0bWFwUmVuZGVyVGFyZ2V0IHsKKyAgICBDT05TVF9WVEJMIElEV3JpdGVCaXRtYXBSZW5k ZXJUYXJnZXRWdGJsKiBscFZ0Ymw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlQml0 bWFwUmVuZGVyVGFyZ2V0MVZ0YmwgeworICBCRUdJTl9JTlRFUkZBQ0UKKworICBIUkVTVUxU IChTVERNRVRIT0RDQUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAgKElEV3JpdGVCaXRt YXBSZW5kZXJUYXJnZXQxICpUaGlzLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9iamVjdCk7 CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqQWRkUmVmKSAoSURXcml0ZUJpdG1hcFJl bmRlclRhcmdldDEgKlRoaXMpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVh c2UpIChJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MSAqVGhpcyk7CisKKyAgRU1BQ1NfRFdS SVRFX1VOVVNFRCAoRHJhd0dseXBoUnVuKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0 TWVtb3J5REMpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRQaXhlbHNQZXJEaXApOwor ICBFTUFDU19EV1JJVEVfVU5VU0VEIChTZXRQaXhlbHNQZXJEaXApOworICBFTUFDU19EV1JJ VEVfVU5VU0VEIChHZXRDdXJyZW50VHJhbnNmb3JtKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNF RCAoU2V0Q3VycmVudFRyYW5zZm9ybSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldFNp emUpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChSZXNpemUpOworICBFTUFDU19EV1JJVEVf VU5VU0VEIChHZXRUZXh0QW50aWFsaWFzTW9kZSk7CisKKyAgSFJFU1VMVCAoU1RETUVUSE9E Q0FMTFRZUEUgKlNldFRleHRBbnRpYWxpYXNNb2RlKQorICAgIChJRFdyaXRlQml0bWFwUmVu ZGVyVGFyZ2V0MSAqVGhpcywgRFdSSVRFX1RFWFRfQU5USUFMSUFTX01PREUgbW9kZSk7CisK KyAgRU5EX0lOVEVSRkFDRQorfSBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MVZ0Ymw7CisK K2ludGVyZmFjZSBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MSB7CisgICAgQ09OU1RfVlRC TCBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MVZ0YmwqIGxwVnRibDsKK307CisKK3R5cGVk ZWYgc3RydWN0IElEV3JpdGVHZGlJbnRlcm9wVnRibCB7CisgIEJFR0lOX0lOVEVSRkFDRQor CisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAo SURXcml0ZUdkaUludGVyb3AgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0 KTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVHZGlJbnRl cm9wICpUaGlzKTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpSZWxlYXNlKShJRFdy aXRlR2RpSW50ZXJvcCAqVGhpcyk7CisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUg KkNyZWF0ZUZvbnRGcm9tTE9HRk9OVCkKKyAgICAoSURXcml0ZUdkaUludGVyb3AgKlRoaXMs IGNvbnN0IExPR0ZPTlRXICpsb2dmb250LAorICAgICBJRFdyaXRlRm9udCAqKmZvbnQpOwor CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENvbnZlcnRGb250VG9MT0dGT05UKTsKKyAgRU1B Q1NfRFdSSVRFX1VOVVNFRCAoQ29udmVydEZvbnRGYWNlVG9MT0dGT05UKTsKKyAgRU1BQ1Nf RFdSSVRFX1VOVVNFRCAoQ3JlYXRlRm9udEZhY2VGcm9tSGRjKTsKKworICBIUkVTVUxUIChT VERNRVRIT0RDQUxMVFlQRSAqQ3JlYXRlQml0bWFwUmVuZGVyVGFyZ2V0KQorICAgIChJRFdy aXRlR2RpSW50ZXJvcCAqVGhpcywgSERDIGhkYywgVUlOVDMyIHdpZHRoLCBVSU5UMzIgaGVp Z2h0LAorICAgICBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0ICoqdGFyZ2V0KTsKKyAgRU5E X0lOVEVSRkFDRQorfSBJRFdyaXRlR2RpSW50ZXJvcFZ0Ymw7CisKK2ludGVyZmFjZSBJRFdy aXRlR2RpSW50ZXJvcCB7CisgICAgQ09OU1RfVlRCTCBJRFdyaXRlR2RpSW50ZXJvcFZ0Ymwq IGxwVnRibDsKK307CisKK3R5cGVkZWYgc3RydWN0IElEV3JpdGVGYWN0b3J5VnRibCB7Cisg IEJFR0lOX0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpRdWVy eUludGVyZmFjZSkKKyAgICAoSURXcml0ZUZhY3RvcnkgKlRoaXMsIFJFRklJRCByaWlkLCB2 b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpBZGRSZWYp KElEV3JpdGVGYWN0b3J5ICpUaGlzKTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpS ZWxlYXNlKShJRFdyaXRlRmFjdG9yeSAqVGhpcyk7CisKKyAgRU1BQ1NfRFdSSVRFX1VOVVNF RCAoR2V0U3lzdGVtRm9udENvbGxlY3Rpb24pOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChD cmVhdGVDdXN0b21Gb250Q29sbGVjdGlvbik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKFJl Z2lzdGVyRm9udENvbGxlY3Rpb25Mb2FkZXIpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChV bnJlZ2lzdGVyRm9udENvbGxlY3Rpb25Mb2FkZXIpOworICBFTUFDU19EV1JJVEVfVU5VU0VE IChDcmVhdGVGb250RmlsZVJlZmVyZW5jZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENy ZWF0ZUN1c3RvbUZvbnRGaWxlUmVmZXJlbmNlKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAo Q3JlYXRlRm9udEZhY2UpOworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqQ3JlYXRl UmVuZGVyaW5nUGFyYW1zKQorICAgIChJRFdyaXRlRmFjdG9yeSAqVGhpcywgSURXcml0ZVJl bmRlcmluZ1BhcmFtcyAqKnBhcmFtcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0 ZU1vbml0b3JSZW5kZXJpbmdQYXJhbXMpOworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQ RSAqQ3JlYXRlQ3VzdG9tUmVuZGVyaW5nUGFyYW1zKQorICAgIChJRFdyaXRlRmFjdG9yeSAq VGhpcywgRkxPQVQgZ2FtbWEsIEZMT0FUIGVuaGFuY2VkQ29udHJhc3QsCisgICAgIEZMT0FU IGNsZWFydHlwZV9sZXZlbCwgRFdSSVRFX1BJWEVMX0dFT01FVFJZIGdlb21ldHJ5LAorICAg ICBEV1JJVEVfUkVOREVSSU5HX01PREUgbW9kZSwgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAq KnBhcmFtcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKFJlZ2lzdGVyRm9udEZpbGVMb2Fk ZXIpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChVbnJlZ2lzdGVyRm9udEZpbGVMb2FkZXIp OworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVUZXh0Rm9ybWF0KTsKKyAgRU1BQ1Nf RFdSSVRFX1VOVVNFRCAoQ3JlYXRlVHlwb2dyYXBoeSk7CisgIEhSRVNVTFQgKFNURE1FVEhP RENBTExUWVBFICpHZXRHZGlJbnRlcm9wKQorICAgIChJRFdyaXRlRmFjdG9yeSAqVGhpcywg SURXcml0ZUdkaUludGVyb3AgKipnZGlfaW50ZXJvcCk7CisgIEVNQUNTX0RXUklURV9VTlVT RUQgKENyZWF0ZVRleHRMYXlvdXQpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVH ZGlDb21wYXRpYmxlVGV4dExheW91dCk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0 ZUVsbGlwc2lzVHJpbW1pbmdTaWduKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRl VGV4dEFuYWx5emVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlTnVtYmVyU3Vi c3RpdHV0aW9uKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlR2x5cGhSdW5BbmFs eXNpcyk7CisgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUZhY3RvcnlWdGJsOworCitpbnRl cmZhY2UgSURXcml0ZUZhY3RvcnkgeyBDT05TVF9WVEJMIElEV3JpdGVGYWN0b3J5VnRibCog bHBWdGJsOyB9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1l cmF0b3JWdGJsIHsKKyAgICBCRUdJTl9JTlRFUkZBQ0UKKworICAgIEhSRVNVTFQgKFNURE1F VEhPRENBTExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAgIChJRFdyaXRlQ29sb3JHbHlw aFJ1bkVudW1lcmF0b3IgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsK KyAgICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKkFkZFJlZikoSURXcml0ZUNvbG9yR2x5 cGhSdW5FbnVtZXJhdG9yICpUaGlzKTsKKyAgICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUg KlJlbGVhc2UpKElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvciAqVGhpcyk7CisKKyAg ICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqTW92ZU5leHQpKAorICAgICAgICBJRFdy aXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3IgKlRoaXMsCisgICAgICAgIFdJTkJPT0wgKmhh c1J1bik7CisKKyAgICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0Q3VycmVudFJ1 bikoCisgICAgICAgIElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvciAqVGhpcywKKyAg ICAgICAgY29uc3QgRFdSSVRFX0NPTE9SX0dMWVBIX1JVTiAqKnJ1bik7CisKKyAgICBFTkRf SU5URVJGQUNFCit9IElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvclZ0Ymw7CisKK2lu dGVyZmFjZSBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3IgeworICAgIENPTlNUX1ZU QkwgSURXcml0ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9yVnRibCogbHBWdGJsOworfTsKKwor dHlwZWRlZiBzdHJ1Y3QgSURXcml0ZUZhY3RvcnkyVnRibCB7CisgIEJFR0lOX0lOVEVSRkFD RQorICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAg ICAoSURXcml0ZUZhY3RvcnkyICpUaGlzLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9iamVj dCk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqQWRkUmVmKShJRFdyaXRlRmFjdG9y eTIgKlRoaXMpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3Jp dGVGYWN0b3J5MiAqVGhpcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldFN5c3RlbUZv bnRDb2xsZWN0aW9uKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlQ3VzdG9tRm9u dENvbGxlY3Rpb24pOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChSZWdpc3RlckZvbnRDb2xs ZWN0aW9uTG9hZGVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoVW5yZWdpc3RlckZvbnRD b2xsZWN0aW9uTG9hZGVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlRm9udEZp bGVSZWZlcmVuY2UpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVDdXN0b21Gb250 RmlsZVJlZmVyZW5jZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUZvbnRGYWNl KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlUmVuZGVyaW5nUGFyYW1zKTsKKyAg RU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlTW9uaXRvclJlbmRlcmluZ1BhcmFtcyk7Cisg IEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUN1c3RvbVJlbmRlcmluZ1BhcmFtcyk7Cisg IEVNQUNTX0RXUklURV9VTlVTRUQgKFJlZ2lzdGVyRm9udEZpbGVMb2FkZXIpOworICBFTUFD U19EV1JJVEVfVU5VU0VEIChVbnJlZ2lzdGVyRm9udEZpbGVMb2FkZXIpOworICBFTUFDU19E V1JJVEVfVU5VU0VEIChDcmVhdGVUZXh0Rm9ybWF0KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNF RCAoQ3JlYXRlVHlwb2dyYXBoeSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldEdkaUlu dGVyb3ApOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVUZXh0TGF5b3V0KTsKKyAg RU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlR2RpQ29tcGF0aWJsZVRleHRMYXlvdXQpOwor ICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVFbGxpcHNpc1RyaW1taW5nU2lnbik7Cisg IEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZVRleHRBbmFseXplcik7CisgIEVNQUNTX0RX UklURV9VTlVTRUQgKENyZWF0ZU51bWJlclN1YnN0aXR1dGlvbik7CisgIEVNQUNTX0RXUklU RV9VTlVTRUQgKENyZWF0ZUdseXBoUnVuQW5hbHlzaXMpOworCisgIEVNQUNTX0RXUklURV9V TlVTRUQgKEdldEV1ZGNGb250Q29sbGVjdGlvbik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQg KElEV3JpdGVGYWN0b3J5MV9DcmVhdGVDdXN0b21SZW5kZXJpbmdQYXJhbXMpOworCisgIEVN QUNTX0RXUklURV9VTlVTRUQgKEdldFN5c3RlbUZvbnRGYWxsYmFjayk7CisgIEVNQUNTX0RX UklURV9VTlVTRUQgKENyZWF0ZUZvbnRGYWxsYmFja0J1aWxkZXIpOworICBIUkVTVUxUIChT VERNRVRIT0RDQUxMVFlQRSAqVHJhbnNsYXRlQ29sb3JHbHlwaFJ1bikKKyAgICAoSURXcml0 ZUZhY3RvcnkyICpUaGlzLAorICAgICBGTE9BVCBvcmlnaW5YLAorICAgICBGTE9BVCBvcmln aW5ZLAorICAgICBjb25zdCBEV1JJVEVfR0xZUEhfUlVOICpydW4sCisgICAgIHZvaWQgKnJ1 bmRlc2NyLAorICAgICBEV1JJVEVfTUVBU1VSSU5HX01PREUgbW9kZSwKKyAgICAgdm9pZCAq dHJhbnNmb3JtLAorICAgICBVSU5UMzIgcGFsZXR0ZV9pbmRleCwKKyAgICAgSURXcml0ZUNv bG9yR2x5cGhSdW5FbnVtZXJhdG9yICoqY29sb3JsYXllcnMpOworCisgIEVNQUNTX0RXUklU RV9VTlVTRUQgKElEV3JpdGVGYWN0b3J5Ml9DcmVhdGVDdXN0b21SZW5kZXJpbmdQYXJhbXMp OworICBFTUFDU19EV1JJVEVfVU5VU0VEIChJRFdyaXRlRmFjdG9yeTJfQ3JlYXRlR2x5cGhS dW5BbmFseXNpcyk7CisgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUZhY3RvcnkyVnRibDsK KworaW50ZXJmYWNlIElEV3JpdGVGYWN0b3J5MiB7CisgICAgQ09OU1RfVlRCTCBJRFdyaXRl RmFjdG9yeTJWdGJsKiBscFZ0Ymw7Cit9OworI2Vsc2UgLyogaWZuZGVmIE1JTkdXX1c2NCAq LworIyBpbmNsdWRlIDxkd3JpdGVfMy5oPgorI2VuZGlmCisKKy8qIFZhbHVlcyB0byB1c2Ug Zm9yIERpcmVjdFdyaXRlIHJlbmRlcmluZy4gICovCisjZGVmaW5lIE1FQVNVUklOR19NT0RF IERXUklURV9NRUFTVVJJTkdfTU9ERV9OQVRVUkFMCisjZGVmaW5lIFJFTkRFUklOR19NT0RF IERXUklURV9SRU5ERVJJTkdfTU9ERV9OQVRVUkFMX1NZTU1FVFJJQworI2RlZmluZSBBTlRJ QUxJQVNfTU9ERSBEV1JJVEVfVEVYVF9BTlRJQUxJQVNfTU9ERV9DTEVBUlRZUEUKKworI2Rl ZmluZSBSRUxFQVNFX0NPTShpKSAoaSktPmxwVnRibC0+UmVsZWFzZSAoaSkKKworLyogR2xv YmFsIHZhcmlhYmxlcyBmb3IgRGlyZWN0V3JpdGUuICAqLworc3RhdGljIGJvb2wgZGlyZWN0 X3dyaXRlX2F2YWlsYWJsZSA9IGZhbHNlOworc3RhdGljIElEV3JpdGVGYWN0b3J5ICpkd3Jp dGVfZmFjdG9yeTsKK3N0YXRpYyBJRFdyaXRlRmFjdG9yeTIgKmR3cml0ZV9mYWN0b3J5MjsK K3N0YXRpYyBJRFdyaXRlR2RpSW50ZXJvcCAqZ2RpX2ludGVyb3A7CitzdGF0aWMgSURXcml0 ZVJlbmRlcmluZ1BhcmFtcyAqcmVuZGVyaW5nX3BhcmFtczsKKworc3RhdGljIHZvaWQKK3Zl cmlmeV9ociAoSFJFU1VMVCBociwgY29uc3QgY2hhciAqbXNnKQoreworICBpZiAoRkFJTEVE IChocikpCisgICAgZW1hY3NfYWJvcnQgKCk7Cit9CisKKy8qIEdldHMgYSBJRFdyaXRlRm9u dEZhY2UgZnJvbSBhIHN0cnVjdCBmb250IChpdHMgSEZPTlQpLiBSZXR1cm5zIHRoZQorICAg Zm9udCBzaXplIGluIHBvaW50cy4gIEl0IG1heSBmYWlsIHRvIGdldCBhIERpcmVjdFdyaXRl IGZvbnQsIGFuZCBmYWNlCisgICB3aWxsIGJlIE5VTEwgb24gcmV0dXJuLiAgVGhpcyBoYXBw ZW5zIGZvciBzb21lIGZvbnRzIGxpa2UgQ291cmllci4KKworICAgTmV2ZXIgY2FsbCBSZWxl YXNlIG9uIHRoZSByZXN1bHQsIGFzIGl0IGlzIGNhY2hlZCBmb3IgcmV1c2Ugb24gdGhlCisg ICBzdHJ1Y3QgZm9udC4gICovCitzdGF0aWMgZmxvYXQKK2dldF9mb250X2ZhY2UgKHN0cnVj dCBmb250ICppbmZvbnQsIElEV3JpdGVGb250RmFjZSAqKmZhY2UpCit7CisgIEhSRVNVTFQg aHI7CisgIExPR0ZPTlRXIGxvZ2ZvbnQ7CisgIElEV3JpdGVGb250ICpmb250OworICBmbG9h dCBmb250X3NpemU7CisKKyAgLyogQ2hlY2sgdGhlIGNhY2hlLiAgKi8KKyAgKmZhY2UgPSB3 MzJfZm9udF9nZXRfZHdyaXRlX2NhY2hlIChpbmZvbnQsICZmb250X3NpemUpOworICBpZiAo KmZhY2UpCisgICAgcmV0dXJuIGZvbnRfc2l6ZTsKKworICBHZXRPYmplY3RXIChGT05UX0hB TkRMRShpbmZvbnQpLCBzaXplb2YgKExPR0ZPTlRXKSwgJmxvZ2ZvbnQpOworCisgIGhyID0g Z2RpX2ludGVyb3AtPmxwVnRibC0+Q3JlYXRlRm9udEZyb21MT0dGT05UIChnZGlfaW50ZXJv cCwKKwkJCQkJCSAgIChjb25zdCBMT0dGT05UVyAqKSAmbG9nZm9udCwKKwkJCQkJCSAgICZm b250KTsKKworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAgICAgKmZhY2UgPSBOVUxM OworICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisKKyAgaHIgPSBmb250LT5scFZ0YmwtPkNy ZWF0ZUZvbnRGYWNlIChmb250LCBmYWNlKTsKKyAgUkVMRUFTRV9DT00gKGZvbnQpOworICB2 ZXJpZnlfaHIgKGhyLCAiRmFpbGVkIHRvIGNyZWF0ZSBEV3JpdGVGb250RmFjZSIpOworICB3 MzJfZm9udF9zZXRfZHdyaXRlX2NhY2hlIChpbmZvbnQsICpmYWNlLCBhYnMgKGxvZ2ZvbnQu bGZIZWlnaHQpKTsKKworICByZXR1cm4gYWJzKGxvZ2ZvbnQubGZIZWlnaHQpOworfQorCit2 b2lkCit3MzJfZHdyaXRlX2ZyZWVfY2FjaGVkX2ZhY2UgKHZvaWQgKmNhY2hlKQoreworICBp ZiAoY2FjaGUpCisgICAgUkVMRUFTRV9DT00gKChJRFdyaXRlRm9udEZhY2UgKikgY2FjaGUp OworfQorCitzdGF0aWMgZmxvYXQKK2NvbnZlcnRfbWV0cmljc19zeiAoaW50IHN6LCBmbG9h dCBmb250X3NpemUsIGludCB1bml0c19wZXJfZW0pCit7CisgIHJldHVybiAoZmxvYXQpIHN6 ICogZm9udF9zaXplIC8gdW5pdHNfcGVyX2VtOworfQorCisKKy8qIERvZXMgbm90IGZpbGwg aW4gdGhlIGFzY2VudCBhbmQgZGVzY2VudCBmaWVsZHMgb2YgbWV0cmljcy4gICovCitzdGF0 aWMgdm9pZAordGV4dF9leHRlbnRzX2ludGVybmFsIChJRFdyaXRlRm9udEZhY2UgKmR3cml0 ZV9mb250X2ZhY2UsCisJCSAgICAgICBmbG9hdCBmb250X3NpemUsIGNvbnN0IHVuc2lnbmVk ICpjb2RlLAorCQkgICAgICAgaW50IG5nbHlwaHMsIHN0cnVjdCBmb250X21ldHJpY3MgKm1l dHJpY3MpCit7CisgIEhSRVNVTFQgaHI7CisKKyAgaWYgKGZvbnRfc2l6ZSA8PSAwLjBmKQor ICAgIHsKKyAgICAgIG1ldHJpY3MtPndpZHRoID0gMDsKKyAgICAgIG1ldHJpY3MtPmxiZWFy aW5nID0gMDsKKyAgICAgIG1ldHJpY3MtPnJiZWFyaW5nID0gMDsKKyAgICAgIHJldHVybjsK KyAgICB9CisKKyAgRFdSSVRFX0ZPTlRfTUVUUklDUyBkd3JpdGVfZm9udF9tZXRyaWNzOwor ICBkd3JpdGVfZm9udF9mYWNlLT5scFZ0YmwtPkdldE1ldHJpY3MgKGR3cml0ZV9mb250X2Zh Y2UsCisJCQkJCSZkd3JpdGVfZm9udF9tZXRyaWNzKTsKKworICBVSU5UMTYgKmluZGljZXMg PSBhbGxvY2EgKG5nbHlwaHMgKiBzaXplb2YgKFVJTlQxNikpOworICBmb3IgKGludCBpID0g MDsgaSA8IG5nbHlwaHM7IGkrKykKKyAgICBpbmRpY2VzW2ldID0gY29kZVtpXTsKKworICBE V1JJVEVfR0xZUEhfTUVUUklDUyogZ21ldHJpY3MgPQorICAgIGFsbG9jYSAobmdseXBocyAq IHNpemVvZiAoRFdSSVRFX0dMWVBIX01FVFJJQ1MpKTsKKworICBociA9IGR3cml0ZV9mb250 X2ZhY2UtPmxwVnRibC0+R2V0R2RpQ29tcGF0aWJsZUdseXBoTWV0cmljcyAoZHdyaXRlX2Zv bnRfZmFjZSwKKwkJCQkJCQkgICAgICAgZm9udF9zaXplLAorCQkJCQkJCSAgICAgICAxLjAs CisJCQkJCQkJICAgICAgIE5VTEwsCisJCQkJCQkJICAgICAgIFRSVUUsCisJCQkJCQkJICAg ICAgIGluZGljZXMsCisJCQkJCQkJICAgICAgIG5nbHlwaHMsCisJCQkJCQkJICAgICAgIGdt ZXRyaWNzLAorCQkJCQkJCSAgICAgICBmYWxzZSk7CisgIHZlcmlmeV9ociAoaHIsICJGYWls ZWQgdG8gR2V0R2RpQ29tcGF0aWJsZUdseXBoTWV0cmljcyIpOworCisgIGZsb2F0IHdpZHRo ID0gMDsKKyAgaW50IGR1X3Blcl9lbSA9IGR3cml0ZV9mb250X21ldHJpY3MuZGVzaWduVW5p dHNQZXJFbTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG5nbHlwaHM7IGkrKykKKyAgICB7 CisgICAgICBmbG9hdCBhZHZhbmNlID0KKwljb252ZXJ0X21ldHJpY3Nfc3ogKGdtZXRyaWNz W2ldLmFkdmFuY2VXaWR0aCwgZm9udF9zaXplLCBkdV9wZXJfZW0pOworCisgICAgICB3aWR0 aCArPSBhZHZhbmNlOworCisgICAgICBmbG9hdCBsYmVhcmluZyA9CisJcm91bmQgKGNvbnZl cnRfbWV0cmljc19zeiAoZ21ldHJpY3NbaV0ubGVmdFNpZGVCZWFyaW5nLCBmb250X3NpemUs CisJCQkJICAgZHVfcGVyX2VtKSk7CisgICAgICBmbG9hdCByYmVhcmluZyA9CisJcm91bmQg KGFkdmFuY2UgLQorCSAgICAgICBjb252ZXJ0X21ldHJpY3Nfc3ogKGdtZXRyaWNzW2ldLnJp Z2h0U2lkZUJlYXJpbmcsCisJCQkJICAgZm9udF9zaXplLCBkdV9wZXJfZW0pKTsKKyAgICAg IGlmIChpID09IDApCisJeworCSAgbWV0cmljcy0+bGJlYXJpbmcgPSBsYmVhcmluZzsKKwkg IG1ldHJpY3MtPnJiZWFyaW5nID0gcmJlYXJpbmc7CisJfQorICAgICAgaWYgKG1ldHJpY3Mt PmxiZWFyaW5nID4gbGJlYXJpbmcpCisJbWV0cmljcy0+bGJlYXJpbmcgPSBsYmVhcmluZzsK KyAgICAgIGlmIChtZXRyaWNzLT5yYmVhcmluZyA8IHJiZWFyaW5nKQorCW1ldHJpY3MtPnJi ZWFyaW5nID0gcmJlYXJpbmc7CisgICAgfQorICBtZXRyaWNzLT53aWR0aCA9IHJvdW5kKHdp ZHRoKTsKK30KKwordW5zaWduZWQKK3czMl9kd3JpdGVfZW5jb2RlX2NoYXIgKHN0cnVjdCBm b250ICpmb250LCBpbnQgYykKK3sKKyAgSFJFU1VMVCBocjsKKyAgSURXcml0ZUZvbnRGYWNl ICpkd3JpdGVfZm9udF9mYWNlOworICBVSU5UMTYgaW5kZXg7CisKKyAgZ2V0X2ZvbnRfZmFj ZSAoZm9udCwgJmR3cml0ZV9mb250X2ZhY2UpOworICBociA9IGR3cml0ZV9mb250X2ZhY2Ut PmxwVnRibC0+R2V0R2x5cGhJbmRpY2VzIChkd3JpdGVfZm9udF9mYWNlLAorCQkJCQkJICAm YywgMSwgJmluZGV4KTsKKyAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCB0byBHZXRHbHlwaElu ZGljZXMiKTsKKworICBpZiAoaW5kZXggPT0gMCkKKyAgICByZXR1cm4gRk9OVF9JTlZBTElE X0NPREU7CisKKyAgcmV0dXJuIGluZGV4OworfQorCit2b2lkCit3MzJfZHdyaXRlX3RleHRf ZXh0ZW50cyAoc3RydWN0IGZvbnQgKmZvbnQsIGNvbnN0IHVuc2lnbmVkICpjb2RlLCBpbnQg bmdseXBocywKKwkJCSBzdHJ1Y3QgZm9udF9tZXRyaWNzICptZXRyaWNzKQoreworICBJRFdy aXRlRm9udEZhY2UgKmR3cml0ZV9mb250X2ZhY2U7CisKKyAgZmxvYXQgZm9udF9zaXplID0g Z2V0X2ZvbnRfZmFjZSAoZm9udCwgJmR3cml0ZV9mb250X2ZhY2UpOworCisgIGlmIChkd3Jp dGVfZm9udF9mYWNlID09IE5VTEwpCisgICAgeworICAgICAgbWV0cmljcy0+d2lkdGggPSAw OworICAgICAgbWV0cmljcy0+bGJlYXJpbmcgPSAwOworICAgICAgbWV0cmljcy0+cmJlYXJp bmcgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICB0ZXh0X2V4dGVudHNfaW50ZXJu YWwgKGR3cml0ZV9mb250X2ZhY2UsIGZvbnRfc2l6ZSwgY29kZSwgbmdseXBocywgbWV0cmlj cyk7CisKKyAgbWV0cmljcy0+YXNjZW50ID0gZm9udC0+YXNjZW50OworICBtZXRyaWNzLT5k ZXNjZW50ID0gZm9udC0+ZGVzY2VudDsKK30KKworLyogTmV2ZXIgY2FsbCBSZWxlYXNlIG9u IHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLCBhcyBpdCBpcworICAgcmV1 c2VkLiAgKi8KK3N0YXRpYyBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0ICoKK2dldF9iaXRt YXBfcmVuZGVyX3RhcmdldCAoSERDIGhkYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorewor ICBIUkVTVUxUIGhyOworICBzdGF0aWMgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAqYnJ0 ID0gTlVMTDsKKyAgc3RhdGljIFNJWkUgc2l6ZSA9IHswLCAwfTsKKworICBpZiAoYnJ0KQor ICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gbWFrZSBhIGJpZ2dlciBvbmUu ICAqLworICAgICAgaWYgKHdpZHRoIDw9IHNpemUuY3ggJiYgaGVpZ2h0IDw9IHNpemUuY3kp CisJcmV0dXJuIGJydDsKKyAgICAgIFJFTEVBU0VfQ09NIChicnQpOworICAgIH0KKworICBp ZiAod2lkdGggPiBzaXplLmN4KQorICAgIHNpemUuY3ggPSB3aWR0aDsKKyAgaWYgKGhlaWdo dCA+IHNpemUuY3kpCisgICAgc2l6ZS5jeSA9IGhlaWdodDsKKworICBociA9IGdkaV9pbnRl cm9wLT5scFZ0YmwtPkNyZWF0ZUJpdG1hcFJlbmRlclRhcmdldCAoZ2RpX2ludGVyb3AsCisJ CQkJCQkgICAgICBoZGMsCisJCQkJCQkgICAgICBzaXplLmN4LCBzaXplLmN5LAorCQkJCQkJ ICAgICAgJmJydCk7CisgIHZlcmlmeV9ociAoaHIsICJGYWlsZWQgdG8gY3JlYXRlIERXcml0 ZUJpdG1hcFJlbmRlclRhcmdldCIpOworCisgIC8qIFdlIGhhbmRsZSBoaWdoIGRwaSBkaXNw bGF5cyBieSBpbmNyZXNpbmcgZm9udCBzaXplLCBzbyBvdmVycmlkZQorICAgICBQaXhlbHNQ ZXJEaXAuICAqLworICBicnQtPmxwVnRibC0+U2V0UGl4ZWxzUGVyRGlwIChicnQsIDEuMCk7 CisKKyAgLyogVGhlIFNldFRleHRBbnRpYWxpYXNNb2RlIG1ldGhvZCBpcyBvbmx5IGF2YWls YWJsZSBpbgorICAgICBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MS4gICovCisgIElEV3Jp dGVCaXRtYXBSZW5kZXJUYXJnZXQxICpicnQxOworICBociA9IGJydC0+bHBWdGJsLT5RdWVy eUludGVyZmFjZSAoYnJ0LAorCQkJCSAgICAmSUlEX0lEV3JpdGVCaXRtYXBSZW5kZXJUYXJn ZXQxLAorCQkJCSAgICAodm9pZCAqKikgJmJydDEpOworICBpZiAoU1VDQ0VFREVEIChocikp CisgICAgeworICAgICAgYnJ0MS0+bHBWdGJsLT5TZXRUZXh0QW50aWFsaWFzTW9kZSAoYnJ0 MSwgQU5USUFMSUFTX01PREUpOworICAgICAgUkVMRUFTRV9DT00gKGJydDEpOworICAgIH0K KworICByZXR1cm4gYnJ0OworfQorCit2b2lkCit3MzJfaW5pdGlhbGl6ZV9kaXJlY3Rfd3Jp dGUgKHZvaWQpCit7CisgIGRpcmVjdF93cml0ZV9hdmFpbGFibGUgPSBmYWxzZTsKKyAgSE1P RFVMRSBkaXJlY3Rfd3JpdGUgPSBMb2FkTGlicmFyeSAoImR3cml0ZS5kbGwiKTsKKyAgaWYg KCFkaXJlY3Rfd3JpdGUpCisgICAgcmV0dXJuOworCisgIC8qIFRoaXMgaXMgb25seSB1c2Vk IGhlcmUsIG5vIG5lZWQgdG8gZGVmaW5lIGl0IGdsb2JhbGx5LiAgKi8KKyAgdHlwZWRlZiBI UkVTVUxUIChXSU5BUEkgKkRXQ3JlYXRlRmFjdG9yeSkgKERXUklURV9GQUNUT1JZX1RZUEUg ZiwgUkVGSUlEIHIsIElVbmtub3duKiogdSk7CisKKyAgRFdDcmVhdGVGYWN0b3J5IGR3X2Ny ZWF0ZV9mYWN0b3J5CisgICAgPSAoRFdDcmVhdGVGYWN0b3J5KSBnZXRfcHJvY19hZGRyIChk aXJlY3Rfd3JpdGUsCisJCQkJICAgICAgICJEV3JpdGVDcmVhdGVGYWN0b3J5Iik7CisKKyAg aWYgKCFkd19jcmVhdGVfZmFjdG9yeSkKKyAgICB7CisgICAgICBGcmVlTGlicmFyeSAoZGly ZWN0X3dyaXRlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgSFJFU1VMVCBociA9IGR3 X2NyZWF0ZV9mYWN0b3J5IChEV1JJVEVfRkFDVE9SWV9UWVBFX1NIQVJFRCwKKwkJCQkgICZJ SURfSURXcml0ZUZhY3RvcnksCisJCQkJICAoSVVua25vd24gKiopICZkd3JpdGVfZmFjdG9y eSk7CisgIGlmIChGQUlMRUQgKGhyKSkKKyAgICB7CisgICAgICBGcmVlTGlicmFyeSAoZGly ZWN0X3dyaXRlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaHIgPSBkd3JpdGVfZmFj dG9yeS0+bHBWdGJsLT5RdWVyeUludGVyZmFjZSAoZHdyaXRlX2ZhY3RvcnksCisJCQkJCSAg ICAgICAmSUlEX0lEV3JpdGVGYWN0b3J5MiwKKwkJCQkJICAgICAgICh2b2lkICoqKSAmZHdy aXRlX2ZhY3RvcnkyKTsKKworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAgICAgUkVM RUFTRV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAgIEZyZWVMaWJyYXJ5IChkaXJlY3Rf d3JpdGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBociA9IGR3cml0ZV9mYWN0b3J5 LT5scFZ0YmwtPkdldEdkaUludGVyb3AgKGR3cml0ZV9mYWN0b3J5LAorCQkJCQkgICAgICAm Z2RpX2ludGVyb3ApOworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAgICAgUkVMRUFT RV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAgIFJFTEVBU0VfQ09NIChkd3JpdGVfZmFj dG9yeTIpOworICAgICAgRnJlZUxpYnJhcnkgKGRpcmVjdF93cml0ZSk7CisgICAgICByZXR1 cm47CisgICAgfQorCisgIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKmRlZjsKKworICBociA9 IGR3cml0ZV9mYWN0b3J5LT5scFZ0YmwtPkNyZWF0ZVJlbmRlcmluZ1BhcmFtcyAoZHdyaXRl X2ZhY3RvcnksCisJCQkJCQkgICAgICAmZGVmKTsKKyAgaWYgKEZBSUxFRCAoaHIpKQorICAg IHsKKyAgICAgIFJFTEVBU0VfQ09NIChkd3JpdGVfZmFjdG9yeSk7CisgICAgICBSRUxFQVNF X0NPTSAoZHdyaXRlX2ZhY3RvcnkyKTsKKyAgICAgIFJFTEVBU0VfQ09NIChnZGlfaW50ZXJv cCk7CisgICAgICBGcmVlTGlicmFyeSAoZGlyZWN0X3dyaXRlKTsKKyAgICAgIHJldHVybjsK KyAgICB9CisKKyAgLyogcmFuZ2U6IFswLjAsIDEuMF0gICovCisgIGZsb2F0IGVuaGFuY2Vk X2NvbnRyYXN0ID0gZGVmLT5scFZ0YmwtPkdldEVuaGFuY2VkQ29udHJhc3QgKGRlZik7Cisg IC8qIHJhbmdlOiBbMC4wLCAxLjBdICAqLworICBmbG9hdCBjbGVhcl90eXBlX2xldmVsID0g ZGVmLT5scFZ0YmwtPkdldENsZWFyVHlwZUxldmVsIChkZWYpOworICAvKiByYW5nZTogKDAu MCwgMjU2LjBdICovCisgIGZsb2F0IGdhbW1hID0gMS40OyAvKiBkZWYtPmxwVnRibC0+R2V0 R2FtbWEoZGVmKTsgKi8KKworICBociA9IGR3cml0ZV9mYWN0b3J5LT5scFZ0YmwtPkNyZWF0 ZUN1c3RvbVJlbmRlcmluZ1BhcmFtcyAoZHdyaXRlX2ZhY3RvcnksCisJCQkJCQkJICAgIGdh bW1hLAorCQkJCQkJCSAgICBlbmhhbmNlZF9jb250cmFzdCwKKwkJCQkJCQkgICAgY2xlYXJf dHlwZV9sZXZlbCwKKwkJCQkJCQkgICAgZGVmLT5scFZ0YmwtPkdldFBpeGVsR2VvbWV0cnko ZGVmKSwKKwkJCQkJCQkgICAgUkVOREVSSU5HX01PREUsCisJCQkJCQkJICAgICZyZW5kZXJp bmdfcGFyYW1zKTsKKworICBSRUxFQVNFX0NPTSAoZGVmKTsKKworICBpZiAoRkFJTEVEICho cikpCisgICAgeworICAgICAgUkVMRUFTRV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAg IFJFTEVBU0VfQ09NIChkd3JpdGVfZmFjdG9yeTIpOworICAgICAgUkVMRUFTRV9DT00gKGdk aV9pbnRlcm9wKTsKKyAgICAgIEZyZWVMaWJyYXJ5IChkaXJlY3Rfd3JpdGUpOworICAgICAg cmV0dXJuOworICAgIH0KKworICBkaXJlY3Rfd3JpdGVfYXZhaWxhYmxlID0gdHJ1ZTsKKwor ICBERUZWQVJfQk9PTCAoInczMi1pbmhpYml0LWR3cml0ZSIsIHczMl9pbmhpYml0X2R3cml0 ZSwKKwkgICAgICAgZG9jOiAvKiBJZiB0LCBkb24ndCB1c2UgRGlyZWN0V3JpdGUuICAqLyk7 CisgIHczMl9pbmhpYml0X2R3cml0ZSA9IGZhbHNlOworfQorCit2b2lkIHczMl9kd3JpdGVf ZHJhdyAoSERDIGhkYywgaW50IHgsIGludCB5LCB1bnNpZ25lZCAqZ2x5cGhzLCBpbnQgbGVu LAorCQkgICAgICBDT0xPUlJFRiBjb2xvciwgc3RydWN0IGZvbnQgKmZvbnQpCit7CisgIEhS RVNVTFQgaHI7CisgIElEV3JpdGVGb250RmFjZSAqZHdyaXRlX2ZvbnRfZmFjZTsKKworICAv KiBXaGF0IHdlIGdldCBhcyB5IGlzIHRoZSBiYXNlbGluZSBwb3NpdGlvbi4gICovCisgIHkg LT0gZm9udC0+YXNjZW50OworCisgIGZsb2F0IGZvbnRfc2l6ZSA9IGdldF9mb250X2ZhY2Ug KGZvbnQsICZkd3JpdGVfZm9udF9mYWNlKTsKKyAgaWYgKGR3cml0ZV9mb250X2ZhY2UgPT0g TlVMTCkKKyAgICByZXR1cm47CisKKyAgc3RydWN0IGZvbnRfbWV0cmljcyBtZXRyaWNzOwor ICB0ZXh0X2V4dGVudHNfaW50ZXJuYWwgKGR3cml0ZV9mb250X2ZhY2UsIGZvbnRfc2l6ZSwg Z2x5cGhzLCBsZW4sICZtZXRyaWNzKTsKKworICBpbnQgYml0bWFwX3dpZHRoID0gbWV0cmlj cy53aWR0aCArIG1ldHJpY3MucmJlYXJpbmc7CisgIGludCBiaXRtYXBfaGVpZ2h0ID0gZm9u dC0+YXNjZW50ICsgZm9udC0+ZGVzY2VudDsKKworICAvKiBXZSBuZXZlciByZWxlYXNlIHRo aXMsIGdldF9iaXRtYXBfcmVuZGVyX3RhcmdldCByZXVzZXMgaXQuICAqLworICBJRFdyaXRl Qml0bWFwUmVuZGVyVGFyZ2V0ICpiaXRtYXBfcmVuZGVyX3RhcmdldCA9CisgICAgZ2V0X2Jp dG1hcF9yZW5kZXJfdGFyZ2V0IChoZGMsIGJpdG1hcF93aWR0aCwgYml0bWFwX2hlaWdodCk7 CisKKyAgLyogVGhpcyBEQyBjYW4ndCBiZSByZWxlYXNlZC4gICovCisgIEhEQyB0ZXh0X2Rj ID0gYml0bWFwX3JlbmRlcl90YXJnZXQtPmxwVnRibC0+R2V0TWVtb3J5REMKKyAgICAoYml0 bWFwX3JlbmRlcl90YXJnZXQpOworCisgIC8qIENvcHkgdGhlIGJhY2tncm91bmQgcGl4ZWwg dG8gdGhlIHJlbmRlciB0YXJnZXQgYml0bWFwLiAgKi8KKyAgQml0Qmx0ICh0ZXh0X2RjLCAw LCAwLCBiaXRtYXBfd2lkdGgsIGJpdG1hcF9oZWlnaHQsIGhkYywgeCwgeSwgU1JDQ09QWSk7 CisKKworICBVSU5UMTYgKmluZGljZXMgPSBhbGxvY2EgKGxlbiAqIHNpemVvZiAoVUlOVDE2 KSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICBpbmRpY2VzW2ld ID0gZ2x5cGhzW2ldOworCisgIEZMT0FUICphZHZhbmNlcyA9IGFsbG9jYSAobGVuICogc2l6 ZW9mIChGTE9BVCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAg eworICAgICAgdGV4dF9leHRlbnRzX2ludGVybmFsIChkd3JpdGVfZm9udF9mYWNlLCBmb250 X3NpemUsIGdseXBocyArIGksIDEsCisJCQkgICAgICZtZXRyaWNzKTsKKyAgICAgIGFkdmFu Y2VzW2ldID0gbWV0cmljcy53aWR0aDsKKyAgICB9CisKKyAgRFdSSVRFX0dMWVBIX1JVTiBn bHlwaF9ydW47CisgIGdseXBoX3J1bi5mb250RmFjZSA9IGR3cml0ZV9mb250X2ZhY2U7Cisg IGdseXBoX3J1bi5mb250RW1TaXplID0gZm9udF9zaXplOworICBnbHlwaF9ydW4uZ2x5cGhJ bmRpY2VzID0gaW5kaWNlczsKKyAgZ2x5cGhfcnVuLmdseXBoQ291bnQgPSBsZW47CisgIGds eXBoX3J1bi5pc1NpZGV3YXlzID0gZmFsc2U7CisgIGdseXBoX3J1bi5iaWRpTGV2ZWwgPSAw OworICBnbHlwaF9ydW4uZ2x5cGhPZmZzZXRzID0gTlVMTDsKKyAgZ2x5cGhfcnVuLmdseXBo QWR2YW5jZXMgPSBhZHZhbmNlczsKKworICBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0 b3IgKmxheWVyczsKKyAgLyogVGhpcyBjYWxsIHdpbGwgdGVsbCB1cyBpZiB3ZSBoYWNlIHRv IGhhbmRsZSBhbnkgY29sb3IgZ2x5cGguICAqLworICBociA9IGR3cml0ZV9mYWN0b3J5Mi0+ bHBWdGJsLT5UcmFuc2xhdGVDb2xvckdseXBoUnVuIChkd3JpdGVfZmFjdG9yeTIsCisJCQkJ CQkJMCwgZm9udC0+YXNjZW50LAorCQkJCQkJCSZnbHlwaF9ydW4sCisJCQkJCQkJTlVMTCwK KwkJCQkJCQlNRUFTVVJJTkdfTU9ERSwKKwkJCQkJCQlOVUxMLAorCQkJCQkJCTAsCisJCQkJ CQkJJmxheWVycyk7CisKKyAgLyogTm8gY29sb3IuICBKdXN0IGRyYXcgdGhlIEdseXBoUnVu LiAgKi8KKyAgaWYgKGhyID09IERXUklURV9FX05PQ09MT1IpCisgICAgICBiaXRtYXBfcmVu ZGVyX3RhcmdldC0+bHBWdGJsLT5EcmF3R2x5cGhSdW4gKGJpdG1hcF9yZW5kZXJfdGFyZ2V0 LAorCQkJCQkJICAwLCBmb250LT5hc2NlbnQsCisJCQkJCQkgIE1FQVNVUklOR19NT0RFLAor CQkJCQkJICAmZ2x5cGhfcnVuLAorCQkJCQkJICByZW5kZXJpbmdfcGFyYW1zLAorCQkJCQkJ ICBjb2xvciwKKwkJCQkJCSAgTlVMTCk7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0 aGVyZSB3ZXJlIGNvbG9yIGdseXBocywgbGF5ZXJzIGNvbnRhaW5zIGEgbGlzdCBvZiBHbHlw aFJ1bgorCSB3aXRoIGEgY29sb3IgYW5kIGEgcG9zaXRpb24gZm9yIGVhY2guICBXZSBkcmF3 IHRoZW0KKwkgaW5kaXZpZHVhbGx5LiAgKi8KKyAgICAgIHZlcmlmeV9ociAoaHIsICJGYWls ZWQgYXQgVHJhbnNsYXRlQ29sb3JHbHlwaFJ1biIpOworICAgICAgZm9yICg7OykgeworCUhS RVNVTFQgaHI7CisJQk9PTCBtb3JlX2xheWVyczsKKwljb25zdCBEV1JJVEVfQ09MT1JfR0xZ UEhfUlVOICpsYXllcjsKKworCWhyID0gbGF5ZXJzLT5scFZ0YmwtPk1vdmVOZXh0IChsYXll cnMsICZtb3JlX2xheWVycyk7CisJdmVyaWZ5X2hyIChociwgIkZhaWxlZCBhdCBNb3ZlTmV4 dCIpOworCWlmICghbW9yZV9sYXllcnMpCisJICBicmVhazsKKwlociA9IGxheWVycy0+bHBW dGJsLT5HZXRDdXJyZW50UnVuIChsYXllcnMsICZsYXllcik7CisJdmVyaWZ5X2hyIChociwg IkZhaWxlZCBhdCBHZXRDdXJyZW50UnVuIik7CisJYml0bWFwX3JlbmRlcl90YXJnZXQtPmxw VnRibC0+RHJhd0dseXBoUnVuCisJICAoYml0bWFwX3JlbmRlcl90YXJnZXQsCisJICAgbGF5 ZXItPmJhc2VsaW5lT3JpZ2luWCwKKwkgICBsYXllci0+YmFzZWxpbmVPcmlnaW5ZLAorCSAg IE1FQVNVUklOR19NT0RFLAorCSAgICZsYXllci0+Z2x5cGhSdW4sCisJICAgcmVuZGVyaW5n X3BhcmFtcywKKwkgICBSR0IgKGxheWVyLT5ydW5Db2xvci5yICogMjU1LAorCQlsYXllci0+ cnVuQ29sb3IuZyAqIDI1NSwKKwkJbGF5ZXItPnJ1bkNvbG9yLmIgKiAyNTUpLAorCSAgIE5V TEwpOworICAgICAgfQorICAgICAgUkVMRUFTRV9DT00gKGxheWVycyk7CisgICAgfQorCisg IC8qIEZpbmFsbHksIGNvcHkgdGhlIHJlbmRlcmVkIHRleHQgYmFjayB0byB0aGUgb3JpZ2lu YWwgREMuICAqLworICBCaXRCbHQgKGhkYywgeCwgeSwgYml0bWFwX3dpZHRoLCBiaXRtYXBf aGVpZ2h0LCB0ZXh0X2RjLCAwLCAwLCBTUkNDT1BZKTsKK30KKworLyogUmV0dXJucyB0cnVl IGlmIERpcmVjdFdyaXRlIGlzIHRvIGJlIHVzZWQ6CisgICAtIEl0IGlzIGF2YWlsYWJsZS4K KyAgIC0gVGhlIGZvbnQgaXMgaGFuZGxlZCBieSBIYXJmQnV6ei4KKyAgIC0gdzMyLWluaGli aXQtZHdyaXRlIGlzIGZhbHNlLgorICovCitib29sCit3MzJfdXNlX2RpcmVjdF93cml0ZSAo c3RydWN0IHczMmZvbnRfaW5mbyAqdzMyZm9udCkKK3sKKyNpZmRlZiBIQVZFX0hBUkZCVVpa CisgIHJldHVybiBkaXJlY3Rfd3JpdGVfYXZhaWxhYmxlCisgICAgJiYgdzMyZm9udC0+Zm9u dC5kcml2ZXIgPT0gJmhhcmZidXp6X2ZvbnRfZHJpdmVyCisgICAgJiYgIXczMl9pbmhpYml0 X2R3cml0ZTsKKyNlbHNlCisgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0 IGEvc3JjL3czMmZvbnQuYyBiL3NyYy93MzJmb250LmMKaW5kZXggZWZiNDJkODAzMzYuLjE2 YWE5MzA4NTg0IDEwMDY0NAotLS0gYS9zcmMvdzMyZm9udC5jCisrKyBiL3NyYy93MzJmb250 LmMKQEAgLTU1LDYgKzU1LDEzIEBAICNkZWZpbmUgVklFVE5BTUVTRV9DSEFSU0VUIDE2Mwog I2RlZmluZSBKT0hBQl9DSEFSU0VUIDEzMAogI2VuZGlmCiAKKy8qIEZ1bmN0aW9uIHByb3Rv dHlwZXMgZnJvbSB3MzJ3cml0ZS5jICAqLworYm9vbCB3MzJfdXNlX2RpcmVjdF93cml0ZSAo c3RydWN0IHczMmZvbnRfaW5mbyAqdzMyZm9udCk7Cit2b2lkIHczMl9kd3JpdGVfZHJhdyAo SERDIGhkYywgaW50IHgsIGludCB5LCB1bnNpZ25lZCAqZ2x5cGhzLCBpbnQgbGVuLAorCQkg IENPTE9SUkVGIGNvbG9yLCBzdHJ1Y3QgZm9udCAqZm9udCApOwordm9pZCB3MzJfZHdyaXRl X3RleHRfZXh0ZW50cyAoc3RydWN0IGZvbnQgKmZvbnQsIGNvbnN0IHVuc2lnbmVkICpjb2Rl LAorCQkJICBpbnQgbmdseXBocywgc3RydWN0IGZvbnRfbWV0cmljcyAqbWV0cmljcyk7CisK IHN0YXRpYyB2b2lkIGZpbGxfaW5fbG9nZm9udCAoc3RydWN0IGZyYW1lICosIExPR0ZPTlQg KiwgTGlzcF9PYmplY3QpOwogCiBzdGF0aWMgQllURSB3MzJfYW50aWFsaWFzX3R5cGUgKExp c3BfT2JqZWN0KTsKQEAgLTQ1Miw2ICs0NTksMTIgQEAgdzMyZm9udF90ZXh0X2V4dGVudHMg KHN0cnVjdCBmb250ICpmb250LCBjb25zdCB1bnNpZ25lZCAqY29kZSwKIAogICBtZW1zZXQg KG1ldHJpY3MsIDAsIHNpemVvZiAoc3RydWN0IGZvbnRfbWV0cmljcykpOwogCisgIGlmICh3 MzJfdXNlX2RpcmVjdF93cml0ZSAodzMyX2ZvbnQpKQorICAgIHsKKyAgICAgIHczMl9kd3Jp dGVfdGV4dF9leHRlbnRzIChmb250LCBjb2RlLCBuZ2x5cGhzLCBtZXRyaWNzKTsKKyAgICAg IHJldHVybjsKKyAgICB9CisKICAgZm9yIChpID0gMCwgZmlyc3QgPSB0cnVlOyBpIDwgbmds eXBoczsgaSsrKQogICAgIHsKICAgICAgIHN0cnVjdCB3MzJfbWV0cmljX2NhY2hlICpjaGFy X21ldHJpYzsKQEAgLTcwNiwyMiArNzE5LDM2IEBAIHczMmZvbnRfZHJhdyAoc3RydWN0IGds eXBoX3N0cmluZyAqcywgaW50IGZyb20sIGludCB0bywKICAgICAgIGludCBpOwogCiAgICAg ICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JewotCSAgV0NIQVIgYyA9IHMtPmNoYXIy Yltmcm9tICsgaV0gJiAweEZGRkY7Ci0JICBFeHRUZXh0T3V0VyAocy0+aGRjLCB4ICsgaSwg eSwgb3B0aW9ucywgTlVMTCwgJmMsIDEsIE5VTEwpOwotCX0KKwlpZiAodzMyX3VzZV9kaXJl Y3Rfd3JpdGUgKHczMmZvbnQpKQorCSAgeworCSAgICB3MzJfZHdyaXRlX2RyYXcgKHMtPmhk YywgeCwgeSwgcy0+Y2hhcjJiICsgZnJvbSwgMSwKKwkJCSBHZXRUZXh0Q29sb3Iocy0+aGRj KSwgcy0+Zm9udCk7CisJICB9CisJZWxzZQorCSAgeworCSAgICBXQ0hBUiBjID0gcy0+Y2hh cjJiW2Zyb20gKyBpXSAmIDB4RkZGRjsKKwkgICAgRXh0VGV4dE91dFcgKHMtPmhkYywgeCAr IGksIHksIG9wdGlvbnMsIE5VTEwsICZjLCAxLCBOVUxMKTsKKwkgIH0KICAgICB9CiAgIGVs c2UKICAgICB7Ci0gICAgICAvKiBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiBhIGdseXBoX3N0 cmluZyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4KLQkgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhl ICd1c2VkJyBtZW1iZXIgb2YgYSBnbHlwaF9yb3csIHNvIHdlCi0JIGFyZSBPSyB1c2luZyBh bGxvY2EgaGVyZS4gICovCi0gICAgICBlYXNzZXJ0IChsZW4gPD0gU0hSVF9NQVgpOwotICAg ICAgV0NIQVIgKmNoYXJzID0gYWxsb2NhIChsZW4gKiBzaXplb2YgKFdDSEFSKSk7Ci0gICAg ICBpbnQgajsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykKLQljaGFyc1tqXSA9 IHMtPmNoYXIyYltmcm9tICsgal0gJiAweEZGRkY7Ci0gICAgICBFeHRUZXh0T3V0VyAocy0+ aGRjLCB4LCB5LCBvcHRpb25zLCBOVUxMLCBjaGFycywgbGVuLCBOVUxMKTsKKyAgICAgIGlm ICh3MzJfdXNlX2RpcmVjdF93cml0ZSAodzMyZm9udCkpCisJeworCSAgdzMyX2R3cml0ZV9k cmF3ICggcy0+aGRjLCB4LCB5LAorCQkJcy0+Y2hhcjJiICsgZnJvbSwgbGVuLCBHZXRUZXh0 Q29sb3Iocy0+aGRjKSwgcy0+Zm9udCApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBU aGUgbnVtYmVyIG9mIGdseXBocyBpbiBhIGdseXBoX3N0cmluZyBjYW5ub3QgYmUgbGFyZ2Vy IHRoYW4KKwkgICAgIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSAndXNlZCcgbWVtYmVyIG9m IGEgZ2x5cGhfcm93LCBzbyB3ZQorCSAgICAgYXJlIE9LIHVzaW5nIGFsbG9jYSBoZXJlLiAg Ki8KKwkgIGVhc3NlcnQgKGxlbiA8PSBTSFJUX01BWCk7CisJICBXQ0hBUiAqY2hhcnMgPSBh bGxvY2EgKGxlbiAqIHNpemVvZiAoV0NIQVIpKTsKKwkgIGludCBqOworCSAgZm9yIChqID0g MDsgaiA8IGxlbjsgaisrKQorCSAgICBjaGFyc1tqXSA9IHMtPmNoYXIyYltmcm9tICsgal0g JiAweEZGRkY7CisJICBFeHRUZXh0T3V0VyAocy0+aGRjLCB4LCB5LCBvcHRpb25zLCBOVUxM LCBjaGFycywgbGVuLCBOVUxMKTsKKwl9CiAgICAgfQogCiAgIC8qIFJlc3RvcmUgY2xpcCBy ZWdpb24uICAqLwpkaWZmIC0tZ2l0IGEvc3JjL3czMmZvbnQuaCBiL3NyYy93MzJmb250LmgK aW5kZXggM2Y3ODBjMWQ4NjYuLjA3NzRlOTJmYWE5IDEwMDY0NAotLS0gYS9zcmMvdzMyZm9u dC5oCisrKyBiL3NyYy93MzJmb250LmgKQEAgLTg0LDYgKzg0LDE5IEBAICNkZWZpbmUgQ0FD SEVfQkxPQ0tTSVpFIDEyOAogCiBMaXNwX09iamVjdCBpbnRlcm5fZm9udF9uYW1lIChjaGFy ICopOwogCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciBEaXJlY3RXcml0ZS4gICovCit2 b2lkIHczMl9pbml0aWFsaXplX2RpcmVjdF93cml0ZSAodm9pZCk7Citib29sIHczMl91c2Vf ZGlyZWN0X3dyaXRlIChzdHJ1Y3QgdzMyZm9udF9pbmZvICp3MzJmb250KTsKK3ZvaWQgdzMy X2R3cml0ZV9kcmF3IChIREMgaGRjLCBpbnQgeCwgaW50IHksIHVuc2lnbmVkICpnbHlwaHMs IGludCBsZW4sCisJCSAgICAgIENPTE9SUkVGIGNvbG9yLCBzdHJ1Y3QgZm9udCAqZm9udCAp Owordm9pZCB3MzJfZHdyaXRlX3RleHRfZXh0ZW50cyAoc3RydWN0IGZvbnQgKmZvbnQsIGNv bnN0IHVuc2lnbmVkICpjb2RlLAorCQkJICAgICAgaW50IG5nbHlwaHMsIHN0cnVjdCBmb250 X21ldHJpY3MgKm1ldHJpY3MpOwordW5zaWduZWQgdzMyX2R3cml0ZV9lbmNvZGVfY2hhciAo c3RydWN0IGZvbnQgKmZvbnQsIGludCBjKTsKK3ZvaWQgdzMyX2R3cml0ZV9mcmVlX2NhY2hl ZF9mYWNlKHZvaWQgKmNhY2hlKTsKK3ZvaWQgKnczMl9mb250X2dldF9kd3JpdGVfY2FjaGUg KHN0cnVjdCBmb250ICpmb250LCBmbG9hdCAqZm9udF9zaXplKTsKK3ZvaWQgdzMyX2ZvbnRf c2V0X2R3cml0ZV9jYWNoZSAoc3RydWN0IGZvbnQgKmZvbnQsIHZvaWQgKmNhY2hlLAorCQkJ CWZsb2F0IGZvbnRfc2l6ZSk7CisKIGV4dGVybiB2b2lkIGdsb2JhbHNfb2ZfdzMyZm9udCAo dm9pZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3czMnVuaXNjcmliZS5jIGIvc3Jj L3czMnVuaXNjcmliZS5jCmluZGV4IGI3N2JmNTZiOGNmLi45MmRmNDk2MTBiYiAxMDA2NDQK LS0tIGEvc3JjL3czMnVuaXNjcmliZS5jCisrKyBiL3NyYy93MzJ1bmlzY3JpYmUuYwpAQCAt NTQsOCArNTQsMjcgQEAgI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNjAwCiAgIHZvaWQgKmNh Y2hlOwogICAvKiBUaGlzIGlzIHVzZWQgYnkgdGhlIEhhcmZCdXp6IGJhY2tlbmQgdG8gc3Rv cmUgdGhlIGZvbnQgc2NhbGUuICAqLwogICBkb3VibGUgc2NhbGU7CisgIC8qIFRoaXMgaXMg dXNlZCBieSBEaXJlY3RXcml0ZSB0byBzdG9yZSB0aGUgRm9udEZhY2Ugb2JqZWN0LgorICAg ICBEaXJlY3RXcml0ZSB3b3JrcyBvbiB0b3Agb2YgdGhlIEhhcmZCdXp6IGJhY2tlbmQsIG1v ZGlmeWluZyBzb21lCisgICAgIGNhbGxzLiAgKi8KKyAgdm9pZCAqZHdyaXRlX2NhY2hlOwor ICBmbG9hdCBkd3JpdGVfZm9udF9zaXplOwogfTsKIAordm9pZCAqCit3MzJfZm9udF9nZXRf ZHdyaXRlX2NhY2hlIChzdHJ1Y3QgZm9udCAqZm9udCwgZmxvYXQgKmZvbnRfc2l6ZSkKK3sK KyAgKmZvbnRfc2l6ZSA9ICgoc3RydWN0IHVuaXNjcmliZV9mb250X2luZm8gKikgZm9udCkt PmR3cml0ZV9mb250X3NpemU7CisgIHJldHVybiAoKHN0cnVjdCB1bmlzY3JpYmVfZm9udF9p bmZvICopIGZvbnQpLT5kd3JpdGVfY2FjaGU7Cit9CisKK3ZvaWQKK3czMl9mb250X3NldF9k d3JpdGVfY2FjaGUgKHN0cnVjdCBmb250ICpmb250LCB2b2lkICpjYWNoZSwgZmxvYXQgZm9u dF9zaXplKQoreworICAoKHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICopIGZvbnQpLT5k d3JpdGVfZm9udF9zaXplID0gZm9udF9zaXplOworICAoKHN0cnVjdCB1bmlzY3JpYmVfZm9u dF9pbmZvICopIGZvbnQpLT5kd3JpdGVfY2FjaGUgPSBjYWNoZTsKK30KKwogaW50IHVuaXNj cmliZV9hdmFpbGFibGUgPSAwOwogCiAvKiBFbnVtRm9udEZhbWlsaWVzRXggY2FsbGJhY2su ICAqLwpAQCAtMjAwLDYgKzIxOSw3IEBAIHVuaXNjcmliZV9vcGVuIChzdHJ1Y3QgZnJhbWUg KmYsIExpc3BfT2JqZWN0IGZvbnRfZW50aXR5LCBpbnQgcGl4ZWxfc2l6ZSkKIAogICAvKiBJ bml0aWFsaXplIHRoZSBjYWNoZSBmb3IgdGhpcyBmb250LiAgKi8KICAgdW5pc2NyaWJlX2Zv bnQtPmNhY2hlID0gTlVMTDsKKyAgdW5pc2NyaWJlX2ZvbnQtPmR3cml0ZV9jYWNoZSA9IE5V TEw7CiAKICAgLyogVW5pc2NyaWJlIGFuZCBIYXJmQnV6eiBiYWNrZW5kcyB1c2UgZ2x5cGgg aW5kaWNlcy4gICovCiAgIHVuaXNjcmliZV9mb250LT53MzJfZm9udC5nbHlwaF9pZHggPSBF VE9fR0xZUEhfSU5ERVg7CkBAIC0yMjEsNiArMjQxLDcgQEAgdW5pc2NyaWJlX2Nsb3NlIChz dHJ1Y3QgZm9udCAqZm9udCkKICAgICA9IChzdHJ1Y3QgdW5pc2NyaWJlX2ZvbnRfaW5mbyAq KSBmb250OwogCiAjaWZkZWYgSEFWRV9IQVJGQlVaWgorICB3MzJfZHdyaXRlX2ZyZWVfY2Fj aGVkX2ZhY2UgKHVuaXNjcmliZV9mb250LT5kd3JpdGVfY2FjaGUpOwogICBpZiAodW5pc2Ny aWJlX2ZvbnQtPnczMl9mb250LmZvbnQuZHJpdmVyID09ICZoYXJmYnV6el9mb250X2RyaXZl cgogICAgICAgJiYgdW5pc2NyaWJlX2ZvbnQtPmNhY2hlKQogICAgIGhiX2ZvbnRfZGVzdHJv eSAoKGhiX2ZvbnRfdCAqKSB1bmlzY3JpYmVfZm9udC0+Y2FjaGUpOwpAQCAtMTM3Miw2ICsx MzkzLDEwIEBAIHczMmhiX2VuY29kZV9jaGFyIChzdHJ1Y3QgZm9udCAqZm9udCwgaW50IGMp CiAgIHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICp1bmlzY3JpYmVfZm9udAogICAgID0g KHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICopIGZvbnQ7CiAgIGVhc3NlcnQgKHVuaXNj cmliZV9mb250LT53MzJfZm9udC5mb250LmRyaXZlciA9PSAmaGFyZmJ1enpfZm9udF9kcml2 ZXIpOworCisgIGlmICh3MzJfdXNlX2RpcmVjdF93cml0ZSgmdW5pc2NyaWJlX2ZvbnQtPncz Ml9mb250KSkKKyAgICAgIHJldHVybiB3MzJfZHdyaXRlX2VuY29kZV9jaGFyKGZvbnQsIGMp OworCiAgIGhiX2ZvbnRfdCAqaGJfZm9udCA9IHVuaXNjcmliZV9mb250LT5jYWNoZTsKIAog ICAvKiBGaXJzdCB0aW1lIHdlIHVzZSB0aGlzIGZvbnQgd2l0aCBIYXJmQnV6eiwgY3JlYXRl IHRoZSBoYl9mb250X3QKQEAgLTE1MzEsNiArMTU1Niw4IEBAIGxvYWRfaGFyZmJ1enpfZnVu Y3MgKEhNT0RVTEUgbGlicmFyeSkKIH0KICNlbmRpZgkvKiBIQVZFX0hBUkZCVVpaICovCiAK K3ZvaWQgdzMyX2luaXRpYWxpemVfZGlyZWN0X3dyaXRlICh2b2lkKTsKKwogc3RhdGljIHZv aWQKIHN5bXNfb2ZfdzMydW5pc2NyaWJlX2Zvcl9wZHVtcGVyICh2b2lkKQogewpAQCAtMTYy NCw1ICsxNjUxLDggQEAgc3ltc19vZl93MzJ1bmlzY3JpYmVfZm9yX3BkdW1wZXIgKHZvaWQp CiAgIGhhcmZidXp6X2ZvbnRfZHJpdmVyLmNvbWJpbmluZ19jYXBhYmlsaXR5ID0gaGJmb250 X2NvbWJpbmluZ19jYXBhYmlsaXR5OwogICBoYXJmYnV6el9mb250X2RyaXZlci5iZWdpbl9o Yl9mb250ID0gdzMyaGJfYmVnaW5fZm9udDsKICAgcmVnaXN0ZXJfZm9udF9kcml2ZXIgKCZo YXJmYnV6el9mb250X2RyaXZlciwgTlVMTCk7CisKKyAgdzMyX2luaXRpYWxpemVfZGlyZWN0 X3dyaXRlICgpOworCiAjZW5kaWYJLyogSEFWRV9IQVJGQlVaWiAqLwogfQotLSAKMi4zNS4x LndpbmRvd3MuMgoK --------------CMM8u6zkSLlV8TvGrxxH8USa--