From owner-freebsd-stable@FreeBSD.ORG Wed Apr 20 19:33:02 2011 Return-Path: Delivered-To: freebsd-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2B2B6106564A; Wed, 20 Apr 2011 19:33:02 +0000 (UTC) (envelope-from pluknet@gmail.com) Received: from mail-qw0-f54.google.com (mail-qw0-f54.google.com [209.85.216.54]) by mx1.freebsd.org (Postfix) with ESMTP id AE56A8FC08; Wed, 20 Apr 2011 19:33:01 +0000 (UTC) Received: by qwc9 with SMTP id 9so651168qwc.13 for ; Wed, 20 Apr 2011 12:33:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=/LYGRBjQD2LgfjGqjjgitBeC1fwyapTVKKpjn9i5uqw=; b=V70mgE06p057y1GcOGPPft25fGw8b6dMTTge426dTdgyMKpSc0ZzHOFvgsjfI9KXB8 /EWdm8S1DLVAPltS0x247mB7oeuB7oxLMl/X7wElASsEQIJjf3CMBDvkRcZUkqG2H+eL ikW4N69/apVtr7rdUXJsSbObnD/yX0CVHmBt8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=qAPCawXqjkHpaaxtyOQhEhplZSrQ0jIoRRTZkj9Rub1rQosWKESLLrgkL/lwFsafWI zwochKmpbK0KrF5T5gxhkpwC4g5Ojjln7luQdJsEaqREqcFmiDpkJSRR3Lbij5HZ9AWl 52K61AOForj+2hgmzLizpa4DomxZIL8FlLrYE= MIME-Version: 1.0 Received: by 10.229.102.73 with SMTP id f9mr5514872qco.168.1303327980568; Wed, 20 Apr 2011 12:33:00 -0700 (PDT) Received: by 10.229.221.136 with HTTP; Wed, 20 Apr 2011 12:33:00 -0700 (PDT) In-Reply-To: References: <4D9EEDAF.3020803@rulez.sk> <20110411125416.S35056@sola.nimnet.asn.au> <4DA37E31.4020700@FreeBSD.org> <20110413024230.Y35056@sola.nimnet.asn.au> <20110420164100.Y43371@sola.nimnet.asn.au> Date: Wed, 20 Apr 2011 23:33:00 +0400 Message-ID: From: Sergey Kandaurov To: Ian Smith Content-Type: multipart/mixed; boundary=002354471dd84ebfd304a15eb14c Cc: Daniel Gerzo , freebsd-stable@freebsd.org, Alexander Motin , John Baldwin Subject: Re: kern.smp.maxid error on i386 UP [was: powerd / cpufreq question] X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Apr 2011 19:33:02 -0000 --002354471dd84ebfd304a15eb14c Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On 20 April 2011 22:29, Sergey Kandaurov wrote: > On 20 April 2011 21:02, Ian Smith wrote: >> On Wed, 13 Apr 2011, Ian Smith wrote: >> =A0> On Tue, 12 Apr 2011, Daniel Gerzo wrote: >> =A0> =A0> On 11.4.2011 6:08, Ian Smith wrote: >> [..] >> =A0> =A0> > Are those kern.cp_times values as they came, or did you remo= ve trailing >> =A0> =A0> > zeroes? =A0Reason I ask is that on my Thinkpad T23, single-c= ore 1133/733 >> =A0> =A0> > MHz, sysctl kern.cp_time shows the usual 5 values, but kern.= cp_times has >> =A0> =A0> > the same 5 values for cpu0, but then 5 zeroes for each of cp= u1 through >> =A0> =A0> > cpu31, on 8.2-PRE about early January. =A0I need to update t= he script to >> =A0> =A0> > remove surplus data for non-existing cpus, but wonder if the= extra data >> =A0> =A0> > also appeared on your 12 core box? >> =A0> =A0> >> =A0> =A0> I haven't removed anything, it's a pure copy&paste. >> =A0> >> =A0> Thanks. =A0I'll check the single-cpu case again after updating to 8= .2-R >> >> Ok, still a problem on at least my i386 single core Thinkpad T23 at >> 8.2-R, since 8.0 I think, certainly evident in a sysctl -a at 8.1-R >> >> FreeBSD t23.smithi.id.au 8.2-RELEASE FreeBSD 8.2-RELEASE #1: Thu Apr 14 >> 21:45:47 EST 2011 root@t23.smithi.id.au:/usr/obj/usr/src/sys/GENERIC i38= 6 >> >> Verbose dmesg: http://smithi.id.au/t23_dmesg_boot-v.8.2-R.txt >> sysctl -a: =A0 =A0 http://smithi.id.au/t23_sysctl-a_8.2-R.txt >> >> kern.ccpu: 0 >> =A00 >> kern.smp.forward_signal_enabled: 1 >> kern.smp.topology: 0 >> kern.smp.cpus: 1 >> kern.smp.disabled: 0 >> kern.smp.active: 0 >> kern.smp.maxcpus: 32 >> kern.smp.maxid: 31 =A0 =A0 =A0<<<<<<< >> hw.ncpu: 1 >> >> kern.cp_times: 38548 1 120437 195677 9660939 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >> >> /usr/src/sys/kern/kern_clock.c: >> return SYSCTL_OUT(req, 0, sizeof(long) * CPUSTATES * (mp_maxid + 1)); >> >> Consumers of kern.cp_times like powerd, top, dtrace? and others have to >> loop over 32 cpus, all but one non-existent, and there seem to be many >> places in the kernel doing eg: for (cpu =3D 0; cpu <=3D mp_maxid; cpu++)= { >> and while CPU_FOREACH / CPU_ABSENT will skip over them, seems wasteful >> at best on machines least likely to have cycles to spare. >> >> eg: powerd parses kern.cp_times to count cpus, wasting cycles adding >> up the 31 'empty' cpus. =A0I haven't explored other userland consumers. >> >> Clearly kern.smp.maxid (ie mp_maxid) should be 0, not 31. =A0On i386, >> non-APIC i386 at least, mp_maxid is not set to (mp_ncpus - 1) as on some >> other archs .. after having being initialised to (MAXCPU - 1) in >> /sys/i386/i386/mp_machdep.c it's never updated for non-smp machines. >> >> I haven't chased all of these rabbits down all of their holes by any >> means, but it seems that making /sys/i386/i386/mp_machdep.c do what it >> says it's gonna do ('with an id of 0') should help. =A0Paste, tabs lost: >> >> int >> cpu_mp_probe(void) >> { >> =A0 =A0 =A0 =A0/* >> =A0 =A0 =A0 =A0 * Always record BSP in CPU map so that the mbuf init cod= e works >> =A0 =A0 =A0 =A0 * correctly. >> =A0 =A0 =A0 =A0 */ >> =A0 =A0 =A0 =A0all_cpus =3D 1; >> =A0 =A0 =A0 =A0if (mp_ncpus =3D=3D 0) { >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * No CPUs were found, so this must be a = UP system. =A0Setup >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * the variables to represent a system wi= th a single CPU >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * with an id of 0. >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 */ >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mp_ncpus =3D 1; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 mp_maxid =3D 0; >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return (0); >> =A0 =A0 =A0 =A0} >> >> =A0 =A0 =A0 =A0/* At least one CPU was found. */ >> =A0 =A0 =A0 =A0if (mp_ncpus =3D=3D 1) { >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * One CPU was found, so this must be a U= P system with >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 * an I/O APIC. >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 */ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 mp_maxid =3D 0; >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return (0); >> =A0 =A0 =A0 =A0} >> >> =A0 =A0 =A0 =A0/* At least two CPUs were found. */ >> =A0 =A0 =A0 =A0return (1); >> } >> >> Note that the second added line above already exists in >> /sys/amd64/amd64/mp_machdep.c, maybe to fix a similar problem, though >> that should only apply to 'a UP system with an I/O APIC'. =A0Maybe bette= r >> could be to fix this in cpu_mp_probe's caller, /sys/kern/subr_smp.c: >> >> static void >> mp_start(void *dummy) >> { >> =A0 =A0 =A0 =A0mtx_init(&smp_ipi_mtx, "smp rendezvous", NULL, MTX_SPIN); >> >> =A0 =A0 =A0 =A0/* Probe for MP hardware. */ >> =A0 =A0 =A0 =A0if (smp_disabled !=3D 0 || cpu_mp_probe() =3D=3D 0) { >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0mp_ncpus =3D 1; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 mp_maxid =3D 0; >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0all_cpus =3D PCPU_GET(cpumask); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return; >> =A0 =A0 =A0 =A0} >> >> =A0 =A0 =A0 =A0cpu_mp_start(); >> =A0 =A0 =A0 =A0printf("FreeBSD/SMP: Multiprocessor System Detected: %d C= PUs\n", >> =A0 =A0 =A0 =A0 =A0 =A0mp_ncpus); >> =A0 =A0 =A0 =A0cpu_mp_announce(); >> } >> >> I'm probably a long way off base for a solution, but think I've located >> the problem. =A0Thoughts? =A0Is this a known issue? =A0Might any develop= ers >> actually still have a single-cpu i386 system to check this on? :) >> >> Very happy to test any patches etc. >> > > Ouch. > Looks like that affects a system with 2 cores as well. > Intel Core2 E7200, 8.2-R i386 SMP: > > kern.smp.forward_signal_enabled: 1 > kern.smp.topology: 0 > kern.smp.cpus: 2 > kern.smp.disabled: 0 > kern.smp.active: 1 > kern.smp.maxcpus: 32 > kern.smp.maxid: 31 > > kern.cp_times: 867360 171 429180 70114 170549535 1385294 306 176659 82618 > 170270900 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 > 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 > 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 > 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 > 0 0 0 0 0 0 0 Perhaps that was so from the begging: the problem is seen also on 6.4 i386 SMP 8 core. Here it was just set to (MAXCPU-1). The buggy mp_maxid was fixed in HEAD with r215009, though not merged. The patch works on my 8.2 Core2 SMP i386 system. --=20 wbr, pluknet --002354471dd84ebfd304a15eb14c Content-Type: text/x-diff; charset=US-ASCII; name="mp_maxid.82.patch" Content-Disposition: attachment; filename="mp_maxid.82.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gmqnk58a0 SW5kZXg6IHg4Ni94ODYvbXB0YWJsZS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHg4Ni94ODYvbXB0YWJsZS5j CShyZXZpc2lvbiAyMTUwMDgpCisrKyB4ODYveDg2L21wdGFibGUuYwkocmV2aXNpb24gMjE1MDA5 KQpAQCAtMzg5LDcgKzM4OSw4IEBACiAKIAlhcGljX3JlZ2lzdGVyX2VudW1lcmF0b3IoJm1wdGFi bGVfZW51bWVyYXRvcik7CiB9Ci1TWVNJTklUKG1wdGFibGVfcmVnaXN0ZXIsIFNJX1NVQl9NUFRC TCwgU0lfT1JERVJfRklSU1QsIG1wdGFibGVfcmVnaXN0ZXIsIE5VTEwpOworU1lTSU5JVChtcHRh YmxlX3JlZ2lzdGVyLCBTSV9TVUJfVFVOQUJMRVMgLSAxLCBTSV9PUkRFUl9GSVJTVCwgbXB0YWJs ZV9yZWdpc3RlciwKKyAgICBOVUxMKTsKIAogLyoKICAqIENhbGwgdGhlIGhhbmRsZXIgcm91dGlu ZSBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgTVAgY29uZmlnIHRhYmxlLgpJbmRleDogeDg2L3g4Ni9s b2NhbF9hcGljLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQotLS0geDg2L3g4Ni9sb2NhbF9hcGljLmMJKHJldmlzaW9u IDIxNTAwOCkKKysrIHg4Ni94ODYvbG9jYWxfYXBpYy5jCShyZXZpc2lvbiAyMTUwMDkpCkBAIC0x Mjg1LDcgKzEyODUsNyBAQAogCWlmIChyZXNvdXJjZV9kaXNhYmxlZCgiYXBpYyIsIDApKQogCQly ZXR1cm47CiAKLQkvKiBGaXJzdCwgcHJvYmUgYWxsIHRoZSBlbnVtZXJhdG9ycyB0byBmaW5kIHRo ZSBiZXN0IG1hdGNoLiAqLworCS8qIFByb2JlIGFsbCB0aGUgZW51bWVyYXRvcnMgdG8gZmluZCB0 aGUgYmVzdCBtYXRjaC4gKi8KIAliZXN0X2VudW0gPSBOVUxMOwogCWJlc3QgPSAwOwogCVNMSVNU X0ZPUkVBQ0goZW51bWVyYXRvciwgJmVudW1lcmF0b3JzLCBhcGljX25leHQpIHsKQEAgLTEzMjEs MTMgKzEzMjEsMTIgQEAKIAl9CiAjZW5kaWYKIAotCS8qIFNlY29uZCwgcHJvYmUgdGhlIENQVSdz IGluIHRoZSBzeXN0ZW0uICovCisJLyogUHJvYmUgdGhlIENQVSdzIGluIHRoZSBzeXN0ZW0uICov CiAJcmV0dmFsID0gYmVzdF9lbnVtLT5hcGljX3Byb2JlX2NwdXMoKTsKIAlpZiAocmV0dmFsICE9 IDApCiAJCXByaW50ZigiJXM6IEZhaWxlZCB0byBwcm9iZSBDUFVzOiByZXR1cm5lZCAlZFxuIiwK IAkJICAgIGJlc3RfZW51bS0+YXBpY19uYW1lLCByZXR2YWwpOwogCi0jaWZkZWYgX19hbWQ2NF9f CiB9CiBTWVNJTklUKGFwaWNfaW5pdCwgU0lfU1VCX1RVTkFCTEVTIC0gMSwgU0lfT1JERVJfU0VD T05ELCBhcGljX2luaXQsIE5VTEwpOwogCkBAIC0xMzQyLDE5ICsxMzQxLDE0IEBACiAgCiAJaWYg KGJlc3RfZW51bSA9PSBOVUxMKQogCQlyZXR1cm47Ci0jZW5kaWYKLQkvKiBUaGlyZCwgaW5pdGlh bGl6ZSB0aGUgbG9jYWwgQVBJQy4gKi8KKworCS8qIEluaXRpYWxpemUgdGhlIGxvY2FsIEFQSUMu ICovCiAJcmV0dmFsID0gYmVzdF9lbnVtLT5hcGljX3NldHVwX2xvY2FsKCk7CiAJaWYgKHJldHZh bCAhPSAwKQogCQlwcmludGYoIiVzOiBGYWlsZWQgdG8gc2V0dXAgdGhlIGxvY2FsIEFQSUM6IHJl dHVybmVkICVkXG4iLAogCQkgICAgYmVzdF9lbnVtLT5hcGljX25hbWUsIHJldHZhbCk7CiB9Ci0j aWZkZWYgX19hbWQ2NF9fCi1TWVNJTklUKGFwaWNfc2V0dXBfbG9jYWwsIFNJX1NVQl9DUFUsIFNJ X09SREVSX1NFQ09ORCwgYXBpY19zZXR1cF9sb2NhbCwKLSAgICBOVUxMKTsKLSNlbHNlCi1TWVNJ TklUKGFwaWNfaW5pdCwgU0lfU1VCX0NQVSwgU0lfT1JERVJfU0VDT05ELCBhcGljX2luaXQsIE5V TEwpOwotI2VuZGlmCitTWVNJTklUKGFwaWNfc2V0dXBfbG9jYWwsIFNJX1NVQl9DUFUsIFNJX09S REVSX1NFQ09ORCwgYXBpY19zZXR1cF9sb2NhbCwgTlVMTCk7CiAKIC8qCiAgKiBTZXR1cCB0aGUg SS9PIEFQSUNzLgpJbmRleDogaTM4Ni9hY3BpY2EvbWFkdC5jCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGkzODYv YWNwaWNhL21hZHQuYwkocmV2aXNpb24gMjE1MDA4KQorKysgaTM4Ni9hY3BpY2EvbWFkdC5jCShy ZXZpc2lvbiAyMTUwMDkpCkBAIC0yMDMsNyArMjAzLDcgQEAKIAogCWFwaWNfcmVnaXN0ZXJfZW51 bWVyYXRvcigmbWFkdF9lbnVtZXJhdG9yKTsKIH0KLVNZU0lOSVQobWFkdF9yZWdpc3RlciwgU0lf U1VCX0NQVSAtIDEsIFNJX09SREVSX1NFQ09ORCwgbWFkdF9yZWdpc3RlciwgTlVMTCk7CitTWVNJ TklUKG1hZHRfcmVnaXN0ZXIsIFNJX1NVQl9UVU5BQkxFUyAtIDEsIFNJX09SREVSX0ZJUlNULCBt YWR0X3JlZ2lzdGVyLCBOVUxMKTsKIAogLyoKICAqIENhbGwgdGhlIGhhbmRsZXIgcm91dGluZSBm b3IgZWFjaCBlbnRyeSBpbiB0aGUgTUFEVCB0YWJsZS4KSW5kZXg6IGkzODYvaTM4Ni9tcF9tYWNo ZGVwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQotLS0gaTM4Ni9pMzg2L21wX21hY2hkZXAuYwkocmV2aXNpb24gMjE1 MDA4KQorKysgaTM4Ni9pMzg2L21wX21hY2hkZXAuYwkocmV2aXNpb24gMjE1MDA5KQpAQCAtNDY1 LDggKzQ2NSwxMCBAQAogCQlib290X2NwdV9pZCA9IGFwaWNfaWQ7CiAJCWNwdV9pbmZvW2FwaWNf aWRdLmNwdV9ic3AgPSAxOwogCX0KLQlpZiAobXBfbmNwdXMgPCBNQVhDUFUpCisJaWYgKG1wX25j cHVzIDwgTUFYQ1BVKSB7CiAJCW1wX25jcHVzKys7CisJCW1wX21heGlkID0gbXBfbmNwdXMgLSAx OworCX0KIAlpZiAoYm9vdHZlcmJvc2UpCiAJCXByaW50ZigiU01QOiBBZGRlZCBDUFUgJWQgKCVz KVxuIiwgYXBpY19pZCwgYm9vdF9jcHUgPyAiQlNQIiA6CiAJCSAgICAiQVAiKTsKQEAgLTQ3Niw3 ICs0NzgsMTkgQEAKIGNwdV9tcF9zZXRtYXhpZCh2b2lkKQogewogCi0JbXBfbWF4aWQgPSBNQVhD UFUgLSAxOworCS8qCisJICogbXBfbWF4aWQgc2hvdWxkIGJlIGFscmVhZHkgc2V0IGJ5IGNhbGxz IHRvIGNwdV9hZGQoKS4KKwkgKiBKdXN0IHNhbml0eSBjaGVjayBpdHMgdmFsdWUgaGVyZS4KKwkg Ki8KKwlpZiAobXBfbmNwdXMgPT0gMCkKKwkJS0FTU0VSVChtcF9tYXhpZCA9PSAwLAorCQkgICAg KCIlczogbXBfbmNwdXMgaXMgemVybywgYnV0IG1wX21heGlkIGlzIG5vdCIsIF9fZnVuY19fKSk7 CisJZWxzZSBpZiAobXBfbmNwdXMgPT0gMSkKKwkJbXBfbWF4aWQgPSAwOworCWVsc2UKKwkJS0FT U0VSVChtcF9tYXhpZCA+PSBtcF9uY3B1cyAtIDEsCisJCSAgICAoIiVzOiBjb3VudGVycyBvdXQg b2Ygc3luYzogbWF4ICVkLCBjb3VudCAlZCIsIF9fZnVuY19fLAorCQkJbXBfbWF4aWQsIG1wX25j cHVzKSk7CiB9CiAKIGludApAQCAtNTA0LDYgKzUxOCw3IEBACiAJCSAqIE9uZSBDUFUgd2FzIGZv dW5kLCBzbyB0aGlzIG11c3QgYmUgYSBVUCBzeXN0ZW0gd2l0aAogCQkgKiBhbiBJL08gQVBJQy4K IAkJICovCisJCW1wX21heGlkID0gMDsKIAkJcmV0dXJuICgwKTsKIAl9CiAKSW5kZXg6IGkzODYv eGVuL21wdGFibGUuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBpMzg2L3hlbi9tcHRhYmxlLmMJKHJldmlzaW9u IDIxNTAwOCkKKysrIGkzODYveGVuL21wdGFibGUuYwkocmV2aXNpb24gMjE1MDA5KQpAQCAtMTA5 LDcgKzEwOSw3IEBACiAKIAlhcGljX3JlZ2lzdGVyX2VudW1lcmF0b3IoJm1wdGFibGVfZW51bWVy YXRvcik7CiB9Ci1TWVNJTklUKG1wdGFibGVfcmVnaXN0ZXIsIFNJX1NVQl9DUFUgLSAxLCBTSV9P UkRFUl9GSVJTVCwgbXB0YWJsZV9yZWdpc3RlciwKK1NZU0lOSVQobXB0YWJsZV9yZWdpc3Rlciwg U0lfU1VCX1RVTkFCTEVTIC0gMSwgU0lfT1JERVJfRklSU1QsIG1wdGFibGVfcmVnaXN0ZXIsCiAg ICAgTlVMTCk7CiAKIAo= --002354471dd84ebfd304a15eb14c--