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 CF2C33858C50; Thu, 23 Mar 2023 19:57:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CF2C33858C50 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.98,285,1673942400"; d="diff'?scan'208";a="161510" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa4.mentor.iphmx.com with ESMTP; 23 Mar 2023 11:57:44 -0800 IronPort-SDR: suE/gab7yQLstuHHrWKygriSQQlv4R6EYDKTbw/I1UATNYTyauK9olhMh9d2g3ZRZ0TXQFGPtW l5F7CJS0vlkAsRPUCb0gacptgSGU26gpSRcHaSBYczOK3PvkYwZNYD4kHCzM0j6QnEIqPkHAW/ 1+iwMpMje0d7M4s+dGsqBW1d7pDkjMDbTfYbTQaIR+Xgnhun4smPqITGNMSHZBXPxC+w1PgL6k Cz54ZKE4PTHeuoYMFEYegL2Tbx/ugti52zEPfKwcXkAmY/yCeImukLNSpwda6pupCQvIxOQIMG qiI= Content-Type: multipart/mixed; boundary="------------kbswvlxoztqnD60VWnKmKzRk" Message-ID: <830e6e9d-af1c-31f7-8ec6-9eabe5ebcf9b@codesourcery.com> Date: Thu, 23 Mar 2023 20:57:39 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.9.0 Content-Language: en-US To: gcc-patches , fortran From: Tobias Burnus Subject: [OG12][committed] Fortran/OpenMP: Fix 'alloc' and 'from' mapping for allocatable components X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) To svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) X-Spam-Status: No, score=-11.3 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: --------------kbswvlxoztqnD60VWnKmKzRk Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: quoted-printable This is about OpenMP's "deep mapping" of allocatable components of derived = types. The basic feature is on OG12 (and OG11) but yet in GCC mainline. The old submissions are at https://gcc.gnu.org/pipermail/gcc-patches/2022-April/593= 704.html My plan is to get the whole feature into GCC 14 once trunk has opened (and after some simpler pending patches have been merged). It requires some re-diffing to be more digestible. * * * OG12: This patch as been committed to the devel/omp/gcc-12 branch as https://gcc.gnu.org/g:a63735b8034db65a33c359633462accd9d71d3b5 * * * This patch fixes an issue with 'map(alloc:' and 'map(from:' with deep mapping of allocatable components - namely: * For unmapping/coping to the host, the state of unallocated allocatables needs to be preservered. * For mapping to the device ('alloc' and 'from'), we still need to copy data to the device to have the array bounds correctly set. The data pointer (of allocated allocatables) is set as part of allocating memory on the device ('attach'); thus, this part works. As described in the patch (cf. comment above the checking function), we could either copy only the descriptor data (and the NULL for pointers) or we copy everything (shallowly) which includes this data. As there is no means to do the former (without changing the refcount), we do the latter= . NOTE: The actual data to which the scalar/array allocatable points to is not 'to' mapped but only 'alloc'. As that is supposed to be the large data, copying everything should=E2=84=A2 not cause a large performance penalty wi= th real-world code; it could be even faster than, let's say, copying 5 descriptors separa= tely. OpenMP spec side: It is not completely clear how the OpenMP spec expects the copy out to work. Hence, I filed OpenMP Spec Issue #3545. ----------------- 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 --------------kbswvlxoztqnD60VWnKmKzRk Content-Type: text/x-patch; charset="UTF-8"; name="committed.diff" Content-Disposition: attachment; filename="committed.diff" Content-Transfer-Encoding: base64 Y29tbWl0IGE2MzczNWI4MDM0ZGI2NWEzM2MzNTk2MzM0NjJhY2NkOWQ3MWQzYjUKQXV0aG9y OiBUb2JpYXMgQnVybnVzIDx0b2JpYXNAY29kZXNvdXJjZXJ5LmNvbT4KRGF0ZTogICBUaHUg TWFyIDIzIDE4OjA0OjE3IDIwMjMgKzAxMDAKCiAgICBGb3J0cmFuL09wZW5NUDogRml4ICdh bGxvYycgYW5kICdmcm9tJyBtYXBwaW5nIGZvciBhbGxvY2F0YWJsZSBjb21wb25lbnRzCiAg ICAKICAgIEV2ZW4gd2l0aCAnYWxsb2MnIGFuZCBtYXAtZW50ZXJpbmcgJ2Zyb20nIG1hcHBp bmcsIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGhvbGQuCiAgICBGb3IgZXhwbGljaXQgbWFwcGlu ZywgdGhhdCdzIGFscmVhZHkgdGhlIGNhc2UsIHRoaXMgaGFuZGxlcyB0aGUgYXV0b21hdGlj YWwKICAgIGRlZXAgbWFwcGluZyBvZiBhbGxvY2F0YWJsZSBjb21wb25lbnRzLiBOYW1lbHk6 CiAgICAqIE9uIHRoZSBkZXZpY2UsIHRoZSBhcnJheSBib3VuZHMgKG9mIGFsbG9jYXRlZCBh bGxvY2F0YWJsZXMpIG11c3QgbWF0Y2ggdGhlCiAgICAgIGhvc3QsIGltcGx5aW5nICd0bycg KG9yICd0b2Zyb20nKSBtYXBwaW5nLgogICAgKiBPbiBtYXAgZXhpdGluZywgdGhlIGNvcHlp bmcgb3V0IHNoYWxsIG5vdCBkZXN0cm95IHRoZSB1bmFsbG9jYXRlZCBhbGxvY2F0aW9uCiAg ICAgIHN0YXR1cyAobm9yIHRoZSBwb2ludGVyIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIGFsbG9j YXRhYmxlcykuCiAgICAKICAgIFRoZSBsYXR0ZXIgd2FzIG5vdCBhIHByb2JsZW0gZm9yIGFs bG9jYXRlZCBhbGxvY2F0YWJsZXMgYXMgZm9yIHRob3NlIGEgcG9pbnRlcgogICAgd2FzIEdP TVBfTUFQX0FUVEFDSGVkOyBob3dldmVyLCBmb3IgdW5hbGxvY2F0ZWQgYWxsb2NhdGFibGVz LCBiZWZvcmUgaXQgY29waWVkCiAgICBiYWNrIGRldmljZS1hbGxvY2F0ZWQgbWVtb3J5IHdo aWNoIG1pZ2h0IG5vdCBiZSBudWxsaWZpZWQuCiAgICAKICAgIFdoaWxlICdhbGxvYycgd2Fz IG5vdCBkZWVwLW1hcHBlZCBhdCBhbGwsIGZvciBtYXAtZW50ZXJpbmcgJ2Zyb20nLCB0aGUg YXJyYXkKICAgIGJvdW5kcyB3ZXJlIG5vdCBzZXQsIG1ha2luZyBhbGxvY2F0ZWQgZGVyaXZl ZC10eXBlIGNvbXBvbmVudHMgaW5hY2Nlc3NpYmxlIG9uCiAgICB0aGUgZGV2aWNlIChhbmQg d3Jvbmcgb24gdGhlIGhvc3Qgb24gY29weSBiYWNrKS4KICAgIAogICAgVGhlIHNvbHV0aW9u IGlzLCBmaXJzdCwgdG8gZGVlcC1tYXAgJ2FsbG9jJyBhcyB3ZWxsIGFuZCB0byBjb3B5IHRv IHRoZSBkZXZpY2UKICAgIGV2ZW4gd2l0aCAnYWxsb2MnIGFuZCAobWFwLWVudGVyaW5nKSAn ZnJvbScuIFRoaXMgY29weWluZyBpcyBvbmx5IGRvbmUgaWYgdGhlcmUKICAgIGlzIGEgc2Nh bGFyIChmb3IgdGhlIHVuYWxsb2NhdGVkIGNhc2UpIG9yIGFycmF5IGFsbG9jYXRhYmxlIGRp cmVjdGx5IGluIHRoZQogICAgZGVyaXZlZCB0eXBlIGFuZCB0aGVuIGl0IGlzIHNoYWxsb3ds eSBjb3BpZWQ7IHRoZSBkYXRhIHBvaW50ZWQgdG8gaXMgdGhlbiBhZ2FpbgogICAgb25seSBh bGxvYydlZCwgdW5sZXNzIGl0IGNvbnRhaW5zIGluIHR1cm4gYWxsb2NhdGFibGVzLgogICAg CiAgICBnY2MvZm9ydHJhbi8KICAgIAogICAgICAgICAgICAqIHRyYW5zLW9wZW5tcC5jYyAo Z2ZjX2hhc19hbGxvY19jb21wcyk6IEFkZCAnYm9vbAogICAgICAgICAgICBzaGFsbG93X2Fs bG9jX29ubHk9ZmFsc2UnIGFyZy4KICAgICAgICAgICAgKGdmY19vbXBfcmVwbGFjZV9hbGxv Y19ieV90b19tYXBwaW5nKTogTmV3LCBjYWxsIGl0LgogICAgICAgICAgICAoZ2ZjX29tcF9k ZWVwX21hcF9raW5kX3ApOiBSZXR1cm4gJ3RydWUnIGFsc28gZm9yICcocHJlc2VudCwpYWxs b2MnLgogICAgICAgICAgICAoZ2ZjX29tcF9kZWVwX21hcHBpbmdfaXRlbSwgZ2ZjX29tcF9k ZWVwX21hcHBpbmdfZG8pOiBPbiBtYXAgZW50ZXJpbmcsCiAgICAgICAgICAgIHJlcGxhY2Ug c2hhbGxvd2x5ICdhbGxvYycvJ2Zyb20nIGJ5ICcoZnJvbSl0bycgbWFwcGluZyBpZiB0aGVy ZSBhcmUKICAgICAgICAgICAgYWxsb2NhdGFibGUgY29tcG9uZW50cy4KICAgIAogICAgbGli Z29tcC8KICAgIAogICAgICAgICAgICAqIHRlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4vbWFw LWFsbG9jLWNvbXAtOC5mOTA6IE5ldyB0ZXN0LgotLS0KIGdjYy9mb3J0cmFuL0NoYW5nZUxv Zy5vbXAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEwICsKIGdjYy9mb3J0cmFuL3Ry YW5zLW9wZW5tcC5jYyAgICAgICAgICAgICAgICAgICAgICAgIHwgIDk2ICsrKysrKystCiBs aWJnb21wL0NoYW5nZUxvZy5vbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg NCArCiAuLi4vdGVzdHN1aXRlL2xpYmdvbXAuZm9ydHJhbi9tYXAtYWxsb2MtY29tcC04LmY5 MCB8IDI2OCArKysrKysrKysrKysrKysrKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgMzcxIGlu c2VydGlvbnMoKyksIDcgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZ2NjL2ZvcnRyYW4v Q2hhbmdlTG9nLm9tcCBiL2djYy9mb3J0cmFuL0NoYW5nZUxvZy5vbXAKaW5kZXggZjdkMWY5 MWYxNzguLmUzYWIyMjU0MjE1IDEwMDY0NAotLS0gYS9nY2MvZm9ydHJhbi9DaGFuZ2VMb2cu b21wCisrKyBiL2djYy9mb3J0cmFuL0NoYW5nZUxvZy5vbXAKQEAgLTEsMyArMSwxMyBAQAor MjAyMy0wMy0yMyAgVG9iaWFzIEJ1cm51cyAgPHRvYmlhc0Bjb2Rlc291cmNlcnkuY29tPgor CisJKiB0cmFucy1vcGVubXAuY2MgKGdmY19oYXNfYWxsb2NfY29tcHMpOiBBZGQgJ2Jvb2wK KwlzaGFsbG93X2FsbG9jX29ubHk9ZmFsc2UnIGFyZy4KKwkoZ2ZjX29tcF9yZXBsYWNlX2Fs bG9jX2J5X3RvX21hcHBpbmcpOiBOZXcsIGNhbGwgaXQuCisJKGdmY19vbXBfZGVlcF9tYXBf a2luZF9wKTogUmV0dXJuICd0cnVlJyBhbHNvIGZvciAnKHByZXNlbnQsKWFsbG9jJy4KKwko Z2ZjX29tcF9kZWVwX21hcHBpbmdfaXRlbSwgZ2ZjX29tcF9kZWVwX21hcHBpbmdfZG8pOiBP biBtYXAgZW50ZXJpbmcsCisJcmVwbGFjZSBzaGFsbG93bHkgJ2FsbG9jJy8nZnJvbScgYnkg Jyhmcm9tKXRvJyBtYXBwaW5nIGlmIHRoZXJlIGFyZQorCWFsbG9jYXRhYmxlIGNvbXBvbmVu dHMuCisKIDIwMjMtMDMtMjMgIFRvYmlhcyBCdXJudXMgIDx0b2JpYXNAY29kZXNvdXJjZXJ5 LmNvbT4KIAogCSogY2xhc3MuY2MgKGdlbmVyYXRlX2NhbGxiYWNrX3dyYXBwZXIpOiBBZGQg YXR0ci5jbGFzc19vayBjaGVjay4KZGlmZiAtLWdpdCBhL2djYy9mb3J0cmFuL3RyYW5zLW9w ZW5tcC5jYyBiL2djYy9mb3J0cmFuL3RyYW5zLW9wZW5tcC5jYwppbmRleCA3YTk0YmRjYzg3 MC4uODQwOGQ3YjUyNzQgMTAwNjQ0Ci0tLSBhL2djYy9mb3J0cmFuL3RyYW5zLW9wZW5tcC5j YworKysgYi9nY2MvZm9ydHJhbi90cmFucy1vcGVubXAuY2MKQEAgLTM3OSwxMCArMzc5LDEz IEBAIGdmY19vbXBfcmVwb3J0X2RlY2wgKHRyZWUgZGVjbCkKIH0KIAogLyogUmV0dXJuIHRy dWUgaWYgVFlQRSBoYXMgYW55IGFsbG9jYXRhYmxlIGNvbXBvbmVudHM7Ci0gICBpZiBwdHJf b2ssIHRoZSBkZWNsIGl0c2VsZiBpcyBwZXJtaXR0ZWQgdG8gaGF2ZSB0aGUgUE9JTlRFUiBh dHRyaWJ1dGUuICAqLworICAgaWYgcHRyX29rLCB0aGUgZGVjbCBpdHNlbGYgaXMgcGVybWl0 dGVkIHRvIGhhdmUgdGhlIFBPSU5URVIgYXR0cmlidXRlLgorICAgaWYgc2hhbGxvd19hbGxv Y19vbmx5LCByZXR1cm5zIG9ubHkgdHJ1ZSBpZiBhbnkgb2YgdGhlIGZpZWxkcyBpcyBhbgor ICAgYWxsb2NhdGFibGU7IGNhbGxlZCB3aXRoIHRydWUgYnkgZ2ZjX29tcF9yZXBsYWNlX2Fs bG9jX2J5X3RvX21hcHBpbmcuICAqLwogCiBzdGF0aWMgYm9vbAotZ2ZjX2hhc19hbGxvY19j b21wcyAodHJlZSB0eXBlLCB0cmVlIGRlY2wsIGJvb2wgcHRyX29rKQorZ2ZjX2hhc19hbGxv Y19jb21wcyAodHJlZSB0eXBlLCB0cmVlIGRlY2wsIGJvb2wgcHRyX29rLAorCQkgICAgIGJv b2wgc2hhbGxvd19hbGxvY19vbmx5PWZhbHNlKQogewogICB0cmVlIGZpZWxkLCBmdHlwZTsK IApAQCAtNDE1LDEyICs0MTgsNTAgQEAgZ2ZjX2hhc19hbGxvY19jb21wcyAodHJlZSB0eXBl LCB0cmVlIGRlY2wsIGJvb2wgcHRyX29rKQogICAgICAgaWYgKEdGQ19ERVNDUklQVE9SX1RZ UEVfUCAoZnR5cGUpCiAJICAmJiBHRkNfVFlQRV9BUlJBWV9BS0lORCAoZnR5cGUpID09IEdG Q19BUlJBWV9BTExPQ0FUQUJMRSkKIAlyZXR1cm4gdHJ1ZTsKLSAgICAgIGlmIChnZmNfaGFz X2FsbG9jX2NvbXBzIChmdHlwZSwgZmllbGQsIGZhbHNlKSkKKyAgICAgIGlmICghc2hhbGxv d19hbGxvY19vbmx5CisJICAmJiBnZmNfaGFzX2FsbG9jX2NvbXBzIChmdHlwZSwgZmllbGQs IGZhbHNlKSkKIAlyZXR1cm4gdHJ1ZTsKICAgICB9CiAgIHJldHVybiBmYWxzZTsKIH0KIAor LyogZ2ZjX29tcF9yZXBsYWNlX2FsbG9jX2J5X3RvX21hcHBpbmcgaXMgdXNlZCB3aXRoIGdm Y19vbXBfZGVlcF9tYXBwaW5nLi4uIHRvCisgICBoYW5kbGUgdGhlIGZvbGxvd2luZzoKKwor ICAgRm9yIG1hcChhbGxvYzogZHQpLCB0aGUgYXJyYXkgZGVzY3JpcHRvcnMgb2YgYWxsb2Nh dGFibGUgY29tcG9uZW50cyBzaG91bGQKKyAgIGJlIG1hcHBlZCBhcyAndG8nOyB0aGlzIGNv dWxkIGJlIGRvbmUgYnkgKEEpIGFkZGluZyAnbWFwKHRvOiBkdCVhbGxvY19jb21wKScKKyAg IGZvciBlYWNoIGNvbXBvbmVudCAoYW5kIGF2b2lkaW5nIHRvIGluY3JlbWVudCB0aGUgcmVm ZXJlbmNlIGNvdW50KS4KKyAgIE9yIChCKSBieSBqdXN0IG1hcHBpbmcgYWxsIG9mICdkdCcg YXMgJ3RvJy4KKworICAgSWYgJ2R0JyBjb250YWlucyBzZXZlcmFsIGFsbG9jYXRhYmxlIGNv bXBvbmVudHMgYW5kIG5vdCBtdWNoIG90aGVyIGRhdGEsCisgICAoQSkgaXMgbW9yZSBlZmZp Y2llbnQuIElmICdkdCcgY29udGFpbnMgYSBsYXJnZSBjb25zdC1zaXplIGFycmF5LCAoQSkg d2lsbAorICAgY29weSBpdCB0byB0aGUgZGV2aWNlIGluc3RlYWQgb2Ygb25seSAnYWxsb2Mn YXRpbmcgaXQuCisKKyAgIElNUExFTUVOVEFUSU9OIENIT0lDRTogV2UgZG8gKEEpLiBJdCBh dm9pZHMgdGhlIHJlZi1jb3VudCBpc3N1ZSBhbmQgaXQgaXMKKyAgIGV4cGVjdGVkIHRoYXQs IGZvciByZWFsLXdvcmxkIGNvZGUsIGRlcml2ZWQgdHlwZXMgd2l0aCBhbGxvY2F0YWJsZQor ICAgY29tcG9uZW50cyBvbmx5IGhhdmUgZmV3IG90aGVyIGNvbXBvbmVudHMgYW5kIGVpdGhl ciBubyBjb25zdC1zaXplIGFycmF5cy4KKyAgIFRoaXMgY29weWluZyBpcyBkb25lIGlycmVz cGVjdGl2ZWx5IHdoZXRoZXIgdGhlIGFsbG9jYXRhYmxlcyBhcmUgYWxsb2NhdGVkLgorCisg ICBJZiB1c2VycyB3YW50ZWQgdG8gc2F2ZSBtZW1vcnksIHRoZXkgaGF2ZSB0byB1c2UgJ21h cChhbGxvYzpkdCVjb21wKScgYXMKKyAgIGFsc28gd2l0aCAnbWFwKGFsbG9jOmR0KScgYWxs IGNvbXBvbmVudHMgZ2V0IGNvcGllZC4KKworICAgRm9yIHRoZSBjb3B5IHRvIHRoZSBkZXZp Y2UsIG9ubHkgYWxsb2NhdGFibGUgYXJyYXlzIGFyZSByZWxldmFudCBhcyB0aGVpcgorICAg dGhlIGJvdW5kcyBhcmUgcmVxdWlyZWQ7IHRoZSBwb2ludGVyIGlzIHNldCBzZXBhcmF0ZWx5 IChHT01QX01BUF9BVFRBQ0gpCisgICBhbmQgdGhlIG9ubHkgc2V0dGluZyByZXF1aXJlZCBm b3Igc2NhbGFycy4gSG93ZXZlciwgd2hlbiBsYXRlciBjb3B5aW5nIG91dAorICAgb2YgdGhl IGRldmljZSwgYW4gdW5hbGxvY2F0ZWQgYWxsb2NhdGFibGUgbXVzdCByZW1haW4gdW5hbGxv Y2F0ZWQvTlVMTCBvbgorICAgdGhlIGhvc3Q7IHRvIGFjaGlldmUgdGhpcyB3ZSBhbHNvIG11 c3QgaGF2ZSBpdCBzZXQgdG8gTlVMTCBvbiB0aGUgZGV2aWNlCisgICB0byBhdm9pZCBpc3N1 ZXMgd2l0aCB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyBjb3BpZWQgYmFjayBmb3IgdGhl IHBvaW50ZXIKKyAgIGFkZHJlc3MuIElmIHdlIGNvdWxkIHNldCB0aGUgcG9pbnRlciB0byBO VUxMLCBnZmNfaGFzX2FsbG9jX2NvbXBzJ3MKKyAgIHNoYWxsb3dfYWxsb2Nfb25seSBjb3Vs ZCBiZSByZXN0cmljdGVkIHRvIHJldHVybiB0cnVlIG9ubHkgZm9yIGFycmF5cy4KKworICAg V2Ugb25seSBuZWVkIHRvIHJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbGxvY2F0YWJsZS1h cnJheSBjb21wb25lbnRzLiAqLworCitzdGF0aWMgYm9vbAorZ2ZjX29tcF9yZXBsYWNlX2Fs bG9jX2J5X3RvX21hcHBpbmcgKHRyZWUgdHlwZSwgdHJlZSBkZWNsLCBib29sIHB0cl9vaykK K3sKKyAgcmV0dXJuIGdmY19oYXNfYWxsb2NfY29tcHMgKHR5cGUsIGRlY2wsIHB0cl9vaywg dHJ1ZSk7Cit9CisKIC8qIFJldHVybiB0cnVlIGlmIFRZUEUgaXMgcG9seW1vcnBoaWMgYnV0 IG5vdCB3aXRoIHBvaW50ZXIgYXR0cmlidXRlLiAgKi8KIAogc3RhdGljIGJvb2wKQEAgLTI3 MzAsNyArMjc3MSwxNSBAQCBnZmNfb21wX2RlZXBfbWFwcGluZ19pdGVtIChib29sIGlzX2Nu dCwgYm9vbCBkb19jb3B5LCBib29sIGRvX2FsbG9jX2NoZWNrLAogCSAgdG1wID0gZ2ZjX2Nv bnZfZGVzY3JpcHRvcl9kYXRhX2dldCAodG1wKTsKIAl9CiAKLSAgICAgIGdmY19vbXBfZGVl cF9tYXBwaW5nX21hcCAodG1wLCBieXRlc2l6ZSwgdGtpbmQsIGxvYywgZGF0YV9hcnJheSwK KyAgICAgIC8qIEZvciBwb2x5bW9ycGhpYywgYSBleHRlbmRlZCB0eXBlIG1heSBoYXZlIGFs bG9jYXRhYmxlIGNvbXBvbmVudHM7CisJIHNlZSBjb21tZW50IGJlZm9yZSBnZmNfb21wX3Jl cGxhY2VfYWxsb2NfYnlfdG9fbWFwcGluZy4gICovCisgICAgICB1bnNpZ25lZCBIT1NUX1dJ REVfSU5UIHRraW5kMiA9IHRraW5kOworICAgICAgaWYgKHRraW5kID09IEdPTVBfTUFQX0FM TE9DKQorCXRraW5kMiA9IEdPTVBfTUFQX1RPOworICAgICAgZWxzZSBpZiAodGtpbmQgPT0g R09NUF9NQVBfRlJPTQorCSAgICAgICAmJiBnaW1wbGVfb21wX3RhcmdldF9raW5kIChjdHgp ICE9IEdGX09NUF9UQVJHRVRfS0lORF9FWElUX0RBVEEpCisJdGtpbmQyID0gR09NUF9NQVBf VE9GUk9NOworICAgICAgZ2ZjX29tcF9kZWVwX21hcHBpbmdfbWFwICh0bXAsIGJ5dGVzaXpl LCB0a2luZDIsIGxvYywgZGF0YV9hcnJheSwKIAkJCQlzaXplc19hcnJheSwga2luZHNfYXJy YXksIG9mZnNldF9kYXRhLAogCQkJCW9mZnNldCwgc2VxLCBjdHgpOwogICAgIH0KQEAgLTI3 NTUsNyArMjgwNCwxNiBAQCBnZmNfb21wX2RlZXBfbWFwcGluZ19pdGVtIChib29sIGlzX2Nu dCwgYm9vbCBkb19jb3B5LCBib29sIGRvX2FsbG9jX2NoZWNrLAogCSAgdG1wID0gZGVjbDsK IAkgIGJ5dGVzaXplID0gVFlQRV9TSVpFX1VOSVQgKFRSRUVfVFlQRSAoZGVjbCkpOwogCX0K LSAgICAgIGdmY19vbXBfZGVlcF9tYXBwaW5nX21hcCAodG1wLCBieXRlc2l6ZSwgdGtpbmQs IGxvYywgZGF0YV9hcnJheSwKKyAgICAgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgdGtpbmQy ID0gdGtpbmQ7CisgICAgICBpZiAoIWlzX2NudAorCSAgJiYgKHRraW5kID09IEdPTVBfTUFQ X0FMTE9DCisJICAgICAgfHwgKHRraW5kID09IEdPTVBfTUFQX0ZST00KKwkJICAmJiAoZ2lt cGxlX29tcF90YXJnZXRfa2luZCAoY3R4KQorCQkgICAgICAhPSBHRl9PTVBfVEFSR0VUX0tJ TkRfRVhJVF9EQVRBKSkpCisJICAmJiBnZmNfb21wX3JlcGxhY2VfYWxsb2NfYnlfdG9fbWFw cGluZyAoVFJFRV9UWVBFIChkZWNsKSwgZGVjbCwgdHJ1ZSkpCisJdGtpbmQyID0gdGtpbmQg PT0gR09NUF9NQVBfQUxMT0MgPyBHT01QX01BUF9UTyA6IEdPTVBfTUFQX1RPRlJPTTsKKwor ICAgICAgZ2ZjX29tcF9kZWVwX21hcHBpbmdfbWFwICh0bXAsIGJ5dGVzaXplLCB0a2luZDIs IGxvYywgZGF0YV9hcnJheSwKIAkJCQlzaXplc19hcnJheSwga2luZHNfYXJyYXksIG9mZnNl dF9kYXRhLAogCQkJCW9mZnNldCwgc2VxLCBjdHgpOwogICAgIH0KQEAgLTI4ODksOSArMjk0 Nyw5IEBAIGdmY19vbXBfZGVlcF9tYXBfa2luZF9wICh0cmVlIGNsYXVzZSkKICAgICBjYXNl IEdPTVBfTUFQX0FMV0FZU19QUkVTRU5UX0ZST006CiAgICAgY2FzZSBHT01QX01BUF9BTFdB WVNfUFJFU0VOVF9UT0ZST006CiAgICAgY2FzZSBHT01QX01BUF9GSVJTVFBSSVZBVEU6Ci0g ICAgICByZXR1cm4gdHJ1ZTsKICAgICBjYXNlIEdPTVBfTUFQX0FMTE9DOgogICAgIGNhc2Ug R09NUF9NQVBfUFJFU0VOVF9BTExPQzoKKyAgICAgIHJldHVybiB0cnVlOwogICAgIGNhc2Ug R09NUF9NQVBfUE9JTlRFUjoKICAgICBjYXNlIEdPTVBfTUFQX1RPX1BTRVQ6CiAgICAgY2Fz ZSBHT01QX01BUF9GT1JDRV9QUkVTRU5UOgpAQCAtMzAwNCw2ICszMDYyLDIxIEBAIGdmY19v bXBfZGVlcF9tYXBwaW5nX2RvIChib29sIGlzX2NudCwgY29uc3QgZ2ltcGxlICpjdHgsIHRy ZWUgY2xhdXNlLAogICB0cmVlIGRlY2wgPSBnZmNfb21wX2RlZXBfbWFwcGluZ19pbnRfcCAo Y3R4LCBjbGF1c2UpOwogICBpZiAoZGVjbCA9PSBOVUxMX1RSRUUpCiAgICAgcmV0dXJuIE5V TExfVFJFRTsKKyAgLyogSGFuZGxlOiBtYXAoYWxsb2M6ZHQlY21wIFtsZW46IHB0cl9zaXpl XSkgbWFwKHRvZnJvbTogRC4wMTIzLi4uKSwKKyAgICAgd2hlcmUgR0ZDX0RFQ0xfU0FWRURf REVTQ1JJUFRPUihELjAxMjMpIGlzIHRoZSBzYW1lIChoZXJlOiBkdCVjbXApLiAgKi8KKyAg aWYgKE9NUF9DTEFVU0VfTUFQX0tJTkQgKGNsYXVzZSkgPT0gR09NUF9NQVBfQUxMT0MKKyAg ICAgIHx8IE9NUF9DTEFVU0VfTUFQX0tJTkQgKGNsYXVzZSkgPT0gR09NUF9NQVBfUFJFU0VO VF9BTExPQykKKyAgICB7CisgICAgICB0cmVlIGMgPSBjbGF1c2U7CisgICAgICB3aGlsZSAo KGMgPSBPTVBfQ0xBVVNFX0NIQUlOIChjKSkgIT0gTlVMTF9UUkVFKQorCXsKKwkgIGlmICgh Z2ZjX29tcF9kZWVwX21hcF9raW5kX3AgKGMpKQorCSAgICBjb250aW51ZTsKKwkgIHRyZWUg ZCA9IGdmY19vbXBfZGVlcF9tYXBwaW5nX2ludF9wIChjdHgsIGMpOworCSAgaWYgKGQgIT0g TlVMTF9UUkVFICYmIG9wZXJhbmRfZXF1YWxfcCAoZGVjbCwgZCwgMCkpCisJICAgIHJldHVy biBOVUxMX1RSRUU7CisJfQorICAgIH0KICAgdHJlZSB0eXBlID0gVFJFRV9UWVBFIChkZWNs KTsKICAgaWYgKFBPSU5URVJfVFlQRV9QICh0eXBlKSkKICAgICB0eXBlID0gVFJFRV9UWVBF ICh0eXBlKTsKQEAgLTMwNDQsNiArMzExNywxNSBAQCBnZmNfb21wX2RlZXBfbWFwcGluZ19k byAoYm9vbCBpc19jbnQsIGNvbnN0IGdpbXBsZSAqY3R4LCB0cmVlIGNsYXVzZSwKIAkgICAg ICB8fCBHRkNfVFlQRV9BUlJBWV9BS0lORCAodHlwZSkgPT0gR0ZDX0FSUkFZX1BPSU5URVJf Q09OVCkpKQogICAgIGRvX2FsbG9jX2NoZWNrID0gdHJ1ZTsKIAorICBpZiAoIWlzX2NudAor ICAgICAgJiYgKHRraW5kID09IEdPTVBfTUFQX0FMTE9DCisJICB8fCAodGtpbmQgPT0gR09N UF9NQVBfRlJPTQorCSAgICAgICYmIChnaW1wbGVfb21wX3RhcmdldF9raW5kIChjdHgpCisJ CSAgIT0gR0ZfT01QX1RBUkdFVF9LSU5EX0VYSVRfREFUQSkpKQorICAgICAgJiYgKHBvbHkg fHwgZ2ZjX29tcF9yZXBsYWNlX2FsbG9jX2J5X3RvX21hcHBpbmcgKHR5cGUsIHRtcCwgdHJ1 ZSkpKQorICAgIE9NUF9DTEFVU0VfU0VUX01BUF9LSU5EIChjbGF1c2UsIHRraW5kID09IEdP TVBfTUFQX0FMTE9DID8gR09NUF9NQVBfVE8KKwkJCQkJCQkgICAgIDogR09NUF9NQVBfVE9G Uk9NKTsKKwogICAvKiBUT0RPOiBGb3IgbWFwKGEoOikpLCB3ZSBrbm93IGl0IGlzIHByZXNl bnQgJiBhbGxvY2F0ZWQuICAqLwogCiAgIHRyZWUgcHJlc2VudCA9IChERUNMX1AgKGRlY2wp ID8gZ2ZjX29tcF9jaGVja19vcHRpb25hbF9hcmd1bWVudCAoZGVjbCwgdHJ1ZSkKQEAgLTMw NzEsNyArMzE1Myw3IEBAIGdmY19vbXBfZGVlcF9tYXBwaW5nX2RvIChib29sIGlzX2NudCwg Y29uc3QgZ2ltcGxlICpjdHgsIHRyZWUgY2xhdXNlLAogICAgIGdmY19vbXBfZGVlcF9tYXBw aW5nX2l0ZW0gKGlzX2NudCwgZG9fY29weSwgZG9fYWxsb2NfY2hlY2ssIGxvYywgZGVjbCwK IAkJCSAgICAgICAmdG9rZW4sIHRraW5kLCBkYXRhLCBzaXplcywga2luZHMsIG9mZnNldF9k YXRhLAogCQkJICAgICAgIG9mZnNldCwgbnVtLCBzZXEsIGN0eCk7Ci0gIC8qIERvdWJsZTog TWFwICsgcG9pbnRlciBhc3NpZ24uICAqLworICAvKiBNdWx0aXBseSBieSAyIGFzIHRoZXJl IGFyZSB0d28gbWFwcGluZ3M6IGRhdGEgKyBwb2ludGVyIGFzc2lnbi4gICovCiAgIGlmIChp c19jbnQpCiAgICAgZ2ltcGxpZnlfYXNzaWduIChudW0sCiAJCSAgICAgZm9sZF9idWlsZDJf bG9jIChpbnB1dF9sb2NhdGlvbiwgTVVMVF9FWFBSLApkaWZmIC0tZ2l0IGEvbGliZ29tcC9D aGFuZ2VMb2cub21wIGIvbGliZ29tcC9DaGFuZ2VMb2cub21wCmluZGV4IDJiMGI0YzcxZTlk Li5hY2U1NGYyZjgyZiAxMDA2NDQKLS0tIGEvbGliZ29tcC9DaGFuZ2VMb2cub21wCisrKyBi L2xpYmdvbXAvQ2hhbmdlTG9nLm9tcApAQCAtMSwzICsxLDcgQEAKKzIwMjMtMDMtMjMgIFRv YmlhcyBCdXJudXMgIDx0b2JpYXNAY29kZXNvdXJjZXJ5LmNvbT4KKworCSogdGVzdHN1aXRl L2xpYmdvbXAuZm9ydHJhbi9tYXAtYWxsb2MtY29tcC04LmY5MDogTmV3IHRlc3QuCisKIDIw MjMtMDMtMTAgIFRob21hcyBTY2h3aW5nZSAgPHRob21hc0Bjb2Rlc291cmNlcnkuY29tPgog CiAJQmFja3BvcnRlZCBmcm9tIG1hc3RlcjoKZGlmZiAtLWdpdCBhL2xpYmdvbXAvdGVzdHN1 aXRlL2xpYmdvbXAuZm9ydHJhbi9tYXAtYWxsb2MtY29tcC04LmY5MCBiL2xpYmdvbXAvdGVz dHN1aXRlL2xpYmdvbXAuZm9ydHJhbi9tYXAtYWxsb2MtY29tcC04LmY5MApuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOWMzYzZkNDlkYWEKLS0tIC9kZXYvbnVs bAorKysgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4vbWFwLWFsbG9jLWNv bXAtOC5mOTAKQEAgLTAsMCArMSwyNjggQEAKK21vZHVsZSBtCisgIGltcGxpY2l0IG5vbmUg KHR5cGUsIGV4dGVybmFsKQorICB0eXBlIHQKKyAgICBpbnRlZ2VyLCBhbGxvY2F0YWJsZSA6 OiBBKDopCisgIGVuZCB0eXBlIHQKKyAgdHlwZSB0MgorICAgIHR5cGUodCksIGFsbG9jYXRh YmxlIDo6IHZUCisgICAgaW50ZWdlciwgYWxsb2NhdGFibGUgOjogeAorICBlbmQgdHlwZSB0 MgorCitjb250YWlucworCisgIHN1YnJvdXRpbmUgdGVzdF9hbGxvYygpCisgICAgdHlwZSh0 KSA6OiB2YXIKKyAgICB0eXBlKHQpLCBhbGxvY2F0YWJsZSA6OiB2YXIyCisgICAgCisgICAg YWxsb2NhdGUodmFyMikKKyAgICBhbGxvY2F0ZSh2YXIlQSg0KSwgdmFyMiVBKDUpKQorCisg ICAgISRvbXAgdGFyZ2V0IGVudGVyIGRhdGEgbWFwKGFsbG9jOiB2YXIsIHZhcjIpCisgICAg ISRvbXAgdGFyZ2V0CisgICAgICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhcjIpKSBzdG9wIDEK KyAgICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFyJUEpKSBzdG9wIDIKKyAgICAgIGlmICgu bm90LiBhbGxvY2F0ZWQoVmFyMiVBKSkgc3RvcCAzCisgICAgICBpZiAobGJvdW5kKHZhciVB LCAxKSAvPSAxIC5vci4gdWJvdW5kKHZhciVBLCAxKSAvPSA0KSBzdG9wIDQKKyAgICAgIGlm IChsYm91bmQodmFyMiVBLCAxKSAvPSAxIC5vci4gdWJvdW5kKHZhcjIlQSwgMSkgLz0gNSkg c3RvcCA1CisgICAgICB2YXIlQSA9IFsxLDIsMyw0XQorICAgICAgdmFyMiVBID0gWzExLDIy LDMzLDQ0LDU1XQorICAgICEkb21wIGVuZCB0YXJnZXQKKyAgICAhJG9tcCB0YXJnZXQgZXhp dCBkYXRhIG1hcChmcm9tOiB2YXIsIHZhcjIpCisKKyAgICBpZiAoLm5vdC4gYWxsb2NhdGVk KFZhcjIpKSBlcnJvciBzdG9wCisgICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIlQSkpIGVy cm9yIHN0b3AKKyAgICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhcjIlQSkpIGVycm9yIHN0b3AK KyAgICBpZiAobGJvdW5kKHZhciVBLCAxKSAvPSAxIC5vci4gdWJvdW5kKHZhciVBLCAxKSAv PSA0KSBlcnJvciBzdG9wCisgICAgaWYgKGxib3VuZCh2YXIyJUEsIDEpIC89IDEgLm9yLiB1 Ym91bmQodmFyMiVBLCAxKSAvPSA1KSBlcnJvciBzdG9wCisgICAgaWYgKGFueSh2YXIlQSAv PSBbMSwyLDMsNF0pKSBlcnJvciBzdG9wCisgICAgaWYgKGFueSh2YXIyJUEgLz0gWzExLDIy LDMzLDQ0LDU1XSkpIGVycm9yIHN0b3AKKyAgZW5kIHN1YnJvdXRpbmUgdGVzdF9hbGxvYwor CisgIHN1YnJvdXRpbmUgdGVzdDJfYWxsb2MoKQorICAgIHR5cGUodDIpIDo6IHZhcgorICAg IHR5cGUodDIpLCBhbGxvY2F0YWJsZSA6OiB2YXIyCisgICAgCisgICAgYWxsb2NhdGUodmFy MikKKyAgICBhbGxvY2F0ZSh2YXIleCwgdmFyMiV4KQorCisgICAgISRvbXAgdGFyZ2V0IGVu dGVyIGRhdGEgbWFwKGFsbG9jOiB2YXIsIHZhcjIpCisgICAgISRvbXAgdGFyZ2V0CisgICAg ICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhcjIpKSBzdG9wIDYKKyAgICAgIGlmICgubm90LiBh bGxvY2F0ZWQoVmFyJXgpKSBzdG9wIDcKKyAgICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFy MiV4KSkgc3RvcCA4CisgICAgICB2YXIleCA9IDQyCisgICAgICB2YXIyJXggPSA0MworICAg ICEkb21wIGVuZCB0YXJnZXQKKyAgICAhJG9tcCB0YXJnZXQgZXhpdCBkYXRhIG1hcChmcm9t OiB2YXIsIHZhcjIpCisKKyAgICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhcjIpKSBlcnJvciBz dG9wCisgICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIleCkpIGVycm9yIHN0b3AKKyAgICBp ZiAoLm5vdC4gYWxsb2NhdGVkKFZhcjIleCkpIGVycm9yIHN0b3AKKyAgICBpZiAodmFyJXgg Lz0gNDIpIGVycm9yIHN0b3AKKyAgICBpZiAodmFyMiV4IC89IDQzKSBlcnJvciBzdG9wCisK KyAgICBhbGxvY2F0ZSh2YXIldnQsIHZhcjIldnQpCisgICAgYWxsb2NhdGUodmFyJXZ0JUEo LTE6MyksIHZhcjIldnQlQSgwOjQpKQorCisgICAgISRvbXAgdGFyZ2V0IGVudGVyIGRhdGEg bWFwKGFsbG9jOiB2YXIsIHZhcjIpCisgICAgISRvbXAgdGFyZ2V0CisgICAgICBpZiAoLm5v dC4gYWxsb2NhdGVkKFZhcjIpKSBzdG9wIDExCisgICAgICBpZiAoLm5vdC4gYWxsb2NhdGVk KFZhciV4KSkgc3RvcCAxMgorICAgICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIyJXgpKSBz dG9wIDEzCisgICAgICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhciV2dCkpIHN0b3AgMTQKKyAg ICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFyMiV2dCkpIHN0b3AgMTUKKyAgICAgIGlmICgu bm90LiBhbGxvY2F0ZWQoVmFyJXZ0JWEpKSBzdG9wIDE2CisgICAgICBpZiAoLm5vdC4gYWxs b2NhdGVkKFZhcjIldnQlYSkpIHN0b3AgMTcKKyAgICAgIHZhciV4ID0gNDIKKyAgICAgIHZh cjIleCA9IDQzCisgICAgICBpZiAobGJvdW5kKHZhciV2dCVBLCAxKSAvPSAtMSAub3IuIHVi b3VuZCh2YXIldnQlQSwgMSkgLz0gMykgc3RvcCA0CisgICAgICBpZiAobGJvdW5kKHZhcjIl dnQlQSwgMSkgLz0gMCAub3IuIHVib3VuZCh2YXIyJXZ0JUEsIDEpIC89IDQpIHN0b3AgNQor ICAgICAgdmFyJXZ0JUEgPSBbMSwyLDMsNCw1XQorICAgICAgdmFyMiV2dCVBID0gWzExLDIy LDMzLDQ0LDU1XQorICAgICEkb21wIGVuZCB0YXJnZXQKKyAgICAhJG9tcCB0YXJnZXQgZXhp dCBkYXRhIG1hcChmcm9tOiB2YXIsIHZhcjIpCisKKyAgICBpZiAoLm5vdC4gYWxsb2NhdGVk KFZhcjIpKSBlcnJvciBzdG9wCisgICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIleCkpIGVy cm9yIHN0b3AKKyAgICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhcjIleCkpIGVycm9yIHN0b3AK KyAgICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhciV2dCkpIGVycm9yIHN0b3AKKyAgICBpZiAo Lm5vdC4gYWxsb2NhdGVkKFZhcjIldnQpKSBlcnJvciBzdG9wCisgICAgaWYgKC5ub3QuIGFs bG9jYXRlZChWYXIldnQlYSkpIGVycm9yIHN0b3AKKyAgICBpZiAoLm5vdC4gYWxsb2NhdGVk KFZhcjIldnQlYSkpIGVycm9yIHN0b3AKKyAgICBpZiAodmFyJXggLz0gNDIpIGVycm9yIHN0 b3AKKyAgICBpZiAodmFyMiV4IC89IDQzKSBlcnJvciBzdG9wCisgICAgaWYgKGxib3VuZCh2 YXIldnQlQSwgMSkgLz0gLTEgLm9yLiB1Ym91bmQodmFyJXZ0JUEsIDEpIC89IDMpIGVycm9y IHN0b3AKKyAgICBpZiAobGJvdW5kKHZhcjIldnQlQSwgMSkgLz0gMCAub3IuIHVib3VuZCh2 YXIyJXZ0JUEsIDEpIC89IDQpIGVycm9yIHN0b3AKKyAgICBpZiAoYW55KHZhciV2dCVBIC89 IFsxLDIsMyw0LDVdKSkgZXJyb3Igc3RvcAorICAgIGlmIChhbnkodmFyMiV2dCVBIC89IFsx MSwyMiwzMyw0NCw1NV0pKSBlcnJvciBzdG9wCisgIGVuZCBzdWJyb3V0aW5lIHRlc3QyX2Fs bG9jCisKKworICBzdWJyb3V0aW5lIHRlc3RfYWxsb2NfdGFyZ2V0KCkKKyAgICB0eXBlKHQp IDo6IHZhcgorICAgIHR5cGUodCksIGFsbG9jYXRhYmxlIDo6IHZhcjIKKyAgICAKKyAgICBh bGxvY2F0ZSh2YXIyKQorICAgIGFsbG9jYXRlKHZhciVBKDQpLCB2YXIyJUEoNSkpCisKKyAg ICAhJG9tcCB0YXJnZXQgbWFwKGFsbG9jOiB2YXIsIHZhcjIpCisgICAgICBpZiAoLm5vdC4g YWxsb2NhdGVkKFZhcjIpKSBzdG9wIDEKKyAgICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFy JUEpKSBzdG9wIDIKKyAgICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFyMiVBKSkgc3RvcCAz CisgICAgICBpZiAobGJvdW5kKHZhciVBLCAxKSAvPSAxIC5vci4gdWJvdW5kKHZhciVBLCAx KSAvPSA0KSBzdG9wIDQKKyAgICAgIGlmIChsYm91bmQodmFyMiVBLCAxKSAvPSAxIC5vci4g dWJvdW5kKHZhcjIlQSwgMSkgLz0gNSkgc3RvcCA1CisgICAgICB2YXIlQSA9IFsxLDIsMyw0 XQorICAgICAgdmFyMiVBID0gWzExLDIyLDMzLDQ0LDU1XQorICAgICEkb21wIGVuZCB0YXJn ZXQKKworICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFyMikpIGVycm9yIHN0b3AKKyAgICBp ZiAoLm5vdC4gYWxsb2NhdGVkKFZhciVBKSkgZXJyb3Igc3RvcAorICAgIGlmICgubm90LiBh bGxvY2F0ZWQoVmFyMiVBKSkgZXJyb3Igc3RvcAorICAgIGlmIChsYm91bmQodmFyJUEsIDEp IC89IDEgLm9yLiB1Ym91bmQodmFyJUEsIDEpIC89IDQpIGVycm9yIHN0b3AKKyAgICBpZiAo bGJvdW5kKHZhcjIlQSwgMSkgLz0gMSAub3IuIHVib3VuZCh2YXIyJUEsIDEpIC89IDUpIGVy cm9yIHN0b3AKKyAgZW5kIHN1YnJvdXRpbmUgdGVzdF9hbGxvY190YXJnZXQKKworICBzdWJy b3V0aW5lIHRlc3QyX2FsbG9jX3RhcmdldCgpCisgICAgdHlwZSh0MikgOjogdmFyCisgICAg dHlwZSh0MiksIGFsbG9jYXRhYmxlIDo6IHZhcjIKKyAgICAKKyAgICBhbGxvY2F0ZSh2YXIy KQorICAgIGFsbG9jYXRlKHZhciV4LCB2YXIyJXgpCisKKyAgICAhJG9tcCB0YXJnZXQgbWFw KGFsbG9jOiB2YXIsIHZhcjIpCisgICAgICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhcjIpKSBz dG9wIDYKKyAgICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFyJXgpKSBzdG9wIDcKKyAgICAg IGlmICgubm90LiBhbGxvY2F0ZWQoVmFyMiV4KSkgc3RvcCA4CisgICAgICB2YXIleCA9IDQy CisgICAgICB2YXIyJXggPSA0MworICAgICEkb21wIGVuZCB0YXJnZXQKKworICAgIGlmICgu bm90LiBhbGxvY2F0ZWQoVmFyMikpIGVycm9yIHN0b3AKKyAgICBpZiAoLm5vdC4gYWxsb2Nh dGVkKFZhciV4KSkgZXJyb3Igc3RvcAorICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFyMiV4 KSkgZXJyb3Igc3RvcAorCisgICAgYWxsb2NhdGUodmFyJXZ0LCB2YXIyJXZ0KQorICAgIGFs bG9jYXRlKHZhciV2dCVBKC0xOjMpLCB2YXIyJXZ0JUEoMDo0KSkKKworICAgICEkb21wIHRh cmdldCBtYXAoYWxsb2M6IHZhciwgdmFyMikKKyAgICAgIGlmICgubm90LiBhbGxvY2F0ZWQo VmFyMikpIHN0b3AgMTEKKyAgICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFyJXgpKSBzdG9w IDEyCisgICAgICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhcjIleCkpIHN0b3AgMTMKKyAgICAg IGlmICgubm90LiBhbGxvY2F0ZWQoVmFyJXZ0KSkgc3RvcCAxNAorICAgICAgaWYgKC5ub3Qu IGFsbG9jYXRlZChWYXIyJXZ0KSkgc3RvcCAxNQorICAgICAgaWYgKC5ub3QuIGFsbG9jYXRl ZChWYXIldnQlYSkpIHN0b3AgMTYKKyAgICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFyMiV2 dCVhKSkgc3RvcCAxNworICAgICAgdmFyJXggPSA0MgorICAgICAgdmFyMiV4ID0gNDMKKyAg ICAgIGlmIChsYm91bmQodmFyJXZ0JUEsIDEpIC89IC0xIC5vci4gdWJvdW5kKHZhciV2dCVB LCAxKSAvPSAzKSBzdG9wIDQKKyAgICAgIGlmIChsYm91bmQodmFyMiV2dCVBLCAxKSAvPSAw IC5vci4gdWJvdW5kKHZhcjIldnQlQSwgMSkgLz0gNCkgc3RvcCA1CisgICAgICB2YXIldnQl QSA9IFsxLDIsMyw0LDVdCisgICAgICB2YXIyJXZ0JUEgPSBbMTEsMjIsMzMsNDQsNTVdCisg ICAgISRvbXAgZW5kIHRhcmdldAorCisgICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIyKSkg ZXJyb3Igc3RvcAorICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFyJXgpKSBlcnJvciBzdG9w CisgICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIyJXgpKSBlcnJvciBzdG9wCisgICAgaWYg KC5ub3QuIGFsbG9jYXRlZChWYXIldnQpKSBlcnJvciBzdG9wCisgICAgaWYgKC5ub3QuIGFs bG9jYXRlZChWYXIyJXZ0KSkgZXJyb3Igc3RvcAorICAgIGlmICgubm90LiBhbGxvY2F0ZWQo VmFyJXZ0JWEpKSBlcnJvciBzdG9wCisgICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIyJXZ0 JWEpKSBlcnJvciBzdG9wCisgICAgaWYgKGxib3VuZCh2YXIldnQlQSwgMSkgLz0gLTEgLm9y LiB1Ym91bmQodmFyJXZ0JUEsIDEpIC89IDMpIGVycm9yIHN0b3AKKyAgICBpZiAobGJvdW5k KHZhcjIldnQlQSwgMSkgLz0gMCAub3IuIHVib3VuZCh2YXIyJXZ0JUEsIDEpIC89IDQpIGVy cm9yIHN0b3AKKyAgZW5kIHN1YnJvdXRpbmUgdGVzdDJfYWxsb2NfdGFyZ2V0CisKKworCisg IHN1YnJvdXRpbmUgdGVzdF9mcm9tKCkKKyAgICB0eXBlKHQpIDo6IHZhcgorICAgIHR5cGUo dCksIGFsbG9jYXRhYmxlIDo6IHZhcjIKKyAgICAKKyAgICBhbGxvY2F0ZSh2YXIyKQorICAg IGFsbG9jYXRlKHZhciVBKDQpLCB2YXIyJUEoNSkpCisKKyAgICAhJG9tcCB0YXJnZXQgbWFw KGZyb206IHZhciwgdmFyMikKKyAgICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFyMikpIHN0 b3AgMQorICAgICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIlQSkpIHN0b3AgMgorICAgICAg aWYgKC5ub3QuIGFsbG9jYXRlZChWYXIyJUEpKSBzdG9wIDMKKyAgICAgIGlmIChsYm91bmQo dmFyJUEsIDEpIC89IDEgLm9yLiB1Ym91bmQodmFyJUEsIDEpIC89IDQpIHN0b3AgNAorICAg ICAgaWYgKGxib3VuZCh2YXIyJUEsIDEpIC89IDEgLm9yLiB1Ym91bmQodmFyMiVBLCAxKSAv PSA1KSBzdG9wIDUKKyAgICAgIHZhciVBID0gWzEsMiwzLDRdCisgICAgICB2YXIyJUEgPSBb MTEsMjIsMzMsNDQsNTVdCisgICAgISRvbXAgZW5kIHRhcmdldAorCisgICAgaWYgKC5ub3Qu IGFsbG9jYXRlZChWYXIyKSkgZXJyb3Igc3RvcAorICAgIGlmICgubm90LiBhbGxvY2F0ZWQo VmFyJUEpKSBlcnJvciBzdG9wCisgICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIyJUEpKSBl cnJvciBzdG9wCisgICAgaWYgKGxib3VuZCh2YXIlQSwgMSkgLz0gMSAub3IuIHVib3VuZCh2 YXIlQSwgMSkgLz0gNCkgZXJyb3Igc3RvcAorICAgIGlmIChsYm91bmQodmFyMiVBLCAxKSAv PSAxIC5vci4gdWJvdW5kKHZhcjIlQSwgMSkgLz0gNSkgZXJyb3Igc3RvcAorICAgIGlmIChh bnkodmFyJUEgLz0gWzEsMiwzLDRdKSkgZXJyb3Igc3RvcAorICAgIGlmIChhbnkodmFyMiVB IC89IFsxMSwyMiwzMyw0NCw1NV0pKSBlcnJvciBzdG9wCisgIGVuZCBzdWJyb3V0aW5lIHRl c3RfZnJvbQorCisgIHN1YnJvdXRpbmUgdGVzdDJfZnJvbSgpCisgICAgdHlwZSh0MikgOjog dmFyCisgICAgdHlwZSh0MiksIGFsbG9jYXRhYmxlIDo6IHZhcjIKKyAgICAKKyAgICBhbGxv Y2F0ZSh2YXIyKQorICAgIGFsbG9jYXRlKHZhciV4LCB2YXIyJXgpCisKKyAgICAhJG9tcCB0 YXJnZXQgbWFwKGZyb206IHZhciwgdmFyMikKKyAgICAgIGlmICgubm90LiBhbGxvY2F0ZWQo VmFyMikpIHN0b3AgNgorICAgICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIleCkpIHN0b3Ag NworICAgICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIyJXgpKSBzdG9wIDgKKyAgICAgIHZh ciV4ID0gNDIKKyAgICAgIHZhcjIleCA9IDQzCisgICAgISRvbXAgZW5kIHRhcmdldAorCisg ICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIyKSkgZXJyb3Igc3RvcAorICAgIGlmICgubm90 LiBhbGxvY2F0ZWQoVmFyJXgpKSBlcnJvciBzdG9wCisgICAgaWYgKC5ub3QuIGFsbG9jYXRl ZChWYXIyJXgpKSBlcnJvciBzdG9wCisgICAgaWYgKHZhciV4IC89IDQyKSBlcnJvciBzdG9w CisgICAgaWYgKHZhcjIleCAvPSA0MykgZXJyb3Igc3RvcAorCisgICAgYWxsb2NhdGUodmFy JXZ0LCB2YXIyJXZ0KQorICAgIGFsbG9jYXRlKHZhciV2dCVBKC0xOjMpLCB2YXIyJXZ0JUEo MDo0KSkKKworICAgICEkb21wIHRhcmdldCBtYXAoZnJvbTogdmFyLCB2YXIyKQorICAgICAg aWYgKC5ub3QuIGFsbG9jYXRlZChWYXIyKSkgc3RvcCAxMQorICAgICAgaWYgKC5ub3QuIGFs bG9jYXRlZChWYXIleCkpIHN0b3AgMTIKKyAgICAgIGlmICgubm90LiBhbGxvY2F0ZWQoVmFy MiV4KSkgc3RvcCAxMworICAgICAgaWYgKC5ub3QuIGFsbG9jYXRlZChWYXIldnQpKSBzdG9w IDE0CisgICAgICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhcjIldnQpKSBzdG9wIDE1CisgICAg ICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhciV2dCVhKSkgc3RvcCAxNgorICAgICAgaWYgKC5u b3QuIGFsbG9jYXRlZChWYXIyJXZ0JWEpKSBzdG9wIDE3CisgICAgICB2YXIleCA9IDQyCisg ICAgICB2YXIyJXggPSA0MworICAgICAgaWYgKGxib3VuZCh2YXIldnQlQSwgMSkgLz0gLTEg Lm9yLiB1Ym91bmQodmFyJXZ0JUEsIDEpIC89IDMpIHN0b3AgNAorICAgICAgaWYgKGxib3Vu ZCh2YXIyJXZ0JUEsIDEpIC89IDAgLm9yLiB1Ym91bmQodmFyMiV2dCVBLCAxKSAvPSA0KSBz dG9wIDUKKyAgICAgIHZhciV2dCVBID0gWzEsMiwzLDQsNV0KKyAgICAgIHZhcjIldnQlQSA9 IFsxMSwyMiwzMyw0NCw1NV0KKyAgICAhJG9tcCBlbmQgdGFyZ2V0CisKKyAgICBpZiAoLm5v dC4gYWxsb2NhdGVkKFZhcjIpKSBlcnJvciBzdG9wCisgICAgaWYgKC5ub3QuIGFsbG9jYXRl ZChWYXIleCkpIGVycm9yIHN0b3AKKyAgICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhcjIleCkp IGVycm9yIHN0b3AKKyAgICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhciV2dCkpIGVycm9yIHN0 b3AKKyAgICBpZiAoLm5vdC4gYWxsb2NhdGVkKFZhcjIldnQpKSBlcnJvciBzdG9wCisgICAg aWYgKC5ub3QuIGFsbG9jYXRlZChWYXIldnQlYSkpIGVycm9yIHN0b3AKKyAgICBpZiAoLm5v dC4gYWxsb2NhdGVkKFZhcjIldnQlYSkpIGVycm9yIHN0b3AKKyAgICBpZiAodmFyJXggLz0g NDIpIGVycm9yIHN0b3AKKyAgICBpZiAodmFyMiV4IC89IDQzKSBlcnJvciBzdG9wCisgICAg aWYgKGxib3VuZCh2YXIldnQlQSwgMSkgLz0gLTEgLm9yLiB1Ym91bmQodmFyJXZ0JUEsIDEp IC89IDMpIGVycm9yIHN0b3AKKyAgICBpZiAobGJvdW5kKHZhcjIldnQlQSwgMSkgLz0gMCAu b3IuIHVib3VuZCh2YXIyJXZ0JUEsIDEpIC89IDQpIGVycm9yIHN0b3AKKyAgICBpZiAoYW55 KHZhciV2dCVBIC89IFsxLDIsMyw0LDVdKSkgZXJyb3Igc3RvcAorICAgIGlmIChhbnkodmFy MiV2dCVBIC89IFsxMSwyMiwzMyw0NCw1NV0pKSBlcnJvciBzdG9wCisgIGVuZCBzdWJyb3V0 aW5lIHRlc3QyX2Zyb20KKworZW5kIG1vZHVsZSBtCisKK3VzZSBtCisgIGltcGxpY2l0IG5v bmUgKHR5cGUsIGV4dGVybmFsKQorICBjYWxsIHRlc3RfYWxsb2MKKyAgY2FsbCB0ZXN0Ml9h bGxvYworICBjYWxsIHRlc3RfYWxsb2NfdGFyZ2V0CisgIGNhbGwgdGVzdDJfYWxsb2NfdGFy Z2V0CisKKyAgY2FsbCB0ZXN0X2Zyb20KKyAgY2FsbCB0ZXN0Ml9mcm9tCitlbmQK --------------kbswvlxoztqnD60VWnKmKzRk--