Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nhohB-0000Ga-RM for pgsql-hackers@arkaria.postgresql.org; Fri, 22 Apr 2022 08:31:18 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nhogC-0008Pz-6V for pgsql-hackers@arkaria.postgresql.org; Fri, 22 Apr 2022 08:30:16 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nhogB-0008Pq-Mx for pgsql-hackers@lists.postgresql.org; Fri, 22 Apr 2022 08:30:15 +0000 Received: from mail-lf1-x129.google.com ([2a00:1450:4864:20::129]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1nhog8-0006Oo-VQ for pgsql-hackers@lists.postgresql.org; Fri, 22 Apr 2022 08:30:15 +0000 Received: by mail-lf1-x129.google.com with SMTP id g19so13035726lfv.2 for ; Fri, 22 Apr 2022 01:30:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=timescale.com; s=google; h=mime-version:from:date:message-id:subject:to:cc; bh=tBAyiw4wEJq+Z3JWUPDkbztDA9Ul2/rg46ZH4uHlqH4=; b=EMpQhxnEgZqw+MSFvOObTusk2q2Ac0emzwNaI2WYqUuL2fwdE4Q5okffg7eJDvjej4 +u3B7IPzgpveU4KzDG+dKbARwMyJpfqOc+svJel+ZGIzD1C5WvrboiK9v/T9BTOTF+r+ lPlNqyMaiHIAPHh2S6KqyQl1Lvg0yvMzBe0FrRlaT2txJwYhETU+2TwNzk265H7O0Xc7 ysgb+FmXO8iUc0jYthaA16TCxPk68wEeUvn/AU3gOKkHg1M7P/nf1/lZQnjvkxnotqFR uUY67gVWsZpifXqiA0rQ0vj/4EbzO6mCtNT/Gkxa/pgtQfUL4WfGmWUnGcKsEUNhrJzd yc8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:from:date:message-id:subject:to:cc; bh=tBAyiw4wEJq+Z3JWUPDkbztDA9Ul2/rg46ZH4uHlqH4=; b=PWcKn90cSuDSGsThHqLVqP6BYXQXVvHv2Xmtqt795MiuUMAzr8Ys8iU8BYN58cRAnn eTPLJ5rv/y+EbbY6uRpBORglgFnzzZVdLApx4P37yrsIVp1S3KiCM+xD0TwzQY1SBUAO ESfuHG3nuDUx805k+rKSYWSKwHuvgTHFvvKDWDurw4eNJrxRW7kcSlUPuVL/7fm5VduG 62k969+pD8XsCHpGOfYSUNTkXTyA1KTkh5jchXTUfEj2Z3rC994FaBuYfbkM6Fv3JSJO ugO50edzVgnC12FVzQkxOIyxTf/y7/XbkBj06Gnj32RKsbsspayMzIe0nHEzqgd6Q4Hz LLYw== X-Gm-Message-State: AOAM530cxPFUwml48/Gtbn2w1EO55azKADnrD9NXkkSA61RH1r+AUire 6jO5PNPTw3/fKz2HJh9LXZBxHs96ooCE0xUpCMRhQUDfWb2++w== X-Google-Smtp-Source: ABdhPJxZavysg5QNcbV+7HY8u2YwmdJz6OMfVFw3ANNlyl/inL39q7dwN+mvFt1DEuq7M1A+4813ZjeZ1y2DlMzD1Ks= X-Received: by 2002:a19:7401:0:b0:46e:bf86:3a26 with SMTP id v1-20020a197401000000b0046ebf863a26mr2419578lfe.271.1650616211862; Fri, 22 Apr 2022 01:30:11 -0700 (PDT) MIME-Version: 1.0 From: Aleksander Alekseev Date: Fri, 22 Apr 2022 11:30:01 +0300 Message-ID: Subject: [PATCH] Compression dictionaries for JSONB To: PostgreSQL Hackers Cc: Alvaro Herrera , Matthias van de Meent Content-Type: multipart/mixed; boundary="000000000000f81eb405dd3a08f4" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000f81eb405dd3a08f4 Content-Type: multipart/alternative; boundary="000000000000f81eb105dd3a08f2" --000000000000f81eb105dd3a08f2 Content-Type: text/plain; charset="UTF-8" Hi hackers, This is a follow-up thread to `RFC: compression dictionaries for JSONB` [1]. I would like to share my current progress in order to get early feedback. The patch is currently in a draft state but implements the basic functionality. I did my best to account for all the great feedback I previously got from Alvaro and Matthias. Usage example: ``` CREATE TYPE mydict AS DICTIONARY OF jsonb ('aaa', 'bbb'); SELECT '{"aaa":"bbb"}' :: mydict; mydict ---------------- {"aaa": "bbb"} SELECT ('{"aaa":"bbb"}' :: mydict) -> 'aaa'; ?column? ---------- "bbb" ``` Here `mydict` works as a transparent replacement for `jsonb`. However, its internal representation differs. The provided dictionary entries ('aaa', 'bbb') are stored in the new catalog table: ``` SELECT * FROM pg_dict; oid | dicttypid | dictentry -------+-----------+----------- 39476 | 39475 | aaa 39477 | 39475 | bbb (2 rows) ``` When `mydict` sees 'aaa' in the document, it replaces it with the corresponding code, in this case - 39476. For more details regarding the compression algorithm and choosen compromises please see the comments in the patch. In pg_type `mydict` has typtype = TYPTYPE_DICT. It works the same way as TYPTYPE_BASE with only difference: corresponding `_in` (pg_type.typinput) and `_` (pg_cast.castfunc) procedures receive the dictionary Oid as a `typmod` argument. This way the procedures can distinguish `mydict1` from `mydict2` and use the proper compression dictionary. The approach with alternative `typmod` role is arguably a bit hacky, but it was the less invasive way to implement the feature I've found. I'm open to alternative suggestions. Current limitations (todo): - ALTER TYPE is not implemented - Tests and documentation are missing - Autocomplete is missing Future work (out of scope of this patch): - Support types other than JSONB: TEXT, XML, etc - Automatically updated dictionaries, e.g. during VACUUM - Alternative compression algorithms. Note that this will not require any further changes in the catalog, only the values we write to pg_type and pg_cast will differ. Open questions: - Dictionary entries are currently stored as NameData, the same type that is used for enums. Are we OK with the accompanying limitations? Any alternative suggestions? - All in all, am I moving the right direction? Your feedback is very much welcomed! [1]: https://postgr.es/m/CAJ7c6TPx7N-bVw0dZ1ASCDQKZJHhBYkT6w4HV1LzfS%2BUUTUfmA%40mail.gmail.com -- Best regards, Aleksander Alekseev --000000000000f81eb105dd3a08f2 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi hackers,

This is a follow-up thread to `RFC: com= pression dictionaries for JSONB` [1]. I would like to share my current prog= ress in order to get early feedback. The patch is currently in a draft stat= e but implements the basic functionality. I did my best to account for all = the great feedback I previously got from Alvaro and Matthias.

Usage = example:

```
CREATE TYPE mydict AS DICTIONARY OF jsonb ('aaa&= #39;, 'bbb');

SELECT '{"aaa":"bbb"}&= #39; :: =C2=A0mydict;
=C2=A0 =C2=A0 =C2=A0mydict
----------------
= =C2=A0{"aaa": "bbb"}

SELECT ('{"aaa&quo= t;:"bbb"}' :: =C2=A0mydict) -> 'aaa';
=C2=A0?co= lumn?
----------
=C2=A0"bbb"
```

Here `mydict` wo= rks as a transparent replacement for `jsonb`. However, its internal represe= ntation differs. The provided dictionary entries ('aaa', 'bbb&#= 39;) are stored in the new catalog table:

```
SELECT * FROM pg_di= ct;
=C2=A0 oid =C2=A0| dicttypid | dictentry
-------+-----------+----= -------
=C2=A039476 | =C2=A0 =C2=A0 39475 | aaa
=C2=A039477 | =C2=A0 = =C2=A0 39475 | bbb
(2 rows)
```

= When `mydict` sees 'aaa' in the document, it replaces it with the c= orresponding code, in this case - 39476. For more details regarding the com= pression algorithm and choosen compromises please see the comments in the p= atch.

In pg_type `mydict` has typtype =3D TYPT= YPE_DICT. It works the same way as TYPTYPE_BASE with only difference: corre= sponding `<type>_in` (pg_type.typinput) and `<another-type>_<= ;type>` (pg_cast.castfunc) procedures receive the dictionary Oid as a `t= ypmod` argument. This way the procedures can distinguish `mydict1` from `my= dict2` and use the proper compression dictionary.

= The approach with alternative `typmod` role is arguably a bit hacky, but it= was the less invasive way to implement the feature I've found. I'm= open to alternative suggestions.

Current limitations (todo):<= br>- ALTER TYPE is not implemented
- Tests and documentation are missing=
- Autocomplete is missing

Future work (out of scope of this patc= h):
- Support types other than JSONB: TEXT, XML, etc
- Automatically = updated dictionaries, e.g. during VACUUM
- Alternative compression algor= ithms. Note that this will not require any further changes in the catalog, = only the values we write to pg_type and pg_cast will differ.

Open qu= estions:
- Dictionary entries are currently stored as NameData, the same= type that is used for enums. Are we OK with the accompanying limitations? = Any alternative suggestions?
- All in all, am I moving the right di= rection?

Your feedback is very much welcomed!

[1= ]: https://postgr.es/m/CAJ7c6TPx7N-bVw0dZ1ASCDQ= KZJHhBYkT6w4HV1LzfS%2BUUTUfmA%40mail.gmail.com

--
Best regar= ds,
Aleksander Alekseev
--000000000000f81eb105dd3a08f2-- --000000000000f81eb405dd3a08f4 Content-Type: application/octet-stream; name="v1-0001-CREATE-TYPE-foo-AS-DICTIONARY-OF-JSONB.patch" Content-Disposition: attachment; filename="v1-0001-CREATE-TYPE-foo-AS-DICTIONARY-OF-JSONB.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l2a61rmw0 RnJvbSBlMzgzMjU1OWEyMjg4ZjNmMDVmNDE0NGE1MjVjZjQ2Y2NkOGEwMjUyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGVrc2FuZGVyIEFsZWtzZWV2IDxhbGVrc2FuZGVyQHRpbWVz Y2FsZS5jb20+CkRhdGU6IFR1ZSwgMTIgQXByIDIwMjIgMTU6NTg6MTEgKzAzMDAKU3ViamVjdDog W1BBVENIIHYxXSBDUkVBVEUgVFlQRSBmb28gQVMgRElDVElPTkFSWSBPRiBKU09OQgoKRklYTUUg ZXhwbGFpbiB3aGF0IHRoZSBmZWF0dXJlIGlzIGFsbCBhYm91dCBhbmQgZ2l2ZSBzb21lCiAgICAg IGltcGxlbWVudGF0aW9uIGRldGFpbHMKCihOT1RFOiBkZWFyIGNvbW1pdHRlciwgcGxlYXNlIGJ1 bXAgdGhlIGNhdGFsb2cgdmVyc2lvbiEpCgpBdXRob3I6IEFsZWtzYW5kZXIgQWxla3NlZXYgPGFs ZWtzYW5kZXJAdGltZXNjYWxlLmNvbT4KUmV2aWV3ZWQtYnk6IEZJWE1FCkRpc2N1c3Npb246IEZJ WE1FCi0tLQogc3JjL2JhY2tlbmQvY2F0YWxvZy9NYWtlZmlsZSAgICAgICAgICAgICAgICAgIHwg ICAzICstCiBzcmMvYmFja2VuZC9jYXRhbG9nL3BnX2RpY3QuYyAgICAgICAgICAgICAgICAgfCAx NTMgKysrKysrCiBzcmMvYmFja2VuZC9jb21tYW5kcy90eXBlY21kcy5jICAgICAgICAgICAgICAg fCAxNTEgKysrKystCiBzcmMvYmFja2VuZC9leGVjdXRvci9mdW5jdGlvbnMuYyAgICAgICAgICAg ICAgfCAgIDEgKwogc3JjL2JhY2tlbmQvbm9kZXMvY29weWZ1bmNzLmMgICAgICAgICAgICAgICAg IHwgIDE1ICsKIHNyYy9iYWNrZW5kL25vZGVzL2VxdWFsZnVuY3MuYyAgICAgICAgICAgICAgICB8 ICAxMyArCiBzcmMvYmFja2VuZC9wYXJzZXIvZ3JhbS55ICAgICAgICAgICAgICAgICAgICAgfCAg IDggKwogc3JjL2JhY2tlbmQvcGFyc2VyL3BhcnNlX2NvZXJjZS5jICAgICAgICAgICAgIHwgIDE3 ICstCiBzcmMvYmFja2VuZC9wYXJzZXIvcGFyc2VfdHlwZS5jICAgICAgICAgICAgICAgfCAgMTYg Kwogc3JjL2JhY2tlbmQvdGNvcC91dGlsaXR5LmMgICAgICAgICAgICAgICAgICAgIHwgIDEzICsK IHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9NYWtlZmlsZSAgICAgICAgICAgICAgICB8ICAgMSArCiBz cmMvYmFja2VuZC91dGlscy9hZHQvZGljdGlvbmFyaWVzLmMgICAgICAgICAgfCA0NzYgKysrKysr KysrKysrKysrKysrCiBzcmMvYmFja2VuZC91dGlscy9mbWdyL2Z1bmNhcGkuYyAgICAgICAgICAg ICAgfCAgIDEgKwogc3JjL2Jpbi9wZ19kdW1wL3BnX2R1bXAuYyAgICAgICAgICAgICAgICAgICAg IHwgICAyICsKIHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfZGljdC5oICAgICAgICAgICAgICAgICB8 ICA3NiArKysKIHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgICAgICAgICAgICAgICB8 ICAyMCArCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3R5cGUuaCAgICAgICAgICAgICAgICAgfCAg IDEgKwogc3JjL2luY2x1ZGUvY29tbWFuZHMvdHlwZWNtZHMuaCAgICAgICAgICAgICAgIHwgICAx ICsKIHNyYy9pbmNsdWRlL25vZGVzL25vZGVzLmggICAgICAgICAgICAgICAgICAgICB8ICAgMSAr CiBzcmMvaW5jbHVkZS9ub2Rlcy9wYXJzZW5vZGVzLmggICAgICAgICAgICAgICAgfCAgMTIgKwog c3JjL3BsL3BscGdzcWwvc3JjL3BsX2NvbXAuYyAgICAgICAgICAgICAgICAgIHwgICAxICsKIC4u Li9tb2R1bGVzL3Rlc3Rfb2F0X2hvb2tzL3Rlc3Rfb2F0X2hvb2tzLmMgICB8ICAgMSArCiBzcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL29pZGpvaW5zLm91dCAgICAgICAgfCAgIDEgKwogc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9vcHJfc2FuaXR5Lm91dCAgICAgIHwgIDE0ICstCiAyNCBmaWxl cyBjaGFuZ2VkLCA5ODggaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9k ZSAxMDA2NDQgc3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19kaWN0LmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBzcmMvYmFja2VuZC91dGlscy9hZHQvZGljdGlvbmFyaWVzLmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX2RpY3QuaAoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L2NhdGFsb2cvTWFrZWZpbGUgYi9zcmMvYmFja2VuZC9jYXRhbG9nL01ha2VmaWxlCmluZGV4IDg5 YTAyMjFlYzkuLjNiNDMzMDE0OGUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvTWFr ZWZpbGUKKysrIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9NYWtlZmlsZQpAQCAtMzMsNiArMzMsNyBA QCBPQkpTID0gXAogCXBnX2NvbnZlcnNpb24ubyBcCiAJcGdfZGJfcm9sZV9zZXR0aW5nLm8gXAog CXBnX2RlcGVuZC5vIFwKKwlwZ19kaWN0Lm8gXAogCXBnX2VudW0ubyBcCiAJcGdfaW5oZXJpdHMu byBcCiAJcGdfbGFyZ2VvYmplY3QubyBcCkBAIC02MSw3ICs2Miw3IEBAIENBVEFMT0dfSEVBREVS UyA6PSBcCiAJcGdfbGFuZ3VhZ2UuaCBwZ19sYXJnZW9iamVjdF9tZXRhZGF0YS5oIHBnX2xhcmdl b2JqZWN0LmggcGdfYWdncmVnYXRlLmggXAogCXBnX3N0YXRpc3RpYy5oIHBnX3N0YXRpc3RpY19l eHQuaCBwZ19zdGF0aXN0aWNfZXh0X2RhdGEuaCBcCiAJcGdfcmV3cml0ZS5oIHBnX3RyaWdnZXIu aCBwZ19ldmVudF90cmlnZ2VyLmggcGdfZGVzY3JpcHRpb24uaCBcCi0JcGdfY2FzdC5oIHBnX2Vu dW0uaCBwZ19uYW1lc3BhY2UuaCBwZ19jb252ZXJzaW9uLmggcGdfZGVwZW5kLmggXAorCXBnX2Nh c3QuaCBwZ19kaWN0LmggcGdfZW51bS5oIHBnX25hbWVzcGFjZS5oIHBnX2NvbnZlcnNpb24uaCBw Z19kZXBlbmQuaCBcCiAJcGdfZGF0YWJhc2UuaCBwZ19kYl9yb2xlX3NldHRpbmcuaCBwZ190YWJs ZXNwYWNlLmggXAogCXBnX2F1dGhpZC5oIHBnX2F1dGhfbWVtYmVycy5oIHBnX3NoZGVwZW5kLmgg cGdfc2hkZXNjcmlwdGlvbi5oIFwKIAlwZ190c19jb25maWcuaCBwZ190c19jb25maWdfbWFwLmgg cGdfdHNfZGljdC5oIFwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvcGdfZGljdC5j IGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9wZ19kaWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMC4uYWQxMGJlZTQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYWNrZW5k L2NhdGFsb2cvcGdfZGljdC5jCkBAIC0wLDAgKzEsMTUzIEBACisjaW5jbHVkZSAicG9zdGdyZXMu aCIKKworI2luY2x1ZGUgImFjY2Vzcy9odHVwX2RldGFpbHMuaCIKKyNpbmNsdWRlICJhY2Nlc3Mv Z2VuYW0uaCIKKyNpbmNsdWRlICJhY2Nlc3Mvc2tleS5oIgorI2luY2x1ZGUgImFjY2Vzcy90YWJs ZS5oIgorI2luY2x1ZGUgImNhdGFsb2cvY2F0YWxvZy5oIgorI2luY2x1ZGUgImNhdGFsb2cvaW5k ZXhpbmcuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2RpY3QuaCIKKyNpbmNsdWRlICJjYXRhbG9n L3BnX3R5cGUuaCIKKyNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxz L2ZtZ3JvaWRzLmgiCisjaW5jbHVkZSAidXRpbHMvcmVsLmgiCisKKy8qCisgKiBDcmVhdGVzIGFu IGVudHJ5IGluIHBnX2RpY3QgZm9yIGVhY2ggb2YgdGhlIHN1cHBsaWVkIHZhbHVlcy4KKyAqIHZh bHMgaXMgYSBsaXN0IG9mIFN0cmluZyB2YWx1ZXMuCisgKi8KK3ZvaWQKK0RpY3RFbnRyaWVzQ3Jl YXRlKE9pZCBkaWN0VHlwZU9pZCwgTGlzdCAqdmFscykKK3sKKwlSZWxhdGlvbglwZ19kaWN0Owor CU5hbWVEYXRhCWRpY3RlbnRyeTsKKwlEYXR1bQkJdmFsdWVzW05hdHRzX3BnX2RpY3RdOworCWJv b2wJCW51bGxzW05hdHRzX3BnX2RpY3RdOworCUxpc3RDZWxsICAgKmxjOworCUhlYXBUdXBsZQl0 dXA7CisKKwlpZiAodmFscyA9PSBOSUwpCisJeworCQkvKiBUaGUgbGlzdCBpcyBlbXB0eTsgZG8g bm90aGluZy4gKi8KKwkJcmV0dXJuOworCX0KKworCW1lbXNldChudWxscywgZmFsc2UsIHNpemVv ZihudWxscykpOworCisJLyoKKwkgKiBXZSBkb24ndCBjaGVjayB0aGUgbGlzdCBvZiB2YWx1ZXMg Zm9yIGR1cGxpY2F0ZXMgaGVyZS4gSWYgdGhlcmUgYXJlCisJICogYW55LCB0aGUgdXNlciB3aWxs IGdldCBhbiB1bmlxdWUtaW5kZXggdmlvbGF0aW9uLgorCSAqLworCisJcGdfZGljdCA9IHRhYmxl X29wZW4oRGljdFJlbGF0aW9uSWQsIFJvd0V4Y2x1c2l2ZUxvY2spOworCWZvcmVhY2gobGMsIHZh bHMpCisJeworCQlPaWQJCQlvaWQgPSBHZXROZXdPaWRXaXRoSW5kZXgocGdfZGljdCwgRGljdE9p ZEluZGV4SWQsCisJCQkJCQkJCQkJCSBBbnVtX3BnX2RpY3Rfb2lkKTsKKwkJY2hhcgkgICAqZW50 cnkgPSBzdHJWYWwobGZpcnN0KGxjKSk7CisKKwkJLyoKKwkJICogRW50cmllcyBhcmUgc3RvcmVk IGluIGEgbmFtZSBmaWVsZCwgZm9yIGVhc2llciBzeXNjYWNoZSBsb29rdXAsIHNvCisJCSAqIGNo ZWNrIHRoZSBsZW5ndGggdG8gbWFrZSBzdXJlIGl0J3Mgd2l0aGluIHJhbmdlLgorCQkgKi8KKwkJ aWYgKHN0cmxlbihlbnRyeSkgPiAoTkFNRURBVEFMRU4gLSAxKSkKKwkJCWVyZXBvcnQoRVJST1Is CisJCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9OQU1FKSwKKwkJCQkJIGVycm1zZygiaW52 YWxpZCBkaWN0IGVudHJ5IFwiJXNcIiIsIGVudHJ5KSwKKwkJCQkJIGVycmRldGFpbCgiRW50cmll cyBtdXN0IGJlICVkIGJ5dGVzIG9yIGxlc3MuIiwKKwkJCQkJCQkgICBOQU1FREFUQUxFTiAtIDEp KSk7CisKKwkJbmFtZXN0cmNweSgmZGljdGVudHJ5LCBlbnRyeSk7CisKKwkJdmFsdWVzW0FudW1f cGdfZGljdF9vaWQgLSAxXSA9IE9iamVjdElkR2V0RGF0dW0ob2lkKTsKKwkJdmFsdWVzW0FudW1f cGdfZGljdF9kaWN0dHlwaWQgLSAxXSA9IE9iamVjdElkR2V0RGF0dW0oZGljdFR5cGVPaWQpOwor CQl2YWx1ZXNbQW51bV9wZ19kaWN0X2RpY3RlbnRyeSAtIDFdID0gTmFtZUdldERhdHVtKCZkaWN0 ZW50cnkpOworCisJCXR1cCA9IGhlYXBfZm9ybV90dXBsZShSZWxhdGlvbkdldERlc2NyKHBnX2Rp Y3QpLCB2YWx1ZXMsIG51bGxzKTsKKworCQlDYXRhbG9nVHVwbGVJbnNlcnQocGdfZGljdCwgdHVw KTsKKwkJaGVhcF9mcmVldHVwbGUodHVwKTsKKwl9CisKKwkvKiBjbGVhbiB1cCAqLworCXRhYmxl X2Nsb3NlKHBnX2RpY3QsIFJvd0V4Y2x1c2l2ZUxvY2spOworfQorCisvKgorICogUmV0dXJucyBh bGwgdGhlIGVudHJpZXMgZm9yIHRoZSBkaWN0aW5hcnkgd2l0aCBnaXZlbiBPaWQuIEVudHJpZXMg YXJlIHNvcnRlZAorICogYnkgZGljdGVudHJ5LiBOb3RlIHRoYXQgc2hvcnRlciBlbnRyaWVzIGFy ZSBjb25zaWRlcmVkIHNtYWxsZXIsIGkuZS4gJ2FiYycKKyAqIGdvZXMgYmVmb3JlICdhYmNkZWYn LiBUaGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBpbiB0aGUgY2FsbGVyJ3MgbWVtb3J5IGNvbnRleHQu CisgKgorICogSWYgdGhlcmUgYXJlIG5vIGVudHJpZXMgYSB2YWxpZCBidXQgZW1wdHkgZGljdGlv bmFyeSBpcyByZXR1cm5lZC4KKyAqLworRGljdGlvbmFyeQorRGljdEVudHJpZXNSZWFkKE9pZCBk aWN0VHlwZU9pZCkKK3sKKwlSZWxhdGlvbglwZ19kaWN0OworCVNjYW5LZXlEYXRhIGtleVsxXTsK KwlTeXNTY2FuRGVzYyBzY2FuOworCUhlYXBUdXBsZQl0dXA7CisJdWludDMyICAgICAgZW50cmll c19hbGxvY2F0ZWQgPSA4OworCURpY3Rpb25hcnkgIGRpY3QgPSAoRGljdGlvbmFyeSlwYWxsb2Mo c2l6ZW9mKERpY3Rpb25hcnlEYXRhKSk7CisKKwlkaWN0LT5uZW50cmllcyA9IDA7CisJZGljdC0+ ZW50cmllcyA9IChEaWN0RW50cnkqKXBhbGxvYyhlbnRyaWVzX2FsbG9jYXRlZCpzaXplb2YoRGlj dEVudHJ5KSk7CisKKwlwZ19kaWN0ID0gdGFibGVfb3BlbihEaWN0UmVsYXRpb25JZCwgUm93RXhj bHVzaXZlTG9jayk7CisKKwlTY2FuS2V5SW5pdCgma2V5WzBdLAorCQkJCUFudW1fcGdfZGljdF9k aWN0dHlwaWQsCisJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBGX09JREVRLAorCQkJCU9iamVj dElkR2V0RGF0dW0oZGljdFR5cGVPaWQpKTsKKworCXNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4o cGdfZGljdCwgRGljdFR5cElkRW50cnlJbmRleElkLCB0cnVlLAorCQkJCQkJCSAgTlVMTCwgMSwg a2V5KTsKKworCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKHR1cCA9IHN5c3RhYmxlX2dldG5leHQo c2NhbikpKQorCXsKKwkJaWYoZGljdC0+bmVudHJpZXMgPT0gZW50cmllc19hbGxvY2F0ZWQpCisJ CXsKKwkJCWVudHJpZXNfYWxsb2NhdGVkID0gZW50cmllc19hbGxvY2F0ZWQgKiAyOworCQkJZGlj dC0+ZW50cmllcyA9IChEaWN0RW50cnkqKXJlcGFsbG9jKGRpY3QtPmVudHJpZXMsIGVudHJpZXNf YWxsb2NhdGVkKnNpemVvZihEaWN0RW50cnkpKTsKKwkJfQorCisJCWRpY3QtPmVudHJpZXNbZGlj dC0+bmVudHJpZXNdLm9pZCA9ICgoRm9ybV9wZ19kaWN0KSBHRVRTVFJVQ1QodHVwKSktPm9pZDsK KwkJZGljdC0+ZW50cmllc1tkaWN0LT5uZW50cmllc10uZGljdGVudHJ5ID0gKChGb3JtX3BnX2Rp Y3QpIEdFVFNUUlVDVCh0dXApKS0+ZGljdGVudHJ5OworCQlkaWN0LT5uZW50cmllcysrOworCX0K KworCXN5c3RhYmxlX2VuZHNjYW4oc2Nhbik7CisJdGFibGVfY2xvc2UocGdfZGljdCwgUm93RXhj bHVzaXZlTG9jayk7CisKKwlyZXR1cm4gZGljdDsKK30KKworLyoKKyAqIERlbGV0ZXMgYWxsIHRo ZSBlbnRyaWVzIGZvciB0aGUgZGljdGluYXJ5IHdpdGggZ2l2ZW4gT2lkLgorICovCit2b2lkCitE aWN0RW50cmllc0RlbGV0ZShPaWQgZGljdFR5cGVPaWQpCit7CisJUmVsYXRpb24JcGdfZGljdDsK KwlTY2FuS2V5RGF0YSBrZXlbMV07CisJU3lzU2NhbkRlc2Mgc2NhbjsKKwlIZWFwVHVwbGUJdHVw OworCisJcGdfZGljdCA9IHRhYmxlX29wZW4oRGljdFJlbGF0aW9uSWQsIFJvd0V4Y2x1c2l2ZUxv Y2spOworCisJU2NhbktleUluaXQoJmtleVswXSwKKwkJCQlBbnVtX3BnX2RpY3RfZGljdHR5cGlk LAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKKwkJCQlPYmplY3RJZEdldERh dHVtKGRpY3RUeXBlT2lkKSk7CisKKwlzY2FuID0gc3lzdGFibGVfYmVnaW5zY2FuKHBnX2RpY3Qs IERpY3RUeXBJZEVudHJ5SW5kZXhJZCwgdHJ1ZSwKKwkJCQkJCQkgIE5VTEwsIDEsIGtleSk7CisK Kwl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZCh0dXAgPSBzeXN0YWJsZV9nZXRuZXh0KHNjYW4pKSkK Kwl7CisJCUNhdGFsb2dUdXBsZURlbGV0ZShwZ19kaWN0LCAmdHVwLT50X3NlbGYpOworCX0KKwor CXN5c3RhYmxlX2VuZHNjYW4oc2Nhbik7CisJdGFibGVfY2xvc2UocGdfZGljdCwgUm93RXhjbHVz aXZlTG9jayk7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy90eXBlY21kcy5j IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdHlwZWNtZHMuYwppbmRleCA5YjkyYjA0MjQyLi41YmJi YmUwOWFmIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy90eXBlY21kcy5jCisrKyBi L3NyYy9iYWNrZW5kL2NvbW1hbmRzL3R5cGVjbWRzLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNs dWRlICJjYXRhbG9nL3BnX2NvbGxhdGlvbi5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfY29uc3Ry YWludC5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfZGVwZW5kLmgiCisjaW5jbHVkZSAiY2F0YWxv Zy9wZ19kaWN0LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19lbnVtLmgiCiAjaW5jbHVkZSAiY2F0 YWxvZy9wZ19sYW5ndWFnZS5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfbmFtZXNwYWNlLmgiCkBA IC02NzksNiArNjgwLDE0IEBAIFJlbW92ZVR5cGVCeUlkKE9pZCB0eXBlT2lkKQogCWlmICgoKEZv cm1fcGdfdHlwZSkgR0VUU1RSVUNUKHR1cCkpLT50eXB0eXBlID09IFRZUFRZUEVfUkFOR0UpCiAJ CVJhbmdlRGVsZXRlKHR5cGVPaWQpOwogCisJLyoKKwkgKiBJZiBpdCBpcyBhIGRpY3Rpb25hcnkg dHlwZSwgZGVsZXRlIHRoZSBwZ19kaWN0IGVudHJpZXMgdG9vOyB3ZSBkb24ndAorCSAqIGJvdGhl ciB3aXRoIG1ha2luZyBhIGRlcGVuZGVuY3kgZW50cnkgZm9yIHRoYXQsIHNvIGl0IGhhcyB0byBi ZSBkb25lCisJICogImJ5IGhhbmQiIGhlcmUuCisJICovCisJaWYgKCgoRm9ybV9wZ190eXBlKSBH RVRTVFJVQ1QodHVwKSktPnR5cHR5cGUgPT0gVFlQVFlQRV9ESUNUKQorCQlEaWN0RW50cmllc0Rl bGV0ZSh0eXBlT2lkKTsKKwogCVJlbGVhc2VTeXNDYWNoZSh0dXApOwogCiAJdGFibGVfY2xvc2Uo cmVsYXRpb24sIFJvd0V4Y2x1c2l2ZUxvY2spOwpAQCAtNzYzLDggKzc3Miw4IEBAIERlZmluZURv bWFpbihDcmVhdGVEb21haW5TdG10ICpzdG10KQogCiAJLyoKIAkgKiBCYXNlIHR5cGUgbXVzdCBi ZSBhIHBsYWluIGJhc2UgdHlwZSwgYSBjb21wb3NpdGUgdHlwZSwgYW5vdGhlciBkb21haW4sCi0J ICogYW4gZW51bSBvciBhIHJhbmdlIHR5cGUuICBEb21haW5zIG92ZXIgcHNldWRvdHlwZXMgd291 bGQgY3JlYXRlIGEKLQkgKiBzZWN1cml0eSBob2xlLiAgKEl0IHdvdWxkIGJlIHNob3J0ZXIgdG8g Y29kZSB0aGlzIHRvIGp1c3QgY2hlY2sgZm9yCisJICogYSBkaWN0LCBhbiBlbnVtIG9yIGEgcmFu Z2UgdHlwZS4gIERvbWFpbnMgb3ZlciBwc2V1ZG90eXBlcyB3b3VsZCBjcmVhdGUKKwkgKiBhIHNl Y3VyaXR5IGhvbGUuICAoSXQgd291bGQgYmUgc2hvcnRlciB0byBjb2RlIHRoaXMgdG8ganVzdCBj aGVjayBmb3IKIAkgKiBwc2V1ZG90eXBlczsgYnV0IGl0IHNlZW1zIHNhZmVyIHRvIGNhbGwgb3V0 IHRoZSBzcGVjaWZpYyB0eXB0eXBlcyB0aGF0CiAJICogYXJlIHN1cHBvcnRlZCwgcmF0aGVyIHRo YW4gYXNzdW1lIHRoYXQgYWxsIGZ1dHVyZSB0eXB0eXBlcyB3b3VsZCBiZQogCSAqIGF1dG9tYXRp Y2FsbHkgc3VwcG9ydGVkLikKQEAgLTc3Miw2ICs3ODEsNyBAQCBEZWZpbmVEb21haW4oQ3JlYXRl RG9tYWluU3RtdCAqc3RtdCkKIAl0eXB0eXBlID0gYmFzZVR5cGUtPnR5cHR5cGU7CiAJaWYgKHR5 cHR5cGUgIT0gVFlQVFlQRV9CQVNFICYmCiAJCXR5cHR5cGUgIT0gVFlQVFlQRV9DT01QT1NJVEUg JiYKKwkJdHlwdHlwZSAhPSBUWVBUWVBFX0RJQ1QgJiYKIAkJdHlwdHlwZSAhPSBUWVBUWVBFX0RP TUFJTiAmJgogCQl0eXB0eXBlICE9IFRZUFRZUEVfRU5VTSAmJgogCQl0eXB0eXBlICE9IFRZUFRZ UEVfUkFOR0UgJiYKQEAgLTExMjksNiArMTEzOSwxNDMgQEAgRGVmaW5lRG9tYWluKENyZWF0ZURv bWFpblN0bXQgKnN0bXQpCiB9CiAKIAorLyoKKyAqIERlZmluZURpY3Rpb25hcnkKKyAqCQlSZWdp c3RlcnMgYSBuZXcgZGljdGlvbmFyeS4KKyAqLworT2JqZWN0QWRkcmVzcworRGVmaW5lRGljdGlv bmFyeShDcmVhdGVEaWN0aW9uYXJ5U3RtdCAqIHN0bXQpCit7CisJY2hhcgkgICAqZGljdE5hbWU7 CisJY2hhcgkgICAqZGljdEFycmF5TmFtZTsKKwlPaWQJCQlkaWN0TmFtZXNwYWNlOworCUFjbFJl c3VsdAlhY2xyZXN1bHQ7CisJT2lkCQkJb2xkX3R5cGVfb2lkOworCU9pZAkJCWRpY3RBcnJheU9p ZDsKKwlPYmplY3RBZGRyZXNzIGRpY3RUeXBlQWRkcjsKKworCS8qIENvbnZlcnQgbGlzdCBvZiBu YW1lcyB0byBhIG5hbWUgYW5kIG5hbWVzcGFjZSAqLworCWRpY3ROYW1lc3BhY2UgPSBRdWFsaWZp ZWROYW1lR2V0Q3JlYXRpb25OYW1lc3BhY2Uoc3RtdC0+dHlwZU5hbWUsCisJCQkJCQkJCQkJCQkJ ICAmZGljdE5hbWUpOworCisJLyogQ2hlY2sgd2UgaGF2ZSBjcmVhdGlvbiByaWdodHMgaW4gdGFy Z2V0IG5hbWVzcGFjZSAqLworCWFjbHJlc3VsdCA9IHBnX25hbWVzcGFjZV9hY2xjaGVjayhkaWN0 TmFtZXNwYWNlLCBHZXRVc2VySWQoKSwgQUNMX0NSRUFURSk7CisJaWYgKGFjbHJlc3VsdCAhPSBB Q0xDSEVDS19PSykKKwkJYWNsY2hlY2tfZXJyb3IoYWNscmVzdWx0LCBPQkpFQ1RfU0NIRU1BLAor CQkJCQkgICBnZXRfbmFtZXNwYWNlX25hbWUoZGljdE5hbWVzcGFjZSkpOworCisJLyogQUFMRUtT RUVWIFRPRE8gbWFrZSBzdXJlIHRoaXMgaXMgYWxsb3dlZCBvbmx5IGZvciBKU09OQiAqLworCisJ LyoKKwkgKiBDaGVjayBmb3IgY29sbGlzaW9uIHdpdGggYW4gZXhpc3RpbmcgdHlwZSBuYW1lLiAg SWYgdGhlcmUgaXMgb25lIGFuZAorCSAqIGl0J3MgYW4gYXV0b2dlbmVyYXRlZCBhcnJheSwgd2Ug Y2FuIHJlbmFtZSBpdCBvdXQgb2YgdGhlIHdheS4KKwkgKi8KKwlvbGRfdHlwZV9vaWQgPSBHZXRT eXNDYWNoZU9pZDIoVFlQRU5BTUVOU1AsIEFudW1fcGdfdHlwZV9vaWQsCisJCQkJCQkJCSAgIENT dHJpbmdHZXREYXR1bShkaWN0TmFtZSksCisJCQkJCQkJCSAgIE9iamVjdElkR2V0RGF0dW0oZGlj dE5hbWVzcGFjZSkpOworCWlmIChPaWRJc1ZhbGlkKG9sZF90eXBlX29pZCkpCisJeworCQlpZiAo IW1vdmVBcnJheVR5cGVOYW1lKG9sZF90eXBlX29pZCwgZGljdE5hbWUsIGRpY3ROYW1lc3BhY2Up KQorCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycmNvZGUoRVJSQ09ERV9EVVBMSUNBVEVfT0JK RUNUKSwKKwkJCQkJIGVycm1zZygidHlwZSBcIiVzXCIgYWxyZWFkeSBleGlzdHMiLCBkaWN0TmFt ZSkpKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBPSUQgZm9yIGFycmF5IHR5cGUgKi8KKwlkaWN0QXJy YXlPaWQgPSBBc3NpZ25UeXBlQXJyYXlPaWQoKTsKKworCS8qIENyZWF0ZSB0aGUgcGdfdHlwZSBl bnRyeSAqLworCWRpY3RUeXBlQWRkciA9CisJCVR5cGVDcmVhdGUoSW52YWxpZE9pZCwJLyogbm8g cHJlZGV0ZXJtaW5lZCB0eXBlIE9JRCAqLworCQkJCSAgIGRpY3ROYW1lLAkvKiB0eXBlIG5hbWUg Ki8KKwkJCQkgICBkaWN0TmFtZXNwYWNlLAkvKiBuYW1lc3BhY2UgKi8KKwkJCQkgICBJbnZhbGlk T2lkLAkvKiByZWxhdGlvbiBvaWQgKG4vYSBoZXJlKSAqLworCQkJCSAgIDAsCQkJLyogcmVsYXRp b24ga2luZCAoZGl0dG8pICovCisJCQkJICAgR2V0VXNlcklkKCksIC8qIG93bmVyJ3MgSUQgKi8K KwkJCQkgICAtMSwJCQkvKiBpbnRlcm5hbCBzaXplOiB2YXJsZW5hLCBhcyBmb3IgSlNPTkIgKi8K KwkJCQkgICBUWVBUWVBFX0RJQ1QsCS8qIHR5cGUtdHlwZTogZGljdGlvbmFyeSAqLworCQkJCSAg IFRZUENBVEVHT1JZX1VTRVIsCS8qIHR5cGUtY2F0ZWdvcnk6IHVzZXIsIGFzIGZvciBKU09OQiAq LworCQkJCSAgIGZhbHNlLAkJLyogZGljdCB0eXBlcyBhcmUgbmV2ZXIgcHJlZmVycmVkICovCisJ CQkJICAgREVGQVVMVF9UWVBERUxJTSwJLyogYXJyYXkgZWxlbWVudCBkZWxpbWl0ZXIgKi8KKwkJ CQkgICBGX0RJQ1RJT05BUllfSU4sIC8qIGlucHV0IHByb2NlZHVyZSAqLworCQkJCSAgIEZfRElD VElPTkFSWV9PVVQsCS8qIG91dHB1dCBwcm9jZWR1cmUgKi8KKwkJCQkgICBJbnZhbGlkT2lkLAkv KiByZWNlaXZlIHByb2NlZHVyZTogbm9uZSAqLworCQkJCSAgIEludmFsaWRPaWQsCS8qIHNlbmQg cHJvY2VkdXJlOiBub25lICovCisJCQkJICAgSW52YWxpZE9pZCwJLyogdHlwbW9kaW4gcHJvY2Vk dXJlIC0gbm9uZSAqLworCQkJCSAgIEludmFsaWRPaWQsCS8qIHR5cG1vZG91dCBwcm9jZWR1cmUg LSBub25lICovCisJCQkJICAgSW52YWxpZE9pZCwJLyogYW5hbHl6ZSBwcm9jZWR1cmUgLSBkZWZh dWx0ICovCisJCQkJICAgSW52YWxpZE9pZCwJLyogc3Vic2NyaXB0IHByb2NlZHVyZSAtIG5vbmUg Ki8KKwkJCQkgICBJbnZhbGlkT2lkLAkvKiBlbGVtZW50IHR5cGUgSUQgKi8KKwkJCQkgICBmYWxz ZSwJCS8qIHRoaXMgaXMgbm90IGFuIGFycmF5IHR5cGUgKi8KKwkJCQkgICBkaWN0QXJyYXlPaWQs CS8qIGFycmF5IHR5cGUgd2UgYXJlIGFib3V0IHRvIGNyZWF0ZSAqLworCQkJCSAgIEludmFsaWRP aWQsCS8qIGJhc2UgdHlwZSBJRCAob25seSBmb3IgZG9tYWlucykgKi8KKwkJCQkgICBOVUxMLAkJ LyogbmV2ZXIgYSBkZWZhdWx0IHR5cGUgdmFsdWUgKi8KKwkJCQkgICBOVUxMLAkJLyogYmluYXJ5 IGRlZmF1bHQgaXNuJ3Qgc2VudCBlaXRoZXIgKi8KKwkJCQkgICBmYWxzZSwJCS8qIHBhc3NlZCBi eSB2YWx1ZTogc2FtZSBhcyBmb3IgSlNPTkIgKi8KKwkJCQkgICBUWVBBTElHTl9JTlQsCS8qIGlu dCBhbGlnbm1lbnQgKi8KKwkJCQkgICBUWVBTVE9SQUdFX0VYVEVOREVELCAvKiBUT0FTVCBzdHJh dGVneTogZnVsbHkgdG9hc3RhYmxlLCBhcworCQkJCQkJCQkJCSAqIEpTT05CICovCisJCQkJICAg LTEsCQkJLyogdHlwTW9kIChEb21haW5zIG9ubHkpICovCisJCQkJICAgMCwJCQkvKiBBcnJheSBk aW1lbnNpb25zIG9mIHR5cGJhc2V0eXBlICovCisJCQkJICAgZmFsc2UsCQkvKiBUeXBlIE5PVCBO VUxMICovCisJCQkJICAgSW52YWxpZE9pZCk7IC8qIHR5cGUncyBjb2xsYXRpb24gKi8KKworCS8q CisJICogQ3JlYXRlIHRoZSBhcnJheSB0eXBlIHRoYXQgZ29lcyB3aXRoIGl0LgorCSAqLworCWRp Y3RBcnJheU5hbWUgPSBtYWtlQXJyYXlUeXBlTmFtZShkaWN0TmFtZSwgZGljdE5hbWVzcGFjZSk7 CisKKwlUeXBlQ3JlYXRlKGRpY3RBcnJheU9pZCwJLyogZm9yY2UgYXNzaWdubWVudCBvZiB0aGlz IHR5cGUgT0lEICovCisJCQkgICBkaWN0QXJyYXlOYW1lLAkvKiB0eXBlIG5hbWUgKi8KKwkJCSAg IGRpY3ROYW1lc3BhY2UsCS8qIG5hbWVzcGFjZSAqLworCQkJICAgSW52YWxpZE9pZCwJCS8qIHJl bGF0aW9uIG9pZCAobi9hIGhlcmUpICovCisJCQkgICAwLAkJCQkvKiByZWxhdGlvbiBraW5kIChk aXR0bykgKi8KKwkJCSAgIEdldFVzZXJJZCgpLAkJLyogb3duZXIncyBJRCAqLworCQkJICAgLTEs CQkJCS8qIGludGVybmFsIHNpemUgKGFsd2F5cyB2YXJsZW5hKSAqLworCQkJICAgVFlQVFlQRV9C QVNFLAkvKiB0eXBlLXR5cGUgKGJhc2UgdHlwZSkgKi8KKwkJCSAgIFRZUENBVEVHT1JZX0FSUkFZ LAkvKiB0eXBlLWNhdGVnb3J5IChhcnJheSkgKi8KKwkJCSAgIGZhbHNlLAkJCS8qIGFycmF5IHR5 cGVzIGFyZSBuZXZlciBwcmVmZXJyZWQgKi8KKwkJCSAgIERFRkFVTFRfVFlQREVMSU0sCS8qIGFy cmF5IGVsZW1lbnQgZGVsaW1pdGVyICovCisJCQkgICBGX0FSUkFZX0lOLAkJLyogaW5wdXQgcHJv Y2VkdXJlICovCisJCQkgICBGX0FSUkFZX09VVCwJCS8qIG91dHB1dCBwcm9jZWR1cmUgKi8KKwkJ CSAgIEZfQVJSQVlfUkVDViwJLyogcmVjZWl2ZSBwcm9jZWR1cmUgKi8KKwkJCSAgIEZfQVJSQVlf U0VORCwJLyogc2VuZCBwcm9jZWR1cmUgKi8KKwkJCSAgIEludmFsaWRPaWQsCQkvKiB0eXBtb2Rp biBwcm9jZWR1cmUgLSBub25lICovCisJCQkgICBJbnZhbGlkT2lkLAkJLyogdHlwbW9kb3V0IHBy b2NlZHVyZSAtIG5vbmUgKi8KKwkJCSAgIEZfQVJSQVlfVFlQQU5BTFlaRSwJLyogYW5hbHl6ZSBw cm9jZWR1cmUgKi8KKwkJCSAgIEZfQVJSQVlfU1VCU0NSSVBUX0hBTkRMRVIsCS8qIGFycmF5IHN1 YnNjcmlwdCBwcm9jZWR1cmUgKi8KKwkJCSAgIGRpY3RUeXBlQWRkci5vYmplY3RJZCwJLyogZWxl bWVudCB0eXBlIElEICovCisJCQkgICB0cnVlLAkJCS8qIHllcyB0aGlzIGlzIGFuIGFycmF5IHR5 cGUgKi8KKwkJCSAgIEludmFsaWRPaWQsCQkvKiBubyBmdXJ0aGVyIGFycmF5IHR5cGUgKi8KKwkJ CSAgIEludmFsaWRPaWQsCQkvKiBiYXNlIHR5cGUgSUQgKi8KKwkJCSAgIE5VTEwsCQkJLyogbmV2 ZXIgYSBkZWZhdWx0IHR5cGUgdmFsdWUgKi8KKwkJCSAgIE5VTEwsCQkJLyogYmluYXJ5IGRlZmF1 bHQgaXNuJ3Qgc2VudCBlaXRoZXIgKi8KKwkJCSAgIGZhbHNlLAkJCS8qIHBhc3NlZCBieSB2YWx1 ZTogc2FtZSBhcyBmb3IgSlNPTkIgKi8KKwkJCSAgIFRZUEFMSUdOX0lOVCwJLyogZW51bXMgaGF2 ZSBpbnQgYWxpZ24sIHNvIGRvIHRoZWlyIGFycmF5cyAqLworCQkJICAgVFlQU1RPUkFHRV9FWFRF TkRFRCwgLyogQVJSQVkgaXMgYWx3YXlzIHRvYXN0YWJsZSAqLworCQkJICAgLTEsCQkJCS8qIHR5 cE1vZCAoRG9tYWlucyBvbmx5KSAqLworCQkJICAgMCwJCQkJLyogQXJyYXkgZGltZW5zaW9ucyBv ZiB0eXBiYXNldHlwZSAqLworCQkJICAgZmFsc2UsCQkJLyogVHlwZSBOT1QgTlVMTCAqLworCQkJ ICAgSW52YWxpZE9pZCk7CQkvKiB0eXBlJ3MgY29sbGF0aW9uICovCisKKwlwZnJlZShkaWN0QXJy YXlOYW1lKTsKKworCS8qIEVudGVyIHRoZSBkaWN0J3MgZW50cmllcyBpbnRvIHBnX2RpY3QgKi8K KwlEaWN0RW50cmllc0NyZWF0ZShkaWN0VHlwZUFkZHIub2JqZWN0SWQsIHN0bXQtPnZhbHMpOwor CisJLyogQ3JlYXRlIGNhc3RzIHRvIGFuZCBmcm9tIEpTT05CICovCisJQ2FzdENyZWF0ZShKU09O Qk9JRCwgZGljdFR5cGVBZGRyLm9iamVjdElkLCBGX0pTT05CX0RJQ1RJT05BUlksICdhJywgJ2Yn LCBERVBFTkRFTkNZX0lOVEVSTkFMKTsKKwlDYXN0Q3JlYXRlKGRpY3RUeXBlQWRkci5vYmplY3RJ ZCwgSlNPTkJPSUQsIEZfRElDVElPTkFSWV9KU09OQiwgJ2knLCAnZicsIERFUEVOREVOQ1lfSU5U RVJOQUwpOworCisJLyoKKwkgKiBDcmVhdGUgZXhwbGljaXQgY2FzdCB0byBieXRlYS4gVGhpcyBp cyBjb252ZW5pZW50IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisJICogQ2FzdGluZyBieXRlYSB0 byBhIGRpY3Rpb25hcnkgdHlwZSBpcyBkYW5nZXJvdXMgYW5kIHRodXMgbm90IHN1cHBvcnRlZC4K KwkgKi8KKwlDYXN0Q3JlYXRlKGRpY3RUeXBlQWRkci5vYmplY3RJZCwgQllURUFPSUQsIEZfRElD VElPTkFSWV9CWVRFQSwgJ2UnLCAnZicsIERFUEVOREVOQ1lfSU5URVJOQUwpOworCisJcmV0dXJu IGRpY3RUeXBlQWRkcjsKK30KKwogLyoKICAqIERlZmluZUVudW0KICAqCQlSZWdpc3RlcnMgYSBu ZXcgZW51bS4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2Z1bmN0aW9ucy5jIGIv c3JjL2JhY2tlbmQvZXhlY3V0b3IvZnVuY3Rpb25zLmMKaW5kZXggZjk0NjBhZTUwNi4uN2FkM2Rl M2EwMCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZnVuY3Rpb25zLmMKKysrIGIv c3JjL2JhY2tlbmQvZXhlY3V0b3IvZnVuY3Rpb25zLmMKQEAgLTE3MDgsNiArMTcwOCw3IEBAIGNo ZWNrX3NxbF9mbl9yZXR2YWwoTGlzdCAqcXVlcnlUcmVlTGlzdHMsCiAKIAlpZiAoZm5fdHlwdHlw ZSA9PSBUWVBUWVBFX0JBU0UgfHwKIAkJZm5fdHlwdHlwZSA9PSBUWVBUWVBFX0RPTUFJTiB8fAor CQlmbl90eXB0eXBlID09IFRZUFRZUEVfRElDVCB8fAogCQlmbl90eXB0eXBlID09IFRZUFRZUEVf RU5VTSB8fAogCQlmbl90eXB0eXBlID09IFRZUFRZUEVfUkFOR0UgfHwKIAkJZm5fdHlwdHlwZSA9 PSBUWVBUWVBFX01VTFRJUkFOR0UpCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9ub2Rlcy9jb3B5 ZnVuY3MuYyBiL3NyYy9iYWNrZW5kL25vZGVzL2NvcHlmdW5jcy5jCmluZGV4IDgzNmY0MjdlYTgu LjA0YjlkNTczZjQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL25vZGVzL2NvcHlmdW5jcy5jCisr KyBiL3NyYy9iYWNrZW5kL25vZGVzL2NvcHlmdW5jcy5jCkBAIC00NDQwLDYgKzQ0NDAsMTggQEAg X2NvcHlDb21wb3NpdGVUeXBlU3RtdChjb25zdCBDb21wb3NpdGVUeXBlU3RtdCAqZnJvbSkKIAly ZXR1cm4gbmV3bm9kZTsKIH0KIAorc3RhdGljIENyZWF0ZURpY3Rpb25hcnlTdG10ICoKK19jb3B5 Q3JlYXRlRGljdGlvbmFyeVN0bXQoY29uc3QgQ3JlYXRlRGljdGlvbmFyeVN0bXQgKmZyb20pCit7 CisJQ3JlYXRlRGljdGlvbmFyeVN0bXQgKm5ld25vZGUgPSBtYWtlTm9kZShDcmVhdGVEaWN0aW9u YXJ5U3RtdCk7CisKKwlDT1BZX05PREVfRklFTEQodHlwZU5hbWUpOworCUNPUFlfTk9ERV9GSUVM RChiYXNlVHlwZU5hbWUpOworCUNPUFlfTk9ERV9GSUVMRCh2YWxzKTsKKworCXJldHVybiBuZXdu b2RlOworfQorCiBzdGF0aWMgQ3JlYXRlRW51bVN0bXQgKgogX2NvcHlDcmVhdGVFbnVtU3RtdChj b25zdCBDcmVhdGVFbnVtU3RtdCAqZnJvbSkKIHsKQEAgLTYxODEsNiArNjE5Myw5IEBAIGNvcHlP YmplY3RJbXBsKGNvbnN0IHZvaWQgKmZyb20pCiAJCWNhc2UgVF9Db21wb3NpdGVUeXBlU3RtdDoK IAkJCXJldHZhbCA9IF9jb3B5Q29tcG9zaXRlVHlwZVN0bXQoZnJvbSk7CiAJCQlicmVhazsKKwkJ Y2FzZSBUX0NyZWF0ZURpY3Rpb25hcnlTdG10OgorCQkJcmV0dmFsID0gX2NvcHlDcmVhdGVEaWN0 aW9uYXJ5U3RtdChmcm9tKTsKKwkJCWJyZWFrOwogCQljYXNlIFRfQ3JlYXRlRW51bVN0bXQ6CiAJ CQlyZXR2YWwgPSBfY29weUNyZWF0ZUVudW1TdG10KGZyb20pOwogCQkJYnJlYWs7CmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC9ub2Rlcy9lcXVhbGZ1bmNzLmMgYi9zcmMvYmFja2VuZC9ub2Rlcy9l cXVhbGZ1bmNzLmMKaW5kZXggZTAxM2MxYmJmZS4uMzgxZDhiNDZmNSAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvbm9kZXMvZXF1YWxmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5kL25vZGVzL2VxdWFs ZnVuY3MuYwpAQCAtMTk2Miw2ICsxOTYyLDE2IEBAIF9lcXVhbENvbXBvc2l0ZVR5cGVTdG10KGNv bnN0IENvbXBvc2l0ZVR5cGVTdG10ICphLCBjb25zdCBDb21wb3NpdGVUeXBlU3RtdCAqYikKIAly ZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGJvb2wKK19lcXVhbENyZWF0ZURpY3Rpb25hcnlTdG10 KGNvbnN0IENyZWF0ZURpY3Rpb25hcnlTdG10ICphLCBjb25zdCBDcmVhdGVEaWN0aW9uYXJ5U3Rt dCAqYikKK3sKKwlDT01QQVJFX05PREVfRklFTEQodHlwZU5hbWUpOworCUNPTVBBUkVfTk9ERV9G SUVMRChiYXNlVHlwZU5hbWUpOworCUNPTVBBUkVfTk9ERV9GSUVMRCh2YWxzKTsKKworCXJldHVy biB0cnVlOworfQorCiBzdGF0aWMgYm9vbAogX2VxdWFsQ3JlYXRlRW51bVN0bXQoY29uc3QgQ3Jl YXRlRW51bVN0bXQgKmEsIGNvbnN0IENyZWF0ZUVudW1TdG10ICpiKQogewpAQCAtMzk4NCw2ICsz OTk0LDkgQEAgZXF1YWwoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKIAkJY2FzZSBUX0Nv bXBvc2l0ZVR5cGVTdG10OgogCQkJcmV0dmFsID0gX2VxdWFsQ29tcG9zaXRlVHlwZVN0bXQoYSwg Yik7CiAJCQlicmVhazsKKwkJY2FzZSBUX0NyZWF0ZURpY3Rpb25hcnlTdG10OgorCQkJcmV0dmFs ID0gX2VxdWFsQ3JlYXRlRGljdGlvbmFyeVN0bXQoYSwgYik7CisJCQlicmVhazsKIAkJY2FzZSBU X0NyZWF0ZUVudW1TdG10OgogCQkJcmV0dmFsID0gX2VxdWFsQ3JlYXRlRW51bVN0bXQoYSwgYik7 CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3BhcnNlci9ncmFtLnkgYi9zcmMv YmFja2VuZC9wYXJzZXIvZ3JhbS55CmluZGV4IGM5OTQxZDljYjQuLjJhYzYzMmUwMjUgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL3BhcnNlci9ncmFtLnkKKysrIGIvc3JjL2JhY2tlbmQvcGFyc2Vy L2dyYW0ueQpAQCAtNTk3Miw2ICs1OTcyLDE0IEBAIERlZmluZVN0bXQ6CiAJCQkJCW4tPmNvbGRl Zmxpc3QgPSAkNjsKIAkJCQkJJCQgPSAoTm9kZSAqKW47CiAJCQkJfQorCQkJfCBDUkVBVEUgVFlQ RV9QIGFueV9uYW1lIEFTIERJQ1RJT05BUlkgT0YgYW55X25hbWUgJygnIG9wdF9lbnVtX3ZhbF9s aXN0ICcpJworCQkJCXsKKwkJCQkJQ3JlYXRlRGljdGlvbmFyeVN0bXQgKm4gPSBtYWtlTm9kZShD cmVhdGVEaWN0aW9uYXJ5U3RtdCk7CisJCQkJCW4tPnR5cGVOYW1lID0gJDM7CisJCQkJCW4tPmJh c2VUeXBlTmFtZSA9ICQ3OworCQkJCQluLT52YWxzID0gJDk7CisJCQkJCSQkID0gKE5vZGUgKilu OworCQkJCX0KIAkJCXwgQ1JFQVRFIFRZUEVfUCBhbnlfbmFtZSBBUyBFTlVNX1AgJygnIG9wdF9l bnVtX3ZhbF9saXN0ICcpJwogCQkJCXsKIAkJCQkJQ3JlYXRlRW51bVN0bXQgKm4gPSBtYWtlTm9k ZShDcmVhdGVFbnVtU3RtdCk7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wYXJzZXIvcGFyc2Vf Y29lcmNlLmMgYi9zcmMvYmFja2VuZC9wYXJzZXIvcGFyc2VfY29lcmNlLmMKaW5kZXggYzRlOTU4 ZTRhYS4uZTQ4OWRkOTQyMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcGFyc2VyL3BhcnNlX2Nv ZXJjZS5jCisrKyBiL3NyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV9jb2VyY2UuYwpAQCAtMjc5LDcg KzI3OSwyMiBAQCBjb2VyY2VfdHlwZShQYXJzZVN0YXRlICpwc3RhdGUsIE5vZGUgKm5vZGUsCiAJ CWlmIChiYXNlVHlwZUlkID09IElOVEVSVkFMT0lEKQogCQkJaW5wdXRUeXBlTW9kID0gYmFzZVR5 cGVNb2Q7CiAJCWVsc2UKLQkJCWlucHV0VHlwZU1vZCA9IC0xOworCQl7CisJCQlpZigoaW50MzIp dGFyZ2V0VHlwZUlkID09IHRhcmdldFR5cGVNb2QpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBGb3Ig ZGljdGlvbmFyaWVzIGludGVybmFsbHkgd2Ugc2V0IHR5cG1vZCB0byBhIGRpY3Rpb25hcnkKKwkJ CQkgKiBPSUQuIFRoaXMgYWxsb3dzIGRpY3Rpb25hcnlfaW4oKSBhbmQganNvbmJfZGljdGlvbmFy eSgpIHRvCisJCQkJICogZGlzdGluZ3Vpc2ggb25lIGRpY3Rpb25hcnkgZnJvbSBhbm90aGVyLgor CQkJCSAqCisJCQkJICogSXQgYWxzbyBhbGxvd3MgdXMgdG8gcmVjb2duaXplIHRoYXQgdGhlIHRh cmdldCB0eXBlIGlzCisJCQkJICogYSBkaWN0aW9uYXJ5IGhlcmUgYW5kIHBhc3MgYSBjb3JyZWN0 IHR5cG1vZC4KKwkJCQkgKi8KKwkJCQlpbnB1dFR5cGVNb2QgPSB0YXJnZXRUeXBlTW9kOworCQkJ fQorCQkJZWxzZQorCQkJCWlucHV0VHlwZU1vZCA9IC0xOworCQl9CiAKIAkJYmFzZVR5cGUgPSB0 eXBlaWRUeXBlKGJhc2VUeXBlSWQpOwogCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wYXJzZXIv cGFyc2VfdHlwZS5jIGIvc3JjL2JhY2tlbmQvcGFyc2VyL3BhcnNlX3R5cGUuYwppbmRleCAzMDcx MTRhMzBkLi44NjhiMjRmZDlmIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9wYXJzZXIvcGFyc2Vf dHlwZS5jCisrKyBiL3NyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV90eXBlLmMKQEAgLTI1OSw2ICsy NTksMTAgQEAgTG9va3VwVHlwZU5hbWVPaWQoUGFyc2VTdGF0ZSAqcHN0YXRlLCBjb25zdCBUeXBl TmFtZSAqdHlwZU5hbWUsIGJvb2wgbWlzc2luZ19vaykKICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0 byBMb29rdXBUeXBlTmFtZSwgZXhjZXB0IHRoYXQgdGhpcyB3aWxsIHJlcG9ydAogICogYSBzdWl0 YWJsZSBlcnJvciBtZXNzYWdlIGlmIHRoZSB0eXBlIGNhbm5vdCBiZSBmb3VuZCBvciBpcyBub3Qg ZGVmaW5lZC4KICAqIENhbGxlcnMgb2YgdGhpcyBjYW4gdGhlcmVmb3JlIGFzc3VtZSB0aGUgcmVz dWx0IGlzIGEgZnVsbHkgdmFsaWQgdHlwZS4KKyAqCisgKiBGb3IgYSBkaWN0aW9uYXJ5IHR5cGUg aXQncyBPSUQgaXMgcmV0dXJuZWQgYXMgYSB0eXBtb2QuIFRoaXMgaXMgdXNlZCBieQorICogZGlj dGlvbmFyeV9pbigpIGFuZCBqc29uYl9kaWN0aW9uYXJ5KCkgdG8gZGlzdGluZ3Vpc2ggb25lIGRp Y3Rpb25hcnkgZnJvbQorICogYW5vdGhlci4KICAqLwogVHlwZQogdHlwZW5hbWVUeXBlKFBhcnNl U3RhdGUgKnBzdGF0ZSwgY29uc3QgVHlwZU5hbWUgKnR5cGVOYW1lLCBpbnQzMiAqdHlwbW9kX3Ap CkBAIC0zMDUsNiArMzA5LDEwIEBAIHR5cGVuYW1lVHlwZUlkKFBhcnNlU3RhdGUgKnBzdGF0ZSwg Y29uc3QgVHlwZU5hbWUgKnR5cGVOYW1lKQogICoKICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0 eXBlbmFtZVR5cGUsIGJ1dCB3ZSBvbmx5IGhhbmQgYmFjayB0aGUgdHlwZSBPSUQKICAqIGFuZCB0 eXBtb2QsIG5vdCB0aGUgc3lzY2FjaGUgZW50cnkuCisgKgorICogRm9yIGEgZGljdGlvbmFyeSB0 eXBlIGl0J3MgT0lEIGlzIHJldHVybmVkIGFzIGEgdHlwbW9kLiBUaGlzIGlzIHVzZWQgYnkKKyAq IGRpY3Rpb25hcnlfaW4oKSBhbmQganNvbmJfZGljdGlvbmFyeSgpIHRvIGRpc3Rpbmd1aXNoIG9u ZSBkaWN0aW9uYXJ5IGZyb20KKyAqIGFub3RoZXIuCiAgKi8KIHZvaWQKIHR5cGVuYW1lVHlwZUlk QW5kTW9kKFBhcnNlU3RhdGUgKnBzdGF0ZSwgY29uc3QgVHlwZU5hbWUgKnR5cGVOYW1lLApAQCAt MzI3LDYgKzMzNSwxMCBAQCB0eXBlbmFtZVR5cGVJZEFuZE1vZChQYXJzZVN0YXRlICpwc3RhdGUs IGNvbnN0IFR5cGVOYW1lICp0eXBlTmFtZSwKICAqIGxvb2tlZCB1cCwgYW5kIGlzIHBhc3NlZCBh cyAidHlwIi4KICAqCiAgKiBwc3RhdGUgaXMgb25seSB1c2VkIGZvciBlcnJvciBsb2NhdGlvbiBp bmZvLCBhbmQgbWF5IGJlIE5VTEwuCisgKgorICogRm9yIGEgZGljdGlvbmFyeSB0eXBlIGl0J3Mg T0lEIGlzIHJldHVybmVkIGFzIGEgdHlwbW9kLiBUaGlzIGlzIHVzZWQgYnkKKyAqIGRpY3Rpb25h cnlfaW4oKSBhbmQganNvbmJfZGljdGlvbmFyeSgpIHRvIGRpc3Rpbmd1aXNoIG9uZSBkaWN0aW9u YXJ5IGZyb20KKyAqIGFub3RoZXIuCiAgKi8KIHN0YXRpYyBpbnQzMgogdHlwZW5hbWVUeXBlTW9k KFBhcnNlU3RhdGUgKnBzdGF0ZSwgY29uc3QgVHlwZU5hbWUgKnR5cGVOYW1lLCBUeXBlIHR5cCkK QEAgLTMzOSw2ICszNTEsMTAgQEAgdHlwZW5hbWVUeXBlTW9kKFBhcnNlU3RhdGUgKnBzdGF0ZSwg Y29uc3QgVHlwZU5hbWUgKnR5cGVOYW1lLCBUeXBlIHR5cCkKIAlBcnJheVR5cGUgICphcnJ0eXBt b2Q7CiAJUGFyc2VDYWxsYmFja1N0YXRlIHBjYnN0YXRlOwogCisJLyogRm9yIGEgZGljdGlvbmFy eSByZXR1cm4gaXQncyBPSUQuICovCisJaWYgKCgoRm9ybV9wZ190eXBlKSBHRVRTVFJVQ1QodHlw KSktPnR5cHR5cGUgPT0gVFlQVFlQRV9ESUNUKQorCQlyZXR1cm4gKGludDMyKSgoRm9ybV9wZ190 eXBlKSBHRVRTVFJVQ1QodHlwKSktPm9pZDsKKwogCS8qIFJldHVybiBwcmVzcGVjaWZpZWQgdHlw bW9kIGlmIG5vIHR5cG1vZCBleHByZXNzaW9ucyAqLwogCWlmICh0eXBlTmFtZS0+dHlwbW9kcyA9 PSBOSUwpCiAJCXJldHVybiB0eXBlTmFtZS0+dHlwZW1vZDsKZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL3Rjb3AvdXRpbGl0eS5jIGIvc3JjL2JhY2tlbmQvdGNvcC91dGlsaXR5LmMKaW5kZXggMGU3 YjdiMzEzOC4uY2ZmZWY1ZDcwNyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdGNvcC91dGlsaXR5 LmMKKysrIGIvc3JjL2JhY2tlbmQvdGNvcC91dGlsaXR5LmMKQEAgLTE3NCw2ICsxNzQsNyBAQCBD bGFzc2lmeVV0aWxpdHlDb21tYW5kQXNSZWFkT25seShOb2RlICpwYXJzZXRyZWUpCiAJCWNhc2Ug VF9DcmVhdGVDYXN0U3RtdDoKIAkJY2FzZSBUX0NyZWF0ZUNvbnZlcnNpb25TdG10OgogCQljYXNl IFRfQ3JlYXRlRG9tYWluU3RtdDoKKwkJY2FzZSBUX0NyZWF0ZURpY3Rpb25hcnlTdG10OgogCQlj YXNlIFRfQ3JlYXRlRW51bVN0bXQ6CiAJCWNhc2UgVF9DcmVhdGVFdmVudFRyaWdTdG10OgogCQlj YXNlIFRfQ3JlYXRlRXh0ZW5zaW9uU3RtdDoKQEAgLTE2MjEsNiArMTYyMiwxMCBAQCBQcm9jZXNz VXRpbGl0eVNsb3coUGFyc2VTdGF0ZSAqcHN0YXRlLAogCQkJCX0KIAkJCQlicmVhazsKIAorCQkJ Y2FzZSBUX0NyZWF0ZURpY3Rpb25hcnlTdG10OgkvKiBDUkVBVEUgVFlQRSBBUyBESUNUSU9OQVJZ IE9GICovCisJCQkJYWRkcmVzcyA9IERlZmluZURpY3Rpb25hcnkoKENyZWF0ZURpY3Rpb25hcnlT dG10ICopIHBhcnNldHJlZSk7CisJCQkJYnJlYWs7CisKIAkJCWNhc2UgVF9DcmVhdGVFbnVtU3Rt dDoJLyogQ1JFQVRFIFRZUEUgQVMgRU5VTSAqLwogCQkJCWFkZHJlc3MgPSBEZWZpbmVFbnVtKChD cmVhdGVFbnVtU3RtdCAqKSBwYXJzZXRyZWUpOwogCQkJCWJyZWFrOwpAQCAtMjc2Niw2ICsyNzcx LDEwIEBAIENyZWF0ZUNvbW1hbmRUYWcoTm9kZSAqcGFyc2V0cmVlKQogCQkJdGFnID0gQ01EVEFH X0NSRUFURV9UWVBFOwogCQkJYnJlYWs7CiAKKwkJY2FzZSBUX0NyZWF0ZURpY3Rpb25hcnlTdG10 OgorCQkJdGFnID0gQ01EVEFHX0NSRUFURV9UWVBFOworCQkJYnJlYWs7CisKIAkJY2FzZSBUX0Ny ZWF0ZUVudW1TdG10OgogCQkJdGFnID0gQ01EVEFHX0NSRUFURV9UWVBFOwogCQkJYnJlYWs7CkBA IC0zNDEzLDYgKzM0MjIsMTAgQEAgR2V0Q29tbWFuZExvZ0xldmVsKE5vZGUgKnBhcnNldHJlZSkK IAkJCWxldiA9IExPR1NUTVRfRERMOwogCQkJYnJlYWs7CiAKKwkJY2FzZSBUX0NyZWF0ZURpY3Rp b25hcnlTdG10OgorCQkJbGV2ID0gTE9HU1RNVF9EREw7CisJCQlicmVhazsKKwogCQljYXNlIFRf Q3JlYXRlRW51bVN0bXQ6CiAJCQlsZXYgPSBMT0dTVE1UX0RETDsKIAkJCWJyZWFrOwpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L01ha2VmaWxlIGIvc3JjL2JhY2tlbmQvdXRpbHMv YWR0L01ha2VmaWxlCmluZGV4IDdjNzIyZWEyY2UuLmE3ZWMzZDg5ZjMgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL3V0aWxzL2FkdC9NYWtlZmlsZQorKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQv TWFrZWZpbGUKQEAgLTMwLDYgKzMwLDcgQEAgT0JKUyA9IFwKIAlkYXRldGltZS5vIFwKIAlkYXR1 bS5vIFwKIAlkYnNpemUubyBcCisJZGljdGlvbmFyaWVzLm8gXAogCWRvbWFpbnMubyBcCiAJZW5j b2RlLm8gXAogCWVudW0ubyBcCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvZGlj dGlvbmFyaWVzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvZGljdGlvbmFyaWVzLmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uNzQxNWFlODA2ZAotLS0gL2Rldi9udWxs CisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9kaWN0aW9uYXJpZXMuYwpAQCAtMCwwICsxLDQ3 NiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogZGljdGlvbmFyaWVzLmMKKyAqCSAgQ29u dmVyc2lvbiBmdW5jdGlvbnMgZm9yIGRpY3Rpb25hcnkgdHlwZXMuCisgKgorICogUG9ydGlvbnMg Q29weXJpZ2h0IChjKSAxOTk2LTIwMjIsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdy b3VwCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZl cnNpdHkgb2YgQ2FsaWZvcm5pYQorICoKKyAqCisgKiBJREVOVElGSUNBVElPTgorICoJICBzcmMv YmFja2VuZC91dGlscy9hZHQvZGljdGlvbmFyaWVzLmMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAqLworCisjaW5jbHVkZSAicG9zdGdyZXMuaCIKKworI2luY2x1ZGUgImNhdGFsb2cvcGdfZGlj dC5oIgorI2luY2x1ZGUgInV0aWxzL2ZtZ3Jwcm90b3MuaCIKKyNpbmNsdWRlICJ1dGlscy9qc29u Yi5oIgorCisvKgorICogV2hlbiBjb21wcmVzc2luZyBhIGRhdGEgd2UgdHJlYXQgaXQgYXMgYSBC TE9CLCBpbiBvdGhlciB3b3JkcyB3ZSBkb24ndAorICogYXNzdW1lIGFueXRoaW5nIHJlZ2FyZGlu ZyBpdHMgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uIFRoaXMgaXMgbm90CisgKiBuZWNlc3Nhcmls eSB0aGUgYmVzdCBhbmQvb3IgdGhlIG9ubHkgcG9zc2libGUgYXBwcm9hY2guIEhvd2V2ZXIsIGl0 IGlzCisgKiB1bml2ZXJzYWwgYW5kIGNhbiBiZSByZXVzZWQgZm9yIEpTT05CLCBURVhULCBYTUwg YW5kIG90aGVyIHR5cGVzLiBBbHRlcm5hdGl2ZQorICogY29tcHJlc3Npb24gbWV0aG9kcyBjYW4g YmUgaW50cm9kdWNlZCBpbiB0aGUgZnV0dXJlLCBzbyB0aGF0IHRoZSB1c2VyIHdpbGwKKyAqIGJl IGFibGUgdG8gY2hvb3NlIHRoZSBiZXN0IG9uZSBmb3IgdGhlIHRhc2suCisgKgorICogVGhlIGNv bXByZXNzZWQgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgKgorICog KHN0cnVjdCB2YXJsZW5hKQorICogZGljdGlvbmFyeV9pZCAgICAgW3VpbnQzMl0KKyAqIGRlY29t cHJlc3NlZF9zaXplIFt1aW50MzJdCisgKiBhbGdvcml0aG1fdmVyc2lvbiBbdWludDhdCisgKgor ICogKHJlcGVhdGVkKSB7CisgKiAgIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGFzLWlzICAgICBb dWludDhdCisgKiAgIC4uLiBieXRlcyB0byBjb3B5IGFzLWlzIC4uLgorICogICBkaWN0aW9uYXJ5 IGVudHJ5IGlkLCBvciAwIHRvIHNraXAgW3VpbnQzMl0KKyAqIH0KKyAqCisgKiBDb21wcmVzc2Vk IGRhdGEgaXMgYSB2YXJpYWJsZS1sZW5ndGggdHlwZSBhbmQgdGh1cyBoYXMgdGhlICdzdHJ1Y3Qg dmFybGVuYScKKyAqIGhlYWRlci4gVGhlIGNvZGUgYmVsb3cgZG9lc24ndCBjb25zaWRlciBpdCBi ZWluZyBhIHBhcnQgb2YgdGhlIHBheWxvYWQKKyAqIChlLmcuIHNlZSB0aGUgRElDVF9DT01QX0hF QURFUl9TSVpFIGRlZmluaXRpb24pLgorICoKKyAqIFN0b3JpbmcgZGljdGlvbmFyeV9pZCBtYXkg c2VlbSByZWR1bmRhbnQsIGJ1dCB3aXRob3V0IGl0IGRpY3Rpb25hcnlfb3V0KCkKKyAqIGFuZCBk aWN0aW9uYXJ5X2pzb25iKCkgaGF2ZSBubyB3YXkgdG8gZGlzdGluZ3Vpc2ggb25lIGRpY3Rpb25h cnkgdHlwZSBmcm9tCisgKiBhbm90aGVyLiBkaWN0aW9uYXJ5X2luKCkgYW5kIGpzb25iX2RpY3Rp b25hcnkoKSBnZXQgdGhlIGRpY3Rpb25hcnkgaWQgdGhyb3VnaAorICogdGhlICd0eXBlbW9kJyBh cmd1bWVudC4KKyAqCisgKiBDdXJyZW50bHkgYWxnb3JpdGhtX3ZlcnNpb24gaXMgYWx3YXlzIDAu IEluIHRoZSBmdXR1cmUgaXQgd2lsbCBhbGxvdyB1cyB0bworICogaW50cm9kdWNlIG5ldyBmZWF0 dXJlcyAoZS5nLiB1c2FnZSBvZiB2YXJpbnRzKSBhbmQvb3IgbGF6aWx5IG1pZ3JhdGUgdGhlCisg KiBkYXRhIHRvIG90aGVyIGNvbXByZXNzaW9uIG1ldGhvZHMuCisgKgorICogQ29tcHJlc3Npb24g YW5kIGRlY29tcHJlc3Npb24gYXJlIGltcGxlbWVudGVkIGJhc2VkIG9uIGEgYmluYXJ5IHNlYXJj aCBvdmVyCisgKiBEaWN0RW50cnlbXSBhcnJheSAoc2VlIHBnX2RpY3QuaCkuIEZvciBjb21wcmVz c2lvbiB0aGUgYXJyYXkgaXMgc29ydGVkIGJ5CisgKiBkaWN0ZW50cmllcyBhbmQgZm9yIGRlY29t cHJlc3Npb24gLSBieSBvaWQncy4KKyAqCisgKi8KKworLyogU2l6ZSBvZiB0aGUgaGVhZGVyIGlu IHRoZSBjb21wcmVzc2VkIGRhdGEgKi8KKyNkZWZpbmUgRElDVF9DT01QX0hFQURFUl9TSVpFIChz aXplb2YodWludDMyKSoyICsgc2l6ZW9mKHVpbnQ4KSkKKworLyogRXh0cmFjdHMgZGljdGlvbmFy eV9pZCBmcm9tIHRoZSBjb21wcmVzc2VkIGRhdGEgKi8KKyNkZWZpbmUgRElDVF9DT01QX0RJQ1RJ T05BUllfSUQoaGRycCkgXAorCSgqKHVpbnQzMiopaGRycCkKKworLyogRXh0cmFjdHMgZGVjb21w cmVzc2VkX3NpemUgZnJvbSB0aGUgY29tcHJlc3NlZCBkYXRhICovCisjZGVmaW5lIERJQ1RfQ09N UF9ERUNPTVBSRVNTRURfU0laRShoZHJwKSBcCisJKCoodWludDMyKikoKHVpbnQ4KiloZHJwICsg c2l6ZW9mKHVpbnQzMikpKQorCisvKiBFeHRyYWN0cyBhbGdvcml0aG1fdmVyc2lvbiBmcm9tIHRo ZSBjb21wcmVzc2VkIGRhdGEgKi8KKyNkZWZpbmUgRElDVF9DT01QX0FMR09SSVRITV9WRVJTSU9O KGhkcnApIFwKKwkoKih1aW50OCopKCh1aW50OCopaGRycCArIHNpemVvZih1aW50MzIpKjIpKQor CisvKiBDdXJyZW50IGFsZ29yaXRobV92ZXJzaW9uICovCisjZGVmaW5lIERJQ1RfQ09NUF9DVVJS RU5UX0FMR09SSVRITV9WRVJTSU9OIDAKKworLyoKKyAqIGJzZWFyY2hfYXJnKCkgY2FsbGJhY2sg Zm9yIGZpbmRpbmcgRGljdEVudHJ5IGJ5IG9pZC4KKyAqLworc3RhdGljIGludAorZmluZF9ieV9v aWRfY2IoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICpjdXJyZW50LCB2b2lkICphcmcpCit7 CisJLyogTm90ZSB0aGF0IG9pZHMgYXJlIHVuc2lnbmVkLCBzbyB3ZSBzaG91bGQgYmUgY2FyZWZ1 bCBoZXJlICovCisJaWYgKCooT2lkICopIGtleSA8ICgoRGljdEVudHJ5ICopIGN1cnJlbnQpLT5v aWQpCisJCXJldHVybiAtMTsKKwllbHNlIGlmICgqKE9pZCAqKSBrZXkgPT0gKChEaWN0RW50cnkg KikgY3VycmVudCktPm9pZCkKKwkJcmV0dXJuIDA7CQkJCS8qIGZvdW5kISAqLworCWVsc2UKKwkJ cmV0dXJuIDE7Cit9CisKKy8qCisgKiBxc29ydCgpIGNhbGxiYWNrIGZvciBzb3J0aW5nIERpY3RF bnRyeVtdIGJ5IG9pZHMuCisgKi8KK3N0YXRpYyBpbnQKK3NvcnRfYnlfb2lkc19jYihjb25zdCB2 b2lkICpsZWZ0LCBjb25zdCB2b2lkICpyaWdodCkKK3sKKwkvKiBOb3RlIHRoYXQgb2lkcyBhcmUg dW5zaWduZWQsIHNvIHdlIHNob3VsZCBiZSBjYXJlZnVsIGhlcmUgKi8KKwlpZiAoKChEaWN0RW50 cnkgKikgbGVmdCktPm9pZCA8ICgoRGljdEVudHJ5ICopIHJpZ2h0KS0+b2lkKQorCQlyZXR1cm4g LTE7CisKKwkvKiBPaWRzIGFyZSB1bmlxdWUgc28gdGhpcyBjYWxsYmFjayB3aWxsIG5ldmVyIHJl dHVybiAwICovCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBGaW5kcyBhIERpY3RFbnRyeSB3aGlj aCBkaWN0ZW50cnkgZmllbGQgbWF0Y2hlcyAqZGF0YSBhbmQgcmV0dXJucyBpdHMgT2lkLgorICog SWYgdGhlcmUgYXJlIHNldmVyYWwgbWF0Y2hpbmcgZW50cmllcywgdGhlIGxhcmdlc3QgaXMgcmV0 dXJuZWQuIFRoZSBsZW5ndGgKKyAqIG9mIHRoZSBmb3VuZCBlbnRyeSBpcyB3cml0dGVuIHRvICpm b3VuZF9sZW5ndGggb24gc3VjY2Vzcy4gT24gZmFpbHVyZQorICogSW52YWxpZE9pZCBpcyByZXR1 cm5lZCBhbmQgZm91bmRfbGVuZ3RoIGlzIHplcm9lZC4KKyAqCisgKiBUaGUgaW1wbGVtZW50YXRp b24gaXMgc2ltaWxhciB0byBic2VhcmNoX2FyZygpLiBUaGUgcHJvY2VkdXJlIGNhbid0IGJlIHVz ZWQKKyAqIGRpcmVjdGx5IGJlY2F1c2Ugd2UgYXJlIGxvb2tpbmcgbm90IGJ5IHRoZSBleGFjdCBt YXRjaC4gV2UgY291bGQgZ2VuZXJhbGl6ZQorICogdGhpcyBjYXNlIGJ1dCB0aGUgc2lnbmF0dXJl IG9mIHRoZSBmdW5jdGlvbnMgYmVjb21lcyBzbyBjb21wbGljYXRlZCB0aGF0IGl0CisgKiBkb2Vz bid0IHNlZW0gdG8gd29ydGggdGhlIGVmZm9ydC4KKyAqLworc3RhdGljIE9pZAorY29tcHJlc3Nf ZmluZF9vaWQoRGljdGlvbmFyeSBkaWN0LCBjb25zdCB1aW50OCAqZGF0YSwgU2l6ZSBkYXRhX3Np emUsIFNpemUgKmZvdW5kX2xlbmd0aCkKK3sKKwlpbnQJCQlyZXM7CisJaW50MzIJCWxlZnQgPSAw OworCWludDMyCQlyaWdodCA9IGRpY3QtPm5lbnRyaWVzIC0gMTsKKwlTaXplCQliZXN0X2xlbmd0 aCA9IDA7CisJT2lkCQkJYmVzdF9tYXRjaCA9IEludmFsaWRPaWQ7CisKKwl3aGlsZSAobGVmdCA8 PSByaWdodCkKKwl7CisJCWludDMyCQljdXJyZW50ID0gKGxlZnQgKyByaWdodCkgLyAyOworCisJ CS8qIEFBTEVLU0VFViBUT0RPIEZJWE1FIG9wdGltaXplICovCisJCVNpemUJCW5ieXRlcyA9IHN0 cmxlbihkaWN0LT5lbnRyaWVzW2N1cnJlbnRdLmRpY3RlbnRyeS5kYXRhKTsKKworCQlpZiAobmJ5 dGVzID4gZGF0YV9zaXplKQorCQl7CisJCQkvKiBjdXJyZW50IGNhbiBiZSBsZXNzIG9yIGdyZWF0 ZXIgZGVwZW5kaW5nIG9uIHRoZSBwcmVmaXggKi8KKwkJCXJlcyA9IG1lbWNtcChkaWN0LT5lbnRy aWVzW2N1cnJlbnRdLmRpY3RlbnRyeS5kYXRhLCBkYXRhLCBkYXRhX3NpemUpOworCisJCQkvKiBp ZiBwcmVmaXhlcyBtYXRjaCwgY3VycmVudCBpcyBncmVhdGVyICovCisJCQlpZiAocmVzID09IDAp CisJCQkJcmVzID0gMTsKKwkJfQorCQllbHNlCisJCQlyZXMgPSBtZW1jbXAoZGljdC0+ZW50cmll c1tjdXJyZW50XS5kaWN0ZW50cnkuZGF0YSwgZGF0YSwgbmJ5dGVzKTsKKworCQlpZiAocmVzID09 IDApCQkJLyogbWF0Y2ggZm91bmQgKi8KKwkJeworCQkJYmVzdF9sZW5ndGggPSBuYnl0ZXM7CisJ CQliZXN0X21hdGNoID0gZGljdC0+ZW50cmllc1tjdXJyZW50XS5vaWQ7CisKKwkJCWlmIChuYnl0 ZXMgPT0gZGF0YV9zaXplKQorCQkJCWJyZWFrOworCisJCQkvKiBtYXliZSB0aGVyZSBpcyBhIGxh cmdlciBtYXRjaCAqLworCQkJbGVmdCA9IGN1cnJlbnQgKyAxOworCQl9CisJCWVsc2UgaWYgKHJl cyA8IDApCQkvKiBjdXJyZW50IGlzIGxlc3MgKi8KKwkJCWxlZnQgPSBjdXJyZW50ICsgMTsKKwkJ ZWxzZQkJCQkJLyogY3VycmVudCBpcyBncmVhdGVyICovCisJCQlyaWdodCA9IGN1cnJlbnQgLSAx OworCX0KKworCSpmb3VuZF9sZW5ndGggPSBiZXN0X2xlbmd0aDsKKwlyZXR1cm4gYmVzdF9tYXRj aDsKK30KKworLyoKKyAqIEZpbmRzIGEgRGljdEVudHJ5IGJ5IE9pZCB1c2luZyBhIGJpbmFyeSBz ZWFyY2guIFRoZSBkaWN0aW9uYXJ5IHNob3VsZCBiZQorICogc29ydGVkIGJ5IG9pZHMgYmVmb3Jl IHRoZSBjYWxsLiBSZXR1cm5zIE5VTEwgaWYgbm90aGluZyB3YXMgZm91bmQuCisgKi8KK3N0YXRp YyBEaWN0RW50cnkgKgorZGVjb21wcmVzc19maW5kX2RpY3RlbnRyeShEaWN0aW9uYXJ5IGRpY3Qs IE9pZCBvaWQpCit7CisJcmV0dXJuIChEaWN0RW50cnkgKikgYnNlYXJjaF9hcmcoJm9pZCwgZGlj dC0+ZW50cmllcywgZGljdC0+bmVudHJpZXMsIHNpemVvZihEaWN0RW50cnkpLCBmaW5kX2J5X29p ZF9jYiwgTlVMTCk7Cit9CisKKy8qCisgKiBFc3RpbWF0ZXMgdGhlIHdvcnN0LWNhc2UgY29tcHJl c3NlZCBzaXplIG9mIHRoZSBkYXRhIG9mIGdpdmVuIHNpemUuCisgKiBXb3JzdC1jYXNlIHNjZW5h cmlvIGhhcHBlbnMgd2hlbiB0aGUgZGljdGlvbmFyeSBjb25zaXN0cyBvZiBzaW5nbGUtY2hhcmFj dGVyCisgKiBlbnRyaWVzLiBJbiB0aGlzIGNhc2UgZXZlcnkgYnl0ZSB3aWxsIGJlIGVuY29kZWQg YXMgNiBieXRlczoKKyAqICAgICAweDAwLCAoMCBieXRlcyB0byBjb3B5IGFzLWlzKSwgNCBieXRl cyBvZiB0aGUgZW50cnkgT2lkCisgKgorICogVGhpcyBwcm9jZWR1cmUgZG9lc24ndCBhY2NvdW50 IGZvciB0aGUgaGVhZGVyIHNpemUuCisgKgorICogQUFMRUtTRUVWIFRPRE8gRklYTUUgZG9uJ3Qg YWxsb3cgZGljdGlvbmFyeSBlbnRyaWVzIHNob3J0ZXIgdGhhbiA0IGJ5dGVzPworICovCitzdGF0 aWMgU2l6ZQord29yc3RfY2FzZV9jb21wcmVzc2VkX3NpemUoU2l6ZSBpbnNpemUpCit7CisJcmV0 dXJuIGluc2l6ZSAqIDY7Cit9CisKKy8qCisgKiBDb21wcmVzc2VzIHRoZSBkYXRhIHVzaW5nIHRo ZSBwcm92aWRlZCBkaWN0aW9uYXJ5LiBUaGUgZGljdGlvbmFyeSBzaG91bGQKKyAqIGJlIHNvcnRl ZCBieSBkaWN0ZW50cmllcyBiZWZvcmUgdGhlIGNhbGwuIE91dHB1dCBidWZmZXIgc2hvdWxkIGJl IGF0IGxlYXN0CisgKiB3b3JzdF9jYXNlX2NvbXByZXNzZWRfc2l6ZShzcmNfc2l6ZSkgYnl0ZXMg aW4gc2l6ZS4KKyAqLworc3RhdGljIHZvaWQKK2NvbXByZXNzKERpY3Rpb25hcnkgZGljdCwKKwkJ IGNvbnN0IHZvaWQgKnNyY19kYXRhXywgU2l6ZSBzcmNfc2l6ZSwKKwkJIHZvaWQgKmVuY29kZWRf ZGF0YV8sIFNpemUgKnBlbmNvZGVkX3NpemUpCit7CisJU2l6ZQkJbmJ5dGVzOworCVNpemUJCWlu b2Zmc2V0OworCVNpemUJCW91dHNraXBvZmZzZXQgPSAwOworCVNpemUJCW91dG9mZnNldCA9IDE7 CisJdWludDgJCXNraXBieXRlcyA9IDA7CisJY29uc3QgdWludDggKnNyY19kYXRhID0gc3JjX2Rh dGFfOworCXVpbnQ4CSAgICplbmNvZGVkX2RhdGEgPSAoKHVpbnQ4ICopIGVuY29kZWRfZGF0YV8p OworCisJZm9yIChpbm9mZnNldCA9IDA7IGlub2Zmc2V0IDwgc3JjX3NpemU7KQorCXsKKwkJT2lk CQkJY29kZSA9IGNvbXByZXNzX2ZpbmRfb2lkKGRpY3QsICYoc3JjX2RhdGFbaW5vZmZzZXRdKSwK KwkJCQkJCQkJCQkJIHNyY19zaXplIC0gaW5vZmZzZXQsICZuYnl0ZXMpOworCisJCWlmIChjb2Rl ID09IEludmFsaWRPaWQpCisJCXsKKwkJCXNraXBieXRlcysrOworCQkJZW5jb2RlZF9kYXRhW291 dG9mZnNldF0gPSBzcmNfZGF0YVtpbm9mZnNldF07CisJCQlvdXRvZmZzZXQrKzsKKwkJCWlub2Zm c2V0Kys7CisKKwkJCWlmIChza2lwYnl0ZXMgPT0gMjU1KQorCQkJeworCQkJCWVuY29kZWRfZGF0 YVtvdXRza2lwb2Zmc2V0XSA9IHNraXBieXRlczsKKwkJCQllbmNvZGVkX2RhdGFbb3V0b2Zmc2V0 KytdID0gMDsJLyogSW52YWxpZE9pZCAqLworCQkJCWVuY29kZWRfZGF0YVtvdXRvZmZzZXQrK10g PSAwOworCQkJCWVuY29kZWRfZGF0YVtvdXRvZmZzZXQrK10gPSAwOworCQkJCWVuY29kZWRfZGF0 YVtvdXRvZmZzZXQrK10gPSAwOworCQkJCW91dHNraXBvZmZzZXQgPSBvdXRvZmZzZXQrKzsKKwkJ CQlza2lwYnl0ZXMgPSAwOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZW5jb2RlZF9kYXRh W291dHNraXBvZmZzZXRdID0gc2tpcGJ5dGVzOworCQkJZW5jb2RlZF9kYXRhW291dG9mZnNldCsr XSA9IChjb2RlID4+IDI0KSAmIDB4RkY7CisJCQllbmNvZGVkX2RhdGFbb3V0b2Zmc2V0KytdID0g KGNvZGUgPj4gMTYpICYgMHhGRjsKKwkJCWVuY29kZWRfZGF0YVtvdXRvZmZzZXQrK10gPSAoY29k ZSA+PiA4KSAmIDB4RkY7CisJCQllbmNvZGVkX2RhdGFbb3V0b2Zmc2V0KytdID0gY29kZSAmIDB4 RkY7CisJCQlvdXRza2lwb2Zmc2V0ID0gb3V0b2Zmc2V0Kys7CisJCQlza2lwYnl0ZXMgPSAwOwor CQkJaW5vZmZzZXQgKz0gbmJ5dGVzOworCQl9CisJfQorCisJLyogRG91YmxlIGNoZWNrIHRoYXQg d2UgZGlkbid0IHdyaXRlIG91dCBvZiBidWZmZXIgKi8KKwlBc3NlcnQob3V0b2Zmc2V0IDwgd29y c3RfY2FzZV9jb21wcmVzc2VkX3NpemUoc3JjX3NpemUpKTsKKworCWVuY29kZWRfZGF0YVtvdXRz a2lwb2Zmc2V0XSA9IHNraXBieXRlczsKKwkqcGVuY29kZWRfc2l6ZSA9IG91dG9mZnNldDsKK30K KworLyoKKyAqIERlY29tcHJlc3NlcyB0aGUgZGF0YSB1c2luZyB0aGUgcHJvdmlkZWQgZGljdGlv bmFyeS4gVGhlIGRpY3Rpb25hcnkgc2hvdWxkCisgKiBiZSBzb3J0ZWQgYnkgb2lkcyBiZWZvcmUg dGhlIGNhbGwuCisgKi8KK3N0YXRpYyB2b2lkCitkZWNvbXByZXNzKERpY3Rpb25hcnkgZGljdCwK KwkJICAgY29uc3Qgdm9pZCAqZW5jb2RlZF9kYXRhXywgU2l6ZSBlbmNvZGVkX3NpemUsCisJCSAg IHZvaWQgKmRlY29kZWRfZGF0YV8sIFNpemUgZGVjb2RlZF9zaXplKQoreworCVNpemUJCWlub2Zm c2V0ID0gMDsKKwlTaXplCQlvdXRvZmZzZXQgPSAwOworCU9pZAkJCWNvZGU7CisJdWludDgJCXNr aXBieXRlczsKKwljb25zdCB1aW50OCAqZW5jb2RlZF9kYXRhID0gKCh1aW50OCAqKSBlbmNvZGVk X2RhdGFfKTsKKwl1aW50OAkgICAqZGVjb2RlZF9kYXRhID0gZGVjb2RlZF9kYXRhXzsKKworCWZv ciAoaW5vZmZzZXQgPSAwOyBpbm9mZnNldCA8IGVuY29kZWRfc2l6ZTspCisJeworCQlza2lwYnl0 ZXMgPSBlbmNvZGVkX2RhdGFbaW5vZmZzZXQrK107CisKKwkJaWYgKHNraXBieXRlcyA+IGRlY29k ZWRfc2l6ZSAtIG91dG9mZnNldCkKKwkJeworCQkJLyogQUFMRUtTRUVWIFRPRE8gRklYTUUgd3Jp dGUgYSBwcm9wZXIgZXJyb3IgbWVzc2FnZSAqLworCQkJZWxvZyhFUlJPUiwgInNraXBieXRlcyA+ IGRlY29kZWRfc2l6ZSAtIG91dG9mZnNldCIpOworCQl9CisKKwkJaWYgKHNraXBieXRlcyA+IGVu Y29kZWRfc2l6ZSAtIGlub2Zmc2V0KQorCQl7CisJCQkvKiBBQUxFS1NFRVYgVE9ETyBGSVhNRSB3 cml0ZSBhIHByb3BlciBlcnJvciBtZXNzYWdlICovCisJCQllbG9nKEVSUk9SLCAic2tpcGJ5dGVz ID4gZW5jb2RlZF9zaXplIC0gaW5vZmZzZXQiKTsKKwkJfQorCisJCW1lbWNweSgKKwkJCSAgICYo ZGVjb2RlZF9kYXRhW291dG9mZnNldF0pLAorCQkJICAgJihlbmNvZGVkX2RhdGFbaW5vZmZzZXRd KSwKKwkJCSAgIHNraXBieXRlcworCQkJKTsKKworCQlvdXRvZmZzZXQgKz0gc2tpcGJ5dGVzOwor CQlpbm9mZnNldCArPSBza2lwYnl0ZXM7CisKKwkJaWYgKGVuY29kZWRfc2l6ZSA9PSBpbm9mZnNl dCAmJiBkZWNvZGVkX3NpemUgPT0gb3V0b2Zmc2V0KQorCQkJYnJlYWs7CQkJCS8qIGVuZCBvZiBp bnB1dCAtIGl0cyBPSyAqLworCisJCWlmIChlbmNvZGVkX3NpemUgLSBpbm9mZnNldCA8IDQpCisJ CXsKKwkJCS8qIEFBTEVLU0VFViBUT0RPIEZJWE1FIHdyaXRlIGEgcHJvcGVyIGVycm9yIG1lc3Nh Z2UgKi8KKwkJCWVsb2coRVJST1IsICJlbmNvZGVkX3NpemUgLSBpbm9mZnNldCA8IDQiKTsKKwkJ fQorCisJCWNvZGUgPSAoT2lkKSBlbmNvZGVkX2RhdGFbaW5vZmZzZXQrK107CisJCWNvZGUgPSAo Y29kZSA8PCA4KSB8IChPaWQpIGVuY29kZWRfZGF0YVtpbm9mZnNldCsrXTsKKwkJY29kZSA9IChj b2RlIDw8IDgpIHwgKE9pZCkgZW5jb2RlZF9kYXRhW2lub2Zmc2V0KytdOworCQljb2RlID0gKGNv ZGUgPDwgOCkgfCAoT2lkKSBlbmNvZGVkX2RhdGFbaW5vZmZzZXQrK107CisKKwkJaWYgKGNvZGUg IT0gSW52YWxpZE9pZCkKKwkJeworCQkJU2l6ZQkJZW50cnlsZW47CisJCQlEaWN0RW50cnkgICpl bnRyeSA9IGRlY29tcHJlc3NfZmluZF9kaWN0ZW50cnkoZGljdCwgY29kZSk7CisKKwkJCWlmIChl bnRyeSA9PSBOVUxMKQorCQkJeworCQkJCS8qIEFBTEVLU0VFViBUT0RPIEZJWE1FIHdyaXRlIGEg cHJvcGVyIGVycm9yIG1lc3NhZ2UgKi8KKwkJCQllbG9nKEVSUk9SLCAiZW50cnkgPT0gTlVMTCIp OworCQkJfQorCisJCQlBc3NlcnQoZW50cnktPm9pZCA9PSBjb2RlKTsKKworCQkJLyogQUFMRUtT RUVWIFRPRE8gRklYTUUgb3B0aW1pemUgKi8KKwkJCWVudHJ5bGVuID0gc3RybGVuKGVudHJ5LT5k aWN0ZW50cnkuZGF0YSk7CisKKwkJCWlmIChlbnRyeWxlbiA+IGRlY29kZWRfc2l6ZSAtIG91dG9m ZnNldCkKKwkJCXsKKwkJCQkvKiBBQUxFS1NFRVYgVE9ETyBGSVhNRSB3cml0ZSBhIHByb3BlciBl cnJvciBtZXNzYWdlICovCisJCQkJZWxvZyhFUlJPUiwgImVudHJ5bGVuID4gZGVjb2RlZF9zaXpl IC0gb3V0b2Zmc2V0Iik7CisJCQl9CisKKwkJCW1lbWNweSgKKwkJCQkgICAmKGRlY29kZWRfZGF0 YVtvdXRvZmZzZXRdKSwKKwkJCQkgICBlbnRyeS0+ZGljdGVudHJ5LmRhdGEsCisJCQkJICAgZW50 cnlsZW4KKwkJCQkpOworCisJCQlvdXRvZmZzZXQgKz0gZW50cnlsZW47CisJCX0KKwl9Cit9CisK Ky8qCisgKiBDb252ZXJ0cyBhIGNzdHJpbmcgdG8gYSBkaWN0aW9uYXJ5LgorICovCitEYXR1bQor ZGljdGlvbmFyeV9pbihQR19GVU5DVElPTl9BUkdTKQoreworCWNvbnN0IGNoYXIgKmluc3RyID0g UEdfR0VUQVJHX0NTVFJJTkcoMCk7CisjaWZkZWYgTk9UX1VTRUQKKwlPaWQJCQl0eXBlbGVtID0g UEdfR0VUQVJHX09JRCgxKTsKKyNlbmRpZgorCWludDMyCQl0eXBtb2QgPSBQR19HRVRBUkdfSU5U MzIoMik7CisKKwlBc3NlcnQodHlwbW9kICE9IC0xKTsKKworCUpzb25iCSAgICpqc29uYiA9IERh dHVtR2V0SnNvbmJQKERpcmVjdEZ1bmN0aW9uQ2FsbDEoanNvbmJfaW4sIENTdHJpbmdHZXREYXR1 bShpbnN0cikpKTsKKwlieXRlYQkgICAqZGljdCA9IERhdHVtR2V0Qnl0ZWFQKERpcmVjdEZ1bmN0 aW9uQ2FsbDIoanNvbmJfZGljdGlvbmFyeSwgSnNvbmJQR2V0RGF0dW0oanNvbmIpLCBJbnQzMkdl dERhdHVtKHR5cG1vZCkpKTsKKworCVBHX1JFVFVSTl9CWVRFQV9QKGRpY3QpOworfQorCisvKgor ICogQ29udmVydHMgYSBkaWN0aW9uYXJ5IHRvIGEgY3N0cmluZy4KKyAqLworRGF0dW0KK2RpY3Rp b25hcnlfb3V0KFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJYnl0ZWEJICAgKmRpY3QgPSBQR19HRVRB UkdfQllURUFfUCgwKTsKKwlKc29uYgkgICAqanNvbmIgPSBEYXR1bUdldEpzb25iUChEaXJlY3RG dW5jdGlvbkNhbGwxKGRpY3Rpb25hcnlfanNvbmIsIFBvaW50ZXJHZXREYXR1bShkaWN0KSkpOwor CWNvbnN0IGNoYXIgKm91dHN0ciA9IERhdHVtR2V0Q1N0cmluZyhEaXJlY3RGdW5jdGlvbkNhbGwx KGpzb25iX291dCwgSnNvbmJQR2V0RGF0dW0oanNvbmIpKSk7CisKKwlQR19SRVRVUk5fQ1NUUklO RyhvdXRzdHIpOworfQorCisvKgorICogQ292ZXJ0cyBKU09OQiB0byBhIGRpY3Rpb25hcnkgdHlw ZS4KKyAqLworRGF0dW0KK2pzb25iX2RpY3Rpb25hcnkoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlE aWN0aW9uYXJ5CWRpY3Q7CisJSnNvbmIJICAgKmpzb25iID0gUEdfR0VUQVJHX0pTT05CX1AoMCk7 CisJaW50MzIJCXR5cG1vZCA9IFBHX0dFVEFSR19JTlQzMigxKTsKKwl1aW50OAkgICAqanNvbmJf ZGF0YSA9ICh1aW50OCAqKSBWQVJEQVRBKGpzb25iKTsKKwlTaXplCQlqc29uYl9kYXRhX3NpemUg PSBWQVJTSVpFKGpzb25iKSAtIFZBUkhEUlNaOworCXVpbnQ4CSAgICplbmNvZGVkX2J1ZmYsCisJ CQkgICAqZW5jb2RlZF9oZWFkZXIsCisJCQkgICAqZW5jb2RlZF9kYXRhOworCVNpemUJCWVuY29k ZWRfc2l6ZSwKKwkJCQllbmNvZGVkX2J1ZmZfc2l6ZTsKKworCUFzc2VydCh0eXBtb2QgIT0gLTEp OworCisJZGljdCA9IERpY3RFbnRyaWVzUmVhZCh0eXBtb2QpOworCXFzb3J0KCh2b2lkICopIGRp Y3QtPmVudHJpZXMsIGRpY3QtPm5lbnRyaWVzLCBzaXplb2YoRGljdEVudHJ5KSwgc29ydF9ieV9v aWRzX2NiKTsKKworCWVuY29kZWRfYnVmZl9zaXplID0gVkFSSERSU1ogKyBESUNUX0NPTVBfSEVB REVSX1NJWkUgKyB3b3JzdF9jYXNlX2NvbXByZXNzZWRfc2l6ZShqc29uYl9kYXRhX3NpemUpOwor CWVuY29kZWRfYnVmZiA9IHBhbGxvYyhlbmNvZGVkX2J1ZmZfc2l6ZSk7CisJZW5jb2RlZF9oZWFk ZXIgPSAodWludDggKikgVkFSREFUQShlbmNvZGVkX2J1ZmYpOworCWVuY29kZWRfZGF0YSA9IGVu Y29kZWRfaGVhZGVyICsgRElDVF9DT01QX0hFQURFUl9TSVpFOworCisJRElDVF9DT01QX0RJQ1RJ T05BUllfSUQoZW5jb2RlZF9oZWFkZXIpID0gdHlwbW9kOworCURJQ1RfQ09NUF9ERUNPTVBSRVNT RURfU0laRShlbmNvZGVkX2hlYWRlcikgPSBqc29uYl9kYXRhX3NpemU7CisJRElDVF9DT01QX0FM R09SSVRITV9WRVJTSU9OKGVuY29kZWRfaGVhZGVyKSA9IERJQ1RfQ09NUF9DVVJSRU5UX0FMR09S SVRITV9WRVJTSU9OOworCisJZW5jb2RlZF9zaXplID0gZW5jb2RlZF9idWZmX3NpemUgLSBWQVJI RFJTWiAtIERJQ1RfQ09NUF9IRUFERVJfU0laRTsKKworCWNvbXByZXNzKGRpY3QsIGpzb25iX2Rh dGEsIGpzb25iX2RhdGFfc2l6ZSwKKwkJCSBlbmNvZGVkX2RhdGEsICZlbmNvZGVkX3NpemUpOwor CisJZW5jb2RlZF9zaXplICs9IFZBUkhEUlNaICsgRElDVF9DT01QX0hFQURFUl9TSVpFOworCisJ ZW5jb2RlZF9idWZmID0gcmVwYWxsb2MoZW5jb2RlZF9idWZmLCBlbmNvZGVkX3NpemUpOworCVNF VF9WQVJTSVpFKGVuY29kZWRfYnVmZiwgZW5jb2RlZF9zaXplKTsKKworCXBmcmVlKGRpY3QpOwor CVBHX1JFVFVSTl9CWVRFQV9QKGVuY29kZWRfYnVmZik7Cit9CisKKy8qCisgKiBDb252ZXJ0cyBh IGRpY3Rpb25hcnkgdHlwZSB0byBKU09OQi4KKyAqLworRGF0dW0KK2RpY3Rpb25hcnlfanNvbmIo UEdfRlVOQ1RJT05fQVJHUykKK3sKKwlieXRlYQkgICAqZW5jb2RlZF9idWZmID0gUEdfR0VUQVJH X0JZVEVBX1AoMCk7CisJdWludDgJICAgKmVuY29kZWRfaGVhZGVyID0gKHVpbnQ4ICopIFZBUkRB VEEoZW5jb2RlZF9idWZmKTsKKwl1aW50OAkgICAqZW5jb2RlZF9kYXRhID0gZW5jb2RlZF9oZWFk ZXIgKyBESUNUX0NPTVBfSEVBREVSX1NJWkU7CisJU2l6ZQkJZW5jb2RlZF9zaXplID0gVkFSU0la RShlbmNvZGVkX2J1ZmYpIC0gVkFSSERSU1ogLSBESUNUX0NPTVBfSEVBREVSX1NJWkU7CisJaW50 CQkJYWxnX3ZlcnNpb24gPSBESUNUX0NPTVBfQUxHT1JJVEhNX1ZFUlNJT04oZW5jb2RlZF9oZWFk ZXIpOworCU9pZAkJCWRpY3RPaWQ7CQkvKiBjYW5ub3QgcmVhZCB1bnRpbCBhbGdvcml0aG0gdmVy c2lvbiBpcworCQkJCQkJCQkgKiBjaGVja2VkICovCisJdWludDMyCQlkZWNvZGVkX3NpemU7CS8q IGNhbm5vdCByZWFkIHVudGlsIGFsZ29yaXRobSB2ZXJzaW9uIGlzCisJCQkJCQkJCSAqIGNoZWNr ZWQgKi8KKwlKc29uYgkgICAqanNvbmI7CisJdWludDgJICAgKmpzb25iX2RhdGE7CisJRGljdGlv bmFyeQlkaWN0OworCisJaWYgKGFsZ192ZXJzaW9uID4gRElDVF9DT01QX0NVUlJFTlRfQUxHT1JJ VEhNX1ZFUlNJT04pCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKAorCQkJCSBlcnJjb2RlKEVSUkNP REVfSU5URVJOQUxfRVJST1IpLAorCQkJCSBlcnJtc2coIlVuc3VwcG9ydGVkIGNvbXByZXNzaW9u IGFsZ29yaXRobSB2ZXJzaW9uIiksCisJCQkJIGVycmRldGFpbCgiU2F2ZWQgYWxnb3JpdGhtIHZl cnNpb24gaXMgJWQsIGN1cnJlbnQgdmVyc2lvbiBpcyAlZCIsCisJCQkJCQkgICBhbGdfdmVyc2lv biwgRElDVF9DT01QX0NVUlJFTlRfQUxHT1JJVEhNX1ZFUlNJT04pLAorCQkJCSBlcnJoaW50KCJU aGUgZGF0YSBpcyBlaXRoZXIgY29ycnVwdGVkIG9yIGltcG9ydGVkIGZyb20gIgorCQkJCQkJICJ0 aGUgZnV0dXJlIHZlcnNpb24gb2YgUG9zdGdyZVNRTCIpCisJCQkJICkpOworCisJZGljdE9pZCA9 IERJQ1RfQ09NUF9ESUNUSU9OQVJZX0lEKGVuY29kZWRfaGVhZGVyKTsKKwlkZWNvZGVkX3NpemUg PSBESUNUX0NPTVBfREVDT01QUkVTU0VEX1NJWkUoZW5jb2RlZF9oZWFkZXIpOworCWRpY3QgPSBE aWN0RW50cmllc1JlYWQoZGljdE9pZCk7CisKKwlqc29uYiA9IHBhbGxvYyhkZWNvZGVkX3NpemUg KyBWQVJIRFJTWik7CisJanNvbmJfZGF0YSA9ICh1aW50OCAqKSBWQVJEQVRBKGpzb25iKTsKKwor CWRlY29tcHJlc3MoZGljdCwgZW5jb2RlZF9kYXRhLCBlbmNvZGVkX3NpemUsIGpzb25iX2RhdGEs IGRlY29kZWRfc2l6ZSk7CisKKwlkZWNvZGVkX3NpemUgKz0gVkFSSERSU1o7CisJU0VUX1ZBUlNJ WkUoanNvbmIsIGRlY29kZWRfc2l6ZSk7CisKKwlwZnJlZShkaWN0KTsKKwlQR19SRVRVUk5fSlNP TkJfUChqc29uYik7Cit9CisKKy8qCisgKiBDb252ZXJ0cyBhIGRpY3Rpb25hcnkgdHlwZSB0byBi eXRlYS4KKyAqLworRGF0dW0KK2RpY3Rpb25hcnlfYnl0ZWEoUEdfRlVOQ1RJT05fQVJHUykKK3sK KwlieXRlYSAqY29tcHJlc3NlZF9kYXRhID0gUEdfR0VUQVJHX0JZVEVBX1AoMCk7CisJUEdfUkVU VVJOX0JZVEVBX1AoY29tcHJlc3NlZF9kYXRhKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBm aWxlCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9mbWdyL2Z1bmNhcGkuYyBiL3NyYy9i YWNrZW5kL3V0aWxzL2ZtZ3IvZnVuY2FwaS5jCmluZGV4IDkxOTdiMGYxZTIuLjRmOWRjNTI0Mjgg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2ZtZ3IvZnVuY2FwaS5jCisrKyBiL3NyYy9i YWNrZW5kL3V0aWxzL2ZtZ3IvZnVuY2FwaS5jCkBAIC0xMjkyLDYgKzEyOTIsNyBAQCBnZXRfdHlw ZV9mdW5jX2NsYXNzKE9pZCB0eXBpZCwgT2lkICpiYXNlX3R5cGVpZCkKIAkJY2FzZSBUWVBUWVBF X0NPTVBPU0lURToKIAkJCXJldHVybiBUWVBFRlVOQ19DT01QT1NJVEU7CiAJCWNhc2UgVFlQVFlQ RV9CQVNFOgorCQljYXNlIFRZUFRZUEVfRElDVDoKIAkJY2FzZSBUWVBUWVBFX0VOVU06CiAJCWNh c2UgVFlQVFlQRV9SQU5HRToKIAkJY2FzZSBUWVBUWVBFX01VTFRJUkFOR0U6CmRpZmYgLS1naXQg YS9zcmMvYmluL3BnX2R1bXAvcGdfZHVtcC5jIGIvc3JjL2Jpbi9wZ19kdW1wL3BnX2R1bXAuYwpp bmRleCA3ODZkNTkyZTJiLi40OTNlZjU2YzMwIDEwMDY0NAotLS0gYS9zcmMvYmluL3BnX2R1bXAv cGdfZHVtcC5jCisrKyBiL3NyYy9iaW4vcGdfZHVtcC9wZ19kdW1wLmMKQEAgLTEwMTc3LDYgKzEw MTc3LDggQEAgZHVtcFR5cGUoQXJjaGl2ZSAqZm91dCwgY29uc3QgVHlwZUluZm8gKnR5aW5mbykK IAkJZHVtcERvbWFpbihmb3V0LCB0eWluZm8pOwogCWVsc2UgaWYgKHR5aW5mby0+dHlwdHlwZSA9 PSBUWVBUWVBFX0NPTVBPU0lURSkKIAkJZHVtcENvbXBvc2l0ZVR5cGUoZm91dCwgdHlpbmZvKTsK KwllbHNlIGlmICh0eWluZm8tPnR5cHR5cGUgPT0gVFlQVFlQRV9ESUNUKQorCQlwZ19sb2dfZXJy b3IoIkFBTEVLU0VFViBUT0RPIEZJWE1FIG5vdCBpbXBsZW1lbnRlZCIpOwogCWVsc2UgaWYgKHR5 aW5mby0+dHlwdHlwZSA9PSBUWVBUWVBFX0VOVU0pCiAJCWR1bXBFbnVtVHlwZShmb3V0LCB0eWlu Zm8pOwogCWVsc2UgaWYgKHR5aW5mby0+dHlwdHlwZSA9PSBUWVBUWVBFX1JBTkdFKQpkaWZmIC0t Z2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19kaWN0LmggYi9zcmMvaW5jbHVkZS9jYXRhbG9n L3BnX2RpY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5kZjljZmY1 NDM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19kaWN0LmgKQEAg LTAsMCArMSw3NiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogcGdfZGljdC5oCisgKgkg IGRlZmluaXRpb24gb2YgdGhlICJkaWN0IiBzeXN0ZW0gY2F0YWxvZyAocGdfZGljdCkKKyAqCisg KgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMjIsIFBvc3RncmVTUUwgR2xvYmFs IERldmVsb3BtZW50IEdyb3VwCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2Vu dHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQorICoKKyAqIHNyYy9pbmNsdWRlL2Nh dGFsb2cvcGdfZGljdC5oCisgKgorICogTk9URVMKKyAqCSAgVGhlIENhdGFsb2cucG0gbW9kdWxl IHJlYWRzIHRoaXMgZmlsZSBhbmQgZGVyaXZlcyBzY2hlbWEKKyAqCSAgaW5mb3JtYXRpb24uCisg KgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgUEdfRElDVF9ICisjZGVmaW5lIFBH X0RJQ1RfSAorCisjaW5jbHVkZSAiY2F0YWxvZy9nZW5ia2kuaCIKKyNpbmNsdWRlICJjYXRhbG9n L3BnX2RpY3RfZC5oIgorCisjaW5jbHVkZSAibm9kZXMvcGdfbGlzdC5oIgorCisvKiAtLS0tLS0t LS0tLS0tLS0tCisgKgkJcGdfZGljdCBkZWZpbml0aW9uLiAgY3BwIHR1cm5zIHRoaXMgaW50bwor ICoJCXR5cGVkZWYgc3RydWN0IEZvcm1EYXRhX3BnX2RpY3QKKyAqIC0tLS0tLS0tLS0tLS0tLS0K KyAqLworQ0FUQUxPRyhwZ19kaWN0LDk4NjEsRGljdFJlbGF0aW9uSWQpCit7CisJT2lkCQkJb2lk OwkJCS8qIG9pZCAqLworCU9pZAkJCWRpY3R0eXBpZCBCS0lfTE9PS1VQKHBnX3R5cGUpOwkvKiBP SUQgb2Ygb3duaW5nIGRpY3QgdHlwZSAqLworCU5hbWVEYXRhCWRpY3RlbnRyeTsJCS8qIHRleHQg cmVwcmVzZW50YXRpb24gb2YgdGhlIGRpY3Rpb25hcnkgZW50cnkgKi8KK30gRm9ybURhdGFfcGdf ZGljdDsKKworLyogLS0tLS0tLS0tLS0tLS0tLQorICoJCUZvcm1fcGdfZGljdCBjb3JyZXNwb25k cyB0byBhIHBvaW50ZXIgdG8gYSB0dXBsZSB3aXRoCisgKgkJdGhlIGZvcm1hdCBvZiBwZ19kaWN0 IHJlbGF0aW9uLgorICogLS0tLS0tLS0tLS0tLS0tLQorICovCit0eXBlZGVmIEZvcm1EYXRhX3Bn X2RpY3QgKkZvcm1fcGdfZGljdDsKKworREVDTEFSRV9VTklRVUVfSU5ERVhfUEtFWShwZ19kaWN0 X29pZF9pbmRleCwgOTg2MiwgRGljdE9pZEluZGV4SWQsIG9uIHBnX2RpY3QgdXNpbmcgYnRyZWUo b2lkIG9pZF9vcHMpKTsKK0RFQ0xBUkVfVU5JUVVFX0lOREVYKHBnX2RpY3RfdHlwaWRfZW50cnlf aW5kZXgsIDk4NjMsIERpY3RUeXBJZEVudHJ5SW5kZXhJZCwgb24gcGdfZGljdCB1c2luZyBidHJl ZShkaWN0dHlwaWQgb2lkX29wcywgZGljdGVudHJ5IG5hbWVfb3BzKSk7CisKKworLyoKKyAqIERp Y3RFbnRyeSB0eXBlIHJlcHJlc2VudHMgb25lIGVudHJ5IGluIHRoZSBnaXZlbiBkaWN0aW9uYXJ5 LgorICovCit0eXBlZGVmIHN0cnVjdAoreworCU9pZCAgICAgICAgIG9pZDsKKwlOYW1lRGF0YSAg ICBkaWN0ZW50cnk7Cit9IERpY3RFbnRyeTsKKworLyoKKyAqIERpY3Rpb25hcnkgdHlwZSByZXBy ZXNlbnRzIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgZ2l2ZW4gZGljdGlvbmFyeS4KKyAqLwordHlw ZWRlZiBzdHJ1Y3QKK3sKKwl1aW50MzIgICAgICBuZW50cmllczsKKwlEaWN0RW50cnkgICplbnRy aWVzOworfSBEaWN0aW9uYXJ5RGF0YTsKKwordHlwZWRlZiBEaWN0aW9uYXJ5RGF0YSAqRGljdGlv bmFyeTsKKworLyoKKyAqIHByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBpbiBwZ19kaWN0LmMKKyAq LworZXh0ZXJuIHZvaWQgRGljdEVudHJpZXNDcmVhdGUoT2lkIGRpY3RUeXBlT2lkLCBMaXN0ICp2 YWxzKTsKK2V4dGVybiBEaWN0aW9uYXJ5IERpY3RFbnRyaWVzUmVhZChPaWQgZGljdFR5cGVPaWQp OworZXh0ZXJuIHZvaWQgRGljdEVudHJpZXNEZWxldGUoT2lkIGRpY3RUeXBlT2lkKTsKKworI2Vu ZGlmCQkJCQkJCS8qIFBHX0RJQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxv Zy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKaW5kZXggNmQz NzhmZjc4NS4uYzZlYzg3MzdkZiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19w cm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CkBAIC0xMDAyMiw2 ICsxMDAyMiwyNiBAQAogICBwcm9uYW1lID0+ICdqc29uYl9wYXRoX21hdGNoX29wcicsIHByb3Jl dHR5cGUgPT4gJ2Jvb2wnLAogICBwcm9hcmd0eXBlcyA9PiAnanNvbmIganNvbnBhdGgnLCBwcm9z cmMgPT4gJ2pzb25iX3BhdGhfbWF0Y2hfb3ByJyB9LAogCisjIGRpY3Rpb25hcmllcworeyBvaWQg PT4gJzk4NjQnLCBkZXNjciA9PiAnQ29udmVydHMgYSBjc3RyaW5nIHRvIGEgZGljdGlvbmFyeScs CisgIHByb25hbWUgPT4gJ2RpY3Rpb25hcnlfaW4nLCBwcm9yZXR0eXBlID0+ICdhbnknLCBwcm9h cmd0eXBlcyA9PiAnY3N0cmluZyBvaWQgaW50NCcsCisgIHByb3NyYyA9PiAnZGljdGlvbmFyeV9p bicgfSwKK3sgb2lkID0+ICc5ODY1JywgZGVzY3IgPT4gJ0NvbnZlcnRzIGEgZGljdGlvbmFyeSB0 byBhIGNzdHJpbmcnLAorICBwcm9uYW1lID0+ICdkaWN0aW9uYXJ5X291dCcsIHByb3JldHR5cGUg PT4gJ2NzdHJpbmcnLCBwcm9hcmd0eXBlcyA9PiAnYW55JywKKyAgcHJvc3JjID0+ICdkaWN0aW9u YXJ5X291dCcgfSwKK3sgb2lkID0+ICc5ODY2JywgZGVzY3IgPT4gJ0NvdmVydHMgSlNPTkIgdG8g YSBkaWN0aW9uYXJ5IHR5cGUnLAorICBwcm9uYW1lID0+ICdqc29uYl9kaWN0aW9uYXJ5JywgcHJv aXNzdHJpY3QgPT4gJ2YnLCBwcm92b2xhdGlsZSA9PiAncycsCisgIHByb3JldHR5cGUgPT4gJ2Fu eScsIHByb2FyZ3R5cGVzID0+ICdqc29uYiBpbnQ0JywKKyAgcHJvc3JjID0+ICdqc29uYl9kaWN0 aW9uYXJ5JyB9LAoreyBvaWQgPT4gJzk4NjcnLCBkZXNjciA9PiAnQ29udmVydHMgYSBkaWN0aW9u YXJ5IHR5cGUgdG8gSlNPTkInLAorICBwcm9uYW1lID0+ICdkaWN0aW9uYXJ5X2pzb25iJywgcHJv aXNzdHJpY3QgPT4gJ2YnLCBwcm92b2xhdGlsZSA9PiAncycsCisgIHByb3JldHR5cGUgPT4gJ2pz b25iJywgcHJvYXJndHlwZXMgPT4gJ2FueScsCisgIHByb3NyYyA9PiAnZGljdGlvbmFyeV9qc29u YicgfSwKK3sgb2lkID0+ICc5ODY4JywgZGVzY3IgPT4gJ0NvbnZlcnRzIGEgZGljdGlvbmFyeSB0 eXBlIHRvIGEgYnl0ZSBhcnJheScsCisgIHByb25hbWUgPT4gJ2RpY3Rpb25hcnlfYnl0ZWEnLCBw cm9pc3N0cmljdCA9PiAnZicsIHByb3ZvbGF0aWxlID0+ICdzJywKKyAgcHJvcmV0dHlwZSA9PiAn anNvbmInLCBwcm9hcmd0eXBlcyA9PiAnYW55JywKKyAgcHJvc3JjID0+ICdkaWN0aW9uYXJ5X2J5 dGVhJyB9LAorCiAjIGhpc3RvcmljYWwgaW50OC90eGlkX3NuYXBzaG90IHZhcmlhbnRzIG9mIHhp ZDggZnVuY3Rpb25zCiB7IG9pZCA9PiAnMjkzOScsIGRlc2NyID0+ICdJL08nLAogICBwcm9uYW1l ID0+ICd0eGlkX3NuYXBzaG90X2luJywgcHJvcmV0dHlwZSA9PiAndHhpZF9zbmFwc2hvdCcsCmRp ZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3R5cGUuaCBiL3NyYy9pbmNsdWRlL2Nh dGFsb2cvcGdfdHlwZS5oCmluZGV4IDQ4YTI1NTkxMzcuLjkxYzZiZmFlOTkgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfdHlwZS5oCisrKyBiL3NyYy9pbmNsdWRlL2NhdGFsb2cv cGdfdHlwZS5oCkBAIC0yNzIsNiArMjcyLDcgQEAgREVDTEFSRV9VTklRVUVfSU5ERVgocGdfdHlw ZV90eXBuYW1lX25zcF9pbmRleCwgMjcwNCwgVHlwZU5hbWVOc3BJbmRleElkLCBvbiBwZ18KICAq LwogI2RlZmluZSAgVFlQVFlQRV9CQVNFCQknYicgLyogYmFzZSB0eXBlIChvcmRpbmFyeSBzY2Fs YXIgdHlwZSkgKi8KICNkZWZpbmUgIFRZUFRZUEVfQ09NUE9TSVRFCSdjJyAvKiBjb21wb3NpdGUg KGUuZy4sIHRhYmxlJ3Mgcm93dHlwZSkgKi8KKyNkZWZpbmUgIFRZUFRZUEVfRElDVAkJJ0QnIC8q IGRpY3Rpb25hcnkgKi8KICNkZWZpbmUgIFRZUFRZUEVfRE9NQUlOCQknZCcgLyogZG9tYWluIG92 ZXIgYW5vdGhlciB0eXBlICovCiAjZGVmaW5lICBUWVBUWVBFX0VOVU0JCSdlJyAvKiBlbnVtZXJh dGVkIHR5cGUgKi8KICNkZWZpbmUgIFRZUFRZUEVfTVVMVElSQU5HRQknbScgLyogbXVsdGlyYW5n ZSB0eXBlICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jb21tYW5kcy90eXBlY21kcy5oIGIv c3JjL2luY2x1ZGUvY29tbWFuZHMvdHlwZWNtZHMuaAppbmRleCBhMTdiZWRiODUxLi41Y2M4ZTVm Zjk5IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jb21tYW5kcy90eXBlY21kcy5oCisrKyBiL3Ny Yy9pbmNsdWRlL2NvbW1hbmRzL3R5cGVjbWRzLmgKQEAgLTI0LDYgKzI0LDcgQEAKIGV4dGVybiBP YmplY3RBZGRyZXNzIERlZmluZVR5cGUoUGFyc2VTdGF0ZSAqcHN0YXRlLCBMaXN0ICpuYW1lcywg TGlzdCAqcGFyYW1ldGVycyk7CiBleHRlcm4gdm9pZCBSZW1vdmVUeXBlQnlJZChPaWQgdHlwZU9p ZCk7CiBleHRlcm4gT2JqZWN0QWRkcmVzcyBEZWZpbmVEb21haW4oQ3JlYXRlRG9tYWluU3RtdCAq c3RtdCk7CitleHRlcm4gT2JqZWN0QWRkcmVzcyBEZWZpbmVEaWN0aW9uYXJ5KENyZWF0ZURpY3Rp b25hcnlTdG10ICpzdG10KTsKIGV4dGVybiBPYmplY3RBZGRyZXNzIERlZmluZUVudW0oQ3JlYXRl RW51bVN0bXQgKnN0bXQpOwogZXh0ZXJuIE9iamVjdEFkZHJlc3MgRGVmaW5lUmFuZ2UoUGFyc2VT dGF0ZSAqcHN0YXRlLCBDcmVhdGVSYW5nZVN0bXQgKnN0bXQpOwogZXh0ZXJuIE9iamVjdEFkZHJl c3MgQWx0ZXJFbnVtKEFsdGVyRW51bVN0bXQgKnN0bXQpOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1 ZGUvbm9kZXMvbm9kZXMuaCBiL3NyYy9pbmNsdWRlL25vZGVzL25vZGVzLmgKaW5kZXggMzQwZDI4 ZjRlMS4uYWQxZTNhZDlmNSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvbm9kZXMuaAor KysgYi9zcmMvaW5jbHVkZS9ub2Rlcy9ub2Rlcy5oCkBAIC00MDgsNiArNDA4LDcgQEAgdHlwZWRl ZiBlbnVtIE5vZGVUYWcKIAlUX0Ryb3BPd25lZFN0bXQsCiAJVF9SZWFzc2lnbk93bmVkU3RtdCwK IAlUX0NvbXBvc2l0ZVR5cGVTdG10LAorCVRfQ3JlYXRlRGljdGlvbmFyeVN0bXQsCiAJVF9DcmVh dGVFbnVtU3RtdCwKIAlUX0NyZWF0ZVJhbmdlU3RtdCwKIAlUX0FsdGVyRW51bVN0bXQsCmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXJzZW5vZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rl cy9wYXJzZW5vZGVzLmgKaW5kZXggZGEwMjY1OGM4MS4uNWUzYWFjZDhhNyAxMDA2NDQKLS0tIGEv c3JjL2luY2x1ZGUvbm9kZXMvcGFyc2Vub2Rlcy5oCisrKyBiL3NyYy9pbmNsdWRlL25vZGVzL3Bh cnNlbm9kZXMuaApAQCAtMzU2Nyw2ICszNTY3LDE4IEBAIHR5cGVkZWYgc3RydWN0IENvbXBvc2l0 ZVR5cGVTdG10CiAJTGlzdAkgICAqY29sZGVmbGlzdDsJCS8qIGxpc3Qgb2YgQ29sdW1uRGVmIG5v ZGVzICovCiB9IENvbXBvc2l0ZVR5cGVTdG10OwogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKgkJQ3JlYXRlIFR5cGUgU3RhdGVtZW50LCBkaWN0aW9uYXJ5IHR5cGVzCisgKiAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgKi8KK3R5cGVkZWYgc3RydWN0IENyZWF0ZURpY3Rpb25hcnlTdG10 Cit7CisJTm9kZVRhZwkJdHlwZTsKKwlMaXN0CSAgICp0eXBlTmFtZTsJCS8qIHF1YWxpZmllZCBu YW1lIChsaXN0IG9mIFN0cmluZykgKi8KKwlMaXN0CSAgICpiYXNlVHlwZU5hbWU7CS8qIHF1YWxp ZmllZCBiYXNlIHR5cGUgbmFtZSAobGlzdCBvZiBTdHJpbmcpICovCisJTGlzdAkgICAqdmFsczsJ CQkvKiBkaWN0aW9uYXJ5IGVudHJpZXMgKGxpc3Qgb2YgU3RyaW5nKSAqLworfSBDcmVhdGVEaWN0 aW9uYXJ5U3RtdDsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICoJCUNyZWF0ZSBUeXBl IFN0YXRlbWVudCwgZW51bSB0eXBlcwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0t Z2l0IGEvc3JjL3BsL3BscGdzcWwvc3JjL3BsX2NvbXAuYyBiL3NyYy9wbC9wbHBnc3FsL3NyYy9w bF9jb21wLmMKaW5kZXggYjc5MWMyM2YwNi4uODk3MDUxYzFmNyAxMDA2NDQKLS0tIGEvc3JjL3Bs L3BscGdzcWwvc3JjL3BsX2NvbXAuYworKysgYi9zcmMvcGwvcGxwZ3NxbC9zcmMvcGxfY29tcC5j CkBAIC0yMTI5LDYgKzIxMjksNyBAQCBidWlsZF9kYXRhdHlwZShIZWFwVHVwbGUgdHlwZVR1cCwg aW50MzIgdHlwbW9kLAogCXN3aXRjaCAodHlwZVN0cnVjdC0+dHlwdHlwZSkKIAl7CiAJCWNhc2Ug VFlQVFlQRV9CQVNFOgorCQljYXNlIFRZUFRZUEVfRElDVDoKIAkJY2FzZSBUWVBUWVBFX0VOVU06 CiAJCWNhc2UgVFlQVFlQRV9SQU5HRToKIAkJY2FzZSBUWVBUWVBFX01VTFRJUkFOR0U6CmRpZmYg LS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfb2F0X2hvb2tzL3Rlc3Rfb2F0X2hvb2tzLmMg Yi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfb2F0X2hvb2tzL3Rlc3Rfb2F0X2hvb2tzLmMKaW5kZXgg NTUxZGE1ZDQ5OC4uMWNhYjIyMTgzYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0 X29hdF9ob29rcy90ZXN0X29hdF9ob29rcy5jCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9v YXRfaG9va3MvdGVzdF9vYXRfaG9va3MuYwpAQCAtNzcyLDYgKzc3Miw3IEBAIG5vZGV0YWdfdG9f c3RyaW5nKE5vZGVUYWcgdGFnKQogCQljYXNlIFRfRHJvcE93bmVkU3RtdDogcmV0dXJuICJEcm9w T3duZWRTdG10IjsgYnJlYWs7CiAJCWNhc2UgVF9SZWFzc2lnbk93bmVkU3RtdDogcmV0dXJuICJS ZWFzc2lnbk93bmVkU3RtdCI7IGJyZWFrOwogCQljYXNlIFRfQ29tcG9zaXRlVHlwZVN0bXQ6IHJl dHVybiAiQ29tcG9zaXRlVHlwZVN0bXQiOyBicmVhazsKKwkJY2FzZSBUX0NyZWF0ZURpY3Rpb25h cnlTdG10OiByZXR1cm4gIkNyZWF0ZURpY3Rpb25hcnlTdG10IjsgYnJlYWs7CiAJCWNhc2UgVF9D cmVhdGVFbnVtU3RtdDogcmV0dXJuICJDcmVhdGVFbnVtU3RtdCI7IGJyZWFrOwogCQljYXNlIFRf Q3JlYXRlUmFuZ2VTdG10OiByZXR1cm4gIkNyZWF0ZVJhbmdlU3RtdCI7IGJyZWFrOwogCQljYXNl IFRfQWx0ZXJFbnVtU3RtdDogcmV0dXJuICJBbHRlckVudW1TdG10IjsgYnJlYWs7CmRpZmYgLS1n aXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL29pZGpvaW5zLm91dCBiL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvb2lkam9pbnMub3V0CmluZGV4IDIxNWViODk5YmUuLjkxYmM0OTFhNmMg MTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvb2lkam9pbnMub3V0CisrKyBi L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvb2lkam9pbnMub3V0CkBAIC0xODIsNiArMTgyLDcg QEAgTk9USUNFOiAgY2hlY2tpbmcgcGdfZGVzY3JpcHRpb24ge2NsYXNzb2lkfSA9PiBwZ19jbGFz cyB7b2lkfQogTk9USUNFOiAgY2hlY2tpbmcgcGdfY2FzdCB7Y2FzdHNvdXJjZX0gPT4gcGdfdHlw ZSB7b2lkfQogTk9USUNFOiAgY2hlY2tpbmcgcGdfY2FzdCB7Y2FzdHRhcmdldH0gPT4gcGdfdHlw ZSB7b2lkfQogTk9USUNFOiAgY2hlY2tpbmcgcGdfY2FzdCB7Y2FzdGZ1bmN9ID0+IHBnX3Byb2Mg e29pZH0KK05PVElDRTogIGNoZWNraW5nIHBnX2RpY3Qge2RpY3R0eXBpZH0gPT4gcGdfdHlwZSB7 b2lkfQogTk9USUNFOiAgY2hlY2tpbmcgcGdfZW51bSB7ZW51bXR5cGlkfSA9PiBwZ190eXBlIHtv aWR9CiBOT1RJQ0U6ICBjaGVja2luZyBwZ19uYW1lc3BhY2Uge25zcG93bmVyfSA9PiBwZ19hdXRo aWQge29pZH0KIE5PVElDRTogIGNoZWNraW5nIHBnX2NvbnZlcnNpb24ge2Nvbm5hbWVzcGFjZX0g PT4gcGdfbmFtZXNwYWNlIHtvaWR9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL29wcl9zYW5pdHkub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9vcHJfc2FuaXR5 Lm91dAppbmRleCA4NmQ3NTVhYTQ0Li41ZGM0ZDBhYjAxIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL29wcl9zYW5pdHkub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvb3ByX3Nhbml0eS5vdXQKQEAgLTM4OCwxMSArMzg4LDEyIEBAIFdIRVJFICdjc3RyaW5n Jzo6cmVndHlwZSA9IEFOWSAocDEucHJvYXJndHlwZXMpCiAgICAgQU5EIE5PVCBFWElTVFMoU0VM RUNUIDEgRlJPTSBwZ19jb252ZXJzaW9uIFdIRVJFIGNvbnByb2MgPSBwMS5vaWQpCiAgICAgQU5E IHAxLm9pZCAhPSAnc2hlbGxfaW4oY3N0cmluZyknOjpyZWdwcm9jZWR1cmUKIE9SREVSIEJZIDE7 Ci0gb2lkICB8ICAgcHJvbmFtZSAgICAKLS0tLS0tLSstLS0tLS0tLS0tLS0tLQorIG9pZCAgfCAg ICBwcm9uYW1lICAgIAorLS0tLS0tKy0tLS0tLS0tLS0tLS0tLQogIDIyOTMgfCBjc3RyaW5nX291 dAogIDI1MDEgfCBjc3RyaW5nX3NlbmQKLSgyIHJvd3MpCisgOTg2NCB8IGRpY3Rpb25hcnlfaW4K KygzIHJvd3MpCiAKIC0tIExpa2V3aXNlLCBsb29rIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4g Y3N0cmluZyBhbmQgYXJlbid0IGRhdGF0eXBlIG91dHB1dAogLS0gZnVuY3Rpb25zIG5vciB0eXBt b2Qgb3V0cHV0IGZ1bmN0aW9ucy4KQEAgLTQwNSwxMSArNDA2LDEyIEBAIFdIRVJFICBwMS5wcm9y ZXR0eXBlID0gJ2NzdHJpbmcnOjpyZWd0eXBlCiAgICAgQU5EIE5PVCBFWElTVFMoU0VMRUNUIDEg RlJPTSBwZ190eXBlIFdIRVJFIHR5cG1vZG91dCA9IHAxLm9pZCkKICAgICBBTkQgcDEub2lkICE9 ICdzaGVsbF9vdXQodm9pZCknOjpyZWdwcm9jZWR1cmUKIE9SREVSIEJZIDE7Ci0gb2lkICB8ICAg cHJvbmFtZSAgICAKLS0tLS0tLSstLS0tLS0tLS0tLS0tLQorIG9pZCAgfCAgICBwcm9uYW1lICAg ICAKKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tCiAgMjI5MiB8IGNzdHJpbmdfaW4KICAyNTAwIHwg Y3N0cmluZ19yZWN2Ci0oMiByb3dzKQorIDk4NjUgfCBkaWN0aW9uYXJ5X291dAorKDMgcm93cykK IAogLS0gQ2hlY2sgZm9yIGxlbmd0aCBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGUgdmFyaW91 cyBhcmd1bWVudC1pbmZvIGFycmF5cy4KIFNFTEVDVCBwMS5vaWQsIHAxLnByb25hbWUKLS0gCjIu MzUuMQoK --000000000000f81eb405dd3a08f4--