From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa4.mentor.iphmx.com (esa4.mentor.iphmx.com [68.232.137.252]) by sourceware.org (Postfix) with ESMTPS id D54E2382E742 for ; Tue, 6 Dec 2022 07:45:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D54E2382E742 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.96,220,1665475200"; d="diff'?scan'208";a="88676826" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa4.mentor.iphmx.com with ESMTP; 05 Dec 2022 23:45:14 -0800 IronPort-SDR: AMQipbCISI5vFwG8krL36AoS+wX4mcA8UMhsv9KXpHtkHoLTdDKZCndv+TR4XU10y+VwvhPO8t StzE7jnkrwh4nqK+W5RJ3wrpeK3e1t2SULrhvP24XO/6B3RFJtaPT/0qVnUveaTTY+MQO/hXDU 2GUea+rLozLXi97aH2cXt0zoZ+EoeunvsdzHU8qSgXG8/Hb4bM7gWFqdFXlmxYpTQsMhLVf9+p INPb/U7Pn3N/iSUfYJ7LWxSHlWmWsgvQVvkwbtXjYqT/c4omJo6W5K0obAfJEVwLf8VpurEWxO iTo= Content-Type: multipart/mixed; boundary="------------NoLqimvATBv0o0q7c7u481t0" Message-ID: <0567b7c6-fede-72b8-63d1-1fc10dca36a0@codesourcery.com> Date: Tue, 6 Dec 2022 08:45:07 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.5.1 Content-Language: en-US To: gcc-patches , Jakub Jelinek From: Tobias Burnus Subject: [Patch] libgomp: Handle OpenMP's reverse offloads X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: SVR-IES-MBX-07.mgc.mentorg.com (139.181.222.7) To svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,KAM_DMARC_STATUS,KAM_SHORT,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --------------NoLqimvATBv0o0q7c7u481t0 Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: quoted-printable This patch finally handles reverse offload. Due to the prep work, it essentially only adds content to libgomp/target.c's gomp_target_rev(), except that it additionally saves the reverse-offload-function table in gomp_load_image_to_device. In the comment to "[Patch] libgomp: Add reverse-offload splay tree", https://gcc.gnu.org/pipermail/gcc-patches/2022-September/601368.html , it was suggested not to keep track of all the variable mappings and to reconstruct the mapping from the normal splay tree, which this patch does. (Albeit in the very slow walk-everything way. Given that reverse-offload target regions likely have only few map items and program should only use few reverse-offload regions and expect them not being fast, that might be okay.) Specification references: - For pointer attachment, I assume that the pointer is already fine on the host (if existed on the host before) and it does not need to get updated. I think the spec lacks a wording for this; cf. OpenMP Spec Issu= e #3424. - There are plans to permit 'nowait'. I think it wouldn't change anything except for not spin waiting for the result - and (only for shared memory= ), the argument lists (addr, kinds, sizes) need to be copied to have a suff= icent life time. (To be implemented in future; cf. OpenMP Spec Pull Req. 3423 for Issue 2038.) * * * 32bit vs. 64bit: libgomp itself is compiled with both -m32 and -m64; howeve= r, nvptx and gcn requires -m64 on the device side and assume that the device pointers are representable on the host (i.e. all are 64bit). The new code tries to be in principle compatible with uint32_t pointers and uses uint64_= t to represent it consistently. =E2=80=93 The code should be mostly fine, exc= ept that one called function requires an array of void* and size_t. Instead of handl= ing that case, I added some code to permit optimizing away the function content without offloading - and a run-time assert if it should ever happen that th= is function gets called on a 32bit host from the target side. It is a run-time fail as '#if TARGET_OFFLOAD =3D=3D ""' does not work (stri= ng comparison by the C preprocessor not supported, unfortunately). Comments, suggestions, OK for mainline, ... ? Tobias PS: * As follow-up, libgomp.texi must be updated * For GCN, it currently does not work until stack variables are accessible from the host. (Prep work for this is in newlib + GCC 13.) One done, a similar one-line change to plugin-gcn.c's GOMP_OFFLOAD_get_num_devices i= s required. PPS: (Off topic remark to 32bit host) While 32bit host with 32bit device will mostly work, having a 32bit host with a 64bit device becomes interesting as 'void *' returned by omp_target_= alloc(...) can't represent a device pointer. The solution is a 32bit pointer pointing = to a 64bit valirable, e.g. uint64_t *devptr =3D malloc(sizeof(uint64_t*); *devptr =3D internal_device_alloc (); return devptr; with all the fun to translate this correctly with {use,has}_device_ptr etc. To actually support this will require some larger changes to libgomp, which= I do not see happening unless a device system with sizeof(void*) > 64 bit sho= ws up. Or some compelling reason to use 32bit on the host; but not for for x86= -64 or arm64 (or PowerPC). (There exist 128bit pointer systems, which use the upper bits= for extra purposes - but for unified-shared address purposes, it seems to be unlikely= that accelerator devices head this direction.) ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstra=C3=9Fe 201= , 80634 M=C3=BCnchen; Gesellschaft mit beschr=C3=A4nkter Haftung; Gesch=C3= =A4ftsf=C3=BChrer: Thomas Heurung, Frank Th=C3=BCrauf; Sitz der Gesellschaf= t: M=C3=BCnchen; Registergericht M=C3=BCnchen, HRB 106955 --------------NoLqimvATBv0o0q7c7u481t0 Content-Type: text/x-patch; charset="UTF-8"; name="rev-offload.diff" Content-Disposition: attachment; filename="rev-offload.diff" Content-Transfer-Encoding: base64 bGliZ29tcDogSGFuZGxlIE9wZW5NUCdzIHJldmVyc2Ugb2ZmbG9hZHMKClRoaXMgY29tbWl0 IGVuYWJsZWQgcmV2ZXJzZSBvZmZsb2FkIGZvciBudnB0eCBzdWNoIHRoYXQgZ29tcF90YXJn ZXRfcmV2CmFjdHVhbGx5IGdldHMgY2FsbGVkLiAgQW5kIGl0IGZpbGxzIHRoZSBsYXR0ZXIg ZnVuY3Rpb24gdG8gZG8gYWxsIG9mCnRoZSBmb2xsb3dpbmc6IGZpbmRpbmcgdGhlIGhvc3Qg ZnVuY3Rpb24gdG8gdGhlIGRldmljZSBmdW5jIHB0ciBhbmQKY29weWluZyB0aGUgYXJndW1l bnRzIHRvIHRoZSBob3N0LCBwcm9jZXNzaW5nIHRoZSBtYXBwaW5nL2ZpcnN0cHJpdmF0ZSwK Y2FsbGluZyB0aGUgaG9zdCBmdW5jdGlvbiwgY29weWluZyBiYWNrIHRoZSBkYXRhIGFuZCBm cmVlaW5nIGFzIG5lZWRlZC4KClRoZSBkYXRhIGhhbmRsaW5nIGlzIG1hZGUgZWFzaWVyIGJ5 IGFzc3VtaW5nIHRoYXQgYWxsIGhvc3QgdmFyaWFibGVzCmVpdGhlciBleGlzdGVkIGJlZm9y ZSAoYW5kIGFyZSBpbiB0aGUgbWFwcGluZykgb3IgdGhhdCB0aG9zZSBhcmUKZGV2aWNlcyB2 YXJpYWJsZXMgbm90IHlldCBhdmFpbGFibGUgb24gdGhlIGhvc3QuIFRodXMsIHRoZSByZXZl cnNlCm1hcHBpbmcgY2FuIGRvIHdpdGhvdXQgcmVmY291bnRzIGV0Yy4gTm90ZSB0aGF0IHRo ZSBzcGVjIGRpc2FsbG93cwppbnNpZGUgYSB0YXJnZXQgcmVnaW9uIGRldmljZS1hZmZlY3Rp bmcgY29uc3RydWN0cyBvdGhlciB0aGFuIHRhcmdldApwbHVzIGFuY2VzdG9yIGRldmljZS1t b2RpZmllciBhbmQgaXQgYWxzbyBsaW1pdHMgdGhlIGNsYXVzZXMgcGVybWl0dGVkCm9uIHRo aXMgY29uc3RydWN0LgoKRm9yIHRoZSBmdW5jdGlvbiBhZGRyZXNzZXMsIGFuIGFkZGl0aW9u YWwgc3BsYXkgdHJlZSBpcyB1c2VkOyBmb3IKdGhlIGxvb2t1cCBvZiBtYXBwZWQgdmFyaWFi bGVzLCB0aGUgZXhpc3Rpbmcgc3BsYXktdHJlZSBpcyB1c2VkLgpVbmZvcnR1bmF0ZWx5LCBp dHMgZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZXMgYSBmdWxsIHdhbGsgb2YgdGhlIHRyZWU7CkFk ZGl0aW9uYWxseSwgdGhlIGp1c3QgbWFwcGVkIHZhcmlhYmxlcyBhcmUgcmVjb3JkZWQgaW4g YSBzZXBhcmF0ZQpkYXRhIHN0cnVjdHVyZSBhbiBleHRyYSBsb29rdXAuIFdoaWxlIHRoZSBs b29rdXAgaXMgc2xvdywgYXNzdW1pbmcKdGhhdCBvbmx5IGZldyB2YXJpYWJsZXMgZ2V0IG1h cHBlZCBpbiBlYWNoIHJldmVyc2Ugb2ZmbG9hZCBjb25zdHJ1Y3QKYW5kIHRoYXQgcmV2ZXJz ZSBvZmZsb2FkIGlzIHRoZSBleGNlcHRpb24gYW5kIG5vdCBwZXJmb3JtYW5jZSBjcml0aWNh bCwKdGhpcyBzZWVtcyB0byBiZSBhY2NlcHRhYmxlLgoKbGliZ29tcC9DaGFuZ2VMb2c6CgoJ KiBsaWJnb21wLmggKHN0cnVjdCB0YXJnZXRfbWVtX2Rlc2MpOiBQcmVkZWNsYXJlOyBtb3Zl CgliZWxvdyBhZnRlciAncmV2ZXJzZV9zcGxheV90cmVlX25vZGUnIGFuZCBhZGQgcmV2X2Fy cmF5CgltZW1iZXIuCgkoc3RydWN0IHJldmVyc2Vfc3BsYXlfdHJlZV9rZXlfcywgcmV2ZXJz ZV9zcGxheV9jb21wYXJlKTogTmV3LgoJKHJldmVyc2Vfc3BsYXlfdHJlZV9ub2RlLCByZXZl cnNlX3NwbGF5X3RyZWUsCglyZXZlcnNlX3NwbGF5X3RyZWVfa2V5KTogTmV3IHR5cGVkZWYu Cgkoc3RydWN0IGdvbXBfZGV2aWNlX2Rlc2NyKTogQWRkIG1lbV9tYXBfcmV2IG1lbWJlci4K CSogb2FjYy1ob3N0LmMgKGhvc3RfZGlzcGF0Y2gpOiBOVUxMIGluaXQgLm1lbV9tYXBfcmV2 LgoJKiBwbHVnaW4vcGx1Z2luLW52cHR4LmMgKEdPTVBfT0ZGTE9BRF9nZXRfbnVtX2Rldmlj ZXMpOiBDbGFpbQoJc3VwcG9ydCBmb3IgR09NUF9SRVFVSVJFU19SRVZFUlNFX09GRkxPQUQu CgkqIHNwbGF5LXRyZWUuaCAoc3BsYXlfdHJlZV9jYWxsYmFja19zdG9wKTogTmV3IHR5cGVk ZWY7IGxpa2UKCXNwbGF5X3RyZWVfY2FsbGJhY2sgYnV0IHJldHVybmluZyBpbnQgbm90IHZv aWQuCgkoc3BsYXlfdHJlZV9mb3JlYWNoX2xhenkpOiBEZWZpbmU7IGxpa2Ugc3BsYXlfdHJl ZV9mb3JlYWNoIGJ1dAoJdGFraW5nIHNwbGF5X3RyZWVfY2FsbGJhY2tfc3RvcCBhcyBhcmd1 bWVudC4KCSogc3BsYXktdHJlZS5jIChzcGxheV90cmVlX2ZvcmVhY2hfaW50ZXJuYWxfbGF6 eSwKCXNwbGF5X3RyZWVfZm9yZWFjaF9sYXp5KTogTmV3OyBidXQgZWFybHkgZXhpdCBpZiBj YWxsYmFjayByZXR1cm5zCglub256ZXJvLgoJKiB0YXJnZXQuYzogSW5zdGF0aWF0ZSBzcGxh eV90cmVlX2Mgd2l0aCBzcGxheV90cmVlX3ByZWZpeCAncmV2ZXJzZScuCgkoZ29tcF9tYXBf bG9va3VwX3Jldik6IE5ldy4KCShnb21wX2xvYWRfaW1hZ2VfdG9fZGV2aWNlKTogSGFuZGxl IHJldmVyc2Utb2ZmbG9hZCBmdW5jdGlvbgoJbG9va3VwIHRhYmxlLgoJKGdvbXBfdW5sb2Fk X2ltYWdlX2Zyb21fZGV2aWNlKTogRnJlZSBkZXZpY2VwLT5tZW1fbWFwX3Jldi4KCShzdHJ1 Y3QgZ29tcF9zcGxheV90cmVlX3Jldl9sb29rdXBfZGF0YSwgZ29tcF9zcGxheV90cmVlX3Jl dl9sb29rdXAsCglnb21wX21hcF9yZXZfbG9va3VwLCBzdHJ1Y3QgY3B5X2RhdGEsIGdvbXBf bWFwX2NkYXRhX2xvb2t1cF9pbnQsCglnb21wX21hcF9jZGF0YV9sb29rdXApOiBOZXcgYXV4 aWxpYXJ5IHN0cnVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IKCWdvbXBfdGFyZ2V0X3Jldi4KCShn b21wX3RhcmdldF9yZXYpOiBJbXBsZW1lbnQgcmV2ZXJzZSBvZmZsb2FkaW5nIGFuZCBpdHMg bWFwcGluZy4KCShnb21wX3RhcmdldF9pbml0KTogSW5pdCBjdXJyZW50X2RldmljZS5tZW1f bWFwX3Jldi5yb290LgoJKiB0ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3JldmVyc2Utb2Zm bG9hZC0yLmY5MDogTmV3IHRlc3QuCgkqIHRlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4vcmV2 ZXJzZS1vZmZsb2FkLTMuZjkwOiBOZXcgdGVzdC4KCSogdGVzdHN1aXRlL2xpYmdvbXAuZm9y dHJhbi9yZXZlcnNlLW9mZmxvYWQtNC5mOTA6IE5ldyB0ZXN0LgoJKiB0ZXN0c3VpdGUvbGli Z29tcC5mb3J0cmFuL3JldmVyc2Utb2ZmbG9hZC01LmY5MDogTmV3IHRlc3QuCgkqIHRlc3Rz dWl0ZS9saWJnb21wLmZvcnRyYW4vcmV2ZXJzZS1vZmZsb2FkLTVhLmY5MDogTmV3IHRlc3Qg d2l0aG91dAoJbWFwcGluZyBvZiBvbi1kZXZpY2UgYWxsb2NhdGVkIHZhcmlhYmxlcy4KCiBs aWJnb21wL2xpYmdvbXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3 NyArKy0KIGxpYmdvbXAvb2FjYy1ob3N0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAxICsKIGxpYmdvbXAvcGx1Z2luL3BsdWdpbi1udnB0eC5jICAgICAgICAgICAg ICAgICAgICAgIHwgICA0ICstCiBsaWJnb21wL3NwbGF5LXRyZWUuYyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAyMiArCiBsaWJnb21wL3NwbGF5LXRyZWUuaCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgOCArCiBsaWJnb21wL3RhcmdldC5jICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDU5OSArKysrKysrKysrKysrKysrKysr Ky0KIC4uLi9saWJnb21wLmZvcnRyYW4vcmV2ZXJzZS1vZmZsb2FkLTIuZjkwICAgICAgICAg IHwgIDcyICsrKwogLi4uL2xpYmdvbXAuZm9ydHJhbi9yZXZlcnNlLW9mZmxvYWQtMy5mOTAg ICAgICAgICAgfCAgNjggKysrCiAuLi4vbGliZ29tcC5mb3J0cmFuL3JldmVyc2Utb2ZmbG9h ZC00LmY5MCAgICAgICAgICB8IDEyOSArKysrKwogLi4uL2xpYmdvbXAuZm9ydHJhbi9yZXZl cnNlLW9mZmxvYWQtNS5mOTAgICAgICAgICAgfCAxMDAgKysrKwogLi4uL2xpYmdvbXAuZm9y dHJhbi9yZXZlcnNlLW9mZmxvYWQtNWEuZjkwICAgICAgICAgfCAgOTggKysrKwogMTEgZmls ZXMgY2hhbmdlZCwgMTEzOSBpbnNlcnRpb25zKCspLCAzOSBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9saWJnb21wL2xpYmdvbXAuaCBiL2xpYmdvbXAvbGliZ29tcC5oCmluZGV4IDU4 MDM2ODNhZmM0Li4xOWQ3ZDE3MDA5MSAxMDA2NDQKLS0tIGEvbGliZ29tcC9saWJnb21wLmgK KysrIGIvbGliZ29tcC9saWJnb21wLmgKQEAgLTExNTcsMjkgKzExNTcsNyBAQCBzdHJ1Y3Qg dGFyZ2V0X3Zhcl9kZXNjIHsKICAgdWludHB0cl90IGxlbmd0aDsKIH07CiAKLXN0cnVjdCB0 YXJnZXRfbWVtX2Rlc2MgewotICAvKiBSZWZlcmVuY2UgY291bnQuICAqLwotICB1aW50cHRy X3QgcmVmY291bnQ7Ci0gIC8qIEFsbCB0aGUgc3BsYXkgbm9kZXMgYWxsb2NhdGVkIHRvZ2V0 aGVyLiAgKi8KLSAgc3BsYXlfdHJlZV9ub2RlIGFycmF5OwotICAvKiBTdGFydCBvZiB0aGUg dGFyZ2V0IHJlZ2lvbi4gICovCi0gIHVpbnRwdHJfdCB0Z3Rfc3RhcnQ7Ci0gIC8qIEVuZCBv ZiB0aGUgdGFyZ2VyIHJlZ2lvbi4gICovCi0gIHVpbnRwdHJfdCB0Z3RfZW5kOwotICAvKiBI YW5kbGUgdG8gZnJlZS4gICovCi0gIHZvaWQgKnRvX2ZyZWU7Ci0gIC8qIFByZXZpb3VzIHRh cmdldF9tZW1fZGVzYy4gICovCi0gIHN0cnVjdCB0YXJnZXRfbWVtX2Rlc2MgKnByZXY7Ci0g IC8qIE51bWJlciBvZiBpdGVtcyBpbiBmb2xsb3dpbmcgbGlzdC4gICovCi0gIHNpemVfdCBs aXN0X2NvdW50OwotCi0gIC8qIENvcnJlc3BvbmRpbmcgdGFyZ2V0IGRldmljZSBkZXNjcmlw dG9yLiAgKi8KLSAgc3RydWN0IGdvbXBfZGV2aWNlX2Rlc2NyICpkZXZpY2VfZGVzY3I7Ci0K LSAgLyogTGlzdCBvZiB0YXJnZXQgaXRlbXMgdG8gcmVtb3ZlIChvciBkZWNyZWFzZSByZWZj b3VudCkKLSAgICAgYXQgdGhlIGVuZCBvZiByZWdpb24uICAqLwotICBzdHJ1Y3QgdGFyZ2V0 X3Zhcl9kZXNjIGxpc3RbXTsKLX07CitzdHJ1Y3QgdGFyZ2V0X21lbV9kZXNjOwogCiAvKiBT cGVjaWFsIHZhbHVlIGZvciByZWZjb3VudCAtIG1hc2sgdG8gaW5kaWNhdGUgZXhpc3RlbmNl IG9mIHNwZWNpYWwKICAgIHZhbHVlcy4gUmlnaHQgbm93IHdlIGFsbG9jYXRlIDMgYml0cy4g ICovCkBAIC0xMjczLDYgKzEyNTEsNTggQEAgc3BsYXlfY29tcGFyZSAoc3BsYXlfdHJlZV9r ZXkgeCwgc3BsYXlfdHJlZV9rZXkgeSkKIAogI2luY2x1ZGUgInNwbGF5LXRyZWUuaCIKIAor LyogUmV2ZXJzZSBvZmZsb2FkIHNwbGF5LXRyZWUgaGFuZGxpbmcgKGZ1bmN0aW9ucyBvbmx5 KS4gKi8KKworc3RydWN0IHJldmVyc2Vfc3BsYXlfdHJlZV9rZXlfcyB7CisgIC8qIEFkZHJl c3Mgb2YgdGhlIGRldmljZSBvYmplY3QuICAqLworICB1aW50NjRfdCBkZXY7CisgIHNwbGF5 X3RyZWVfa2V5IGs7Cit9OworCit0eXBlZGVmIHN0cnVjdCByZXZlcnNlX3NwbGF5X3RyZWVf bm9kZV9zICpyZXZlcnNlX3NwbGF5X3RyZWVfbm9kZTsKK3R5cGVkZWYgc3RydWN0IHJldmVy c2Vfc3BsYXlfdHJlZV9zICpyZXZlcnNlX3NwbGF5X3RyZWU7Cit0eXBlZGVmIHN0cnVjdCBy ZXZlcnNlX3NwbGF5X3RyZWVfa2V5X3MgKnJldmVyc2Vfc3BsYXlfdHJlZV9rZXk7CisKK3N0 YXRpYyBpbmxpbmUgaW50CityZXZlcnNlX3NwbGF5X2NvbXBhcmUgKHJldmVyc2Vfc3BsYXlf dHJlZV9rZXkgeCwgcmV2ZXJzZV9zcGxheV90cmVlX2tleSB5KQoreworICBpZiAoeC0+ZGV2 IDwgeS0+ZGV2KQorICAgIHJldHVybiAtMTsKKyAgaWYgKHgtPmRldiA+IHktPmRldikKKyAg ICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgc3BsYXlfdHJlZV9wcmVm aXggcmV2ZXJzZQorI2luY2x1ZGUgInNwbGF5LXRyZWUuaCIKKworc3RydWN0IHRhcmdldF9t ZW1fZGVzYyB7CisgIC8qIFJlZmVyZW5jZSBjb3VudC4gICovCisgIHVpbnRwdHJfdCByZWZj b3VudDsKKyAgLyogQWxsIHRoZSBzcGxheSBub2RlcyBhbGxvY2F0ZWQgdG9nZXRoZXIuICAq LworICBzcGxheV90cmVlX25vZGUgYXJyYXk7CisgIC8qIExpa2V2ZXJzZSBmb3IgdGhlIHJl dmVyc2UgbG9va3VwIGRldmljZS0+aG9zdCBmb3IgcmV2ZXJzZSBvZmZsb2FkLiAqLworICBy ZXZlcnNlX3NwbGF5X3RyZWVfbm9kZSByZXZfYXJyYXk7CisgIC8qIFN0YXJ0IG9mIHRoZSB0 YXJnZXQgcmVnaW9uLiAgKi8KKyAgdWludHB0cl90IHRndF9zdGFydDsKKyAgLyogRW5kIG9m IHRoZSB0YXJnZXIgcmVnaW9uLiAgKi8KKyAgdWludHB0cl90IHRndF9lbmQ7CisgIC8qIEhh bmRsZSB0byBmcmVlLiAgKi8KKyAgdm9pZCAqdG9fZnJlZTsKKyAgLyogUHJldmlvdXMgdGFy Z2V0X21lbV9kZXNjLiAgKi8KKyAgc3RydWN0IHRhcmdldF9tZW1fZGVzYyAqcHJldjsKKyAg LyogTnVtYmVyIG9mIGl0ZW1zIGluIGZvbGxvd2luZyBsaXN0LiAgKi8KKyAgc2l6ZV90IGxp c3RfY291bnQ7CisKKyAgLyogQ29ycmVzcG9uZGluZyB0YXJnZXQgZGV2aWNlIGRlc2NyaXB0 b3IuICAqLworICBzdHJ1Y3QgZ29tcF9kZXZpY2VfZGVzY3IgKmRldmljZV9kZXNjcjsKKwor ICAvKiBMaXN0IG9mIHRhcmdldCBpdGVtcyB0byByZW1vdmUgKG9yIGRlY3JlYXNlIHJlZmNv dW50KQorICAgICBhdCB0aGUgZW5kIG9mIHJlZ2lvbi4gICovCisgIHN0cnVjdCB0YXJnZXRf dmFyX2Rlc2MgbGlzdFtdOworfTsKKworCiB0eXBlZGVmIHN0cnVjdCBhY2NfZGlzcGF0Y2hf dAogewogICAvKiBFeGVjdXRlLiAgKi8KQEAgLTEzNjcsNiArMTM5Nyw3IEBAIHN0cnVjdCBn b21wX2RldmljZV9kZXNjcgogCiAgIC8qIFNwbGF5IHRyZWUgY29udGFpbmluZyBpbmZvcm1h dGlvbiBhYm91dCBtYXBwZWQgbWVtb3J5IHJlZ2lvbnMuICAqLwogICBzdHJ1Y3Qgc3BsYXlf dHJlZV9zIG1lbV9tYXA7CisgIHN0cnVjdCByZXZlcnNlX3NwbGF5X3RyZWVfcyBtZW1fbWFw X3JldjsKIAogICAvKiBNdXRleCBmb3IgdGhlIG11dGFibGUgZGF0YS4gICovCiAgIGdvbXBf bXV0ZXhfdCBsb2NrOwpkaWZmIC0tZ2l0IGEvbGliZ29tcC9vYWNjLWhvc3QuYyBiL2xpYmdv bXAvb2FjYy1ob3N0LmMKaW5kZXggNGUzOTcxYWUxYTkuLjc3YTI0Mjc5ZTJmIDEwMDY0NAot LS0gYS9saWJnb21wL29hY2MtaG9zdC5jCisrKyBiL2xpYmdvbXAvb2FjYy1ob3N0LmMKQEAg LTI4NCw2ICsyODQsNyBAQCBzdGF0aWMgc3RydWN0IGdvbXBfZGV2aWNlX2Rlc2NyIGhvc3Rf ZGlzcGF0Y2ggPQogICAgIC5ydW5fZnVuYyA9IGhvc3RfcnVuLAogCiAgICAgLm1lbV9tYXAg PSB7IE5VTEwgfSwKKyAgICAubWVtX21hcF9yZXYgPSB7IE5VTEwgfSwKICAgICAvKiAubG9j ayBpbml0aWFsaXplZCBpbiBnb2FjY19ob3N0X2luaXQuICAqLwogICAgIC5zdGF0ZSA9IEdP TVBfREVWSUNFX1VOSU5JVElBTElaRUQsCiAKZGlmZiAtLWdpdCBhL2xpYmdvbXAvcGx1Z2lu L3BsdWdpbi1udnB0eC5jIGIvbGliZ29tcC9wbHVnaW4vcGx1Z2luLW52cHR4LmMKaW5kZXgg ZTgwM2YwODM1OTEuLjRmNGMyNWE5MGJhIDEwMDY0NAotLS0gYS9saWJnb21wL3BsdWdpbi9w bHVnaW4tbnZwdHguYworKysgYi9saWJnb21wL3BsdWdpbi9wbHVnaW4tbnZwdHguYwpAQCAt MTE5MCw3ICsxMTkwLDkgQEAgR09NUF9PRkZMT0FEX2dldF9udW1fZGV2aWNlcyAodW5zaWdu ZWQgaW50IG9tcF9yZXF1aXJlc19tYXNrKQogICAgICBkZXZpY2VzIHdlcmUgcHJlc2VudC4g IFVuaWZpZWQtc2hhcmVkIGFkZHJlc3M6IHNlZSBjb21tZW50IGluCiAgICAgIG52cHR4X29w ZW5fZGV2aWNlIGZvciBDVV9ERVZJQ0VfQVRUUklCVVRFX1VOSUZJRURfQUREUkVTU0lORy4g ICovCiAgIGlmIChudW1fZGV2aWNlcyA+IDAKLSAgICAgICYmIChvbXBfcmVxdWlyZXNfbWFz ayAmIH5HT01QX1JFUVVJUkVTX1VOSUZJRURfQUREUkVTUykgIT0gMCkKKyAgICAgICYmICgo b21wX3JlcXVpcmVzX21hc2sKKwkgICAmIH4oR09NUF9SRVFVSVJFU19VTklGSUVEX0FERFJF U1MKKwkgICAgICAgfCBHT01QX1JFUVVJUkVTX1JFVkVSU0VfT0ZGTE9BRCkpICE9IDApKQog ICAgIHJldHVybiAtMTsKICAgcmV0dXJuIG51bV9kZXZpY2VzOwogfQpkaWZmIC0tZ2l0IGEv bGliZ29tcC9zcGxheS10cmVlLmMgYi9saWJnb21wL3NwbGF5LXRyZWUuYwppbmRleCAyZDg3 NDJmZDE5YS4uMzgwOWU5MGI2OGQgMTAwNjQ0Ci0tLSBhL2xpYmdvbXAvc3BsYXktdHJlZS5j CisrKyBiL2xpYmdvbXAvc3BsYXktdHJlZS5jCkBAIC0yMzYsMyArMjM2LDI1IEBAIHNwbGF5 X3RyZWVfZm9yZWFjaCAoc3BsYXlfdHJlZSBzcCwgc3BsYXlfdHJlZV9jYWxsYmFjayBmdW5j LCB2b2lkICpkYXRhKQogewogICBzcGxheV90cmVlX2ZvcmVhY2hfaW50ZXJuYWwgKHNwLT5y b290LCBmdW5jLCBkYXRhKTsKIH0KKworLyogTGlrZSBhYm92ZSwgZXhjZXB0IHdoZW4gZnVu YyByZXR1cm5zICE9IDAsIHN0b3AgZWFybHkuICAqLworCitzdGF0aWMgaW50CitzcGxheV90 cmVlX2ZvcmVhY2hfaW50ZXJuYWxfbGF6eSAoc3BsYXlfdHJlZV9ub2RlIG5vZGUsCisJCQkJ ICBzcGxheV90cmVlX2NhbGxiYWNrX3N0b3AgZnVuYywgdm9pZCAqZGF0YSkKK3sKKyAgaWYg KCFub2RlKQorICAgIHJldHVybiAwOworICBpZiAoZnVuYyAoJm5vZGUtPmtleSwgZGF0YSkp CisgICAgcmV0dXJuIDE7CisgIGlmIChzcGxheV90cmVlX2ZvcmVhY2hfaW50ZXJuYWxfbGF6 eSAobm9kZS0+bGVmdCwgZnVuYywgZGF0YSkpCisgICAgcmV0dXJuIDE7CisgIC8qIFllYWgs IHdoYXRldmVyLiAgR0NDIGNhbiBmaXggbXkgdGFpbCByZWN1cnNpb24uICAqLworICByZXR1 cm4gc3BsYXlfdHJlZV9mb3JlYWNoX2ludGVybmFsX2xhenkgKG5vZGUtPnJpZ2h0LCBmdW5j LCBkYXRhKTsKK30KKworYXR0cmlidXRlX2hpZGRlbiB2b2lkCitzcGxheV90cmVlX2ZvcmVh Y2hfbGF6eSAoc3BsYXlfdHJlZSBzcCwgc3BsYXlfdHJlZV9jYWxsYmFja19zdG9wIGZ1bmMs IHZvaWQgKmRhdGEpCit7CisgIHNwbGF5X3RyZWVfZm9yZWFjaF9pbnRlcm5hbF9sYXp5IChz cC0+cm9vdCwgZnVuYywgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9saWJnb21wL3NwbGF5LXRy ZWUuaCBiL2xpYmdvbXAvc3BsYXktdHJlZS5oCmluZGV4IDk5MjM4MWM0MDAwLi43ZGVhMGNj ODdmNyAxMDA2NDQKLS0tIGEvbGliZ29tcC9zcGxheS10cmVlLmgKKysrIGIvbGliZ29tcC9z cGxheS10cmVlLmgKQEAgLTc4LDggKzc4LDEyIEBAIHR5cGVkZWYgc3RydWN0IHNwbGF5X3Ry ZWVfa2V5X3MgKnNwbGF5X3RyZWVfa2V5OwogICAgIHNwbGF5X3RyZWVfbmFtZSAoc3BsYXlf dHJlZV9wcmVmaXgsIHNwbGF5X3RyZWVfcmVtb3ZlKQogIyBkZWZpbmUgc3BsYXlfdHJlZV9m b3JlYWNoCVwKICAgICBzcGxheV90cmVlX25hbWUgKHNwbGF5X3RyZWVfcHJlZml4LCBzcGxh eV90cmVlX2ZvcmVhY2gpCisjIGRlZmluZSBzcGxheV90cmVlX2ZvcmVhY2hfbGF6eSBcCisg ICAgc3BsYXlfdHJlZV9uYW1lIChzcGxheV90cmVlX3ByZWZpeCwgc3BsYXlfdHJlZV9mb3Jl YWNoX2xhenkpCiAjIGRlZmluZSBzcGxheV90cmVlX2NhbGxiYWNrCVwKICAgICBzcGxheV90 cmVlX25hbWUgKHNwbGF5X3RyZWVfcHJlZml4LCBzcGxheV90cmVlX2NhbGxiYWNrKQorIyBk ZWZpbmUgc3BsYXlfdHJlZV9jYWxsYmFja19zdG9wCVwKKyAgICBzcGxheV90cmVlX25hbWUg KHNwbGF5X3RyZWVfcHJlZml4LCBzcGxheV90cmVlX2NhbGxiYWNrX3N0b3ApCiAjZW5kaWYK IAogI2lmbmRlZiBzcGxheV90cmVlX2MKQEAgLTk5LDExICsxMDMsMTMgQEAgc3RydWN0IHNw bGF5X3RyZWVfcyB7CiB9OwogCiB0eXBlZGVmIHZvaWQgKCpzcGxheV90cmVlX2NhbGxiYWNr KSAoc3BsYXlfdHJlZV9rZXksIHZvaWQgKik7Cit0eXBlZGVmIGludCAoKnNwbGF5X3RyZWVf Y2FsbGJhY2tfc3RvcCkgKHNwbGF5X3RyZWVfa2V5LCB2b2lkICopOwogCiBleHRlcm4gc3Bs YXlfdHJlZV9rZXkgc3BsYXlfdHJlZV9sb29rdXAgKHNwbGF5X3RyZWUsIHNwbGF5X3RyZWVf a2V5KTsKIGV4dGVybiB2b2lkIHNwbGF5X3RyZWVfaW5zZXJ0IChzcGxheV90cmVlLCBzcGxh eV90cmVlX25vZGUpOwogZXh0ZXJuIHZvaWQgc3BsYXlfdHJlZV9yZW1vdmUgKHNwbGF5X3Ry ZWUsIHNwbGF5X3RyZWVfa2V5KTsKIGV4dGVybiB2b2lkIHNwbGF5X3RyZWVfZm9yZWFjaCAo c3BsYXlfdHJlZSwgc3BsYXlfdHJlZV9jYWxsYmFjaywgdm9pZCAqKTsKK2V4dGVybiB2b2lk IHNwbGF5X3RyZWVfZm9yZWFjaF9sYXp5IChzcGxheV90cmVlLCBzcGxheV90cmVlX2NhbGxi YWNrX3N0b3AsIHZvaWQgKik7CiAjZWxzZSAgLyogc3BsYXlfdHJlZV9jICovCiAjICBpZmRl ZiBzcGxheV90cmVlX3ByZWZpeAogIyAgICBpbmNsdWRlICJzcGxheS10cmVlLmMiCkBAIC0x MjUsNiArMTMxLDggQEAgZXh0ZXJuIHZvaWQgc3BsYXlfdHJlZV9mb3JlYWNoIChzcGxheV90 cmVlLCBzcGxheV90cmVlX2NhbGxiYWNrLCB2b2lkICopOwogIyAgdW5kZWYgc3BsYXlfdHJl ZV9pbnNlcnQKICMgIHVuZGVmIHNwbGF5X3RyZWVfcmVtb3ZlCiAjICB1bmRlZiBzcGxheV90 cmVlX2ZvcmVhY2gKKyMgIHVuZGVmIHNwbGF5X3RyZWVfZm9yZWFjaF9sYXp5CiAjICB1bmRl ZiBzcGxheV90cmVlX2NhbGxiYWNrCisjICB1bmRlZiBzcGxheV90cmVlX2NhbGxiYWNrX3N0 b3AKICMgIHVuZGVmIHNwbGF5X3RyZWVfcHJlZml4CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xp YmdvbXAvdGFyZ2V0LmMgYi9saWJnb21wL3RhcmdldC5jCmluZGV4IDE4OWIyMDFlMzQ0Li4x ZDhiY2E5ZmZlOCAxMDA2NDQKLS0tIGEvbGliZ29tcC90YXJnZXQuYworKysgYi9saWJnb21w L3RhcmdldC5jCkBAIC00NSw2ICs0NSwxMiBAQAogI2luY2x1ZGUgInBsdWdpbi1zdWZmaXgu aCIKICNlbmRpZgogCisvKiBEZWZpbmUgYW5vdGhlciBzcGxheSB0cmVlIGluc3RhbnRpYXRp b24gLSBmb3IgcmV2ZXJzZSBvZmZsb2FkLiAgKi8KKyNkZWZpbmUgc3BsYXlfdHJlZV9wcmVm aXggcmV2ZXJzZQorI2RlZmluZSBzcGxheV90cmVlX2MKKyNpbmNsdWRlICJzcGxheS10cmVl LmgiCisKKwogdHlwZWRlZiB1aW50cHRyX3QgKmhhc2hfZW50cnlfdHlwZTsKIHN0YXRpYyBp bmxpbmUgdm9pZCAqIGh0YWJfYWxsb2MgKHNpemVfdCBzaXplKSB7IHJldHVybiBnb21wX21h bGxvYyAoc2l6ZSk7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBodGFiX2ZyZWUgKHZvaWQgKnB0 cikgeyBmcmVlIChwdHIpOyB9CkBAIC0yMDAsNiArMjA2LDEyIEBAIGdvbXBfbWFwX2xvb2t1 cCAoc3BsYXlfdHJlZSBtZW1fbWFwLCBzcGxheV90cmVlX2tleSBrZXkpCiAgIHJldHVybiBz cGxheV90cmVlX2xvb2t1cCAobWVtX21hcCwga2V5KTsKIH0KIAorc3RhdGljIGlubGluZSBy ZXZlcnNlX3NwbGF5X3RyZWVfa2V5Citnb21wX21hcF9sb29rdXBfcmV2IChyZXZlcnNlX3Nw bGF5X3RyZWUgbWVtX21hcF9yZXYsIHJldmVyc2Vfc3BsYXlfdHJlZV9rZXkga2V5KQorewor ICByZXR1cm4gcmV2ZXJzZV9zcGxheV90cmVlX2xvb2t1cCAobWVtX21hcF9yZXYsIGtleSk7 Cit9CisKIHN0YXRpYyBpbmxpbmUgc3BsYXlfdHJlZV9rZXkKIGdvbXBfbWFwXzBsZW5fbG9v a3VwIChzcGxheV90cmVlIG1lbV9tYXAsIHNwbGF5X3RyZWVfa2V5IGtleSkKIHsKQEAgLTE2 NzQsNyArMTY4Niw3IEBAIGdvbXBfbWFwX3ZhcnNfaW50ZXJuYWwgKHN0cnVjdCBnb21wX2Rl dmljZV9kZXNjciAqZGV2aWNlcCwKIAkJCQkJCSAtIGstPmhvc3Rfc3RhcnQpLAogCQkJCQkg ICAgICBzaXplc1tqXSwgY2J1ZnAsIGZhbHNlKTsKIAkJCSAgfQotCQkJfQorCQkgICAgICB9 CiAJCSAgICBpID0gaiAtIDE7CiAJCSAgICBicmVhazsKIAkJICBjYXNlIEdPTVBfTUFQX0ZP UkNFX1BSRVNFTlQ6CkBAIC0yMTkyLDExICsyMjA0LDE2IEBAIGdvbXBfbG9hZF9pbWFnZV90 b19kZXZpY2UgKHN0cnVjdCBnb21wX2RldmljZV9kZXNjciAqZGV2aWNlcCwgdW5zaWduZWQg dmVyc2lvbiwKIAogICAvKiBMb2FkIGltYWdlIHRvIGRldmljZSBhbmQgZ2V0IHRhcmdldCBh ZGRyZXNzZXMgZm9yIHRoZSBpbWFnZS4gICovCiAgIHN0cnVjdCBhZGRyX3BhaXIgKnRhcmdl dF90YWJsZSA9IE5VTEw7CisgIHVpbnQ2NF90ICpyZXZfdGFyZ2V0X2ZuX3RhYmxlID0gTlVM TDsKICAgaW50IGksIG51bV90YXJnZXRfZW50cmllczsKIAorICAvKiBXaXRoIHJldmVyc2Ug b2ZmbG9hZCwgaW5zZXJ0IGFsc28gdGFyZ2V0LWhvc3QgYWRkcmVzc2VzLiAqLworICBib29s IHJldl9sb29rdXAgPSBvbXBfcmVxdWlyZXNfbWFzayAmIEdPTVBfUkVRVUlSRVNfUkVWRVJT RV9PRkZMT0FEOworCiAgIG51bV90YXJnZXRfZW50cmllcwogICAgID0gZGV2aWNlcC0+bG9h ZF9pbWFnZV9mdW5jIChkZXZpY2VwLT50YXJnZXRfaWQsIHZlcnNpb24sCi0JCQkJdGFyZ2V0 X2RhdGEsICZ0YXJnZXRfdGFibGUsIE5VTEwpOworCQkJCXRhcmdldF9kYXRhLCAmdGFyZ2V0 X3RhYmxlLAorCQkJCXJldl9sb29rdXAgPyAmcmV2X3RhcmdldF9mbl90YWJsZSA6IE5VTEwp OwogCiAgIGlmIChudW1fdGFyZ2V0X2VudHJpZXMgIT0gbnVtX2Z1bmNzICsgbnVtX3ZhcnMK ICAgICAgIC8qICIrMSIgZHVlIHRvIHRoZSBhZGRpdGlvbmFsIElDViBzdHJ1Y3QuICAqLwpA QCAtMjIxNSw2ICsyMjMyLDEwIEBAIGdvbXBfbG9hZF9pbWFnZV90b19kZXZpY2UgKHN0cnVj dCBnb21wX2RldmljZV9kZXNjciAqZGV2aWNlcCwgdW5zaWduZWQgdmVyc2lvbiwKICAgLyog IisxIiBkdWUgdG8gdGhlIGFkZGl0aW9uYWwgSUNWIHN0cnVjdC4gICovCiAgIHRndC0+YXJy YXkgPSBnb21wX21hbGxvYyAoKG51bV9mdW5jcyArIG51bV92YXJzICsgMSkKIAkJCSAgICAq IHNpemVvZiAoKnRndC0+YXJyYXkpKTsKKyAgaWYgKHJldl90YXJnZXRfZm5fdGFibGUpCisg ICAgdGd0LT5yZXZfYXJyYXkgPSBnb21wX21hbGxvYyAobnVtX2Z1bmNzICogc2l6ZW9mICgq dGd0LT5yZXZfYXJyYXkpKTsKKyAgZWxzZQorICAgIHRndC0+cmV2X2FycmF5ID0gTlVMTDsK ICAgdGd0LT5yZWZjb3VudCA9IFJFRkNPVU5UX0lORklOSVRZOwogICB0Z3QtPnRndF9zdGFy dCA9IDA7CiAgIHRndC0+dGd0X2VuZCA9IDA7CkBAIC0yMjIzLDYgKzIyNDQsNyBAQCBnb21w X2xvYWRfaW1hZ2VfdG9fZGV2aWNlIChzdHJ1Y3QgZ29tcF9kZXZpY2VfZGVzY3IgKmRldmlj ZXAsIHVuc2lnbmVkIHZlcnNpb24sCiAgIHRndC0+bGlzdF9jb3VudCA9IDA7CiAgIHRndC0+ ZGV2aWNlX2Rlc2NyID0gZGV2aWNlcDsKICAgc3BsYXlfdHJlZV9ub2RlIGFycmF5ID0gdGd0 LT5hcnJheTsKKyAgcmV2ZXJzZV9zcGxheV90cmVlX25vZGUgcmV2X2FycmF5ID0gdGd0LT5y ZXZfYXJyYXk7CiAKICAgZm9yIChpID0gMDsgaSA8IG51bV9mdW5jczsgaSsrKQogICAgIHsK QEAgLTIyMzcsNiArMjI1OSwxNyBAQCBnb21wX2xvYWRfaW1hZ2VfdG9fZGV2aWNlIChzdHJ1 Y3QgZ29tcF9kZXZpY2VfZGVzY3IgKmRldmljZXAsIHVuc2lnbmVkIHZlcnNpb24sCiAgICAg ICBhcnJheS0+bGVmdCA9IE5VTEw7CiAgICAgICBhcnJheS0+cmlnaHQgPSBOVUxMOwogICAg ICAgc3BsYXlfdHJlZV9pbnNlcnQgKCZkZXZpY2VwLT5tZW1fbWFwLCBhcnJheSk7CisgICAg ICBpZiAocmV2X3RhcmdldF9mbl90YWJsZSkKKwl7CisJICByZXZlcnNlX3NwbGF5X3RyZWVf a2V5IGsyID0gJnJldl9hcnJheS0+a2V5OworCSAgazItPmRldiA9IHJldl90YXJnZXRfZm5f dGFibGVbaV07CisJICBrMi0+ayA9IGs7CisJICByZXZfYXJyYXktPmxlZnQgPSBOVUxMOwor CSAgcmV2X2FycmF5LT5yaWdodCA9IE5VTEw7CisJICBpZiAoazItPmRldiAhPSAwKQorCSAg ICByZXZlcnNlX3NwbGF5X3RyZWVfaW5zZXJ0ICgmZGV2aWNlcC0+bWVtX21hcF9yZXYsIHJl dl9hcnJheSk7CisJICByZXZfYXJyYXkrKzsKKwl9CiAgICAgICBhcnJheSsrOwogICAgIH0K IApAQCAtMjM0OSw2ICsyMzgyLDE1IEBAIGdvbXBfdW5sb2FkX2ltYWdlX2Zyb21fZGV2aWNl IChzdHJ1Y3QgZ29tcF9kZXZpY2VfZGVzY3IgKmRldmljZXAsCiAgICAgICBnb21wX211dGV4 X3VubG9jayAoJmRldmljZXAtPmxvY2spOwogICAgICAgZ29tcF9mYXRhbCAoImltYWdlIHVu bG9hZCBmYWlsIik7CiAgICAgfQorICBpZiAoZGV2aWNlcC0+bWVtX21hcF9yZXYucm9vdCkK KyAgICB7CisgICAgICAvKiBGcmVlIHJldmVyc2Ugb2ZmbG9hZCBzcGxheSB0cmVlICsgZGF0 YTsgJ3RndC0+cmV2X2FycmF5JyBpcyB0aGUgb25seQorCSByZWFsIGFsbG9jYXRpb24uICAq LworICAgICAgYXNzZXJ0IChub2RlICYmIG5vZGUtPnRndCAmJiBub2RlLT50Z3QtPnJldl9h cnJheSk7CisgICAgICBhc3NlcnQgKGRldmljZXAtPm1lbV9tYXBfcmV2LnJvb3QtPmtleS5r LT50Z3QgPT0gbm9kZS0+dGd0KTsKKyAgICAgIGZyZWUgKG5vZGUtPnRndC0+cmV2X2FycmF5 KTsKKyAgICAgIGRldmljZXAtPm1lbV9tYXBfcmV2LnJvb3QgPSBOVUxMOworICAgIH0KIAog ICAvKiBSZW1vdmUgbWFwcGluZ3MgZnJvbSBzcGxheSB0cmVlLiAgKi8KICAgaW50IGk7CkBA IC0yOTM0LDIzICsyOTc2LDU0OSBAQCBHT01QX3RhcmdldF9leHQgKGludCBkZXZpY2UsIHZv aWQgKCpmbikgKHZvaWQgKiksIHNpemVfdCBtYXBudW0sCiAgICAgaHRhYl9mcmVlIChyZWZj b3VudF9zZXQpOwogfQogCisKKy8qIFJldmVyc2UgbG9va3VwIChkZXZpY2UgYWRkciAtPiBo b3N0IGFkZHIpIGZvciByZXZlcnNlIG9mZmxvYWQuICBXZSBhdm9pZAorICAga2VlcGluZyB0 cmFjayBvZiBhbGwgdmFyaWFibGUgaGFuZGxpbmcgLSBhc3N1bWluZyB0aGF0IHJldmVyc2Ug b2ZmbG9hZCBvY2N1cnMKKyAgIG9ueSB2ZXJ5IHJhcmVseS4gIERvd25zaWRlIGlzIHRoYXQg dGhlIHJldmVyc2Ugc2VhcmNoIGlzIHNsb3cuICAqLworCitzdHJ1Y3QgZ29tcF9zcGxheV90 cmVlX3Jldl9sb29rdXBfZGF0YSB7CisgIHVpbnRwdHJfdCB0Z3Rfc3RhcnQ7CisgIHVpbnRw dHJfdCB0Z3RfZW5kOworICBzcGxheV90cmVlX2tleSBrZXk7Cit9OworCitzdGF0aWMgaW50 Citnb21wX3NwbGF5X3RyZWVfcmV2X2xvb2t1cCAoc3BsYXlfdHJlZV9rZXkga2V5LCB2b2lk ICpkKQoreworICBzdHJ1Y3QgZ29tcF9zcGxheV90cmVlX3Jldl9sb29rdXBfZGF0YSAqZGF0 YTsKKyAgZGF0YSA9IChzdHJ1Y3QgZ29tcF9zcGxheV90cmVlX3Jldl9sb29rdXBfZGF0YSAq KWQ7CisgIHVpbnRwdHJfdCB0Z3Rfc3RhcnQgPSBrZXktPnRndC0+dGd0X3N0YXJ0ICsga2V5 LT50Z3Rfb2Zmc2V0OworCisgIGlmICh0Z3Rfc3RhcnQgPiBkYXRhLT50Z3Rfc3RhcnQgfHwg a2V5LT50Z3QtPmxpc3RfY291bnQgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBzaXplX3Qg ajsKKyAgZm9yIChqID0gMDsgaiA8IGtleS0+dGd0LT5saXN0X2NvdW50OyBqKyspCisgICAg aWYgKGtleS0+dGd0LT5saXN0W2pdLmtleSA9PSBrZXkpCisgICAgICBicmVhazsKKyAgYXNz ZXJ0IChqIDwga2V5LT50Z3QtPmxpc3RfY291bnQpOworICB1aW50cHRyX3QgdGd0X2VuZCA9 IHRndF9zdGFydCArIGtleS0+dGd0LT5saXN0W2pdLmxlbmd0aDsKKworICBpZiAoKHRndF9z dGFydCA9PSBkYXRhLT50Z3Rfc3RhcnQgJiYgdGd0X2VuZCA9PSBkYXRhLT50Z3RfZW5kKQor ICAgICAgfHwgKHRndF9lbmQgPiBkYXRhLT50Z3Rfc3RhcnQgJiYgdGd0X3N0YXJ0IDwgZGF0 YS0+dGd0X2VuZCkpCisgICAgeworICAgICAgZGF0YS0+a2V5ID0ga2V5OworICAgICAgcmV0 dXJuIDE7CisgICAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzcGxheV90 cmVlX2tleQorZ29tcF9tYXBfcmV2X2xvb2t1cCAoc3BsYXlfdHJlZSBtZW1fbWFwLCB1aW50 NjRfdCB0Z3Rfc3RhcnQsIHVpbnQ2NF90IHRndF9lbmQsCisJCSAgICAgYm9vbCB6ZXJvX2xl bikKK3sKKyAgc3RydWN0IGdvbXBfc3BsYXlfdHJlZV9yZXZfbG9va3VwX2RhdGEgZGF0YTsK KyAgZGF0YS5rZXkgPSBOVUxMOworICBkYXRhLnRndF9zdGFydCA9IHRndF9zdGFydDsKKyAg ZGF0YS50Z3RfZW5kID0gdGd0X2VuZDsKKworICBpZiAodGd0X3N0YXJ0ICE9IHRndF9lbmQp CisgICAgeworICAgICAgc3BsYXlfdHJlZV9mb3JlYWNoX2xhenkgKG1lbV9tYXAsIGdvbXBf c3BsYXlfdHJlZV9yZXZfbG9va3VwLCAmZGF0YSk7CisgICAgICByZXR1cm4gZGF0YS5rZXk7 CisgICAgfQorCisgIGRhdGEudGd0X2VuZCsrOworICBzcGxheV90cmVlX2ZvcmVhY2hfbGF6 eSAobWVtX21hcCwgZ29tcF9zcGxheV90cmVlX3Jldl9sb29rdXAsICZkYXRhKTsKKyAgaWYg KGRhdGEua2V5ICE9IE5VTEwgfHwgemVyb19sZW4pCisgICAgcmV0dXJuIGRhdGEua2V5Owor ICBkYXRhLnRndF9lbmQtLTsKKworICBkYXRhLnRndF9zdGFydC0tOworICBzcGxheV90cmVl X2ZvcmVhY2hfbGF6eSAobWVtX21hcCwgZ29tcF9zcGxheV90cmVlX3Jldl9sb29rdXAsICZk YXRhKTsKKyAgcmV0dXJuIGRhdGEua2V5OworfQorCitzdHJ1Y3QgY3B5X2RhdGEKK3sKKyAg dWludDY0X3QgZGV2YWRkcjsKKyAgYm9vbCBwcmVzZW50LCBhbGlnbmVkOworfTsKKworCisv KiBTZWFyY2gganVzdCBtYXBwZWQgcmV2ZXJzZS1vZmZsb2FkIGRhdGE7IHJldHVybnMgaW5k ZXggaWYgZm91bmQsCisgICBvdGhlcndpc2UgPj0gbi4gICovCisKK3N0YXRpYyBpbmxpbmUg aW50Citnb21wX21hcF9jZGF0YV9sb29rdXBfaW50IChzdHJ1Y3QgY3B5X2RhdGEgKmQsIHVp bnQ2NF90ICpkZXZhZGRycywKKwkJCSAgIHVuc2lnbmVkIHNob3J0ICpraW5kcywgdWludDY0 X3QgKnNpemVzLCBzaXplX3QgbiwKKwkJCSAgIHVpbnQ2NF90IHRndF9zdGFydCwgdWludDY0 X3QgdGd0X2VuZCkKK3sKKyAgY29uc3QgYm9vbCBzaG9ydF9tYXBraW5kID0gdHJ1ZTsKKyAg Y29uc3QgaW50IHR5cGVtYXNrID0gc2hvcnRfbWFwa2luZCA/IDB4ZmYgOiAweDc7CisgIHNp emVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgIGJvb2wg aXNfc3RydWN0ID0gKChnZXRfa2luZCAoc2hvcnRfbWFwa2luZCwga2luZHMsIGkpICYgdHlw ZW1hc2spCisJCQk9PSBHT01QX01BUF9TVFJVQ1QpOworICAgICAgdWludDY0X3QgZGV2X2Vu ZDsKKyAgICAgIGlmICghaXNfc3RydWN0KQorCWRldl9lbmQgPSBkW2ldLmRldmFkZHIgKyBz aXplc1tpXTsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAoaSArIHNpemVzW2ldIDwgbikKKwkg ICAgZGV2X2VuZCA9IGRbaSArIHNpemVzW2ldXS5kZXZhZGRyICsgc2l6ZXNbaSArIHNpemVz W2ldXTsKKwkgIGVsc2UKKwkgICAgZGV2X2VuZCA9IGRldmFkZHJzW2kgKyBzaXplc1tpXV0g KyBzaXplc1tpICsgc2l6ZXNbaV1dOworCX0KKyAgICAgIGlmICgoZFtpXS5kZXZhZGRyID09 IHRndF9zdGFydCAmJiBkZXZfZW5kID09IHRndF9lbmQpCisJICB8fCAoZGV2X2VuZCA+IHRn dF9zdGFydCAmJiBkW2ldLmRldmFkZHIgPCB0Z3RfZW5kKSkKKwlicmVhazsKKyAgICAgIGlm IChpc19zdHJ1Y3QpCisJaSArPSBzaXplc1tpXTsKKyAgICB9CisgIHJldHVybiBpOworfQor CitzdGF0aWMgaW5saW5lIGludAorZ29tcF9tYXBfY2RhdGFfbG9va3VwIChzdHJ1Y3QgY3B5 X2RhdGEgKmQsIHVpbnQ2NF90ICpkZXZhZGRycywKKwkJICAgICAgIHVuc2lnbmVkIHNob3J0 ICpraW5kcywgdWludDY0X3QgKnNpemVzLAorCQkgICAgICAgc2l6ZV90IG4sIHVpbnQ2NF90 IHRndF9zdGFydCwgdWludDY0X3QgdGd0X2VuZCwKKwkJICAgICAgIGJvb2wgemVyb19sZW4p Cit7CisgIHNpemVfdCBpOworICBpZiAodGd0X3N0YXJ0ICE9IHRndF9lbmQpCisgICAgcmV0 dXJuIGdvbXBfbWFwX2NkYXRhX2xvb2t1cF9pbnQgKGQsIGRldmFkZHJzLCBraW5kcywgc2l6 ZXMsIG4sCisJCQkJICAgICAgdGd0X3N0YXJ0LCB0Z3RfZW5kKTsKKyAgdGd0X2VuZCsrOwor ICBpID0gZ29tcF9tYXBfY2RhdGFfbG9va3VwX2ludCAoZCwgZGV2YWRkcnMsIGtpbmRzLCBz aXplcywgbiwKKwkJCQkgdGd0X3N0YXJ0LCB0Z3RfZW5kKTsKKyAgaWYgKGkgPCBuIHx8IHpl cm9fbGVuKQorICAgIHJldHVybiBpOworICB0Z3RfZW5kLS07CisKKyAgdGd0X3N0YXJ0LS07 CisgIHJldHVybiBnb21wX21hcF9jZGF0YV9sb29rdXBfaW50IChkLCBkZXZhZGRycywga2lu ZHMsIHNpemVzLCBuLAorCQkJCSAgICB0Z3Rfc3RhcnQsIHRndF9lbmQpOworfQorCiAvKiBI YW5kbGUgcmV2ZXJzZSBvZmZsb2FkLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGRldmljZSBw bHVnaW5zIGZvciBhCi0gICByZXZlcnNlIG9mZmxvYWQ7IGl0IGlzIG5vdCBjYWxsZWQgaWYg dGhlIG91dGVyIHRhcmdldCBydW5zIG9uIHRoZSBob3N0LiAgKi8KKyAgIHJldmVyc2Ugb2Zm bG9hZDsgaXQgaXMgbm90IGNhbGxlZCBpZiB0aGUgb3V0ZXIgdGFyZ2V0IHJ1bnMgb24gdGhl IGhvc3QuCisgICBUaGUgbWFwcGluZyBpcyBzaW1wbGlmaWVkIGRldmljZS1hZmZlY3Rpbmcg Y29uc3RydWN0cyAoZXhjZXB0IGZvciB0YXJnZXQKKyAgIHdpdGggZGV2aWNlKGFuY2VzdG9y OjEpKSBtdXN0IG5vdCBiZSBlbmNvdW50ZXJlZDsgaW4gcGFydGljdWxhciBub3QKKyAgIHRh cmdldCAoZW50ZXIvZXhpdCkgZGF0YS4gICovCiAKIHZvaWQKLWdvbXBfdGFyZ2V0X3JldiAo dWludDY0X3QgZm5fcHRyIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJIHVpbnQ2NF90 IG1hcG51bSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSB1aW50NjRfdCBkZXZhZGRy c19wdHIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgdWludDY0X3Qgc2l6ZXNfcHRy IF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJIHVpbnQ2NF90IGtpbmRzX3B0ciBfX2F0 dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSBpbnQgZGV2X251bSBfX2F0dHJpYnV0ZV9fICgo dW51c2VkKSksCi0JCSB2b2lkICgqZGV2X3RvX2hvc3RfY3B5KSAodm9pZCAqLCBjb25zdCB2 b2lkICosIHNpemVfdCwKLQkJCQkJICB2b2lkICopIF9fYXR0cmlidXRlX18gKCh1bnVzZWQp KSwKLQkJIHZvaWQgKCpob3N0X3RvX2Rldl9jcHkpICh2b2lkICosIGNvbnN0IHZvaWQgKiwg c2l6ZV90LAotCQkJCQkgIHZvaWQgKikgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkg dm9pZCAqdG9rZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQorZ29tcF90YXJnZXRfcmV2 ICh1aW50NjRfdCBmbl9wdHIsIHVpbnQ2NF90IG1hcG51bSwgdWludDY0X3QgZGV2YWRkcnNf cHRyLAorCQkgdWludDY0X3Qgc2l6ZXNfcHRyLCB1aW50NjRfdCBraW5kc19wdHIsIGludCBk ZXZfbnVtLAorCQkgdm9pZCAoKmRldl90b19ob3N0X2NweSkgKHZvaWQgKiwgY29uc3Qgdm9p ZCAqLCBzaXplX3QsIHZvaWQqKSwKKwkJIHZvaWQgKCpob3N0X3RvX2Rldl9jcHkpICh2b2lk ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCB2b2lkKiksCisJCSB2b2lkICp0b2tlbikKIHsK LSAgX19idWlsdGluX3VucmVhY2hhYmxlICgpOworICAvKiBSZXR1cm4gZWFybHkgaWYgdGhl cmUgaXMgbm8gb2ZmbG9hZCBjb2RlLiAgKi8KKyAgaWYgKHNpemVvZiAoT0ZGTE9BRF9QTFVH SU5TKSA9PSBzaXplb2YgKCIiKSkKKyAgICByZXR1cm47CisgIC8qIEN1cnJlbnRseSwgdGhp cyBmYWlscyBiZWNhdXNlIG9mIGNhbGN1bGF0ZV9maXJzdHByaXZhdGVfcmVxdWlyZW1lbnRz CisgICAgIGJlbG93OyBpdCBjb3VsZCBiZSBmaXhlZCBidXQgYWRkaXRpb25hbCBjb2RlIG5l ZWRzIHRvIGJlIHVwZGF0ZWQgdG8KKyAgICAgaGFuZGxlIDMyYml0IGhvc3RzIC0gdGh1cywg aXQgaXMgbm90IHdvcnRod2hpbGUuICAqLworICBpZiAoc2l6ZW9mICh2b2lkICopICE9IHNp emVvZiAodWludDY0X3QpKQorICAgIGdvbXBfZmF0YWwgKCJSZXZlcnNlIG9mZmxvYWQgb2Yg MzJiaXQgaG9zdHMgbm90IHN1cHBvcnRlZC4iKTsKKworICBzdHJ1Y3QgY3B5X2RhdGEgKmNk YXRhID0gTlVMTDsKKyAgdWludDY0X3QgKmRldmFkZHJzOworICB1aW50NjRfdCAqc2l6ZXM7 CisgIHVuc2lnbmVkIHNob3J0ICpraW5kczsKKyAgY29uc3QgYm9vbCBzaG9ydF9tYXBraW5k ID0gdHJ1ZTsKKyAgY29uc3QgaW50IHR5cGVtYXNrID0gc2hvcnRfbWFwa2luZCA/IDB4ZmYg OiAweDc7CisgIHN0cnVjdCBnb21wX2RldmljZV9kZXNjciAqZGV2aWNlcCA9IHJlc29sdmVf ZGV2aWNlIChkZXZfbnVtLCBmYWxzZSk7CisKKyAgcmV2ZXJzZV9zcGxheV90cmVlX2tleSBu OworICBzdHJ1Y3QgcmV2ZXJzZV9zcGxheV90cmVlX2tleV9zIGs7CisgIGsuZGV2ID0gZm5f cHRyOworCisgIGdvbXBfbXV0ZXhfbG9jayAoJmRldmljZXAtPmxvY2spOworICBuID0gZ29t cF9tYXBfbG9va3VwX3JldiAoJmRldmljZXAtPm1lbV9tYXBfcmV2LCAmayk7CisgIGdvbXBf bXV0ZXhfdW5sb2NrICgmZGV2aWNlcC0+bG9jayk7CisKKyAgaWYgKG4gPT0gTlVMTCkKKyAg ICBnb21wX2ZhdGFsICgiQ2Fubm90IGZpbmQgcmV2ZXJzZS1vZmZsb2FkIGZ1bmN0aW9uIik7 CisgIHZvaWQgKCpob3N0X2ZuKSgpID0gKHZvaWQgKCopKCkpIG4tPmstPmhvc3Rfc3RhcnQ7 CisKKyAgaWYgKGRldmljZXAtPmNhcGFiaWxpdGllcyAmIEdPTVBfT0ZGTE9BRF9DQVBfU0hB UkVEX01FTSkKKyAgICB7CisgICAgICBkZXZhZGRycyA9ICh1aW50NjRfdCAqKSAodWludHB0 cl90KSBkZXZhZGRyc19wdHI7CisgICAgICBzaXplcyA9ICh1aW50NjRfdCAqKSAodWludHB0 cl90KSBzaXplc19wdHI7CisgICAgICBraW5kcyA9ICh1bnNpZ25lZCBzaG9ydCAqKSAodWlu dHB0cl90KSBraW5kc19wdHI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGV2YWRk cnMgPSAodWludDY0X3QgKikgZ29tcF9tYWxsb2MgKG1hcG51bSAqIHNpemVvZiAodWludDY0 X3QpKTsKKyAgICAgIHNpemVzID0gKHVpbnQ2NF90ICopIGdvbXBfbWFsbG9jIChtYXBudW0g KiBzaXplb2YgKHVpbnQ2NF90KSk7CisgICAgICBraW5kcyA9ICh1bnNpZ25lZCBzaG9ydCAq KSBnb21wX21hbGxvYyAobWFwbnVtICogc2l6ZW9mICh1bnNpZ25lZCBzaG9ydCkpOworICAg ICAgaWYgKGRldl90b19ob3N0X2NweSkKKwl7CisJICBkZXZfdG9faG9zdF9jcHkgKGRldmFk ZHJzLCAoY29uc3Qgdm9pZCAqKSAodWludHB0cl90KSBkZXZhZGRyc19wdHIsCisJCQkgICBt YXBudW0gKiBzaXplb2YgKHVpbnQ2NF90KSwgdG9rZW4pOworCSAgZGV2X3RvX2hvc3RfY3B5 IChzaXplcywgKGNvbnN0IHZvaWQgKikgKHVpbnRwdHJfdCkgc2l6ZXNfcHRyLAorCQkJICAg bWFwbnVtICogc2l6ZW9mICh1aW50NjRfdCksIHRva2VuKTsKKwkgIGRldl90b19ob3N0X2Nw eSAoa2luZHMsIChjb25zdCB2b2lkICopICh1aW50cHRyX3QpIGtpbmRzX3B0ciwKKwkJCSAg IG1hcG51bSAqIHNpemVvZiAodW5zaWduZWQgc2hvcnQpLCB0b2tlbik7CisJfQorICAgICAg ZWxzZQorCXsKKwkgIGdvbXBfY29weV9kZXYyaG9zdCAoZGV2aWNlcCwgTlVMTCwgZGV2YWRk cnMsCisJCQkgICAgICAoY29uc3Qgdm9pZCAqKSAodWludHB0cl90KSBkZXZhZGRyc19wdHIs CisJCQkgICAgICBtYXBudW0gKiBzaXplb2YgKHVpbnQ2NF90KSk7CisJICBnb21wX2NvcHlf ZGV2Mmhvc3QgKGRldmljZXAsIE5VTEwsIHNpemVzLAorCQkJICAgICAgKGNvbnN0IHZvaWQg KikgKHVpbnRwdHJfdCkgc2l6ZXNfcHRyLAorCQkJICAgICAgbWFwbnVtICogc2l6ZW9mICh1 aW50NjRfdCkpOworCSAgZ29tcF9jb3B5X2RldjJob3N0IChkZXZpY2VwLCBOVUxMLCBraW5k cywgKGNvbnN0IHZvaWQgKikgKHVpbnRwdHJfdCkga2luZHNfcHRyLAorCQkJICAgICAgbWFw bnVtICogc2l6ZW9mICh1bnNpZ25lZCBzaG9ydCkpOworCX0KKyAgICB9CisKKyAgc2l6ZV90 IHRndF9hbGlnbiA9IDAsIHRndF9zaXplID0gMDsKKworICAvKiBJZiBhY3R1YWxseSBleGVj dXRlZCBvbiAzMmJpdCBzeXN0ZW1zLCB0aGUgY2FzdHMgbGVhZCB0byB3cm9uZyBjb2RlOwor ICAgICBidXQgMzJiaXQgd2l0aCBvZmZsb2FkaW5nIGlzIG5vdCBzdXBwb3J0ZWQ7IHNlZSB0 b3Agb2YgdGhpcyBmdW5jdGlvbi4gICovCisgIGNhbGN1bGF0ZV9maXJzdHByaXZhdGVfcmVx dWlyZW1lbnRzIChtYXBudW0sICh2b2lkICopICh1aW50cHRyX3QpIHNpemVzLAorCQkJCSAg ICAgICAodm9pZCAqKSAodWludHB0cl90KSBraW5kcywKKwkJCQkgICAgICAgJnRndF9hbGln biwgJnRndF9zaXplKTsKKworICBpZiAodGd0X2FsaWduKQorICAgIHsKKyAgICAgIGNoYXIg KnRndCA9IGdvbXBfYWxsb2NhICh0Z3Rfc2l6ZSArIHRndF9hbGlnbiAtIDEpOworICAgICAg dWludHB0cl90IGFsID0gKHVpbnRwdHJfdCkgdGd0ICYgKHRndF9hbGlnbiAtIDEpOworICAg ICAgaWYgKGFsKQorCXRndCArPSB0Z3RfYWxpZ24gLSBhbDsKKyAgICAgIHRndF9zaXplID0g MDsKKyAgICAgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBtYXBudW07IGkrKykKKwlpZiAo Z2V0X2tpbmQgKHNob3J0X21hcGtpbmQsIGtpbmRzLCBpKSA9PSBHT01QX01BUF9GSVJTVFBS SVZBVEUKKwkgICAgJiYgZGV2YWRkcnNbaV0gIT0gMCkKKwkgIHsKKwkgICAgc2l6ZV90IGFs aWduID0gKHNpemVfdCkgMSA8PCAoa2luZHNbaV0gPj4gOCk7CisJICAgIHRndF9zaXplID0g KHRndF9zaXplICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24gLSAxKTsKKwkgICAgaWYgKGRldmlj ZXAtPmNhcGFiaWxpdGllcyAmIEdPTVBfT0ZGTE9BRF9DQVBfU0hBUkVEX01FTSkKKwkgICAg ICBtZW1jcHkgKHRndCArIHRndF9zaXplLCAodm9pZCAqKSAodWludHB0cl90KSBkZXZhZGRy c1tpXSwKKwkJICAgICAgKHNpemVfdCkgc2l6ZXNbaV0pOworCSAgICBlbHNlIGlmIChkZXZf dG9faG9zdF9jcHkpCisJICAgICAgZGV2X3RvX2hvc3RfY3B5ICh0Z3QgKyB0Z3Rfc2l6ZSwg KHZvaWQgKikgKHVpbnRwdHJfdCkgZGV2YWRkcnNbaV0sCisJCQkgICAgICAgKHNpemVfdCkg c2l6ZXNbaV0sIHRva2VuKTsKKwkgICAgZWxzZQorCSAgICAgIGdvbXBfY29weV9kZXYyaG9z dCAoZGV2aWNlcCwgTlVMTCwgdGd0ICsgdGd0X3NpemUsCisJCQkJICAodm9pZCAqKSAodWlu dHB0cl90KSBkZXZhZGRyc1tpXSwKKwkJCQkgIChzaXplX3QpIHNpemVzW2ldKTsKKwkgICAg ZGV2YWRkcnNbaV0gPSAodWludDY0X3QpICh1aW50cHRyX3QpIHRndCArIHRndF9zaXplOwor CSAgICB0Z3Rfc2l6ZSA9IHRndF9zaXplICsgc2l6ZXNbaV07CisJICAgIGlmICgoZGV2aWNl cC0+Y2FwYWJpbGl0aWVzICYgR09NUF9PRkZMT0FEX0NBUF9TSEFSRURfTUVNKQorCQkmJiBp ICsgMSA8IG1hcG51bQorCQkmJiAoKGdldF9raW5kIChzaG9ydF9tYXBraW5kLCBraW5kcywg aSkgJiB0eXBlbWFzaykKKwkJICAgID09IEdPTVBfTUFQX0FUVEFDSCkpCisJICAgICAgewor CQkqKHVpbnQ2NF90KikgKHVpbnRwdHJfdCkgKGRldmFkZHJzW2krMV0gKyBzaXplc1tpKzFd KQorCQkgID0gKHVpbnQ2NF90KSBkZXZhZGRyc1tpXTsKKwkJKytpOworCSAgICAgIH0KKwkg IH0KKyAgICB9CisKKyAgaWYgKCEoZGV2aWNlcC0+Y2FwYWJpbGl0aWVzICYgR09NUF9PRkZM T0FEX0NBUF9TSEFSRURfTUVNKSkKKyAgICB7CisgICAgICBzaXplX3Qgaiwgc3RydWN0X2Nw eSA9IDA7CisgICAgICBzcGxheV90cmVlX2tleSBuMjsKKyAgICAgIGNkYXRhID0gZ29tcF9h bGxvY2EgKHNpemVvZiAoKmNkYXRhKSAqIG1hcG51bSk7CisgICAgICBtZW1zZXQgKGNkYXRh LCAnXDAnLCBzaXplb2YgKCpjZGF0YSkgKiBtYXBudW0pOworICAgICAgZ29tcF9tdXRleF9s b2NrICgmZGV2aWNlcC0+bG9jayk7CisgICAgICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwg bWFwbnVtOyBpKyspCisJeworCSAgaWYgKGRldmFkZHJzW2ldID09IDApCisJICAgIGNvbnRp bnVlOworCSAgbiA9IE5VTEw7CisJICBpbnQga2luZCA9IGdldF9raW5kIChzaG9ydF9tYXBr aW5kLCBraW5kcywgaSkgJiB0eXBlbWFzazsKKwkgIHN3aXRjaCAoa2luZCkKKwkgICAgewor CSAgICAgIGNhc2UgR09NUF9NQVBfRklSU1RQUklWQVRFOgorCSAgICAgIGNhc2UgR09NUF9N QVBfRklSU1RQUklWQVRFX0lOVDoKKwkJY29udGludWU7CisKKwkgICAgICBjYXNlIEdPTVBf TUFQX0RFTEVURToKKwkgICAgICBjYXNlIEdPTVBfTUFQX1JFTEVBU0U6CisJICAgICAgY2Fz ZSBHT01QX01BUF9ERUxFVEVfWkVST19MRU5fQVJSQVlfU0VDVElPTjoKKwkJLyogQXNzdW1l IGl0IGlzIHByZXNlbnQ7IGxvb2sgaXQgdXAgLSBidXQgaWdub3JlIG90aGVyd2lzZS4gKi8K KwkgICAgICBjYXNlIEdPTVBfTUFQX0FMTE9DOgorCSAgICAgIGNhc2UgR09NUF9NQVBfRlJP TToKKwkgICAgICBjYXNlIEdPTVBfTUFQX0ZPUkNFX0FMTE9DOgorCSAgICAgIGNhc2UgR09N UF9NQVBfRk9SQ0VfRlJPTToKKwkgICAgICBjYXNlIEdPTVBfTUFQX0FMV0FZU19GUk9NOgor CSAgICAgIGNhc2UgR09NUF9NQVBfVE86CisJICAgICAgY2FzZSBHT01QX01BUF9UT0ZST006 CisJICAgICAgY2FzZSBHT01QX01BUF9GT1JDRV9UTzoKKwkgICAgICBjYXNlIEdPTVBfTUFQ X0ZPUkNFX1RPRlJPTToKKwkgICAgICBjYXNlIEdPTVBfTUFQX0FMV0FZU19UTzoKKwkgICAg ICBjYXNlIEdPTVBfTUFQX0FMV0FZU19UT0ZST006CisJICAgICAgY2FzZSBHT01QX01BUF9a RVJPX0xFTl9BUlJBWV9TRUNUSU9OOgorCQljZGF0YVtpXS5kZXZhZGRyID0gZGV2YWRkcnNb aV07CisJCWJvb2wgemVyb19sZW4gPSAoa2luZCA9PSBHT01QX01BUF9ERUxFVEVfWkVST19M RU5fQVJSQVlfU0VDVElPTgorCQkJCSB8fCBraW5kID09IEdPTVBfTUFQX1pFUk9fTEVOX0FS UkFZX1NFQ1RJT04pOworCQlqID0gZ29tcF9tYXBfY2RhdGFfbG9va3VwIChjZGF0YSwgZGV2 YWRkcnMsIGtpbmRzLCBzaXplcywgaSwKKwkJCQkJICAgZGV2YWRkcnNbaV0sCisJCQkJCSAg IGRldmFkZHJzW2ldICsgc2l6ZXNbaV0sIHplcm9fbGVuKTsKKwkJaWYgKGogPCBpKQorCQkg IHsKKwkJICAgIG4yID0gTlVMTDsKKwkJICAgIGNkYXRhW2ldLnByZXNlbnQgPSB0cnVlOwor CQkgICAgZGV2YWRkcnNbaV0gPSBkZXZhZGRyc1tqXSArIGRldmFkZHJzW2ldIC0gY2RhdGFb al0uZGV2YWRkcjsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBuMiA9IGdvbXBfbWFw X3Jldl9sb29rdXAgKCZkZXZpY2VwLT5tZW1fbWFwLAorCQkJCQkgICAgICBkZXZhZGRyc1tp XSwKKwkJCQkJICAgICAgZGV2YWRkcnNbaV0gKyBzaXplc1tpXSwgemVyb19sZW4pOworCQkg ICAgY2RhdGFbaV0ucHJlc2VudCA9IG4yICE9IE5VTEw7CisJCSAgfQorCQlpZiAoIWNkYXRh W2ldLnByZXNlbnQKKwkJICAgICYmIGtpbmQgIT0gR09NUF9NQVBfREVMRVRFCisJCSAgICAm JiBraW5kICE9IEdPTVBfTUFQX1JFTEVBU0UKKwkJICAgICYmIGtpbmQgIT0gR09NUF9NQVBf REVMRVRFX1pFUk9fTEVOX0FSUkFZX1NFQ1RJT04pCisJCSAgeworCQkgICAgY2RhdGFbaV0u YWxpZ25lZCA9IHRydWU7CisJCSAgICBzaXplX3QgYWxpZ24gPSAoc2l6ZV90KSAxIDw8IChr aW5kc1tpXSA+PiA4KTsKKwkJICAgIGRldmFkZHJzW2ldCisJCSAgICAgID0gKHVpbnQ2NF90 KSAodWludHB0cl90KSBnb21wX2FsaWduZWRfYWxsb2MgKGFsaWduLAorCQkJCQkJCQkgICBz aXplc1tpXSk7CisJCSAgfQorCQllbHNlIGlmIChuMiAhPSBOVUxMKQorCQkgIGRldmFkZHJz W2ldID0gKG4yLT5ob3N0X3N0YXJ0ICsgY2RhdGFbaV0uZGV2YWRkcgorCQkJCSAtIChuMi0+ dGd0LT50Z3Rfc3RhcnQgKyBuMi0+dGd0X29mZnNldCkpOworCQlpZiAoKCghY2RhdGFbaV0u cHJlc2VudCB8fCBzdHJ1Y3RfY3B5KQorCQkgICAgICYmIChraW5kID09IEdPTVBfTUFQX1RP IHx8IGtpbmQgPT0gR09NUF9NQVBfVE9GUk9NKSkKKwkJICAgIHx8IGtpbmQgPT0gR09NUF9N QVBfRk9SQ0VfVE8KKwkJICAgIHx8IGtpbmQgPT0gR09NUF9NQVBfRk9SQ0VfVE9GUk9NCisJ CSAgICB8fCBraW5kID09IEdPTVBfTUFQX0FMV0FZU19UTworCQkgICAgfHwga2luZCA9PSBH T01QX01BUF9BTFdBWVNfVE9GUk9NKQorCQkgIHsKKwkJICAgIGlmIChkZXZfdG9faG9zdF9j cHkpCisJCSAgICAgIGRldl90b19ob3N0X2NweSAoKHZvaWQgKikgKHVpbnRwdHJfdCkgZGV2 YWRkcnNbaV0sCisJCQkJICAgICAgICh2b2lkICopICh1aW50cHRyX3QpIGNkYXRhW2ldLmRl dmFkZHIsCisJCQkJICAgICAgIHNpemVzW2ldLCB0b2tlbik7CisJCSAgICBlbHNlCisJCSAg ICAgIGdvbXBfY29weV9kZXYyaG9zdCAoZGV2aWNlcCwgTlVMTCwKKwkJCQkJICAodm9pZCAq KSAodWludHB0cl90KSBkZXZhZGRyc1tpXSwKKwkJCQkJICAodm9pZCAqKSAodWludHB0cl90 KSBjZGF0YVtpXS5kZXZhZGRyLAorCQkJCQkgIHNpemVzW2ldKTsKKwkJICB9CisJCWlmIChz dHJ1Y3RfY3B5KQorCQkgIHN0cnVjdF9jcHktLTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBH T01QX01BUF9BVFRBQ0g6CisJICAgICAgY2FzZSBHT01QX01BUF9QT0lOVEVSOgorCSAgICAg IGNhc2UgR09NUF9NQVBfQUxXQVlTX1BPSU5URVI6CisJCW4yID0gZ29tcF9tYXBfcmV2X2xv b2t1cCAoJmRldmljZXAtPm1lbV9tYXAsCisJCQkJCSAgZGV2YWRkcnNbaV0gKyBzaXplc1tp XSwKKwkJCQkJICBkZXZhZGRyc1tpXSArIHNpemVzW2ldCisJCQkJCSAgKyBzaXplb2YgKHZv aWQqKSwgZmFsc2UpOworCQljZGF0YVtpXS5wcmVzZW50ID0gbjIgIT0gTlVMTDsKKwkJY2Rh dGFbaV0uZGV2YWRkciA9IGRldmFkZHJzW2ldOworCQlpZiAobjIpCisJCSAgZGV2YWRkcnNb aV0gPSAobjItPmhvc3Rfc3RhcnQgKyBjZGF0YVtpXS5kZXZhZGRyCisJCQkJIC0gKG4yLT50 Z3QtPnRndF9zdGFydCArIG4yLT50Z3Rfb2Zmc2V0KSk7CisJCWVsc2UKKwkJICB7CisJCSAg ICBqID0gZ29tcF9tYXBfY2RhdGFfbG9va3VwIChjZGF0YSwgZGV2YWRkcnMsIGtpbmRzLCBz aXplcywgaSwKKwkJCQkJICAgICAgIGRldmFkZHJzW2ldICsgc2l6ZXNbaV0sCisJCQkJCSAg ICAgICBkZXZhZGRyc1tpXSArIHNpemVzW2ldCisJCQkJCSAgICAgICArIHNpemVvZiAodm9p ZCopLCBmYWxzZSk7CisJCSAgICBpZiAoaiA8IGkpCisJCSAgICAgIHsKKwkJCWNkYXRhW2ld LnByZXNlbnQgPSB0cnVlOworCQkJZGV2YWRkcnNbaV0gPSAoZGV2YWRkcnNbal0gKyBkZXZh ZGRyc1tpXQorCQkJCSAgICAgICAtIGNkYXRhW2pdLmRldmFkZHIpOworCQkgICAgICB9CisJ CSAgfQorCQlpZiAoIWNkYXRhW2ldLnByZXNlbnQpCisJCSAgZGV2YWRkcnNbaV0gPSAodWlu dHB0cl90KSBnb21wX21hbGxvYyAoc2l6ZW9mICh2b2lkKikpOworCQkvKiBBc3N1bWUgdGhh dCB3aGVuIHByZXNlbnQsIHRoZSBwb2ludGVyIGlzIGFscmVhZHkgY29ycmVjdC4gICovCisJ CWlmICghbjIpCisJCSAgKih1aW50NjRfdCAqKSAodWludHB0cl90KSAoZGV2YWRkcnNbaV0g KyBzaXplc1tpXSkKKwkJICAgID0gZGV2YWRkcnNbaS0xXTsKKwkJYnJlYWs7CisJICAgICAg Y2FzZSBHT01QX01BUF9UT19QU0VUOgorCQkvKiBBc3N1bWUgdGhhdCB3aGVuIHByZXNlbnQs IHRoZSBwb2ludGVycyBhcmUgZmluZSBhbmQgbm8gJ3RvOicKKwkJICAgaXMgcmVxdWlyZWQu ICAqLworCQluMiA9IGdvbXBfbWFwX3Jldl9sb29rdXAgKCZkZXZpY2VwLT5tZW1fbWFwLAor CQkJCQkgIGRldmFkZHJzW2ldLCBkZXZhZGRyc1tpXSArIHNpemVzW2ldLAorCQkJCQkgIGZh bHNlKTsKKwkJY2RhdGFbaV0ucHJlc2VudCA9IG4yICE9IE5VTEw7CisJCWNkYXRhW2ldLmRl dmFkZHIgPSBkZXZhZGRyc1tpXTsKKwkJaWYgKG4yKQorCQkgIGRldmFkZHJzW2ldID0gKG4y LT5ob3N0X3N0YXJ0ICsgY2RhdGFbaV0uZGV2YWRkcgorCQkJCSAtIChuMi0+dGd0LT50Z3Rf c3RhcnQgKyBuMi0+dGd0X29mZnNldCkpOworCQllbHNlCisJCSAgeworCQkgICAgaiA9IGdv bXBfbWFwX2NkYXRhX2xvb2t1cCAoY2RhdGEsIGRldmFkZHJzLCBraW5kcywgc2l6ZXMsIGks CisJCQkJCSAgICAgICBkZXZhZGRyc1tpXSwKKwkJCQkJICAgICAgIGRldmFkZHJzW2ldICsg c2l6ZXNbaV0sIGZhbHNlKTsKKwkJICAgIGlmIChqIDwgaSkKKwkJICAgICAgeworCQkJY2Rh dGFbaV0ucHJlc2VudCA9IHRydWU7CisJCQlkZXZhZGRyc1tpXSA9IChkZXZhZGRyc1tqXSAr IGRldmFkZHJzW2ldCisJCQkJICAgICAgIC0gY2RhdGFbal0uZGV2YWRkcik7CisJCSAgICAg IH0KKwkJICB9CisJCWlmICghY2RhdGFbaV0ucHJlc2VudCkKKwkJICB7CisJCSAgICBjZGF0 YVtpXS5hbGlnbmVkID0gdHJ1ZTsKKwkJICAgIHNpemVfdCBhbGlnbiA9IChzaXplX3QpIDEg PDwgKGtpbmRzW2ldID4+IDgpOworCQkgICAgZGV2YWRkcnNbaV0KKwkJICAgICAgPSAodWlu dDY0X3QpICh1aW50cHRyX3QpIGdvbXBfYWxpZ25lZF9hbGxvYyAoYWxpZ24sCisJCQkJCQkJ CSAgIHNpemVzW2ldKTsKKwkJICAgIGlmIChkZXZfdG9faG9zdF9jcHkpCisJCSAgICAgIGRl dl90b19ob3N0X2NweSAoKHZvaWQgKikgKHVpbnRwdHJfdCkgZGV2YWRkcnNbaV0sCisJCQkJ ICAgICAgICh2b2lkICopICh1aW50cHRyX3QpIGNkYXRhW2ldLmRldmFkZHIsCisJCQkJICAg ICAgIHNpemVzW2ldLCB0b2tlbik7CisJCSAgICBlbHNlCisJCSAgICAgIGdvbXBfY29weV9k ZXYyaG9zdCAoZGV2aWNlcCwgTlVMTCwKKwkJCQkJICAodm9pZCAqKSAodWludHB0cl90KSBk ZXZhZGRyc1tpXSwKKwkJCQkJICAodm9pZCAqKSAodWludHB0cl90KSBjZGF0YVtpXS5kZXZh ZGRyLAorCQkJCQkgIHNpemVzW2ldKTsKKwkJICB9CisJCWZvciAoaiA9IGkgKyAxOyBqIDwg bWFwbnVtOyBqKyspCisJCSAgeworCQkgICAga2luZCA9IGdldF9raW5kIChzaG9ydF9tYXBr aW5kLCBraW5kcywgaikgJiB0eXBlbWFzazsKKwkJICAgIGlmICghR09NUF9NQVBfQUxXQVlT X1BPSU5URVJfUCAoa2luZCkKKwkJCSYmICFHT01QX01BUF9QT0lOVEVSX1AgKGtpbmQpKQor CQkgICAgICBicmVhazsKKwkJICAgIGlmIChkZXZhZGRyc1tqXSA8IGRldmFkZHJzW2ldKQor CQkgICAgICBicmVhazsKKwkJICAgIGlmIChjZGF0YVtpXS5wcmVzZW50KQorCQkgICAgICBj b250aW51ZTsKKwkJICAgIGlmIChkZXZhZGRyc1tqXSA9PSAwKQorCQkgICAgICB7CisJCQkq KHVpbnQ2NF90ICopICh1aW50cHRyX3QpIChkZXZhZGRyc1tpXSArIHNpemVzW2pdKSA9IDA7 CisJCQljb250aW51ZTsKKwkJICAgICAgfQorCQkgICAgaW50IGs7CisJCSAgICBuMiA9IE5V TEw7CisJCSAgICBjZGF0YVtpXS5wcmVzZW50ID0gdHJ1ZTsKKwkJICAgIGNkYXRhW2pdLmRl dmFkZHIgPSBkZXZhZGRyc1tqXTsKKwkJICAgIGsgPSBnb21wX21hcF9jZGF0YV9sb29rdXAg KGNkYXRhLCBkZXZhZGRycywga2luZHMsIHNpemVzLCBqLAorCQkJCQkgICAgICAgZGV2YWRk cnNbal0sCisJCQkJCSAgICAgICBkZXZhZGRyc1tqXSArIHNpemVvZiAodm9pZCopLAorCQkJ CQkgICAgICAgZmFsc2UpOworCQkgICAgaWYgKGsgPCBqKQorCQkgICAgICBkZXZhZGRyc1tq XSA9IChkZXZhZGRyc1trXSArIGRldmFkZHJzW2pdCisJCQkJICAgICAtIGNkYXRhW2tdLmRl dmFkZHIpOworCQkgICAgZWxzZQorCQkgICAgICB7CisJCQluMiA9IGdvbXBfbWFwX3Jldl9s b29rdXAgKCZkZXZpY2VwLT5tZW1fbWFwLAorCQkJCQkJICBkZXZhZGRyc1tqXSwKKwkJCQkJ CSAgZGV2YWRkcnNbal0gKyBzaXplb2YgKHZvaWQqKSwKKwkJCQkJCSAgZmFsc2UpOworCQkJ aWYgKG4yID09IE5VTEwpCisJCQkgIHsKKwkJCSAgICBnb21wX211dGV4X3VubG9jayAoJmRl dmljZXAtPmxvY2spOworCQkJICAgIGdvbXBfZmF0YWwgKCJQb2ludGVyIHRhcmdldCB3YXNu J3QgbWFwcGVkIik7CisJCQkgIH0KKwkJCWRldmFkZHJzW2pdID0gKG4yLT5ob3N0X3N0YXJ0 ICsgY2RhdGFbal0uZGV2YWRkcgorCQkJCSAgICAgICAtIChuMi0+dGd0LT50Z3Rfc3RhcnQg KyBuMi0+dGd0X29mZnNldCkpOworCQkgICAgICB9CisJCSAgICAqKHZvaWQgKiopICh1aW50 cHRyX3QpIChkZXZhZGRyc1tpXSArIHNpemVzW2pdKQorCQkgICAgICA9ICh2b2lkICopICh1 aW50cHRyX3QpIGRldmFkZHJzW2pdOworCQkgIH0KKwkJaSA9IGogLTE7CisJCWJyZWFrOwor CSAgICAgIGNhc2UgR09NUF9NQVBfU1RSVUNUOgorCQluMiA9IGdvbXBfbWFwX3Jldl9sb29r dXAgKCZkZXZpY2VwLT5tZW1fbWFwLCBkZXZhZGRyc1tpKzFdLAorCQkJCQkgIGRldmFkZHJz W2kgKyBzaXplc1tpXV0KKwkJCQkJICArIHNpemVzW2kgKyBzaXplc1tpXV0sIGZhbHNlKTsK KwkJY2RhdGFbaV0ucHJlc2VudCA9IG4yICE9IE5VTEw7CisJCWNkYXRhW2ldLmRldmFkZHIg PSBkZXZhZGRyc1tpXTsKKwkJc3RydWN0X2NweSA9IGNkYXRhW2ldLnByZXNlbnQgPyAwIDog c2l6ZXNbaV07CisJCWlmICghbjIpCisJCSAgeworCQkgICAgc2l6ZV90IHN6ID0gKHNpemVf dCkgKGRldmFkZHJzW2kgKyBzaXplc1tpXV0KKwkJCQkJICAtIGRldmFkZHJzW2krMV0KKwkJ CQkJICArIHNpemVzW2kgKyBzaXplc1tpXV0pOworCQkgICAgc2l6ZV90IGFsaWduID0gKHNp emVfdCkgMSA8PCAoa2luZHNbaV0gPj4gOCk7CisJCSAgICBjZGF0YVtpXS5hbGlnbmVkID0g dHJ1ZTsKKwkJICAgIGRldmFkZHJzW2ldID0gKHVpbnRwdHJfdCkgZ29tcF9hbGlnbmVkX2Fs bG9jIChhbGlnbiwgc3opOworCQkgICAgZGV2YWRkcnNbaV0gLT0gZGV2YWRkcnNbaSsxXSAt IGNkYXRhW2ldLmRldmFkZHI7CisJCSAgfQorCQllbHNlCisJCSAgZGV2YWRkcnNbaV0gPSAo bjItPmhvc3Rfc3RhcnQgKyBjZGF0YVtpXS5kZXZhZGRyCisJCQkJIC0gKG4yLT50Z3QtPnRn dF9zdGFydCArIG4yLT50Z3Rfb2Zmc2V0KSk7CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6 CisJCWdvbXBfbXV0ZXhfdW5sb2NrICgmZGV2aWNlcC0+bG9jayk7CisJCWdvbXBfZmF0YWwg KCJnb21wX3RhcmdldF9yZXYgdW5oYW5kbGVkIGtpbmQgMHglLjR4Iiwga2luZHNbaV0pOwor CSAgICB9CisJfQorICAgICAgZ29tcF9tdXRleF91bmxvY2sgKCZkZXZpY2VwLT5sb2NrKTsK KyAgICB9CisKKyAgaG9zdF9mbiAoZGV2YWRkcnMpOworCisgIGlmICghKGRldmljZXAtPmNh cGFiaWxpdGllcyAmIEdPTVBfT0ZGTE9BRF9DQVBfU0hBUkVEX01FTSkpCisgICAgeworICAg ICAgdWludDY0X3Qgc3RydWN0X2NweSA9IDA7CisgICAgICBib29sIGNsZWFuX3N0cnVjdCA9 IGZhbHNlOworICAgICAgZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IG1hcG51bTsgaSsrKQor CXsKKwkgIGlmIChjZGF0YVtpXS5kZXZhZGRyID09IDApCisJICAgIGNvbnRpbnVlOworCSAg aW50IGtpbmQgPSBnZXRfa2luZCAoc2hvcnRfbWFwa2luZCwga2luZHMsIGkpICYgdHlwZW1h c2s7CisJICBib29sIGNvcHkgPSAhY2RhdGFbaV0ucHJlc2VudCB8fCBzdHJ1Y3RfY3B5Owor CSAgc3dpdGNoIChraW5kKQorCSAgICB7CisJICAgICAgY2FzZSBHT01QX01BUF9GT1JDRV9G Uk9NOgorCSAgICAgIGNhc2UgR09NUF9NQVBfRk9SQ0VfVE9GUk9NOgorCSAgICAgIGNhc2Ug R09NUF9NQVBfQUxXQVlTX0ZST006CisJICAgICAgY2FzZSBHT01QX01BUF9BTFdBWVNfVE9G Uk9NOgorCQljb3B5ID0gdHJ1ZTsKKwkJLyogRkFMTFRIUlUgKi8KKwkgICAgICBjYXNlIEdP TVBfTUFQX0ZST006CisJICAgICAgY2FzZSBHT01QX01BUF9UT0ZST006CisJCWlmIChjb3B5 ICYmIGhvc3RfdG9fZGV2X2NweSkKKwkJICBob3N0X3RvX2Rldl9jcHkgKCh2b2lkICopICh1 aW50cHRyX3QpIGNkYXRhW2ldLmRldmFkZHIsCisJCQkJICAgKHZvaWQgKikgKHVpbnRwdHJf dCkgZGV2YWRkcnNbaV0sCisJCQkJICAgc2l6ZXNbaV0sIHRva2VuKTsKKwkJZWxzZSBpZiAo Y29weSkKKwkJICBnb21wX2NvcHlfaG9zdDJkZXYgKGRldmljZXAsIE5VTEwsCisJCQkJICAg ICAgKHZvaWQgKikgKHVpbnRwdHJfdCkgY2RhdGFbaV0uZGV2YWRkciwKKwkJCQkgICAgICAo dm9pZCAqKSAodWludHB0cl90KSBkZXZhZGRyc1tpXSwKKwkJCQkgICAgICBzaXplc1tpXSwg ZmFsc2UsIE5VTEwpOworCSAgICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICB9CisJICBp ZiAoc3RydWN0X2NweSkKKwkgICAgeworCSAgICAgIHN0cnVjdF9jcHktLTsKKwkgICAgICBj b250aW51ZTsKKwkgICAgfQorCSAgaWYgKGtpbmQgPT0gR09NUF9NQVBfU1RSVUNUICYmICFj ZGF0YVtpXS5wcmVzZW50KQorCSAgICB7CisJICAgICAgY2xlYW5fc3RydWN0ID0gdHJ1ZTsK KwkgICAgICBzdHJ1Y3RfY3B5ID0gc2l6ZXNbaV07CisJICAgIH0KKwkgIGVsc2UgaWYgKGNk YXRhW2ldLmFsaWduZWQpCisJICAgIGdvbXBfYWxpZ25lZF9mcmVlICgodm9pZCAqKSAodWlu dHB0cl90KSBkZXZhZGRyc1tpXSk7CisJICBlbHNlIGlmICghY2RhdGFbaV0ucHJlc2VudCkK KwkgICAgZnJlZSAoKHZvaWQgKikgKHVpbnRwdHJfdCkgZGV2YWRkcnNbaV0pOworCX0KKyAg ICAgIGlmIChjbGVhbl9zdHJ1Y3QpCisJZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IG1hcG51 bTsgaSsrKQorCSAgaWYgKCFjZGF0YVtpXS5wcmVzZW50CisJICAgICAgJiYgKChnZXRfa2lu ZCAoc2hvcnRfbWFwa2luZCwga2luZHMsIGkpICYgdHlwZW1hc2spCisJCSAgPT0gR09NUF9N QVBfU1RSVUNUKSkKKwkgICAgeworCSAgICAgIGRldmFkZHJzW2ldICs9IGNkYXRhW2krMV0u ZGV2YWRkciAtIGNkYXRhW2ldLmRldmFkZHI7CisJICAgICAgZ29tcF9hbGlnbmVkX2ZyZWUg KCh2b2lkICopICh1aW50cHRyX3QpIGRldmFkZHJzW2ldKTsKKwkgICAgfQorCisgICAgICBm cmVlIChkZXZhZGRycyk7CisgICAgICBmcmVlIChzaXplcyk7CisgICAgICBmcmVlIChraW5k cyk7CisgICAgfQogfQogCiAvKiBIb3N0IGZhbGxiYWNrIGZvciBHT01QX3RhcmdldF9kYXRh eyxfZXh0fSByb3V0aW5lcy4gICovCkBAIC00MzMwLDYgKzQ4OTgsNyBAQCBnb21wX3Rhcmdl dF9pbml0ICh2b2lkKQogCQkvKiBjdXJyZW50X2RldmljZS5jYXBhYmlsaXRpZXMgaGFzIGFs cmVhZHkgYmVlbiBzZXQuICAqLwogCQljdXJyZW50X2RldmljZS50eXBlID0gY3VycmVudF9k ZXZpY2UuZ2V0X3R5cGVfZnVuYyAoKTsKIAkJY3VycmVudF9kZXZpY2UubWVtX21hcC5yb290 ID0gTlVMTDsKKwkJY3VycmVudF9kZXZpY2UubWVtX21hcF9yZXYucm9vdCA9IE5VTEw7CiAJ CWN1cnJlbnRfZGV2aWNlLnN0YXRlID0gR09NUF9ERVZJQ0VfVU5JTklUSUFMSVpFRDsKIAkJ Zm9yIChpID0gMDsgaSA8IG5ld19udW1fZGV2czsgaSsrKQogCQkgIHsKZGlmZiAtLWdpdCBh L2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuZm9ydHJhbi9yZXZlcnNlLW9mZmxvYWQtMi5m OTAgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4vcmV2ZXJzZS1vZmZsb2Fk LTIuZjkwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4wNjc2Mzli YzY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuZm9y dHJhbi9yZXZlcnNlLW9mZmxvYWQtMi5mOTAKQEAgLTAsMCArMSw3MiBAQAorISB7IGRnLWFk ZGl0aW9uYWwtb3B0aW9ucyAiLWZvZmZsb2FkLW9wdGlvbnM9bnZwdHgtbm9uZT0tbWlzYT1z bV8zNSIgeyB0YXJnZXQgeyBvZmZsb2FkX3RhcmdldF9udnB0eCB9IH0gfQorCitpbXBsaWNp dCBub25lCishJG9tcCByZXF1aXJlcyByZXZlcnNlX29mZmxvYWQKK2ludGVnZXIgOjogQSg1 MCksIEEyKDUwKQoraW50ZWdlciA6OiBpLCBlcnJvcgorbG9naWNhbCA6OiBzaGFyZWRfbWVt CisKK2Vycm9yID0gMAorc2hhcmVkX21lbSA9IC5mYWxzZS4KK0EgID0gWyhpLCBpPTEsNTAp XQorQTIgPSBbKGksIGk9MSw1MCldCisKKyEkb21wIHRhcmdldCBtYXAodG86IHNoYXJlZF9t ZW0pCisgIHNoYXJlZF9tZW0gPSAudHJ1ZS4KKyEkb21wIGVuZCB0YXJnZXQKKworISRvbXAg dGFyZ2V0IG1hcCh0bzogQSgyMDo0MCksIEEyKDIwOjQwKSkgbWFwKGZyb206IGVycm9yKQor YmxvY2sKKyAgaW50ZWdlciA6OiBCKDEwKSwgQygxMCkKKyAgQiA9IDk5CisgIEMgPSA4OAor ICBBKDIwOjQwKSAgPSAtQSgyMDo0MCkKKyAgQTIoMjA6NDApID0gLUEyKDIwOjQwKQorCisg ICEkb21wIHRhcmdldCBkZXZpY2UgKGFuY2VzdG9yOjEpICAmCisgICEkb21wJiAgICAgICBt YXAodG86IEEoMjU6MzUpKSBtYXAoYWx3YXlzLCB0bzogQTIoMjU6MzUpKSAgJgorICAhJG9t cCYgICAgICAgbWFwKGZyb206Qig0OjgpKSBtYXAodG9mcm9tOkMoNDo4KSkKKyAgICAgaWYg KHNoYXJlZF9tZW0pIHRoZW4KKyAgICAgICBpZiAoYW55IChBKDI1OjM1KSAgLz0gWygtaSxp PTI1LDM1KV0pKSBzdG9wIDIwCisgICAgIGVsc2UKKyAgICAgICBpZiAoYW55IChBKDI1OjM1 KSAgLz0gWyggaSxpPTI1LDM1KV0pKSBzdG9wIDIxCisgICAgIGVuZCBpZgorICAgIGlmIChh bnkgKEEyKDI1OjM1KSAvPSBbKC1pLGk9MjUsMzUpXSkpIHN0b3AgMjIKKyAgICBpZiAoYW55 IChDKDQ6OCkgLz0gODgpKSBzdG9wIDIzCisKKyAgICBBKDI1OjM1KSA9IC1BKDI1OjM1KSox MAorICAgIEEyKDI1OjM1KSA9IC1BMigyNTozNSkqMTAKKyAgICBCKDQ6OCkgPSBbNCw1LDYs Nyw4XQorICAgIEMoNDo4KSA9IFstNCwtNSwtNiwtNywtOF0KKyAgISRvbXAgZW5kIHRhcmdl dAorCisgIGlmIChhbnkgKEIoMTozKSAvPSA5OSkgLm9yLiBhbnkgKEIoOToxMCkgLz0gOTkp KSB0aGVuCisgICAgZXJyb3IgPSAzMAorICBlbHNlaWYgKGFueSAoQig0OjgpIC89IFs0LDUs Niw3LDhdKSkgdGhlbgorICAgIGVycm9yID0gMzEKKyAgZWxzZWlmIChhbnkgKEMoMTozKSAv PSA4OCkgLm9yLiBhbnkgKEMoOToxMCkgLz0gODgpKSB0aGVuCisgICAgZXJyb3IgPSAzMgor ICBlbHNlaWYgKGFueSAoQyg0OjgpIC89IFstNCwtNSwtNiwtNywtOF0pKSB0aGVuCisgICAg ZXJyb3IgPSAzMworICBlbHNlCisgICAgZXJyb3IgPSAwCisgIGVuZGlmCitlbmQgYmxvY2sK KworaWYgKGVycm9yIC89IDApIHN0b3AgZXJyb3IKKworaWYgKHNoYXJlZF9tZW0pIHRoZW4K KyAgaWYgKGFueSAoQSgxOjE5KSAgLz0gWyggaSwgaT0xLDE5KV0pKSBzdG9wIDEKKyAgaWYg KGFueSAoQSgyMDoyNCkgLz0gWygtaSwgaT0yMCwyNCldKSkgc3RvcCAyCisgIGlmIChhbnkg KEEoMzY6NDApIC89IFsoLWksIGk9MzYsNDApXSkpIHN0b3AgMworICBpZiAoYW55IChBKDQx OjUwKSAvPSBbKCBpLCBpPTQxLDUwKV0pKSBzdG9wIDQKKworICBpZiAoYW55IChBKDI1OjM1 KSAvPSBbKCAxMCppLCBpPTI1LDM1KV0pKSBzdG9wIDUKK2Vsc2UKKyAgaWYgKGFueSAoQSgx OjI0KSAgLz0gWyggaSwgaT0xLDI0KV0pKSBzdG9wIDYKKyAgaWYgKGFueSAoQSgzNjo1MCkg Lz0gWyggaSwgaT0zNiw1MCldKSkgc3RvcCA3CisKKyAgaWYgKGFueSAoQSgyNTozNSkgLz0g WygtMTAqaSwgaT0yNSwzNSldKSkgc3RvcCA4CitlbmQgaWYKK2lmIChhbnkgKEEyKDI1OjM1 KSAvPSBbKCAxMCppLCBpPTI1LDM1KV0pKSBzdG9wIDkKK2VuZApkaWZmIC0tZ2l0IGEvbGli Z29tcC90ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3JldmVyc2Utb2ZmbG9hZC0zLmY5MCBi L2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuZm9ydHJhbi9yZXZlcnNlLW9mZmxvYWQtMy5m OTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjJmZDJmNWI2NTg5 Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFu L3JldmVyc2Utb2ZmbG9hZC0zLmY5MApAQCAtMCwwICsxLDY4IEBACishIHsgZGctYWRkaXRp b25hbC1vcHRpb25zICItZm9mZmxvYWQtb3B0aW9ucz1udnB0eC1ub25lPS1taXNhPXNtXzM1 IiB7IHRhcmdldCB7IG9mZmxvYWRfdGFyZ2V0X252cHR4IH0gfSB9CisKK2ltcGxpY2l0IG5v bmUKKyEkb21wIHJlcXVpcmVzIHJldmVyc2Vfb2ZmbG9hZAoraW50ZWdlciA6OiBBKDUwKSwg QTIoNTApLCBBMyg1MCkKK2ludGVnZXIgOjogaQorbG9naWNhbCA6OiBzaGFyZWRfbWVtCisK K3NoYXJlZF9tZW0gPSAuZmFsc2UuCitBICA9IFsoMyppLCBpPTEsNTApXQorQTIgPSBbKDcq aSwgaT0xLDUwKV0KK0EzID0gWygxMSppLCBpPTEsNTApXQorCishJG9tcCB0YXJnZXQgbWFw KHRvOiBzaGFyZWRfbWVtKQorICBzaGFyZWRfbWVtID0gLnRydWUuCishJG9tcCBlbmQgdGFy Z2V0CisKKyEkb21wIHRhcmdldCBtYXAodG86IEEoMjA6NDApLCBBMigyMDo0MCksIEEzKDIw OjQwKSkKK2Jsb2NrCisgIGludGVnZXIgOjogQygxMCkKKyAgQyA9IDg4CisgIEEoMjA6NDAp ICA9IC0yKkEoMjA6NDApCisgIEEyKDIwOjQwKSA9IC05KkEyKDIwOjQwKQorICBBMygyMDo0 MCkgPSAtMTMqQTMoMjA6NDApCisKKyAgISRvbXAgdGFyZ2V0IGRldmljZSAoYW5jZXN0b3I6 MSkgICYKKyAgISRvbXAmICAgICAgIG1hcChmcm9tOiBBKDI1OjM1KSkgbWFwKGFsd2F5cywg ZnJvbTogQTIoMjU6MzUpKSAgJgorICAhJG9tcCYgICAgICAgbWFwKGFsbG9jOiBBMygyNToz NSkpIG1hcChhbGxvYzpDKDQ6OCkpCisgICAgaWYgKHNoYXJlZF9tZW0pIHRoZW4KKyAgICAg IGlmIChhbnkgKEEoMjU6MzUpICAvPSBbKC0yKjMqaSwgaT0yNSwzNSldKSkgc3RvcCAxCisg ICAgICBpZiAoYW55IChBMigyNTozNSkgLz0gWygtOSo3KmksIGk9MjUsMzUpXSkpIHN0b3Ag MgorICAgICAgaWYgKGFueSAoQTMoMjU6MzUpIC89IFsoLTEzKjExKmksIGk9MjUsMzUpXSkp IHN0b3AgMworICAgIGVsc2UKKyAgICAgIGlmIChhbnkgKEEoMjU6MzUpICAvPSBbKDMqaSwg aT0yNSwzNSldKSkgc3RvcCA0CisgICAgICBpZiAoYW55IChBMigyNTozNSkgLz0gWyg3Kmks IGk9MjUsMzUpXSkpIHN0b3AgNQorICAgICAgaWYgKGFueSAoQTMoMjU6MzUpIC89IFsoMTEq aSwgaT0yNSwzNSldKSkgc3RvcCA2CisgICAgZW5kIGlmCisKKyAgICBBKDI1OjM1KSA9IEEo MjU6MzUpKjUKKyAgICBBMigyNTozNSkgPSBBMigyNTozNSkqOAorICAgIEEzKDI1OjM1KSA9 IEEzKDI1OjM1KSoxOAorICAgIEMoNDo4KSA9IFs0LDUsNiw3LDhdCisgICEkb21wIGVuZCB0 YXJnZXQKKworICBpZiAoc2hhcmVkX21lbSkgdGhlbgorICAgIGlmIChhbnkgKEEoMjU6MzUp ICAvPSBbKC0yKjMqNSppLCBpPTI1LDM1KV0pKSBzdG9wIDcKKyAgICBpZiAoYW55IChBMigy NTozNSkgLz0gWygtOSo3KjgqaSwgaT0yNSwzNSldKSkgc3RvcCA4CisgICAgaWYgKGFueSAo QTMoMjU6MzUpIC89IFsoLTEzKjExKjE4KmksIGk9MjUsMzUpXSkpIHN0b3AgOQorICAgIGlm IChhbnkgKEMoNDo4KSAvPSBbNCw1LDYsNyw4XSkpIHN0b3AgMTAKKyAgZWxzZQorICAgIGlm IChhbnkgKEEoMjU6MzUpICAvPSBbKC0yKjMqaSwgaT0yNSwzNSldKSkgc3RvcCAxMQorICAg IGlmIChhbnkgKEEyKDI1OjM1KSAvPSBbKDcqOCppLCBpPTI1LDM1KV0pKSBzdG9wIDEyCisg ICAgaWYgKGFueSAoQTMoMjU6MzUpIC89IFsoLTEzKjExKmksIGk9MjUsMzUpXSkpIHN0b3Ag MTMKKyAgICBpZiAoYW55IChDKDQ6OCkgLz0gODgpKSBzdG9wIDE0CisgIGVuZCBpZgorZW5k IGJsb2NrCisKK2lmIChzaGFyZWRfbWVtKSB0aGVuCisgIGlmIChhbnkgKEEoMjU6MzUpICAv PSBbKC0yKjMqNSppLCBpPTI1LDM1KV0pKSBzdG9wCisgIGlmIChhbnkgKEEyKDI1OjM1KSAv PSBbKC05KjcqKjgqaSwgaT0yNSwzNSldKSkgc3RvcAorICBpZiAoYW55IChBMygyNTozNSkg Lz0gWygtMTMqMTEqMTgqaSwgaT0yNSwzNSldKSkgc3RvcAorZWxzZQorICBpZiAoYW55IChB KDI1OjM1KSAgLz0gWygzKjUqaSwgaT0yNSwzNSldKSkgc3RvcAorICBpZiAoYW55IChBMigy NTozNSkgLz0gWyg3KjgqaSwgaT0yNSwzNSldKSkgc3RvcAorICBpZiAoYW55IChBMygyNToz NSkgLz0gWygxMSoxOCppLCBpPTI1LDM1KV0pKSBzdG9wCitlbmQgaWYKKworZW5kCmRpZmYg LS1naXQgYS9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4vcmV2ZXJzZS1vZmZs b2FkLTQuZjkwIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3JldmVyc2Ut b2ZmbG9hZC00LmY5MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u ZmIyN2FhNzNlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJn b21wLmZvcnRyYW4vcmV2ZXJzZS1vZmZsb2FkLTQuZjkwCkBAIC0wLDAgKzEsMTI5IEBACish IHsgZGctYWRkaXRpb25hbC1vcHRpb25zICItZm9mZmxvYWQtb3B0aW9ucz1udnB0eC1ub25l PS1taXNhPXNtXzM1IiB7IHRhcmdldCB7IG9mZmxvYWRfdGFyZ2V0X252cHR4IH0gfSB9CisK K2ltcGxpY2l0IG5vbmUKKyEkb21wIHJlcXVpcmVzIHJldmVyc2Vfb2ZmbG9hZAorCit0eXBl IHQyCisgIGludGVnZXIgOjogYSwgYiwgYworZW5kIHR5cGUgdDIKKwordHlwZSB0CisgaW50 ZWdlciA6OiBBKDUpLCBCKDUpLCBDKDUpCisgaW50ZWdlciwgcG9pbnRlciA6OiBQKDopLCBQ MiAhSnVzdCBzb21lIHBhZGRpbmcKKyB0eXBlKHQyKSA6OiB0dCAhSnVzdCBzb21lIHBhZGRp bmcKK2VuZCB0eXBlIHQKKwordHlwZSh0KSA6OiBTMSwgUzIKK2xvZ2ljYWwgOjogc2hhcmVk X21lbQorCitzaGFyZWRfbWVtID0gLmZhbHNlLgorCishJG9tcCB0YXJnZXQgbWFwKHRvOiBz aGFyZWRfbWVtKQorICBzaGFyZWRfbWVtID0gLnRydWUuCishJG9tcCBlbmQgdGFyZ2V0CisK K3MxJUEgPSBbMSwyLDMsNCw1XQorczElQiA9IFsxMCwyMCwzMCw0MCw1MF0KK3MxJUMgPSBb MTEsMjIsMzMsNDQsNTVdCitzMiVBID0gMipzMSVBCitzMiVCID0gMipzMSVCCitzMiVDID0g MipzMSVDCisKKyEkb21wIHRhcmdldCAmCishJG9tcCYgICAgICAgbWFwKHRvOiBzMSViLCBz MSVjKSAmCishJG9tcCYgICAgICAgbWFwKHRvOiBzMiViLCBzMiVjKQorYmxvY2sKKyAgdHlw ZSh0KSA6OiBzaTEsIHNpMiwgc2kzLCBzaTQKKworICBzMSVCID0gLTEwICogczElQgorICBz MSVDID0gLTEwICogczElQworICBzMiVCID0gLTE1ICogczIlQgorICBzMiVDID0gLTE1ICog czIlQworCisgIHNpMSVBID0gLTEgKiBbMSwyLDMsNCw1XQorICBzaTElQiA9IC0xICogWzEw LDIwLDMwLDQwLDUwXQorICBzaTElQyA9IC0xICogWzExLDIyLDMzLDQ0LDU1XQorICBzaTIl QSA9IC0yMyAqIFsxLDIsMyw0LDVdCisgIHNpMiVCID0gLTIzICogWzEwLDIwLDMwLDQwLDUw XQorICBzaTIlQyA9IC0yMyAqIFsxMSwyMiwzMyw0NCw1NV0KKworICAhJG9tcCB0YXJnZXQg ZGV2aWNlIChhbmNlc3RvcjoxKSAgJgorICAhJG9tcCYgICAgICAgbWFwKHRvOiBzaTElQywg c2kxJUIpICAmCisgICEkb21wJiAgICAgICBtYXAodG9mcm9tOiBzaTIlQywgc2kyJUIpICAm CisgICEkb21wJiAgICAgICBtYXAoYWx3YXlzLCB0bzogczElQikgICYKKyAgISRvbXAmICAg ICAgIG1hcCggICAgICAgIHRvOiBzMiVCKQorICAgIGlmIChhbnkgKHMxJUEgLz0gICAgICAg WzEsMiwzLDQsNV0pKSBzdG9wIDEKKyAgICBpZiAoYW55IChzMSVCIC89IC0xMCAqIFsxMCwy MCwzMCw0MCw1MF0pKSBzdG9wIDIKKyAgICBpZiAoc2hhcmVkX21lbSkgdGhlbgorICAgICAg aWYgKGFueSAoczElQyAvPSAtMTAgKiBbMTEsMjIsMzMsNDQsNTVdKSkgc3RvcCA0CisgICAg ZWxzZQorICAgICAgaWYgKGFueSAoczElQyAvPSAgICAgICBbMTEsMjIsMzMsNDQsNTVdKSkg c3RvcCAzCisgICAgZW5kaWYKKyAgICBpZiAoYW55IChzMiVBIC89ICAgMiAqIFsxLDIsMyw0 LDVdKSkgc3RvcCA0CisgICAgaWYgKHNoYXJlZF9tZW0pIHRoZW4KKyAgICAgIGlmIChhbnkg KHMyJUIgLz0gLTE1ICogMiAqIFsxMCwyMCwzMCw0MCw1MF0pKSBzdG9wIDUKKyAgICAgIGlm IChhbnkgKHMyJUMgLz0gLTE1ICogMiAqIFsxMSwyMiwzMyw0NCw1NV0pKSBzdG9wIDYKKyAg ICBlbHNlCisgICAgICBpZiAoYW55IChzMiVCIC89ICAgMiAqIFsxMCwyMCwzMCw0MCw1MF0p KSBzdG9wIDcKKyAgICAgIGlmIChhbnkgKHMyJUMgLz0gICAyICogWzExLDIyLDMzLDQ0LDU1 XSkpIHN0b3AgOAorICAgIGVuZGlmCisgICAgaWYgKGFueSAoc2kxJUIgLz0gLTEgKiBbMTAs MjAsMzAsNDAsNTBdKSkgc3RvcCA5CisgICAgaWYgKGFueSAoc2kxJUMgLz0gLTEgKiBbMTEs MjIsMzMsNDQsNTVdKSkgc3RvcCAxMAorICAgIGlmIChhbnkgKHNpMiVCIC89IC0yMyAqIFsx MCwyMCwzMCw0MCw1MF0pKSBzdG9wIDEwCisgICAgaWYgKGFueSAoc2kyJUMgLz0gLTIzICog WzExLDIyLDMzLDQ0LDU1XSkpIHN0b3AgMTEKKworICAgIHMxJUEgPSA1ICogczElQQorICAg IHMxJUIgPSA3ICogczElQgorICAgIHMxJUMgPSAxMyAqIHMxJUMKKyAgICBzMiVBID0gOSAq IHMyJUEKKyAgICBzMiVCID0gMjEgKiBzMiVCCisgICAgczIlQyA9IDMxICogczIlQworICAg IHNpMSVCID0gLTExICogc2kxJUIKKyAgICBzaTElQyA9IC0xMyAqIHNpMSVDCisgICAgc2ky JUIgPSAtMjcgKiBzaTIlQgorICAgIHNpMiVDID0gLTI5ICogc2kyJUMKKyAgISRvbXAgZW5k IHRhcmdldAorCisgIGlmIChzaGFyZWRfbWVtKSB0aGVuCisgICAgaWYgKGFueSAoczElQiAv PSAtMTAgKiA3ICogWzEwLDIwLDMwLDQwLDUwXSkpIHN0b3AgMjAKKyAgICBpZiAoYW55IChz MSVDIC89IC0xMCAqIDEzICogWzExLDIyLDMzLDQ0LDU1XSkpIHN0b3AgMjEKKyAgZWxzZQor ICAgIGlmIChhbnkgKHMxJUIgLz0gLTEwICogWzEwLDIwLDMwLDQwLDUwXSkpIHN0b3AgMjIK KyAgICBpZiAoYW55IChzMSVDIC89IC0xMCAqIFsxMSwyMiwzMyw0NCw1NV0pKSBzdG9wIDIz CisgIGVuZGlmCisgIGlmIChzaGFyZWRfbWVtKSB0aGVuCisgICAgaWYgKGFueSAoczIlQiAv PSAtMTUgKiAyICogMjEgKiBbMTAsMjAsMzAsNDAsNTBdKSkgc3RvcCAyNAorICAgIGlmIChh bnkgKHMyJUMgLz0gLTE1ICogMiAqIDMxICogWzExLDIyLDMzLDQ0LDU1XSkpIHN0b3AgMjUK KyAgZWxzZQorICAgIGlmIChhbnkgKHMyJUIgLz0gLTE1ICogMiAqIFsxMCwyMCwzMCw0MCw1 MF0pKSBzdG9wIDI2CisgICAgaWYgKGFueSAoczIlQyAvPSAtMTUgKiAyICogWzExLDIyLDMz LDQ0LDU1XSkpIHN0b3AgMjcKKyAgZW5kaWYKKyAgaWYgKGFueSAoc2kxJUEgLz0gLTEgKiBb MSwyLDMsNCw1XSkpIHN0b3AgMjgKKyAgaWYgKHNoYXJlZF9tZW0pIHRoZW4KKyAgICBpZiAo YW55IChzaTElQiAvPSAtMSAqICgtMTEpICogWzEwLDIwLDMwLDQwLDUwXSkpIHN0b3AgMjkK KyAgICBpZiAoYW55IChzaTElQyAvPSAtMSAqICgtMTMpICogWzExLDIyLDMzLDQ0LDU1XSkp IHN0b3AgMzAKKyAgZWxzZQorICAgIGlmIChhbnkgKHNpMSVCIC89IC0xICogWzEwLDIwLDMw LDQwLDUwXSkpIHN0b3AgMzEKKyAgICBpZiAoYW55IChzaTElQyAvPSAtMSAqIFsxMSwyMiwz Myw0NCw1NV0pKSBzdG9wIDMyCisgIGVuZGlmCisgIGlmIChhbnkgKHNpMiVBIC89IC0yMyAq IFsxLDIsMyw0LDVdKSkgc3RvcCAzMworICBpZiAoYW55IChzaTIlQiAvPSAtMjMgKiAoLTI3 KSAqIFsxMCwyMCwzMCw0MCw1MF0pKSBzdG9wIDM0CisgIGlmIChhbnkgKHNpMiVDIC89IC0y MyAqICgtMjkpICogWzExLDIyLDMzLDQ0LDU1XSkpIHN0b3AgMzUKK2VuZCBibG9jaworCitp ZiAoYW55IChzMSVBIC89ICAgICAgIDUgKiBbMSwyLDMsNCw1XSkpIHN0b3AgNDAKK2lmIChh bnkgKHMxJUIgLz0gLTEwICogNyAqIFsxMCwyMCwzMCw0MCw1MF0pKSBzdG9wIDQxCitpZiAo c2hhcmVkX21lbSkgdGhlbgorICBpZiAoYW55IChzMSVDIC89IC0xMCAqIDEzICogWzExLDIy LDMzLDQ0LDU1XSkpIHN0b3AgNDIKK2Vsc2UKKyAgaWYgKGFueSAoczElQyAvPSAxMyAqICAg IFsxMSwyMiwzMyw0NCw1NV0pKSBzdG9wIDQzCitlbmRpZgoraWYgKGFueSAoczIlQSAvPSAg IDIgKiA5ICogWzEsMiwzLDQsNV0pKSBzdG9wIDQ0CitpZiAoc2hhcmVkX21lbSkgdGhlbgor ICBpZiAoYW55IChzMiVCIC89IC0xNSAqIDIgKiAyMSAqIFsxMCwyMCwzMCw0MCw1MF0pKSBz dG9wIDQ1CisgIGlmIChhbnkgKHMyJUMgLz0gLTE1ICogMiAqIDMxICogWzExLDIyLDMzLDQ0 LDU1XSkpIHN0b3AgNDYKK2Vsc2UKKyAgaWYgKGFueSAoczIlQiAvPSAgIDIgKiAyMSAqIFsx MCwyMCwzMCw0MCw1MF0pKSBzdG9wIDQ3CisgIGlmIChhbnkgKHMyJUMgLz0gICAyICogMzEg KiBbMTEsMjIsMzMsNDQsNTVdKSkgc3RvcCA0OAorZW5kaWYKK2VuZApkaWZmIC0tZ2l0IGEv bGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3JldmVyc2Utb2ZmbG9hZC01LmY5 MCBiL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuZm9ydHJhbi9yZXZlcnNlLW9mZmxvYWQt NS5mOTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmVmN2ViN2Jk ZDUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5mb3J0 cmFuL3JldmVyc2Utb2ZmbG9hZC01LmY5MApAQCAtMCwwICsxLDEwMCBAQAorISB7IGRnLWFk ZGl0aW9uYWwtb3B0aW9ucyAiLWZvZmZsb2FkLW9wdGlvbnM9bnZwdHgtbm9uZT0tbWlzYT1z bV8zNSIgeyB0YXJnZXQgeyBvZmZsb2FkX3RhcmdldF9udnB0eCB9IH0gfQorISB7IGRnLXhm YWlsLXJ1bi1pZiAiQ29weWluZyBvbi1kZXZpY2UgYWxsb2NhdGVkIG1lbW9yeSBmYWlscyB3 aXRoIGN1TWVtY3B5RHRvSEFzeW5jIGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50IiB7IG9mZmxv YWRfZGV2aWNlX252cHR4IH0gfQorCishIEJlY2F1c2Ugb2YgdGhlIG52cHR4IGZhaWwsIGEg bm9uLWRldmljZSBhbGxvYyB2ZXJzaW9uIGhhcyBiZWVuCishIGNyZWF0ZWQ6IHJldmVyc2Ut b2ZmbG9hZC01YS5mOTAKKworaW1wbGljaXQgbm9uZQorISRvbXAgcmVxdWlyZXMgcmV2ZXJz ZV9vZmZsb2FkCisKK2ludGVnZXIsIGFsbG9jYXRhYmxlIDo6IEEoOiksIEEyKDopLCBzMSwg czIKK2ludGVnZXIgOjogaQorbG9naWNhbCA6OiBzaGFyZWRfbWVtCisKK3NoYXJlZF9tZW0g PSAuZmFsc2UuCisKK2EgPSBbMSwyLDMsNF0KK2EyID0gWzgsNyw2LDVdCitzMSA9IDUzMgor czIgPSA1NQorCishJG9tcCB0YXJnZXQgbWFwKHRvOiBzaGFyZWRfbWVtKQorICBzaGFyZWRf bWVtID0gLnRydWUuCishJG9tcCBlbmQgdGFyZ2V0CisKKyEkb21wIHRhcmdldCBtYXAodG86 IEEsIEEyLCBzMSwgczIpCitibG9jaworICBpbnRlZ2VyLCBhbGxvY2F0YWJsZSA6OiBhaSg6 KSwgYWkyKDopLCBzaTEsIHNpMgorCisgIGEgPSBhICogMgorICBhMiA9IGEyICogMworICBz MSA9IHMxICogNAorICBzMiA9IHMyICogNQorCisgIGFpID0gWzIzLDM1LDg2LDQzXQorICBh aTIgPSBbOCw0LDcsMV0KKyAgc2kxID0gNjQKKyAgc2kyID0gNzY1CisKKyAgISRvbXAgdGFy Z2V0IGRldmljZSAoYW5jZXN0b3I6MSkgICYKKyAgISRvbXAmICAgICAgIG1hcCh0bzogQSwg czEsIGFpLCBzaTEpIG1hcChhbHdheXMsIHRvOiBhMiwgczIpICAmCisgICEkb21wJiAgICAg ICBtYXAodG9mcm9tOiBhaTIsIHNpMikKKyAgICBpZiAoc2hhcmVkX21lbSkgdGhlbgorICAg ICAgaWYgKGFueSAoYSAgLz0gMiAqIFsxLDIsMyw0XSkpIHN0b3AgMQorICAgICAgaWYgKHMx IC89IDQgKiA1MzIpIHN0b3AgMgorICAgIGVsc2UKKyAgICAgIGlmIChhbnkgKGEgIC89ICAg ICBbMSwyLDMsNF0pKSBzdG9wIDMKKyAgICAgIGlmIChzMSAvPSAgICAgNTMyKSBzdG9wIDQK KyAgICBlbmRpZgorICAgIGlmIChhbnkgKGEyIC89IDMgKiBbOCw3LDYsNV0pKSBzdG9wIDUK KyAgICBpZiAoczIgLz0gNSAqIDU1KSBzdG9wIDYKKyAgICBpZiAoYW55IChhaSAvPSBbMjMs MzUsODYsNDNdKSkgc3RvcCA3CisgICAgaWYgKGFueSAoYWkyIC89IFs4LDQsNywxXSkpIHN0 b3AgOAorICAgIGlmIChzaTEgLz0gNjQpIHN0b3AgOQorICAgIGlmIChzaTIgLz0gNzY1KSBz dG9wIDEwCisKKyAgICBhID0gYSozCisgICAgYTIgPSBhMio3CisgICAgczEgPSBzMSoxMQor ICAgIHMyID0gczIqNQorICAgIGFpID0gYWkqMTMKKyAgICBhaTIgPSBhaTIqMjEKKyAgICBz aTEgPSBzaTEqMjcKKyAgICBzaTIgPSBzaTIqMzEKKyAgISRvbXAgZW5kIHRhcmdldAorCisg IGlmIChzaGFyZWRfbWVtKSB0aGVuCisgICAgaWYgKGFueSAoYSAgLz0gMyAqIDIgKiBbMSwy LDMsNF0pKSBzdG9wIDExCisgICAgaWYgKGFueSAoYTIgLz0gNyAqIDMgKiBbOCw3LDYsNV0p KSBzdG9wIDEyCisgICAgaWYgKHMxIC89IDExICogNCAqIDUzMikgc3RvcCAxMworICAgIGlm IChzMiAvPSA1ICogNSAqIDU1KSBzdG9wIDE0CisgICAgaWYgKGFueSAoYWkgLz0gMTMgKiBb MjMsMzUsODYsNDNdKSkgc3RvcCAxNQorICAgIGlmIChzaTEgLz0gMjcgKiA2NCkgc3RvcCAx NgorICBlbHNlCisgICAgaWYgKGFueSAoYSAgLz0gMiAqIFsxLDIsMyw0XSkpIHN0b3AgMTcK KyAgICBpZiAoYW55IChhMiAvPSAzICogWzgsNyw2LDVdKSkgc3RvcCAxOAorICAgIGlmIChz MSAvPSA0ICogNTMyKSBzdG9wIDE5CisgICAgaWYgKHMyIC89IDUgKiA1NSkgc3RvcCAyMAor ICAgIGlmIChhbnkgKGFpIC89IFsyMywzNSw4Niw0M10pKSBzdG9wIDIyCisgICAgaWYgKHNp MSAvPSA2NCkgc3RvcCAyMworICBlbmRpZgorICBpZiAoYW55IChhaTIgLz0gMjEgKiBbOCw0 LDcsMV0pKSBzdG9wIDI0CisgIGlmIChzaTIgLz0gMzEgKiA3NjUpIHN0b3AgMjUKKworICBk ZWFsbG9jYXRlIChhaSwgYWkyLCBzaTEsIHNpMikKK2VuZCBibG9jaworCitpZiAoc2hhcmVk X21lbSkgdGhlbgorICBpZiAoYW55IChhICAvPSAzICogMiAqIFsxLDIsMyw0XSkpIHN0b3Ag MzAKKyAgaWYgKGFueSAoYTIgLz0gNyAqIDMgKiBbOCw3LDYsNV0pKSBzdG9wIDMxCisgIGlm IChzMSAvPSAxMSAqIDQgKiA1MzIpIHN0b3AgMzIKKyAgaWYgKHMyIC89IDUgKiA1ICogNTUp IHN0b3AgMzMKK2Vsc2UKKyAgaWYgKGFueSAoYSAgLz0gMyAqIFsxLDIsMyw0XSkpIHN0b3Ag MzQKKyAgaWYgKGFueSAoYTIgLz0gMyAqIDcgKiBbOCw3LDYsNV0pKSBzdG9wIDM1CisgIGlm IChzMSAvPSAxMSAqIDUzMikgc3RvcCAzNgorICBpZiAoczIgLz0gNSAqIDUgKiA1NSkgc3Rv cCAzNworZW5kaWYKKworZGVhbGxvY2F0ZSAoYSwgYTIsIHMxLCBzMikKK2VuZApkaWZmIC0t Z2l0IGEvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3JldmVyc2Utb2ZmbG9h ZC01YS5mOTAgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4vcmV2ZXJzZS1v ZmZsb2FkLTVhLmY5MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u OTE0ZDEwZDgxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJn b21wLmZvcnRyYW4vcmV2ZXJzZS1vZmZsb2FkLTVhLmY5MApAQCAtMCwwICsxLDk4IEBACish IHsgZGctYWRkaXRpb25hbC1vcHRpb25zICItZm9mZmxvYWQtb3B0aW9ucz1udnB0eC1ub25l PS1taXNhPXNtXzM1IiB7IHRhcmdldCB7IG9mZmxvYWRfdGFyZ2V0X252cHR4IH0gfSB9CisK KyEgQ29weWluZyBvbi1kZXZpY2UgYWxsb2NhdGVkIG1lbW9yeSBmYWlscyB3aXRoIGN1TWVt Y3B5RHRvSEFzeW5jIGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50CishIEhlbmNlLCByZXZlcnNl LW9mZmxvYWQtNS5mOTAgaGFzIGJlZW4gY29waWVkIHRvICp0aGlzKiBmaWxlLAorISB3aGlj aCB1c2VzIG9uLWhvc3QgYWxsb2NhdGVkIHZhcnMgLSBidXQgb25seSBvbiB0aGUgZGV2aWNl IHNpZGUgc3RhY2sgdmFyaWFibGVzCisKK2ltcGxpY2l0IG5vbmUKKyEkb21wIHJlcXVpcmVz IHJldmVyc2Vfb2ZmbG9hZAorCitpbnRlZ2VyLCBhbGxvY2F0YWJsZSA6OiBBKDopLCBBMig6 KSwgczEsIHMyCitpbnRlZ2VyIDo6IGksRCg0KQorbG9naWNhbCA6OiBzaGFyZWRfbWVtCisK K3NoYXJlZF9tZW0gPSAuZmFsc2UuCisKK2EgPSBbMSwyLDMsNF0KK2EyID0gWzgsNyw2LDVd CitzMSA9IDUzMgorczIgPSA1NQorCishJG9tcCB0YXJnZXQgbWFwKHRvOiBzaGFyZWRfbWVt KQorICBzaGFyZWRfbWVtID0gLnRydWUuCishJG9tcCBlbmQgdGFyZ2V0CisKKyEkb21wIHRh cmdldCBtYXAodG86IEEsIEEyLCBzMSwgczIpCitibG9jaworICAhIHN0YWNrIHZhcmlhYmxl czoKKyAgaW50ZWdlciA6OiBhaSg0KSwgYWkyKDQpLCBzaTEsIHNpMgorCisgIGEgPSBhICog MgorICBhMiA9IGEyICogMworICBzMSA9IHMxICogNAorICBzMiA9IHMyICogNQorCisgIGFp ID0gWzIzLDM1LDg2LDQzXQorICBhaTIgPSBbOCw0LDcsMV0KKyAgc2kxID0gNjQKKyAgc2ky ID0gNzY1CisKKyAgISRvbXAgdGFyZ2V0IGRldmljZSAoYW5jZXN0b3I6MSkgICYKKyAgISRv bXAmICAgICAgIG1hcCh0bzogQSwgczEsIGFpLCBzaTEpIG1hcChhbHdheXMsIHRvOiBhMiwg czIpICAmCisgICEkb21wJiAgICAgICBtYXAodG9mcm9tOiBhaTIsIHNpMikKKyAgICBpZiAo c2hhcmVkX21lbSkgdGhlbgorICAgICAgaWYgKGFueSAoYSAgLz0gMiAqIFsxLDIsMyw0XSkp IHN0b3AgMQorICAgICAgaWYgKHMxIC89IDQgKiA1MzIpIHN0b3AgMgorICAgIGVsc2UKKyAg ICAgIGlmIChhbnkgKGEgIC89ICAgICBbMSwyLDMsNF0pKSBzdG9wIDMKKyAgICAgIGlmIChz MSAvPSAgICAgNTMyKSBzdG9wIDQKKyAgICBlbmRpZgorICAgIGlmIChhbnkgKGEyIC89IDMg KiBbOCw3LDYsNV0pKSBzdG9wIDUKKyAgICBpZiAoczIgLz0gNSAqIDU1KSBzdG9wIDYKKyAg ICBpZiAoYW55IChhaSAvPSBbMjMsMzUsODYsNDNdKSkgc3RvcCA3CisgICAgaWYgKGFueSAo YWkyIC89IFs4LDQsNywxXSkpIHN0b3AgOAorICAgIGlmIChzaTEgLz0gNjQpIHN0b3AgOQor ICAgIGlmIChzaTIgLz0gNzY1KSBzdG9wIDEwCisKKyAgICBhID0gYSozCisgICAgYTIgPSBh Mio3CisgICAgczEgPSBzMSoxMQorICAgIHMyID0gczIqNQorICAgIGFpID0gYWkqMTMKKyAg ICBhaTIgPSBhaTIqMjEKKyAgICBzaTEgPSBzaTEqMjcKKyAgICBzaTIgPSBzaTIqMzEKKyAg ISRvbXAgZW5kIHRhcmdldAorCisgIGlmIChzaGFyZWRfbWVtKSB0aGVuCisgICAgaWYgKGFu eSAoYSAgLz0gMyAqIDIgKiBbMSwyLDMsNF0pKSBzdG9wIDExCisgICAgaWYgKGFueSAoYTIg Lz0gNyAqIDMgKiBbOCw3LDYsNV0pKSBzdG9wIDEyCisgICAgaWYgKHMxIC89IDExICogNCAq IDUzMikgc3RvcCAxMworICAgIGlmIChzMiAvPSA1ICogNSAqIDU1KSBzdG9wIDE0CisgICAg aWYgKGFueSAoYWkgLz0gMTMgKiBbMjMsMzUsODYsNDNdKSkgc3RvcCAxNQorICAgIGlmIChz aTEgLz0gMjcgKiA2NCkgc3RvcCAxNgorICBlbHNlCisgICAgaWYgKGFueSAoYSAgLz0gMiAq IFsxLDIsMyw0XSkpIHN0b3AgMTcKKyAgICBpZiAoYW55IChhMiAvPSAzICogWzgsNyw2LDVd KSkgc3RvcCAxOAorICAgIGlmIChzMSAvPSA0ICogNTMyKSBzdG9wIDE5CisgICAgaWYgKHMy IC89IDUgKiA1NSkgc3RvcCAyMAorICAgIGlmIChhbnkgKGFpIC89IFsyMywzNSw4Niw0M10p KSBzdG9wIDIyCisgICAgaWYgKHNpMSAvPSA2NCkgc3RvcCAyMworICBlbmRpZgorICBpZiAo YW55IChhaTIgLz0gMjEgKiBbOCw0LDcsMV0pKSBzdG9wIDI0CisgIGlmIChzaTIgLz0gMzEg KiA3NjUpIHN0b3AgMjUKK2VuZCBibG9jaworaWYgKHNoYXJlZF9tZW0pIHRoZW4KKyAgaWYg KGFueSAoYSAgLz0gMyAqIDIgKiBbMSwyLDMsNF0pKSBzdG9wIDMwCisgIGlmIChhbnkgKGEy IC89IDcgKiAzICogWzgsNyw2LDVdKSkgc3RvcCAzMQorICBpZiAoczEgLz0gMTEgKiA0ICog NTMyKSBzdG9wIDMyCisgIGlmIChzMiAvPSA1ICogNSAqIDU1KSBzdG9wIDMzCitlbHNlCisg IGlmIChhbnkgKGEgIC89IDMgKiBbMSwyLDMsNF0pKSBzdG9wIDM0CisgIGlmIChhbnkgKGEy IC89IDMgKiA3ICogWzgsNyw2LDVdKSkgc3RvcCAzNQorICBpZiAoczEgLz0gMTEgKiA1MzIp IHN0b3AgMzYKKyAgaWYgKHMyIC89IDUgKiA1ICogNTUpIHN0b3AgMzcKK2VuZGlmCisKK2Rl YWxsb2NhdGUgKGEsIGEyLCBzMSwgczIpCitlbmQK --------------NoLqimvATBv0o0q7c7u481t0--