From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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-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-Spam-SWARE-Status: No, score=-15.8 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy=case-sensitive, casesensitive, enumerate, DEP 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: Thu, 25 Jul 2019 18:46:00 -0000 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" X-SW-Source: 2019-07/txt/msg00590.txt.bz2 --------------14E000CABCA0C62AA63BC483 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1856 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" Content-length: 32818 ZGlmZiAtLWdpdCBhL2VsZi9NYWtlZmlsZSBiL2VsZi9NYWtlZmlsZQppbmRl eCBhM2VlZmQxLi4xYzRlOTQxIDEwMDY0NAotLS0gYS9lbGYvTWFrZWZpbGUK KysrIGIvZWxmL01ha2VmaWxlCkBAIC0zODMsNiArMzgzLDQ4IEBAIHRlc3Rz LXNwZWNpYWwgKz0gJChvYmpwZngpb3JkZXItY21wLm91dCAkKG9ianBmeCl0 c3QtYXJyYXkxLWNtcC5vdXQgXAogCQkgJChvYmpwZngpdHN0LXVudXNlZC1k ZXAtY21wLm91dAogZW5kaWYKIAorIyBEU08gc29ydGluZyB0ZXN0czoKKyMg VGhlIGRzby1vcmRlcmluZy10ZXN0LnB5IHNjcmlwdCBnZW5lcmF0ZXMgdGVz dGNhc2Ugc291cmNlIGZpbGVzIGluICQob2JqcGZ4KSwKKyMgYW5kIG91dHB1 dHMgTWFrZWZpbGUgZnJhZ21lbnRzIGZvciB1c2UgaGVyZS4gSG93ZXZlciBi ZWNhdXNlIG5vcm1hbCBvdXRwdXQKKyMgZnJvbSAkKHNoZWxsIC4uKSBoYXMg bmV3bGluZXMgY2hhbmdlZCBpbnRvIHNwYWNlcywgd2UgaGF2ZSB0byBzYXZl IGl0IHRvIGEKKyMgdGVtcG9yYXJ5IGZpbGUgYW5kIHRoZW4gaW5jbHVkZSBp dC4gV2Ugd3JhcCB0aGlzIGVudGlyZSB0ZXN0Y2FzZSBjb25zdHJ1Y3Rpb24K KyMgaW50byBhIGZ1bmN0aW9uIGhlcmUgdG8gbWFrZSB0aGluZ3MgbW9yZSBj b252ZW5pZW50LgorZGVmaW5lIHRlc3RfZHNvX29yZGVyaW5nCiskKHNoZWxs ICQoUFlUSE9OKSAkKC4uKXNjcmlwdHMvZHNvLW9yZGVyaW5nLXRlc3QucHkg XAorCSQoMikgJCgxKSAkKG9ianBmeCkgPiAkKG9ianBmeCkkKDEpLnRtcC1t YWtlZmlsZSkKKyQoc2hlbGwgZWNobyAkKDMpID4gJChvYmpwZngpJCgxKS5l eHApCitpbmNsdWRlICQob2JqcGZ4KSQoMSkudG1wLW1ha2VmaWxlCitlbmRl ZgorCisjIEluZGl2aWR1YWwgRFNPIHNvcnRpbmcgdGVzdHMuIFRoZSB0ZXN0 IGRlc2NyaXB0aW9uIGFuZCBleHBlY3RlZCBvdXRwdXQgZm9yCisjIGVhY2gg dGVzdCBpcyBzcGVjaWZpZWQgZGlyZWN0bHkgaGVyZS4gU2VlIHRoZSBzb3Vy Y2Ugb2YgZHNvLW9yZGVyaW5nLXRlc3QucHkKKyMgZm9yIGRvY3VtZW50YXRp b24gb24gdGhpcy4KKyMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY3JlYXRlIHRo ZSAkKG9ianBmeCkgZGlyZWN0b3J5IGhlcmUgaW1tZWRpYXRlbHkgdG8gaG9s ZAorIyB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBhbmQgTWFrZWZpbGUg ZnJhZ21lbnRzLgorJChzaGVsbCBta2RpciAtcCAkKG9ianBmeCkpCiskKGV2 YWwgJChjYWxsIHRlc3RfZHNvX29yZGVyaW5nLHRzdC1kc28tb3JkZXJpbmcx LCdhLT5iLT5jJywnY2Jhe31hYmMnKSkKKyQoZXZhbCAkKGNhbGwgdGVzdF9k c29fb3JkZXJpbmcsdHN0LWRzby1vcmRlcmluZzIsXAorCSdhLT5iLT5bY2Rd LT5lJywnZWRjYmF7fWFiY2RlJykpCiskKGV2YWwgJChjYWxsIHRlc3RfZHNv X29yZGVyaW5nLHRzdC1kc28tb3JkZXJpbmczLFwKKwknYS0+W2JjXS0+W2Rl Zl0tPltnaF0tPmknLCdpaGdmZWRjYmF7fWFiY2RlZmdoaScpKQorJChldmFs ICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0c3QtZHNvLW9yZGVyaW5nNCxc CisJJ2EtPmItPltkZV07YS0+Yy0+ZC0+ZScsJ2VkY2Jhe31hYmNkZScpKQor JChldmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0c3QtZHNvLW9yZGVy aW5nNSxcCisJJ2EtPltiY10tPmQ7Yi0+YycsJ2RjYmF7fWFiY2QnKSkKKyQo ZXZhbCAkKGNhbGwgdGVzdF9kc29fb3JkZXJpbmcsdHN0LWRzby1vcmRlcmlu ZzYsXAorCSdhLT5bYmNkZV0tPmYnLCdmZWRjYmF7fWFiY2RlZicpKQorJChl dmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0c3QtZHNvLW9yZGVyaW5n NyxcCisJJ2EtPltiY107Yi0+W2NkZV07ZS0+ZicsJ2ZlZGNiYXt9YWJjZGVm JykpCiskKGV2YWwgJChjYWxsIHRlc3RfZHNvX29yZGVyaW5nLHRzdC1kc28t b3JkZXJpbmc4LFwKKwknYS0+Yi0+Yz0+YTt7fS0+W2JhXScsJ2NiYXt9YWJj JykpCiskKGV2YWwgJChjYWxsIHRlc3RfZHNvX29yZGVyaW5nLHRzdC1kc28t b3JkZXJpbmc5LFwKKwknYS0+Yi0+Yy0+ZC0+ZTt7fSEtPlthYmNkZV0nLCdl ZGNiYXt9YWJjZGUnKSkKKworIyBGcm9tIEJaICMxNTMxMQorJChldmFsICQo Y2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0c3QtYnoxNTMxMSxcCisneythOytl OytmOytnOytkOyVkOy1kOy1nOy1mOy1lOy1hfTthLT5iLT5jLT5kO2Q9Plti YV07Yz0+YTtiPT5lPT5hO2M9PmY9PmI7ZD0+Zz0+YycsXAorJ3srYVtkY2Jh XTsrZVtlXTsrZltmXTsrZ1tnXTsrZFtdOzxkPGI8ZTxhPj4+PGE+PGc8Yzxh PjxmPGI8ZTxhPj4+Pj4+PjstZFtdOy1nW107LWZbXTstZVtdOy1hW2dmYWJj ZGVdO30nKSkKKwogY2hlY2stYWJpOiAkKG9ianBmeCljaGVjay1hYmktbGQu b3V0CiB0ZXN0cy1zcGVjaWFsICs9ICQob2JqcGZ4KWNoZWNrLWFiaS1sZC5v dXQKIHVwZGF0ZS1hYmk6IHVwZGF0ZS1hYmktbGQKZGlmZiAtLWdpdCBhL3Nj cmlwdHMvZHNvLW9yZGVyaW5nLXRlc3QucHkgYi9zY3JpcHRzL2Rzby1vcmRl cmluZy10ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAuLmE0OTRiYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Rzby1v cmRlcmluZy10ZXN0LnB5CkBAIC0wLDAgKzEsNTU2IEBACisjIS91c3IvYmlu L3B5dGhvbjMKKyMgR2VuZXJhdGUgdGVzdGNhc2UgZmlsZXMgYW5kIE1ha2Vm aWxlIGZyYWdtZW50cyBmb3IgRFNPIHNvcnRpbmcgdGVzdAorIyBDb3B5cmln aHQgKEMpIDIwMTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisj IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorIwor IyBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBM aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uOyBlaXRoZXIKKyMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2Us IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisj IFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m CisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExlc3NlciBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91 bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2Vu ZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBM aWJyYXJ5OyBpZiBub3QsIHNlZQorIyA8aHR0cDovL3d3dy5nbnUub3JnL2xp Y2Vuc2VzLz4uCisKKyIiIkdlbmVyYXRlIHRlc3RjYXNlIGZpbGVzIGFuZCBN YWtlZmlsZSBmcmFnbWVudHMgZm9yIERTTyBzb3J0aW5nIHRlc3QKKworVGhp cyBzY3JpcHQgdGFrZXMgYSBzZW1pY29sb24tc2VwYXJhdGVkIGRlc2NyaXB0 aW9uIHN0cmluZywgYW5kIGdlbmVyYXRlcworYSB0ZXN0Y2FzZSwgaW5jbHVk aW5nIG1haW4gcHJvZ3JhbSBhbmQgYXNzb2NpYXRlZCBtb2R1bGVzLCBhbmQg TWFrZWZpbGUKK2ZyYWdtZW50cyBmb3IgaW5jbHVkaW5nIGludG8gZWxmL01h a2VmaWxlLgorCitUaGlzIGlzIGludGVuZGVkIHRvIHNwZWVkIHVwIGNvbXBs ZXggZHluYW1pYyBsaW5rZXIgdGVzdGNhc2UgY29uc3RydWN0aW9uLAordGhl cmVmb3JlIGZlYXR1cmVzIGFyZSBsYXJnZWx5IG1lY2hhbmljYWwgaW4gbmF0 dXJlOyBpbmNvbnNpc3RlbmNpZXMgb3IKK2Vycm9ycyBtYXkgb2NjdXIgaWYg aW5wdXQgY2FzZSB3YXMgaXRzZWxmIGVycm9yb25vdXMgb3IgaGF2ZQordW5m b3Jlc2VlbiBpbnRlcmFjdGlvbnMuCisKK09uIHRoZSBkZXNjcmlwdGlvbiBs YW5ndWFnZSB1c2VkLCBhcyBhbiBleGFtcGxlIGRlc2NyaXB0aW9uIHN0cmlu ZzoKKworICBhLT5iIS0+W2NkZWZdO2M9Pmc9Pmg7eytjOyVjOy1jfS0+YQor CitFYWNoIHNpbmdsZSBhbHBoYWJldCBjaGFyYWN0ZXIgcmVwcmVzZW50cyBh IHNoYXJlZCBvYmplY3QgbW9kdWxlIChjdXJyZW50bHkKK1thLXpBLVowLTld IGFyZSBhbGxvd2VkLCBjYXNlLXNlbnNpdGl2ZSkKK0FsbCBzdWNoIHNoYXJl ZCBvYmplY3RzIGhhdmUgYSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGdlbmVy YXRlZCBmb3IgdGhlbQordGhhdCBlbWl0cyBpdHMgc2luZ2xlIGNoYXJhY3Rl ciBuYW1lIGJ5IHB1dGNoYXIoKS4KKworVGhlIC0+IG9wZXJhdG9yIHNwZWNp ZmllcyBhIGxpbmsgdGltZSBkZXBlbmRlbmN5LCB0aGVzZSBjYW4gYmUgY2hh aW5lZCBmb3IKK2NvbnZlbmllbmNlIChlLmcuIGEtPmItPmMtPmQpLgorCitU aGUgPT4gb3BlcmF0b3IgY3JlYXRlcyBhIGNhbGwtcmVmZXJlbmNlLCBlLmcu IGZvciBhPT5iLCBhbiBmbl9hKCkgZnVuY3Rpb24KK2lzIGNyZWF0ZWQgaW5z aWRlIG1vZHVsZSAnYScsIHdoaWNoIGNhbGxzIGZuX2IoKSBpbiBtb2R1bGUg J2InLgorVGhlc2UgbW9kdWxlIGZ1bmN0aW9ucyBlbWl0ICc8bmFtZT4nIG91 dHB1dCBpbiBuZXN0ZWQgZm9ybSwKK2UuZy4gYT0+YiBlbWl0cyAnPGE8Yj4+ JworCitTcXVhcmUgYnJhY2tldHMgW10gaW4gdGhlIGRlc2NyaXB0aW9uIHNw ZWNpZmllcyBtdWx0aXBsZSBvYmplY3RzOworZS5nLiBhLT5bYmNkXS0+ZSBp cyBlcXVpdmFsZW50IHRvIGEtPmItPmU7YS0+Yy0+ZTthLT5kLT5lCisKK0Eg e30gY29uc3RydWN0IHNwZWNpZmllcyB0aGUgbWFpbiB0ZXN0IHByb2dyYW0s IGFuZCBpdHMgbGluayBkZXBlbmRlbmNpZXMKK2FyZSBhbHNvIHNwZWNpZmll ZCB1c2luZyAtPi4gSW5zaWRlIHt9LCBhIGZldyA7LXNlcGVyYXRlZCBjb25z dHJ1Y3RzIGFyZQorYWxsb3dlZDoKKyAgICAgICAgICthICAgTG9hZHMgbW9k dWxlIGEgdXNpbmcgZGxvcGVuKFJUTERfTEFaWXxSVExEX0dMT0JBTCkKKyAg ICAgICAgIDphICAgTG9hZHMgbW9kdWxlIGEgdXNpbmcgZGxvcGVuKFJUTERf TEFaWSkKKyAgICAgICAgICVhICAgVXNlIGRsc3ltKCkgdG8gbG9hZCBhbmQg Y2FsbCBmbl9hKCkKKyAgICAgICAgIEBhICAgQ2FsbHMgZm5fYSgpIGRpcmVj dGx5LgorICAgICAgICAgLWEgICBVbmxvYWRzIG1vZHVsZSBhIHVzaW5nIGRs Y2xvc2UoKQorCitUaGUgZ2VuZXJhdGVkIG1haW4gcHJvZ3JhbSBvdXRwdXRz ICd7JyAnfScgd2l0aCBhbGwgb3V0cHV0IGZyb20gYWJvdmUKK2NvbnN0cnVj dHMgaW4gYmV0d2Vlbi4gVGhlIG90aGVyIG91dHB1dCBiZWZvcmUvYWZ0ZXIg e30gYXJlIHRoZSBvcmRlcmVkCitjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIG91 dHB1dC4KKworSWYgbm8ge30gY29uc3RydWN0IGlzIHByZXNlbnQsIGEgZGVm YXVsdCBlbXB0eSBtYWluIHByb2dyYW0gaXMgbGlua2VkCithZ2FpbnN0IGFs bCBvYmplY3RzIHdoaWNoIGhhdmUgbm8gZGVwZW5kZW5jeSBsaW5rZWQgdG8g aXQuIGUuZy4gZm9yCisnW2FiXS0+YztkLT5lJywgdGhlIGRlZmF1bHQgbWFp biBwcm9ncmFtIGlzIGVxdWl2YWxlbnQgdG8gJ3t9LT5bYWJkXScKKworVGhl ICchJyBvcGVyYXRvciBhZnRlciBvYmplY3QgbmFtZXMgdHVybnMgb24gcGVy bXV0YXRpb24gb2YgaXRzCitkZXBlbmRlbmNpZXMsIGUuZy4gd2hpbGUgYS0+ W2JjZF0gb25seSBnZW5lcmF0ZXMgb25lIHNldCBvZiBvYmplY3RzLAord2l0 aCAnYS5zbycgYnVpbHQgd2l0aCBhIGxpbmsgbGluZSBvZiAiYi5zbyBjLnNv IGQuc28iLCBmb3IgYSEtPltiY2RdCitwZXJtdXRhdGlvbnMgb2YgYSdzIGRl cGVuZGVuY2llcyBjcmVhdGVzIG11bHRpcGxlIHRlc3RjYXNlcyB3aXRoCitk aWZmZXJlbnQgbGluayBsaW5lIG9yZGVyczogImIuc28gYy5zbyBkLnNvIiwg ImMuc28gYi5zbyBkLnNvIiwKKyJiLnNvIGQuc28gYy5zbyIsIGV0Yy4gTm90 ZSB0aGF0IGZvciBhIDx0ZXN0LW5hbWU+IHNwZWNpZmllZCBvbgordGhlIHNj cmlwdCBjb21tYW5kLWxpbmUsIG11bHRpcGxlIDx0ZXN0LW5hbWVfMT4sIDx0 ZXN0LW5hbWVfMj4sIGV0Yy4KK3Rlc3RzIHdpbGwgYmUgZ2VuZXJhdGVkIChl LmcuIGZvciBhIS0+W2JjXSEtPltkZV0sIGVpZ2h0IHRlc3RzIHdpdGgKK2Rp ZmZlcmVudCBsaW5rIG9yZGVycyBmb3IgYSwgYiwgYW5kIGMgd2lsbCBiZSBn ZW5lcmF0ZWQpCisKKyIiIgorCitpbXBvcnQgcmUKK2ltcG9ydCBvcworaW1w b3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBhcmdwYXJzZQorZnJvbSBjb2xsZWN0 aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKK2ltcG9ydCBpdGVydG9vbHMKKwor IyBCVUlMRF9HQ0MgaXMgb25seSB1c2VkIHVuZGVyIHRoZSAtLWJ1aWxkIG9w dGlvbiwKKyMgd2hpY2ggYnVpbGRzIHRoZSBnZW5lcmF0ZWQgdGVzdGNhc2Us IGluY2x1ZGluZyBEU09zIHVzaW5nIEJVSUxEX0dDQy4KKyMgTWFpbmx5IGZv ciB0ZXN0aW5nIHB1cnBvc2VzLCBlc3BlY2lhbGx5IGRlYnVnZ2luZyBvZiB0 aGlzIHNjcmlwdCwKKyMgYW5kIGNhbiBiZSBjaGFuZ2VkIGhlcmUgdG8gYW5v dGhlciB0b29sY2hhaW4gcGF0aCBpZiBuZWVkZWQuCitidWlsZF9nY2MgPSAi Z2NjIgorCitwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCitw YXJzZXIuYWRkX2FyZ3VtZW50KCJkZXNjcmlwdGlvbiIsCisgICAgICAgICAg ICAgICAgICAgIGhlbHA9IkRlc2NyaXB0aW9uIHN0cmluZyBvZiBEU08gZGVw ZW5kZW5jeSB0ZXN0IHRvIGJlICIKKyAgICAgICAgICAgICAgICAgICAgImdl bmVyYXRlZCAoc2VlIHNjcmlwdCBzb3VyY2UgZm9yIGRvY3VtZW50YXRpb24g b2YgIgorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24gbGFuZ3Vh Z2UpIikKK3BhcnNlci5hZGRfYXJndW1lbnQoInRlc3RfbmFtZSIsIGhlbHA9 IklkZW50aWZpZXIgZm9yIHRlc3RjYXNlIGJlaW5nICIKKyAgICAgICAgICAg ICAgICAgICAgImdlbmVyYXRlZCIpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCJv YmpwZngiLAorICAgICAgICAgICAgICAgICAgICBoZWxwPSJQYXRoIHRvIHBs YWNlIGdlbmVyYXRlZCBmaWxlcywgZGVmYXVsdHMgdG8gIgorICAgICAgICAg ICAgICAgICAgICAiY3VycmVudCBkaXJlY3RvcnkgaWYgbm9uZSBzcGVjaWZp ZWQiLAorICAgICAgICAgICAgICAgICAgICBuYXJncz0iPyIsIGRlZmF1bHQ9 Ii4vIikKK3BhcnNlci5hZGRfYXJndW1lbnQoIi0tYnVpbGQiLCBoZWxwPSJB ZnRlciBDIHRlc3RjYXNlIGdlbmVyYXRlZCwgYnVpbGQgaXQgIgorICAgICAg ICAgICAgICAgICAgICAidXNpbmcgZ2NjIChmb3IgbWFudWFsIHRlc3Rpbmcg cHVycG9zZXMpIiwKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9y ZV90cnVlIikKK3BhcnNlci5hZGRfYXJndW1lbnQoIi0tZGVidWctb3V0cHV0 IiwgaGVscD0iUHJpbnRzIHNvbWUgaW50ZXJuYWwgZGF0YSAiCisgICAgICAg ICAgICAgICAgICAgICJzdHJ1Y3R1cmVzOyB1c2VkIGZvciBkZWJ1Z2dpbmcg b2YgdGhpcyBzY3JpcHQiLAorICAgICAgICAgICAgICAgICAgICBhY3Rpb249 InN0b3JlX3RydWUiKQorY21kbGluZWFyZ3MgPSBwYXJzZXIucGFyc2VfYXJn cygpCitiYXNlX3Rlc3RfbmFtZSA9IGNtZGxpbmVhcmdzLnRlc3RfbmFtZQor dGVzdF9uYW1lID0gY21kbGluZWFyZ3MudGVzdF9uYW1lCitvYmpwZnggPSBj bWRsaW5lYXJncy5vYmpwZngKKworb2JqX2RlcHMgPSBPcmRlcmVkRGljdCgp CitvYmpfY2FsbHJlZnMgPSBPcmRlcmVkRGljdCgpCisKK2FsbF9vYmpzID0g W10KK2N1cnJfb2JqcyA9IFtdCisKK29ial9kZXBfcGVybXV0YXRpb25zID0g T3JkZXJlZERpY3QoKQorCisjIEFkZCAnb2JqZWN0IC0+IFtvYmplY3QsIG9i amVjdCwgLi4uXScgcmVsYXRpb25zIHRvIENVUlJfTUFQCitkZWYgYWRkX2Rl cHMgKHNyY19vYmpzLCBkc3Rfb2JqcywgY3Vycl9tYXApOgorICAgIGZvciBz cmMgaW4gc3JjX29ianM6CisgICAgICAgIGZvciBkc3QgaW4gZHN0X29ianM6 CisgICAgICAgICAgICBpZiBub3Qgc3JjIGluIGN1cnJfbWFwOgorICAgICAg ICAgICAgICAgIGN1cnJfbWFwW3NyY10gPSBbXQorICAgICAgICAgICAgaWYg bm90IGRzdCBpbiBjdXJyX21hcFtzcmNdOgorICAgICAgICAgICAgICAgIGN1 cnJfbWFwW3NyY10uYXBwZW5kIChkc3QpCisKKyMgRm9yIGluc2lkZSB0aGUg e30gY29uc3RydWN0CittYWluX3Byb2dyYW0gPSBbXQorbWFpbl9wcm9ncmFt X25lZWRzX2xkbCA9IEZhbHNlCittYWluX3Byb2dyYW1fZGVmYXVsdF9kZXBz ID0gVHJ1ZQorZGVmIHByb2Nlc3NfbWFpbl9wcm9ncmFtIChtYWlucHJvZ19z dHIpOgorICAgIGdsb2JhbCBtYWluX3Byb2dyYW0KKyAgICBnbG9iYWwgbWFp bl9wcm9ncmFtX25lZWRzX2xkbAorICAgIGdsb2JhbCBtYWluX3Byb2dyYW1f ZGVmYXVsdF9kZXBzCisgICAgaWYgbWFpbnByb2dfc3RyOgorICAgICAgICBt YWluX3Byb2dyYW0gPSBtYWlucHJvZ19zdHIuc3BsaXQgKCc7JykKKyAgICBm b3IgcyBpbiBtYWluX3Byb2dyYW06CisgICAgICAgIG0gPSByZS5tYXRjaCAo ciJeKFsrXC0lOkBdKShbMC05YS16QS1aXSspJCIsIHMpCisgICAgICAgIGlm IG5vdCBtOiBwcmludCAoIiclcyciICUgKHMpKQorICAgICAgICBhc3NlcnQg KG0pCisgICAgICAgICMgRGV0ZXJtaW5lZCB0aGUgbWFpbiBwcm9ncmFtIG5l ZWRzIGxpYmRsCisgICAgICAgIG1haW5fcHJvZ3JhbV9uZWVkc19sZGwgPSBU cnVlCisgICAgICAgIGlmIGxlbihtLmdyb3VwKDIpKSA+IDE6CisgICAgICAg ICAgICBwcmludCAoIkVycm9yOiBvbmx5IHNpbmdsZSBjaGFyYWN0ZXIgb2Jq ZWN0IG5hbWVzIGFsbG93ZWQsICIKKyAgICAgICAgICAgICAgICAgICArICIn JXMnIGlzIGludmFsaWQiICUgKG0uZ3JvdXAoMSkpKQorICAgICAgICAgICAg ZXhpdCAtMQorICAgICAgICBvYmogPSBtLmdyb3VwKDIpCisgICAgICAgIGlm IG5vdCBvYmogaW4gYWxsX29ianM6CisgICAgICAgICAgICBhbGxfb2Jqcy5h cHBlbmQgKG9iaikKKyAgICAgICAgaWYgbS5ncm91cCgxKSA9PSAnJScgb3Ig bS5ncm91cCgxKSA9PSAnQCc6CisgICAgICAgICAgICBhZGRfZGVwcyAoWycj J10sIFtvYmpdLCBvYmpfY2FsbHJlZnMpCisgICAgIyBXZSBoYXZlIGEgbWFp biBwcm9ncmFtIHNwZWNpZmllZCwgdHVybiB0aGlzIG9mZgorICAgIG1haW5f cHJvZ3JhbV9kZWZhdWx0X2RlcHMgPSBGYWxzZQorCisjIExleGVyIGZvciB0 b2tlbnMKK3Rva2Vuc3BlYyA9IFsgKCJPQkoiLCAgICAgIHIiKFswLTlhLXpB LVpdKykiKSwKKyAgICAgICAgICAgICAgKCJERVAiLCAgICAgIHIiLT4iKSwK KyAgICAgICAgICAgICAgKCJDQUxMUkVGIiwgIHIiPT4iKSwKKyAgICAgICAg ICAgICAgKCJPQkpTRVQiLCAgIHIiXFsoWzAtOWEtekEtWl0rKVxdIiksCisg ICAgICAgICAgICAgICgiUFJPRyIsICAgICByInsoWzAtOWEtekEtWjsrOlwt JUBdKil9IiksCisgICAgICAgICAgICAgICgiUEVSTVVURSIsICByIiEiKSwK KyAgICAgICAgICAgICAgKCJTRU1JQ09MIiwgIHIiOyIpLAorICAgICAgICAg ICAgICAoIkVSUk9SIiwgICAgciIuIikgXQordG9rX3JlID0gJ3wnLmpvaW4o Jyg/UDwlcz4lcyknICUgcGFpciBmb3IgcGFpciBpbiB0b2tlbnNwZWMpCisK KyMgU3RhdGUgdXNlZCB3aGVuIHBhcnNpbmcgZGVwZW5kZW5jaWVzCitpbl9k ZXAgPSBGYWxzZQoraW5fY2FsbHJlZiA9IEZhbHNlCitkZWYgY2xlYXJfZGVw X3N0YXRlICgpOgorICAgIGdsb2JhbCBpbl9kZXAsIGluX2NhbGxyZWYKKyAg ICBpbl9kZXAgPSBpbl9jYWxscmVmID0gRmFsc2UKKworIyBNYWluIHBhcnNl cgorZm9yIG0gaW4gcmUuZmluZGl0ZXIodG9rX3JlLCBjbWRsaW5lYXJncy5k ZXNjcmlwdGlvbik6CisgICAga2luZCA9IG0ubGFzdGdyb3VwCisgICAgdmFs dWUgPSBtLmdyb3VwICgpCisgICAgaWYga2luZCA9PSAiT0JKIjoKKyAgICAg ICAgaWYgbGVuICh2YWx1ZSkgPiAxOgorICAgICAgICAgICAgcHJpbnQgKCJF cnJvcjogb25seSBzaW5nbGUgY2hhcmFjdGVyIG9iamVjdCBuYW1lcyBhbGxv d2VkLCAiCisgICAgICAgICAgICAgICAgICAgKyAiJyVzJyBpcyBpbnZhbGlk IiAlICh2YWx1ZSkpCisgICAgICAgICAgICBleGl0ICgtMSkKKyAgICAgICAg aWYgaW5fZGVwOgorICAgICAgICAgICAgYWRkX2RlcHMgKGN1cnJfb2Jqcywg W3ZhbHVlXSwgb2JqX2RlcHMpCisgICAgICAgIGVsaWYgaW5fY2FsbHJlZjoK KyAgICAgICAgICAgIGFkZF9kZXBzIChjdXJyX29ianMsIFt2YWx1ZV0sIG9i al9jYWxscmVmcykKKyAgICAgICAgY2xlYXJfZGVwX3N0YXRlICgpCisgICAg ICAgIGN1cnJfb2JqcyA9IFt2YWx1ZV0KKyAgICAgICAgaWYgbm90IHZhbHVl IGluIGFsbF9vYmpzOgorICAgICAgICAgICAgYWxsX29ianMuYXBwZW5kICh2 YWx1ZSkKKworICAgIGVsaWYga2luZCA9PSAiT0JKU0VUIjoKKyAgICAgICAg b2Jqc2V0ID0gdmFsdWVbMTpsZW4odmFsdWUpLTFdCisgICAgICAgIGlmIGlu X2RlcDoKKyAgICAgICAgICAgIGFkZF9kZXBzIChjdXJyX29ianMsIGxpc3Qg KG9ianNldCksIG9ial9kZXBzKQorICAgICAgICBlbGlmIGluX2NhbGxyZWY6 CisgICAgICAgICAgICBhZGRfZGVwcyAoY3Vycl9vYmpzLCBsaXN0IChvYmpz ZXQpLCBvYmpfY2FsbHJlZnMpCisgICAgICAgIGNsZWFyX2RlcF9zdGF0ZSAo KQorICAgICAgICBjdXJyX29ianMgPSBsaXN0IChvYmpzZXQpCisgICAgICAg IGZvciBvIGluIGxpc3QgKG9ianNldCk6CisgICAgICAgICAgICBpZiBub3Qg byBpbiBhbGxfb2JqczoKKyAgICAgICAgICAgICAgICBhbGxfb2Jqcy5hcHBl bmQgKG8pCisKKyAgICBlbGlmIGtpbmQgPT0gIlBFUk1VVEUiOgorICAgICAg ICBpZiBpbl9kZXAgb3IgaW5fY2FsbHJlZjoKKyAgICAgICAgICAgIHByaW50 ICgiRXJyb3I6IHN5bnRheCBlcnJvciwgcGVybXV0ZSBvcGVyYXRpb24gaW52 YWxpZCBoZXJlIikKKyAgICAgICAgICAgIGV4aXQgLTEKKyAgICAgICAgaWYg bm90IGN1cnJfb2JqczoKKyAgICAgICAgICAgIHByaW50ICgiRXJyb3I6IHN5 bnRheCBlcnJvciwgbm8gb2JqZWN0cyB0byBwZXJtdXRlIGhlcmUiKQorICAg ICAgICAgICAgZXhpdCAtMQorICAgICAgICBmb3Igb2JqIGluIGN1cnJfb2Jq czoKKyAgICAgICAgICAgIGlmIG5vdCBvYmogaW4gb2JqX2RlcF9wZXJtdXRh dGlvbnM6CisgICAgICAgICAgICAgICAgIyBTaWduYWwgdGhpcyBvYmplY3Qg aGFzIHBlcm11dGF0ZWQgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAg b2JqX2RlcF9wZXJtdXRhdGlvbnNbb2JqXSA9IFtdCisKKyAgICBlbGlmIGtp bmQgPT0gIlBST0ciOgorICAgICAgICBpZiBtYWluX3Byb2dyYW06CisgICAg ICAgICAgICBwcmludCAoIkVycm9yOiBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4g b25lIG1haW4gcHJvZ3JhbSIpCisgICAgICAgICAgICBleGl0ICgtMSkKKyAg ICAgICAgaWYgaW5fZGVwOgorICAgICAgICAgICAgcHJpbnQgKCJFcnJvcjog b2JqZWN0cyBjYW5ub3QgaGF2ZSBkZXBlbmRlbmN5IG9uIG1haW4gcHJvZ3Jh bSIpCisgICAgICAgICAgICBleGl0ICgtMSkKKyAgICAgICAgaWYgaW5fY2Fs bHJlZjoKKyAgICAgICAgICAgIGFkZF9kZXBzIChjdXJyX29ianMsIFsiIyJd LCBvYmpfY2FsbHJlZnMpCisgICAgICAgIHByb2Nlc3NfbWFpbl9wcm9ncmFt ICh2YWx1ZVsxOmxlbih2YWx1ZSktMV0pCisgICAgICAgIGNsZWFyX2RlcF9z dGF0ZSAoKQorICAgICAgICBjdXJyX29ianMgPSBbIiMiXQorCisgICAgZWxp ZiBraW5kID09ICJERVAiOgorICAgICAgICBpZiBpbl9kZXAgb3IgaW5fY2Fs bHJlZjoKKyAgICAgICAgICAgIHByaW50ICgiRXJyb3I6IHN5bnRheCBlcnJv ciwgbXVsdGlwbGUgY29udGlndW91cyAtPiw9PiBvcGVyYXRpb25zIikKKyAg ICAgICAgICAgIGV4aXQgLTEKKyAgICAgICAgaW5fZGVwID0gVHJ1ZQorCisg ICAgZWxpZiBraW5kID09ICJDQUxMUkVGIjoKKyAgICAgICAgaWYgaW5fZGVw IG9yIGluX2NhbGxyZWY6CisgICAgICAgICAgICBwcmludCAoIkVycm9yOiBz eW50YXggZXJyb3IsIG11bHRpcGxlIGNvbnRpZ3VvdXMgLT4sPT4gb3BlcmF0 aW9ucyIpCisgICAgICAgICAgICBleGl0IC0xCisgICAgICAgIGluX2NhbGxy ZWYgPSBUcnVlCisgICAgICAgIAorICAgIGVsaWYga2luZCA9PSAiU0VNSUNP TCI6CisgICAgICAgIGN1cnJfb2JqcyA9IFtdCisgICAgICAgIGNsZWFyX2Rl cF9zdGF0ZSAoKQorCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgKCJFcnJv cjogdW5rbm93biB0b2tlbiAnJXMnIiAlICh2YWx1ZSkpCisgICAgICAgIGV4 aXQgKC0xKQorCitkZWYgZmluZF9vYmpzX25vdF9kZXBlbmRlZF9vbiAoKToK KyAgICBnbG9iYWwgYWxsX29ianMsIG9ial9kZXBzCisgICAgb2Jqc19ub3Rf ZGVwZW5kZWRfb24gPSBbXQorICAgIGZvciBvYmogaW4gYWxsX29ianM6Cisg ICAgICAgIHNraXAgPSBGYWxzZQorICAgICAgICBmb3IgciBpbiBvYmpfZGVw cy5pdGVtcygpOgorICAgICAgICAgICAgaWYgb2JqIGluIHJbMV06CisgICAg ICAgICAgICAgICAgc2tpcCA9IFRydWUKKyAgICAgICAgICAgICAgICBicmVh aworICAgICAgICBpZiBub3Qgc2tpcDoKKyAgICAgICAgICAgIG9ianNfbm90 X2RlcGVuZGVkX29uLmFwcGVuZCAob2JqKQorICAgIHJldHVybiBvYmpzX25v dF9kZXBlbmRlZF9vbgorICAgICAgICAKKyMgSWYgbm8gbWFpbiBwcm9ncmFt IHdhcyBzcGVjaWZpZWQgaW4gZGVwZW5kZW5jeSBkZXNjcmlwdGlvbiwgbWFr ZSBhCisjIGRlZmF1bHQgbWFpbiBwcm9ncmFtIHdpdGggZGVwcyBwb2ludGlu ZyB0byBhbGwgRFNPcyB3aGljaCBhcmUgbm90CisjIGRlcGVuZGVkIGJ5IGFu b3RoZXIgRFNPLgoraWYgbWFpbl9wcm9ncmFtX2RlZmF1bHRfZGVwczoKKyAg ICBtYWluX2RlcHMgPSBmaW5kX29ianNfbm90X2RlcGVuZGVkX29uICgpCisg ICAgIyBtYWluX2RlcHMgPSBbXQorICAgICMgZm9yIG8gaW4gYWxsX29ianM6 CisgICAgIyAgICAgc2tpcCA9IEZhbHNlCisgICAgIyAgICAgZm9yIHIgaW4g b2JqX2RlcHMuaXRlbXMoKToKKyAgICAjICAgICAgICAgaWYgbyBpbiByWzFd OgorICAgICMgICAgICAgICAgICAgc2tpcCA9IFRydWUKKyAgICAjICAgICAg ICAgICAgIGJyZWFrCisgICAgIyAgICAgaWYgc2tpcDoKKyAgICAjICAgICAg ICAgY29udGludWUKKyAgICAjICAgICBtYWluX2RlcHMuYXBwZW5kIChvKQor ICAgIGFkZF9kZXBzIChbIiMiXSwgbWFpbl9kZXBzLCBvYmpfZGVwcykgICAg CisgICAgICAgIAorIyBEZWJ1ZyBvdXRwdXQKK2lmIGNtZGxpbmVhcmdzLmRl YnVnX291dHB1dDoKKyAgICBwcmludCAoIkFsbCBvYmplY3RzOiAlcyIgJSAo YWxsX29ianMpKQorICAgIHByaW50ICgiLS0tIFN0YXRpYyBsaW5rIGRlcGVu ZGVuY2llcyAtLS0iKQorICAgIGZvciByIGluIG9ial9kZXBzLml0ZW1zKCk6 CisgICAgICAgIHByaW50ICgiJXMgLT4gJXMiICUgKHJbMF0sIHJbMV0pKQor ICAgIHByaW50ICgiLS0tIE9iamVjdHMgd2hvc2UgZGVwZW5kZW5jaWVzIGFy ZSB0byBiZSBwZXJtdXRhdGVkIC0tLSIpCisgICAgZm9yIHIgaW4gb2JqX2Rl cF9wZXJtdXRhdGlvbnMuaXRlbXMoKToKKyAgICAgICAgcHJpbnQgKCIlcyIg JSAoclswXSkpCisgICAgI3ByaW50IChvYmpfZGVwX3Blcm11dGF0aW9ucykK KyAgICBwcmludCAoIi0tLSBDYWxsIHJlZmVyZW5jZSBkZXBlbmRlbmNpZXMg LS0tIikKKyAgICBmb3IgciBpbiBvYmpfY2FsbHJlZnMuaXRlbXMoKToKKyAg ICAgICAgcHJpbnQgKCIlcyA9PiAlcyIgJSAoclswXSwgclsxXSkpCisgICAg cHJpbnQgKCItLS0gbWFpbiBwcm9ncmFtIC0tLSIpCisgICAgcHJpbnQgKG1h aW5fcHJvZ3JhbSkKKworIyBNYWluIHRlc3RjYXNlIHByb2Nlc3Npbmcgcm91 dGluZSwgZG9lcyBNYWtlZmlsZSBmcmFnbWVudCBnZW5lcmF0aW9uLAorIyB0 ZXN0Y2FzZSBzb3VyY2UgZ2VuZXJhdGlvbiwgYW5kIGlmIC0tYnVpbGQgc3Bl Y2lmaWVkIGJ1aWxkcyB0ZXN0Y2FzZS4KK2RlZiBwcm9jZXNzX3Rlc3RjYXNl ICh0ZXN0X25hbWUpOgorICAgIGdsb2JhbCBvYmpwZngsIGFsbF9vYmpzLCBv YmpfZGVwcywgb2JqX2NhbGxyZWZzCisgICAgZ2xvYmFsIGJhc2VfdGVzdF9u YW1lLCBtYWluX3Byb2dyYW0sIG1haW5fcHJvZ3JhbV9uZWVkc19sZGwKKwor ICAgICMgUHJpbnQgb3V0IG5lZWRlZCBNYWtlZmlsZSBmcmFnbWVudHMgZm9y IHVzZSBpbiBnbGliYy9lbGYvTWFrZWZpbGUuCisgICAgI2lmIG1ha2VmaWxl OgorICAgIHByaW50ICgiaWZlcSAoeWVzLCQoYnVpbGQtc2hhcmVkKSkiKQor ICAgIHQgPSAiIgorICAgIGZvciBvIGluIGFsbF9vYmpzOgorICAgICAgICB0 ICs9ICIgIiArIHRlc3RfbmFtZSArICItIiArIG8KKyAgICBwcmludCAoIm1v ZHVsZXMtbmFtZXMgKz0lcyIgJSAodCkpCisgICAgcHJpbnQgKCJ0ZXN0cyAr PSAlcyIgJSAodGVzdF9uYW1lKSkKKworICAgICMgUHJpbnQgZGlyZWN0IGxp bmsgZGVwZW5kZW5jaWVzIGZvciBlYWNoIERTTworICAgIGZvciBvYmogaW4g YWxsX29ianM6CisgICAgICAgIGlmIG9iaiBpbiBvYmpfZGVwczoKKyAgICAg ICAgICAgIGRzbyA9IHRlc3RfbmFtZSArICItIiArIG9iaiArICIuc28iCisg ICAgICAgICAgICBkZXBzdHIgPSAiIgorICAgICAgICAgICAgZm9yIGRlcCBp biBvYmpfZGVwc1tvYmpdOgorICAgICAgICAgICAgICAgIGRlcHN0ciArPSAi ICQob2JqcGZ4KSIgKyB0ZXN0X25hbWUgKyAiLSIgKyBkZXAgKyAiLnNvIgor ICAgICAgICAgICAgcHJpbnQgKCIkKG9ianBmeCklczolcyIgJSAoZHNvLCBk ZXBzdHIpKQorCisgICAgIyBQcmludCBMREZMQUdTLSogYW5kICotbm8tei1k ZWZzCisgICAgZm9yIG8gaW4gYWxsX29ianM6CisgICAgICAgIGRzbyA9IHRl c3RfbmFtZSArICItIiArIG8gKyAiLnNvIgorICAgICAgICBwcmludCAoIkxE RkxBR1MtJXMgPSAkKG5vLWFzLW5lZWRlZCkiICUgKGRzbykpCisgICAgICAg IGlmIG8gaW4gb2JqX2NhbGxyZWZzOgorICAgICAgICAgICAgcHJpbnQgKCIl cy1uby16LWRlZnMgPSB5ZXMiICUgKGRzbykpCisKKyAgICAjIFByaW50IGRl cGVuZGVuY2llcyBmb3IgbWFpbiB0ZXN0IHByb2dyYW0KKyAgICBkZXBzdHIg PSAiIgorICAgIGlmICcjJyBpbiBvYmpfZGVwczoKKyAgICAgICAgZm9yIG8g aW4gb2JqX2RlcHNbJyMnXToKKyAgICAgICAgICAgIGRlcHN0ciArPSAiICQo b2JqcGZ4KSIgKyB0ZXN0X25hbWUgKyAiLSIgKyBvICsgIi5zbyIKKyAgICBp ZiBtYWluX3Byb2dyYW1fbmVlZHNfbGRsOgorICAgICAgICBkZXBzdHIgKz0g IiAkKGxpYmRsKSIKKyAgICBwcmludCAoIiQob2JqcGZ4KSVzOiVzIiAlICh0 ZXN0X25hbWUsIGRlcHN0cikpCisgICAgcHJpbnQgKCJMREZMQUdTLSVzID0g JChuby1hcy1uZWVkZWQpIiAlICh0ZXN0X25hbWUpKQorCisgICAgbm90X2Rl cGVuZGVkX29ianMgPSBmaW5kX29ianNfbm90X2RlcGVuZGVkX29uICgpCisg ICAgaWYgbm90X2RlcGVuZGVkX29ianM6CisgICAgICAgIGRlcHN0ciA9ICIi CisgICAgICAgIGZvciBkZXAgaW4gbm90X2RlcGVuZGVkX29ianM6CisgICAg ICAgICAgICBkZXBzdHIgKz0gIiAkKG9ianBmeCkiICsgdGVzdF9uYW1lICsg Ii0iICsgZGVwICsgIi5zbyIKKyAgICAgICAgcHJpbnQgKCIkKG9ianBmeCkl cy5vdXQ6JXMiICUgKHRlc3RfbmFtZSwgZGVwc3RyKSkKKyAgICAKKyAgICAj IE5vdGUgdGhpcyBpcyBjb21wYXJlZCB3aXRoIHRoZSAiYmFzZSIgPHRlc3Rf bmFtZT4uZXhwLCBub3QKKyAgICAjIDx0ZXN0X25hbWU+XzxOPiB3aXRoIHBl cm11dGF0aW9uIGluZGV4CisgICAgcHJpbnQgKCIkKG9ianBmeCklcy1jbXAu b3V0OiAkKG9ianBmeCklcy5leHAgJChvYmpwZngpJXMub3V0IgorICAgICAg ICAgICAlICh0ZXN0X25hbWUsIGJhc2VfdGVzdF9uYW1lLCB0ZXN0X25hbWUp KQorICAgIHByaW50ICgiXHRkaWZmIC13dSAkXiA+ICRAOyAkKGV2YWx1YXRl LXRlc3QpIikKKyAgICBwcmludCAoImVuZGlmIikKKyAgICBwcmludCAoImlm ZXEgKCQocnVuLWJ1aWx0LXRlc3RzKSx5ZXMpIikKKyAgICBwcmludCAoInRl c3RzLXNwZWNpYWwgKz0gJChvYmpwZngpJXMtY21wLm91dCIgJSAodGVzdF9u YW1lKSkKKyAgICBwcmludCAoImVuZGlmIikKKworICAgICMgR2VuZXJhdGUg QyBmaWxlcyBhY2NvcmRpbmcgdG8gZGVwZW5kZW5jeSBhbmQgY2FsbGluZyBy ZWxhdGlvbnMgZnJvbQorICAgICMgZGVzY3JpcHRpb24gc3RyaW5nLgorICAg IGZvciBvYmogaW4gYWxsX29ianM6CisgICAgICAgIHNyY19uYW1lID0gdGVz dF9uYW1lICsgIi0iICsgb2JqICsgIi5jIgorICAgICAgICBmID0gb3BlbiAo b2JqcGZ4ICsgc3JjX25hbWUsICJ3IikKKyAgICAgICAgaWYgb2JqIGluIG9i al9jYWxscmVmczoKKyAgICAgICAgICAgIGNhbGxlZF9vYmpzID0gb2JqX2Nh bGxyZWZzW29ial0KKyAgICAgICAgICAgIGZvciBjYWxsZWUgaW4gY2FsbGVk X29ianM6CisgICAgICAgICAgICAgICAgZi53cml0ZSAoImV4dGVybiB2b2lk IGZuXyVzICh2b2lkKTtcbiIgJSAoY2FsbGVlKSkKKyAgICAgICAgZi53cml0 ZSAoImV4dGVybiBpbnQgcHV0Y2hhcihpbnQpO1xuIikKKyAgICAgICAgZi53 cml0ZSAoInN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9y KSkgIiArCisgICAgICAgICAgICAgICAgICJpbml0KHZvaWQpe3B1dGNoYXIo JyVzJyk7fVxuIiAlIChvYmopKQorICAgICAgICBmLndyaXRlICgic3RhdGlj IHZvaWQgX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcikpICIgKworICAgICAg ICAgICAgICAgICAiZmluaSh2b2lkKXtwdXRjaGFyKCclcycpO31cbiIgJSAo b2JqKSkKKyAgICAgICAgaWYgb2JqIGluIG9ial9jYWxscmVmczoKKyAgICAg ICAgICAgIGNhbGxlZF9vYmpzID0gb2JqX2NhbGxyZWZzW29ial0KKyAgICAg ICAgICAgIGYud3JpdGUgKCJ2b2lkIGZuXyVzICh2b2lkKSB7XG4iICUgKG9i aikpCisgICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyICgnPCcpO1xu Iik7CisgICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyICgnJXMnKTtc biIgJSAob2JqKSk7CisgICAgICAgICAgICBmb3IgY2FsbGVlIGluIGNhbGxl ZF9vYmpzOgorICAgICAgICAgICAgICAgIGYud3JpdGUgKCIgIGZuXyVzICgp O1xuIiAlIChjYWxsZWUpKQorICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0 Y2hhciAoJz4nKTtcbiIpOworICAgICAgICAgICAgZi53cml0ZSAoIn1cbiIp CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgY2FsbHJlZiBpbiBv YmpfY2FsbHJlZnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBvYmog aW4gY2FsbHJlZlsxXToKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSAo InZvaWQgZm5fJXMgKHZvaWQpIHtcbiIgJSAob2JqKSkKKyAgICAgICAgICAg ICAgICAgICAgZi53cml0ZSAoIiAgcHV0Y2hhciAoJzwnKTtcbiIpOworICAg ICAgICAgICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyICgnJXMnKTtc biIgJSAob2JqKSk7CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUgKCIg IHB1dGNoYXIgKCc+Jyk7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZi53 cml0ZSAoIn1cbiIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAg ICAgIGYuY2xvc2UgKCkKKworICAgICMgT3BlbiBDIGZpbGUgZm9yIHdyaXRp bmcKKyAgICBmID0gb3BlbiAob2JqcGZ4ICsgdGVzdF9uYW1lICsgIi5jIiwg InciKQorCisgICAgIyBpZiB0aGVyZSBhcmUgc29tZSBvcGVyYXRpb25zIGlu IG1haW4oKSwgaXQgbWVhbnMgd2UgbmVlZCAtbGRsCisgICAgaWYgbWFpbl9w cm9ncmFtX25lZWRzX2xkbDoKKyAgICAgICAgZi53cml0ZSAoIiNpbmNsdWRl IDxkbGZjbi5oPlxuIikKKyAgICBmLndyaXRlICgiI2luY2x1ZGUgPHN0ZGlv Lmg+XG4iKQorICAgIGYud3JpdGUgKCIjaW5jbHVkZSA8c3RkbGliLmg+XG4i KQorICAgIGZvciBzIGluIG1haW5fcHJvZ3JhbToKKyAgICAgICAgaWYgc1sw XSA9PSAnQCc6CisgICAgICAgICAgICBmLndyaXRlICgiZXh0ZXJuIHZvaWQg Zm5fJXMgKHZvaWQpO1xuIiAlIChzWzFdKSk7CisgICAgZi53cml0ZSAoImlu dCBtYWluICh2b2lkKSB7XG4iKQorICAgIGYud3JpdGUgKCIgIHB1dGNoYXIo J3snKTtcbiIpCisKKyAgICAjIEhlbHBlciByb3V0aW5lIGZvciBzYW5pdHkg Y2hlY2sgY29kZQorICAgIGRlZiBwdXRfZmFpbF9jaGVjayAoZmFpbF9jb25k LCBhY3Rpb25fZGVzYyk6CisgICAgICAgIGYud3JpdGUgKCcgIGlmICglcykg eyBwcmludGYgKCJcXG4lcyBmYWlsZWQ6ICUlc1xcbiIsICcKKyAgICAgICAg ICAgICAgICAgJ2RsZXJyb3IgKCkpOyBleGl0ICgxKTt9XG4nICUgKGZhaWxf Y29uZCwgYWN0aW9uX2Rlc2MpKQorICAgIGkgPSAwCisgICAgd2hpbGUgaSA8 IGxlbihtYWluX3Byb2dyYW0pOgorICAgICAgICBzID0gbWFpbl9wcm9ncmFt W2ldCisgICAgICAgIG9iaiA9IHNbbGVuKHMpLTFdCisgICAgICAgIGRzbyA9 IHRlc3RfbmFtZSArICItIiArIG9iagorICAgICAgICBpZiBzWzBdID09ICcr JyBvciBzWzBdID09ICc6JzoKKyAgICAgICAgICAgIGlmIHNbMF0gPT0gJysn OgorICAgICAgICAgICAgICAgIGRsb3Blbl9mbGFncyA9ICJSVExEX0xBWll8 UlRMRF9HTE9CQUwiCisgICAgICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0 Y2hhcignKycpO1xuIik7CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAg ICAgICAgIGRsb3Blbl9mbGFncyA9ICJSVExEX0xBWlkiCisgICAgICAgICAg ICAgICAgZi53cml0ZSAoIiAgcHV0Y2hhcignOicpO1xuIik7CisgICAgICAg ICAgICBmLndyaXRlICgiICBwdXRjaGFyKCclcycpO1xuIiAlIChvYmopKTsK KyAgICAgICAgICAgIGYud3JpdGUgKCIgIHB1dGNoYXIoJ1snKTtcbiIpOwor ICAgICAgICAgICAgZi53cml0ZSAoJyAgdm9pZCAqJXMgPSBkbG9wZW4gKCIl cy5zbyIsICVzKTtcbicKKyAgICAgICAgICAgICAgICAgICAgICUgKG9iaiwg ZHNvLCBkbG9wZW5fZmxhZ3MpKQorICAgICAgICAgICAgcHV0X2ZhaWxfY2hl Y2sgKCIhJXMiICUgKG9iaiksCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIiVzLnNvIGRsb3BlbiIgJSAoZHNvKSkKKyAgICAgICAgICAgIGYud3Jp dGUgKCIgIHB1dGNoYXIoJ10nKTtcbiIpOworICAgICAgICBlbGlmIHNbMF0g PT0gJy0nOgorICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0Y2hhcignLScp O1xuIik7CisgICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyKCclcycp O1xuIiAlIChvYmopKTsKKyAgICAgICAgICAgIGYud3JpdGUgKCIgIHB1dGNo YXIoJ1snKTtcbiIpOworICAgICAgICAgICAgcHV0X2ZhaWxfY2hlY2sgKCJk bGNsb3NlICglcykgIT0gMCIgJSAob2JqKSwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAiJXMuc28gZGxjbG9zZSIgJSAoZHNvKSkKKyAgICAgICAg ICAgIGYud3JpdGUgKCIgIHB1dGNoYXIoJ10nKTtcbiIpOworICAgICAgICBl bGlmIHNbMF0gPT0gJyUnOgorICAgICAgICAgICAgZi53cml0ZSAoJyAgdm9p ZCAoKmZuXyVzKSh2b2lkKSA9IGRsc3ltICglcywgImZuXyVzIik7XG4nCisg ICAgICAgICAgICAgICAgICAgICAlIChvYmosIG9iaiwgb2JqKSkKKyAgICAg ICAgICAgIHB1dF9mYWlsX2NoZWNrICgiIWZuXyVzIiAlIChvYmopLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICJkbHN5bShmbl8lcykgZnJvbSAl cy5zbyIgJSAob2JqLCBkc28pKQorICAgICAgICAgICAgZi53cml0ZSAoIiAg Zm5fJXMgKCk7XG4iICUgKG9iaikpCisgICAgICAgIGVsaWYgc1swXSA9PSAn QCc6CisgICAgICAgICAgICBmLndyaXRlICgiICBmbl8lcyAoKTtcbiIgJSAo b2JqKSkKKyAgICAgICAgZi53cml0ZSAoIiAgcHV0Y2hhcignOycpO1xuIik7 CisgICAgICAgIGkgKz0gMQorICAgIGYud3JpdGUgKCIgIHB1dGNoYXIoJ30n KTtcbiIpCisgICAgZi53cml0ZSAoIiAgcmV0dXJuIDA7XG4iKQorICAgIGYu d3JpdGUgKCJ9XG4iKQorICAgIGYuY2xvc2UgKCkKKworICAgICMgSGVscGVy IHJvdXRpbmUgdG8gcnVuIGEgc2hlbGwgY29tbWFuZCwgZm9yIHJ1bm5pbmcg R0NDIGJlbG93CisgICAgZGVmIHJ1bl9jbWQgKGFyZ3MpOgorICAgICAgICBp ZiBjbWRsaW5lYXJncy5kZWJ1Z19vdXRwdXQ6CisgICAgICAgICAgICBwcmlu dCAoc3RyLmpvaW4gKCcgJywgYXJncykpCisgICAgICAgIHAgPSBzdWJwcm9j ZXNzLlBvcGVuIChhcmdzKQorICAgICAgICBwLndhaXQgKCkKKyAgICAgICAg aWYgcC5yZXR1cm5jb2RlICE9IDA6CisgICAgICAgICAgICBwcmludCAoIkVy cm9yIHJ1bm5pbmc6ICVzIiAlIChzdHIuam9pbiAoJyAnLCBhcmdzKSkpCisg ICAgICAgICAgICBleGl0IC0xCisKKyAgICAjIERlcHRoLWZpcnN0IHRyYXZl cnNhbCwgZXhlY3V0aW5nIEZOKE9CSikgaW4gcG9zdC1vcmRlcgorICAgIG9i al92aXNpdGVkID0ge30KKyAgICBkZWYgZGZzIChvYmosIGZuKToKKyAgICAg ICAgaWYgb2JqIGluIG9ial92aXNpdGVkOgorICAgICAgICAgICAgcmV0dXJu CisgICAgICAgIG9ial92aXNpdGVkW29ial0gPSBUcnVlCisgICAgICAgIGlm IG9iaiBpbiBvYmpfZGVwczoKKyAgICAgICAgICAgIGZvciBkZXAgaW4gb2Jq X2RlcHNbb2JqXToKKyAgICAgICAgICAgICAgICBkZnMgKGRlcCwgZm4pCisg ICAgICAgIGZuIChvYmopCisKKyAgICAjIEZ1bmN0aW9uIHRvIGNyZWF0ZSA8 dGVzdF9uYW1lPi08b2JqPi5zbworICAgIGRlZiBidWlsZF9kc28gKG9iaik6 CisgICAgICAgIG9ial9uYW1lID0gdGVzdF9uYW1lICsgIi0iICsgb2JqICsg Ii5vcyIKKyAgICAgICAgZHNvX25hbWUgPSB0ZXN0X25hbWUgKyAiLSIgKyBv YmogKyAiLnNvIgorICAgICAgICBkZXBzID0gW10KKyAgICAgICAgaWYgb2Jq IGluIG9ial9kZXBzOgorICAgICAgICAgICAgZGVwcyA9IG9ial9kZXBzW29i al0KKyAgICAgICAgZHNvX2RlcHMgPSBtYXAgKGxhbWJkYSBkOiBvYmpwZngg KyB0ZXN0X25hbWUgKyAiLSIgKyBkICsgIi5zbyIsIGRlcHMpCisgICAgICAg IGNtZCA9IChbYnVpbGRfZ2NjLCAiLXNoYXJlZCIsICItbyIsIG9ianBmeCAr IGRzb19uYW1lLAorICAgICAgICAgICAgICAgIG9ianBmeCArIG9ial9uYW1l LCAiLVdsLC0tbm8tYXMtbmVlZGVkIl0gKyBsaXN0KGRzb19kZXBzKSkKKyAg ICAgICAgcnVuX2NtZCAoY21kKQorCisgICAgIyAtLWJ1aWxkIG9wdGlvbiBw cm9jZXNzaW5nOiBidWlsZCBnZW5lcmF0ZWQgc291cmNlcyB1c2luZyAnYnVp bGRfZ2NjJworICAgIGlmIGNtZGxpbmVhcmdzLmJ1aWxkOgorICAgICAgICAj IENvbXBpbGUgaW5kaXZpZHVhbCAub3MgZmlsZXMKKyAgICAgICAgZm9yIG9i aiBpbiBhbGxfb2JqczoKKyAgICAgICAgICAgIHNyY19uYW1lID0gdGVzdF9u YW1lICsgIi0iICsgb2JqICsgIi5jIgorICAgICAgICAgICAgb2JqX25hbWUg PSB0ZXN0X25hbWUgKyAiLSIgKyBvYmogKyAiLm9zIgorICAgICAgICAgICAg cnVuX2NtZCAoW2J1aWxkX2djYywgIi1jIiwgIi1mUElDIiwgb2JqcGZ4ICsg c3JjX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIi1vIiwgb2JqcGZ4 ICsgb2JqX25hbWVdKQorCisgICAgICAgICMgQnVpbGQgYWxsIERTT3MsIHRo aXMgbmVlZHMgdG8gYmUgaW4gdG9wb2xvZ2ljYWwgZGVwZW5kZW5jeSBvcmRl ciwKKyAgICAgICAgIyBvciBsaW5rIHdpbGwgZmFpbAorICAgICAgICBmb3Ig b2JqIGluIGFsbF9vYmpzOgorICAgICAgICAgICAgZGZzIChvYmosIGJ1aWxk X2RzbykKKworICAgICAgICAjIEJ1aWxkIG1haW4gcHJvZ3JhbQorICAgICAg ICBkZXBzID0gW10KKyAgICAgICAgaWYgJyMnIGluIG9ial9kZXBzOgorICAg ICAgICAgICAgZGVwcyA9IG9ial9kZXBzWycjJ10KKyAgICAgICAgbWFpbl9k ZXBzID0gbWFwIChsYW1iZGEgZDogb2JqcGZ4ICsgdGVzdF9uYW1lICsgIi0i ICsgZCArICIuc28iLCBkZXBzKQorICAgICAgICBjbWQgPSAoW2J1aWxkX2dj YywgIi1XbCwtLW5vLWFzLW5lZWRlZCIsICItbyIsIG9ianBmeCArIHRlc3Rf bmFtZSwKKyAgICAgICAgICAgICAgICBvYmpwZnggKyB0ZXN0X25hbWUgKyAi LmMiLCAiLUwlcyIgJSAob3MuZ2V0Y3dkICgpKSwKKyAgICAgICAgICAgICAg ICAiLVdsLC1ycGF0aC1saW5rPSVzIiAlIChvcy5nZXRjd2QgKCkpXQorICAg ICAgICAgICAgICAgKyBsaXN0IChtYWluX2RlcHMpKQorICAgICAgICBpZiBt YWluX3Byb2dyYW1fbmVlZHNfbGRsOgorICAgICAgICAgICAgY21kICs9IFsi LWxkbCJdCisgICAgICAgIHJ1bl9jbWQgKGNtZCkKKworIyBDaGVjayBpZiB3 ZSBuZWVkIHRvIGVudW1lcmF0ZSBwZXJtdXRhdGlvbnMgb2YgZGVwZW5kZW5j aWVzCituZWVkX3Blcm11dGF0aW9uX3Byb2Nlc3NpbmcgPSBGYWxzZSAgICAg ICAKK2lmIG9ial9kZXBfcGVybXV0YXRpb25zOgorICAgICMgQWRqdXN0IG9i al9kZXBfcGVybXV0YXRpb25zIGludG8gbWFwIG9mIG9iamVjdCAtPiBkZXBl bmRlbmN5IHBlcm11dGF0aW9ucworICAgIGZvciByIGluIG9ial9kZXBfcGVy bXV0YXRpb25zLml0ZW1zKCk6CisgICAgICAgIG9iaiA9IHJbMF0KKyAgICAg ICAgaWYgb2JqIGluIG9ial9kZXBzIGFuZCBsZW4ob2JqX2RlcHNbb2JqXSkg PiAxOgorICAgICAgICAgICAgZGVwcyA9IG9ial9kZXBzW29ial0KKyAgICAg ICAgICAgIG9ial9kZXBfcGVybXV0YXRpb25zW29ial0gPSBsaXN0IChpdGVy dG9vbHMucGVybXV0YXRpb25zIChkZXBzKSkKKyAgICAgICAgICAgIG5lZWRf cGVybXV0YXRpb25fcHJvY2Vzc2luZyA9IFRydWUKKwordGVzdF9zdWJpbmRl eCA9IDEKK2N1cnJfcGVybXMgPSBbXQorZGVmIGVudW1fcGVybXV0YXRpb25z IChwZXJtX2xpc3QpOgorICAgIGdsb2JhbCB0ZXN0X25hbWUsIG9ial9kZXBz LCB0ZXN0X3N1YmluZGV4LCBjdXJyX3Blcm1zCisgICAgaWYgbGVuKHBlcm1f bGlzdCkgPj0gMToKKyAgICAgICAgY3VyciA9IHBlcm1fbGlzdFswXQorICAg ICAgICBvYmogPSBjdXJyWzBdCisgICAgICAgIHBlcm1zID0gY3VyclsxXQor ICAgICAgICBpZiBub3QgcGVybXM6CisgICAgICAgICAgICAjIFRoaXMgbWF5 IGJlIGFuIGVtcHR5IGxpc3QgaWYgbm8gbXVsdGlwbGUgZGVwZW5kZW5jaWVz IHRvIHBlcm11dGUKKyAgICAgICAgICAgICMgd2VyZSBmb3VuZCwgc2tpcCB0 byBuZXh0IGluIHRoaXMgY2FzZQorICAgICAgICAgICAgZW51bV9wZXJtdXRh dGlvbnMgKHBlcm1fbGlzdFsxOl0pCisgICAgICAgIGVsc2U6CisgICAgICAg ICAgICBmb3IgZGVwcyBpbiBwZXJtczoKKyAgICAgICAgICAgICAgICBvYmpf ZGVwc1tvYmpdID0gZGVwcworICAgICAgICAgICAgICAgIHBlcm1zdHIgPSAi IiBpZiBvYmogPT0gIiMiIGVsc2Ugb2JqICsgIl8iCisgICAgICAgICAgICAg ICAgcGVybXN0ciArPSBzdHIuam9pbiAoJycsIGRlcHMpCisgICAgICAgICAg ICAgICAgY3Vycl9wZXJtcy5hcHBlbmQgKHBlcm1zdHIpIAorICAgICAgICAg ICAgICAgIGVudW1fcGVybXV0YXRpb25zIChwZXJtX2xpc3RbMTpdKQorICAg ICAgICAgICAgICAgIGN1cnJfcGVybXMgPSBjdXJyX3Blcm1zWzA6bGVuKGN1 cnJfcGVybXMpLTFdCisgICAgZWxzZToKKyAgICAgICAgIyBvYmpfZGVwcyBp cyBub3cgaW5zdGFudGlhdGVkIHdpdGggb25lIGRlcGVuZGVuY3kgb3JkZXIg cGVybXV0YXRpb24KKyAgICAgICAgIyAoYWNyb3NzIGFsbCBvYmplY3RzIHRo YXQgaGF2ZSBtdWx0aXBsZSBwZXJtdXRhdGlvbnMpCisgICAgICAgICMgTm93 IHByb2Nlc3MgYSB0ZXN0Y2FzZQorICAgICAgICAjaWYgbm90IG9zLnBhdGgu ZXhpc3RzIChvYmpwZnggKyBiYXNlX3Rlc3RfbmFtZSsgIi1wZXJtdXRhdGlv bnMvIik6CisgICAgICAgICMgICAgb3MubWtkaXIgKG9ianBmeCArIGJhc2Vf dGVzdF9uYW1lKyAiLXBlcm11dGF0aW9ucy8iKQorICAgICAgICBwcm9jZXNz X3Rlc3RjYXNlIChiYXNlX3Rlc3RfbmFtZSArICJfIiArIHN0ciAodGVzdF9z dWJpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLSIgKyBz dHIuam9pbiAoJy0nLCBjdXJyX3Blcm1zKSkKKyAgICAgICAgdGVzdF9zdWJp bmRleCArPSAxCisKK2lmIG5lZWRfcGVybXV0YXRpb25fcHJvY2Vzc2luZzoK KyAgICBlbnVtX3Blcm11dGF0aW9ucyAobGlzdCAob2JqX2RlcF9wZXJtdXRh dGlvbnMuaXRlbXMoKSkpCitlbHNlOgorICAgICMgV2UgaGF2ZSBubyBwZXJt dXRhdGlvbnMgdG8gZW51bWVyYXRlLCBqdXN0IHByb2Nlc3MgdGVzdGNhc2Ug bm9ybWFsbHkKKyAgICBwcm9jZXNzX3Rlc3RjYXNlICh0ZXN0X25hbWUpCisK --------------14E000CABCA0C62AA63BC483--