From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Philipp Stephani Newsgroups: gmane.emacs.devel Subject: Re: JSON/YAML/TOML/etc. parsing performance Date: Tue, 19 Sep 2017 08:18:14 +0000 Message-ID: References: <87poaqhc63.fsf@lifelogs.com> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="001a113d688cdb87d20559868062" X-Trace: blaine.gmane.org 1505809124 31000 195.159.176.226 (19 Sep 2017 08:18:44 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Tue, 19 Sep 2017 08:18:44 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Sep 19 10:18:38 2017 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1duDjo-0007g6-Q8 for ged-emacs-devel@m.gmane.org; Tue, 19 Sep 2017 10:18:37 +0200 Original-Received: from localhost ([::1]:40721 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1duDjw-0001kq-1a for ged-emacs-devel@m.gmane.org; Tue, 19 Sep 2017 04:18:44 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:60164) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1duDji-0001kE-Ou for emacs-devel@gnu.org; Tue, 19 Sep 2017 04:18:34 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1duDjf-00006L-40 for emacs-devel@gnu.org; Tue, 19 Sep 2017 04:18:30 -0400 Original-Received: from mail-io0-x230.google.com ([2607:f8b0:4001:c06::230]:50301) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1duDje-000069-PE for emacs-devel@gnu.org; Tue, 19 Sep 2017 04:18:27 -0400 Original-Received: by mail-io0-x230.google.com with SMTP id w94so8127055ioi.7 for ; Tue, 19 Sep 2017 01:18:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=yNPi31cLCGHGMwlK/MYWH6JiQsESVJFQPJAu4Wo1tXY=; b=lZDqZOpBUQt0qNTsnalAXe/DEvC4lIvyfLM2gkiioCPwVYvjGdylSG2Jvk1reyV4m4 vTUPBKSfjfCleDNqFTW+7f5AMMJgIzUfIc7+02m0VIW3cU8vPyftEkv0UMsDvRlZwt5M rENfTs5VYO6JaIMs2APeTLW5dK45IiBWFSjPLznsOohWMPoXcROkDY21IdiIWE4pjFqg XFW557iOlNw87kDkmH06MGENPm/Tup2wEhmkr+ZaJ3d1kTp/l2Yy/YWtwAwO03ZDc5+w 0tEKrqEsTmUd8qLMzF24PqbWKnWQ47s4rqc3yGyH7O3pwkM+Nkr7/4f6ubuGm1XghClR p8Iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=yNPi31cLCGHGMwlK/MYWH6JiQsESVJFQPJAu4Wo1tXY=; b=VNMPn9jqePa7FZAwykVMf5p0qQpH1hF5PqtWFA90J+l9ruPYhO4PnyRSBpxi14GIjj 8qbET5cyyb6klbhxTZtrA6yOFohXwN6NgqLAlZS2Vkwdfkb+0AFWLlrKlsZBMwg13pMU RAhuDKOZ3oPlp3kLBclpsYnA33V2Ol1TzXrW3ZvW2/FegdFspz/84vwP7hQVTxD+5Ejl 0lUELCUqDBgRsiE6/YgHccu7bEdoJyJBqViZSk25M38vrQ3Am40ZSiNp5nQsCEus+ByO /Jl9XRhB1nHUVG5nLXvBe+ezc8s3cLFHxz9hIauwysU9APffbuV0L2T+ro07Ys6l8etg pxnQ== X-Gm-Message-State: AHPjjUjBYjsRGt4dxQnc97LxYteCcdVEh7AkIkwdUQoxS/V8PxahOd6n JYzAEUbOPfvfPHItWJQXPByjabjdvE3ZIuDfha7s7w== X-Google-Smtp-Source: AOwi7QCeMedIgjpsI2KJE73DNSiTaw6mgIU+faqIeRkvNQezNlcR5zg5aTDgtTcVEkS4bqbK9IpkiPyevArn7qkuEjQ= X-Received: by 10.202.66.196 with SMTP id p187mr546522oia.52.1505809105903; Tue, 19 Sep 2017 01:18:25 -0700 (PDT) In-Reply-To: X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4001:c06::230 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:218507 Archived-At: --001a113d688cdb87d20559868062 Content-Type: multipart/alternative; boundary="001a113d688cdb87cd0559868060" --001a113d688cdb87cd0559868060 Content-Type: text/plain; charset="UTF-8" Philipp Stephani schrieb am Mo., 18. Sep. 2017 um 15:26 Uhr: > Philipp Stephani schrieb am So., 17. Sep. 2017 um > 20:46 Uhr: > >> Ted Zlatanov schrieb am Sa., 16. Sep. 2017 um >> 17:55 Uhr: >> >>> I wanted to ask if there's any chance of improving the parsing >>> performance of JSON, YAML, TOML, and similar data formats. It's pretty >>> poor today. >>> >>> That could be done in the core with C code, improved Lisp code, >>> integration with an external library, or a mix of those. >>> >> >> I don't know much about the others, but given the importance of JSON as >> data exchange and serialization format, I think it's worthwhile to invest >> some time here. I've implemented a wrapper around the json-c library >> (license: Expat/X11/MIT), resulting in significant speedups using the test >> data from https://github.com/miloyip/nativejson-benchmark: a factor of >> 3.9 to 6.4 for parsing, and a factor of 27 to 67 for serializing. If people >> agree that this is useful I can send a patch. >> > > I've discovered that the interface and documentation of Jansson are much > better than the ones of json-c, so I switched to Jansson. I've attached a > patch. > Here's a newer version of the patch. The only significant difference is that now the Lisp values for JSON null and false are :null and :false, respectively. Using a dedicated symbol for :null reduces the mental overhead of the triple meaning of nil (null, false, empty list), and is more future-proof, should we ever want to support lists. --001a113d688cdb87cd0559868060 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


Philip= p Stephani <p.stephani2@gmail.c= om> schrieb am Mo., 18. Sep. 2017 um 15:26=C2=A0Uhr:
Philipp Stephani <p.stephani2@gmail.com> schrieb am So., 17. Sep. 2017= um 20:46=C2=A0Uhr:
Ted Zlatanov <tzz@lifelogs.com> schrieb = am Sa., 16. Sep. 2017 um 17:55=C2=A0Uhr:
I wanted to ask if there's any chance of improving the parsing performance of JSON, YAML, TOML, and similar data formats. It's pretty<= br> poor today.

That could be done in the core with C code, improved Lisp code,
integration with an external library, or a mix of those.

I don't know much about the others, but given the importa= nce of JSON as data exchange and serialization format, I think it's wor= thwhile to invest some time here. I've implemented a wrapper around the= json-c library (license: Expat/X11/MIT), resulting in significant speedups= using the test data from https://github.com/miloyip/nativejson-benchmar= k: a factor of 3.9 to 6.4 for parsing, and a factor of 27 to 67 for ser= ializing. If people agree that this is useful I can send a patch.

I've discovered that the interface and documentat= ion of Jansson are much better than the ones of json-c, so I switched to Ja= nsson. I've attached a patch.

Here's a newer version of the patch. The only significant diff= erence is that now the Lisp values for JSON null and false are :null and :f= alse, respectively. Using a dedicated symbol for :null reduces the mental o= verhead of the triple meaning of nil (null, false, empty list), and is more= future-proof, should we ever want to support lists.=C2=A0
--001a113d688cdb87cd0559868060-- --001a113d688cdb87d20559868062 Content-Type: text/plain; charset="UTF-8"; name="0001-Implement-native-JSON-support-using-Jansson.txt" Content-Disposition: attachment; filename="0001-Implement-native-JSON-support-using-Jansson.txt" Content-Transfer-Encoding: base64 Content-ID: <15e99375def1bd849ac1> X-Attachment-Id: 15e99375def1bd849ac1 RnJvbSBlNDVmMThjZGFlYzRiOWUwN2FhNTMxNTkwODNkNzYwMTc4ODMzYmYwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQaGlsaXBwIFN0ZXBoYW5pIDxwaHN0QGdvb2dsZS5jb20+CkRh dGU6IE1vbiwgMTggU2VwIDIwMTcgMTA6NTE6MzkgKzAyMDAKU3ViamVjdDogW1BBVENIXSBJbXBs ZW1lbnQgbmF0aXZlIEpTT04gc3VwcG9ydCB1c2luZyBKYW5zc29uCgoqIGNvbmZpZ3VyZS5hYzog TmV3IG9wdGlvbiAtLXdpdGgtanNvbi4KCiogc3JjL2pzb24uYyAoRmpzb25fc2VyaWFsaXplLCBG anNvbl9pbnNlcnQsIEZqc29uX3BhcnNlX3N0cmluZykKKEZqc29uX3BhcnNlX2J1ZmZlcik6IE5l dyBkZWZ1bnMuCihqc29uX291dF9vZl9tZW1vcnksIGpzb25fcGFyc2VfZXJyb3IsIGpzb25fcmVs ZWFzZV9vYmplY3QpCihjaGVja19zdHJpbmdfd2l0aG91dF9lbWJlZGRlZF9udWxscywganNvbl9j aGVjaywgbGlzcF90b19qc29uKQooanNvbl9pbnNlcnQsIGpzb25faW5zZXJ0X2NhbGxiYWNrLCBq c29uX3RvX2xpc3ApCihqc29uX3JlYWRfYnVmZmVyX2NhbGxiYWNrLCBGanNvbl9wYXJzZV9idWZm ZXIsIGRlZmluZV9lcnJvcik6IE5ldwpoZWxwZXIgZnVuY3Rpb24uCihzeW1zX29mX2pzb24pOiBO ZXcgZmlsZS4KCiogc3JjL2xpc3AuaDogRGVjbGFyYXRpb24gZm9yIHN5bXNfb2ZfanNvbi4KCiog c3JjL2NvbmZfcG9zdC5oIChBVFRSSUJVVEVfV0FSTl9VTlVTRURfUkVTVUxUKTogTmV3IGF0dHJp YnV0ZSBtYWNyby4KCiogc3JjL2VtYWNzLmMgKG1haW4pOiBFbmFibGUgSlNPTiBmdW5jdGlvbnMu CgoqIHNyYy9NYWtlZmlsZS5pbiAoSlNPTl9MSUJTLCBKU09OX0NGTEFHUywgSlNPTl9PQkosIEVN QUNTX0NGTEFHUykKKGJhc2Vfb2JqLCBMSUJFUyk6IENvbXBpbGUganNvbi5jIGlmIC0td2l0aC1q c29uIGlzIGVuYWJsZWQuCgoqIHRlc3Qvc3JjL2pzb24tdGVzdHMuZWwgKGpzb24tc2VyaWFsaXpl L3JvdW5kdHJpcCkKKGpzb24tc2VyaWFsaXplL29iamVjdCwganNvbi1wYXJzZS1zdHJpbmcvb2Jq ZWN0KTogTmV3IHVuaXQgdGVzdHMuCi0tLQogY29uZmlndXJlLmFjICAgICAgICAgICB8ICAyMCAr Ky0KIHNyYy9NYWtlZmlsZS5pbiAgICAgICAgfCAgMTEgKy0KIHNyYy9jb25mX3Bvc3QuaCAgICAg ICAgfCAgIDYgKwogc3JjL2VtYWNzLmMgICAgICAgICAgICB8ICAgNCArCiBzcmMvanNvbi5jICAg ICAgICAgICAgIHwgNDYxICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysKIHNyYy9saXNwLmggICAgICAgICAgICAgfCAgIDUgKwogdGVzdC9zcmMvanNvbi10 ZXN0cy5lbCB8ICA2MSArKysrKysrCiA3IGZpbGVzIGNoYW5nZWQsIDU2NCBpbnNlcnRpb25zKCsp LCA0IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9qc29uLmMKIGNyZWF0ZSBt b2RlIDEwMDY0NCB0ZXN0L3NyYy9qc29uLXRlc3RzLmVsCgpkaWZmIC0tZ2l0IGEvY29uZmlndXJl LmFjIGIvY29uZmlndXJlLmFjCmluZGV4IDM1YjdlNjlkYWYuLjAzYWQyNDRkMzcgMTAwNjQ0Ci0t LSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUuYWMKQEAgLTM0OCw2ICszNDgsNyBAQCBB Q19ERUZVTgogT1BUSU9OX0RFRkFVTFRfT0ZGKFtjYWlyb10sW2NvbXBpbGUgd2l0aCBDYWlybyBk cmF3aW5nIChleHBlcmltZW50YWwpXSkKIE9QVElPTl9ERUZBVUxUX09OKFt4bWwyXSxbZG9uJ3Qg Y29tcGlsZSB3aXRoIFhNTCBwYXJzaW5nIHN1cHBvcnRdKQogT1BUSU9OX0RFRkFVTFRfT04oW2lt YWdlbWFnaWNrXSxbZG9uJ3QgY29tcGlsZSB3aXRoIEltYWdlTWFnaWNrIGltYWdlIHN1cHBvcnRd KQorT1BUSU9OX0RFRkFVTFRfT04oW2pzb25dLCBbZG9uJ3QgY29tcGlsZSB3aXRoIG5hdGl2ZSBK U09OIHN1cHBvcnRdKQogCiBPUFRJT05fREVGQVVMVF9PTihbeGZ0XSxbZG9uJ3QgdXNlIFhGVCBm b3IgYW50aSBhbGlhc2VkIGZvbnRzXSkKIE9QVElPTl9ERUZBVUxUX09OKFtsaWJvdGZdLFtkb24n dCB1c2UgbGlib3RmIGZvciBPcGVuVHlwZSBmb250IHN1cHBvcnRdKQpAQCAtMjg1Niw2ICsyODU3 LDIyIEBAIEFDX0RFRlVOCiBBQ19TVUJTVChMSUJTWVNURU1EX0xJQlMpCiBBQ19TVUJTVChMSUJT WVNURU1EX0NGTEFHUykKIAorSEFWRV9KU09OPW5vCitKU09OX09CSj0KKworaWYgdGVzdCAiJHt3 aXRoX2pzb259IiA9IHllczsgdGhlbgorICBFTUFDU19DSEVDS19NT0RVTEVTKFtKU09OXSwgW2ph bnNzb24gPj0gMi41XSwKKyAgICBbSEFWRV9KU09OPXllc10sIFtIQVZFX0pTT049bm9dKQorICBp ZiB0ZXN0ICIke0hBVkVfSlNPTn0iID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfSlNP TiwgMSwgW0RlZmluZSBpZiB1c2luZyBKYW5zc29uLl0pCisgICAgSlNPTl9PQko9anNvbi5vCisg IGZpCitmaQorCitBQ19TVUJTVChKU09OX0xJQlMpCitBQ19TVUJTVChKU09OX0NGTEFHUykKK0FD X1NVQlNUKEpTT05fT0JKKQorCiBOT1RJRllfT0JKPQogTk9USUZZX1NVTU1BUlk9bm8KIApAQCAt NTM2OCw3ICs1Mzg1LDcgQEAgQUNfREVGVU4KIGZvciBvcHQgaW4gWEFXM0QgWFBNIEpQRUcgVElG RiBHSUYgUE5HIFJTVkcgQ0FJUk8gSU1BR0VNQUdJQ0sgU09VTkQgR1BNIERCVVMgXAogICBHQ09O RiBHU0VUVElOR1MgTk9USUZZIEFDTCBMSUJTRUxJTlVYIEdOVVRMUyBMSUJYTUwyIEZSRUVUWVBF IE0xN05fRkxUIFwKICAgTElCT1RGIFhGVCBaTElCIFRPT0xLSVRfU0NST0xMX0JBUlMgWF9UT09M S0lUIE9MRFhNRU5VIFgxMSBOUyBNT0RVTEVTIFwKLSAgWFdJREdFVFMgTElCU1lTVEVNRCBDQU5O T1RfRFVNUCBMQ01TMjsgZG8KKyAgWFdJREdFVFMgTElCU1lTVEVNRCBKU09OIENBTk5PVF9EVU1Q IExDTVMyOyBkbwogCiAgICAgY2FzZSAkb3B0IGluCiAgICAgICBDQU5OT1RfRFVNUCkgZXZhbCB2 YWw9XCR7JG9wdH0gOzsKQEAgLTU0MTgsNiArNTQzNSw3IEBAIEFDX0RFRlVOCiAgIERvZXMgRW1h Y3MgdXNlIC1sb3RmPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtIQVZFX0xJ Qk9URn0KICAgRG9lcyBFbWFjcyB1c2UgLWx4ZnQ/ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAke0hBVkVfWEZUfQogICBEb2VzIEVtYWNzIHVzZSAtbHN5c3RlbWQ/ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICR7SEFWRV9MSUJTWVNURU1EfQorICBEb2VzIEVtYWNzIHVz ZSAtbGphbnNzb24/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7SEFWRV9KU09OfQog ICBEb2VzIEVtYWNzIGRpcmVjdGx5IHVzZSB6bGliPyAgICAgICAgICAgICAgICAgICAgICAgICAg ICR7SEFWRV9aTElCfQogICBEb2VzIEVtYWNzIGhhdmUgZHluYW1pYyBtb2R1bGVzIHN1cHBvcnQ/ ICAgICAgICAgICAgICAgICR7SEFWRV9NT0RVTEVTfQogICBEb2VzIEVtYWNzIHVzZSB0b29sa2l0 IHNjcm9sbCBiYXJzPyAgICAgICAgICAgICAgICAgICAgICR7VVNFX1RPT0xLSVRfU0NST0xMX0JB UlN9CmRpZmYgLS1naXQgYS9zcmMvTWFrZWZpbGUuaW4gYi9zcmMvTWFrZWZpbGUuaW4KaW5kZXgg MGU1NWFkNGJiMi4uNGQzMzY4MjYyOSAxMDA2NDQKLS0tIGEvc3JjL01ha2VmaWxlLmluCisrKyBi L3NyYy9NYWtlZmlsZS5pbgpAQCAtMzEyLDYgKzMxMiwxMCBAQCBMSUJHTlVUTFNfQ0ZMQUdTID0K IExJQlNZU1RFTURfTElCUyA9IEBMSUJTWVNURU1EX0xJQlNACiBMSUJTWVNURU1EX0NGTEFHUyA9 IEBMSUJTWVNURU1EX0NGTEFHU0AKIAorSlNPTl9MSUJTID0gQEpTT05fTElCU0AKK0pTT05fQ0ZM QUdTID0gQEpTT05fQ0ZMQUdTQAorSlNPTl9PQkogPSBASlNPTl9PQkpACisKIElOVEVSVkFMU19I ID0gZGlzcGV4dGVybi5oIGludGVydmFscy5oIGNvbXBvc2l0ZS5oCiAKIEdFVExPQURBVkdfTElC UyA9IEBHRVRMT0FEQVZHX0xJQlNACkBAIC0zNjMsNyArMzY3LDcgQEAgRU1BQ1NfQ0ZMQUdTPQog ICAkKFdFQktJVF9DRkxBR1MpIFwKICAgJChTRVRUSU5HU19DRkxBR1MpICQoRlJFRVRZUEVfQ0ZM QUdTKSAkKEZPTlRDT05GSUdfQ0ZMQUdTKSBcCiAgICQoTElCT1RGX0NGTEFHUykgJChNMTdOX0ZM VF9DRkxBR1MpICQoREVQRkxBR1MpIFwKLSAgJChMSUJTWVNURU1EX0NGTEFHUykgXAorICAkKExJ QlNZU1RFTURfQ0ZMQUdTKSAkKEpTT05fQ0ZMQUdTKSBcCiAgICQoTElCR05VVExTX0NGTEFHUykg JChOT1RJRllfQ0ZMQUdTKSAkKENBSVJPX0NGTEFHUykgXAogICAkKFdFUlJPUl9DRkxBR1MpCiBB TExfQ0ZMQUdTID0gJChFTUFDU19DRkxBR1MpICQoV0FSTl9DRkxBR1MpICQoQ0ZMQUdTKQpAQCAt Mzk3LDcgKzQwMSw3IEBAIGJhc2Vfb2JqID0KIAl0aHJlYWQubyBzeXN0aHJlYWQubyBcCiAJJChp ZiAkKEhZQlJJRF9NQUxMT0MpLHNoZWFwLm8pIFwKIAkkKE1TRE9TX09CSikgJChNU0RPU19YX09C SikgJChOU19PQkopICQoQ1lHV0lOX09CSikgJChGT05UX09CSikgXAotCSQoVzMyX09CSikgJChX SU5ET1dfU1lTVEVNX09CSikgJChYR1NFTE9CSikKKwkkKFczMl9PQkopICQoV0lORE9XX1NZU1RF TV9PQkopICQoWEdTRUxPQkopICQoSlNPTl9PQkopCiBvYmogPSAkKGJhc2Vfb2JqKSAkKE5TX09C SkNfT0JKKQogCiAjIyBPYmplY3QgZmlsZXMgdXNlZCBvbiBzb21lIG1hY2hpbmUgb3Igb3RoZXIu CkBAIC00OTMsNyArNDk3LDggQEAgTElCRVMgPQogICAgJChMSUJTX1RFUk1DQVApICQoR0VUTE9B REFWR19MSUJTKSAkKFNFVFRJTkdTX0xJQlMpICQoTElCU0VMSU5VWF9MSUJTKSBcCiAgICAkKEZS RUVUWVBFX0xJQlMpICQoRk9OVENPTkZJR19MSUJTKSAkKExJQk9URl9MSUJTKSAkKE0xN05fRkxU X0xJQlMpIFwKICAgICQoTElCR05VVExTX0xJQlMpICQoTElCX1BUSFJFQUQpICQoR0VUQUREUklO Rk9fQV9MSUJTKSAkKExJQkxDTVMyKSBcCi0gICAkKE5PVElGWV9MSUJTKSAkKExJQl9NQVRIKSAk KExJQlopICQoTElCTU9EVUxFUykgJChMSUJTWVNURU1EX0xJQlMpCisgICAkKE5PVElGWV9MSUJT KSAkKExJQl9NQVRIKSAkKExJQlopICQoTElCTU9EVUxFUykgJChMSUJTWVNURU1EX0xJQlMpIFwK KyAgICQoSlNPTl9MSUJTKQogCiAjIyBGT1JDRSBpdCBzbyB0aGF0IGFkbWluL3VuaWRhdGEgY2Fu IGRlY2lkZSB3aGV0aGVyIHRoZXNlIGZpbGVzCiAjIyBhcmUgdXAtdG8tZGF0ZS4gIEFsdGhvdWdo IHNpbmNlIGNoYXJwcm9wIGRlcGVuZHMgb24gYm9vdHN0cmFwLWVtYWNzLApkaWZmIC0tZ2l0IGEv c3JjL2NvbmZfcG9zdC5oIGIvc3JjL2NvbmZfcG9zdC5oCmluZGV4IGZlYmRiOGI4YmYuLjFhN2Y1 MWZhNTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb25mX3Bvc3QuaAorKysgYi9zcmMvY29uZl9wb3N0LmgK QEAgLTMzOCw2ICszMzgsMTIgQEAgZXh0ZXJuIGludCBlbWFjc19zZXRlbnZfVFogKGNoYXIgY29u c3QgKik7CiAjIGRlZmluZSBBVFRSSUJVVEVfTk9fU0FOSVRJWkVfQUREUkVTUwogI2VuZGlmCiAK KyNpZiBfX2hhc19hdHRyaWJ1dGUgKHdhcm5fdW51c2VkX3Jlc3VsdCkKKyMgZGVmaW5lIEFUVFJJ QlVURV9XQVJOX1VOVVNFRF9SRVNVTFQgX19hdHRyaWJ1dGVfXyAoKF9fd2Fybl91bnVzZWRfcmVz dWx0X18pKQorI2Vsc2UKKyMgZGVmaW5lIEFUVFJJQlVURV9XQVJOX1VOVVNFRF9SRVNVTFQKKyNl bmRpZgorCiAvKiBnY2MgLWZzYW5pdGl6ZT1hZGRyZXNzIGRvZXMgbm90IHdvcmsgd2l0aCB2Zm9y ayBpbiBGZWRvcmEgMjUgeDg2LTY0LgogICAgRm9yIG5vdywgYXNzdW1lIHRoYXQgdGhpcyBwcm9i bGVtIG9jY3VycyBvbiBhbGwgcGxhdGZvcm1zLiAgKi8KICNpZiBBRERSRVNTX1NBTklUSVpFUiAm JiAhZGVmaW5lZCB2Zm9yawpkaWZmIC0tZ2l0IGEvc3JjL2VtYWNzLmMgYi9zcmMvZW1hY3MuYwpp bmRleCAxYWQ4YWY3MGE3Li5lYjVmMTEyOGY2IDEwMDY0NAotLS0gYS9zcmMvZW1hY3MuYworKysg Yi9zcmMvZW1hY3MuYwpAQCAtMTYxMCw2ICsxNjEwLDEwIEBAIFVzaW5nIGFuIEVtYWNzIGNvbmZp Z3VyZWQgd2l0aCAtLXdpdGgteC10b29sa2l0PWx1Y2lkIGRvZXMgbm90IGhhdmUgdGhpcyBwcm9i bGVtCiAgICAgICBzeW1zX29mX3RocmVhZHMgKCk7CiAgICAgICBzeW1zX29mX3Byb2ZpbGVyICgp OwogCisjaWZkZWYgSEFWRV9KU09OCisgICAgICBzeW1zX29mX2pzb24gKCk7CisjZW5kaWYKKwog ICAgICAga2V5c19vZl9jYXNlZmlkZGxlICgpOwogICAgICAga2V5c19vZl9jbWRzICgpOwogICAg ICAga2V5c19vZl9idWZmZXIgKCk7CmRpZmYgLS1naXQgYS9zcmMvanNvbi5jIGIvc3JjL2pzb24u YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi43MzYyYjQ1MTY1Ci0tLSAv ZGV2L251bGwKKysrIGIvc3JjL2pzb24uYwpAQCAtMCwwICsxLDQ2MSBAQAorLyogSlNPTiBwYXJz aW5nIGFuZCBzZXJpYWxpemF0aW9uLgorCitDb3B5cmlnaHQgKEMpIDIwMTcgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFjcy4KKwor R05VIEVtYWNzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v ciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRo ZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKK3lvdXIgb3B0aW9uKSBhbnkgbGF0 ZXIgdmVyc2lvbi4KKworR05VIEVtYWNzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR05VIEVtYWNzLiAg SWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpbmNs dWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5o PgorCisjaW5jbHVkZSA8amFuc3Nvbi5oPgorCisjaW5jbHVkZSAibGlzcC5oIgorI2luY2x1ZGUg ImJ1ZmZlci5oIgorCitzdGF0aWMgX05vcmV0dXJuIHZvaWQKK2pzb25fb3V0X29mX21lbW9yeSAo dm9pZCkKK3sKKyAgeHNpZ25hbDAgKFFqc29uX291dF9vZl9tZW1vcnkpOworfQorCitzdGF0aWMg X05vcmV0dXJuIHZvaWQKK2pzb25fcGFyc2VfZXJyb3IgKGNvbnN0IGpzb25fZXJyb3JfdCAqZXJy b3IpCit7CisgIHhzaWduYWwgKFFqc29uX3BhcnNlX2Vycm9yLAorICAgICAgICAgICBsaXN0NSAo YnVpbGRfc3RyaW5nIChlcnJvci0+dGV4dCksIGJ1aWxkX3N0cmluZyAoZXJyb3ItPnNvdXJjZSks CisgICAgICAgICAgICAgICAgICBtYWtlX25hdG51bSAoZXJyb3ItPmxpbmUpLCBtYWtlX25hdG51 bSAoZXJyb3ItPmNvbHVtbiksCisgICAgICAgICAgICAgICAgICBtYWtlX25hdG51bSAoZXJyb3It PnBvc2l0aW9uKSkpOworfQorCitzdGF0aWMgdm9pZAoranNvbl9yZWxlYXNlX29iamVjdCAodm9p ZCAqb2JqZWN0KQoreworICBqc29uX2RlY3JlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQK K2NoZWNrX3N0cmluZ193aXRob3V0X2VtYmVkZGVkX251bGxzIChMaXNwX09iamVjdCBvYmplY3Qp Cit7CisgIENIRUNLX1NUUklORyAob2JqZWN0KTsKKyAgQ0hFQ0tfVFlQRSAobWVtY2hyIChTREFU QSAob2JqZWN0KSwgJ1wwJywgU0JZVEVTIChvYmplY3QpKSA9PSBOVUxMLAorICAgICAgICAgICAg ICBRc3RyaW5nX3dpdGhvdXRfZW1iZWRkZWRfbnVsbHNfcCwgb2JqZWN0KTsKK30KKworc3RhdGlj IEFUVFJJQlVURV9XQVJOX1VOVVNFRF9SRVNVTFQganNvbl90ICoKK2pzb25fY2hlY2sgKGpzb25f dCAqb2JqZWN0KQoreworICBpZiAob2JqZWN0ID09IE5VTEwpCisgICAganNvbl9vdXRfb2ZfbWVt b3J5ICgpOworICByZXR1cm4gb2JqZWN0OworfQorCitzdGF0aWMganNvbl90ICpsaXNwX3RvX2pz b24gKExpc3BfT2JqZWN0KSBBVFRSSUJVVEVfV0FSTl9VTlVTRURfUkVTVUxUOworCisvKiBUaGlz IHJldHVybnMgTGlzcF9PYmplY3Qgc28gd2UgY2FuIHVzZSB1bmJpbmRfdG8uICBUaGUgcmV0dXJu IHZhbHVlCisgICBpcyBhbHdheXMgbmlsLiAgKi8KKworc3RhdGljICBfR0xfQVJHX05PTk5VTEwg KCgyKSkgTGlzcF9PYmplY3QKK2xpc3BfdG9fanNvbl8xIChMaXNwX09iamVjdCBsaXNwLCBqc29u X3QgKipqc29uKQoreworICBpZiAoVkVDVE9SUCAobGlzcCkpCisgICAgeworICAgICAgcHRyZGlm Zl90IHNpemUgPSBBU0laRSAobGlzcCk7CisgICAgICBlYXNzZXJ0IChzaXplID49IDApOworICAg ICAgaWYgKHNpemUgPiBTSVpFX01BWCkKKyAgICAgICAgeHNpZ25hbDEgKFFvdmVyZmxvd19lcnJv ciwgYnVpbGRfcHVyZV9jX3N0cmluZyAoInZlY3RvciBpcyB0b28gbG9uZyIpKTsKKyAgICAgICpq c29uID0ganNvbl9jaGVjayAoanNvbl9hcnJheSAoKSk7CisgICAgICBwdHJkaWZmX3QgY291bnQg PSBTUEVDUERMX0lOREVYICgpOworICAgICAgcmVjb3JkX3Vud2luZF9wcm90ZWN0X3B0ciAoanNv bl9yZWxlYXNlX29iamVjdCwganNvbik7CisgICAgICBmb3IgKHB0cmRpZmZfdCBpID0gMDsgaSA8 IHNpemU7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIGludCBzdGF0dXMKKyAgICAgICAgICAg ID0ganNvbl9hcnJheV9hcHBlbmRfbmV3ICgqanNvbiwgbGlzcF90b19qc29uIChBUkVGIChsaXNw LCBpKSkpOworICAgICAgICAgIGlmIChzdGF0dXMgPT0gLTEpCisgICAgICAgICAgICBqc29uX291 dF9vZl9tZW1vcnkgKCk7CisgICAgICAgICAgZWFzc2VydCAoc3RhdHVzID09IDApOworICAgICAg ICB9CisgICAgICBlYXNzZXJ0IChqc29uX2FycmF5X3NpemUgKCpqc29uKSA9PSBzaXplKTsKKyAg ICAgIGNsZWFyX3Vud2luZF9wcm90ZWN0IChjb3VudCk7CisgICAgICByZXR1cm4gdW5iaW5kX3Rv IChjb3VudCwgUW5pbCk7CisgICAgfQorICBlbHNlIGlmIChIQVNIX1RBQkxFX1AgKGxpc3ApKQor ICAgIHsKKyAgICAgIHN0cnVjdCBMaXNwX0hhc2hfVGFibGUgKmggPSBYSEFTSF9UQUJMRSAobGlz cCk7CisgICAgICAqanNvbiA9IGpzb25fY2hlY2sgKGpzb25fb2JqZWN0ICgpKTsKKyAgICAgIHB0 cmRpZmZfdCBjb3VudCA9IFNQRUNQRExfSU5ERVggKCk7CisgICAgICByZWNvcmRfdW53aW5kX3By b3RlY3RfcHRyIChqc29uX3JlbGVhc2Vfb2JqZWN0LCAqanNvbik7CisgICAgICBmb3IgKHB0cmRp ZmZfdCBpID0gMDsgaSA8IEhBU0hfVEFCTEVfU0laRSAoaCk7ICsraSkKKyAgICAgICAgaWYgKCFO SUxQIChIQVNIX0hBU0ggKGgsIGkpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBMaXNwX09i amVjdCBrZXkgPSBIQVNIX0tFWSAoaCwgaSk7CisgICAgICAgICAgICAvKiBXZSBjYW7igJl0IHNw ZWNpZnkgdGhlIGxlbmd0aCwgc28gdGhlIHN0cmluZyBtdXN0IGJlCisgICAgICAgICAgICAgICBu dWxsLXRlcm1pbmF0ZWQuICAqLworICAgICAgICAgICAgY2hlY2tfc3RyaW5nX3dpdGhvdXRfZW1i ZWRkZWRfbnVsbHMgKGtleSk7CisgICAgICAgICAgICBpbnQgc3RhdHVzID0ganNvbl9vYmplY3Rf c2V0X25ldyAoKmpzb24sIFNTREFUQSAoa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBsaXNwX3RvX2pzb24gKEhBU0hfVkFMVUUgKGgsIGkpKSk7Cisg ICAgICAgICAgICBpZiAoc3RhdHVzID09IC0xKQorICAgICAgICAgICAgICBqc29uX291dF9vZl9t ZW1vcnkgKCk7CisgICAgICAgICAgICBlYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgICAgICAgICAg fQorICAgICAgY2xlYXJfdW53aW5kX3Byb3RlY3QgKGNvdW50KTsKKyAgICAgIHJldHVybiB1bmJp bmRfdG8gKGNvdW50LCBRbmlsKTsKKyAgICB9CisgIHdyb25nX3R5cGVfYXJndW1lbnQgKFFqc29u X3ZhbHVlX3AsIGxpc3ApOworfQorCitzdGF0aWMgQVRUUklCVVRFX1dBUk5fVU5VU0VEX1JFU1VM VCBqc29uX3QgKgorbGlzcF90b19qc29uIChMaXNwX09iamVjdCBsaXNwKQoreworICBpZiAoRVEg KGxpc3AsIFFDbnVsbCkpCisgICAgICByZXR1cm4ganNvbl9jaGVjayAoanNvbl9udWxsICgpKTsK KyAgZWxzZSBpZiAoRVEgKGxpc3AsIFFDZmFsc2UpKQorICAgIHJldHVybiBqc29uX2NoZWNrIChq c29uX2ZhbHNlICgpKTsKKyAgZWxzZSBpZiAoRVEgKGxpc3AsIFF0KSkKKyAgICByZXR1cm4ganNv bl9jaGVjayAoanNvbl90cnVlICgpKTsKKyAgZWxzZSBpZiAoSU5URUdFUlAgKGxpc3ApKQorICAg IHsKKyAgICAgIENIRUNLX1RZUEVfUkFOR0VEX0lOVEVHRVIgKGpzb25faW50X3QsIGxpc3ApOwor ICAgICAgcmV0dXJuIGpzb25fY2hlY2sgKGpzb25faW50ZWdlciAoWElOVCAobGlzcCkpKTsKKyAg ICB9CisgIGVsc2UgaWYgKEZMT0FUUCAobGlzcCkpCisgICAgcmV0dXJuIGpzb25fY2hlY2sgKGpz b25fcmVhbCAoWEZMT0FUX0RBVEEgKGxpc3ApKSk7CisgIGVsc2UgaWYgKFNUUklOR1AgKGxpc3Ap KQorICAgIHsKKyAgICAgIHB0cmRpZmZfdCBzaXplID0gU0JZVEVTIChsaXNwKTsKKyAgICAgIGVh c3NlcnQgKHNpemUgPj0gMCk7CisgICAgICBpZiAoc2l6ZSA+IFNJWkVfTUFYKQorICAgICAgICB4 c2lnbmFsMSAoUW92ZXJmbG93X2Vycm9yLCBidWlsZF9wdXJlX2Nfc3RyaW5nICgic3RyaW5nIGlz IHRvbyBsb25nIikpOworICAgICAgcmV0dXJuIGpzb25fY2hlY2sgKGpzb25fc3RyaW5nbiAoU1NE QVRBIChsaXNwKSwgc2l6ZSkpOworICAgIH0KKworICAvKiBMSVNQIG5vdyBtdXN0IGJlIGEgdmVj dG9yIG9yIGhhc2h0YWJsZS4gICovCisgIGlmICgrK2xpc3BfZXZhbF9kZXB0aCA+IG1heF9saXNw X2V2YWxfZGVwdGgpCisgICAgeHNpZ25hbDAgKFFqc29uX29iamVjdF90b29fZGVlcCk7CisgIGpz b25fdCAqanNvbjsKKyAgbGlzcF90b19qc29uXzEgKGxpc3AsICZqc29uKTsKKyAgLS1saXNwX2V2 YWxfZGVwdGg7CisgIHJldHVybiBqc29uOworfQorCitERUZVTiAoImpzb24tc2VyaWFsaXplIiwg Rmpzb25fc2VyaWFsaXplLCBTanNvbl9zZXJpYWxpemUsIDEsIDEsIE5VTEwsCisgICAgICAgZG9j OiAvKiBSZXR1cm4gdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgT0JKRUNUIGFzIGEgc3RyaW5n LgorT0JKRUNUIG11c3QgYmUgYSB2ZWN0b3Igb3IgaGFzaHRhYmxlLCBhbmQgaXRzIGVsZW1lbnRz IGNhbiByZWN1cnNpdmVseQorY29udGFpbiBgOm51bGwnLCBgOmZhbHNlJywgdCwgbnVtYmVycywg c3RyaW5ncywgb3Igb3RoZXIgdmVjdG9ycyBhbmQKK2hhc2h0YWJsZXMuICBgOm51bGwnLCBgOmZh bHNlJywgYW5kIHQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gSlNPTiBudWxsLAorZmFsc2UsIGFuZCB0 cnVlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiAgVmVjdG9ycyB3aWxsIGJlIGNvbnZlcnRlZCB0bwor SlNPTiBhcnJheXMsIGFuZCBoYXNodGFibGVzIHRvIEpTT04gb2JqZWN0cy4gIEhhc2h0YWJsZSBr ZXlzIG11c3QgYmUKK3N0cmluZ3Mgd2l0aG91dCBlbWJlZGRlZCBudWxsIGNoYXJhY3RlcnMgYW5k IG11c3QgYmUgdW5pcXVlIHdpdGhpbgorZWFjaCBvYmplY3QuICAqLykKKyAgKExpc3BfT2JqZWN0 IG9iamVjdCkKK3sKKyAgcHRyZGlmZl90IGNvdW50ID0gU1BFQ1BETF9JTkRFWCAoKTsKKworICBq c29uX3QgKmpzb24gPSBsaXNwX3RvX2pzb24gKG9iamVjdCk7CisgIHJlY29yZF91bndpbmRfcHJv dGVjdF9wdHIgKGpzb25fcmVsZWFzZV9vYmplY3QsIGpzb24pOworCisgIGNoYXIgKnN0cmluZyA9 IGpzb25fZHVtcHMgKGpzb24sIEpTT05fQ09NUEFDVCk7CisgIGlmIChzdHJpbmcgPT0gTlVMTCkK KyAgICBqc29uX291dF9vZl9tZW1vcnkgKCk7CisgIHJlY29yZF91bndpbmRfcHJvdGVjdF9wdHIg KGZyZWUsIHN0cmluZyk7CisKKyAgcmV0dXJuIHVuYmluZF90byAoY291bnQsIGJ1aWxkX3N0cmlu ZyAoc3RyaW5nKSk7Cit9CisKK3N0cnVjdCBqc29uX2J1ZmZlcl9hbmRfc2l6ZQoreworICBjb25z dCBjaGFyICpidWZmZXI7CisgIHNpemVfdCBzaXplOworfTsKKworc3RhdGljIExpc3BfT2JqZWN0 Citqc29uX2luc2VydCAoTGlzcF9PYmplY3QgZGF0YSkKK3sKKyAgY29uc3Qgc3RydWN0IGpzb25f YnVmZmVyX2FuZF9zaXplICpidWZmZXJfYW5kX3NpemUgPSBYU0FWRV9QT0lOVEVSIChkYXRhLCAw KTsKKyAgaWYgKEZJWE5VTV9PVkVSRkxPV19QIChidWZmZXJfYW5kX3NpemUtPnNpemUpKQorICAg IHhzaWduYWwxIChRb3ZlcmZsb3dfZXJyb3IsIGJ1aWxkX3B1cmVfY19zdHJpbmcgKCJidWZmZXIg dG9vIGxhcmdlIikpOworICBMaXNwX09iamVjdCBzdHJpbmcKKyAgICA9IG1ha2Vfc3RyaW5nIChi dWZmZXJfYW5kX3NpemUtPmJ1ZmZlciwgYnVmZmVyX2FuZF9zaXplLT5zaXplKTsKKyAgaW5zZXJ0 X2Zyb21fc3RyaW5nIChzdHJpbmcsIDAsIDAsIFNDSEFSUyAoc3RyaW5nKSwgU0JZVEVTIChzdHJp bmcpLCBmYWxzZSk7CisgIHJldHVybiBRbmlsOworfQorCitzdHJ1Y3QganNvbl9pbnNlcnRfZGF0 YQoreworICAvKiBuaWwgaWYganNvbl9pbnNlcnQgc3VjY2VlZGVkLCBvdGhlcndpc2UgYSBjb25z CisgICAgIChFUlJPUi1TWU1CT0zCoC7CoEVSUk9SLURBVEEpLiAgKi8KKyAgTGlzcF9PYmplY3Qg ZXJyb3I7Cit9OworCitzdGF0aWMgaW50Citqc29uX2luc2VydF9jYWxsYmFjayAoY29uc3QgY2hh ciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKyAgLyogVGhpcyBmdW5jdGlv biBtYXkgbm90IGV4aXQgbm9ubG9jYWxseS4gICovCisgIHN0cnVjdCBqc29uX2luc2VydF9kYXRh ICpkID0gZGF0YTsKKyAgc3RydWN0IGpzb25fYnVmZmVyX2FuZF9zaXplIGJ1ZmZlcl9hbmRfc2l6 ZQorICAgID0gey5idWZmZXIgPSBidWZmZXIsIC5zaXplID0gc2l6ZX07CisgIGQtPmVycm9yCisg ICAgPSBpbnRlcm5hbF9jb25kaXRpb25fY2FzZV8xIChqc29uX2luc2VydCwgbWFrZV9zYXZlX3B0 ciAoJmJ1ZmZlcl9hbmRfc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBR dCwgRmlkZW50aXR5KTsKKyAgcmV0dXJuIDA7Cit9CisKK0RFRlVOICgianNvbi1pbnNlcnQiLCBG anNvbl9pbnNlcnQsIFNqc29uX2luc2VydCwgMSwgMSwgTlVMTCwKKyAgICAgICBkb2M6IC8qIElu c2VydCB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBPQkpFQ1QgYmVmb3JlIHBvaW50LgorVGhp cyBpcyB0aGUgc2FtZSBhcyAoaW5zZXJ0IChqc29uLXNlcmlhbGl6ZSBPQkpFQ1QpKSwgYnV0IHBv dGVudGlhbGx5CitmYXN0ZXIuICBTZWUgdGhlIGZ1bmN0aW9uIGBqc29uLXNlcmlhbGl6ZScgZm9y IGFsbG93ZWQgdmFsdWVzIG9mCitPQkpFQ1QuICAqLykKKyAgKExpc3BfT2JqZWN0IG9iamVjdCkK K3sKKyAgcHRyZGlmZl90IGNvdW50ID0gU1BFQ1BETF9JTkRFWCAoKTsKKworICBqc29uX3QgKmpz b24gPSBsaXNwX3RvX2pzb24gKG9iamVjdCk7CisgIHJlY29yZF91bndpbmRfcHJvdGVjdF9wdHIg KGpzb25fcmVsZWFzZV9vYmplY3QsIGpzb24pOworCisgIHN0cnVjdCBqc29uX2luc2VydF9kYXRh IGRhdGE7CisgIGludCBzdGF0dXMKKyAgICA9IGpzb25fZHVtcF9jYWxsYmFjayAoanNvbiwganNv bl9pbnNlcnRfY2FsbGJhY2ssICZkYXRhLCBKU09OX0NPTVBBQ1QpOworICBpZiAoc3RhdHVzID09 IC0xKQorICAgIGpzb25fb3V0X29mX21lbW9yeSAoKTsKKyAgZWFzc2VydCAoc3RhdHVzID09IDAp OworCisgIGlmICghTklMUCAoZGF0YS5lcnJvcikpCisgICAgeHNpZ25hbCAoWENBUiAoZGF0YS5l cnJvciksIFhDRFIgKGRhdGEuZXJyb3IpKTsKKworICByZXR1cm4gdW5iaW5kX3RvIChjb3VudCwg UW5pbCk7Cit9CisKK3N0YXRpYyBfR0xfQVJHX05PTk5VTEwgKCgxKSkgTGlzcF9PYmplY3QKK2pz b25fdG9fbGlzcCAoanNvbl90ICpqc29uKQoreworICBzd2l0Y2ggKGpzb25fdHlwZW9mIChqc29u KSkKKyAgICB7CisgICAgY2FzZSBKU09OX05VTEw6CisgICAgICByZXR1cm4gUUNudWxsOworICAg IGNhc2UgSlNPTl9GQUxTRToKKyAgICAgIHJldHVybiBRQ2ZhbHNlOworICAgIGNhc2UgSlNPTl9U UlVFOgorICAgICAgcmV0dXJuIFF0OworICAgIGNhc2UgSlNPTl9JTlRFR0VSOgorICAgICAgewor ICAgICAgICBqc29uX2ludF90IHZhbHVlID0ganNvbl9pbnRlZ2VyX3ZhbHVlIChqc29uKTsKKyAg ICAgICAgaWYgKEZJWE5VTV9PVkVSRkxPV19QICh2YWx1ZSkpCisgICAgICAgICAgeHNpZ25hbDEg KFFvdmVyZmxvd19lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRfcHVyZV9jX3N0cmlu ZyAoIkpTT04gaW50ZWdlciBpcyB0b28gbGFyZ2UiKSk7CisgICAgICAgIHJldHVybiBtYWtlX251 bWJlciAodmFsdWUpOworICAgICAgfQorICAgIGNhc2UgSlNPTl9SRUFMOgorICAgICAgcmV0dXJu IG1ha2VfZmxvYXQgKGpzb25fcmVhbF92YWx1ZSAoanNvbikpOworICAgIGNhc2UgSlNPTl9TVFJJ Tkc6CisgICAgICB7CisgICAgICAgIHNpemVfdCBzaXplID0ganNvbl9zdHJpbmdfbGVuZ3RoIChq c29uKTsKKyAgICAgICAgaWYgKEZJWE5VTV9PVkVSRkxPV19QIChzaXplKSkKKyAgICAgICAgICB4 c2lnbmFsMSAoUW92ZXJmbG93X2Vycm9yLAorICAgICAgICAgICAgICAgICAgICBidWlsZF9wdXJl X2Nfc3RyaW5nICgiSlNPTiBzdHJpbmcgaXMgdG9vIGxvbmciKSk7CisgICAgICAgIHJldHVybiBt YWtlX3N0cmluZyAoanNvbl9zdHJpbmdfdmFsdWUgKGpzb24pLCBzaXplKTsKKyAgICAgIH0KKyAg ICBjYXNlIEpTT05fQVJSQVk6CisgICAgICB7CisgICAgICAgIGlmICgrK2xpc3BfZXZhbF9kZXB0 aCA+IG1heF9saXNwX2V2YWxfZGVwdGgpCisgICAgICAgICAgeHNpZ25hbDAgKFFqc29uX29iamVj dF90b29fZGVlcCk7CisgICAgICAgIHNpemVfdCBzaXplID0ganNvbl9hcnJheV9zaXplIChqc29u KTsKKyAgICAgICAgaWYgKEZJWE5VTV9PVkVSRkxPV19QIChzaXplKSkKKyAgICAgICAgICB4c2ln bmFsMSAoUW92ZXJmbG93X2Vycm9yLAorICAgICAgICAgICAgICAgICAgICBidWlsZF9wdXJlX2Nf c3RyaW5nICgiSlNPTiBhcnJheSBpcyB0b28gbG9uZyIpKTsKKyAgICAgICAgTGlzcF9PYmplY3Qg cmVzdWx0ID0gRm1ha2VfdmVjdG9yIChtYWtlX25hdG51bSAoc2l6ZSksIFF1bmJvdW5kKTsKKyAg ICAgICAgZm9yIChwdHJkaWZmX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpCisgICAgICAgICAgQVNF VCAocmVzdWx0LCBpLAorICAgICAgICAgICAgICAgIGpzb25fdG9fbGlzcCAoanNvbl9hcnJheV9n ZXQgKGpzb24sIGkpKSk7CisgICAgICAgIC0tbGlzcF9ldmFsX2RlcHRoOworICAgICAgICByZXR1 cm4gcmVzdWx0OworICAgICAgfQorICAgIGNhc2UgSlNPTl9PQkpFQ1Q6CisgICAgICB7CisgICAg ICAgIGlmICgrK2xpc3BfZXZhbF9kZXB0aCA+IG1heF9saXNwX2V2YWxfZGVwdGgpCisgICAgICAg ICAgeHNpZ25hbDAgKFFqc29uX29iamVjdF90b29fZGVlcCk7CisgICAgICAgIHNpemVfdCBzaXpl ID0ganNvbl9vYmplY3Rfc2l6ZSAoanNvbik7CisgICAgICAgIGlmIChGSVhOVU1fT1ZFUkZMT1df UCAoc2l6ZSkpCisgICAgICAgICAgeHNpZ25hbDEgKFFvdmVyZmxvd19lcnJvciwKKyAgICAgICAg ICAgICAgICAgICAgYnVpbGRfcHVyZV9jX3N0cmluZyAoIkpTT04gb2JqZWN0IGhhcyB0b28gbWFu eSBlbGVtZW50cyIpKTsKKyAgICAgICAgTGlzcF9PYmplY3QgcmVzdWx0ID0gQ0FMTE4gKEZtYWtl X2hhc2hfdGFibGUsIFFDdGVzdCwgUWVxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUUNzaXplLCBtYWtlX25hdG51bSAoc2l6ZSkpOworICAgICAgICBzdHJ1Y3QgTGlz cF9IYXNoX1RhYmxlICpoID0gWEhBU0hfVEFCTEUgKHJlc3VsdCk7CisgICAgICAgIGNvbnN0IGNo YXIgKmtleV9zdHI7CisgICAgICAgIGpzb25fdCAqdmFsdWU7CisgICAgICAgIGpzb25fb2JqZWN0 X2ZvcmVhY2ggKGpzb24sIGtleV9zdHIsIHZhbHVlKQorICAgICAgICAgIHsKKyAgICAgICAgICAg IExpc3BfT2JqZWN0IGtleSA9IGJ1aWxkX3N0cmluZyAoa2V5X3N0cik7CisgICAgICAgICAgICBF TUFDU19VSU5UIGhhc2g7CisgICAgICAgICAgICBwdHJkaWZmX3QgaSA9IGhhc2hfbG9va3VwICho LCBrZXksICZoYXNoKTsKKyAgICAgICAgICAgIGVhc3NlcnQgKGkgPCAwKTsKKyAgICAgICAgICAg IGhhc2hfcHV0IChoLCBrZXksIGpzb25fdG9fbGlzcCAodmFsdWUpLCBoYXNoKTsKKyAgICAgICAg ICB9CisgICAgICAgIC0tbGlzcF9ldmFsX2RlcHRoOworICAgICAgICByZXR1cm4gcmVzdWx0Owor ICAgICAgfQorICAgIH0KKyAgLyogQ2Fu4oCZdCBnZXQgaGVyZS4gICovCisgIGVtYWNzX2Fib3J0 ICgpOworfQorCitERUZVTiAoImpzb24tcGFyc2Utc3RyaW5nIiwgRmpzb25fcGFyc2Vfc3RyaW5n LCBTanNvbl9wYXJzZV9zdHJpbmcsIDEsIDEsIE5VTEwsCisgICAgICAgZG9jOiAvKiBQYXJzZSB0 aGUgSlNPTiBTVFJJTkcgaW50byBhIExpc3Agb2JqZWN0LgorVGhpcyBpcyBlc3NlbnRpYWxseSB0 aGUgcmV2ZXJzZSBvcGVyYXRpb24gb2YgYGpzb24tc2VyaWFsaXplJywgd2hpY2gKK3NlZS4gIFRo ZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZSBhIHZlY3RvciBvciBoYXNodGFibGUuICBJdHMgZWxl bWVudHMKK3dpbGwgYmUgYDpudWxsJywgYDpmYWxzZScsIHQsIG51bWJlcnMsIHN0cmluZ3MsIG9y IGZ1cnRoZXIgdmVjdG9ycyBhbmQKK2hhc2h0YWJsZXMuICBJZiB0aGVyZSBhcmUgZHVwbGljYXRl IGtleXMgaW4gYW4gb2JqZWN0LCBhbGwgYnV0IHRoZQorbGFzdCBvbmUgYXJlIGlnbm9yZWQuICBJ ZiBTVFJJTkcgZG9lc24ndCBjb250YWluIGEgdmFsaWQgSlNPTiBvYmplY3QsCithbiBlcnJvciBv ZiB0eXBlIGBqc29uLXBhcnNlLWVycm9yJyBpcyBzaWduYWxlZC4gICovKQorICAoTGlzcF9PYmpl Y3Qgc3RyaW5nKQoreworICBwdHJkaWZmX3QgY291bnQgPSBTUEVDUERMX0lOREVYICgpOworICBj aGVja19zdHJpbmdfd2l0aG91dF9lbWJlZGRlZF9udWxscyAoc3RyaW5nKTsKKworICBqc29uX2Vy cm9yX3QgZXJyb3I7CisgIGpzb25fdCAqb2JqZWN0ID0ganNvbl9sb2FkcyAoU1NEQVRBIChzdHJp bmcpLCAwLCAmZXJyb3IpOworICBpZiAob2JqZWN0ID09IE5VTEwpCisgICAganNvbl9wYXJzZV9l cnJvciAoJmVycm9yKTsKKworICAvKiBBdm9pZCBsZWFraW5nIHRoZSBvYmplY3QgaW4gY2FzZSBv ZiBmdXJ0aGVyIGVycm9ycy4gICovCisgIGlmIChvYmplY3QgIT0gTlVMTCkKKyAgICByZWNvcmRf dW53aW5kX3Byb3RlY3RfcHRyIChqc29uX3JlbGVhc2Vfb2JqZWN0LCBvYmplY3QpOworCisgIHJl dHVybiB1bmJpbmRfdG8gKGNvdW50LCBqc29uX3RvX2xpc3AgKG9iamVjdCkpOworfQorCitzdHJ1 Y3QganNvbl9yZWFkX2J1ZmZlcl9kYXRhCit7CisgIHB0cmRpZmZfdCBwb2ludDsKK307CisKK3N0 YXRpYyBzaXplX3QKK2pzb25fcmVhZF9idWZmZXJfY2FsbGJhY2sgKHZvaWQgKmJ1ZmZlciwgc2l6 ZV90IGJ1Zmxlbiwgdm9pZCAqZGF0YSkKK3sKKyAgc3RydWN0IGpzb25fcmVhZF9idWZmZXJfZGF0 YSAqZCA9IGRhdGE7CisKKyAgLyogRmlyc3QsIHBhcnNlIGZyb20gcG9pbnQgdG8gdGhlIGdhcCBv ciB0aGUgZW5kIG9mIHRoZSBhY2Nlc3NpYmxlCisgICAgIHBvcnRpb24sIHdoYXRldmVyIGlzIGNs b3Nlci4gICovCisgIHB0cmRpZmZfdCBwb2ludCA9IGQtPnBvaW50OworICBwdHJkaWZmX3QgZW5k OworICB7CisgICAgYm9vbCBvdmVyZmxvdyA9IElOVF9BRERfV1JBUFYgKEJVRkZFUl9DRUlMSU5H X09GIChwb2ludCksIDEsICZlbmQpOworICAgIGVhc3NlcnQgKCFvdmVyZmxvdyk7CisgIH0KKyAg c2l6ZV90IGNvdW50OworICB7CisgICAgYm9vbCBvdmVyZmxvdyA9IElOVF9TVUJUUkFDVF9XUkFQ ViAoZW5kLCBwb2ludCwgJmNvdW50KTsKKyAgICBlYXNzZXJ0ICghb3ZlcmZsb3cpOworICB9Cisg IGlmIChidWZsZW4gPCBjb3VudCkKKyAgICBjb3VudCA9IGJ1ZmxlbjsKKyAgbWVtY3B5IChidWZm ZXIsIEJZVEVfUE9TX0FERFIgKHBvaW50KSwgY291bnQpOworICB7CisgICAgYm9vbCBvdmVyZmxv dyA9IElOVF9BRERfV1JBUFYgKGQtPnBvaW50LCBjb3VudCwgJmQtPnBvaW50KTsKKyAgICBlYXNz ZXJ0ICghb3ZlcmZsb3cpOworICB9CisgIHJldHVybiBjb3VudDsKK30KKworREVGVU4gKCJqc29u LXBhcnNlLWJ1ZmZlciIsIEZqc29uX3BhcnNlX2J1ZmZlciwgU2pzb25fcGFyc2VfYnVmZmVyLAor ICAgICAgIDAsIDAsIE5VTEwsCisgICAgICAgZG9jOiAvKiBSZWFkIEpTT04gb2JqZWN0IGZyb20g Y3VycmVudCBidWZmZXIgc3RhcnRpbmcgYXQgcG9pbnQuCitUaGlzIGlzIHNpbWlsYXIgdG8gYGpz b24tcGFyc2Utc3RyaW5nJywgd2hpY2ggc2VlLiAgTW92ZSBwb2ludCBhZnRlcgordGhlIGVuZCBv ZiB0aGUgb2JqZWN0IGlmIHBhcnNpbmcgd2FzIHN1Y2Nlc3NmdWwuICBPbiBlcnJvciwgcG9pbnQg aXMKK25vdCBtb3ZlZC4gICovKQorICAodm9pZCkKK3sKKyAgcHRyZGlmZl90IGNvdW50ID0gU1BF Q1BETF9JTkRFWCAoKTsKKworICBwdHJkaWZmX3QgcG9pbnQgPSBQVF9CWVRFOworICBzdHJ1Y3Qg anNvbl9yZWFkX2J1ZmZlcl9kYXRhIGRhdGEgPSB7LnBvaW50ID0gcG9pbnR9OworICBqc29uX2Vy cm9yX3QgZXJyb3I7CisgIGpzb25fdCAqb2JqZWN0ID0ganNvbl9sb2FkX2NhbGxiYWNrIChqc29u X3JlYWRfYnVmZmVyX2NhbGxiYWNrLCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIEpTT05fRElTQUJMRV9FT0ZfQ0hFQ0ssICZlcnJvcik7CisKKyAgaWYgKG9i amVjdCA9PSBOVUxMKQorICAgIGpzb25fcGFyc2VfZXJyb3IgKCZlcnJvcik7CisKKyAgLyogQXZv aWQgbGVha2luZyB0aGUgb2JqZWN0IGluIGNhc2Ugb2YgZnVydGhlciBlcnJvcnMuICAqLworICBy ZWNvcmRfdW53aW5kX3Byb3RlY3RfcHRyIChqc29uX3JlbGVhc2Vfb2JqZWN0LCBvYmplY3QpOwor CisgIC8qIENvbnZlcnQgYW5kIHRoZW4gbW92ZSBwb2ludCBvbmx5IGlmIGV2ZXJ5dGhpbmcgc3Vj Y2VlZGVkLiAgKi8KKyAgTGlzcF9PYmplY3QgbGlzcCA9IGpzb25fdG9fbGlzcCAob2JqZWN0KTsK KworICB7CisgICAgLyogQWRqdXN0IHBvaW50IGJ5IGhvdyBtdWNoIHdlIGp1c3QgcmVhZC4gIERv IHRoaXMgaGVyZSBiZWNhdXNlCisgICAgICAgdG9rZW5lci0+Y2hhcl9vZmZzZXQgYmVjb21lcyBp bmNvcnJlY3QgYmVsb3cuICAqLworICAgIGJvb2wgb3ZlcmZsb3cgPSBJTlRfQUREX1dSQVBWIChw b2ludCwgZXJyb3IucG9zaXRpb24sICZwb2ludCk7CisgICAgZWFzc2VydCAoIW92ZXJmbG93KTsK KyAgICBlYXNzZXJ0IChwb2ludCA8PSBaVl9CWVRFKTsKKyAgICBTRVRfUFRfQk9USCAoQllURV9U T19DSEFSIChwb2ludCksIHBvaW50KTsKKyAgfQorCisgIHJldHVybiB1bmJpbmRfdG8gKGNvdW50 LCBsaXNwKTsKK30KKworLyogU2ltcGxpZmllZCB2ZXJzaW9uIG9mIOKAmGRlZmluZS1lcnJvcuKA mSB0aGF0IHdvcmtzIHdpdGggcHVyZQorICAgb2JqZWN0cy4gICovCisKK3N0YXRpYyB2b2lkCitk ZWZpbmVfZXJyb3IgKExpc3BfT2JqZWN0IG5hbWUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIExpc3Bf T2JqZWN0IHBhcmVudCkKK3sKKyAgZWFzc2VydCAoU1lNQk9MUCAobmFtZSkpOworICBlYXNzZXJ0 IChTWU1CT0xQIChwYXJlbnQpKTsKKyAgTGlzcF9PYmplY3QgcGFyZW50X2NvbmRpdGlvbnMgPSBG Z2V0IChwYXJlbnQsIFFlcnJvcl9jb25kaXRpb25zKTsKKyAgZWFzc2VydCAoQ09OU1AgKHBhcmVu dF9jb25kaXRpb25zKSk7CisgIGVhc3NlcnQgKCFOSUxQIChGbWVtcSAocGFyZW50LCBwYXJlbnRf Y29uZGl0aW9ucykpKTsKKyAgZWFzc2VydCAoTklMUCAoRm1lbXEgKG5hbWUsIHBhcmVudF9jb25k aXRpb25zKSkpOworICBGcHV0IChuYW1lLCBRZXJyb3JfY29uZGl0aW9ucywgcHVyZV9jb25zIChu YW1lLCBwYXJlbnRfY29uZGl0aW9ucykpOworICBGcHV0IChuYW1lLCBRZXJyb3JfbWVzc2FnZSwg YnVpbGRfcHVyZV9jX3N0cmluZyAobWVzc2FnZSkpOworfQorCit2b2lkCitzeW1zX29mX2pzb24g KHZvaWQpCit7CisgIERFRlNZTSAoUUNudWxsLCAiOm51bGwiKTsKKyAgREVGU1lNIChRQ2ZhbHNl LCAiOmZhbHNlIik7CisKKyAgREVGU1lNIChRc3RyaW5nX3dpdGhvdXRfZW1iZWRkZWRfbnVsbHNf cCwgInN0cmluZy13aXRob3V0LWVtYmVkZGVkLW51bGxzLXAiKTsKKyAgREVGU1lNIChRanNvbl92 YWx1ZV9wLCAianNvbi12YWx1ZS1wIik7CisKKyAgREVGU1lNIChRanNvbl9lcnJvciwgImpzb24t ZXJyb3IiKTsKKyAgREVGU1lNIChRanNvbl9vdXRfb2ZfbWVtb3J5LCAianNvbi1vdXQtb2YtbWVt b3J5Iik7CisgIERFRlNZTSAoUWpzb25fcGFyc2VfZXJyb3IsICJqc29uLXBhcnNlLWVycm9yIik7 CisgIERFRlNZTSAoUWpzb25fb2JqZWN0X3Rvb19kZWVwLCAianNvbi1vYmplY3QtdG9vLWRlZXAi KTsKKyAgZGVmaW5lX2Vycm9yIChRanNvbl9lcnJvciwgImdlbmVyaWMgSlNPTiBlcnJvciIsIFFl cnJvcik7CisgIGRlZmluZV9lcnJvciAoUWpzb25fb3V0X29mX21lbW9yeSwgIm5vIGZyZWUgbWVt b3J5IGZvciBjcmVhdGluZyBKU09OIG9iamVjdCIsCisgICAgICAgICAgICAgICAgUWpzb25fZXJy b3IpOworICBkZWZpbmVfZXJyb3IgKFFqc29uX3BhcnNlX2Vycm9yLCAiY291bGQgbm90IHBhcnNl IEpTT04gc3RyZWFtIiwKKyAgICAgICAgICAgICAgICBRanNvbl9lcnJvcik7CisgIGRlZmluZV9l cnJvciAoUWpzb25fb2JqZWN0X3Rvb19kZWVwLCAib2JqZWN0IGN5Y2xpYyBvciB0b28gZGVlcCIs CisgICAgICAgICAgICAgICAgUWpzb25fZXJyb3IpOworCisgIERFRlNZTSAoUXB1cmUsICJwdXJl Iik7CisgIERFRlNZTSAoUXNpZGVfZWZmZWN0X2ZyZWUsICJzaWRlLWVmZmVjdC1mcmVlIik7CisK KyAgREVGU1lNIChRanNvbl9zZXJpYWxpemUsICJqc29uLXNlcmlhbGl6ZSIpOworICBERUZTWU0g KFFqc29uX3BhcnNlX3N0cmluZywgImpzb24tcGFyc2Utc3RyaW5nIik7CisgIEZwdXQgKFFqc29u X3NlcmlhbGl6ZSwgUXB1cmUsIFF0KTsKKyAgRnB1dCAoUWpzb25fc2VyaWFsaXplLCBRc2lkZV9l ZmZlY3RfZnJlZSwgUXQpOworICBGcHV0IChRanNvbl9wYXJzZV9zdHJpbmcsIFFwdXJlLCBRdCk7 CisgIEZwdXQgKFFqc29uX3BhcnNlX3N0cmluZywgUXNpZGVfZWZmZWN0X2ZyZWUsIFF0KTsKKwor ICBkZWZzdWJyICgmU2pzb25fc2VyaWFsaXplKTsKKyAgZGVmc3ViciAoJlNqc29uX2luc2VydCk7 CisgIGRlZnN1YnIgKCZTanNvbl9wYXJzZV9zdHJpbmcpOworICBkZWZzdWJyICgmU2pzb25fcGFy c2VfYnVmZmVyKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9saXNwLmggYi9zcmMvbGlzcC5oCmluZGV4 IGM1MDMwODI0NDIuLjhkNDg1MDk4YWMgMTAwNjQ0Ci0tLSBhL3NyYy9saXNwLmgKKysrIGIvc3Jj L2xpc3AuaApAQCAtMzQ0MCw2ICszNDQwLDExIEBAIGV4dGVybiBpbnQgeF9iaXRtYXBfbWFzayAo c3RydWN0IGZyYW1lICosIHB0cmRpZmZfdCk7CiBleHRlcm4gdm9pZCByZXNldF9pbWFnZV90eXBl cyAodm9pZCk7CiBleHRlcm4gdm9pZCBzeW1zX29mX2ltYWdlICh2b2lkKTsKIAorI2lmZGVmIEhB VkVfSlNPTgorLyogRGVmaW5lZCBpbiBqc29uLmMuICAqLworZXh0ZXJuIHZvaWQgc3ltc19vZl9q c29uICh2b2lkKTsKKyNlbmRpZgorCiAvKiBEZWZpbmVkIGluIGluc2RlbC5jLiAgKi8KIGV4dGVy biB2b2lkIG1vdmVfZ2FwX2JvdGggKHB0cmRpZmZfdCwgcHRyZGlmZl90KTsKIGV4dGVybiBfTm9y ZXR1cm4gdm9pZCBidWZmZXJfb3ZlcmZsb3cgKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMv anNvbi10ZXN0cy5lbCBiL3Rlc3Qvc3JjL2pzb24tdGVzdHMuZWwKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMC4uNDJjOWYwZTllMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qv c3JjL2pzb24tdGVzdHMuZWwKQEAgLTAsMCArMSw2MSBAQAorOzs7IGpzb24tdGVzdHMuZWwgLS0t IHVuaXQgdGVzdHMgZm9yIGpzb24uYyAgICAgICAgICAtKi0gbGV4aWNhbC1iaW5kaW5nOiB0OyAt Ki0KKworOzsgQ29weXJpZ2h0IChDKSAyMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j LgorCis7OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgRW1hY3MuCisKKzs7IEdOVSBFbWFjcyBp cyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7 OyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieQorOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZl cnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKzs7IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCisKKzs7IEdOVSBFbWFjcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAorOzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKzs7IEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKzs7IFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCis7OyBhbG9uZyB3 aXRoIEdOVSBFbWFjcy4gIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2Vz Lz4uCisKKzs7OyBDb21tZW50YXJ5OgorCis7OyBVbml0IHRlc3RzIGZvciBzcmMvanNvbi5jLgor Cis7OzsgQ29kZToKKworKHJlcXVpcmUgJ2NsLWxpYikKKyhyZXF1aXJlICdtYXApCisKKyhlcnQt ZGVmdGVzdCBqc29uLXNlcmlhbGl6ZS9yb3VuZHRyaXAgKCkKKyAgKGxldCAoKGxpc3AgWzpudWxs IDpmYWxzZSB0IDAgMTIzIC00NTYgMy43NSAiZm9vIl0pCisgICAgICAgIChqc29uICJbbnVsbCxm YWxzZSx0cnVlLDAsMTIzLC00NTYsMy43NSxcImZvb1wiXSIpKQorICAgIChzaG91bGQgKGVxdWFs IChqc29uLXNlcmlhbGl6ZSBsaXNwKSBqc29uKSkKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAg ICAgKGpzb24taW5zZXJ0IGxpc3ApCisgICAgICAoc2hvdWxkIChlcXVhbCAoYnVmZmVyLXN0cmlu ZykganNvbikpCisgICAgICAoc2hvdWxkIChlb2JwKSkpCisgICAgKHNob3VsZCAoZXF1YWwgKGpz b24tcGFyc2Utc3RyaW5nIGpzb24pIGxpc3ApKQorICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAg ICAoaW5zZXJ0IGpzb24pCisgICAgICAoZ290by1jaGFyIDEpCisgICAgICAoc2hvdWxkIChlcXVh bCAoanNvbi1wYXJzZS1idWZmZXIpIGxpc3ApKQorICAgICAgKHNob3VsZCAoZW9icCkpKSkpCisK KyhlcnQtZGVmdGVzdCBqc29uLXNlcmlhbGl6ZS9vYmplY3QgKCkKKyAgKGxldCAoKHRhYmxlICht YWtlLWhhc2gtdGFibGUgOnRlc3QgIydlcXVhbCkpKQorICAgIChwdXRoYXNoICJhYmMiIFsxIDIg dF0gdGFibGUpCisgICAgKHB1dGhhc2ggImRlZiIgOm51bGwgdGFibGUpCisgICAgKHNob3VsZCAo ZXF1YWwgKGpzb24tc2VyaWFsaXplIHRhYmxlKQorICAgICAgICAgICAgICAgICAgICJ7XCJhYmNc IjpbMSwyLHRydWVdLFwiZGVmXCI6bnVsbH0iKSkpKQorCisoZXJ0LWRlZnRlc3QganNvbi1wYXJz ZS1zdHJpbmcvb2JqZWN0ICgpCisgIChsZXQgKChhY3R1YWwKKyAgICAgICAgIChqc29uLXBhcnNl LXN0cmluZworICAgICAgICAgICJ7IFwiYWJjXCIgOiBbMSwgMiwgdHJ1ZV0sIFwiZGVmXCIgOiBu dWxsLCBcImFiY1wiIDogWzksIGZhbHNlXSB9XG4iKSkpCisgICAgKHNob3VsZCAoaGFzaC10YWJs ZS1wIGFjdHVhbCkpCisgICAgKHNob3VsZCAoZXF1YWwgKGhhc2gtdGFibGUtY291bnQgYWN0dWFs KSAyKSkKKyAgICAoc2hvdWxkIChlcXVhbCAoY2wtc29ydCAobWFwLXBhaXJzIGFjdHVhbCkgIydz dHJpbmc8IDprZXkgIydjYXIpCisgICAgICAgICAgICAgICAgICAgJygoImFiYyIgLiBbOSA6ZmFs c2VdKSAoImRlZiIgLiA6bnVsbCkpKSkpKQorCisocHJvdmlkZSAnanNvbi10ZXN0cykKKzs7OyBq c29uLXRlc3RzLmVsIGVuZHMgaGVyZQotLSAKMi4xNC4xCgo= --001a113d688cdb87d20559868062--