From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.180.0/23 X-Spam-Status: No, score=-4.0 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 9F7E11F462 for ; Thu, 25 Jul 2019 18:46:31 +0000 (UTC) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:reply-to:subject:to:cc:references:from :message-id:date:mime-version:in-reply-to:content-type; q=dns; s=default; b=xrcEHRt3GCt3UVsElk33iLJgBHiZw9lgoWvs8JpfkklLtjKm8K W8oF5YyFrTgm31aNvtmqfi/IAKtvQ1hFO62gEA0Qtg8i31m0TbWt3bTiAbIH9m25 rEJyIr7PXXAx9Mo1ZxNoY+rYv9Tfsl7JEPTYnOFyeupIFTWkWBqvnWNhQ= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:reply-to:subject:to:cc:references:from :message-id:date:mime-version:in-reply-to:content-type; s= default; bh=pL2VFCAz/R4oHUSavaFUir1QCEQ=; b=fZ0pgMscBZLLw1T+7ZRY 6/huU5rxsypwQeQfMz2SsoHhWGQ2N361hU0skGDjVClQlHKbD5FFTRBuMrWo1E3i pUCFS7TkTrtXXBzqSs6duiwzGZvasSbXh1615lCtED0kIYAdsYAO3LsVd6o6JtXD YDtgkEVgCbbrvpIJfqoNvlc= Received: (qmail 63897 invoked by alias); 25 Jul 2019 18:46:28 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 63887 invoked by uid 89); 25 Jul 2019 18:46:28 -0000 Authentication-Results: sourceware.org; auth=none X-HELO: relay1.mentorg.com Reply-To: Subject: Re: [PATCH 1/2][RFC] #17645, fix slow DSO sorting behavior in dynamic loader To: Florian Weimer CC: GNU C Library , References: <87h87crimv.fsf@oldenburg2.str.redhat.com> From: Chung-Lin Tang Message-ID: Date: Fri, 26 Jul 2019 02:46:15 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <87h87crimv.fsf@oldenburg2.str.redhat.com> Content-Type: multipart/mixed; boundary="------------14E000CABCA0C62AA63BC483" --------------14E000CABCA0C62AA63BC483 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit On 2019/7/23 9:21 PM, Florian Weimer wrote: > Is => intended to cover the case of run-time dependencies added late due > to lazy binding? > > Currently, those late dependencies have two effects, I think: They keep > around the referenced libraries longer than before (so that dlclose > would not remove an object which is still in used solely due to lazy > binding). And the ELF destructors are reordered to reflect these added > run-time dependencies. Yes, you can test that. The effect of => is to create a caller/callee relation between objects: 'x=>y' creates fn_x() and fn_y() in those two DSOs, and fn_x() has a call to fn_y(). Though that's the only immediate effect that => has. To construct a test of run-time added dependencies related to dlopen/etc. you also need to add those operations inside the '{}' construct. All the created DSOs have a constructor/destructor that outputs their single character name. The generated main() program prints '[]' brackets after dlopen/dlclose calls to separate out the following constructor/destructor output. So taken whole, the entire output string should capture all constructor/destructor activity and ordering behavior. > Can your test framework test both cases? What's your position on the > second effect? I think it sometimes results in destructors running not > in the opposite order of constructors, due to the new topological sort. > (This also happens with the current implementation.) What I did in the ld.so code patch was add a second pass of sorting that ignores runtime deps, prioritizing link dependencies; this appears to also be what prior discussion pointed towards, see more details in that 2nd email with the actual code patch. I have attached an updated patch here; fixed some bugs in the script related to the '@' operator for the main program construct. Thanks, Chung-Lin --------------14E000CABCA0C62AA63BC483 Content-Type: text/plain; charset="UTF-8"; x-mac-type=0; x-mac-creator=0; name="dlsort-01-tests-v2.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="dlsort-01-tests-v2.patch" ZGlmZiAtLWdpdCBhL2VsZi9NYWtlZmlsZSBiL2VsZi9NYWtlZmlsZQppbmRleCBhM2VlZmQx Li4xYzRlOTQxIDEwMDY0NAotLS0gYS9lbGYvTWFrZWZpbGUKKysrIGIvZWxmL01ha2VmaWxl CkBAIC0zODMsNiArMzgzLDQ4IEBAIHRlc3RzLXNwZWNpYWwgKz0gJChvYmpwZngpb3JkZXIt Y21wLm91dCAkKG9ianBmeCl0c3QtYXJyYXkxLWNtcC5vdXQgXAogCQkgJChvYmpwZngpdHN0 LXVudXNlZC1kZXAtY21wLm91dAogZW5kaWYKIAorIyBEU08gc29ydGluZyB0ZXN0czoKKyMg VGhlIGRzby1vcmRlcmluZy10ZXN0LnB5IHNjcmlwdCBnZW5lcmF0ZXMgdGVzdGNhc2Ugc291 cmNlIGZpbGVzIGluICQob2JqcGZ4KSwKKyMgYW5kIG91dHB1dHMgTWFrZWZpbGUgZnJhZ21l bnRzIGZvciB1c2UgaGVyZS4gSG93ZXZlciBiZWNhdXNlIG5vcm1hbCBvdXRwdXQKKyMgZnJv bSAkKHNoZWxsIC4uKSBoYXMgbmV3bGluZXMgY2hhbmdlZCBpbnRvIHNwYWNlcywgd2UgaGF2 ZSB0byBzYXZlIGl0IHRvIGEKKyMgdGVtcG9yYXJ5IGZpbGUgYW5kIHRoZW4gaW5jbHVkZSBp dC4gV2Ugd3JhcCB0aGlzIGVudGlyZSB0ZXN0Y2FzZSBjb25zdHJ1Y3Rpb24KKyMgaW50byBh IGZ1bmN0aW9uIGhlcmUgdG8gbWFrZSB0aGluZ3MgbW9yZSBjb252ZW5pZW50LgorZGVmaW5l IHRlc3RfZHNvX29yZGVyaW5nCiskKHNoZWxsICQoUFlUSE9OKSAkKC4uKXNjcmlwdHMvZHNv LW9yZGVyaW5nLXRlc3QucHkgXAorCSQoMikgJCgxKSAkKG9ianBmeCkgPiAkKG9ianBmeCkk KDEpLnRtcC1tYWtlZmlsZSkKKyQoc2hlbGwgZWNobyAkKDMpID4gJChvYmpwZngpJCgxKS5l eHApCitpbmNsdWRlICQob2JqcGZ4KSQoMSkudG1wLW1ha2VmaWxlCitlbmRlZgorCisjIElu ZGl2aWR1YWwgRFNPIHNvcnRpbmcgdGVzdHMuIFRoZSB0ZXN0IGRlc2NyaXB0aW9uIGFuZCBl eHBlY3RlZCBvdXRwdXQgZm9yCisjIGVhY2ggdGVzdCBpcyBzcGVjaWZpZWQgZGlyZWN0bHkg aGVyZS4gU2VlIHRoZSBzb3VyY2Ugb2YgZHNvLW9yZGVyaW5nLXRlc3QucHkKKyMgZm9yIGRv Y3VtZW50YXRpb24gb24gdGhpcy4KKyMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY3JlYXRlIHRo ZSAkKG9ianBmeCkgZGlyZWN0b3J5IGhlcmUgaW1tZWRpYXRlbHkgdG8gaG9sZAorIyB0aGUg Z2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBhbmQgTWFrZWZpbGUgZnJhZ21lbnRzLgorJChzaGVs bCBta2RpciAtcCAkKG9ianBmeCkpCiskKGV2YWwgJChjYWxsIHRlc3RfZHNvX29yZGVyaW5n LHRzdC1kc28tb3JkZXJpbmcxLCdhLT5iLT5jJywnY2Jhe31hYmMnKSkKKyQoZXZhbCAkKGNh bGwgdGVzdF9kc29fb3JkZXJpbmcsdHN0LWRzby1vcmRlcmluZzIsXAorCSdhLT5iLT5bY2Rd LT5lJywnZWRjYmF7fWFiY2RlJykpCiskKGV2YWwgJChjYWxsIHRlc3RfZHNvX29yZGVyaW5n LHRzdC1kc28tb3JkZXJpbmczLFwKKwknYS0+W2JjXS0+W2RlZl0tPltnaF0tPmknLCdpaGdm ZWRjYmF7fWFiY2RlZmdoaScpKQorJChldmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0 c3QtZHNvLW9yZGVyaW5nNCxcCisJJ2EtPmItPltkZV07YS0+Yy0+ZC0+ZScsJ2VkY2Jhe31h YmNkZScpKQorJChldmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0c3QtZHNvLW9yZGVy aW5nNSxcCisJJ2EtPltiY10tPmQ7Yi0+YycsJ2RjYmF7fWFiY2QnKSkKKyQoZXZhbCAkKGNh bGwgdGVzdF9kc29fb3JkZXJpbmcsdHN0LWRzby1vcmRlcmluZzYsXAorCSdhLT5bYmNkZV0t PmYnLCdmZWRjYmF7fWFiY2RlZicpKQorJChldmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmlu Zyx0c3QtZHNvLW9yZGVyaW5nNyxcCisJJ2EtPltiY107Yi0+W2NkZV07ZS0+ZicsJ2ZlZGNi YXt9YWJjZGVmJykpCiskKGV2YWwgJChjYWxsIHRlc3RfZHNvX29yZGVyaW5nLHRzdC1kc28t b3JkZXJpbmc4LFwKKwknYS0+Yi0+Yz0+YTt7fS0+W2JhXScsJ2NiYXt9YWJjJykpCiskKGV2 YWwgJChjYWxsIHRlc3RfZHNvX29yZGVyaW5nLHRzdC1kc28tb3JkZXJpbmc5LFwKKwknYS0+ Yi0+Yy0+ZC0+ZTt7fSEtPlthYmNkZV0nLCdlZGNiYXt9YWJjZGUnKSkKKworIyBGcm9tIEJa ICMxNTMxMQorJChldmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0c3QtYnoxNTMxMSxc CisneythOytlOytmOytnOytkOyVkOy1kOy1nOy1mOy1lOy1hfTthLT5iLT5jLT5kO2Q9Plti YV07Yz0+YTtiPT5lPT5hO2M9PmY9PmI7ZD0+Zz0+YycsXAorJ3srYVtkY2JhXTsrZVtlXTsr ZltmXTsrZ1tnXTsrZFtdOzxkPGI8ZTxhPj4+PGE+PGc8YzxhPjxmPGI8ZTxhPj4+Pj4+Pjst ZFtdOy1nW107LWZbXTstZVtdOy1hW2dmYWJjZGVdO30nKSkKKwogY2hlY2stYWJpOiAkKG9i anBmeCljaGVjay1hYmktbGQub3V0CiB0ZXN0cy1zcGVjaWFsICs9ICQob2JqcGZ4KWNoZWNr LWFiaS1sZC5vdXQKIHVwZGF0ZS1hYmk6IHVwZGF0ZS1hYmktbGQKZGlmZiAtLWdpdCBhL3Nj cmlwdHMvZHNvLW9yZGVyaW5nLXRlc3QucHkgYi9zY3JpcHRzL2Rzby1vcmRlcmluZy10ZXN0 LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTRiYTIKLS0tIC9k ZXYvbnVsbAorKysgYi9zY3JpcHRzL2Rzby1vcmRlcmluZy10ZXN0LnB5CkBAIC0wLDAgKzEs NTU2IEBACisjIS91c3IvYmluL3B5dGhvbjMKKyMgR2VuZXJhdGUgdGVzdGNhc2UgZmlsZXMg YW5kIE1ha2VmaWxlIGZyYWdtZW50cyBmb3IgRFNPIHNvcnRpbmcgdGVzdAorIyBDb3B5cmln aHQgKEMpIDIwMTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgZmls ZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorIworIyBUaGUgR05VIEMgTGlicmFy eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMg bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1 YmxpYworIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uOyBlaXRoZXIKKyMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5 b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoZSBHTlUgQyBMaWJyYXJ5 IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisj IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh cnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh IGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9u ZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQorIyA8aHR0cDovL3d3dy5n bnUub3JnL2xpY2Vuc2VzLz4uCisKKyIiIkdlbmVyYXRlIHRlc3RjYXNlIGZpbGVzIGFuZCBN YWtlZmlsZSBmcmFnbWVudHMgZm9yIERTTyBzb3J0aW5nIHRlc3QKKworVGhpcyBzY3JpcHQg dGFrZXMgYSBzZW1pY29sb24tc2VwYXJhdGVkIGRlc2NyaXB0aW9uIHN0cmluZywgYW5kIGdl bmVyYXRlcworYSB0ZXN0Y2FzZSwgaW5jbHVkaW5nIG1haW4gcHJvZ3JhbSBhbmQgYXNzb2Np YXRlZCBtb2R1bGVzLCBhbmQgTWFrZWZpbGUKK2ZyYWdtZW50cyBmb3IgaW5jbHVkaW5nIGlu dG8gZWxmL01ha2VmaWxlLgorCitUaGlzIGlzIGludGVuZGVkIHRvIHNwZWVkIHVwIGNvbXBs ZXggZHluYW1pYyBsaW5rZXIgdGVzdGNhc2UgY29uc3RydWN0aW9uLAordGhlcmVmb3JlIGZl YXR1cmVzIGFyZSBsYXJnZWx5IG1lY2hhbmljYWwgaW4gbmF0dXJlOyBpbmNvbnNpc3RlbmNp ZXMgb3IKK2Vycm9ycyBtYXkgb2NjdXIgaWYgaW5wdXQgY2FzZSB3YXMgaXRzZWxmIGVycm9y b25vdXMgb3IgaGF2ZQordW5mb3Jlc2VlbiBpbnRlcmFjdGlvbnMuCisKK09uIHRoZSBkZXNj cmlwdGlvbiBsYW5ndWFnZSB1c2VkLCBhcyBhbiBleGFtcGxlIGRlc2NyaXB0aW9uIHN0cmlu ZzoKKworICBhLT5iIS0+W2NkZWZdO2M9Pmc9Pmg7eytjOyVjOy1jfS0+YQorCitFYWNoIHNp bmdsZSBhbHBoYWJldCBjaGFyYWN0ZXIgcmVwcmVzZW50cyBhIHNoYXJlZCBvYmplY3QgbW9k dWxlIChjdXJyZW50bHkKK1thLXpBLVowLTldIGFyZSBhbGxvd2VkLCBjYXNlLXNlbnNpdGl2 ZSkKK0FsbCBzdWNoIHNoYXJlZCBvYmplY3RzIGhhdmUgYSBjb25zdHJ1Y3Rvci9kZXN0cnVj dG9yIGdlbmVyYXRlZCBmb3IgdGhlbQordGhhdCBlbWl0cyBpdHMgc2luZ2xlIGNoYXJhY3Rl ciBuYW1lIGJ5IHB1dGNoYXIoKS4KKworVGhlIC0+IG9wZXJhdG9yIHNwZWNpZmllcyBhIGxp bmsgdGltZSBkZXBlbmRlbmN5LCB0aGVzZSBjYW4gYmUgY2hhaW5lZCBmb3IKK2NvbnZlbmll bmNlIChlLmcuIGEtPmItPmMtPmQpLgorCitUaGUgPT4gb3BlcmF0b3IgY3JlYXRlcyBhIGNh bGwtcmVmZXJlbmNlLCBlLmcuIGZvciBhPT5iLCBhbiBmbl9hKCkgZnVuY3Rpb24KK2lzIGNy ZWF0ZWQgaW5zaWRlIG1vZHVsZSAnYScsIHdoaWNoIGNhbGxzIGZuX2IoKSBpbiBtb2R1bGUg J2InLgorVGhlc2UgbW9kdWxlIGZ1bmN0aW9ucyBlbWl0ICc8bmFtZT4nIG91dHB1dCBpbiBu ZXN0ZWQgZm9ybSwKK2UuZy4gYT0+YiBlbWl0cyAnPGE8Yj4+JworCitTcXVhcmUgYnJhY2tl dHMgW10gaW4gdGhlIGRlc2NyaXB0aW9uIHNwZWNpZmllcyBtdWx0aXBsZSBvYmplY3RzOwor ZS5nLiBhLT5bYmNkXS0+ZSBpcyBlcXVpdmFsZW50IHRvIGEtPmItPmU7YS0+Yy0+ZTthLT5k LT5lCisKK0Ege30gY29uc3RydWN0IHNwZWNpZmllcyB0aGUgbWFpbiB0ZXN0IHByb2dyYW0s IGFuZCBpdHMgbGluayBkZXBlbmRlbmNpZXMKK2FyZSBhbHNvIHNwZWNpZmllZCB1c2luZyAt Pi4gSW5zaWRlIHt9LCBhIGZldyA7LXNlcGVyYXRlZCBjb25zdHJ1Y3RzIGFyZQorYWxsb3dl ZDoKKyAgICAgICAgICthICAgTG9hZHMgbW9kdWxlIGEgdXNpbmcgZGxvcGVuKFJUTERfTEFa WXxSVExEX0dMT0JBTCkKKyAgICAgICAgIDphICAgTG9hZHMgbW9kdWxlIGEgdXNpbmcgZGxv cGVuKFJUTERfTEFaWSkKKyAgICAgICAgICVhICAgVXNlIGRsc3ltKCkgdG8gbG9hZCBhbmQg Y2FsbCBmbl9hKCkKKyAgICAgICAgIEBhICAgQ2FsbHMgZm5fYSgpIGRpcmVjdGx5LgorICAg ICAgICAgLWEgICBVbmxvYWRzIG1vZHVsZSBhIHVzaW5nIGRsY2xvc2UoKQorCitUaGUgZ2Vu ZXJhdGVkIG1haW4gcHJvZ3JhbSBvdXRwdXRzICd7JyAnfScgd2l0aCBhbGwgb3V0cHV0IGZy b20gYWJvdmUKK2NvbnN0cnVjdHMgaW4gYmV0d2Vlbi4gVGhlIG90aGVyIG91dHB1dCBiZWZv cmUvYWZ0ZXIge30gYXJlIHRoZSBvcmRlcmVkCitjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIG91 dHB1dC4KKworSWYgbm8ge30gY29uc3RydWN0IGlzIHByZXNlbnQsIGEgZGVmYXVsdCBlbXB0 eSBtYWluIHByb2dyYW0gaXMgbGlua2VkCithZ2FpbnN0IGFsbCBvYmplY3RzIHdoaWNoIGhh dmUgbm8gZGVwZW5kZW5jeSBsaW5rZWQgdG8gaXQuIGUuZy4gZm9yCisnW2FiXS0+YztkLT5l JywgdGhlIGRlZmF1bHQgbWFpbiBwcm9ncmFtIGlzIGVxdWl2YWxlbnQgdG8gJ3t9LT5bYWJk XScKKworVGhlICchJyBvcGVyYXRvciBhZnRlciBvYmplY3QgbmFtZXMgdHVybnMgb24gcGVy bXV0YXRpb24gb2YgaXRzCitkZXBlbmRlbmNpZXMsIGUuZy4gd2hpbGUgYS0+W2JjZF0gb25s eSBnZW5lcmF0ZXMgb25lIHNldCBvZiBvYmplY3RzLAord2l0aCAnYS5zbycgYnVpbHQgd2l0 aCBhIGxpbmsgbGluZSBvZiAiYi5zbyBjLnNvIGQuc28iLCBmb3IgYSEtPltiY2RdCitwZXJt dXRhdGlvbnMgb2YgYSdzIGRlcGVuZGVuY2llcyBjcmVhdGVzIG11bHRpcGxlIHRlc3RjYXNl cyB3aXRoCitkaWZmZXJlbnQgbGluayBsaW5lIG9yZGVyczogImIuc28gYy5zbyBkLnNvIiwg ImMuc28gYi5zbyBkLnNvIiwKKyJiLnNvIGQuc28gYy5zbyIsIGV0Yy4gTm90ZSB0aGF0IGZv ciBhIDx0ZXN0LW5hbWU+IHNwZWNpZmllZCBvbgordGhlIHNjcmlwdCBjb21tYW5kLWxpbmUs IG11bHRpcGxlIDx0ZXN0LW5hbWVfMT4sIDx0ZXN0LW5hbWVfMj4sIGV0Yy4KK3Rlc3RzIHdp bGwgYmUgZ2VuZXJhdGVkIChlLmcuIGZvciBhIS0+W2JjXSEtPltkZV0sIGVpZ2h0IHRlc3Rz IHdpdGgKK2RpZmZlcmVudCBsaW5rIG9yZGVycyBmb3IgYSwgYiwgYW5kIGMgd2lsbCBiZSBn ZW5lcmF0ZWQpCisKKyIiIgorCitpbXBvcnQgcmUKK2ltcG9ydCBvcworaW1wb3J0IHN1YnBy b2Nlc3MKK2ltcG9ydCBhcmdwYXJzZQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJl ZERpY3QKK2ltcG9ydCBpdGVydG9vbHMKKworIyBCVUlMRF9HQ0MgaXMgb25seSB1c2VkIHVu ZGVyIHRoZSAtLWJ1aWxkIG9wdGlvbiwKKyMgd2hpY2ggYnVpbGRzIHRoZSBnZW5lcmF0ZWQg dGVzdGNhc2UsIGluY2x1ZGluZyBEU09zIHVzaW5nIEJVSUxEX0dDQy4KKyMgTWFpbmx5IGZv ciB0ZXN0aW5nIHB1cnBvc2VzLCBlc3BlY2lhbGx5IGRlYnVnZ2luZyBvZiB0aGlzIHNjcmlw dCwKKyMgYW5kIGNhbiBiZSBjaGFuZ2VkIGhlcmUgdG8gYW5vdGhlciB0b29sY2hhaW4gcGF0 aCBpZiBuZWVkZWQuCitidWlsZF9nY2MgPSAiZ2NjIgorCitwYXJzZXIgPSBhcmdwYXJzZS5B cmd1bWVudFBhcnNlcigpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCJkZXNjcmlwdGlvbiIsCisg ICAgICAgICAgICAgICAgICAgIGhlbHA9IkRlc2NyaXB0aW9uIHN0cmluZyBvZiBEU08gZGVw ZW5kZW5jeSB0ZXN0IHRvIGJlICIKKyAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRlZCAo c2VlIHNjcmlwdCBzb3VyY2UgZm9yIGRvY3VtZW50YXRpb24gb2YgIgorICAgICAgICAgICAg ICAgICAgICAiZGVzY3JpcHRpb24gbGFuZ3VhZ2UpIikKK3BhcnNlci5hZGRfYXJndW1lbnQo InRlc3RfbmFtZSIsIGhlbHA9IklkZW50aWZpZXIgZm9yIHRlc3RjYXNlIGJlaW5nICIKKyAg ICAgICAgICAgICAgICAgICAgImdlbmVyYXRlZCIpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCJv YmpwZngiLAorICAgICAgICAgICAgICAgICAgICBoZWxwPSJQYXRoIHRvIHBsYWNlIGdlbmVy YXRlZCBmaWxlcywgZGVmYXVsdHMgdG8gIgorICAgICAgICAgICAgICAgICAgICAiY3VycmVu dCBkaXJlY3RvcnkgaWYgbm9uZSBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgICBu YXJncz0iPyIsIGRlZmF1bHQ9Ii4vIikKK3BhcnNlci5hZGRfYXJndW1lbnQoIi0tYnVpbGQi LCBoZWxwPSJBZnRlciBDIHRlc3RjYXNlIGdlbmVyYXRlZCwgYnVpbGQgaXQgIgorICAgICAg ICAgICAgICAgICAgICAidXNpbmcgZ2NjIChmb3IgbWFudWFsIHRlc3RpbmcgcHVycG9zZXMp IiwKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIikKK3BhcnNlci5h ZGRfYXJndW1lbnQoIi0tZGVidWctb3V0cHV0IiwgaGVscD0iUHJpbnRzIHNvbWUgaW50ZXJu YWwgZGF0YSAiCisgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3R1cmVzOyB1c2VkIGZvciBk ZWJ1Z2dpbmcgb2YgdGhpcyBzY3JpcHQiLAorICAgICAgICAgICAgICAgICAgICBhY3Rpb249 InN0b3JlX3RydWUiKQorY21kbGluZWFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCitiYXNl X3Rlc3RfbmFtZSA9IGNtZGxpbmVhcmdzLnRlc3RfbmFtZQordGVzdF9uYW1lID0gY21kbGlu ZWFyZ3MudGVzdF9uYW1lCitvYmpwZnggPSBjbWRsaW5lYXJncy5vYmpwZngKKworb2JqX2Rl cHMgPSBPcmRlcmVkRGljdCgpCitvYmpfY2FsbHJlZnMgPSBPcmRlcmVkRGljdCgpCisKK2Fs bF9vYmpzID0gW10KK2N1cnJfb2JqcyA9IFtdCisKK29ial9kZXBfcGVybXV0YXRpb25zID0g T3JkZXJlZERpY3QoKQorCisjIEFkZCAnb2JqZWN0IC0+IFtvYmplY3QsIG9iamVjdCwgLi4u XScgcmVsYXRpb25zIHRvIENVUlJfTUFQCitkZWYgYWRkX2RlcHMgKHNyY19vYmpzLCBkc3Rf b2JqcywgY3Vycl9tYXApOgorICAgIGZvciBzcmMgaW4gc3JjX29ianM6CisgICAgICAgIGZv ciBkc3QgaW4gZHN0X29ianM6CisgICAgICAgICAgICBpZiBub3Qgc3JjIGluIGN1cnJfbWFw OgorICAgICAgICAgICAgICAgIGN1cnJfbWFwW3NyY10gPSBbXQorICAgICAgICAgICAgaWYg bm90IGRzdCBpbiBjdXJyX21hcFtzcmNdOgorICAgICAgICAgICAgICAgIGN1cnJfbWFwW3Ny Y10uYXBwZW5kIChkc3QpCisKKyMgRm9yIGluc2lkZSB0aGUge30gY29uc3RydWN0CittYWlu X3Byb2dyYW0gPSBbXQorbWFpbl9wcm9ncmFtX25lZWRzX2xkbCA9IEZhbHNlCittYWluX3By b2dyYW1fZGVmYXVsdF9kZXBzID0gVHJ1ZQorZGVmIHByb2Nlc3NfbWFpbl9wcm9ncmFtICht YWlucHJvZ19zdHIpOgorICAgIGdsb2JhbCBtYWluX3Byb2dyYW0KKyAgICBnbG9iYWwgbWFp bl9wcm9ncmFtX25lZWRzX2xkbAorICAgIGdsb2JhbCBtYWluX3Byb2dyYW1fZGVmYXVsdF9k ZXBzCisgICAgaWYgbWFpbnByb2dfc3RyOgorICAgICAgICBtYWluX3Byb2dyYW0gPSBtYWlu cHJvZ19zdHIuc3BsaXQgKCc7JykKKyAgICBmb3IgcyBpbiBtYWluX3Byb2dyYW06CisgICAg ICAgIG0gPSByZS5tYXRjaCAociJeKFsrXC0lOkBdKShbMC05YS16QS1aXSspJCIsIHMpCisg ICAgICAgIGlmIG5vdCBtOiBwcmludCAoIiclcyciICUgKHMpKQorICAgICAgICBhc3NlcnQg KG0pCisgICAgICAgICMgRGV0ZXJtaW5lZCB0aGUgbWFpbiBwcm9ncmFtIG5lZWRzIGxpYmRs CisgICAgICAgIG1haW5fcHJvZ3JhbV9uZWVkc19sZGwgPSBUcnVlCisgICAgICAgIGlmIGxl bihtLmdyb3VwKDIpKSA+IDE6CisgICAgICAgICAgICBwcmludCAoIkVycm9yOiBvbmx5IHNp bmdsZSBjaGFyYWN0ZXIgb2JqZWN0IG5hbWVzIGFsbG93ZWQsICIKKyAgICAgICAgICAgICAg ICAgICArICInJXMnIGlzIGludmFsaWQiICUgKG0uZ3JvdXAoMSkpKQorICAgICAgICAgICAg ZXhpdCAtMQorICAgICAgICBvYmogPSBtLmdyb3VwKDIpCisgICAgICAgIGlmIG5vdCBvYmog aW4gYWxsX29ianM6CisgICAgICAgICAgICBhbGxfb2Jqcy5hcHBlbmQgKG9iaikKKyAgICAg ICAgaWYgbS5ncm91cCgxKSA9PSAnJScgb3IgbS5ncm91cCgxKSA9PSAnQCc6CisgICAgICAg ICAgICBhZGRfZGVwcyAoWycjJ10sIFtvYmpdLCBvYmpfY2FsbHJlZnMpCisgICAgIyBXZSBo YXZlIGEgbWFpbiBwcm9ncmFtIHNwZWNpZmllZCwgdHVybiB0aGlzIG9mZgorICAgIG1haW5f cHJvZ3JhbV9kZWZhdWx0X2RlcHMgPSBGYWxzZQorCisjIExleGVyIGZvciB0b2tlbnMKK3Rv a2Vuc3BlYyA9IFsgKCJPQkoiLCAgICAgIHIiKFswLTlhLXpBLVpdKykiKSwKKyAgICAgICAg ICAgICAgKCJERVAiLCAgICAgIHIiLT4iKSwKKyAgICAgICAgICAgICAgKCJDQUxMUkVGIiwg IHIiPT4iKSwKKyAgICAgICAgICAgICAgKCJPQkpTRVQiLCAgIHIiXFsoWzAtOWEtekEtWl0r KVxdIiksCisgICAgICAgICAgICAgICgiUFJPRyIsICAgICByInsoWzAtOWEtekEtWjsrOlwt JUBdKil9IiksCisgICAgICAgICAgICAgICgiUEVSTVVURSIsICByIiEiKSwKKyAgICAgICAg ICAgICAgKCJTRU1JQ09MIiwgIHIiOyIpLAorICAgICAgICAgICAgICAoIkVSUk9SIiwgICAg ciIuIikgXQordG9rX3JlID0gJ3wnLmpvaW4oJyg/UDwlcz4lcyknICUgcGFpciBmb3IgcGFp ciBpbiB0b2tlbnNwZWMpCisKKyMgU3RhdGUgdXNlZCB3aGVuIHBhcnNpbmcgZGVwZW5kZW5j aWVzCitpbl9kZXAgPSBGYWxzZQoraW5fY2FsbHJlZiA9IEZhbHNlCitkZWYgY2xlYXJfZGVw X3N0YXRlICgpOgorICAgIGdsb2JhbCBpbl9kZXAsIGluX2NhbGxyZWYKKyAgICBpbl9kZXAg PSBpbl9jYWxscmVmID0gRmFsc2UKKworIyBNYWluIHBhcnNlcgorZm9yIG0gaW4gcmUuZmlu ZGl0ZXIodG9rX3JlLCBjbWRsaW5lYXJncy5kZXNjcmlwdGlvbik6CisgICAga2luZCA9IG0u bGFzdGdyb3VwCisgICAgdmFsdWUgPSBtLmdyb3VwICgpCisgICAgaWYga2luZCA9PSAiT0JK IjoKKyAgICAgICAgaWYgbGVuICh2YWx1ZSkgPiAxOgorICAgICAgICAgICAgcHJpbnQgKCJF cnJvcjogb25seSBzaW5nbGUgY2hhcmFjdGVyIG9iamVjdCBuYW1lcyBhbGxvd2VkLCAiCisg ICAgICAgICAgICAgICAgICAgKyAiJyVzJyBpcyBpbnZhbGlkIiAlICh2YWx1ZSkpCisgICAg ICAgICAgICBleGl0ICgtMSkKKyAgICAgICAgaWYgaW5fZGVwOgorICAgICAgICAgICAgYWRk X2RlcHMgKGN1cnJfb2JqcywgW3ZhbHVlXSwgb2JqX2RlcHMpCisgICAgICAgIGVsaWYgaW5f Y2FsbHJlZjoKKyAgICAgICAgICAgIGFkZF9kZXBzIChjdXJyX29ianMsIFt2YWx1ZV0sIG9i al9jYWxscmVmcykKKyAgICAgICAgY2xlYXJfZGVwX3N0YXRlICgpCisgICAgICAgIGN1cnJf b2JqcyA9IFt2YWx1ZV0KKyAgICAgICAgaWYgbm90IHZhbHVlIGluIGFsbF9vYmpzOgorICAg ICAgICAgICAgYWxsX29ianMuYXBwZW5kICh2YWx1ZSkKKworICAgIGVsaWYga2luZCA9PSAi T0JKU0VUIjoKKyAgICAgICAgb2Jqc2V0ID0gdmFsdWVbMTpsZW4odmFsdWUpLTFdCisgICAg ICAgIGlmIGluX2RlcDoKKyAgICAgICAgICAgIGFkZF9kZXBzIChjdXJyX29ianMsIGxpc3Qg KG9ianNldCksIG9ial9kZXBzKQorICAgICAgICBlbGlmIGluX2NhbGxyZWY6CisgICAgICAg ICAgICBhZGRfZGVwcyAoY3Vycl9vYmpzLCBsaXN0IChvYmpzZXQpLCBvYmpfY2FsbHJlZnMp CisgICAgICAgIGNsZWFyX2RlcF9zdGF0ZSAoKQorICAgICAgICBjdXJyX29ianMgPSBsaXN0 IChvYmpzZXQpCisgICAgICAgIGZvciBvIGluIGxpc3QgKG9ianNldCk6CisgICAgICAgICAg ICBpZiBub3QgbyBpbiBhbGxfb2JqczoKKyAgICAgICAgICAgICAgICBhbGxfb2Jqcy5hcHBl bmQgKG8pCisKKyAgICBlbGlmIGtpbmQgPT0gIlBFUk1VVEUiOgorICAgICAgICBpZiBpbl9k ZXAgb3IgaW5fY2FsbHJlZjoKKyAgICAgICAgICAgIHByaW50ICgiRXJyb3I6IHN5bnRheCBl cnJvciwgcGVybXV0ZSBvcGVyYXRpb24gaW52YWxpZCBoZXJlIikKKyAgICAgICAgICAgIGV4 aXQgLTEKKyAgICAgICAgaWYgbm90IGN1cnJfb2JqczoKKyAgICAgICAgICAgIHByaW50ICgi RXJyb3I6IHN5bnRheCBlcnJvciwgbm8gb2JqZWN0cyB0byBwZXJtdXRlIGhlcmUiKQorICAg ICAgICAgICAgZXhpdCAtMQorICAgICAgICBmb3Igb2JqIGluIGN1cnJfb2JqczoKKyAgICAg ICAgICAgIGlmIG5vdCBvYmogaW4gb2JqX2RlcF9wZXJtdXRhdGlvbnM6CisgICAgICAgICAg ICAgICAgIyBTaWduYWwgdGhpcyBvYmplY3QgaGFzIHBlcm11dGF0ZWQgZGVwZW5kZW5jaWVz CisgICAgICAgICAgICAgICAgb2JqX2RlcF9wZXJtdXRhdGlvbnNbb2JqXSA9IFtdCisKKyAg ICBlbGlmIGtpbmQgPT0gIlBST0ciOgorICAgICAgICBpZiBtYWluX3Byb2dyYW06CisgICAg ICAgICAgICBwcmludCAoIkVycm9yOiBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gb25lIG1haW4g cHJvZ3JhbSIpCisgICAgICAgICAgICBleGl0ICgtMSkKKyAgICAgICAgaWYgaW5fZGVwOgor ICAgICAgICAgICAgcHJpbnQgKCJFcnJvcjogb2JqZWN0cyBjYW5ub3QgaGF2ZSBkZXBlbmRl bmN5IG9uIG1haW4gcHJvZ3JhbSIpCisgICAgICAgICAgICBleGl0ICgtMSkKKyAgICAgICAg aWYgaW5fY2FsbHJlZjoKKyAgICAgICAgICAgIGFkZF9kZXBzIChjdXJyX29ianMsIFsiIyJd LCBvYmpfY2FsbHJlZnMpCisgICAgICAgIHByb2Nlc3NfbWFpbl9wcm9ncmFtICh2YWx1ZVsx Omxlbih2YWx1ZSktMV0pCisgICAgICAgIGNsZWFyX2RlcF9zdGF0ZSAoKQorICAgICAgICBj dXJyX29ianMgPSBbIiMiXQorCisgICAgZWxpZiBraW5kID09ICJERVAiOgorICAgICAgICBp ZiBpbl9kZXAgb3IgaW5fY2FsbHJlZjoKKyAgICAgICAgICAgIHByaW50ICgiRXJyb3I6IHN5 bnRheCBlcnJvciwgbXVsdGlwbGUgY29udGlndW91cyAtPiw9PiBvcGVyYXRpb25zIikKKyAg ICAgICAgICAgIGV4aXQgLTEKKyAgICAgICAgaW5fZGVwID0gVHJ1ZQorCisgICAgZWxpZiBr aW5kID09ICJDQUxMUkVGIjoKKyAgICAgICAgaWYgaW5fZGVwIG9yIGluX2NhbGxyZWY6Cisg ICAgICAgICAgICBwcmludCAoIkVycm9yOiBzeW50YXggZXJyb3IsIG11bHRpcGxlIGNvbnRp Z3VvdXMgLT4sPT4gb3BlcmF0aW9ucyIpCisgICAgICAgICAgICBleGl0IC0xCisgICAgICAg IGluX2NhbGxyZWYgPSBUcnVlCisgICAgICAgIAorICAgIGVsaWYga2luZCA9PSAiU0VNSUNP TCI6CisgICAgICAgIGN1cnJfb2JqcyA9IFtdCisgICAgICAgIGNsZWFyX2RlcF9zdGF0ZSAo KQorCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgKCJFcnJvcjogdW5rbm93biB0b2tlbiAn JXMnIiAlICh2YWx1ZSkpCisgICAgICAgIGV4aXQgKC0xKQorCitkZWYgZmluZF9vYmpzX25v dF9kZXBlbmRlZF9vbiAoKToKKyAgICBnbG9iYWwgYWxsX29ianMsIG9ial9kZXBzCisgICAg b2Jqc19ub3RfZGVwZW5kZWRfb24gPSBbXQorICAgIGZvciBvYmogaW4gYWxsX29ianM6Cisg ICAgICAgIHNraXAgPSBGYWxzZQorICAgICAgICBmb3IgciBpbiBvYmpfZGVwcy5pdGVtcygp OgorICAgICAgICAgICAgaWYgb2JqIGluIHJbMV06CisgICAgICAgICAgICAgICAgc2tpcCA9 IFRydWUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBub3Qgc2tpcDoKKyAg ICAgICAgICAgIG9ianNfbm90X2RlcGVuZGVkX29uLmFwcGVuZCAob2JqKQorICAgIHJldHVy biBvYmpzX25vdF9kZXBlbmRlZF9vbgorICAgICAgICAKKyMgSWYgbm8gbWFpbiBwcm9ncmFt IHdhcyBzcGVjaWZpZWQgaW4gZGVwZW5kZW5jeSBkZXNjcmlwdGlvbiwgbWFrZSBhCisjIGRl ZmF1bHQgbWFpbiBwcm9ncmFtIHdpdGggZGVwcyBwb2ludGluZyB0byBhbGwgRFNPcyB3aGlj aCBhcmUgbm90CisjIGRlcGVuZGVkIGJ5IGFub3RoZXIgRFNPLgoraWYgbWFpbl9wcm9ncmFt X2RlZmF1bHRfZGVwczoKKyAgICBtYWluX2RlcHMgPSBmaW5kX29ianNfbm90X2RlcGVuZGVk X29uICgpCisgICAgIyBtYWluX2RlcHMgPSBbXQorICAgICMgZm9yIG8gaW4gYWxsX29ianM6 CisgICAgIyAgICAgc2tpcCA9IEZhbHNlCisgICAgIyAgICAgZm9yIHIgaW4gb2JqX2RlcHMu aXRlbXMoKToKKyAgICAjICAgICAgICAgaWYgbyBpbiByWzFdOgorICAgICMgICAgICAgICAg ICAgc2tpcCA9IFRydWUKKyAgICAjICAgICAgICAgICAgIGJyZWFrCisgICAgIyAgICAgaWYg c2tpcDoKKyAgICAjICAgICAgICAgY29udGludWUKKyAgICAjICAgICBtYWluX2RlcHMuYXBw ZW5kIChvKQorICAgIGFkZF9kZXBzIChbIiMiXSwgbWFpbl9kZXBzLCBvYmpfZGVwcykgICAg CisgICAgICAgIAorIyBEZWJ1ZyBvdXRwdXQKK2lmIGNtZGxpbmVhcmdzLmRlYnVnX291dHB1 dDoKKyAgICBwcmludCAoIkFsbCBvYmplY3RzOiAlcyIgJSAoYWxsX29ianMpKQorICAgIHBy aW50ICgiLS0tIFN0YXRpYyBsaW5rIGRlcGVuZGVuY2llcyAtLS0iKQorICAgIGZvciByIGlu IG9ial9kZXBzLml0ZW1zKCk6CisgICAgICAgIHByaW50ICgiJXMgLT4gJXMiICUgKHJbMF0s IHJbMV0pKQorICAgIHByaW50ICgiLS0tIE9iamVjdHMgd2hvc2UgZGVwZW5kZW5jaWVzIGFy ZSB0byBiZSBwZXJtdXRhdGVkIC0tLSIpCisgICAgZm9yIHIgaW4gb2JqX2RlcF9wZXJtdXRh dGlvbnMuaXRlbXMoKToKKyAgICAgICAgcHJpbnQgKCIlcyIgJSAoclswXSkpCisgICAgI3By aW50IChvYmpfZGVwX3Blcm11dGF0aW9ucykKKyAgICBwcmludCAoIi0tLSBDYWxsIHJlZmVy ZW5jZSBkZXBlbmRlbmNpZXMgLS0tIikKKyAgICBmb3IgciBpbiBvYmpfY2FsbHJlZnMuaXRl bXMoKToKKyAgICAgICAgcHJpbnQgKCIlcyA9PiAlcyIgJSAoclswXSwgclsxXSkpCisgICAg cHJpbnQgKCItLS0gbWFpbiBwcm9ncmFtIC0tLSIpCisgICAgcHJpbnQgKG1haW5fcHJvZ3Jh bSkKKworIyBNYWluIHRlc3RjYXNlIHByb2Nlc3Npbmcgcm91dGluZSwgZG9lcyBNYWtlZmls ZSBmcmFnbWVudCBnZW5lcmF0aW9uLAorIyB0ZXN0Y2FzZSBzb3VyY2UgZ2VuZXJhdGlvbiwg YW5kIGlmIC0tYnVpbGQgc3BlY2lmaWVkIGJ1aWxkcyB0ZXN0Y2FzZS4KK2RlZiBwcm9jZXNz X3Rlc3RjYXNlICh0ZXN0X25hbWUpOgorICAgIGdsb2JhbCBvYmpwZngsIGFsbF9vYmpzLCBv YmpfZGVwcywgb2JqX2NhbGxyZWZzCisgICAgZ2xvYmFsIGJhc2VfdGVzdF9uYW1lLCBtYWlu X3Byb2dyYW0sIG1haW5fcHJvZ3JhbV9uZWVkc19sZGwKKworICAgICMgUHJpbnQgb3V0IG5l ZWRlZCBNYWtlZmlsZSBmcmFnbWVudHMgZm9yIHVzZSBpbiBnbGliYy9lbGYvTWFrZWZpbGUu CisgICAgI2lmIG1ha2VmaWxlOgorICAgIHByaW50ICgiaWZlcSAoeWVzLCQoYnVpbGQtc2hh cmVkKSkiKQorICAgIHQgPSAiIgorICAgIGZvciBvIGluIGFsbF9vYmpzOgorICAgICAgICB0 ICs9ICIgIiArIHRlc3RfbmFtZSArICItIiArIG8KKyAgICBwcmludCAoIm1vZHVsZXMtbmFt ZXMgKz0lcyIgJSAodCkpCisgICAgcHJpbnQgKCJ0ZXN0cyArPSAlcyIgJSAodGVzdF9uYW1l KSkKKworICAgICMgUHJpbnQgZGlyZWN0IGxpbmsgZGVwZW5kZW5jaWVzIGZvciBlYWNoIERT TworICAgIGZvciBvYmogaW4gYWxsX29ianM6CisgICAgICAgIGlmIG9iaiBpbiBvYmpfZGVw czoKKyAgICAgICAgICAgIGRzbyA9IHRlc3RfbmFtZSArICItIiArIG9iaiArICIuc28iCisg ICAgICAgICAgICBkZXBzdHIgPSAiIgorICAgICAgICAgICAgZm9yIGRlcCBpbiBvYmpfZGVw c1tvYmpdOgorICAgICAgICAgICAgICAgIGRlcHN0ciArPSAiICQob2JqcGZ4KSIgKyB0ZXN0 X25hbWUgKyAiLSIgKyBkZXAgKyAiLnNvIgorICAgICAgICAgICAgcHJpbnQgKCIkKG9ianBm eCklczolcyIgJSAoZHNvLCBkZXBzdHIpKQorCisgICAgIyBQcmludCBMREZMQUdTLSogYW5k ICotbm8tei1kZWZzCisgICAgZm9yIG8gaW4gYWxsX29ianM6CisgICAgICAgIGRzbyA9IHRl c3RfbmFtZSArICItIiArIG8gKyAiLnNvIgorICAgICAgICBwcmludCAoIkxERkxBR1MtJXMg PSAkKG5vLWFzLW5lZWRlZCkiICUgKGRzbykpCisgICAgICAgIGlmIG8gaW4gb2JqX2NhbGxy ZWZzOgorICAgICAgICAgICAgcHJpbnQgKCIlcy1uby16LWRlZnMgPSB5ZXMiICUgKGRzbykp CisKKyAgICAjIFByaW50IGRlcGVuZGVuY2llcyBmb3IgbWFpbiB0ZXN0IHByb2dyYW0KKyAg ICBkZXBzdHIgPSAiIgorICAgIGlmICcjJyBpbiBvYmpfZGVwczoKKyAgICAgICAgZm9yIG8g aW4gb2JqX2RlcHNbJyMnXToKKyAgICAgICAgICAgIGRlcHN0ciArPSAiICQob2JqcGZ4KSIg KyB0ZXN0X25hbWUgKyAiLSIgKyBvICsgIi5zbyIKKyAgICBpZiBtYWluX3Byb2dyYW1fbmVl ZHNfbGRsOgorICAgICAgICBkZXBzdHIgKz0gIiAkKGxpYmRsKSIKKyAgICBwcmludCAoIiQo b2JqcGZ4KSVzOiVzIiAlICh0ZXN0X25hbWUsIGRlcHN0cikpCisgICAgcHJpbnQgKCJMREZM QUdTLSVzID0gJChuby1hcy1uZWVkZWQpIiAlICh0ZXN0X25hbWUpKQorCisgICAgbm90X2Rl cGVuZGVkX29ianMgPSBmaW5kX29ianNfbm90X2RlcGVuZGVkX29uICgpCisgICAgaWYgbm90 X2RlcGVuZGVkX29ianM6CisgICAgICAgIGRlcHN0ciA9ICIiCisgICAgICAgIGZvciBkZXAg aW4gbm90X2RlcGVuZGVkX29ianM6CisgICAgICAgICAgICBkZXBzdHIgKz0gIiAkKG9ianBm eCkiICsgdGVzdF9uYW1lICsgIi0iICsgZGVwICsgIi5zbyIKKyAgICAgICAgcHJpbnQgKCIk KG9ianBmeCklcy5vdXQ6JXMiICUgKHRlc3RfbmFtZSwgZGVwc3RyKSkKKyAgICAKKyAgICAj IE5vdGUgdGhpcyBpcyBjb21wYXJlZCB3aXRoIHRoZSAiYmFzZSIgPHRlc3RfbmFtZT4uZXhw LCBub3QKKyAgICAjIDx0ZXN0X25hbWU+XzxOPiB3aXRoIHBlcm11dGF0aW9uIGluZGV4Cisg ICAgcHJpbnQgKCIkKG9ianBmeCklcy1jbXAub3V0OiAkKG9ianBmeCklcy5leHAgJChvYmpw ZngpJXMub3V0IgorICAgICAgICAgICAlICh0ZXN0X25hbWUsIGJhc2VfdGVzdF9uYW1lLCB0 ZXN0X25hbWUpKQorICAgIHByaW50ICgiXHRkaWZmIC13dSAkXiA+ICRAOyAkKGV2YWx1YXRl LXRlc3QpIikKKyAgICBwcmludCAoImVuZGlmIikKKyAgICBwcmludCAoImlmZXEgKCQocnVu LWJ1aWx0LXRlc3RzKSx5ZXMpIikKKyAgICBwcmludCAoInRlc3RzLXNwZWNpYWwgKz0gJChv YmpwZngpJXMtY21wLm91dCIgJSAodGVzdF9uYW1lKSkKKyAgICBwcmludCAoImVuZGlmIikK KworICAgICMgR2VuZXJhdGUgQyBmaWxlcyBhY2NvcmRpbmcgdG8gZGVwZW5kZW5jeSBhbmQg Y2FsbGluZyByZWxhdGlvbnMgZnJvbQorICAgICMgZGVzY3JpcHRpb24gc3RyaW5nLgorICAg IGZvciBvYmogaW4gYWxsX29ianM6CisgICAgICAgIHNyY19uYW1lID0gdGVzdF9uYW1lICsg Ii0iICsgb2JqICsgIi5jIgorICAgICAgICBmID0gb3BlbiAob2JqcGZ4ICsgc3JjX25hbWUs ICJ3IikKKyAgICAgICAgaWYgb2JqIGluIG9ial9jYWxscmVmczoKKyAgICAgICAgICAgIGNh bGxlZF9vYmpzID0gb2JqX2NhbGxyZWZzW29ial0KKyAgICAgICAgICAgIGZvciBjYWxsZWUg aW4gY2FsbGVkX29ianM6CisgICAgICAgICAgICAgICAgZi53cml0ZSAoImV4dGVybiB2b2lk IGZuXyVzICh2b2lkKTtcbiIgJSAoY2FsbGVlKSkKKyAgICAgICAgZi53cml0ZSAoImV4dGVy biBpbnQgcHV0Y2hhcihpbnQpO1xuIikKKyAgICAgICAgZi53cml0ZSAoInN0YXRpYyB2b2lk IF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgIiArCisgICAgICAgICAgICAgICAgICJp bml0KHZvaWQpe3B1dGNoYXIoJyVzJyk7fVxuIiAlIChvYmopKQorICAgICAgICBmLndyaXRl ICgic3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcikpICIgKworICAgICAg ICAgICAgICAgICAiZmluaSh2b2lkKXtwdXRjaGFyKCclcycpO31cbiIgJSAob2JqKSkKKyAg ICAgICAgaWYgb2JqIGluIG9ial9jYWxscmVmczoKKyAgICAgICAgICAgIGNhbGxlZF9vYmpz ID0gb2JqX2NhbGxyZWZzW29ial0KKyAgICAgICAgICAgIGYud3JpdGUgKCJ2b2lkIGZuXyVz ICh2b2lkKSB7XG4iICUgKG9iaikpCisgICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFy ICgnPCcpO1xuIik7CisgICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyICgnJXMnKTtc biIgJSAob2JqKSk7CisgICAgICAgICAgICBmb3IgY2FsbGVlIGluIGNhbGxlZF9vYmpzOgor ICAgICAgICAgICAgICAgIGYud3JpdGUgKCIgIGZuXyVzICgpO1xuIiAlIChjYWxsZWUpKQor ICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0Y2hhciAoJz4nKTtcbiIpOworICAgICAgICAg ICAgZi53cml0ZSAoIn1cbiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgY2Fs bHJlZiBpbiBvYmpfY2FsbHJlZnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBvYmog aW4gY2FsbHJlZlsxXToKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSAoInZvaWQgZm5f JXMgKHZvaWQpIHtcbiIgJSAob2JqKSkKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSAo IiAgcHV0Y2hhciAoJzwnKTtcbiIpOworICAgICAgICAgICAgICAgICAgICBmLndyaXRlICgi ICBwdXRjaGFyICgnJXMnKTtcbiIgJSAob2JqKSk7CisgICAgICAgICAgICAgICAgICAgIGYu d3JpdGUgKCIgIHB1dGNoYXIgKCc+Jyk7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZi53 cml0ZSAoIn1cbiIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGYuY2xv c2UgKCkKKworICAgICMgT3BlbiBDIGZpbGUgZm9yIHdyaXRpbmcKKyAgICBmID0gb3BlbiAo b2JqcGZ4ICsgdGVzdF9uYW1lICsgIi5jIiwgInciKQorCisgICAgIyBpZiB0aGVyZSBhcmUg c29tZSBvcGVyYXRpb25zIGluIG1haW4oKSwgaXQgbWVhbnMgd2UgbmVlZCAtbGRsCisgICAg aWYgbWFpbl9wcm9ncmFtX25lZWRzX2xkbDoKKyAgICAgICAgZi53cml0ZSAoIiNpbmNsdWRl IDxkbGZjbi5oPlxuIikKKyAgICBmLndyaXRlICgiI2luY2x1ZGUgPHN0ZGlvLmg+XG4iKQor ICAgIGYud3JpdGUgKCIjaW5jbHVkZSA8c3RkbGliLmg+XG4iKQorICAgIGZvciBzIGluIG1h aW5fcHJvZ3JhbToKKyAgICAgICAgaWYgc1swXSA9PSAnQCc6CisgICAgICAgICAgICBmLndy aXRlICgiZXh0ZXJuIHZvaWQgZm5fJXMgKHZvaWQpO1xuIiAlIChzWzFdKSk7CisgICAgZi53 cml0ZSAoImludCBtYWluICh2b2lkKSB7XG4iKQorICAgIGYud3JpdGUgKCIgIHB1dGNoYXIo J3snKTtcbiIpCisKKyAgICAjIEhlbHBlciByb3V0aW5lIGZvciBzYW5pdHkgY2hlY2sgY29k ZQorICAgIGRlZiBwdXRfZmFpbF9jaGVjayAoZmFpbF9jb25kLCBhY3Rpb25fZGVzYyk6Cisg ICAgICAgIGYud3JpdGUgKCcgIGlmICglcykgeyBwcmludGYgKCJcXG4lcyBmYWlsZWQ6ICUl c1xcbiIsICcKKyAgICAgICAgICAgICAgICAgJ2RsZXJyb3IgKCkpOyBleGl0ICgxKTt9XG4n ICUgKGZhaWxfY29uZCwgYWN0aW9uX2Rlc2MpKQorICAgIGkgPSAwCisgICAgd2hpbGUgaSA8 IGxlbihtYWluX3Byb2dyYW0pOgorICAgICAgICBzID0gbWFpbl9wcm9ncmFtW2ldCisgICAg ICAgIG9iaiA9IHNbbGVuKHMpLTFdCisgICAgICAgIGRzbyA9IHRlc3RfbmFtZSArICItIiAr IG9iagorICAgICAgICBpZiBzWzBdID09ICcrJyBvciBzWzBdID09ICc6JzoKKyAgICAgICAg ICAgIGlmIHNbMF0gPT0gJysnOgorICAgICAgICAgICAgICAgIGRsb3Blbl9mbGFncyA9ICJS VExEX0xBWll8UlRMRF9HTE9CQUwiCisgICAgICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0 Y2hhcignKycpO1xuIik7CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRs b3Blbl9mbGFncyA9ICJSVExEX0xBWlkiCisgICAgICAgICAgICAgICAgZi53cml0ZSAoIiAg cHV0Y2hhcignOicpO1xuIik7CisgICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyKCcl cycpO1xuIiAlIChvYmopKTsKKyAgICAgICAgICAgIGYud3JpdGUgKCIgIHB1dGNoYXIoJ1sn KTtcbiIpOworICAgICAgICAgICAgZi53cml0ZSAoJyAgdm9pZCAqJXMgPSBkbG9wZW4gKCIl cy5zbyIsICVzKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICUgKG9iaiwgZHNvLCBkbG9w ZW5fZmxhZ3MpKQorICAgICAgICAgICAgcHV0X2ZhaWxfY2hlY2sgKCIhJXMiICUgKG9iaiks CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLnNvIGRsb3BlbiIgJSAoZHNvKSkK KyAgICAgICAgICAgIGYud3JpdGUgKCIgIHB1dGNoYXIoJ10nKTtcbiIpOworICAgICAgICBl bGlmIHNbMF0gPT0gJy0nOgorICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0Y2hhcignLScp O1xuIik7CisgICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyKCclcycpO1xuIiAlIChv YmopKTsKKyAgICAgICAgICAgIGYud3JpdGUgKCIgIHB1dGNoYXIoJ1snKTtcbiIpOworICAg ICAgICAgICAgcHV0X2ZhaWxfY2hlY2sgKCJkbGNsb3NlICglcykgIT0gMCIgJSAob2JqKSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMuc28gZGxjbG9zZSIgJSAoZHNvKSkK KyAgICAgICAgICAgIGYud3JpdGUgKCIgIHB1dGNoYXIoJ10nKTtcbiIpOworICAgICAgICBl bGlmIHNbMF0gPT0gJyUnOgorICAgICAgICAgICAgZi53cml0ZSAoJyAgdm9pZCAoKmZuXyVz KSh2b2lkKSA9IGRsc3ltICglcywgImZuXyVzIik7XG4nCisgICAgICAgICAgICAgICAgICAg ICAlIChvYmosIG9iaiwgb2JqKSkKKyAgICAgICAgICAgIHB1dF9mYWlsX2NoZWNrICgiIWZu XyVzIiAlIChvYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkbHN5bShmbl8l cykgZnJvbSAlcy5zbyIgJSAob2JqLCBkc28pKQorICAgICAgICAgICAgZi53cml0ZSAoIiAg Zm5fJXMgKCk7XG4iICUgKG9iaikpCisgICAgICAgIGVsaWYgc1swXSA9PSAnQCc6CisgICAg ICAgICAgICBmLndyaXRlICgiICBmbl8lcyAoKTtcbiIgJSAob2JqKSkKKyAgICAgICAgZi53 cml0ZSAoIiAgcHV0Y2hhcignOycpO1xuIik7CisgICAgICAgIGkgKz0gMQorICAgIGYud3Jp dGUgKCIgIHB1dGNoYXIoJ30nKTtcbiIpCisgICAgZi53cml0ZSAoIiAgcmV0dXJuIDA7XG4i KQorICAgIGYud3JpdGUgKCJ9XG4iKQorICAgIGYuY2xvc2UgKCkKKworICAgICMgSGVscGVy IHJvdXRpbmUgdG8gcnVuIGEgc2hlbGwgY29tbWFuZCwgZm9yIHJ1bm5pbmcgR0NDIGJlbG93 CisgICAgZGVmIHJ1bl9jbWQgKGFyZ3MpOgorICAgICAgICBpZiBjbWRsaW5lYXJncy5kZWJ1 Z19vdXRwdXQ6CisgICAgICAgICAgICBwcmludCAoc3RyLmpvaW4gKCcgJywgYXJncykpCisg ICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuIChhcmdzKQorICAgICAgICBwLndhaXQgKCkK KyAgICAgICAgaWYgcC5yZXR1cm5jb2RlICE9IDA6CisgICAgICAgICAgICBwcmludCAoIkVy cm9yIHJ1bm5pbmc6ICVzIiAlIChzdHIuam9pbiAoJyAnLCBhcmdzKSkpCisgICAgICAgICAg ICBleGl0IC0xCisKKyAgICAjIERlcHRoLWZpcnN0IHRyYXZlcnNhbCwgZXhlY3V0aW5nIEZO KE9CSikgaW4gcG9zdC1vcmRlcgorICAgIG9ial92aXNpdGVkID0ge30KKyAgICBkZWYgZGZz IChvYmosIGZuKToKKyAgICAgICAgaWYgb2JqIGluIG9ial92aXNpdGVkOgorICAgICAgICAg ICAgcmV0dXJuCisgICAgICAgIG9ial92aXNpdGVkW29ial0gPSBUcnVlCisgICAgICAgIGlm IG9iaiBpbiBvYmpfZGVwczoKKyAgICAgICAgICAgIGZvciBkZXAgaW4gb2JqX2RlcHNbb2Jq XToKKyAgICAgICAgICAgICAgICBkZnMgKGRlcCwgZm4pCisgICAgICAgIGZuIChvYmopCisK KyAgICAjIEZ1bmN0aW9uIHRvIGNyZWF0ZSA8dGVzdF9uYW1lPi08b2JqPi5zbworICAgIGRl ZiBidWlsZF9kc28gKG9iaik6CisgICAgICAgIG9ial9uYW1lID0gdGVzdF9uYW1lICsgIi0i ICsgb2JqICsgIi5vcyIKKyAgICAgICAgZHNvX25hbWUgPSB0ZXN0X25hbWUgKyAiLSIgKyBv YmogKyAiLnNvIgorICAgICAgICBkZXBzID0gW10KKyAgICAgICAgaWYgb2JqIGluIG9ial9k ZXBzOgorICAgICAgICAgICAgZGVwcyA9IG9ial9kZXBzW29ial0KKyAgICAgICAgZHNvX2Rl cHMgPSBtYXAgKGxhbWJkYSBkOiBvYmpwZnggKyB0ZXN0X25hbWUgKyAiLSIgKyBkICsgIi5z byIsIGRlcHMpCisgICAgICAgIGNtZCA9IChbYnVpbGRfZ2NjLCAiLXNoYXJlZCIsICItbyIs IG9ianBmeCArIGRzb19uYW1lLAorICAgICAgICAgICAgICAgIG9ianBmeCArIG9ial9uYW1l LCAiLVdsLC0tbm8tYXMtbmVlZGVkIl0gKyBsaXN0KGRzb19kZXBzKSkKKyAgICAgICAgcnVu X2NtZCAoY21kKQorCisgICAgIyAtLWJ1aWxkIG9wdGlvbiBwcm9jZXNzaW5nOiBidWlsZCBn ZW5lcmF0ZWQgc291cmNlcyB1c2luZyAnYnVpbGRfZ2NjJworICAgIGlmIGNtZGxpbmVhcmdz LmJ1aWxkOgorICAgICAgICAjIENvbXBpbGUgaW5kaXZpZHVhbCAub3MgZmlsZXMKKyAgICAg ICAgZm9yIG9iaiBpbiBhbGxfb2JqczoKKyAgICAgICAgICAgIHNyY19uYW1lID0gdGVzdF9u YW1lICsgIi0iICsgb2JqICsgIi5jIgorICAgICAgICAgICAgb2JqX25hbWUgPSB0ZXN0X25h bWUgKyAiLSIgKyBvYmogKyAiLm9zIgorICAgICAgICAgICAgcnVuX2NtZCAoW2J1aWxkX2dj YywgIi1jIiwgIi1mUElDIiwgb2JqcGZ4ICsgc3JjX25hbWUsCisgICAgICAgICAgICAgICAg ICAgICAgIi1vIiwgb2JqcGZ4ICsgb2JqX25hbWVdKQorCisgICAgICAgICMgQnVpbGQgYWxs IERTT3MsIHRoaXMgbmVlZHMgdG8gYmUgaW4gdG9wb2xvZ2ljYWwgZGVwZW5kZW5jeSBvcmRl ciwKKyAgICAgICAgIyBvciBsaW5rIHdpbGwgZmFpbAorICAgICAgICBmb3Igb2JqIGluIGFs bF9vYmpzOgorICAgICAgICAgICAgZGZzIChvYmosIGJ1aWxkX2RzbykKKworICAgICAgICAj IEJ1aWxkIG1haW4gcHJvZ3JhbQorICAgICAgICBkZXBzID0gW10KKyAgICAgICAgaWYgJyMn IGluIG9ial9kZXBzOgorICAgICAgICAgICAgZGVwcyA9IG9ial9kZXBzWycjJ10KKyAgICAg ICAgbWFpbl9kZXBzID0gbWFwIChsYW1iZGEgZDogb2JqcGZ4ICsgdGVzdF9uYW1lICsgIi0i ICsgZCArICIuc28iLCBkZXBzKQorICAgICAgICBjbWQgPSAoW2J1aWxkX2djYywgIi1XbCwt LW5vLWFzLW5lZWRlZCIsICItbyIsIG9ianBmeCArIHRlc3RfbmFtZSwKKyAgICAgICAgICAg ICAgICBvYmpwZnggKyB0ZXN0X25hbWUgKyAiLmMiLCAiLUwlcyIgJSAob3MuZ2V0Y3dkICgp KSwKKyAgICAgICAgICAgICAgICAiLVdsLC1ycGF0aC1saW5rPSVzIiAlIChvcy5nZXRjd2Qg KCkpXQorICAgICAgICAgICAgICAgKyBsaXN0IChtYWluX2RlcHMpKQorICAgICAgICBpZiBt YWluX3Byb2dyYW1fbmVlZHNfbGRsOgorICAgICAgICAgICAgY21kICs9IFsiLWxkbCJdCisg ICAgICAgIHJ1bl9jbWQgKGNtZCkKKworIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGVudW1lcmF0 ZSBwZXJtdXRhdGlvbnMgb2YgZGVwZW5kZW5jaWVzCituZWVkX3Blcm11dGF0aW9uX3Byb2Nl c3NpbmcgPSBGYWxzZSAgICAgICAKK2lmIG9ial9kZXBfcGVybXV0YXRpb25zOgorICAgICMg QWRqdXN0IG9ial9kZXBfcGVybXV0YXRpb25zIGludG8gbWFwIG9mIG9iamVjdCAtPiBkZXBl bmRlbmN5IHBlcm11dGF0aW9ucworICAgIGZvciByIGluIG9ial9kZXBfcGVybXV0YXRpb25z Lml0ZW1zKCk6CisgICAgICAgIG9iaiA9IHJbMF0KKyAgICAgICAgaWYgb2JqIGluIG9ial9k ZXBzIGFuZCBsZW4ob2JqX2RlcHNbb2JqXSkgPiAxOgorICAgICAgICAgICAgZGVwcyA9IG9i al9kZXBzW29ial0KKyAgICAgICAgICAgIG9ial9kZXBfcGVybXV0YXRpb25zW29ial0gPSBs aXN0IChpdGVydG9vbHMucGVybXV0YXRpb25zIChkZXBzKSkKKyAgICAgICAgICAgIG5lZWRf cGVybXV0YXRpb25fcHJvY2Vzc2luZyA9IFRydWUKKwordGVzdF9zdWJpbmRleCA9IDEKK2N1 cnJfcGVybXMgPSBbXQorZGVmIGVudW1fcGVybXV0YXRpb25zIChwZXJtX2xpc3QpOgorICAg IGdsb2JhbCB0ZXN0X25hbWUsIG9ial9kZXBzLCB0ZXN0X3N1YmluZGV4LCBjdXJyX3Blcm1z CisgICAgaWYgbGVuKHBlcm1fbGlzdCkgPj0gMToKKyAgICAgICAgY3VyciA9IHBlcm1fbGlz dFswXQorICAgICAgICBvYmogPSBjdXJyWzBdCisgICAgICAgIHBlcm1zID0gY3VyclsxXQor ICAgICAgICBpZiBub3QgcGVybXM6CisgICAgICAgICAgICAjIFRoaXMgbWF5IGJlIGFuIGVt cHR5IGxpc3QgaWYgbm8gbXVsdGlwbGUgZGVwZW5kZW5jaWVzIHRvIHBlcm11dGUKKyAgICAg ICAgICAgICMgd2VyZSBmb3VuZCwgc2tpcCB0byBuZXh0IGluIHRoaXMgY2FzZQorICAgICAg ICAgICAgZW51bV9wZXJtdXRhdGlvbnMgKHBlcm1fbGlzdFsxOl0pCisgICAgICAgIGVsc2U6 CisgICAgICAgICAgICBmb3IgZGVwcyBpbiBwZXJtczoKKyAgICAgICAgICAgICAgICBvYmpf ZGVwc1tvYmpdID0gZGVwcworICAgICAgICAgICAgICAgIHBlcm1zdHIgPSAiIiBpZiBvYmog PT0gIiMiIGVsc2Ugb2JqICsgIl8iCisgICAgICAgICAgICAgICAgcGVybXN0ciArPSBzdHIu am9pbiAoJycsIGRlcHMpCisgICAgICAgICAgICAgICAgY3Vycl9wZXJtcy5hcHBlbmQgKHBl cm1zdHIpIAorICAgICAgICAgICAgICAgIGVudW1fcGVybXV0YXRpb25zIChwZXJtX2xpc3Rb MTpdKQorICAgICAgICAgICAgICAgIGN1cnJfcGVybXMgPSBjdXJyX3Blcm1zWzA6bGVuKGN1 cnJfcGVybXMpLTFdCisgICAgZWxzZToKKyAgICAgICAgIyBvYmpfZGVwcyBpcyBub3cgaW5z dGFudGlhdGVkIHdpdGggb25lIGRlcGVuZGVuY3kgb3JkZXIgcGVybXV0YXRpb24KKyAgICAg ICAgIyAoYWNyb3NzIGFsbCBvYmplY3RzIHRoYXQgaGF2ZSBtdWx0aXBsZSBwZXJtdXRhdGlv bnMpCisgICAgICAgICMgTm93IHByb2Nlc3MgYSB0ZXN0Y2FzZQorICAgICAgICAjaWYgbm90 IG9zLnBhdGguZXhpc3RzIChvYmpwZnggKyBiYXNlX3Rlc3RfbmFtZSsgIi1wZXJtdXRhdGlv bnMvIik6CisgICAgICAgICMgICAgb3MubWtkaXIgKG9ianBmeCArIGJhc2VfdGVzdF9uYW1l KyAiLXBlcm11dGF0aW9ucy8iKQorICAgICAgICBwcm9jZXNzX3Rlc3RjYXNlIChiYXNlX3Rl c3RfbmFtZSArICJfIiArIHN0ciAodGVzdF9zdWJpbmRleCkKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgKyAiLSIgKyBzdHIuam9pbiAoJy0nLCBjdXJyX3Blcm1zKSkKKyAgICAgICAg dGVzdF9zdWJpbmRleCArPSAxCisKK2lmIG5lZWRfcGVybXV0YXRpb25fcHJvY2Vzc2luZzoK KyAgICBlbnVtX3Blcm11dGF0aW9ucyAobGlzdCAob2JqX2RlcF9wZXJtdXRhdGlvbnMuaXRl bXMoKSkpCitlbHNlOgorICAgICMgV2UgaGF2ZSBubyBwZXJtdXRhdGlvbnMgdG8gZW51bWVy YXRlLCBqdXN0IHByb2Nlc3MgdGVzdGNhc2Ugbm9ybWFsbHkKKyAgICBwcm9jZXNzX3Rlc3Rj YXNlICh0ZXN0X25hbWUpCisK --------------14E000CABCA0C62AA63BC483--