From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4251 invoked by alias); 7 Apr 2013 14:28:06 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 4240 invoked by uid 89); 7 Apr 2013 14:28:06 -0000 X-Spam-SWARE-Status: No, score=-4.7 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,TW_DB,TW_FW autolearn=ham version=3.3.1 Received: from mail-oa0-f41.google.com (HELO mail-oa0-f41.google.com) (209.85.219.41) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Sun, 07 Apr 2013 14:28:01 +0000 Received: by mail-oa0-f41.google.com with SMTP id f4so5458449oah.14 for ; Sun, 07 Apr 2013 07:28:00 -0700 (PDT) X-Received: by 10.182.144.42 with SMTP id sj10mr12957620obb.66.1365344880024; Sun, 07 Apr 2013 07:28:00 -0700 (PDT) MIME-Version: 1.0 Received: by 10.60.13.133 with HTTP; Sun, 7 Apr 2013 07:27:19 -0700 (PDT) In-Reply-To: <515EF6A3.2080704@redhat.com> References: <514BF736.3070706@mentor.com> <514C3C85.4000704@codesourcery.com> <514EEBFF.8090705@redhat.com> <5154378D.60302@redhat.com> <515B1DF7.3090705@redhat.com> <515EF6A3.2080704@redhat.com> From: Hui Zhu Date: Mon, 08 Apr 2013 09:34:00 -0000 Message-ID: Subject: Re: [PATCH] Fix dprintf work not right if it is pending To: Pedro Alves Cc: Keith Seitz , Hui Zhu , gdb-patches ml Content-Type: multipart/mixed; boundary=14dae939916391e7c304d9c62028 X-Virus-Found: No X-SW-Source: 2013-04/txt/msg00174.txt.bz2 --14dae939916391e7c304d9c62028 Content-Type: text/plain; charset=ISO-8859-1 Content-length: 7236 Hi Pedro, Thanks for your help. On Sat, Apr 6, 2013 at 12:06 AM, Pedro Alves wrote: > Hello, > > Thanks for the help Keith. Much appreciated. > > On 04/02/2013 07:05 PM, Keith Seitz wrote: >> On 03/29/2013 12:42 AM, Hui Zhu wrote: >> >>>>> + breakpoint_re_set_default (b); >>>>> + >>>>> + if (b->extra_string != NULL) >>>>> + update_dprintf_command_list (b); > > You shouldn't be able to create a dprintf without an > extra string, right? But, we can't get to the extra string > until the breakpoint's location is pending, so we couldn't > check when the breakpoint was created. > > $ ./gdb -q -nx > (gdb) dprintf pendfunc > No symbol table is loaded. Use the "file" command. > Make dprintf pending on future shared library load? (y or [n]) y > Dprintf 1 (pendfunc) pending. > (gdb) info breakpoints > Num Type Disp Enb Address What > 1 dprintf keep y pendfunc > (gdb) > > Ok, now let's load symbols. > > (gdb) file ./testsuite/gdb.base/dprintf-pending > Reading symbols from /home/pedro/gdb/mygit/build/gdb/testsuite/gdb.base/dprintf-pending...done. > > and: > > (gdb) info breakpoints > Num Type Disp Enb Address What > 1 dprintf keep y 0x0000000000400560 > > the location resolved. But, notice no commands attached... > > (gdb) start > Temporary breakpoint 2 at 0x400690: file ../../../src/gdb/testsuite/gdb.base/dprintf-pending.c, line 26. > Starting program: /home/pedro/gdb/mygit/build/gdb/testsuite/gdb.base/dprintf-pending > Temporary breakpoint 2, main () at ../../../src/gdb/testsuite/gdb.base/dprintf-pending.c:26 > 26 pendfunc (3); /* break main here */ > (gdb) n > (gdb) info breakpoints > Num Type Disp Enb Address What > 1 dprintf keep y 0x00007ffff7dfc69d in pendfunc at ../../../src/gdb/testsuite/gdb.base/dprintf-pendshr.c:27 > breakpoint already hit 1 time > (gdb) > > I think we want this: > > static void > dprintf_re_set (struct breakpoint *b) > { > breakpoint_re_set_default (b); > > /* This breakpoint could have been pending, and be resolved now, and > if so, we should now have the extra string. If we don't, the > dprintf was malformed when created, but we couldn't tell because > we can't extract the extra string until the location is > resolved. */ > if (b->loc != NULL && b->extra_string == NULL) > error (_("Format string required")); > > if (b->extra_string != NULL) > update_dprintf_command_list (b); > } > > Please add a test for this. Fixed and updated test for it. > >>>>> +} >>>>> + >>>> >>>> >>>> This will update the command list every time breakpoints are reset and could >>>> be limited to only those needing updating. Is there perhaps a reason to >>>> always do this? > > You mean, only update the command list if there isn't one before > (because the breakpoint was pending before) ? > >>> >>> I think it need, because it need to generate different commands with >>> different status for example: >>> if (target_can_run_breakpoint_commands ()) >>> printf_line = xstrprintf ("agent-printf %s", dprintf_args); >>> >> >> I'm not understanding this example. How is this likely to change whenever breakpoints are reset? Is there perhaps a way to add a test to demonstrate this requirement? > > I think what he's saying is, even independently of issues with > pending dprintf breakpoints, if you, in the same gdb run: > > 1 - connect to target 1, that can run breakpoint commands. > 2 - create a dprintf, which resolves fine. > 3 - disconnect from target 2 > 4 - connect to target 2, that can NOT run breakpoint commands. > > After steps #3/#4, you'll want the dprintf command list to > be updated, because target 1 and 2 may well return different > answers for target_can_run_breakpoint_commands(). > Given absence of finer grained resetting, we get to do > it all the time. Thanks. This part is so clear that I added it as comments of this part of code. > > On 04/04/2013 02:29 PM, Hui Zhu wrote: >> +# Restart with a fresh gdb. >> + >> +gdb_exit >> +gdb_start >> +gdb_reinitialize_dir $srcdir/$subdir >> + >> +gdb_load ${binfile} > > Use clean_restart here. > >> +gdb_test_multiple "dprintf pendfunc1, \"x=%d\\n\", x" "set pending dprintf" { >> + -re ".*Make dprintf pending.*y or \\\[n\\\]. $" { >> + gdb_test "y" "Dprintf.*pendfunc1.*pending." "set pending dprintf" >> + } >> +} >> + > > gdb_test has built-in support for questions. Write these sorts > of things as: > > gdb_test \ > "dprintf pendfunc1, \"x=%d\\n\", x" \ > "Dprintf.*pendfunc1.*pending." \ > "set pending dprintf (without symbols)" \ > ".*Make dprintf pending.*y or \\\[n\\\]. $" \ > "y" > > There's at least one more instance. > >> +if { [skip_gdbserver_tests] } { >> + return 0 >> +} >> + >> +# Get warning or no output is OK. >> +gdb_test "set dprintf-style agent" ".*" "Set dprintf style to agent" >> + >> +gdbserver_run "" > > I'd much prefer remove this skip_gdbserver_tests check, and this > gdbserver_run. IOW, keep running the test against the target > the current board is set up with. There are remote servers other > than GDBserver out there. The code after skip_gdbserver_tests check is to test: if (b->extra_string != NULL) update_dprintf_command_list (b); My thought is change the target to show "printf" is changed to "agent-printf". Now I removed all this part of code. > >> +# Get warning or no output is OK. >> +gdb_test "set dprintf-style agent" ".*" "Set dprintf style to agent" > > What warning would that be? This here?: > > else if (strcmp (dprintf_style, dprintf_style_agent) == 0) > { > if (target_can_run_breakpoint_commands ()) > printf_line = xstrprintf ("agent-printf %s", dprintf_args); > else > { > warning (_("Target cannot run dprintf commands, falling back to GDB printf")); > printf_line = xstrprintf ("printf %s", dprintf_args); > } > } > >> + >> +gdbserver_run "" >> + >> +gdb_test "info break" ".*agent-printf \"x=%d\\\\n\", x" \ > > If that warning triggers, then this will fail... In fact, > you should see that when you remove the gdbserver bits. > > Please make the "set" test check explicitly either no output, or the > warning, and then the "info break" test check the corresponding expected > output. Then please make sure the test passes with native, and > also the native-gdbserver and native-extended-gdbserver boards. > It fails with the native-gdbserver board, because the program > exists and gdbserver exits before the "set dprintf-style agent". > You'll need to add something to prevent that. > > -- > Pedro Alves > I post new patches accord to your commnets. Please help me review them. Best, Hui 2013-04-07 Pedro Alves Hui Zhu * breakpoint.c (dprintf_re_set): New. (initialize_breakpoint_ops): Set dprintf_breakpoint_ops re_set to dprintf_re_set. 2013-04-07 Hui Zhu * gdb.base/Makefile.in (EXECUTABLES): Add dprintf-pending. (MISCELLANEOUS): Add dprintf-pendshr.sl. * gdb.base/dprintf-pending.c, gdb.base/dprintf-pending.exp: New. --14dae939916391e7c304d9c62028 Content-Type: text/plain; charset=US-ASCII; name="dprintf-pending.txt" Content-Disposition: attachment; filename="dprintf-pending.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hf8b1fug0 Content-length: 2196 LS0tIGEvZ2RiL2JyZWFrcG9pbnQuYworKysgYi9nZGIvYnJlYWtwb2ludC5j CkBAIC0xMjk2Myw2ICsxMjk2MywzNSBAQCBia3B0X3JlX3NldCAoc3RydWN0 IGJyZWFrcG9pbnQgKmIpCiAgIGJyZWFrcG9pbnRfcmVfc2V0X2RlZmF1bHQg KGIpOwogfQogCisvKiBEcHJpbnRmIGJyZWFrcG9pbnRfb3BzIG1ldGhvZHMu ICAqLworCitzdGF0aWMgdm9pZAorZHByaW50Zl9yZV9zZXQgKHN0cnVjdCBi cmVha3BvaW50ICpiKQoreworICBicmVha3BvaW50X3JlX3NldF9kZWZhdWx0 IChiKTsKKworICAvKiBUaGlzIGJyZWFrcG9pbnQgY291bGQgaGF2ZSBiZWVu IHBlbmRpbmcsIGFuZCBiZSByZXNvbHZlZCBub3csIGFuZAorICAgICBpZiBz bywgd2Ugc2hvdWxkIG5vdyBoYXZlIHRoZSBleHRyYSBzdHJpbmcuICBJZiB3 ZSBkb24ndCwgdGhlCisgICAgIGRwcmludGYgd2FzIG1hbGZvcm1lZCB3aGVu IGNyZWF0ZWQsIGJ1dCB3ZSBjb3VsZG4ndCB0ZWxsIGJlY2F1c2UKKyAgICAg d2UgY2FuJ3QgZXh0cmFjdCB0aGUgZXh0cmEgc3RyaW5nIHVudGlsIHRoZSBs b2NhdGlvbiBpcworICAgICByZXNvbHZlZC4gICovCisgIGlmIChiLT5sb2Mg IT0gTlVMTCAmJiBiLT5leHRyYV9zdHJpbmcgPT0gTlVMTCkKKyAgICBlcnJv ciAoXygiRm9ybWF0IHN0cmluZyByZXF1aXJlZCIpKTsKKworICAvKiAxIC0g Y29ubmVjdCB0byB0YXJnZXQgMSwgdGhhdCBjYW4gcnVuIGJyZWFrcG9pbnQg Y29tbWFuZHMuCisgICAgIDIgLSBjcmVhdGUgYSBkcHJpbnRmLCB3aGljaCBy ZXNvbHZlcyBmaW5lLgorICAgICAzIC0gZGlzY29ubmVjdCBmcm9tIHRhcmdl dCAyCisgICAgIDQgLSBjb25uZWN0IHRvIHRhcmdldCAyLCB0aGF0IGNhbiBO T1QgcnVuIGJyZWFrcG9pbnQgY29tbWFuZHMuCisKKyAgICAgQWZ0ZXIgc3Rl cHMgIzMvIzQsIHlvdSdsbCB3YW50IHRoZSBkcHJpbnRmIGNvbW1hbmQgbGlz dCB0bworICAgICBiZSB1cGRhdGVkLCBiZWNhdXNlIHRhcmdldCAxIGFuZCAy IG1heSB3ZWxsIHJldHVybiBkaWZmZXJlbnQKKyAgICAgYW5zd2VycyBmb3Ig dGFyZ2V0X2Nhbl9ydW5fYnJlYWtwb2ludF9jb21tYW5kcygpLgorICAgICBH aXZlbiBhYnNlbmNlIG9mIGZpbmVyIGdyYWluZWQgcmVzZXR0aW5nLCB3ZSBn ZXQgdG8gZG8KKyAgICAgaXQgYWxsIHRoZSB0aW1lLiAgKi8KKyAgaWYgKGIt PmV4dHJhX3N0cmluZyAhPSBOVUxMKQorICAgIHVwZGF0ZV9kcHJpbnRmX2Nv bW1hbmRfbGlzdCAoYik7Cit9CisKIHN0YXRpYyBpbnQKIGJrcHRfaW5zZXJ0 X2xvY2F0aW9uIChzdHJ1Y3QgYnBfbG9jYXRpb24gKmJsKQogewpAQCAtMTYw MDEsNyArMTYwMzAsNyBAQCBpbml0aWFsaXplX2JyZWFrcG9pbnRfb3BzICh2 b2lkKQogCiAgIG9wcyA9ICZkcHJpbnRmX2JyZWFrcG9pbnRfb3BzOwogICAq b3BzID0gYmtwdF9iYXNlX2JyZWFrcG9pbnRfb3BzOwotICBvcHMtPnJlX3Nl dCA9IGJrcHRfcmVfc2V0OworICBvcHMtPnJlX3NldCA9IGRwcmludGZfcmVf c2V0OwogICBvcHMtPnJlc291cmNlc19uZWVkZWQgPSBia3B0X3Jlc291cmNl c19uZWVkZWQ7CiAgIG9wcy0+cHJpbnRfaXQgPSBia3B0X3ByaW50X2l0Owog ICBvcHMtPnByaW50X21lbnRpb24gPSBia3B0X3ByaW50X21lbnRpb247Cg== --14dae939916391e7c304d9c62028 Content-Type: text/plain; charset=US-ASCII; name="dprintf-pending-test.txt" Content-Disposition: attachment; filename="dprintf-pending-test.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hf8b1g021 Content-length: 8138 LS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9NYWtlZmlsZS5pbgorKysg Yi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL01ha2VmaWxlLmluCkBAIC0xMCw3 ICsxMCw4IEBAIEVYRUNVVEFCTEVTID0gYTItcnVuIGFkdmFuY2UgYWxsLXR5 cGVzIGEKIAljYWxsLXN0cnMgY2FsbGV4aXQgY2FsbGZ1bmNzIGNhbGxmd21h bGwgY2hhcnNldCBjaGVja3BvaW50IFwKIAljaG5nLXN5bXMgY29kZV9lbGlt MSBjb2RlX2VsaW0yIGNvbW1hbmRzIGNvbXBpbGVyIGNvbXBsZXggXAogCWNv bmRicmVhayBjb25zZWN1dGl2ZSBjb25zdHZhcnMgY29yZW1ha2VyIGN1cnNh bCBjdmV4cHIgXAotCWRieC10ZXN0IGRlbCBkaXNhc20tZW5kLWN1IGRpc3Bs YXkgZHVtcCBkdXAtc2VjdCBkdXAtc2VjdC5kZWJ1ZyBcCisJZGJ4LXRlc3Qg ZGVsIGRpc2FzbS1lbmQtY3UgZGlzcGxheSBkcHJpbnRmLXBlbmRpbmcgZHVt cCBkdXAtc2VjdCBcCisJZHVwLXNlY3QuZGVidWcgXAogCWR1cC1zZWN0LnN0 cmlwcGVkIGVuZGluZy1ydW4gZXhlY2QtcHJvZyBleHBhbmQtcHN5bXRhYnMg ZXhwcnMgXAogCWZpbGVpbyBmaW5kIGZpbmlzaCBmaXhzZWN0aW9uIGZsb2F0 IGZvbGwtZXhlYyBmb2xsLWZvcmsgZm9sbC12Zm9yayBcCiAJZnJhbWUtYXJn cyBmcmVlYnBjbWQgZnVsbG5hbWUgZnVuY2FyZ3MgZ2NvcmUgXApAQCAtNDQs NyArNDUsNyBAQCBFWEVDVVRBQkxFUyA9IGEyLXJ1biBhZHZhbmNlIGFsbC10 eXBlcyBhCiAJd2NoYXIgd2hhdGlzIHdoYXRpcy1leHAgY2F0Y2gtc3lzY2Fs bCBcCiAJcHIxMDE3OSBnbnVfdmVjdG9yCiAKLU1JU0NFTExBTkVPVVMgPSBj b3JlbW1hcC5kYXRhIC4uL2Zvb2Jhci5iYXogZml4c2VjdHNoci5zbCBcCitN SVNDRUxMQU5FT1VTID0gY29yZW1tYXAuZGF0YSBkcHJpbnRmLXBlbmRzaHIu c2wgLi4vZm9vYmFyLmJheiBmaXhzZWN0c2hyLnNsIFwKIAlwZW5kc2hyLnNs IHNocmVsb2MxLnNsIHNocmVsb2MyLnNsIHR3aWNlLXRtcC5jIFwKIAlzaHIx LnNsIHNocjIuc2wgc29saWJfc2wuc2wgc29saWIxLnNsIHNvbGliMi5zbCBc CiAJdW5sb2Fkc2hyLnNsIHVubG9hZHNocjIuc2wgd2F0Y2hwb2ludC1zb2xp Yi1zaHIuc2wgXAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUv Z2RiLmJhc2UvZHByaW50Zi1wZW5kaW5nLmMKQEAgLTAsMCArMSwzMSBAQAor LyogVGhpcyB0ZXN0Y2FzZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1 Z2dlci4KKworICAgQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cisg ICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5z ZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5Z IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg b2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5v dCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisK KyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgayA9IDA7CisKK2V4dGVybiB2 b2lkIHBlbmRmdW5jIChpbnQgeCk7CisKK2ludCBtYWluKCkKK3sKKyAgcGVu ZGZ1bmMgKDMpOyAvKiBicmVhayBtYWluIGhlcmUgKi8KKyAgcGVuZGZ1bmMg KDQpOworICBrID0gMTsKKyAgcGVuZGZ1bmMgKDMpOworICByZXR1cm4gMDsK K30KLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNl L2RwcmludGYtcGVuZGluZy5leHAKQEAgLTAsMCArMSw5OSBAQAorIyAgIENv cHlyaWdodCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgor CisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl ZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp dGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3Jh bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg dXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJ VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg dGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdp dGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251 Lm9yZy9saWNlbnNlcy8+LgorCitsb2FkX2xpYiBnZGJzZXJ2ZXItc3VwcG9y dC5leHAKKworaWYge1tza2lwX3NobGliX3Rlc3RzXX0geworICAgIHJldHVy biAwCit9CisKK3NldCB0ZXN0ZmlsZSAiZHByaW50Zi1wZW5kaW5nIgorc2V0 IGxpYmZpbGUgImRwcmludGYtcGVuZHNociIKK3NldCBzcmNmaWxlICR0ZXN0 ZmlsZS5jCitzZXQgbGlic3JjICAkc3JjZGlyLyRzdWJkaXIvJGxpYmZpbGUu Yworc2V0IGJpbmZpbGUgJG9iamRpci8kc3ViZGlyLyR0ZXN0ZmlsZQorc2V0 IGxpYl9zbCAgJG9iamRpci8kc3ViZGlyLyRsaWJmaWxlLnNsCisKK3NldCBs aWJfb3B0cyAgZGVidWcKK3NldCBleGVjX29wdHMgW2xpc3QgZGVidWcgc2hs aWI9JGxpYl9zbF0KKworaWYgeyBbZ2V0X2NvbXBpbGVyX2luZm9dIH0gewor ICAgIHJldHVybiAtMQorfQorCitpZiB7IFtnZGJfY29tcGlsZV9zaGxpYiAk bGlic3JjICRsaWJfc2wgJGxpYl9vcHRzXSAhPSAiIgorICAgICB8fCBbZ2Ri X2NvbXBpbGUgJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlICRiaW5maWxlIGV4 ZWN1dGFibGUgJGV4ZWNfb3B0c10gIT0gIiJ9IHsKKyAgICB1bnRlc3RlZCAi Q291bGQgbm90IGNvbXBpbGUgZWl0aGVyICRsaWJzcmMgb3IgJHNyY2Rpci8k c3ViZGlyLyRzcmNmaWxlLiIKKyAgICByZXR1cm4gLTEKK30KKworZ2RiX2V4 aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8k c3ViZGlyCisKK2dkYl90ZXN0IFwKKyAgICAiZHByaW50ZiBwZW5kZnVuYyIg XAorICAgICJEcHJpbnRmLipwZW5kZnVuYy4qcGVuZGluZy4iIFwKKyAgICAi c2V0IHBlbmRpbmcgZHByaW50ZiAod2l0aG91dCBmb3JtYXQpIiBcCisgICAg Ii4qTWFrZSBkcHJpbnRmIHBlbmRpbmcuKnkgb3IgXFxcW25cXFxdLiAkIiBc CisgICAgInkiCisKK2dkYl90ZXN0ICJmaWxlICR7YmluZmlsZX0iICIuKkVy cm9yIGluIHJlLXNldHRpbmcgYnJlYWtwb2ludC4qIiAibG9hZCBzeW1ib2xz IGdldCB3aXRob3V0IGZvcm1hdCBlcnJvciIKKworZ2RiX2V4aXQKK2dkYl9z dGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisK K2dkYl90ZXN0IFwKKyAgICAiZHByaW50ZiBwZW5kZnVuYzEsIFwieD0lZFxc blwiLCB4IiBcCisgICAgIkRwcmludGYuKnBlbmRmdW5jMS4qcGVuZGluZy4i IFwKKyAgICAic2V0IHBlbmRpbmcgZHByaW50ZiAod2l0aG91dCBzeW1ib2xz KSIgXAorICAgICIuKk1ha2UgZHByaW50ZiBwZW5kaW5nLip5IG9yIFxcXFtu XFxcXS4gJCIgXAorICAgICJ5IgorCitnZGJfdGVzdCAiaW5mbyBicmVhayIg XAorICAgICJOdW0gICAgIFR5cGVcWyBcXStEaXNwIEVuYiBBZGRyZXNzXFsg XF0rV2hhdC4qCitcWzAtOVxdK1xbXHQgXF0rZHByaW50Zi4qa2VlcCB5LipQ RU5ESU5HLipwZW5kZnVuYzEuKiIgXAorInNpbmdsZSBwZW5kaW5nIGRwcmlu dGYgaW5mbyAod2l0aG91dCBzeW1ib2xzKSIKKworZ2RiX2xvYWQgJHtiaW5m aWxlfQorZ2RiX2xvYWRfc2hsaWJzICRsaWJfc2wKKworZ2RiX3J1bl9jbWQK KworZ2RiX3Rlc3QgIiIgIi4qeD0zLip4PTQuKng9My4qIiAicnVuIHRvIHJl c29sdmVkIGRwcmludGYgKHdpdGhvdXQgc3ltYm9scykiCisKK2NsZWFuX3Jl c3RhcnQgJHtiaW5maWxlfQorZ2RiX2xvYWRfc2hsaWJzICRsaWJfc2wKKwor IworIyBUZXN0IHNldHRpbmcsIHF1ZXJ5aW5nLCBhbmQgbW9kaWZ5aW5nIHBl bmRpbmcgYnJlYWtwb2ludHMKKyMKKworZ2RiX3Rlc3QgXAorICAgICJkcHJp bnRmIHBlbmRmdW5jMSwgXCJ4PSVkXFxuXCIsIHgiIFwKKyAgICAiRHByaW50 Zi4qcGVuZGZ1bmMxLipwZW5kaW5nLiIgXAorICAgICJzZXQgcGVuZGluZyBk cHJpbnRmIiBcCisgICAgIi4qTWFrZSBkcHJpbnRmIHBlbmRpbmcuKnkgb3Ig XFxcW25cXFxdLiAkIiBcCisgICAgInkiCisKK2dkYl90ZXN0ICJpbmZvIGJy ZWFrIiBcCisgICAgIk51bSAgICAgVHlwZVxbIFxdK0Rpc3AgRW5iIEFkZHJl c3NcWyBcXStXaGF0LioKK1xbMC05XF0rXFtcdCBcXStkcHJpbnRmLiprZWVw IHkuKlBFTkRJTkcuKnBlbmRmdW5jMS4qIiBcCisic2luZ2xlIHBlbmRpbmcg ZHByaW50ZiBpbmZvIgorCitnZGJfcnVuX2NtZAorCitnZGJfdGVzdCAiIiAi Lip4PTMuKng9NC4qeD0zLioiICJydW4gdG8gcmVzb2x2ZWQgZHByaW50ZiIK LS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Rw cmludGYtcGVuZHNoci5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIFRoaXMgdGVz dGNhc2UgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKKyAg IENvcHlyaWdodCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAo YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlz IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJD SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2 ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor ICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0 cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaW5jbHVkZSA8 c3RkaW8uaD4KKwordm9pZCBwZW5kZnVuYzEgKGludCB4KQoreworICBpbnQg eSA9IHggKyA0OworfQorCit2b2lkIHBlbmRmdW5jIChpbnQgeCkKK3sKKyAg cGVuZGZ1bmMxICh4KTsKK30K --14dae939916391e7c304d9c62028--