# PaCkAgE DaTaStReAm RICHPse 1 30573 # end of header 07070100084d56000081a400000000000000000000000141dc5ea400000120000000880000000400000000000000000000001000000005RICHPse/pkginfoARCH=sparc,i386 BASEDIR=/opt ROOTDIR=/ CATEGORY=application CLASSES=none MAXINST=1000 DESC=The SymbEL Interpreter EMAIL=se-feedback@setoolkit.com HOTLINE=se-feedback@setoolkit.com NAME=The SymbEL Interpreter PKG=RICHPse VENDOR=Rich Pettit PSTAMP=05 Jan 05 VERSION=3.4 (03:59 PM 01/05/05) 07070100084d55000081a400000000000000000000000141dc5ea400005fa5000000880000000400000000000000000000000f00000005RICHPse/pkgmap: 1 30573 1 d none RICHPse 0755 root other 1 d none RICHPse/bin 0755 root other 1 f none RICHPse/bin/pw_example.sh 0555 root other 274 22134 1104961187 1 f none RICHPse/bin/se 0755 root other 669 48136 1104961186 1 f none RICHPse/bin/se.i386 0755 root other 260768 20131 1104961186 1 f none RICHPse/bin/se.sparcv9 0755 root other 316792 30787 1104961186 1 f none RICHPse/bin/workollator_example.sh 0555 root other 1118 30326 1104961187 1 d none RICHPse/contrib 0755 root other 1 d none RICHPse/contrib/dfstats 0755 root other 1 f none RICHPse/contrib/dfstats/author 0644 root other 257 16771 1104961187 1 f none RICHPse/contrib/dfstats/df_stats.se 0644 root other 10269 24499 1104961187 1 f none RICHPse/contrib/dfstats/fs_class.se 0644 root other 1658 63198 1104961187 1 f none RICHPse/contrib/dfstats/mdf.se 0644 root other 1859 10473 1104961187 1 d none RICHPse/contrib/iops 0755 root other 1 f none RICHPse/contrib/iops/author 0644 root other 82 7501 1104961187 1 f none RICHPse/contrib/iops/iops.se 0644 root other 3657 26081 1104961187 1 d none RICHPse/contrib/kview 0755 root other 1 f none RICHPse/contrib/kview/author 0644 root other 32 2898 1104961187 1 f none RICHPse/contrib/kview/kviewx.se 0644 root other 5005 58081 1104961187 1 d none RICHPse/contrib/perfbar 0755 root other 1 f none RICHPse/contrib/perfbar/author 0644 root other 28 2510 1104961187 1 f none RICHPse/contrib/perfbar/perfbar.se 0644 root other 5859 29833 1104961187 1 d none RICHPse/contrib/psrsetstat 0755 root other 1 f none RICHPse/contrib/psrsetstat/author 0644 root other 101 7780 1104961187 1 f none RICHPse/contrib/psrsetstat/psrsetstat.se 0644 root other 4710 16019 1104961187 1 d none RICHPse/contrib/watch 0755 root other 1 f none RICHPse/contrib/watch/author 0644 root other 214 15181 1104961187 1 f none RICHPse/contrib/watch/watch.se 0644 root other 2985 13872 1104961187 1 d none RICHPse/dio 0755 root other 1 f none RICHPse/dio/dio.se 0644 root other 7942 38847 1104961187 1 f none RICHPse/dio/dio_disk.se 0644 root other 5150 46553 1104961187 1 d none RICHPse/doc 0755 root other 1 f none RICHPse/doc/CHANGES 0644 root other 16490 26641 1104961187 1 f none RICHPse/doc/EXAMPLES.DOC 0644 root other 26850 10884 1104961187 1 f none RICHPse/doc/FAQ 0644 root other 12466 30878 1104961187 1 f none RICHPse/doc/GUI.MANUAL 0644 root other 47630 62174 1104961187 1 f none RICHPse/doc/README.INSTALL 0644 root other 12075 47680 1104961187 1 f none RICHPse/doc/README.RELEASE 0644 root other 6275 53656 1104961187 1 f none RICHPse/doc/REPORTING.BUGS 0644 root other 20 1747 1104961187 1 f none RICHPse/doc/USERS.MANUAL 0644 root other 96149 21071 1104961187 1 d none RICHPse/etc 0755 root other 1 d none RICHPse/etc/init.d 0755 root other 1 f none RICHPse/etc/init.d/mon_cm 0755 root other 3381 58757 982370057 1 f none RICHPse/etc/init.d/monlog 0755 root other 2482 55343 982370102 1 f none RICHPse/etc/init.d/percol 0755 root other 4198 1226 982370117 1 f none RICHPse/etc/init.d/va_monitor 0755 root other 3358 61006 982370141 1 f none RICHPse/etc/init.d/vader 0755 root other 1375 15499 982370671 1 d none RICHPse/etc/rc0.d 0755 root other 1 s none RICHPse/etc/rc0.d/K34vader=../init.d/vader 1 s none RICHPse/etc/rc0.d/K60mon_cm=../init.d/mon_cm 1 s none RICHPse/etc/rc0.d/K60monlog=../init.d/monlog 1 s none RICHPse/etc/rc0.d/K60percol=../init.d/percol 1 s none RICHPse/etc/rc0.d/K60va_monitor=../init.d/va_monitor 1 d none RICHPse/etc/rc2.d 0755 root other 1 s none RICHPse/etc/rc2.d/S89vader=../init.d/vader 1 s none RICHPse/etc/rc2.d/S90mon_cm=../init.d/mon_cm 1 s none RICHPse/etc/rc2.d/S90monlog=../init.d/monlog 1 s none RICHPse/etc/rc2.d/S90va_monitor=../init.d/va_monitor 1 d none RICHPse/etc/rc3.d 0755 root other 1 s none RICHPse/etc/rc3.d/S99percol=../init.d/percol 1 f none RICHPse/etc/se-mode.el 0644 root other 1935 35492 877020055 1 f none RICHPse/etc/se-mode.elc 0644 root other 1712 17438 877028564 1 f none RICHPse/etc/se_defines 0644 root other 739 50092 993500117 1 d none RICHPse/examples 0755 root other 1 f none RICHPse/examples/aw.se 0644 root other 52480 38228 1104961187 1 f none RICHPse/examples/bigbrother.se 0644 root other 6781 29646 1104961187 1 f none RICHPse/examples/collisions.se 0644 root other 351 27747 1104961187 1 f none RICHPse/examples/cpg.se 0644 root other 11757 31000 1104961187 1 f none RICHPse/examples/cpu_meter.se 0644 root other 7325 51070 1104961187 1 f none RICHPse/examples/cpuchk.se 0644 root other 2378 45309 1104961187 1 f none RICHPse/examples/cpus.se 0644 root other 322 24972 1104961187 1 f none RICHPse/examples/cpustat.se 0644 root other 1765 1889 1104961187 1 f none RICHPse/examples/ctlr.se 0644 root other 1179 25216 1104961187 1 f none RICHPse/examples/darth.se 0644 root other 14917 9512 1104961187 1 d none RICHPse/examples/data 0755 root other 1 f none RICHPse/examples/data/adrian 0644 root other 290 19934 1104961187 1 f none RICHPse/examples/data/adrian.bio 0644 root other 3732 2739 1104961187 1 f none RICHPse/examples/data/blank 0644 root other 1895 42778 1104961187 1 f none RICHPse/examples/data/callog.root 0644 root other 86 6066 1104961187 1 f none RICHPse/examples/data/cpu 0644 root other 1880 46781 1104961187 1 f none RICHPse/examples/data/cpu_meter_icon 0644 root other 1913 49486 1104961187 1 f none RICHPse/examples/data/disk 0644 root other 1883 45576 1104961187 1 f none RICHPse/examples/data/dnlc 0644 root other 1883 45918 1104961187 1 f none RICHPse/examples/data/drip.au 0644 root other 759 32990 1104961187 1 f none RICHPse/examples/data/inode 0644 root other 1886 46266 1104961187 1 f none RICHPse/examples/data/kmem 0644 root other 1883 45477 1104961187 1 f none RICHPse/examples/data/mutex 0644 root other 1886 45641 1104961187 1 f none RICHPse/examples/data/network 0644 root other 1892 47030 1104961187 1 f none RICHPse/examples/data/nfs_client 0644 root other 1901 48882 1104961187 1 f none RICHPse/examples/data/ram 0644 root other 1880 44742 1104961187 1 f none RICHPse/examples/data/richp 0644 root other 274 18796 1104961187 1 f none RICHPse/examples/data/richp.bio 0644 root other 3803 3640 1104961187 1 f none RICHPse/examples/data/swap 0644 root other 1883 46867 1104961187 1 f none RICHPse/examples/data/tpry.desc 0644 root other 4200 62118 1104961187 1 f none RICHPse/examples/data/xit_icon 0644 root other 1895 45456 1104961187 1 f none RICHPse/examples/data/xload_icon 0644 root other 933 64575 1104961187 1 f none RICHPse/examples/data/zoom 0644 root other 1883 44519 1104961187 1 f none RICHPse/examples/disks.se 0644 root other 2294 42132 1104961187 1 f none RICHPse/examples/dumpkstats.se 0644 root other 7274 43037 1104961187 1 f none RICHPse/examples/hostid.se 0644 root other 534 42647 1104961187 1 f none RICHPse/examples/infotool.se 0644 root other 50322 64969 1104961187 1 f none RICHPse/examples/iomonitor.se 0644 root other 2625 4862 1104961187 1 f none RICHPse/examples/iost.se 0644 root other 1921 15423 1104961187 1 f none RICHPse/examples/iostat.se 0644 root other 1676 65444 1104961187 1 f none RICHPse/examples/kvmname.se 0644 root other 258 21900 1104961187 1 f none RICHPse/examples/limits.se 0644 root other 10340 23202 1104961187 1 f none RICHPse/examples/live_test.se 0644 root other 5625 2794 1104961187 1 f none RICHPse/examples/mini_cpu.se 0644 root other 2646 1868 1104961187 1 f none RICHPse/examples/mon_cm.se 0644 root other 6258 34989 1104961187 1 f none RICHPse/examples/monlog.se 0644 root other 8674 14363 1104961187 1 f none RICHPse/examples/mpvmstat.se 0644 root other 1572 53364 1104961187 1 f none RICHPse/examples/mrvmstat.se 0644 root other 2691 18240 1104961187 1 f none RICHPse/examples/msacct.se 0644 root other 3114 36424 1104961187 1 f none RICHPse/examples/msacct_off.se 0644 root other 584 48240 1104961187 1 f none RICHPse/examples/multi_meter.se 0644 root other 8579 32155 1104961187 1 f none RICHPse/examples/net.se 0644 root other 606 46215 1104961187 1 d none RICHPse/examples/net_example 0755 root other 1 f none RICHPse/examples/net_example/client.se 0644 root other 2140 35451 1104961187 1 f none RICHPse/examples/net_example/sample.se 0644 root other 441 31079 1104961187 1 f none RICHPse/examples/net_example/server.se 0644 root other 2362 59311 1104961187 1 f none RICHPse/examples/netmonitor.se 0644 root other 2527 64281 1104961187 1 f none RICHPse/examples/netstat.se 0644 root other 2686 7697 1104961187 1 f none RICHPse/examples/netstatx.se 0644 root other 2066 28252 1104961187 1 f none RICHPse/examples/nfsmonitor.se 0644 root other 5143 43666 1104961187 1 f none RICHPse/examples/nfsstat.se 0644 root other 3729 11480 1104961187 1 f none RICHPse/examples/nproc.se 0644 root other 305 23617 1104961187 1 f none RICHPse/examples/nx.se 0644 root other 1875 9021 1104961187 1 f none RICHPse/examples/pea.se 0644 root other 2680 11240 1104961187 1 f none RICHPse/examples/peac.se 0644 root other 2901 30132 1104961187 1 f none RICHPse/examples/peer.se 0644 root other 2859 26441 1104961187 1 f none RICHPse/examples/percollator.se 0644 root other 19503 51589 1104961187 1 f none RICHPse/examples/perfmeter.se 0644 root other 2300 34530 1104961187 1 f none RICHPse/examples/pry.se 0644 root other 2921 34278 1104961187 1 f none RICHPse/examples/ps-ax.se 0644 root other 547 40337 1104961187 1 f none RICHPse/examples/ps-p.se 0644 root other 643 48805 1104961187 1 f none RICHPse/examples/pure_test.se 0644 root other 8440 50505 1104961187 1 f none RICHPse/examples/pw.se 0644 root other 3395 59925 1104961187 1 f none RICHPse/examples/pw_log.se 0644 root other 4576 3498 1104961187 1 f none RICHPse/examples/pwatch.se 0644 root other 1554 52063 1104961187 1 f none RICHPse/examples/rvmstat.se 0644 root other 2020 27658 1104961187 1 f none RICHPse/examples/siostat.se 0644 root other 1852 14291 1104961187 1 f none RICHPse/examples/swap.se 0644 root other 2255 56230 1104961187 1 f none RICHPse/examples/swapctl.se 0644 root other 449 34283 1104961187 1 f none RICHPse/examples/syslog.se 0644 root other 228 17568 1104961187 1 f none RICHPse/examples/tcp_monitor.se 0644 root other 28355 15102 1104961187 1 f none RICHPse/examples/tpry.se 0644 root other 5390 14560 1104961187 1 f none RICHPse/examples/uname.se 0644 root other 2124 15853 1104961187 1 f none RICHPse/examples/uptime.se 0644 root other 348 26934 1104961187 1 f none RICHPse/examples/util.se 0644 root other 466 35333 1104961187 1 f none RICHPse/examples/vader.se 0644 root other 27245 48440 1104961187 1 f none RICHPse/examples/virtual_adrian.se 0644 root other 25822 14818 1104961187 1 f none RICHPse/examples/virtual_adrian_lite.se 0644 root other 20298 34917 1104961187 1 f none RICHPse/examples/vmmonitor.se 0644 root other 2443 58063 1104961187 1 f none RICHPse/examples/vmstat.se 0644 root other 1787 2797 1104961187 1 f none RICHPse/examples/webtune.se 0644 root other 3795 16213 1104961187 1 f none RICHPse/examples/workollator.se 0644 root other 4668 11697 1104961187 1 f none RICHPse/examples/xio.se 0644 root other 2050 24145 1104961187 1 f none RICHPse/examples/xiostat.se 0644 root other 1400 40949 1104961187 1 f none RICHPse/examples/xit.se 0644 root other 6660 47867 1104961187 1 f none RICHPse/examples/xload.se 0644 root other 1821 61922 1104961187 1 f none RICHPse/examples/zoom.se 0644 root other 52936 30745 1104961187 1 d none RICHPse/include 0755 root other 1 f none RICHPse/include/app_wrap_class.se 0644 root other 17023 45514 1104961187 1 f none RICHPse/include/condvar.se 0644 root other 604 49600 1104961187 1 f none RICHPse/include/ctlr_class.se 0644 root other 4461 15340 1104961187 1 f none RICHPse/include/ctype.se 0644 root other 1004 15721 1104961187 1 f none RICHPse/include/devinfo.se 0644 root other 2148 40022 1104961187 1 f none RICHPse/include/dirent.se 0644 root other 1354 39831 1104961187 1 f none RICHPse/include/diskinfo.se 0644 root other 10742 47792 1104961187 1 f none RICHPse/include/dlfcn.se 0644 root other 1496 52191 1104961187 1 f none RICHPse/include/errno.se 0644 root other 6702 47312 1104961187 1 f none RICHPse/include/fcntl.se 0644 root other 3066 38600 1104961187 1 f none RICHPse/include/gui_defines.h 0644 root other 3489 61775 1104961187 1 f none RICHPse/include/gui_lib.se 0644 root other 5530 21709 1104961187 1 f none RICHPse/include/kstat.se 0644 root other 72774 44781 1104961187 1 f none RICHPse/include/live_rules.se 0644 root other 30651 12828 1104961187 1 f none RICHPse/include/logfile.se 0644 root other 2869 29004 1104961187 1 f none RICHPse/include/math.se 0644 root other 3469 61463 1104961187 1 f none RICHPse/include/mib.se 0644 root other 10019 24218 1104961187 1 f none RICHPse/include/mnt_class.se 0644 root other 6133 29099 1104961187 1 f none RICHPse/include/multi_rstat_class.se 0644 root other 803 62381 1104961187 1 f none RICHPse/include/mutex.se 0644 root other 603 49724 1104961187 1 f none RICHPse/include/ndd.se 0644 root other 19044 40341 1104961187 1 f none RICHPse/include/net_lib.se 0644 root other 2916 30553 1104961187 1 f none RICHPse/include/netdb.se 0644 root other 3925 54528 1104961187 1 f none RICHPse/include/netif.se 0644 root other 27424 40974 1104961187 1 f none RICHPse/include/nfs_clnt.se 0644 root other 2492 49518 1104961187 1 f none RICHPse/include/p_iostat_class.se 0644 root other 9225 31632 1104961187 1 f none RICHPse/include/p_netstat_class.se 0644 root other 7147 59524 1104961187 1 f none RICHPse/include/p_vmstat_class.se 0644 root other 9146 16754 1104961187 1 f none RICHPse/include/partinfo.se 0644 root other 2472 56487 1104961187 1 f none RICHPse/include/poll.se 0644 root other 1520 53085 1104961187 1 f none RICHPse/include/proc.se 0644 root other 22793 63085 1104961187 1 f none RICHPse/include/process_class.se 0644 root other 36997 43493 1104961187 1 f none RICHPse/include/process_rules.se 0644 root other 8979 52719 1104961187 1 f none RICHPse/include/processor.se 0644 root other 2288 35793 1104961187 1 f none RICHPse/include/pure_rules.se 0644 root other 37167 44655 1104961187 1 f none RICHPse/include/pure_rules_dutch.se 0644 root other 41068 18856 1104961187 1 f none RICHPse/include/pure_rules_swedish.se 0644 root other 40896 20070 1104961187 1 f none RICHPse/include/pwd.se 0644 root other 910 9835 1104961187 1 f none RICHPse/include/rpc_clnt.se 0644 root other 914 9039 1104961187 1 f none RICHPse/include/rstat_class.se 0644 root other 5225 17297 1104961187 1 f none RICHPse/include/se.se 0644 root other 2145 39494 1104961187 1 f none RICHPse/include/se_trees.se 0644 root other 5045 55523 1104961187 1 f none RICHPse/include/signal.se 0644 root other 3007 42584 1104961187 1 f none RICHPse/include/socket.se 0644 root other 6471 35280 1104961187 1 f none RICHPse/include/stat.se 0644 root other 5911 62022 1104961187 1 f none RICHPse/include/statvfs.se 0644 root other 1919 19035 1104961187 1 f none RICHPse/include/stdio.se 0644 root other 3947 40960 1104961187 1 f none RICHPse/include/stdlib.se 0644 root other 2812 28900 1104961187 1 f none RICHPse/include/string.se 0644 root other 1789 21138 1104961187 1 f none RICHPse/include/sys_kstat.se 0644 root other 13328 55919 1104961187 1 f none RICHPse/include/sys_swap.se 0644 root other 3470 1589 1104961187 1 f none RICHPse/include/sysdepend.se 0644 root other 863 1330 1104961187 1 f none RICHPse/include/sysinfo_class.se 0644 root other 9578 58763 1104961187 1 f none RICHPse/include/syslog.se 0644 root other 3012 39876 1104961187 1 f none RICHPse/include/systeminfo.se 0644 root other 2675 19263 1104961187 1 f none RICHPse/include/tapeinfo.se 0744 root other 6433 48734 1104961187 1 f none RICHPse/include/tcp_class.se 0644 root other 3697 43552 1104961187 1 f none RICHPse/include/tcp_rules.se 0644 root other 12907 64147 1104961187 1 f none RICHPse/include/tcp_rules_dutch.se 0644 root other 14679 7241 1104961187 1 f none RICHPse/include/time.se 0644 root other 2280 55535 1104961187 1 f none RICHPse/include/tiuser.se 0644 root other 8174 33826 1104961187 1 f none RICHPse/include/types.se 0644 root other 996 14668 1104961187 1 f none RICHPse/include/uio.se 0644 root other 944 13815 1104961187 1 f none RICHPse/include/unistd.se 0644 root other 7903 52753 1104961187 1 f none RICHPse/include/uptime_class.se 0644 root other 1109 20086 1104961187 1 f none RICHPse/include/utmp.se 0644 root other 3069 29043 1104961187 1 f none RICHPse/include/utsname.se 0644 root other 983 11219 1104961187 1 f none RICHPse/include/vfs.se 0644 root other 3228 60742 1104961187 1 f none RICHPse/include/vmstat_class.se 0644 root other 3628 24279 1104961187 1 f none RICHPse/include/wait.se 0644 root other 1797 6848 1104961187 1 f none RICHPse/include/workload_class.se 0644 root other 5121 6595 1104961187 1 d none RICHPse/lib 0755 root other 1 d none RICHPse/lib/app-defaults 0755 root other 1 f none RICHPse/lib/app-defaults/Segui 0644 root other 69 5867 1104961187 1 d none RICHPse/lib/i386 0755 root other 1 s none RICHPse/lib/i386/libgcc_s.so=libgcc_s.so.1 1 f none RICHPse/lib/i386/libgcc_s.so.1 0755 root other 155688 58944 1102958111 1 f none RICHPse/lib/i386/libsegui.so 0755 root other 87236 61465 1104961186 1 f none RICHPse/lib/i386/libsenet.so 0755 root other 22716 64686 1104961186 1 s none RICHPse/lib/i386/libstdc++.so=libstdc++.so.6.0.3 1 s none RICHPse/lib/i386/libstdc++.so.6=libstdc++.so.6.0.3 1 f none RICHPse/lib/i386/libstdc++.so.6.0.3 0755 root other 5282132 52947 1102958132 1 d none RICHPse/lib/sparcv9 0755 root other 1 f none RICHPse/lib/sparcv9/libgcc_s.so.1 0755 root other 206432 11899 1102911643 1 f none RICHPse/lib/sparcv9/libsegui.so 0755 root other 108704 57972 1104961186 1 f none RICHPse/lib/sparcv9/libsenet.so 0755 root other 28544 42587 1104961186 1 s none RICHPse/lib/sparcv9/libstdc++.so=libstdc++.so.6.0.3 1 s none RICHPse/lib/sparcv9/libstdc++.so.6=libstdc++.so.6.0.3 1 f none RICHPse/lib/sparcv9/libstdc++.so.6.0.3 0755 root other 6270944 31153 1102911663 1 d none RICHPse/man 0755 root other 1 d none RICHPse/man/man1m 0755 root other 1 f none RICHPse/man/man1m/se.1m 0644 root other 2406 8459 1104961187 1 d none RICHPse/orcallator 0755 root other 1 f none RICHPse/orcallator/README 0644 root other 496 44704 1104961187 1 f none RICHPse/orcallator/orcallator.se 0644 root other 80768 62419 1104961187 1 d none RICHPse/perfmon 0755 root other 1 f none RICHPse/perfmon/p_vmstat_class.se 0644 root other 11885 14777 1104961187 1 f none RICHPse/perfmon/perfmon 0555 root other 147 11032 1104961187 1 f none RICHPse/perfmon/perfmon.se 0644 root other 132810 65319 1104961187 1 f none RICHPse/perfmon/vmstat_class.se 0644 root other 6573 30396 1104961187 1 d none RICHPse/src 0755 root other 1 f none RICHPse/src/Makefile 0644 root other 2264 32459 1104961186 1 f none RICHPse/src/avl.c 0644 root other 26096 46000 1104961186 1 f none RICHPse/src/avl.h 0644 root other 2543 58259 1104961186 1 d none RICHPse/src/bin 0755 root other 1 f none RICHPse/src/debug.c 0644 root other 19046 2773 1104961186 1 f none RICHPse/src/extern.c 0644 root other 6638 38771 1104961186 1 f none RICHPse/src/funcs.c 0644 root other 5988 60032 1104961186 1 f none RICHPse/src/generate.c 0644 root other 29457 30322 1104961186 1 f none RICHPse/src/isa 0755 root other 110 8735 1104961186 1 f none RICHPse/src/kstat.c 0644 root other 50136 8024 1104961186 1 f none RICHPse/src/kvm.c 0644 root other 16552 14925 1104961186 1 f none RICHPse/src/lex.c 0644 root other 24041 46378 1104961186 1 f none RICHPse/src/main.c 0644 root other 17267 31259 1104961186 1 f none RICHPse/src/mib.c 0644 root other 5193 6581 1104961186 1 f none RICHPse/src/ndd.c 0644 root other 4867 36564 1104961186 1 f none RICHPse/src/ndd.h 0644 root other 506 42675 1104961186 1 d none RICHPse/src/pkg 0755 root other 1 f none RICHPse/src/pkg/Makefile 0644 root other 2497 59406 1104961186 1 f none RICHPse/src/pkg/copyright 0644 root other 827 61397 1104961186 1 f none RICHPse/src/pkg/depend 0644 root other 40 3634 1104961186 1 f none RICHPse/src/pkg/lop-ia 0555 root other 138 9387 1104961186 1 f none RICHPse/src/pkg/pkginfo.proto 0644 root other 239 19881 1104961186 1 f none RICHPse/src/pkg/request 0755 root other 1384 11035 1104961186 1 f none RICHPse/src/proc.c 0644 root other 4030 60701 1104961186 1 f none RICHPse/src/run.c 0644 root other 122297 4926 1104961186 1 f none RICHPse/src/se.h 0644 root other 16246 1802 1104961186 1 f none RICHPse/src/se.y 0644 root other 166976 60994 1104961186 1 d none RICHPse/src/sex 0755 root other 1 d none RICHPse/src/sex/gui 0755 root other 1 d none RICHPse/src/sex/gui/lib 0755 root other 1 f none RICHPse/src/sex/gui/lib/BarCharP.h 0644 root other 1854 13285 1104961186 1 f none RICHPse/src/sex/gui/lib/BarChart.c 0644 root other 18872 38512 1104961186 1 f none RICHPse/src/sex/gui/lib/BarChart.h 0644 root other 3147 23930 1104961186 1 f none RICHPse/src/sex/gui/lib/Clock.c 0644 root other 25415 62292 1104961186 1 f none RICHPse/src/sex/gui/lib/Clock.h 0644 root other 2924 24367 1104961186 1 f none RICHPse/src/sex/gui/lib/ClockP.h 0644 root other 3069 49654 1104961186 1 f none RICHPse/src/sex/gui/lib/Imakefile 0644 root other 1983 13806 1104961186 1 f none RICHPse/src/sex/gui/lib/Makefile 0644 root other 16822 14899 1104961186 1 f none RICHPse/src/sex/gui/lib/PointCharP.h 0644 root other 4107 5180 1104961186 1 f none RICHPse/src/sex/gui/lib/PointChart.c 0644 root other 16904 22583 1104961186 1 f none RICHPse/src/sex/gui/lib/PointChart.h 0644 root other 4755 52598 1104961186 1 f none RICHPse/src/sex/gui/lib/Segui 0644 root other 69 5867 1104961186 1 f none RICHPse/src/sex/gui/lib/bugs.fixed 0644 root other 331 30385 1104961186 1 f none RICHPse/src/sex/gui/lib/counter.c 0644 root other 6888 40895 1104961186 1 f none RICHPse/src/sex/gui/lib/counter.d 0644 root other 0 0 1104961186 1 f none RICHPse/src/sex/gui/lib/dialogs.c 0644 root other 6648 22680 1104961186 1 f none RICHPse/src/sex/gui/lib/features.added 0644 root other 27 2622 1104961186 1 f none RICHPse/src/sex/gui/lib/gui.c 0644 root other 19150 58036 1104961186 1 f none RICHPse/src/sex/gui/lib/gui.c.backup 0644 root other 18140 46249 1104961186 1 f none RICHPse/src/sex/gui/lib/gui.h 0644 root other 5271 31993 1104961186 1 f none RICHPse/src/sex/gui/lib/gui_create.c 0644 root other 30964 48547 1104961186 1 f none RICHPse/src/sex/gui/lib/gui_update.c 0644 root other 21191 1850 1104961186 1 f none RICHPse/src/sex/gui/lib/icon.c 0644 root other 4272 4330 1104961186 1 f none RICHPse/src/sex/gui/lib/menu_bar.c 0644 root other 4217 59227 1104961186 1 f none RICHPse/src/sex/gui/lib/misc.c 0644 root other 6493 44601 1104961186 1 f none RICHPse/src/sex/gui/lib/text.c 0644 root other 3483 12344 1104961186 1 f none RICHPse/src/sex/gui/lib/transform.c 0644 root other 3161 45947 1104961186 1 f none RICHPse/src/sex/gui/lib/transform.h 0644 root other 1684 63696 1104961186 1 f none RICHPse/src/sex/gui/lib/tree.c 0644 root other 2848 21924 1104961186 1 d none RICHPse/src/sex/net 0755 root other 1 d none RICHPse/src/sex/net/lib 0755 root other 1 f none RICHPse/src/sex/net/lib/Makefile 0644 root other 1447 40937 1104961186 1 f none RICHPse/src/sex/net/lib/netcmd.c 0644 root other 11132 61876 1104961186 1 f none RICHPse/src/sex/net/lib/netcmd.h 0644 root other 1014 11016 1104961186 1 f none RICHPse/src/sex/net/lib/netio.c 0644 root other 2507 60266 1104961186 1 f none RICHPse/src/sex/net/lib/netlib.c 0644 root other 29056 13483 1104961186 1 f none RICHPse/src/sex/net/lib/netlib.h 0644 root other 1969 29304 1104961186 1 f none RICHPse/src/sex/net/lib/rstat.c 0644 root other 2229 48002 1104961186 1 f none RICHPse/src/sex/net/lib/rstat.x 0644 root other 2635 13225 1104961186 1 d none RICHPse/src/sex/net/lib/tli 0755 root other 1 f none RICHPse/src/sex/net/lib/tli/netio.c 0644 root other 2425 56492 1104961186 1 f none RICHPse/src/sex/net/lib/tli/netlib.c 0644 root other 29709 1004 1104961186 1 f none RICHPse/src/sex/net/lib/tli/netlib.h 0644 root other 2025 34199 1104961186 1 f none RICHPse/src/version 0644 root other 492 37907 1104961186 1 d none RICHPse/toptool 0755 root other 1 f none RICHPse/toptool/toptool 0555 root other 162 12435 1104961187 1 f none RICHPse/toptool/toptool.se 0644 root other 43459 39816 1104961187 1 d none RICHPse/workollator 0755 root other 1 f none RICHPse/workollator/README 0644 root other 2051 43539 1104961187 1 f none RICHPse/workollator/explode.csh 0755 root other 3110 57653 1104961187 1 f none RICHPse/workollator/pwgrab 0755 root other 48 3082 1104961187 1 i copyright 827 61397 1104955773 1 i depend 40 3634 766029300 1 i pkginfo 288 22732 1104961188 1 i request 1384 11035 1102975076 07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000b00000000TRAILER!!!07070100084d56000081a400000000000000000000000141dc5ea400000120000000880000000400000000000000000000000800000005pkginfoARCH=sparc,i386 BASEDIR=/opt ROOTDIR=/ CATEGORY=application CLASSES=none MAXINST=1000 DESC=The SymbEL Interpreter EMAIL=se-feedback@setoolkit.com HOTLINE=se-feedback@setoolkit.com NAME=The SymbEL Interpreter PKG=RICHPse VENDOR=Rich Pettit PSTAMP=05 Jan 05 VERSION=3.4 (03:59 PM 01/05/05) 07070100084d55000081a400000000000000000000000141dc5ea400005fa5000000880000000400000000000000000000000700000005pkgmap: 1 30573 1 d none RICHPse 0755 root other 1 d none RICHPse/bin 0755 root other 1 f none RICHPse/bin/pw_example.sh 0555 root other 274 22134 1104961187 1 f none RICHPse/bin/se 0755 root other 669 48136 1104961186 1 f none RICHPse/bin/se.i386 0755 root other 260768 20131 1104961186 1 f none RICHPse/bin/se.sparcv9 0755 root other 316792 30787 1104961186 1 f none RICHPse/bin/workollator_example.sh 0555 root other 1118 30326 1104961187 1 d none RICHPse/contrib 0755 root other 1 d none RICHPse/contrib/dfstats 0755 root other 1 f none RICHPse/contrib/dfstats/author 0644 root other 257 16771 1104961187 1 f none RICHPse/contrib/dfstats/df_stats.se 0644 root other 10269 24499 1104961187 1 f none RICHPse/contrib/dfstats/fs_class.se 0644 root other 1658 63198 1104961187 1 f none RICHPse/contrib/dfstats/mdf.se 0644 root other 1859 10473 1104961187 1 d none RICHPse/contrib/iops 0755 root other 1 f none RICHPse/contrib/iops/author 0644 root other 82 7501 1104961187 1 f none RICHPse/contrib/iops/iops.se 0644 root other 3657 26081 1104961187 1 d none RICHPse/contrib/kview 0755 root other 1 f none RICHPse/contrib/kview/author 0644 root other 32 2898 1104961187 1 f none RICHPse/contrib/kview/kviewx.se 0644 root other 5005 58081 1104961187 1 d none RICHPse/contrib/perfbar 0755 root other 1 f none RICHPse/contrib/perfbar/author 0644 root other 28 2510 1104961187 1 f none RICHPse/contrib/perfbar/perfbar.se 0644 root other 5859 29833 1104961187 1 d none RICHPse/contrib/psrsetstat 0755 root other 1 f none RICHPse/contrib/psrsetstat/author 0644 root other 101 7780 1104961187 1 f none RICHPse/contrib/psrsetstat/psrsetstat.se 0644 root other 4710 16019 1104961187 1 d none RICHPse/contrib/watch 0755 root other 1 f none RICHPse/contrib/watch/author 0644 root other 214 15181 1104961187 1 f none RICHPse/contrib/watch/watch.se 0644 root other 2985 13872 1104961187 1 d none RICHPse/dio 0755 root other 1 f none RICHPse/dio/dio.se 0644 root other 7942 38847 1104961187 1 f none RICHPse/dio/dio_disk.se 0644 root other 5150 46553 1104961187 1 d none RICHPse/doc 0755 root other 1 f none RICHPse/doc/CHANGES 0644 root other 16490 26641 1104961187 1 f none RICHPse/doc/EXAMPLES.DOC 0644 root other 26850 10884 1104961187 1 f none RICHPse/doc/FAQ 0644 root other 12466 30878 1104961187 1 f none RICHPse/doc/GUI.MANUAL 0644 root other 47630 62174 1104961187 1 f none RICHPse/doc/README.INSTALL 0644 root other 12075 47680 1104961187 1 f none RICHPse/doc/README.RELEASE 0644 root other 6275 53656 1104961187 1 f none RICHPse/doc/REPORTING.BUGS 0644 root other 20 1747 1104961187 1 f none RICHPse/doc/USERS.MANUAL 0644 root other 96149 21071 1104961187 1 d none RICHPse/etc 0755 root other 1 d none RICHPse/etc/init.d 0755 root other 1 f none RICHPse/etc/init.d/mon_cm 0755 root other 3381 58757 982370057 1 f none RICHPse/etc/init.d/monlog 0755 root other 2482 55343 982370102 1 f none RICHPse/etc/init.d/percol 0755 root other 4198 1226 982370117 1 f none RICHPse/etc/init.d/va_monitor 0755 root other 3358 61006 982370141 1 f none RICHPse/etc/init.d/vader 0755 root other 1375 15499 982370671 1 d none RICHPse/etc/rc0.d 0755 root other 1 s none RICHPse/etc/rc0.d/K34vader=../init.d/vader 1 s none RICHPse/etc/rc0.d/K60mon_cm=../init.d/mon_cm 1 s none RICHPse/etc/rc0.d/K60monlog=../init.d/monlog 1 s none RICHPse/etc/rc0.d/K60percol=../init.d/percol 1 s none RICHPse/etc/rc0.d/K60va_monitor=../init.d/va_monitor 1 d none RICHPse/etc/rc2.d 0755 root other 1 s none RICHPse/etc/rc2.d/S89vader=../init.d/vader 1 s none RICHPse/etc/rc2.d/S90mon_cm=../init.d/mon_cm 1 s none RICHPse/etc/rc2.d/S90monlog=../init.d/monlog 1 s none RICHPse/etc/rc2.d/S90va_monitor=../init.d/va_monitor 1 d none RICHPse/etc/rc3.d 0755 root other 1 s none RICHPse/etc/rc3.d/S99percol=../init.d/percol 1 f none RICHPse/etc/se-mode.el 0644 root other 1935 35492 877020055 1 f none RICHPse/etc/se-mode.elc 0644 root other 1712 17438 877028564 1 f none RICHPse/etc/se_defines 0644 root other 739 50092 993500117 1 d none RICHPse/examples 0755 root other 1 f none RICHPse/examples/aw.se 0644 root other 52480 38228 1104961187 1 f none RICHPse/examples/bigbrother.se 0644 root other 6781 29646 1104961187 1 f none RICHPse/examples/collisions.se 0644 root other 351 27747 1104961187 1 f none RICHPse/examples/cpg.se 0644 root other 11757 31000 1104961187 1 f none RICHPse/examples/cpu_meter.se 0644 root other 7325 51070 1104961187 1 f none RICHPse/examples/cpuchk.se 0644 root other 2378 45309 1104961187 1 f none RICHPse/examples/cpus.se 0644 root other 322 24972 1104961187 1 f none RICHPse/examples/cpustat.se 0644 root other 1765 1889 1104961187 1 f none RICHPse/examples/ctlr.se 0644 root other 1179 25216 1104961187 1 f none RICHPse/examples/darth.se 0644 root other 14917 9512 1104961187 1 d none RICHPse/examples/data 0755 root other 1 f none RICHPse/examples/data/adrian 0644 root other 290 19934 1104961187 1 f none RICHPse/examples/data/adrian.bio 0644 root other 3732 2739 1104961187 1 f none RICHPse/examples/data/blank 0644 root other 1895 42778 1104961187 1 f none RICHPse/examples/data/callog.root 0644 root other 86 6066 1104961187 1 f none RICHPse/examples/data/cpu 0644 root other 1880 46781 1104961187 1 f none RICHPse/examples/data/cpu_meter_icon 0644 root other 1913 49486 1104961187 1 f none RICHPse/examples/data/disk 0644 root other 1883 45576 1104961187 1 f none RICHPse/examples/data/dnlc 0644 root other 1883 45918 1104961187 1 f none RICHPse/examples/data/drip.au 0644 root other 759 32990 1104961187 1 f none RICHPse/examples/data/inode 0644 root other 1886 46266 1104961187 1 f none RICHPse/examples/data/kmem 0644 root other 1883 45477 1104961187 1 f none RICHPse/examples/data/mutex 0644 root other 1886 45641 1104961187 1 f none RICHPse/examples/data/network 0644 root other 1892 47030 1104961187 1 f none RICHPse/examples/data/nfs_client 0644 root other 1901 48882 1104961187 1 f none RICHPse/examples/data/ram 0644 root other 1880 44742 1104961187 1 f none RICHPse/examples/data/richp 0644 root other 274 18796 1104961187 1 f none RICHPse/examples/data/richp.bio 0644 root other 3803 3640 1104961187 1 f none RICHPse/examples/data/swap 0644 root other 1883 46867 1104961187 1 f none RICHPse/examples/data/tpry.desc 0644 root other 4200 62118 1104961187 1 f none RICHPse/examples/data/xit_icon 0644 root other 1895 45456 1104961187 1 f none RICHPse/examples/data/xload_icon 0644 root other 933 64575 1104961187 1 f none RICHPse/examples/data/zoom 0644 root other 1883 44519 1104961187 1 f none RICHPse/examples/disks.se 0644 root other 2294 42132 1104961187 1 f none RICHPse/examples/dumpkstats.se 0644 root other 7274 43037 1104961187 1 f none RICHPse/examples/hostid.se 0644 root other 534 42647 1104961187 1 f none RICHPse/examples/infotool.se 0644 root other 50322 64969 1104961187 1 f none RICHPse/examples/iomonitor.se 0644 root other 2625 4862 1104961187 1 f none RICHPse/examples/iost.se 0644 root other 1921 15423 1104961187 1 f none RICHPse/examples/iostat.se 0644 root other 1676 65444 1104961187 1 f none RICHPse/examples/kvmname.se 0644 root other 258 21900 1104961187 1 f none RICHPse/examples/limits.se 0644 root other 10340 23202 1104961187 1 f none RICHPse/examples/live_test.se 0644 root other 5625 2794 1104961187 1 f none RICHPse/examples/mini_cpu.se 0644 root other 2646 1868 1104961187 1 f none RICHPse/examples/mon_cm.se 0644 root other 6258 34989 1104961187 1 f none RICHPse/examples/monlog.se 0644 root other 8674 14363 1104961187 1 f none RICHPse/examples/mpvmstat.se 0644 root other 1572 53364 1104961187 1 f none RICHPse/examples/mrvmstat.se 0644 root other 2691 18240 1104961187 1 f none RICHPse/examples/msacct.se 0644 root other 3114 36424 1104961187 1 f none RICHPse/examples/msacct_off.se 0644 root other 584 48240 1104961187 1 f none RICHPse/examples/multi_meter.se 0644 root other 8579 32155 1104961187 1 f none RICHPse/examples/net.se 0644 root other 606 46215 1104961187 1 d none RICHPse/examples/net_example 0755 root other 1 f none RICHPse/examples/net_example/client.se 0644 root other 2140 35451 1104961187 1 f none RICHPse/examples/net_example/sample.se 0644 root other 441 31079 1104961187 1 f none RICHPse/examples/net_example/server.se 0644 root other 2362 59311 1104961187 1 f none RICHPse/examples/netmonitor.se 0644 root other 2527 64281 1104961187 1 f none RICHPse/examples/netstat.se 0644 root other 2686 7697 1104961187 1 f none RICHPse/examples/netstatx.se 0644 root other 2066 28252 1104961187 1 f none RICHPse/examples/nfsmonitor.se 0644 root other 5143 43666 1104961187 1 f none RICHPse/examples/nfsstat.se 0644 root other 3729 11480 1104961187 1 f none RICHPse/examples/nproc.se 0644 root other 305 23617 1104961187 1 f none RICHPse/examples/nx.se 0644 root other 1875 9021 1104961187 1 f none RICHPse/examples/pea.se 0644 root other 2680 11240 1104961187 1 f none RICHPse/examples/peac.se 0644 root other 2901 30132 1104961187 1 f none RICHPse/examples/peer.se 0644 root other 2859 26441 1104961187 1 f none RICHPse/examples/percollator.se 0644 root other 19503 51589 1104961187 1 f none RICHPse/examples/perfmeter.se 0644 root other 2300 34530 1104961187 1 f none RICHPse/examples/pry.se 0644 root other 2921 34278 1104961187 1 f none RICHPse/examples/ps-ax.se 0644 root other 547 40337 1104961187 1 f none RICHPse/examples/ps-p.se 0644 root other 643 48805 1104961187 1 f none RICHPse/examples/pure_test.se 0644 root other 8440 50505 1104961187 1 f none RICHPse/examples/pw.se 0644 root other 3395 59925 1104961187 1 f none RICHPse/examples/pw_log.se 0644 root other 4576 3498 1104961187 1 f none RICHPse/examples/pwatch.se 0644 root other 1554 52063 1104961187 1 f none RICHPse/examples/rvmstat.se 0644 root other 2020 27658 1104961187 1 f none RICHPse/examples/siostat.se 0644 root other 1852 14291 1104961187 1 f none RICHPse/examples/swap.se 0644 root other 2255 56230 1104961187 1 f none RICHPse/examples/swapctl.se 0644 root other 449 34283 1104961187 1 f none RICHPse/examples/syslog.se 0644 root other 228 17568 1104961187 1 f none RICHPse/examples/tcp_monitor.se 0644 root other 28355 15102 1104961187 1 f none RICHPse/examples/tpry.se 0644 root other 5390 14560 1104961187 1 f none RICHPse/examples/uname.se 0644 root other 2124 15853 1104961187 1 f none RICHPse/examples/uptime.se 0644 root other 348 26934 1104961187 1 f none RICHPse/examples/util.se 0644 root other 466 35333 1104961187 1 f none RICHPse/examples/vader.se 0644 root other 27245 48440 1104961187 1 f none RICHPse/examples/virtual_adrian.se 0644 root other 25822 14818 1104961187 1 f none RICHPse/examples/virtual_adrian_lite.se 0644 root other 20298 34917 1104961187 1 f none RICHPse/examples/vmmonitor.se 0644 root other 2443 58063 1104961187 1 f none RICHPse/examples/vmstat.se 0644 root other 1787 2797 1104961187 1 f none RICHPse/examples/webtune.se 0644 root other 3795 16213 1104961187 1 f none RICHPse/examples/workollator.se 0644 root other 4668 11697 1104961187 1 f none RICHPse/examples/xio.se 0644 root other 2050 24145 1104961187 1 f none RICHPse/examples/xiostat.se 0644 root other 1400 40949 1104961187 1 f none RICHPse/examples/xit.se 0644 root other 6660 47867 1104961187 1 f none RICHPse/examples/xload.se 0644 root other 1821 61922 1104961187 1 f none RICHPse/examples/zoom.se 0644 root other 52936 30745 1104961187 1 d none RICHPse/include 0755 root other 1 f none RICHPse/include/app_wrap_class.se 0644 root other 17023 45514 1104961187 1 f none RICHPse/include/condvar.se 0644 root other 604 49600 1104961187 1 f none RICHPse/include/ctlr_class.se 0644 root other 4461 15340 1104961187 1 f none RICHPse/include/ctype.se 0644 root other 1004 15721 1104961187 1 f none RICHPse/include/devinfo.se 0644 root other 2148 40022 1104961187 1 f none RICHPse/include/dirent.se 0644 root other 1354 39831 1104961187 1 f none RICHPse/include/diskinfo.se 0644 root other 10742 47792 1104961187 1 f none RICHPse/include/dlfcn.se 0644 root other 1496 52191 1104961187 1 f none RICHPse/include/errno.se 0644 root other 6702 47312 1104961187 1 f none RICHPse/include/fcntl.se 0644 root other 3066 38600 1104961187 1 f none RICHPse/include/gui_defines.h 0644 root other 3489 61775 1104961187 1 f none RICHPse/include/gui_lib.se 0644 root other 5530 21709 1104961187 1 f none RICHPse/include/kstat.se 0644 root other 72774 44781 1104961187 1 f none RICHPse/include/live_rules.se 0644 root other 30651 12828 1104961187 1 f none RICHPse/include/logfile.se 0644 root other 2869 29004 1104961187 1 f none RICHPse/include/math.se 0644 root other 3469 61463 1104961187 1 f none RICHPse/include/mib.se 0644 root other 10019 24218 1104961187 1 f none RICHPse/include/mnt_class.se 0644 root other 6133 29099 1104961187 1 f none RICHPse/include/multi_rstat_class.se 0644 root other 803 62381 1104961187 1 f none RICHPse/include/mutex.se 0644 root other 603 49724 1104961187 1 f none RICHPse/include/ndd.se 0644 root other 19044 40341 1104961187 1 f none RICHPse/include/net_lib.se 0644 root other 2916 30553 1104961187 1 f none RICHPse/include/netdb.se 0644 root other 3925 54528 1104961187 1 f none RICHPse/include/netif.se 0644 root other 27424 40974 1104961187 1 f none RICHPse/include/nfs_clnt.se 0644 root other 2492 49518 1104961187 1 f none RICHPse/include/p_iostat_class.se 0644 root other 9225 31632 1104961187 1 f none RICHPse/include/p_netstat_class.se 0644 root other 7147 59524 1104961187 1 f none RICHPse/include/p_vmstat_class.se 0644 root other 9146 16754 1104961187 1 f none RICHPse/include/partinfo.se 0644 root other 2472 56487 1104961187 1 f none RICHPse/include/poll.se 0644 root other 1520 53085 1104961187 1 f none RICHPse/include/proc.se 0644 root other 22793 63085 1104961187 1 f none RICHPse/include/process_class.se 0644 root other 36997 43493 1104961187 1 f none RICHPse/include/process_rules.se 0644 root other 8979 52719 1104961187 1 f none RICHPse/include/processor.se 0644 root other 2288 35793 1104961187 1 f none RICHPse/include/pure_rules.se 0644 root other 37167 44655 1104961187 1 f none RICHPse/include/pure_rules_dutch.se 0644 root other 41068 18856 1104961187 1 f none RICHPse/include/pure_rules_swedish.se 0644 root other 40896 20070 1104961187 1 f none RICHPse/include/pwd.se 0644 root other 910 9835 1104961187 1 f none RICHPse/include/rpc_clnt.se 0644 root other 914 9039 1104961187 1 f none RICHPse/include/rstat_class.se 0644 root other 5225 17297 1104961187 1 f none RICHPse/include/se.se 0644 root other 2145 39494 1104961187 1 f none RICHPse/include/se_trees.se 0644 root other 5045 55523 1104961187 1 f none RICHPse/include/signal.se 0644 root other 3007 42584 1104961187 1 f none RICHPse/include/socket.se 0644 root other 6471 35280 1104961187 1 f none RICHPse/include/stat.se 0644 root other 5911 62022 1104961187 1 f none RICHPse/include/statvfs.se 0644 root other 1919 19035 1104961187 1 f none RICHPse/include/stdio.se 0644 root other 3947 40960 1104961187 1 f none RICHPse/include/stdlib.se 0644 root other 2812 28900 1104961187 1 f none RICHPse/include/string.se 0644 root other 1789 21138 1104961187 1 f none RICHPse/include/sys_kstat.se 0644 root other 13328 55919 1104961187 1 f none RICHPse/include/sys_swap.se 0644 root other 3470 1589 1104961187 1 f none RICHPse/include/sysdepend.se 0644 root other 863 1330 1104961187 1 f none RICHPse/include/sysinfo_class.se 0644 root other 9578 58763 1104961187 1 f none RICHPse/include/syslog.se 0644 root other 3012 39876 1104961187 1 f none RICHPse/include/systeminfo.se 0644 root other 2675 19263 1104961187 1 f none RICHPse/include/tapeinfo.se 0744 root other 6433 48734 1104961187 1 f none RICHPse/include/tcp_class.se 0644 root other 3697 43552 1104961187 1 f none RICHPse/include/tcp_rules.se 0644 root other 12907 64147 1104961187 1 f none RICHPse/include/tcp_rules_dutch.se 0644 root other 14679 7241 1104961187 1 f none RICHPse/include/time.se 0644 root other 2280 55535 1104961187 1 f none RICHPse/include/tiuser.se 0644 root other 8174 33826 1104961187 1 f none RICHPse/include/types.se 0644 root other 996 14668 1104961187 1 f none RICHPse/include/uio.se 0644 root other 944 13815 1104961187 1 f none RICHPse/include/unistd.se 0644 root other 7903 52753 1104961187 1 f none RICHPse/include/uptime_class.se 0644 root other 1109 20086 1104961187 1 f none RICHPse/include/utmp.se 0644 root other 3069 29043 1104961187 1 f none RICHPse/include/utsname.se 0644 root other 983 11219 1104961187 1 f none RICHPse/include/vfs.se 0644 root other 3228 60742 1104961187 1 f none RICHPse/include/vmstat_class.se 0644 root other 3628 24279 1104961187 1 f none RICHPse/include/wait.se 0644 root other 1797 6848 1104961187 1 f none RICHPse/include/workload_class.se 0644 root other 5121 6595 1104961187 1 d none RICHPse/lib 0755 root other 1 d none RICHPse/lib/app-defaults 0755 root other 1 f none RICHPse/lib/app-defaults/Segui 0644 root other 69 5867 1104961187 1 d none RICHPse/lib/i386 0755 root other 1 s none RICHPse/lib/i386/libgcc_s.so=libgcc_s.so.1 1 f none RICHPse/lib/i386/libgcc_s.so.1 0755 root other 155688 58944 1102958111 1 f none RICHPse/lib/i386/libsegui.so 0755 root other 87236 61465 1104961186 1 f none RICHPse/lib/i386/libsenet.so 0755 root other 22716 64686 1104961186 1 s none RICHPse/lib/i386/libstdc++.so=libstdc++.so.6.0.3 1 s none RICHPse/lib/i386/libstdc++.so.6=libstdc++.so.6.0.3 1 f none RICHPse/lib/i386/libstdc++.so.6.0.3 0755 root other 5282132 52947 1102958132 1 d none RICHPse/lib/sparcv9 0755 root other 1 f none RICHPse/lib/sparcv9/libgcc_s.so.1 0755 root other 206432 11899 1102911643 1 f none RICHPse/lib/sparcv9/libsegui.so 0755 root other 108704 57972 1104961186 1 f none RICHPse/lib/sparcv9/libsenet.so 0755 root other 28544 42587 1104961186 1 s none RICHPse/lib/sparcv9/libstdc++.so=libstdc++.so.6.0.3 1 s none RICHPse/lib/sparcv9/libstdc++.so.6=libstdc++.so.6.0.3 1 f none RICHPse/lib/sparcv9/libstdc++.so.6.0.3 0755 root other 6270944 31153 1102911663 1 d none RICHPse/man 0755 root other 1 d none RICHPse/man/man1m 0755 root other 1 f none RICHPse/man/man1m/se.1m 0644 root other 2406 8459 1104961187 1 d none RICHPse/orcallator 0755 root other 1 f none RICHPse/orcallator/README 0644 root other 496 44704 1104961187 1 f none RICHPse/orcallator/orcallator.se 0644 root other 80768 62419 1104961187 1 d none RICHPse/perfmon 0755 root other 1 f none RICHPse/perfmon/p_vmstat_class.se 0644 root other 11885 14777 1104961187 1 f none RICHPse/perfmon/perfmon 0555 root other 147 11032 1104961187 1 f none RICHPse/perfmon/perfmon.se 0644 root other 132810 65319 1104961187 1 f none RICHPse/perfmon/vmstat_class.se 0644 root other 6573 30396 1104961187 1 d none RICHPse/src 0755 root other 1 f none RICHPse/src/Makefile 0644 root other 2264 32459 1104961186 1 f none RICHPse/src/avl.c 0644 root other 26096 46000 1104961186 1 f none RICHPse/src/avl.h 0644 root other 2543 58259 1104961186 1 d none RICHPse/src/bin 0755 root other 1 f none RICHPse/src/debug.c 0644 root other 19046 2773 1104961186 1 f none RICHPse/src/extern.c 0644 root other 6638 38771 1104961186 1 f none RICHPse/src/funcs.c 0644 root other 5988 60032 1104961186 1 f none RICHPse/src/generate.c 0644 root other 29457 30322 1104961186 1 f none RICHPse/src/isa 0755 root other 110 8735 1104961186 1 f none RICHPse/src/kstat.c 0644 root other 50136 8024 1104961186 1 f none RICHPse/src/kvm.c 0644 root other 16552 14925 1104961186 1 f none RICHPse/src/lex.c 0644 root other 24041 46378 1104961186 1 f none RICHPse/src/main.c 0644 root other 17267 31259 1104961186 1 f none RICHPse/src/mib.c 0644 root other 5193 6581 1104961186 1 f none RICHPse/src/ndd.c 0644 root other 4867 36564 1104961186 1 f none RICHPse/src/ndd.h 0644 root other 506 42675 1104961186 1 d none RICHPse/src/pkg 0755 root other 1 f none RICHPse/src/pkg/Makefile 0644 root other 2497 59406 1104961186 1 f none RICHPse/src/pkg/copyright 0644 root other 827 61397 1104961186 1 f none RICHPse/src/pkg/depend 0644 root other 40 3634 1104961186 1 f none RICHPse/src/pkg/lop-ia 0555 root other 138 9387 1104961186 1 f none RICHPse/src/pkg/pkginfo.proto 0644 root other 239 19881 1104961186 1 f none RICHPse/src/pkg/request 0755 root other 1384 11035 1104961186 1 f none RICHPse/src/proc.c 0644 root other 4030 60701 1104961186 1 f none RICHPse/src/run.c 0644 root other 122297 4926 1104961186 1 f none RICHPse/src/se.h 0644 root other 16246 1802 1104961186 1 f none RICHPse/src/se.y 0644 root other 166976 60994 1104961186 1 d none RICHPse/src/sex 0755 root other 1 d none RICHPse/src/sex/gui 0755 root other 1 d none RICHPse/src/sex/gui/lib 0755 root other 1 f none RICHPse/src/sex/gui/lib/BarCharP.h 0644 root other 1854 13285 1104961186 1 f none RICHPse/src/sex/gui/lib/BarChart.c 0644 root other 18872 38512 1104961186 1 f none RICHPse/src/sex/gui/lib/BarChart.h 0644 root other 3147 23930 1104961186 1 f none RICHPse/src/sex/gui/lib/Clock.c 0644 root other 25415 62292 1104961186 1 f none RICHPse/src/sex/gui/lib/Clock.h 0644 root other 2924 24367 1104961186 1 f none RICHPse/src/sex/gui/lib/ClockP.h 0644 root other 3069 49654 1104961186 1 f none RICHPse/src/sex/gui/lib/Imakefile 0644 root other 1983 13806 1104961186 1 f none RICHPse/src/sex/gui/lib/Makefile 0644 root other 16822 14899 1104961186 1 f none RICHPse/src/sex/gui/lib/PointCharP.h 0644 root other 4107 5180 1104961186 1 f none RICHPse/src/sex/gui/lib/PointChart.c 0644 root other 16904 22583 1104961186 1 f none RICHPse/src/sex/gui/lib/PointChart.h 0644 root other 4755 52598 1104961186 1 f none RICHPse/src/sex/gui/lib/Segui 0644 root other 69 5867 1104961186 1 f none RICHPse/src/sex/gui/lib/bugs.fixed 0644 root other 331 30385 1104961186 1 f none RICHPse/src/sex/gui/lib/counter.c 0644 root other 6888 40895 1104961186 1 f none RICHPse/src/sex/gui/lib/counter.d 0644 root other 0 0 1104961186 1 f none RICHPse/src/sex/gui/lib/dialogs.c 0644 root other 6648 22680 1104961186 1 f none RICHPse/src/sex/gui/lib/features.added 0644 root other 27 2622 1104961186 1 f none RICHPse/src/sex/gui/lib/gui.c 0644 root other 19150 58036 1104961186 1 f none RICHPse/src/sex/gui/lib/gui.c.backup 0644 root other 18140 46249 1104961186 1 f none RICHPse/src/sex/gui/lib/gui.h 0644 root other 5271 31993 1104961186 1 f none RICHPse/src/sex/gui/lib/gui_create.c 0644 root other 30964 48547 1104961186 1 f none RICHPse/src/sex/gui/lib/gui_update.c 0644 root other 21191 1850 1104961186 1 f none RICHPse/src/sex/gui/lib/icon.c 0644 root other 4272 4330 1104961186 1 f none RICHPse/src/sex/gui/lib/menu_bar.c 0644 root other 4217 59227 1104961186 1 f none RICHPse/src/sex/gui/lib/misc.c 0644 root other 6493 44601 1104961186 1 f none RICHPse/src/sex/gui/lib/text.c 0644 root other 3483 12344 1104961186 1 f none RICHPse/src/sex/gui/lib/transform.c 0644 root other 3161 45947 1104961186 1 f none RICHPse/src/sex/gui/lib/transform.h 0644 root other 1684 63696 1104961186 1 f none RICHPse/src/sex/gui/lib/tree.c 0644 root other 2848 21924 1104961186 1 d none RICHPse/src/sex/net 0755 root other 1 d none RICHPse/src/sex/net/lib 0755 root other 1 f none RICHPse/src/sex/net/lib/Makefile 0644 root other 1447 40937 1104961186 1 f none RICHPse/src/sex/net/lib/netcmd.c 0644 root other 11132 61876 1104961186 1 f none RICHPse/src/sex/net/lib/netcmd.h 0644 root other 1014 11016 1104961186 1 f none RICHPse/src/sex/net/lib/netio.c 0644 root other 2507 60266 1104961186 1 f none RICHPse/src/sex/net/lib/netlib.c 0644 root other 29056 13483 1104961186 1 f none RICHPse/src/sex/net/lib/netlib.h 0644 root other 1969 29304 1104961186 1 f none RICHPse/src/sex/net/lib/rstat.c 0644 root other 2229 48002 1104961186 1 f none RICHPse/src/sex/net/lib/rstat.x 0644 root other 2635 13225 1104961186 1 d none RICHPse/src/sex/net/lib/tli 0755 root other 1 f none RICHPse/src/sex/net/lib/tli/netio.c 0644 root other 2425 56492 1104961186 1 f none RICHPse/src/sex/net/lib/tli/netlib.c 0644 root other 29709 1004 1104961186 1 f none RICHPse/src/sex/net/lib/tli/netlib.h 0644 root other 2025 34199 1104961186 1 f none RICHPse/src/version 0644 root other 492 37907 1104961186 1 d none RICHPse/toptool 0755 root other 1 f none RICHPse/toptool/toptool 0555 root other 162 12435 1104961187 1 f none RICHPse/toptool/toptool.se 0644 root other 43459 39816 1104961187 1 d none RICHPse/workollator 0755 root other 1 f none RICHPse/workollator/README 0644 root other 2051 43539 1104961187 1 f none RICHPse/workollator/explode.csh 0755 root other 3110 57653 1104961187 1 f none RICHPse/workollator/pwgrab 0755 root other 48 3082 1104961187 1 i copyright 827 61397 1104955773 1 i depend 40 3634 766029300 1 i pkginfo 288 22732 1104961188 1 i request 1384 11035 1102975076 0707010047c70a000041ed00000000000000000000000241dc5ea50000000000000088000000040000010a000000010000000800000005install0707010047c70f000081a400000000000000000000000141dc497d0000033b000000880000000400000000000000000000001200000005install/copyright============================================================================ Copyright (c) 1993-2003 by Richard Pettit. All rights reserved. Some of this work was derived from include files containing the following copyrights. Copyright (c) 1986-1994 by Sun Microsystems, Inc. Copyright (c) 1983-1989 by AT&T Copyright (c) 1980-1993 by The Regents of the University of California. Other portions contain copyrights by Sun Microsystems, Inc. which were added by Adrian Cockcroft, who wrote that piece of code. The work as a whole represents unique intellectual property and is copyright by Richard Pettit as shown above. ============================================================================ 0707010047c710000081a40000000000000000000000012da8adf400000028000000880000000400000000000000000000000f00000005install/dependP SUNWsprot SPARCompilers Bundled tools 0707010047c711000081a400000000000000000000000141be106400000568000000880000000400000000000000000000001000000005install/request#! /bin/sh PATH=/usr/bin export PATH REL=`/bin/uname -r` ARCH=`/bin/uname -p` case "$ARCH" in "i386") case "$REL" in "5.8" | "5.9" | "5.10") ;; *) echo SunOS $REL '(x86)' is not supported by the SE Toolkit exit 1 ;; esac ;; "sparc") case "$REL" in "5.8" | "5.9" | "5.10") ;; "5.7") cat << END_OF_7 ********************************************************************** ********************************************************************** ** ** NOTE: Version 3.4 of RICHPse has been tested on SunOS 5.8, 5.9 and 5.10. ** ** SunOS 5.7 has not been tested and is not officially supported. ** ********************************************************************** ********************************************************************** END_OF_7 ;; *) echo SunOS $REL is not supported by the SE Toolkit exit 1 ;; esac ;; esac cat << END_OF_NOTE ////////////////////////////////////////////////////////////////////////// //// //// //// MAKE SURE YOU READ THE INSTALLATION AND RELEASE NOTES //// //// IN THE DOC DIRECTORY BEFORE USING THE SE TOOLKIT. //// //// //// ////////////////////////////////////////////////////////////////////////// END_OF_NOTE exit 0 070701000a2854000041ed00000000000000000000000341dc5ea40000000000000088000000040000010a000000010000000600000005reloc070701000ad751000041ed00000000000000000000001041dc5ea50000000000000088000000040000010a000000010000000e00000005reloc/RICHPse07070100117b01000041ed00000000000000000000000241dc5ea40000000000000088000000040000010a000000010000001200000005reloc/RICHPse/bin07070100117b02000081ed00000000000000010000000141dc5ea300000112000000880000000400000000000000000000002000000005reloc/RICHPse/bin/pw_example.sh#!/bin/csh setenv PW_CMD_0 ns-httpd setenv PW_CMD_1 'se.sparc' setenv PW_CMD_2 'dtmail' setenv PW_CMD_3 'dt' setenv PW_CMD_4 'roam' setenv PW_CMD_5 'netscape' setenv PW_CMD_6 'X' setenv PW_USER_7 'adrianc' setenv PW_USER_8 'root' setenv PW_COUNT 10 exec se -DWIDE pw.se 60 07070100117b03000081ed00000000000000010000000141dc5ea20000029d000000880000000400000000000000000000001500000005reloc/RICHPse/bin/se#! /bin/sh case `/bin/isalist` in sparc*) MACH=sparcv9;; pentium*) MACH=i386;; *) MACH='what?';; esac TOP=`/bin/dirname $0` if [ "$TOP" = "." ]; then TOP=`pwd` fi TOP=`/bin/dirname $TOP` SE="$TOP"/bin/se.$MACH if [ -z "$SEPATH" ]; then SEPATH="$TOP"/examples:. else SEPATH="$SEPATH":"$TOP"/examples:. fi if [ -z "$SEINCLUDE" ]; then SEINCLUDE="$TOP"/include else SEINCLUDE="$SEINCLUDE":"$TOP"/include fi LD_LIBRARY_PATH="$TOP"/lib/"$MACH" export SEPATH SEINCLUDE LD_LIBRARY_PATH if [ -f $SE ]; then for i do argv="$argv '"$i"'" done eval exec $SE $argv exit $? else echo "$0": Unsupported platform: $MACH SunOS $REL exit 1 fi exit 0 07070100117b04000081ed00000000000000010000000141dc5ea20003faa0000000880000000400000000000000000000001a00000005reloc/RICHPse/bin/se.i386ELF0444 (44 x  /usr/lib/ld.so.1 !$%&'()*+-.012578:;=>?@ABDEFIJKNPQSTUWYZ[^`bcfghikmopqrstvxz|}     "#,/3469<CGHLMORVX\]_adejlnuwy{~  , 24 3 "6 *$.70 !?+G ]x$ f$3k }0"0 -, 4--+d3l"  31` 42,D. $00  ! 2p6> ?eK XE !]d,d2j# 1f* $/3@Y T2H 3I @1t.lI 0d.-  -./4,64.Bt2E2H40O0Vj2 a${ i2o4 11f1 Ou ( -,@c  T1r/ Tu 6 D  ,&.1..74:2A R/XDfK o` |T/pI 60 T0.G 3./( /\  | ] -T 61<p< K/RPaa ^-e[I q0{# 8%l /-/0* T  D-WE c 4  H t H" -2"M 041<c  BT3L\  ^` kD+"-td1yD=  O |I f?  X,/@ D0T.p`f 2$1. H3 t- ,  hs 0$ -J" 7332@u 3>.Et,M% UD3 _\ j`P` -v O @  D14+ 6` 06> $,D/ 4/0|  #a9 3.>L FD,M,U * ` sd0{.0/04u $| C t3T,  j _ t0,+E D3 2t/xI +E  )(a 4 ?I   !G2M  WC rD242x0}  8 (q 0  1;$2d-3hI /43/ie   t1 T 5 T+< ,D ` T-y1g 8 w d  37 t+r+ d+ 5 4" $- I  d/ NR d2 1 H4  @3   realloclog10yyerrflagscalbnatexit_fnkstat_close_environstrncmp_GLOBAL_OFFSET_TABLE_avlfirstmodfse_new_array_typesyslogse_compute_subscriptfopenvfprintf_Jv_RegisterClassesfputskstat_openstrcmprintse_run_blocky0asin__moddi3y1mallockvm_readputmsgbsearch__ctypeLex_integerValuese_get_blockse_refresh_ndd_variable__iobdlopenldexpse_structure_assignmentacoshrun_get_procstepse_debug_statementilogbse_kvm_addresssqrtSe_type_sizesfabsgetgidyytmppopenkvm_openLex_currtokSe_kvm_var_countstrerrorkstat_chain_updateaccesskstat_writej0j1getmsgsetjmpdev_to_ttyavlnextlog1pse_kill_double_quotesexpm1erfcse_update_kvm_variablese_string_saveSe_versionpclosestrcpy_lib_versionse_lex_endcbrtse_basedirse_fatalse_parse_initSe_kvm_open_flagsabortkvm_kwritefgetsynlgammase_add_disk_nameftellse_update_ndd_variable__dso_handleatoiyyvalatolkvm_writese_update_extern_variablesignificandfseekopendir__huge_valgetcwdse_update_kstat_variablese_area_into_structse_init_kvmse_refresh_mib_variableavlcheckasinhse_clone_arraysetbufse_init_nddfilenose_init_mibvsnprintfavlinitavlprevreaddirfclosestrcatse_end_kstatse_get_keywordSe_symbol_tablesprintf_fini_edatase_init_kstatse_add_kstat_typese_resolve_expressionmemsetjnse_run_assignatan2se_lex_initremainderse_free_user_typeSe_functions_cleanupceilyylexse_new_stringyynerrsse_end_nddyy_yysmemcpyclosediryy_yyvsetegid__fixunsdfdilgamma_ratankvm_nlistavldepthSe_core_filefflush_etextrun_next_procsignalSe_flagsmainse_fix_type_xstatdlerroravllastSe_kernelse_warningse_generateLex_currentFilese_freeLex_inputyyparseatanh_PROCEDURE_LINKAGE_TABLE_se_get_structstrtokstrtol__deregister_frame_info_basescompileqsortse_struct_into_areaavlgetse_add_ndd_typekstat_readyyerrorgetenvstrrchrse_end_kvmSe_kstat_var_countseekdirkvm_closeioctlperror_startavldeletese_cleanup_tok_symsscalbdlsymLex_line_novalid_namelongjmpstrchryypspowavlfreefmodsysconfyydebugstrlenyypv_sys_siglistnse_end_mibSe_basediryystatefrexpavlinsertse_refresh_extern_variablehypotacosse_address_inherityylvalse_runse_refresh_kvm_variableSe_os_version_DYNAMICerfstrncpyerrnosetvbufnextafter_nunamerun_first_procSe_errorscopysignse_refresh_kstat_variableatexitsysinfo__register_frame_info_basesfwriteLex_doubleValueavlbrdthyycharmatherr__fpstartse_get_variable_mcount__flsbufSe_programNamestrtoulse_allocisnanfloor__dv__Se_mib_var_countSe_paging_filese_function_calllibkvm.so.1SUNW_1.1libkstat.so.1SUNW_0.7libdl.so.1libgen.so.1libm.so.1libc.so.1libelf.so.1libsocket.so.1libnsl.so.1  '= * 3  (= A J  (= A U  '= * a  '= * k '= *   0 `E ~  hI ( g                L   ;   % $ ( , 0 4 8 < @ TD 6H L  P T }X \ ` d rh l Kp xt x |  9  :  <   5 2  b U  V  e W  [ *   ^   y f w   h p  4   ?  a  $ @( , 0 t4  8 < @ D H nL P T X O\ ` d h (l p Ft Gx E| 1       -  = >  & Y    C          d +  /     X5 % % h% h% h% h% h % h(% h0% h8p% h@`% hHP% hP@% hX0% h` % hh% hp% hx% h% h% h% h%$ h%( h%, h%0 hp%4 h`%8 hP%< h@%@ h0%D h %H h%L h%P h%T h%X h%\ h%` h%d h %h h(%l h0%p h8p%t h@`%x hHP%| hP@% hX0% h` % hh% hp% hx% h% h% h% h% h% h% h% hp% h`% hP% h@% h0% h % h% h% h% h% h% h% h% h % h(% h0% h8p% h@`% hHP% hP@% hX0% h` % hh% hp% hx% h% h% h% h%$ h%( h%, h%0 hp%4 h`%8 hP%< h@%@ h0%D h %H h%L h%P h%T h%X h%\ h%` h%d h %h h(%l h0%p h8p%t h@`%x hHP%| hP@% hX0% h` % hh% hp% hx% h% h% h% h% h% h% h% hp% h`% hP% h@% h0% h % h% h% h% h% h% h% h% h % h(% h0% h8p% h@`% hHP% hP@% hX0% h` % hhjjRD+t hD+  thcET0 RU RP. PjUS[ Rt<tҋtu狃t XPƃ]ÐUS[ëP$Z˜tRjPXPOt,t P9]UVSu=` t\d t$C$tq[@u=h t-l t$S$tA[@u搐t$  $t@u 3҃[^]3҃8uP[^]ÐUUT$ $t@u 3ɋÐ3҃8uPɋÐUUT$ $Ft@u 3ɋÐ3҃8uPɋÐUWVS, $DI I I  I I  J J  K M Q  i  Y Q@U𹐔@$E @@3T$  D$L$$=9EpNFHt^$D@ @$E ؍u@@3t$ D$L$${==$DX@ U@$E 3@@T$ t$D$ $=rj=k,[^_]Ð=EH$EpEHMylxzu^,[^_]ÐExWp_$D$1$\$,[^_]Ð$|$r$t$$ ˔\$ T$D$t$$ h$ ˔D$ L$\$H|$$ $$ ˔T$ t$D$\$$ $EMEA8$UBQEE%UVS=w $^vӐVtH,t[p0uTxE[^]ÐFF@t΋@롐[P^]ú뭋F@؋F6 땐UWVSHt[Cu%[t=tv-= w3[^_]ËC3u[^_]ËCES3tËz3Ʌu rE[^_]ÐU(]؉u}t(=v?{pCPtM=w$t$^FȐًM-%=Y$tu:$ MD$T$L$ t$$  ètNuH|$t$ $ L$$ T$]u}]ÐF؋F CC tu]|$\$ SS:H,X0xECC@@띐Np,tgP0u`xEFȐVB@륐xdHUWVS}G,tm_0tkW$Xt$C$tm[@ut$ TD$D$$ $ T$k 3[^_]ËG$$lL$G W${{<p,u @ ;{t[@݋U[@΋HT$|$L$ $ t$$ $\$UH]ˉu}ҘEUuטtsuޘuUt>5 2$FD$E$D$CvuԋE3  E ]u}] u3ɉ D ]u}]ËE밐 E]u}]Sf}_ u}@ǃ@cCtp4$[D$t$M $Xtĉt$CT$\$D$ $ t$$ 널UW3V3S XEt_C I ta~ƙt+s8C,ЅE [@ut%t+v]s [^_]Ð%t+vC H @ @@tPtI UJuƙ}b)U}UUWVSډ4P4w,tȐU]E u}tLE 8t_}D$T$|$ $ \$$ u V uO]u}]ÐXtCtҘt{x밐E@   5 E= ] M u }5 E= ] M u }5 Eċ= ]ȡ M̉uЉ}ԉE؍E\$M $]u}]ÐU8]Eu}EE 8tSE侸t$\$D$ $ 芻E ]uE }]WXtstҘt{u]u}]ÐUVS`] utC;tIt$ ܛL$T$$ $ D$S u+`[^]ÐCtxuܐE@   E ] E M ] Eġ M ]ȋ EС M̋ ]ԋ Eܡ M؋ ]EEM\$4$`[^]ÐUWVS XUt*EtUS8{t[@u [^_]Ð{,tAK$9w u~3K$S8F$xM9s,ދ[@뢋S8C$$W[@닐USE ]tS$/T$J\$$ B$ /L$$ 8$ []Ð$L$#$ tR\$L$T$D$ $ 蔸$ 3D$u$ u z$3  `$ 贸D$$  T$$FUWVS,E( U@}t:=( 3]쐐C<$D$YC [L=u߅=@ k$@ U@ D$ 3ۉ|$@ T$t$m\$$@ ͷ <$t$'Ut{] [LtiK4$L$袷C u|$(CL$T$D$ $ $ D$[Lu,[^_]$T$;( 9D$ Gt$\$$ g$ L$>]$U$$L$SD$ UD$3ۿ|$T$$@ \$$@ U$L$(u4$zۋ[SD$ M@ T$e3ۉD$L$|$$@ p\$$@ е3D$5I 4$u}$ @ L$T$r辵D$u|$ D$|$$ \$$ @ n@ U3ҋWVS\Eċ@ E+p$DX؋NKNK~ { VSFC~{VSF C ~${$V(S(V,҉S,F0C0~4{4F8C8~<{؉8NHNHF C VS~{FCVS~ { F$C$V(S(V,҉S,~0{0F4C4~8{8FpI tI dYI 4 ==  `ig~> x+# @r9kh :=kk8u9xux; uX\ 3[^_]Å/ 0lI @hdhȋ`c+dG+W pI tI f>@=<@rt<@r b$\ [^_]=] =4 7`=w@r<=d;sŁ\ 33 $e$` WX3҃X…$  T$D$*   L$D$X$ 9=k_3҅IЉ =   4 =tI pI |H4 q$g|I ȋh`c+GW +ΣpI tI f6@=@rt@rI lI  E ==E w$  $$pI h5pI VpI 3@ $h艳5E   E hs=$Xhp=$$$ pI hpI VhS=pI G pI HF$˲5E   E ~tp,tH0t @=@t$$D$m$e@D= ؋  x hw@p$$'pI 3pI C ZWE3ɉt$W$T$3r5E   E ~tP,tkp0udxEȋhSI X;I thhwtN=V$ЩH먋Ft'p,QH0FxEЁu$PT$$@h  ؋5$ hp z@3x$$wpI hKpI 3ɉXB艍=pI 3҉t$|$$5E   E N$rL$ VB@^u"FPFPF.F$ FVu%FF@@Fݭ؋Fӭ F^u,F賭NA@gF臭F} s$$pI hpI VS=pI G pI HF$蚮5E   E $$jpI hpI VS=pI GpI HF$15E   E ^$$pI h=pI ShW pI A5pI FC$5E   E $$葿pI h=pI SW pI A5pI FC$W5E   E $$'pI h=pI SW pI A5pI FC$5E   E h8>$$謾pI h=pI SW pI A5pI FC$r5E   E $$BpI h pI SQ=pI G5pI FC$5E   E 5$$ؽpI h pI SQ=pI G5pI FC$螫5E   E PBr= \=B$"l$T$ R$$pI h pI SQ=pI G5pI FC$ê5E   E $D蓼h؋JHh1s $$bX$K@=  ؉sC8 3C $$pI KpI hZ QyE3T$3҉$t$_hKYuC$C$C,5E   E 5  D$4$at @z3҉S =` hsd t$S$t[@B$Q^,Vۉu$D$许u$ȝ|$蔸$$茺hpP $j@  ؉{C C $$;pI KpI 3Zu F p3ҹ3҉|$$L${_uC$(C$C,5E   E hyT$D$|$ $ f\$$ B=h t&l tt$C$*[@t$= <$t@u 3ҋ3҃8uP$$ǸpI ht xtt#@Džt@C{h: =pI h pI h3҉ ;=pI t~tm@4tZP<9Ptw0PO,tFXuދP$x;Ӌ_T$ D$\$L$$ Ki$ T$"$ןt$wNu,FxZF@F@Fgx؋F]x "=h l t$K $h[@܋^pI hlPCL$$e| t 5pI p< pI 3҃8[PS$ pI hy8pI B1pI sY1=$$ 轊pI hO5pI FpI S_7tt=wZ$ܬKtX,t9x0u2xE=$xڋSu'CvtW=d$TCvCxv ͋^tp,tZP0uSxEЋ ====txu5E   E ¾P$ T$t$D$ Pf\$$ ,5E   E i=~{$XL$5E   E /$|$ņ5E   E 5E   E NuZFuFCC@@VB@^Ft؋Ft jCX,t6H0u/xEC@@붋x{릋Vtp,tZH0uSxEЋ ====txu5E   E 顼P$ L$t$D$ /d\$$  5E   E H=~{$XT$ф5E   E $|$褄5E   E 5E   E ɻF^u,FrNA@Fr؋Fr SCr$ pI hWpI C7pI p_7=Y$$ 蠅pI h5E y E 8pI B  鼺CqCq {tX,t5P0u.xEtF=\$̭xދ^tp,tZH0uSxEЋ ====txu5E   E P$ L$t$D$ ra\$$ N5E   E 鋹=~{$XT$5E   E Q$|$5E   E $5E   E  FVu,F7pF@@F p؋Fp CCu,Co KA @CoCo $ pI h s0 pI 5E A E h 8=pI 3҉pI  h CpI շ$ xpI h{؉8S5pI V pI 5E  H E 鋷$.pI h5  l WP pI  1pI 5E  E X =pI =l .$сpI   5l  pI  q pI 5E  E l $ 腁pI 5` ЅH 5E  E B=pI  =H 镶$ 8pI =@  D 5E  HpI  E D I$pI   5E  H E $躀pI 5    E p5E $T${~5E   E 鸵3҉pI  餵$D$:~5E   E wh pI ^h_pI S  >hSpI CB;pI  x h pI h{xpI  ״h3ۋzZڋ@ D =u&$|$=}5E  E @ @  @@ h$8 pI h3ɋw0WpI S=pI ti=$pI  St/H,t_P0uXxDD tx@@Su$\$|t AwF@== tnt*V$/  L$  {  vuwV t^Å*H  @u덋F$I  T$  댋tmN$f  D$  ^_ w@ 3҅t H@ @ D 5E   E  3=pI h pI ʱ3҉pI  鶱h3ۋ\zZڋ싽h pI ~@ D =u$|$z@ @ @H @ ` =u$L$y` ` 5E @`   E @ D =u$t$xy@ @ @H @ ` =u$D$?y` ` 5E @`   E jhWP pI HpI  6C8su0Cag[C@G@C1gC#g $D$jx$|$BtJFt`נX$3xD$ DӋ^ T$\$$Kt#Hu$D$w^IN$  T$  w  ɉN ]$0ypI hQЉpI yxpI D tkP@$8LypI h_wЋ pI qWpI SG5pI F pI D t%P@H t%P@H tbP@@ 3҅t H@ @ D ` 3҅t H` ` H 5E   E ʭ@ 3҅t H@ @ D ` 3҅t H` ` H 5E   E vhpI t @tx,t@X0u-$L$u5E   E !   hBpI t @tx,t@X0u-$D$vu5E   E 鳬 駬 雬hpI t @tx,t@X0u-$$t$ u5E   E F : .$vpI hpI S =pI G@$$L$s5E   E  ת$zupI h pI Y pI  P@t$$ _h_n=t-FHsCN$D$P_$DHapI hyxApI C5pI V,Bu pI h~5pI ^V,I E=lj$`F$h3҃…pI 3{$9 J 3ۉ 4^tu{8ׁ{S8t[@{,K$1V ~3S8F$9s,~K$9QpI =` 0sd t${<$0=txrV=@u'$^O^xOtt$ x$\$t$5 4$&t@u 3ҋ*3҃8uP$\$e[5E   E 颒5E   E 銒3ۉ$(];wC  pI L$$&t @3҉S C0JS =  H  L5  P=  T X \5 ` d= h l p t3x|Ht$hz $|$f/lɉjL$  L$D$$ 8\$$ ~Y#CCX@-= h$$u9آL$|$T$ $ 8t$$ X$DZpI h=` ~xpI CtopI  S $T$#t@t 86=` pI sd t$C$T7[@܋h3ɍ= 5pI T$ L$\$<$,=E=hytwhpI -U5E   E ÅtpI JL$ $ ˔D$\$6D$$ wW{  pI T$$u"t @33Ҁ=h S t$  \$&6t2=pI yG$pI S$Z{tG[@$ ; D$ L$t$5|$$ V{,K$p ~3S8F${9s,rK$ՋXu'$IX P+ w3҃8PS8C$${H yu\$ $t$2=h t&l tt${<$4[@t$5 4$ t@u 3ҋ3҃8uP싅~3҃8^PVhWGB Wt<_K,uM{u =t=$93ɋÉL$L5E  E hSpI  =O/HVL$ `L$t$$ 3|$$ cThZC ippI J|$D$L$ $ +3{cBȃxTt{ыShCp~t]$VhzK==JhZ$\$V$@VN YC{@=e=tP$VԋC,s$y (w~t$$\$RW3Ƀ,3҅…,(N Az$…uT,v@,9먋{$A _p3}֋qR[@v@3҅ۋ$PR$@A@3҉$$…ű{,j$}t$C$$T4$ThFhpI B h pI ˈh_$u@hT{D$L$|$ $ E0$ T$QhZ=t-1HK5CM@$D$P$DRpI h_؉XW pI QpI s,Fu 5pI hx5 $z/D$|$$z/vѾohq4$u@hTV\$|$T$ $ /$ D$O$DQpI hYXypI xy5 $.D$|$$.mvхt$ȣL$XOhz=h tzl tXhqt$C$.u7t$ ˔t$|$$ .$ T$N[@뤋5E   E d tXhqt$C$-u7t$ ˔t$|$$ -$ T$eN[@뤋5E   E 靅=  pI t$<$Kt@u 3҉S 3҃8uPt$ȣT$Mh~=h tzl tXhrt${<$,u7t$ ˔D$L$$ ,t$$ wM[@뤋5E   E 鯄d tXhrt${<$<,u7t$ ˔D$L$$ !,t$$ L[@뤋5E   E 5  pI D$ $t@u 3҉S 3҃8uP닽h3ҋGsw4$jO5E   E Ãh3P@cshqtq>VL@thSV twL@ы^V h S{ACu T$$3G4$N벋5E   E h$u97D$\$t$ $ *|$$ xK` 5E   E 鮂$ QMpI hNHpI 3ɋVPz@J@ʋ식hpI  X$DLpI h~x^ pI Y~u$D$JhV$O/hpI O $LC+wT$D$t$ $v)\$σ $YMhC8u5d t]h_;tJ\$F$ )u7\$ ˔L$T$$ )\$$ Iv@럋5E   E $$qKTT$\$L$ $ (t$$ zI2h5pI Z$KFhx<$pI x<$L pI Ahd P@ d pI Hh 8=pI .Kh3ҡ ^L$ 5pI T$\$$=C=pI G` 3ɋ5E  d   E h=d hx@d pI  }$ JpI hpI F؉CV=pI W pI ApI 3ɋVt,r@J@ʋh pI Kh 35pI XT$ |$\$ $s=0=1pI yF pI  $S\` 3ҋ5E d  E  q~$ IpI h=pI N؉OV3ɡpI PpI CpI Vt2r@J@ʋ  ~  }K5pI ^t]C8uHFD$ F2L$t$<$l%|$S$QI$HC5pI [@uh3ҍ= XL$ T$\$<$==tLpI EhH؅t=pI <$艄` 3ҋ5E d  E  |@u'$GLLWxLsjPLzt\$ ˔L$t$$ *$\$$ E$t$= <$t5@t1|$ 3t$$ŋ= <T$<$t @3$AL$hDF3ۅtFx \$ XT$|$$ =#\$$ DFtx t$t$Cd tLK L$$t@uE3ɉK=  3APtBP@t(5E   E z3Ƀ8uH뱅txD  u}C;AtuD$CxD|$Kqt$CT$|$D$ $  "$ L$BP5  [syT3҅…tʋTD$Slj$\:Tv @3ɋXtbuuh3Yt8C$@ =" { эB=w$ WFG\Fr\Ff\Fn\Ft\Fb뼐D$ T$\$ ޮT$x$dEt${"RmS<WC$2D$ޮC$oE|$C$S(D$ޮT$ C$vE|$d@ ‰D$ |$Q$ҹޮEʉL$Q#^T$XޮEC$ 5C$\$ޮS$oɋw$^f4$@ =J~4ʍA=w$ WwCG\Cr\Cf\Cn\Ct\Cb뼋C$ @ T$ |$VvT$ST$\$T$$|$@ <$d=w|FtjʍA=w$ WCF\Cr\Cf\Cn\Ct\Cb@ T$S$ҾޮEt$$E L$x$ҋ߈4$@ k=wׄoʍA=w$( WsCF\Cr\Cf\Cn\Ct\Cb뼋ɋC$S(D$ޮT$ {$Et${T$4$\$4$@ C$_T$$Q@ ‰D$aT$T$$$@ L$T$$i$@ L$$t$@$@ dL$$|$$@ hUE]WUXu }@]XEuBE HE E &E u]~uG}]K u[UBPB= M=m==3EU'Z u[UBPB= =a=g=EUf9UBPB= `=}=+=:E$jD$MqF@ + E Iɉ E E ]OEru$vt$uMAE J҉E =E )E ]u}]$&E T$t==@}oE}c󿆰\$$}GM0C t$E L$ t$D$C =t&=@DSu$t$=r=~z _]p=Z=YE읰Mu~GX$\$UBEr$)E \$?ErHE쮰E츰=+=@uWE}K==z _]==E蝰E记E踰$]E T$gE쾰EŰ ḚEҰ==E䝰w=tu=dz _]VE丰IE䮰@$=3ۍА="$гP,tRp$3А="$\H(@$$L$D$-P$t='` 3۾` a K="h$\0f5` b ` D$$ W` CF3ƃ` ` \$$ƃ` \ƃa 0ƃ` \ƃa "ƃ` \ƃa rƃ` \ƃa fƃ` \ƃa nuƃ` \ƃa t^ƃ` \ƃa bG Wj` CFƃ` ` D$ T$\$4$|$ W` CF`$eD$N\$$ƃ` \ƃa "Rƃ` \ƃa r;ƃ` \ƃa 0$ƃ` \ƃa "Fƃ` \ƃa rƃ` \ƃa 0ƃ` \ƃa fƃ` \ƃa nƃ` \ƃa tƃ` \ƃa bƃ` \ƃa fƃ` \ƃa niƃ` \ƃa tRƃ` \ƃa b;ƃ` \b Ƴƃa xT$<$D$3x(P$$ɳ|$T$ƃ` ` ƃ` \b Ƴƃa xL$T$<$KFfƃ` \b Ƴƃa xD$$L$i\'f ` HUWVSxQ$tF=V,N$3NR==@LZ;G; F= jw=x Huȋ3LА="$==JD3ɍT$L$$uË V,Z;$wV,G;$zpČ[^_]Ð==y$D$,V,xD$$ы:D$$뵋\$ɳT$\$V, 3ɍL$|$$>V$F,3T$D$$А="$ V,e~$_s,{ C@ W` Cƃ` ` D$ L$T$$ \$$n Wtk` FCƆ` ` \$$GČ[^_]$w0C@{)L$b ƳƆ` \Ɔa xL$$k\$T$\$ $$.L$'$eL$\$$jAk{?ƃ` \Ƴƃa xD$T$b $T$D$T$,Ɔ` \Ɔa "^Ɔ` \Ɔa rGƆ` \Ɔa f0Ɔ` \Ɔa nƆ` \Ɔa tƆ` \Ɔa bƆ` \Ɔa 0ƃ` \ƃa "8ƃ` \ƃa r!ƃ` \ƃa f ƃ` \ƃa nƃ` \ƃa tƃ` \ƃa bƃ` \ƃa 0UWVS\E;u'E   w'$,uE,$M<$衹\[^_]$0F8PB}$|$\[^_]ÐC$D$[t!C u2؅u$}$|$랐$wpC 뽐X SUs~G$p C<2S$ K0|F= $ԷX C<{<$C0]$\$X C<XK $s0U$T$dw}$|$J$Ķ*$ʶ$ж$ն$ڶ$߶$$$q$_$vC0$b_$PC0$<%$%$C0w$6 $ $X C$D$[C u$wC Ӄ8$$i $ Wp $BF$.p $~$%A=G^3ҍEĉD$ T$K <$L$ Ht[$*L$[뺋x $Gu%Ë[m,uCD؋x $ME`ؾ,Ë[C,uKD؋p $Rh $%^u$Ë'[,uSD؋x $Y $%}_u&5Ë[ ,uSD؋E$D$)[vC u$wC $$$^Gt7 $^Gt-ؾ,Ë[t,uCD$%w_ umË[c,uKD$0$a$_$d $$fG[ $oVt3MĉL$ D$Z <$\$HtkvK^tt$sF$y}uvNj^ tú[t\$<$赭t݋v$*T$w{$|$_u.ËW[t ,u{D$$$\$Uu]}t(=w$ĸ]ċC]u}]$(}83E F3҉EԍE{$ ]u}]ËvVF<$7V$(F)V*ZUċ18 xC EċXSB= L=s=F=uEAu$Mt$MċAz$(F h$TFL$XF8v$\F<~<$F0B$F0$vfvF<V$WF0$\@0v$_ovF<K^$N0$_$V$2$F$F= w$$bF:$f$ks$pe$tW$xI$|;$-$$q$F0O$$$F0$I$󿍸 EċXSB= = ==u$t$$UċBXC<s4${0$C0?󿥸EċXSB= ==M=uEA]$\$VMċqF@ =n=@'EFEX$󿱸uċ~_C$D$UċB@ &=yA=@aEFUEX@=J=!E==z WU\$$ MċYbC u$wC ErEx==@^.EF"EX==CE7== z WUErExEEEE==hz WUZExMEr@==)EEUEHE;E.EA!EEEEUS؋@&1$C*o Cg C xC $3C C MCP$C l^$#C4 @@u-$#C4 @@uS uCtxu[ [ uUWVS   V F^t#{[@u^t({C [@u^[uFP 2g(yA$U$< [^_]ÐC P[@$x@ 2[@*C @€|$$ԺN$L$^tC@uz؅u$غd^tuw[@u^u Ë[,uCDؐ$wC@rz{ uCu+$[@\$C $f#C4 @@u륿XtJtDs@ xhr]xRG<1&FUWVS ~ t{G_t#{[@u_t({C [@u_9[u^t{[@uFt-@$Xt#{[@u%=T=$NݺDډ\$F9$~|$m^t@$M C8$D$-[@uƋF$ [^_]ÐC [@C [@cx/@ "C [@$d[@f[@.C =$ MD$$7 $h$VUSEM@ уt;v3[]ÐJu@tX ubؐXttċtS uQCua$|C tK$ L$c념@ulsb$1C $#C4 @@uoUSMEQH=t=tq3[]ÐZS ttC $D$uыCt x[t{t\[@ZxC $D$~a{TC EGC 7[@늋@ *oUWVSt}=wt$8w FJ H@SXMwL$ T$t$E$  H@S\MwL$ T$t$E$ڀ H@S`MwL$ T$t$E$言H H@SdMwL$ T$t$E$v HK@ShMwL$ T$t$E$D H-@SlMwL$ T$t$E$F H@SpMwL$ T$t$E$ H@StMwL$ T$t$E$ HS@SxMwL$ T$t$E$|D H5@S|MwL$ T$t$E$J Hg@MwL$ T$t$E$ HF@MwL$ T$t$E$~< H@|wL$ T$t$E$~H@xwL$ T$t$E$p~H@twL$ T$t$E$8~(H@pwL$ T$t$E$~HE@lwL$ T$t$E$}pH!@hwL$ T$t$E$}HM@dwL$ T$t$E$X}H)@`wL$ T$t$E$ }\H @\wL$ T$t$E$|H @XwL$ T$t$E$|H1 @TwL$ T$t$E$x|HH @PwL$ T$t$E$@|H @LwL$ T$t$E$|Hu @HwL$ T$t$E${4H @DwL$ T$t$E${H} @@wL$ T$t$E$`{|H @$p$\$H$4$ $ 6$:$^$$$<$Z$$l$X$D$0($F$,$J$$$$$$|6$h4$TR$@$,$UUWVS} Mw@^@qt{@_T$ t$\$E$*mt~H@VM_L$ T$\$E$lHW@E~ZD$ |$\$u4$ltBH[^_]Ð\$$`@t\$$`[^_]Ð\$$`b$$.$[^_]ÐUUWVS} Mw@^@{@YtwT$ \$t$E$kHL @SMwL$ T$t$E$k Hj @SMwL$ T$t$E$Sk HL @S MwL$ T$t$E$!kQ H @SMwL$ T$t$E$jH @SM܋wL$ T$t$E$jHz @SM؋wL$ T$t$E$jOH\ @SMԋwL$ T$t$E$YjHN @S MЋwL$ T$t$E$'jH0 @S$M̋wL$ T$t$E$iMH @S(MȋwL$ T$t$E$iH @S,MċwL$ T$t$E$iH @S0MwL$ T$t$E$_iKH @S4MwL$ T$t$E$-iH @S8MwL$ T$t$E$hH| @SHl[^_]Ð\$$`dN\$$`@l[^_]Ð\$$` c\$$` \$$`أ\$$`责X\$$`萣\$$`l\$$`HM\$$`$\$$`\$$`ܢB\$$`踢\$$`蔢\$$`p7\$$`L\$$`(\$$`,\$$`\$$`輡z\$$`蘡!\$$`t\$$`Po$0$y$$$$̠$踠$褠?$萠`$|$h$T$@$,$&$G$l[^_]Ð$ПY$輟z$訟$蔟$耟$lUWVS@$%`3Mp |$pD$ L$$]JH 3ҸL$ pT$D$ $'JtH[=>==D$$Ľ舞pĜ[^_]Ð$`T$[`$`D$7[=sp@$0_w@ ]X pT$ D$L$4$(I H* $0w@w4؉4$dwC p\$D$ T$ $HH pT$'$?@ $0v@O0H pt$ D$\$$oHyH_ _t3Gx;pt ;0F吐xpF<wt$vU D$pL$ T$$G<Hd G4[@$+vD$L$ pT$ $GHF W0p'[@D$ T$L$<$dGH[@3ɉhb:Hh[@h3҅…$s|$pD$ t$$Fut$$`u뢐p@<$tM T$ pD$L$$}F6H O4 $tD$pT$ D$ $>FHr W0'T$pD$ L$$FH) \$Ep<$D$ T$p$@3$T7\$ ׽T$D$ $P$stpt\$D$ L$$FEhHGx0FxpF<Gt$lsu 0D$pT$ L$$D|HG4[@$sD$pL$ t$$DHO0p'[@D$ L$t$<$RDHs@lp^D$ L$\$<$DyHOv@lp^L$ |$\$$CNHv@lp^|$ T$\$$CHQv@lp^D$ T$\$ $]CHv@lp^T$ L$\$<$CRHv@lp^ L$ |$\$$BHv@lp^(D$ |$\$$BHv@lp^0|$ T$\$ $eBVHQv@lp^8T$ L$\$$'BHv@lp^@D$ L$\$<$A5HWv@|lp^HL$ |$\$$AH~@xlp_LD$ T$\$4$mAH~$m$ $Ε$輕\$$TL $F2i$脕U$`tL$hGx$`T$J$` D$/$W$`'|$$Gx $` T$Ҕ$`L$跔E$` t$蜔$`'\$联t\$$`\$$`Z\$$`D\$$`.y$`'T$#$`T$$` L$ݓq$˓\$$`赓\$$`蟓\$$`艓H\$$`s\$$`]\$$`GL\$$`1\$$`$ $$$`'L$ʒ%$`D$诒$蝒$苒$y$g$U$CS$1$$ H$>$$ב$őN$賑G$衑$菑N$}$k$Y}$G,UWVS\D$ E$3E E@EEP EE= wuu$}wuwM}AS;uUGwt̀8tǃ4MԋMM3D$EЉ$Ft8t8*u֍x<$FD$]ԉ|$$F$\[^_]ËH9* MuQ44$T$$FE3 |$}$|$JH@E}؅}}UE<$M܋q A tG}Mt.}wu])Ut EM܉AU܍M}L$ 5 T$_4$\$O:H$܎uu4hI $8GD$$舎$gE܋UuE  ^qt~FS};tvGOMȅt8t^4~]ĉ})D$E$oDEMȋt8t8*uҍx<$eDD$Uĉ|$$bD]$"gu܉F u:$gE܋]U܋BU$}܉G ZE̋vUWVSlE@<3ۅo5 @ xt|$N $Cut%|$5 4$/d@E EP &x?*M5 A4$D$F/EHq UZ4$\$/4$\$/ 9Stj4$L$.Eą+3҉T$X \$$D@4$ MĉL$ \$T$i7 uĉFu===l[^_]Ð] s]:thC$~E4EP0#MA=t-===G$謈, hI  $8AD$$興P$\$5Mq<~$=to= =@d==HG}G$7J MȋZ$]̋B(EЋz,EE}OQ $\$4uȋF^$== Hw<|$=t=WEX$=iw= t =@fW_g=tswP= t =@4W&_=tT=wu {C$ph^,^    t  p  x U |MM] h l  U ] E M  U ]EMU E    ]  Eġ Mȋ  ]3ۉỦEԉM؋V,~~0]CU9^,F0OhI $3=D$$о胄$qIv@yĜ[^_]ËĜ[^_]ÐU uÐ$<ÐU]عu}@EEbu Mu '8{<-5$ W BtD$F$9ut,O = q<$t$%OPU$ MA y?*u  F $D$%@02x C<$D$Z%t|U=q==<$t$%)3= D$V<$T$V;@uK$L$`]u}]C ]:CG= tX~=t8==u:E1W<Jw8G= wuE=tG,tuG0EuuM;  ~& u4$L U $D,U  5@ T$ L$G4$D$,;E D ۣD <,$+_0G=t<$T$Ew$Gu= =t==um M}9Y=t=@=Eo@ (  [^_]ÐW,G=WHW$ }$D$|$C)[^_]Ð$KG,3ۅ~_t$  D$ @ $T$m*4$=D £D K  C9_,4$KAG=  X=tF=F=  G$[^_]=tb=@ M}pt=t =E=*=O G,q uU‰EG$]$IG$  u$L$t$'S G$ ]u[^_]ËG$`D$o$Jl=t=@t  QW(G$=6===L   $H  4$T$D$&׋|$4$踾u[^_]aI=t =  Uu9fEW,t'G0u E$lHE3ۃ~"O$C;~t$8HW,O$O$} $ |$T$D% G$\$0UWVS|ډER,C0 M{}suC EKM{}suCEK M{$}s(uC4E̋K8MЋ{<}ԋs@EEu3~}C$EFUT9s,|[^_]Ðs$^tՋC=t"=t [@搐E[@ѐ{t[$qC,t*M{8S$D$ωT$ $#[@뗐UC$K8t$D$щ$#ҋ3uCESUK M{}suCESUK M{$}s(uC,EċS0UȋK4UM̋{8}ЋsMȻݝ4G,tPTȉw$$t$#Ћʁကt DȍSD+CD$މ4$0 #ыʁကt DȊэCDу+-Uuu]}@ t~t9]Ƌ}u]*@ uՋ  t~]u}]ËV,tE~0u>F$3E𐐐~ˋMXt}[@uV,G;ڋV$Z ][@u]u}]$h fU@ uÐ$U@" =@ r=?" vw, @ L$$@ D$2tA  3ҹ@ , =@  @" D" t@ @@" ɋÀ8u뉡@ =E t$33ҸY, ÐU3ҋSM3t,`" t _Bu[]ÐUVS $ t. $]\$[3҅tP [^]Ð$ A  utt$ CT$ $D$ Ht6t>t$ $ CT$ $D$ Hu$T$9u‹ $ ,$D$`9 $ MUW33VS uT$TD$$`" Bƃ`" uF$~Pt4$3|$TP$PXt$LL\$@ O& & E& $Y:& PD$<$M@ LD$T$|$ $$L$7$ LT$-T3ɋ5@ L$\$4$ [^_]á&  & *5& 4$9& E LM T$ $@ "$5& 3|$& 3ۉt$ D$}2$ & 3|$& L$D$ Ct$@ $T$U QP\$u |$T$t$T$ D$$5@ 4$d|$$@ $ & 3ۉ\$& L$D$ x0$8 $a8ظ+D$$Qt$-L$D$ |$$" $" 3҉T$8$+D$ u$o8PE @ #$J8P3\$E T$D$ L$$C$9t$5>   @ $IT$" 7PU& $7ÐU+ t!' T$E$Ð$H+ ' L$T$+ ' T$E$ÐUS];"tZ[]ÐC$#DZ[]ÐUWVSLH" Et3҉H" ЃL[^_]á@"  -@ D" 3 `" t}t^\FȐ"' Mǁ х};( uE뮐 . ! t wBu.F/YO Y, IL[^_]Ð( E@" F=@ =?" 8@@"  npbb0u~E3@" =@ r=?" w 8, S3ɺY , }}T=G릋=, 3҉, Yˆ$hL$1C=]$ 3҃ …=@" 3YI+=@" $@  @ D$L$!  3@ , =@ @" =D" t@ tt r $@ @ T$D$  3ɺ@ , =@ @"  D" t@ @@" V b @" D=3ɋUL$}ȉ<$T$] 3@" 8u3ҁ=@ E tL=@ r=?" w 8, t{3Y5, Y5@" 5@" ʀ=GH  3@ , =@ @" =D" $@ @ L$\$:u@ =E t$3T@" 8u3ҁ=@ E tP=@ r=?" w 8, 3Y=, Y=@" =@" ڀ.@" 8u3ҁ=@ E tP=@ r=?" w 8$, 3Y5, Y5@" 5@" <.XK<  3@ , =@  @" D" $@ @ t$\$u@ =E t$3$@  @ D$L$  3@ , =@ @" =D" t@ @@" @" 8u3ҁ=@ E tP=@ r=?" w 8;, 3Y=, Y!=@" =@" =-==+,,  3ɻ@ , =@ @"  D" $@ 5@ D$t$Uu@ =E t$ 3EWP$E#:@" 8u3ҁ=@ E tP=@ r=?" w 8, 3Y5, YP 5@" 5@" =&==  3@ , =@ @" =D" p$@  @ D$L$) u@ =E t$ 3@@" 8u3ҁ=@ E tO=@ r=?" w 8v, 3Y, Y_@" @" ʀ=3 -  3@ , =@ @" 5D" $@  @ |$L$- u@ =E t$ 3N= + u$ +  T$/ $@ ~|$: $~L$% tP$~D \$$ t-8";u + \$$ G  =@" 33 ,  H" @" 8u3ҁ=@ E tP=@ r=?" w 85, 3ۺY, YP5@" 5@" ===|4<1  3ɺ@ , =@ @"  D" w$@ =@ D$|$e u@ =E t$- 3E@" 8u3ҁ=@ E tP=@ r=?" w 8b5, 3ۺY, Y 5@" 5@" ڀ=DU  3ɿ@ , =@ =@"  D"  $@ @ D$T$i u@ =E t$13O"d@YMN>C@" 8u3ҁ=@ E tP=@ r=?" w 8, 3Y5, Yy5@" 5@" ===>(@" 8u3ҁ=@ E tP=@ r=?" w 8!, 3ۺY, Y)@" @" <=CEE6  3@ , =@ @" =D" $@ @ L$\$u@ =E t$3$@ @ |$D$|V  3@ , =@  @" 5D" t@ @@"  S@" 8u3ҁ=@ E tP=@ r=?" w 8, 3ɺY , Y @"  @" =+I==56  3@ , =@ @" 5D" $@ @ |$\$>u@ =E t$33҉, Y?  3@ , =@  @" D"  $@ @ t$\$*u@ =E t$3@" =@ r =?" w8uq5, t3ۺY, $@ @ D$T$   3ɿ@ , =@ =@"  D" t@ @@" v@ @@" @" =@ r =?" w8up, t3ۺY, <$@ @ |$D$   3@ , =@  @" 5D" t@ @@" @ @@" @" =@ r =?" w8uq5, t3ۺY, |$@ =@ D$|$Q  3ɺ@ , =@ @"  D" t@ @@" @ @@" @" =@ r =?" w8up, t3Y=, $@ @ t$D$  3ɻ@ , =@ @"  D" t@ @@" ~@ @@" ^@" =@ r =?" w8up, t3Y5, S$@ @ L$\$  3@ , =@ @" =D" t@ @@" @" =@ r =?" w8up, t3Y=, $@ @ L$T$d  3@ , =@ @" 5D" t@ @@" n@" =@ r =?" w8up, t3Y=, ($@ @ t$\$   3@ , =@  @" D" t@ @@" @" =@ r=?" w 8, t?3Y5,    3@ , =@ @" =D" $@  @ D$L$u@ =E t$3@ @@" @" =@ r =?" w8uq, t3Y=, $@ 5@ D$t$pV  3ɻ@ , =@ @"  D" t@ @@" H@ @@" F@" =@ r=?" w 87, t?3ۺY,   3@ , =@  @" 5D" $@ @ |$D$u@ =E t$]35@ @@" @" =@ r =?" w8up, t3Y, n$@  @ |$L$x  3@ , =@ @" 5D" t@ @@"  C$D!@" 8u3ҁ=@ E tL=@ r=?" w 8, tx3Y5, Y5@" 5@" ڀ=BVDG  3@ , =@  @" =D" uj$@ @ \$D$u@ =E t$3X-@ =E t$r38@ @@" @" =@ r=?" w 8, tD3Y5,   3@ , =@  @" =D" u>$@ @ \$D$u@ =E t$3|@ @@" h@ =E t$3@ @@" U@ =E t$V3@ @@" @ =E t$3|D@ =E t$3y2@ =E t$3@ =E t$3@ =E t$3@ =E t$j3@ =E t$N3@ =E t$23k@ =E t$3:@ =E t$3L@ =E t$3@ =E t$3Q@ @@" v-@ =E t$r3UWVSl$ = / }8$ nA  uStG $ t$ CT$ $D$Hu$L$u=Yt=It Ál[^_] 8"t' q3.*0 h.L$<$t$<$vx@؉$eT$G=5+ è<@" 8u=@ E h=@ r=?" w 8=, 3҉, YY  @" 5@" 333,  =H" 3ۀ0{ ! t) Bu߅e$ 33ɉ|$L$ l[^_]$$/ P3ۋ3zSR؅u $ۺE3ɉ(/ Xt{S[u$,/ 3NP3zSR؅u $] / E=0/ $ $t$ $ r\$33D$<$Cx91Kt t u0u3҃[$  D$$ @=[~i=\=]0/  ! xX ¨th" #  Buo=Z$/ y! xÀX èɾ" . 7 уFu$@ @ t$\$  3ɸ@ , =@ @"  D" t@ @@" $@/  T$ t$ D$x\$$@/ T m ,/ U$Et$dh3ۍi t2Bu싵 t Bu Xɉ uCҊt 0t+-3fG% t)AcCuI`  -0P$Iyʄ[V$&v !  /Bu荝 L$$\$3ہ5|$ ù,L$T+T$D$\$$ 5  L$4$ 7P,:R=" 't$7T$! @" =@ r =?" w8un=, t3҉, Y$@ @ t$\$Std  3ɸ@ , =@ @"  D" t@ @@" @ =E t$3d(/ @ =E t$3ҋI PV"$ (  hI 8 ;C.t.ڀeEЅu C<+td<-tUV|C` -0CP$t+ʿ҈t0u C3fGt= t1)At$Cڄ3&Jx-`0S$Jx7؃u `3v@P$UW}VS E$]\$]$ϋt&$;u |$dT$ [^_]ÐUWVSEUEteL3 tp؅t'3t$U$3[uE[^_]ÐSL3 $$L3 uۃ3[^_]$EM3t}<$tdx .tx -T$<$tp$  L3 ؉H<$L3 4$C}<$AuE$BL3 u9s؉]U3W3VS!3ۉx$v$I 3ҹ@L$T$$.L$<$@$"<$pp4 9 A} /usrU7/cpp$5I  -B &}/ccs9/lib-D__symbelfƅ||E ;-|};] BA;U|ꋕ|}M+G||u9||$t|$z$L$wtUD$3ҹT$L$ D$|$$$T$"u4$ Y I\$ T$3 $D$dt$<$3D$I $%uT$$t~k>>{u-D=6}$t/6$\$_hٽpT$ ( |$f t$ 3f\$٭\$٭D$ $|$ D$t$$ D$ *T$D$$$<L$wttt$$L$?#t˾ t$<$Dt t>L$$KtAG5NHx $>D$$xxt$<33tu$3E t\3ɉL$4$2 u` u  4$C$K\$$je2 t$S|$G뉉$/|$t$ $>D$y$>T$Z$>|$;q$YЋ<X|$ 3D$L$t$$)$>\$ $>D$$>T$t$ nL$$\$t$<\$D$$Rt$$uh\$T$$td T$$tL$4$t|$ 3ɾL$t$|$$Q$$E I |$\$ \$$  B<) B< 3$TPB< B<|L} @3 $P$D P뢃 B<DM |D3 $GPkE KۉE E  E  =E O=E  E  E $E  I t$E E L$O|$  T$E D$$\$ /E L$t$$|$ /T$E D$$ \$ L$t$$<|$ !D$T$$T{E KۉE E  E $vE T$#\$D$ !t$E L$ |$$\$E T$D$ $t$E %L$ |$$\$E T$D$ $t$E L$ |$$mE HE X5E  E $0:E T$<\$D$ t$E L$ |$$l\$E <D$ T$$ E Iɉ E 5E  E $BE T$<\$D$ |t$E L$ |$$0_\$E >D$ T$$p= E Iɉ E 5E  E $E <L$ t$|$\$E AD$ T$$ E Iɉ E cE  E $4>E T$.D$ \$vt$E L$ |$$tYE HE 5E  E  B<|Lu H3 $P\$ 3ҹT$L$$t$JE |$:P^\$ 3ҹT$L$$t$E |$P$\$(r.7xt+3$f2C$N;x| t$E 3ۉ\${3ҋhI L$4$诹|蛖 <$$E !t$ T$\$$$ E |$)$ E \$$ E |$$ E |$Q$ E |$$ E \$v$ E t$U$ E T$lU t = t$n$T$ =tc$ST$L$@ SD$T$  $@= C>$Ë 5 `$ T$Ϲ5 ùSL$D$ $[@u$!T$$! L$lb$!D$Q UWVSL= ExtPU =t$U5 tÐ$85 3ɸ5  5 $5 5 ÐU]5 u}t\5 ;5  5 @5 ыMBB q2YZ]u}]Ð$o5 3ɉ5  5 $P5 5 ;5 5 dE$ 5 ؋55 vt>C;E55 5 4$5 5 UX}]u@T$4$G$T$ D$3D$T$= 5 $G$}NtQC  hI  $S}ND$ w$!;Et$|$茰K n=hI  u_USExt[N[]@$XúN[@uY[]ÐUSExtYN[]@$XúNx[@uX[]ÐUS5 t(C=t$zu[[]U3ҋWDVSHT$}L$$D$w N$L$!P J 9I t$ t$ lP5 T$D$4$R\$?E\$ L$T$$%$3D$W=t,t$PD$$=PD$ZW Z{4$|$\[^_]ÐUWVS| 7 %P5 |$\$4$t7 $2tx .t<$ D$?R\$ T$D$<$3ɉL$N=tet$PL$$=PtI$a7 $uMY Cx4$|$[|[^_]Ð$MY Cx4$|$[|[^_]$?97 $_?T$ US7 ]t!$3҉T$][]V$?7 u$_?L$j 7 뮐USE M]%D$ Q$D$T$[]ÐUSE M]%aD$ Q$D$T$N[]ÐUSE M]Ё%D$pT$ Q$D$T$[]ÐUWVS 7 }  tJXt$D$$@t|K?F‰uġ  7 u)P Ĭ[^_]á  t΁??v-r>t* u뭐Z; t u뎋B uBĬ[^_]ÉT$|$$@7 hU% ]ÐU ]ÐUMQ BHBPAB$]ÐU]ÐU]ډu}H;3҃…t"F]u}]ÐtoF,t V0ك w|tF$3҉EU؋]u}]ËF,tV0uvF@AMuF$u F$EU3^tvrKo t0>L}Mf fMm^$m؃ tfwItUV$؃ tmwPtbUV$W.\@;EF$0@@ EF$] I V$Uĉ$F$~,3EtnP=\=@=}rU}bA9tF= w=wS=uEEEUE t uUF$~,t==U}OUUEE t,/U땋UċE}U @F$}ÐʋR,tPY$E]~]MXt4$Ë[@uEP,E;Uσ[^_]ËUJ$Y4$Ë[@u[^_]=wh= t =@]C8C$>=t|=MQ8Y$f>[^_]Ëy$|$=t=]K8C$>EP8X$P(>T>{UB8Z$7gUWVS ]U C,t9ȋC$@]p8C ދX ˅Ext [^_]Ë]C$ƋP,tJH$EM~؋]MXt4$Ëd[@uEP,E;Uσ [^_]ËUJ$Y4$Ë$[@u [^_]É $PUWVSuE@=]K,tHS8[$47$D$<$뵐ʋR,tPY$E]~]MXt4$Ë[@uEP,E;Uσ[^_]ËUJ$Y4$Ë[@u[^_]== t =@UZ8>B$EP$T$=tl=MY8>uF$[^_]3҃B;[^_]=t4=r]K8>[$_]S8 7K$J]C8>L>S$K(/UWVS} 8 8 W =8 2ZM 8 85 8 48 E8 }=8 u5 8 ]$8 M (8 E,8 }u]MEċ=08 548 88  <8 }ȋzu̡@8 ]ЃMԉE8 p8 5`8 `8 d8  h8 |8 d8 5l8 h8 t8  x8 p8 8  we$h84 $E8EQ;t =E8q08Q,@ =8G= *=t* =a = U8V$Ut,E$8@B,8K,Mċ8q0B8 8 8 H= 8 58 L8 8 P8 T= 8 X5$8 \(8 `,8 d08 h=48 l588 p<8 t@8 x|HQ0$<P= J 9UċZ S uE@t[@ߐUă"T[]ËC Hà [@뻐UС8  8 ]ȋ  EEȉMMEE U܉E $1[@eUċZ$S[t# K 7 t$%א]ă#T[]$UЋWVS|E ؋CPBE(HAݹXCEpFҐW\ 8 58 =8  8 8  8 58 =8  8 $8  (8 5,8 =08 48 88  <8 5@8 S0}Ɖ<$T J 9I t XC,;D$ Ct$$@D$CK$= =tm==4C1C$}Z؋Ru44$4C= =x =4W$@mٽFFf fD4٭D߽8٭F8C$0$R )?@l3QV,$ݝ(= =@؋E3RP,$C$K$K$C$fK$KC$E^ۅll 8 8 8 H5 8  8 L8 P8 T58 X 8 \$8 `(8 d5,8 h 08 l48 p88 t5<8 x @8 |HƉS0$@P J 9I t DlC,;D$ Ct$$@D$C= =t=TS$ 2I58 8  8 H 8 58 L8 P 8 T8 X5 8 \$8 ` (8 d,8 h508 l48 p 88 t<8 x5@8 |S0H$P J 9 I t lC,;D$ Ct$$@D$C=g  =tI =K$ 158 8 8 H 8 =8 L58 8 P8 T 8 X=$8 \5(8 `,8 d08 h 48 l=88 p5<8 t@8 |xHS0$qP J 9 I t tlzC,;D$ {t$$@|$8C=  =tm =8K$ 1-58 8  8 H 8 58 L8 P 8 T8 X5 8 \$8 ` (8 d,8 h508 l48 p 88 t<8 x5@8 |S0H$ P J 9 I t l- C,;D$ St$$@T$C= =t =AK$1658 8  8 H 8 58 L8 P 8 T8 X5 8 \$8 ` (8 d,8 h508 l48 p 88 t<8 x5@8 |S0H$P J 9 I t l C,;D$ Ct$$@D$hC==t=K$18 58 =8 H 8  8 L8 58 P=8 T 8 X $8 \(8 `5,8 d=08 h48 l 88 p<8 t5@8 x|S0H$8P J 9I t C$d[]UWVSM8 8 Y U=8 5 8 D 8 8 E8 8 }= 8 u5$8 M (8 ],8 U08 E}uM]ĉUȋ=8 58  8 88 H= 8 L58 P 8 EЋ48 T=8 X58 \ 8 ]̋<8 `=$8 d@8 h5(8 Uԋ ,8 l=08 tE؉pxD|88 EE]UV$ڠNHQ $ lD]JE q @@G$lm$4tS$vt$!D$?[^_]Ð$D$?[^_]Ð$3D$?[^_]Ð$7USd8 8  8 ]U 8 E8 M 8 U8 E8 M 8 U$8 Eġ(8 Mȋ ,8 Ű08 EС48 Mԋ 88 U؉E܉M<8 @8 UEK EQ$6E3҉T$Ӊ$zd[]UVSpM8 8 q E8  8 U8 8 ]8 M 8 E 8 U$8 ](8 Mċ ,8 Eȡ08 Ű48 ]ЉMԉE؉U܋88 @8  <8 ]EEMV$dFXS$pEN$=w9==]̸\$ s=@tQ==uZ]̸uЉD$\$ t$ $ T$E80U̸T$ D$ D$ $8p[^]Ð$ ZC$F='= U̾]Љt$T$ \$OUWVS} 8 8 w 8 VzVrM 8 E8 ]8 M 8 E8 ] 8 M $8 E(8 ],8 ME]ċ 08 48 88 Mȋ <8 E̡@8 ]ЉMԉE؋R E$YG$t$ZEG,;F,}F,<$vG$h8 h l8 <p8 t8 @x8 D |8 H8 L8 P8 T 8 X8 xh|M8U]xlp8$gF$t ~tW$Y_,^,4$~F$hx<4$[^_]ÐV,3ۅ 랐F$ C $9^,F$$!Y돐O,3ۅeG$C$赊9_,G$$XHUVS`u 8 V ZBSpM8 8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̉EЉ]ԋ 08 48 88 M؋ <8 Eܡ@8 ]MER E$豙F$t~t1$W]̉^,4$ևF$`[^]ÐN,3ۅ ĐF$C$q9^,F$$W믐UWVS|u8 8 V =8 JqE 8 8 ]8 }=8 M 8 E 8 ]$8 }=(8 M ,8 E08 ]}MĉEȋ48 @8 =88  <8 ]̉E؍E}ЉMԋR$u]F= wF=t=tr=uUF$|[^_]Ð=tw=@t0uܐMY^(F$|[^_]ÐU멐${I=t=u}s=t=YV,}tT^$E]<]MXt$Ë[@uV,E;UV$Z$ËȂ[@uUWVSU8 58 J 8  8 y 8 $8 8  (8 ,8 08  48 =8 |5 8 d8 88 <8  @8 E艕 |dDJ:H|d@88 dt~\Xt%É$w[@u㋕d;r^$C9\XË $Jw[@u2X$\$xo8 8  8  8 8 8  8 8  8 $8  (8 ,8 08 48  88 <8 @8 V0${ J 9 I t ~e0 F,;D$ F\$$@D$BnNNV FVFVF V$ F(V,F0V4F8 V<$F@3҉(3V$ X<$u[@u$Ux4|$ T$D$$(4|$T$$\$<$}T|$,T$(DD$$\$ |$xT$4D$\$|$ T$D$$lT|$(DT$$D$ \$x|$4T$D$\$ |$T$$\$$D|$ T$xD$4\$|$T$ D$\$<$DT$ D$x\$4|$T$D$ \$|$$+DD$x\$4|$T$D$ \$|$$DD$x4\$|$T$ D$\$<$xT$4D$\$ |$T$$Dx4\$|$ T$D$$ T\$(DD$$T$ |$x\$4D$T$|$ \$D$$|$$D\$ D$xT$4|$\$D$ T$|$$DD$ T$x|$4\$D$T$ |$\$$0DT$x|$4\$D$T$ |$\$$DT$x4|$\$D$ T$|$$xD$4T$|$ \$D$$Ix4|$\$ D$T$<$x4\$ D$T$<$4\$D$$|$$$$l +l$|]T\$,D$(DT$$|$ \$xD$4T$|$\$ D$T$<$^$T\$(DD$$T$ |$x\$4D$T$|$ \$D$$^$(|$$D\$ D$xT$4|$\$D$ T$|$$^$DD$ T$x|$4\$D$T$ |$\$$^$VDT$x|$4\$D$T$ |$\$$^$DT$x4|$\$D$ T$|$$^$xD$4T$|$ \$D$$^$fx4|$\$ D$T$<$^$*x4\$ D$T$<$^$4\$D$$^$|$$^$$^$$쐐d^<$j[@uVF,UStUB EME]Q$Utt[]Ð8 8 8 U 8 8 ]8 E8 M 8 U 8 ]$8 E(8 Mċ ,8 Uȋ08 ]̋48 EС88 Mԋ <8 U؋@8 M]܍]EÉUU$~ú@3YE̋]D$K $t?X$S[ K 7 t݉$-ӋE]C $S[ S7 t݉$,ӐUSD]C PuT$X$$qUЋ@UEHE؉$MȉUkC 뻐UWVS|$#" $H:E 3mB;| $\$ 3҉T$$tb@tۃ8u֋PJ t̉M8 MU58 EE  uuE Eu $6j댐  $N\$ 3҉T$$TtB@tۃ8u֋P2@uƋB Hu  y몐Gp@MH$tvF$]E^,3ۉ$8;]F$}!E $29V$C;]|&V4 "M^$J,Z$R@uwG3҅tP$|[^_]É$U9k$_US t[]Ð$ L$E ] T$D$ \$E$E D$7 u%E J҉E x3E  E []ÉD$\$$E pc$ E L$HUVSu^ Sr<[S HJHJH J HJHJHJHJH J H$J$H(J(H,J,H0J0H4J4H8J8H ^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉMkúFE$n ^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉMjúFE$ ^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM jú%EE$ ^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM-iúEDE$^$`[^]ÐUWVSu=8 V 58 ZB8 K8 @8 D 8 }=8 u58 ] 8 M $8 U(8 E}u]MU@8  88 =,8 508 Eء8 MЋ48 }ċ<8 H8 uȉ]̉L8 UԉP 8 T8 X8 \8 `8 d 8 h$8 l(8 pU@8 xuƉU@t|HM$g@ËQ $|gƺBúB݅l\$E$GDX$[^_]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM}fúAE$n^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉMeú@E$^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉMdú?E$^$`[^]ÐUWVSu=8 V 58 ZB8 K8 @8 D 8 }=8 u58 ] 8 M $8 U(8 E}u]MU@8  88 =,8 508 Eء8 MЋ48 }ċ<8 H8 uȉ]̉L8 UԉP 8 T8 X8 \8 `8 d 8 h$8 l(8 pU@8 xuƉU@t|HM$#c@ËQ $ cƺ$>ú>݅l\$E$DX$[^_]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM bú%=E$>^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM-aúE@ËQ $>ƺú݅l\$E$DX$[^_]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM=úE$^$`[^]ÐUWVSu=8 V 58 ZB8 K8 @8 D 8 }=8 u58 ] 8 M $8 U(8 E}u]MU@8  88 =,8 508 Eء8 MЋ48 }ċ<8 H8 uȉ]̉L8 UԉP 8 T8 X8 \8 `8 d 8 h$8 l(8 pU@8 xuƉU@t|HM$3<@ËQ $<ƺ4ú(݅l\$E$'DX$[^_]ÐUWVSu=8 V 58 ZB8 K8 @8 D 8 }=8 u58 ] 8 M $8 U(8 E}u]MU@8  88 =,8 508 Eء8 MЋ48 }ċ<8 H8 uȉ]̉L8 UԉP 8 T8 X8 \8 `8 d 8 h$8 l(8 px5@8 U@|]ÉtMu$i:@HQ $N:úfEl$T$uDX$[^_]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM]9úuE$^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM}8úE$^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM7úE$^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM6úE$.^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM5úE$^^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM4úE$^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM4ú5E$^$`[^]ÐUVS`u 8 8 V ZRsM8  8 E8 ]8 M 8 E8 ] 8 M $8 Eġ(8 ]ȋ,8 M̋ 08 EЉ]ԉMء48 $88  <8 Eܡ@8 ]]EÉM=3úUE$^$`[^]ÐUWVSu=8 V 58 ZB8 K8 @8 D 8 }=8 u58 ] 8 M $8 U(8 E}u]MU@8  88 =,8 508 Eء8 MЋ48 }ċ<8 H8 uȉ]̉L8 UԉP 8 T8 X8 \8 `8 d 8 h$8 l(8 pEx5@8 U@t|HMu$1@ËQ $1ú ݅lU\$$EDX$[^_]US$\$D$${\$z{L$T$x\$L$$D$ l|$$[]UWVS}[;sfEEك fEm}m3ҋERP,$؋m}mu[33 ^ _UWV0} EEEuEU'M҉MẺU܉u؉}u=;ƋűEUtE؉EEEUMHEUU9Uv0uUEUEUMt ؃ډEU0^_ÐE܋M9MwE9ErMԋU+UM܉U؉MԋEtE؋UԉEUMEUQhE̅u 3ủE̋EԋUűE؉Uu؃ރE +ƉEЋU܋E̊M ЋẻU܊MЋU}ԋE؊M }ԋNju܉Uee;Uԋwu ;Ev+}U܋EMԋE+ʉMԋъMΉE ЋEUEnUVS[pLp@Ћ=u[^NOOPPPPPPPPPP==>?887:QQ BB;< ((''))9%%## 34455AAAAAAAAAAAR--&&112266  ..//CDSTEUHFFGGIJLMKKV000WX+""!!@@@@@@**,,,$p /  5*w_^\ZYVUTSEC=43-+D)$"              6#F, )289:;<=>?@ABFQR!*DL" ,/KNOP+01& $C.#567%-HM3'LGJ4SUVXYZ[\]^_`abcdkltIETWp~egfh(onrqmpuw|}sv{{yzjxiTSu\m1-Y+0'|W@Z0qcV'UVMLD$@?>~qUbpALXYeMTAa}'9ds 0c0|b'y[ #"%!ta~{~zeB$B{}ErIGzFE8nihH' #"%!K=dx yu; O/<# 8N^FfOH g $J$<()+2/7#*)$ 3nlKPQ"!N,R.  #"%!wvv(//##]\[ijst`m_ #"%!/#//##lop`$/#[WX|//#/#//##-.14k >?3$'0G}b&% #"%!Rera$;jd,0cI'5Z$C62 #"%!k1$ 9|ny #"%!$~I #"%!x{}w #"%!^|WzyZV #"%!~UbWZXYxeVa{}wd0cUb=PXzYI'e[WaZd0cVJ'Ub[WZXYeVad0cUbWQPZXY'eV[ad0cUbPXY'e[a|dy0c|y|y'~[~x~{}wx|yx|{}wy{}wzgf~z~z|yxx{}w{}w~_S|zyzx7|y{}w~:z~|xy{}wx4{}w~z ]&z&x{}w*&56:zho*hCD**hoh&hhigK.* 7 J F'&OSQPRIKK8#""A>$"A#"%(M0;5+AA? 5+G34BC###$;;>"">@"?1=?6,NH-2UDE)!9:/#> $#AA$A#A#??? @>>A< TL ?@@AAA?>A###"#AAA??AAA???A >??""T"A#>>> ?? ""A>>highigigigigigigigigigigigigigigigigigigigigigigigigigigigigigigigHigpigigigp+igigigigigigigigiggigigigigigkZigigigigig*:)igigig[igigigigigoigigmmigigigigigigigigig_igYYigigig44ig 4igigig vigigigigigig_igigigkigigigIigigig2igigig;igigigigigigigigigigigigigigig~wuSigigigigig,igigigigigigigig44igigigigigigig&igigig0ig8igig4igigt7542igigigigigigigigigigig/.igigacosacoshasinasinhatanatan2atanhatexitbsearchcbrtceilcopysigncoscoshdebug_offdebug_onerferfcexpexpm1fabsfilenofirst_procpsinfo_tfloorfmodfprintffrexpgammagamma_rget_prochypotilogbisnanitoaj0j1jnkvm_addresskvm_cvtkvm_declareldexplgammalgamma_rloglog10log1plogbmatherrmodfnext_procnextafterpowprintfqsortrefresh$remainderrintscalbscalbnsignalsignificandsinsinhsizeofsprintfsqrtstruct_emptystruct_fillsyslogtantanhy0y1ynstdinstdoutstderrcannot initialize parserout of memoryredeclaration of %sl;;l;;l;l;;;;;;;;;;operands have incompatible types: op "%s"operands must have integral type: op "%s"4=d?4=t?4=4=d?d?d?d?d?d?d?d?,?<><?<<>>>>>>>>>|=|=,>,>,>>>,>>,>>,>,>,>,>,>,>,>,>,>,>,>,>|=,>|=,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>|=,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>|=,>|=invalid member name: %sleft operand of "." must be struct objectvariable: %s is not a structureargument type mismatch: arg #%d: %s%s type mismatchDEFFDFEEEEEEEEEF"GF*GFF"G"G"G"G"G"G"G"GFkstat variables are structures onlyname: %s designates a class typemib variables are structures onlykvm$kstat$mib$ndd$incorrect special class prefix for class %s, use %sinitialization type mismatchinitializationinitializer does not fittoo many array initializerstoo many struct initializersillegal initializerargument type mismatch: arg #1: refresh$arrays of active class variables not allowed7\\7\C\7\\\\\\\\\\x[\\\\\\\\\\\\\\\insufficent arguments to %sggggggggggggggggPhgUhggPhPhPhPhPhPhPhPh!hlkGklk{klkPkGkGkGkGkGkGkGkGkjkkklkkkkkkkkkkkinternal errorcannot take sizeof void%s must take kvm variable as arg #1%s requires a struct variable as arg# 1:%s/%sPATH/opt/RICHPse/lib/%s/%scannot find: %s in library: %sdlopen(0): %sLD_LIBRARY_PATH%s/../lib/%s/%sdlopen(%s): %sclass_local_structclass_local_variablessbuiltin: %s expects %d parameter%s, %d sentundefined user type: struct %syacc stack overflowsyntax error~>>indirection only on ulong typesindirectioninvalid cast expressiontype_castillegal type cast<<^|&%/*-division by zero+newcannot renew non-array typecannot renew non-dynamic arrayrenewundeclared variable: %scannot take structure addressesaddress_ofse_lazy_value?:>>=assignment<<=^=|=&=%=/=*=-=+=cannot new non-dynamic arraystatement stack overflowrecursive call to: %scannot send more than %d args to attached functionsout of builtin_tree memoryout of builtin_tree node memoryvariablemember%s: %s is not an array=~operands must be type string: op "=~"structure comparisons not supported==>=!=!=~subscript: %d out of range for: %sinvalid subscript type><=<"continue" outside loop"break" outside loop or switchswitch/case type mismatchnon-integral case expressionduplicate default in switchswitching on longlong or ulonglong not supportednon-integral switch expression  duplicate case in switchoperands must have scalar type: op "--"operands must have scalar type: op "++"se_lazy_lvalueellipsisspecial variables cannot be parametersinvalid block name: %sellipsis only allowed for attached functionsfunction: %s returns no valuefunction expects to return value: %sreturn valuereferencedredeclaration of special prefix: %sredeclaration of builtin: %sunknown pragma: %spragma: variable %s is not declaredintegral constant expression expectedaggregateinvalid variable name: %sdynamic arrays of kvm variables not allowedabsurd subscript value: %dincomplete type: %s"CALL""VALUE"non-constant initializer: op %sdeclaration of %s hides earlier one{}-enclosed initializer requiredstructure members may not be active variablesinvalid struct name: %skstat contains no structuresSYM_%smissing%dmainundeclared block: mainargument type mismatch: arg #%d: mainmain must have a return type of intfunction: %s expects %d parameter%s, %d sentunused global variable: %svariable: %s unused in block: %sundeclared block: %sfunction: main accepts only 2 parameters typeless function: %s may not return a valuecannot pass 8 byte values to attached functionsellipsis must be last parameterclass code may not accept parametersinvalid class name: %sj  WWBw^J  \3:!}c#6~gP94c=@ q3H\Zc.j\mO;! L. Mp#z0|"ZԼ$>?& m:\|"0R4 ΜmOm0Ț^T:Ǘe Аf>ՍtO7.7L77........ }}}}}}}}}͌,ĿĿĿĿĿĿĿĿĿqhqqqhhhhhhhh!϶C;2;R;;22222222ܻܻܻܻܻܻܻܻܻC5,5L55,,,,,,,,wnwwwnnnnnnnn6Ͻ;D;;;;;;;;=E<E\EE<<<<<<<<2`22222222ZQZqZZQQQQQQQQc d < Bad parent ptr at %X Bad avl balance at %X ********* After deleting ********* After inserting%s[%d]dot notation overflow%s[%d]<%lld>%s[%d]<%d>LAZY_VALUE%s[%d](STRUCTURE)cannot evaluate member: %s%s[%d]%s[%d]<%llu>%s[%d]<%u>%s<%d>%s<0x%x>(nil)%s[%d]<%g>%s<%u>%s<%llu>%s[%d]<%s>%s<%g>%s<0x%x>(STRUCTURE)%s<%s>%s<%lld>\x%x%s(STRUCTURE),u,i,3,],Q,---P-v-j-000i000111111222222address_oftype_castcharindirectionnewnew %s[int((%s) longlongrenew%s(, *((%s *) ushortrenew %s[ulonglongucharstringdoubleshortuint + - * / % & | ^ << >> = += -= *= /= %= &= |= ^= <<= >>= ++--se_lazy_value ? : t::<<t:6<::p;p;;;;;:!( == != < > >= <= =~ !=~ && || 3>9>>>>?3?b????"@=for(; );se_lazy_lvaluebreak;return switch(while(if (AaCIC@A!CBBAAABoBABAerrorsyntax errorstdin"%s", line %d: %s: %s before or at: %s fatalwarning%s: cannot recover: exiting Out of memory-wcannot open output filecannot grow lib_treeout of lib_tree node memorycharlonglong...kvm int%s %s[%d][]%s "%s"ucharulonglongushortstringshortuintdouble%d%u%g%snil%lld'%s'"%s"%s.0%x%llufYXXXXXXXOZ8Z!ZX ZOYXXXXXXXXXXXXXXXXXXXX8YWWWWWWWWpXYXBXW/XXWWWWWWWWWWWWWWWWWWWW XYXXXXXXXYYYXYYXXXXXXXXXXXXXXXXXXXX}Y{ , } a[^[^[^[^[^[^[^aaka[^Ta=a[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^[^&aa^^^^^^^```^``^^^^^^^^^^^^^^^^^^^^`} = %c %s()se_lazy_lvalue++%c --%c >>= <<= ^= |= &= %%= /= *= -= += [].continue; break; return ; switch() { out of case_tree node memorydo { for(while(if (; } } while(); case : default: else { }cannot grow case_tree cDcccb$b$b$b$b$blbDb,bdddddzdhdVdDd2d$bg^ggf@fffe(se_lazy_valueaddress_oftype_cast((%s) ? : ++-- + >> << ^ | & %% / * - indirection*((%s *) &newnew %s[renewrenew %s[kjkkkk`lllll.m.m>m>m!kmmKn=n/n!nnnmmm == != < > >= <= =~ !=~ !( || && tltltltltltltltlt\t 1) problemduplicate structurescannot read kstats: %sstruct %s does not contain a "number" membermissingmember: %s vanished!link vanished!refresh_count vanished!kstat_read failed: %s{{kstat_chain_update() failed: %scannot modify: %s4((Cannot init kvm: %scannot find any kvm variablesunable to nlist kvmkvm variable: %s has no addressKvm not initialized: Variables will have invalid valueskvm_write of %s[%d](0x%x) failedkvm_write of %s failedthe kvm system is not initialized, variables will have invalid valuesMAX_CPUMAX_DISKMAX_IFMAX_INTSattachbreakcasecharclasscontinuedefaultdodoubleelseexternforifintint32_tint64_tkstatkvmlonglonglonglonglong_tmibnddnewnilpointer_tpragmarenewreturnshortstringstructswitchucharuchar_tuintuint32_tuint64_tuint_tulongulong_tu_longlong_tulonglongushortushort_twhileout of keyword memoryout of tree memory[]{}()@|!&#;:.,+*/=-><~%? \^SEPATHrCannot open %sstdin#!/usr/bin/tail +2(echo '#line 2 "%s"' ; %s %s) | %s:%s/%s%s %sUnexpected EOF^[a-z,A-Z,_][a-z,A-Z,0-9,_,$]*$Token buffer overflow ("!  z+*''-+,%((  %${%y#%%0ipacketsopacketsInvalid numeric value: %sFalse%s.%se%c%sinvalid character constant? Atoo many command line arguments/var/sadm/patchSEINCLUDE:-I /opt/RICHPse%s/../bin/se.-cannot get working directorystdin/opt/RICHPse/include -I%s -D%s -DMINOR_VERSION=%d -DSE_VERSION=%d%s/etc/se_definesr patchdriverdiskErrors detected. Exiting.%s.*%s/usr/sbin/modinfoUsage: %s [ options ]. Use '%s -flags' for details. -flagsUsage: %s [-dnsvwz] [-ccore-file] [-kkernel-file] [-ppaging-file] [-Iinclude-directory] [-Ddefine] [-Uundefine] [-o- | -ooutput-file] [script-name | -] [script-args] -d Run in debug mode -n Run without the pre-processor -s Syntax check only -v Display the version -w Suppress warning messages -z Complain about vanished members -ccore-file Specify core file for kvm variables -kkernel-file Specify kernel file for kvm variables -ppaging-file Specify paging file for kvm variables -Iinclude-directory Add an include directory to the search path -Ddefine Define a symbol for the pre-processor -Uundefine Undefine a symbol for the pre-processor -o- Regenerate a minimal script to stdout -ooutput-file Regenerate a minimal script to output-file - Input is stdin followed (optionally) by script flags -t tag Names the program when stdin is used Too many disk names in se_definesse requires Solaris 2.7 or newer unameB\YSSSSYSSSSSSSSSSS\YSSSSSSSSSSSSS5Y#YSTSSSSpTSS^T@TTSS TSSSSSSSmib2_tcp_tmib2_ip_tmib2_udp_tmib2_icmp_t/dev/arptcpudpcannot open %sicmpcannot push %s moduleinvalid control message receivederror reading datacannot read control messageerror reading control messageMib not initialized: Variables will have invalid valuescannot send control message%s%c%dcannot open %s: %s%s%c%sset%s ioctl of %s failed: %sget/proc%s/%d/psinfo%s/%s/psinfocannot open procdir: %s/dev/consoleconsole/dev/pts/0pts/%d/dev/ttyatty%c/dev/ttyp0tty%c%d?_Fatal: : Near line %d reference through nil pointer assigning to %sreference through nil pointer accessing: %ssubscript: %d out of range for: %s[%d]-)f!܇Pφπnil blockdivision by zero: (%s / %s)QC OPERATOREXPRESSIONCONSTANTASSIGNMENT_|@|~ wlcKsZHۚ@Xw՟ʟpedot notation overflowcannot evaluate member: %sstructure slipped through run_address_ofreference through nil pointer: op ">"reference through nil pointer: op "<="reference through nil pointer: op ">="reference through nil pointer: op "<"T  $a=Creference through nil pointer: bsearchcallback function stack overflowreference through nil pointer: atexitreference through nil pointer: qsortreference through nil pointer: kvm_declarereference through nil pointer assigning to: %s(nil)arg count overflow to intf functionreference through nil pointer: intf function@default@ignorereference through nil pointer: signal%d%llu%u%lldreference through nil pointer: indirectionreference through nil pointer: assign from %sLU0   -  a p.  u 2   -  M G~Lz NWmainmain vanished!Warning: bsearch compare function stack underflowbsearch compare function: %s does not existqsort compare function stack underflowqsort compare function: %s does not exist04:02 PM 01/05/05@(#)se - Version 3.4%s (%s) for %s%s/O J+Z+j+z+++++++++ ,,*,:,J,Z,j,z,,,,,,,,, --*-:-J-Z-j-z--------- ..*.:.J.Z.j.z......... //*/:/J/Z/j/z///////// 00*0:0J0Z0j0z000000000 11*1:1J1Z1j1z111111111 22*2:2J2Z2j2z222222222 33*3:3J3Z3j3z333333333 44 3 J u U a   k c c    obo%op&|&oo zR|0 ( @  <(S=(S>(S?(S@(SASŒB(S˒3 YҒ4@h`ڒC(SߒD(SESF(SG(S(' H(S I(SJ(SK(SL(S!) dR(!3<M(SBNSG$ dOOUUP(S[QUc#3dRlRSrS (SxT (S~ dRU(SV(SWTW-@o,|n0@YXUY(SZU“[(SƓ\(S̓](Sғ^(Sד_ dRߓ`U"3aSbS Z2\ 5YcSd(S!eS'fU.&$l5g(SAh(SEi(SJ+ mQ%ZYj(S^/pk.pw*xh~k(Sl(Sm(Sn(SoTWBBCװ۰߰ #(-3,16:>CHMtplHͻػ߻D %)7;>AEIOU^a;dhw~8Z@[I\P]Y`fk p v ''& '&&*.%0Q7(< FJKL$O*O2Q7Q@PIQPQVQ^PkPuS|ST`3 @4 4 5 w7 7 j 7 @j7 jH8`ttDtP4 Pl $ihfT ll|0l(4T#$%t&T'4(**+,t.T/4011234t5D799;=d>D?$@ABDdE4GHHIJKDMOPRSdU$WXXYZ[d\D]$^333333 @ GNU C crt1.sas: Sun WorkShop 6 99/08/16GNU C crti.sas: Sun WorkShop 6 99/08/16@(#)SunOS 5.8 Generic February 2000GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GCC: (GNU) 3.4.3as: Sun WorkShop 6 99/08/16GNU C crtn.oas: Sun WorkShop 6 99/08/16ld: Software Generation Utilities - Solaris Link Editors: 5.8-1.290.interp.hash.dynsym.dynstr.SUNW_version.rel.got.rel.bss.rel.plt.text.init.fini.rodata.dynamic.ctors.dtors.eh_frame.jcr.data.data.rel.local.symtab.strtab.comment.stab.index.debug_abbrev.debug_info.debug_line.debug_frame.debug_pubnames.debug_aranges.debug_str.debug_ranges.shstrtab.stab.indexstr    p"   o%%- B|&|&6 B&&0? B&&p C4+4+H0404.Ncc TccZ@c@c|p 1 Pb  k r  y H\ \` ` 0 0:@ @ 4;. oG07070100117b05000081ed00000000000000010000000141dc5ea20004d578000000880000000400000000000000000000001d00000005reloc/RICHPse/bin/se.sparcv9ELF+=@8@8@@@XE /usr/lib/sparcv9/ld.so.1  !#&(*+-/124689:;<=@BCDEFGIKLNPQSVWY\^abcefhijlmnortuvyz}    "$%'),.0357>?AHJMORTUXZ[]_`dgkpqswx{|~   W ! `'3 $? y@8LU 0k 4 y@ø &   O $H@'  8Lj?HO X W`hk rx~ B`     x I @X ,>!x`59 @FO XxW @gk@w Qp  N` @0   ( .1`5 8? `MX \`b vmp}  @  `pG`@  2<!!+ T5@ (HO `@krH A   W@@  `` !~0 $ ?4HD S`X`@e@hmt{`4` 2X@ ` A@X!4   l~0 K 2 L @  `   >&@. @<@FLS`W_fm> |  ^ @8 <``@   7d"@G`* M3 5B nIQY>a P`jry>@  +<@@` 1L`   `4  (@ HH*1> @TP8c _ 8v~D   dLX C  > ~`@ @( H d    #X *` 1` 7> = F M vP g3 l q  _ w @P 3   =  Xx   @    p @  +  >(@ `avlfirstlongjmpkvm_readse_lex_initLex_currtokse_init_mibse_end_kstatcopysignse_kill_double_quotesrun_next_procLex_doubleValueilogbSe_kernelyyerrflagopendirSe_functionsse_refresh_mib_variableasinse_free_user_typeerfcavlbrdthatanhpopenioctlSe_kvm_var_count_exitclosedirse_function_call_edata_Qp_dtoqsyslogavllastSe_flagsSe_basedirsetjmphypotabortse_fix_typeunamese_new_array_typey0y1valid_namepclosese_update_extern_variablesysconfsetbufavlgetstrcpyse_get_structse_add_ndd_typeyydebugnextafterSe_kstat_var_countatanscalbnexpm1vfprintfavlnextse_run_blockyy_yyssignificandavldeletescalbyy_yyvstrtoull_lib_versionavlfree__huge_valse_update_kstat_variable_PROCEDURE_LINKAGE_TABLE_signalasinhstrrchrputmsgkstat_chain_updatese_get_keyword_finij0erfj1strcatse_new_string_Qp_qtouxacosldexpse_basedirSe_symbol_table_GLOBAL_OFFSET_TABLE_readdirmatherrputcdlopenisnanatoise_kvm_addressvsnprintfatolSe_kvm_open_flagspowlgamma_rkstat_openynfputsrun_get_proc_environLex_inputavlinsertkstat_readyyerrorgetgidse_add_disk_nameSe_versionatexitSe_core_filese_parse_initse_resolve_expressionavlinitfclosebsearchse_refresh_extern_variablefseekse_runkvm_nlistcbrtfopen__deregister_frame_info__ctypelog10filenose_get_variableLex_currentFilese_string_savemodffwriteacoshjnrintmemcpygetcwdsysinfose_end_nddgetmsg_Jv_RegisterClassesmallockvm_opense_get_block__iobse_cleanup_tok_symsse_update_ndd_variablese_freese_run_assignse_warningstrncpyerrnocompilese_init_kstatkvm_closeftellputenvLex_line_noperrormemsetSe_programNamese_clone_arrayse_refresh_kvm_variablekvm_writese_end_kvmstrerrordlerrorSe_os_versionstrchrremaindersprintf_sys_siglistnlgamma_etextceillog1pdev_to_ttyreallocavldepthrun_first_proc__dv__strncmpsetvbufyynerrsavlcheckseekdirfflushyytmpfmodse_end_mibfrexpstrtokstrtolfloorse_refresh_ndd_variableaccess__register_frame_infoyyparsese_compute_subscriptse_lex_endSe_mib_var_countse_address_inheritstrlen__dso_handlese_add_kstat_typeSe_paging_filese_update_kvm_variablesetegidSe_errorsse_area_into_structLex_integerValuese_fataldlsymkvm_kwriteyystatese_debug_statementmainse_struct_into_areaatexit_fnatan2se_structure_assignmentyycharyylvalfgetsyyval_DYNAMICgetenvse_refresh_kstat_variableyypssqrtyylexse_allocyypvstep_startavlprevkstat_closestrcmpse_generatese_init_kvmkstat_writese_init_nddfabsSe_type_sizesqsortlibkvm.so.1SUNW_1.1libkstat.so.1SUNW_0.7libdl.so.1libgen.so.1libm.so.1libc.so.1libelf.so.1libsocket.so.1libnsl.so.1  ='   =(  ! =(  , ='  8 ='  B =' 80@4~0>Gw @`d2 L@`_ @`&l ^@`c -@|`<jrN  @`t @`p  @`aD/T \@`(0 M@`8eV $@}`i J @`  W@`R; @`h% `Q S@`X  @]`6gB :@@`K9* +@k` [#0h@a`*p #ܐ @Y@g, @  +0 c㠖 r@@O@U@#/p`] `@` ]X@Y" \`t\X@ ?``8]`@9]` ])@@@ /Ю  H`]@`]@)]  `(]^`@]@@%@@ 5*p Ha `@'15 +  hZ(@-^ p*?^  5*p Ha!`H 15 +  hZ0@^ p*?^  b (p @@BC\#p  Z (`"@Z @ b*0  @@B(Xcp Z (`H Z @ b*0  @@BXcp Z (`H Z  @EW+-b`)0 @tcpO`,0 @ '"(  $   $ ?$ @? x$')M$$!$ $ $ $ $"$$@SA$(\cp`+0 ,p t $`$!t @$  @D[瀢 @ *V _Y (\ Y (@S*t@S x``(p +0 )p  @ [p`$t @!$$  @D0t  "@c!C_߀ "@EY ( x@R`- (p +p @Zcp$t !$t @! $ @D ׀ @6_׀ HhY (O_Y ( @Rː _ "or`(Y (_` Ā_Y (o*}w`h{Y (] @AY (@l*?uo x  * @ @Qא!oG/ (p @@Qΐ!h]%  *0 @QŐo x` )0  @Qop!` +p *0 4 @ ᘐ@ @Qo]   )p * 4% ᘖ@ @Qoo x`* -0 '4-@!`@ @Q`h@RO _׊ "ot`(@RG _ߚ "op`(@5`H^ ( 'o^ `1`+0 *@ #@X@^ 0\ H`"H ^ P*@   hf@ o^ ^ [@ oX`0^ ^ (6 F|FF|GF|F|FFFFFFFFF@-`@`H ` (@# ^ (*@>`o^ 2O^ (^  Y *@>   d`h> h ^  ܒ*^ (h< ֒z4< @ #`H^ ( @<n^ @!#@`8H^`(  1`,0 + Z `1`+0 *@ "xX@^`( @M^` N?ۀ`YH 0`*p )pc[ ;^` 8^`(o4^ 1^ (oĢc@#Hb * +p 4 @ @a @ @P b"`?`?H^`+0 34*  @ " @@Pec@#@G`*0 4 +p 3 a @g@PM^ 0\?v# H "Or ^ P*o   `oif@o^ ^ [c#oX`0^`0^}`H`"Oy`^`P*v`` opf@o^`^`Y`joX`0IIKKKJtJtKJtKJtKKKKKKKKKKKKIKIKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKIKKKKKKKKKKKKKKKKKKKKKKKKKKKKKIKIHKHK HHKKKKKKKKJI K|I KI I K|K|K|K|K|K|K|K|K8@d@;H2H ^P^@h[ @ $"#v h^ p*?^ !` *  )0 4@@   @N h2 !^@Z@oZ `@^h*Hh$  )0 @@NXo^@ *p +p 4@oה@O x x@ ^ Xv Xt p &0@  @X(P2 @ @ `$Q^` ^`( hJ^`@G^` D`cH@  "@`FH @ "@,`GH$  H2N`G&`h.&`@@ @H " H'^`@&`h#&`@&`h &`@Hb@^`@ w&` h>`@HV`F&`h &`@&`h &`@10w&`H>`@ #2H H`cH  H`2HZ P`H H#Z`P@ #H  `#H h *`H @ H`H ^ Pxd8`H`?`H ^`P$8`?H& H  "@`h "H   H ` @ h `H  2H  @Hh `2H   $@ `dHhd`dH  Z Z`Y`Y @ @  h@@`HH## ``*0 (p !4%@ b>@ ` +0 @M`h1`+p +0 aPZ`*p ,0 !4@  Ж@ o`^`0[@ˀ #@X#(+p Z00>@ ? \   ~t c@ H@`H )20 *@b^` $^` ^`(@ho^`; o)p  x@ z@`H ^`( ;^` #O'wov^`\ roX`0!c *p o c 1`, ,0@ Z @^`0Y@? H`"O Y P*    oӑf@ o^`^`X`oX`0^` ^`(oĐ@EZ` B`cH>`"@`FH`@`"@ `GH``H2J`G"`h."`@@`@Hb` H'Z`@"`h#"`@"`h "`@HR`F"`h"`@"`h"`@Hb@Z`@ w"` h :`@10 w"`H:`@VWVWVVWWWWWWWWW<TVpVxVTVxVpVpVpVpVpVpVpVpU|@ d@`@"@Y^ H`` HfhL Hb ` *0 @Ls H`"H(^ @`^ @@S <`(p\Z *h`\ p" H6`  c t hdO$\ p*? H`@O<`h1[ *h,\ p)6`  t hO$o\ p` *0 @L,"13 `(p #4,  @8 @ 4@L@  )p @ /c`*   @ %h,! *  @@ #p6!`*  @ cx"&@ 9 * @h Yax@ @ *^`*^@I @b)0  $@@#x`$#x; !a$@5@  `)0 $@@`@`$`@' "ܰ\`*\ 0@ @@o$@"?@Z @ ϐ@ Ð"?@ \  `* *0 4@@#@   @K o@@3`a)0 $@@  `H`#`H!c .0 @$c@^  P 9 O .0 @b((p?@" $H H>? o@I@'@`H 'HO`&``&d@^p `"H*#`"@'#`&h#@^&`Y  h"H`d"O_`p0`/p`$OH>?`i@H@!@`Oв '@oʹ#`  $"@G H H @-``@d@% )p #@Jh!;wט+0 @ *0 Z%X`@X`#ؐX` X`  X`(X`0X`8wwwwwwww'``)p  DH@bh`"H>^ @^`Y `dO^ @`  f~t@& <^` + \ [ [` |t|4 "@ H  \ p\`p|4|t@O H ^`p f~t@Oߟ< 1  (p  h  ^`Z Y` ~4~t@Hm^ p  ^`p~4~t Oh Oo^`@+@< oq-1%  , oe ;o,  x@v!;w'` 'w-  @ "Z"Y` Y`Y`Y`(Y`0Y`8Y`@v PZ"Y`Y`Y` Y`Y`(wY`0w?wwww/w7wGwOwWw_www'wY`@Y`8 H^`w ?w'@0Z`    ~td@/+-`+p +0 `@h ^`p  d~t@'#ؖ wנ D O@o^`p тX`p `o͠ @v P)#  ,0 o`@` -0 oߐ`@ dH@J^ ^ Y *  h@JӠ@  `@ \ pdO* @Jā@J\ @o; o)p  x@ a@ !'w; o)p  x@ a@ "'w@; o)p  xa@ @ "'w^`@ x`@ * ;@ @z!"'s @; o)p  xa@ @\ "U'w^`@ x`@ * ;@ @J!!'C @; o)p  xa@ @, !%'w^`@ x`@ * ;@ @!"' ; o)p  x@ a@  'w@`"@ Z`   (p  `@HĞ@`$"@Z`@``@"Z`@  "@  H"  H3 h) h/"`X`0"``H "O`   *0 @ @H@ a *p @`H h"`HH "```)0 `@`h "`@"``b*p cx "cx@ ;o*0  xa@  'w ^`@*@@h^`@@@`O # 1`(p *p([@ ^`0[@ d@ HOY P*^`@`"G^`@`+0 * 4 @b<`@D  @H( ^`@*@hLo^`^` @ @`H\`( \` o'wo^`[ oX`0`1`,0 + Z\` \`(o'w\`0Z? H`"H Y P*@   f@ o'wo\`\`X`oX`0o'wklxklkklxlxlxlxlxlxlxlxl,kk|kkkkk|k|k|k|k|k|k|k|j̝@ ;`o*0  x@a!@5@ 'w^`@ x@'@ 'o^`@ x@@ 'w^`@ x@ @  z' ;`o*0  x@a!@C@c ]'w^`@ x@5@U O'o^`@ x@'@G A'w^`@ x@@9 3'o^`@ x@ @+  $'w; o)p  x@#a@  !'w^`@`* @+0 dh 4@ `@  @Fΐ ; o)p  x@#a@  'w֐^`@`* @+0 4h 4@ `@  @F @ ;`o*0  x@a@@!'w  x^`@@ @  '@4@`"@#^`8H`H+h^``H&^`@#` O* )pb(@H` .p @@FL hY @^`0 @ ` +0  @F= @C@`@o   *0 * 4@ a@<  @F! ^`@ x`@&,0 h ;^`?\    *0 ڒc`@1? Oo^`@@@ !'w@, `"@Y    *0 4@ * `@@E؁?\    *0 c`@ O`*p +0 4 @0@* @o@@ @E ;^`@ x*p @@!h ^``$Oo@ !'w@^ h0."H  `& ` d2O^ p H`@ ^ @Y@H o^ pL@<   `(p Y@ ݓ: H@4O^ @^ p ?ހhF ` ^ @o^ p@`@@| /^1 * ) '2@y#В / )p pc@z#ha*#+` )p @'!X@v) 2+ '2@ , rؔZ#%`.p #+0 )p 1+p `@\#@cВ @XcaX@L t# ?2 + @Z $ #2`,0 \#".p @Eht#  )-p  #ah@;+, 2@@EВ`\o*p  .p ]#؁@#%2`)p @\#a @`-  Z\ @ t 8z$\ ?@`H -;3)0 Ic耤`H cݎar!*0 @ qc)/ -p ,p +2!cap@ @ c@ Š@` ,p %4*p /h^`@^`@ڐ ?v`8^`@` @Dg`^`*^`h@В t# / /p @ *p a@c@o!)P/#L \-p "AW#r/ + ܚ#PwU/p b`a'ݠw+0 `=-0 9@wow `* @)@E `+p  @fX, `@ c @]c\X@Q ?@| ?t ``*p +0 !O)0 * - @h c@# @7#4 \ :` ?oO@\+'`-0 + 4  @ސ  @CÐ of @G-+-0 + 4@@b @ @C ho"#oc^  z Z % O`*0 @b(@Db x@ xH "H(? f@* ?@(J;@DNt@"ŀ u`p\p th@DD 8]r [`0[`r 0`[`0r G" [`(D'h[ $Oot@o< +p@D'; @ tO oΐ! x'ǟ, wϚwߘbw@Dw " * r @(r t @hZ X`p*p`X]v (t ]@] (㾰 8 @ @ @"H  !^  + ;  @Hb@ '`* (p %4@@"H?  @s @B  @ ^ A#^@h@C  $@8v@.@C x@ xH "H`9O?,0 (p "(f@@ ?@kJ@C:`v@ot`0 '`(p obx$2Ot`0ov@@C x^t`0^`0 o$`b^  )0  @2[#p Z (`"@QZ ^ ` )p * '4%@@` @B`^_ 0^@\ "^ "@Ho^p`@ ^@Y@H`o^pO<  `*0 Y@@:`H4O^@o^pF` ^@o^p< ,@C/;` @ t?O ov@@' x@C^@g x H "H`#? ` f@+ O@.p"(@ ?@9J@C8`w @ot0$2Ot0ow @;`o*  x@ @>! x'ww@B^@5 x H H(w?  f@,p O@+b(?@ J@BБ; w @oqt0< *@Bɑ< @ RtO ow @$2O\t0Fow @< )p@B8` @ 9tO ow @@  O  H * *p"(f@ @?@J@B<h< ,p;@B @  tO @^ * Hh  `@#d@5\ @ @BĀ H`O\ p `@4dO\ @@B* H@B @Bo\ @` G<``*[@ @ o@@Bw H\ @o@"?А`G <``)pZ H@4O\ @@Bc\ @o@@^ @@  `@d"@ H@BF `%O `H-p -0@"(  f@ ?@J@A:`^ X@v @X`h"@`HY`h2` `H^ @`Hq`@!`HY`p*Y`h`H Hs& Hh^ @< *0@Aב8` @ `tO oؐ  ]@[`<+p]Y` M@h(\ p"$ H ` dO$ ` H @  \ @Y@H`o\ pL@>`  `+p`Y@ P:` H4O\ @\ p*? ` HOқ<h(\ @8`> o\ p H `G<  *0Y@ o@@A H^ @o@`Gq <  *Y@  H@O^ @of0 ` #* * `%%!1/-+@ ` Z#_c` -0 L, , @LO)p )0 * * ;O/O+cb@ $!b!"??scs#"X"`` ,p *0 (p !L1L-O@@]#\;1` '%- ,  %`\㐗< *@ h4/%$@+ @ \c;0%@@K<0> @,,t@\c\ tc '% (p c@#%!c`-p )0 ;%% -Z-[㈢@/;O$@`, -@'\"= hu@@c`,0 @ c`@ր`@{b`,0  cX@ʒ?!cX.0* ?ڐ@a d @% b , @X @YX @dH! `9`)0 *0 h @(p :" * @ !   .0+0 @`$O` b *0 #X`@  )p @ 􀤿@`@2O``O`@`@  b, X@2O```Oh*ʰ ?`o^ @\ do$X  ;`* )p +0 )O  `%-; (p ;  ,c % `@ )0 ]`* :,v"*p$@cD@ $H 9 /p - "h`@)0  =  *0@G;; *0 , "ho )7 /0 @?!bh*g `@q`') .0 -%- @!c [#@ g!c1/ `+0 (p - !%  @db bhD@/p!d8H 8`)p9`*0@G@ oh*- > @z/p@w/p  }t|4"O D\@)pDt㐐\c@-potc@ do $#X c*0 + b @ )p \`c? u Gd$X?oa#cO6% *0 @>'O`/p  o%!;   +p ; *#%@ %@Z`, -p *: t"$@ #D+@`dH! 9`(p ,h`)0  :b (p@ 1:)p ,@h 1-  +p #O @,0 b, -p O'L-L @!"tc`Ot#%0`P(p -p Z @ H@?-p @ t" "  \"*p  ]@ r \"$8B]o]?@3@`8H \`(!P`1`-p )p[ŀ]?@y@`8H$\`(+%P`1`- ,0bY \`0Y H`"H Z P@- !"@  8- , @="А 8@>1@-  ,p `0)0 @ @#`+ \$b(p t H@t]?$(@>t t" "\"\rw''?'?d2H w'5- @ wwϔ]?  oG\`0X@ H`"H  Y P*@   f@ +? O`- 3`*p( `@m2 +0@@2c"@(!]?@!@`8Hn\`(+!P`1`- )0@Z\`0Z H`"H  Y P*̀    f@#H  8!  * @ @=R 8@>%!  ,p 0@(p @c Z``* t$c, t H@]?$(@>t u " ] \q w''?]'wo1'  (p oc(\`[`oX`0\`( \` o#o\`\` \`(oo\`\`( @ \` o!\`^ oX`0\` \`(ooF\`\`( y\` oN+\`\Io9X`0o\` l\`(o@ H* @= t"  "`\".0 ]?c@t \"%8\"]r (]]?oY H*p @=t  "\]?* v H\'`8\]t`(]]?o= H@=f-   v" "^" ]?*p @s P^"!`8^"]w`(]]?o! H,  @=H@#t" `"%- ]?\"cXq \"#8\"]q`(]]?o H@=.*  ;t"`" , \"@]?`u \""`8\"]s`(]h]?o H* @= 1t  "`\* ]?cht \%8\]r (]L]?o]"@:Y  H,0  @<@t "`\* ]?pv \'`8\]t`(]+]?o H+  @<Ӡ1t"  "- ;\"]?xt` \"$8\"]r (]]?oɠ`#OƐ HY` ē,0 @{"2O `@ wDb``"O- , @;͐#o H*p @< ub"`]b* ]?v ]b$8]b]u(]]?oS-5*0 Ia @]?1 5 , @[a(\ @po\ p@_wY p*?Y ho 5`%*p -p !P5h@  `H!H#h= *0[@ooq5  /p `@ * P15(@aH \H )0 @4 (;``tH-$(oPtoNsp-15';,p \aH 5]? -p )0 @ L @ b5`* Xa( \ @ o\ p]- @o$ubt+p Yb"l `!Yb HY `$,p + @\"s!H)p \"4;H @5, x\" x@x\"\Xu`p\"tX`H*0 ]?`]?H*@!)0 `h` `* a  (p ,0 )4@@@E @4) t+0 ouHĀK`8H}\(/P 1`+p )p@ Z#]?``+ * 4 #`@ @4`o5 +0  Ia!Hk'!5(p ]a0c'\ @?io\ p\0] H"H  Y P*   `f@!@+ `"@`Hou`P?"G\Z*@@ 4O/#]``* )0 4!@:@Ȑ` @3`oވ` -  o{(o\\( @ 5\ oǀ!\_`oX`0+\ (\(o'b)p  @"\cp? Z (*o'+5*p \aH  5] (p +p N! @b!5*p Z!(s\ @p?o\ p#7/.0 @* p 7(@!H \h)  +0 @@3E (#9/.0 @)p ራ; h'9-pt  a$(H Z!  (p  @3(h;``$h*0ot@t* Yb`!Yb 2HY @!@)0 +0 @\ouH#]`,0 - 4 c @ @2 o5`)0  Ia!H1!5 - Xa0 1\ @?o\ p1b )p  @";\cp? Z (*'o* ;t"Y ]?taH\"r hoWt"`O: o8Z ,  t"]Z taH\"r hoKt"`O oZ  p+0 @3o@u7]?`*p r@ ]?]^!hw`@]  @p`X`* @9-  ]!@  @p`X`* @/ 7`* , @ p!h(`H !(> ,pY-s@9*0 -0 @ @ !(`H !(;,0Y os@]? @X`@o` 8@3, 1 t(p @]?@ `#br + ]?\s \Zcp! (\ @]?@!\ Z (* -4t *  \ ]?#4)p @!\ !wGZ (C]?=`*0  \10``(p \,c_@ou  ,p +@2ˬ;u `]?* rah]#]]u]?ĀH]`8HI\(-P1`,0 -@ `^ @2,p + u;]?`.0 r]!p" ]]q`]?ĀB]`8H \(- P1`* )p@`0[\0[@+ H"H  Y P*   `f@@B@`8H\`(-O1`,0 -@ #Z\0X@+ H"H  Y P*   f@ @R@`8H\`(- O1`* )p@@]\`0[@ H`"H  Y P*̀   `f@ @ G$@q)L ="@`L<"O ` * -p %4@@`@] @1B`o\`0Z H`"H  Y P*̀   `f@@ G΀$@*)L="@L<"O`.0 -p %4 @a`@, @1`o~O逊<-  * @1ao  ,0 @ @0xo`~O<-/ ,0 @0!o   +0 @@0xoo\`\`( t\` o@\`X`oX`0j\` g\`(oo^\`\`( @ ^\` of@\`[aoQX`0T\` Q\`(oXo'\\( H\ o.\Z *+oX`0>\ ;\(o!o\\( @ 2\ o\[~+oX`0(\ %\(o @1W*  tb]?r\b#\b]ou @1H,0 v"]?r ^""`^"]ot`OA o?Z  ,p /@12@+t" ]?+ r!\"'`\"]u]?ĀH]`8HO\(!O 1`*p -@ bZ - /@1 +v" ]?* r a^"#^"]r]?ĀA]`8H\( O1`.0 ,0bP_@ \0Z+ H"H  Y P*   `f@@D@`8H\`(!O 1`*p -@ Z\+ H"H  Y P*    f@@q@`8H\`( O1`.0 ,0a`Z@ŀ\0o[@\`0Z H`"H  Y P*̀   `f@@ Gd$@* L="@L<"O\  `+ -p %4/@a @ @/ oH`~O逊<;-` ,0 @/!o; ` -0 @@/xo2\Z +oX`0\`0Z H`"H  Y P*̀   `f@ @ G$@*)L`="@L<"O` * -p %4@a@u @/Zo`~O逊<! .0 @/Mo  - @ @/Dxoo\`\`( @ \` oÐ@\`[`oX`0\` \`(o\( @ݿ\ o=oQ\`\`( ݶ\` oY@\`_`ToDX`0ݬ\ ݩ\(o'ݥ\` ݢ\`(oDo\\_`~+oX`0\( ݓ\ o1 +p * %7@ZX]t`0]\ NrX5 )0 @ \@]?@ +`+ 4, -!ؖ@  @.ː .0 @\Y`_`8f`(` $HY` -`* 4 ,0  @a @Ȑ  @. \Y`)10 +p @`"\]`xo@sb`]? +0 ?@ Xcp @_? O/_?]( +@/V _? "o#t (+, @.z o@!6 t %  +p @.lb(\ r `*0 %1 , @ 㠢 I\G@ W\ 2HH@.Q O (o-\ \(o= @/,p + v" ]?`- r^""h%^"]q`]?ĀH]`8HO\(1O 1`* )p@ Z )p -@.@;t"`+]?* r "p\""`\"]q ]?Ā8]`8H/\( O`1`,0 -`pX@ \0X@+ H"H  Y P*@   `f@@@`8H\`(1N 1`* )p Z\( ̀i\ @(@`8H\\`( N`1`,0 -cZU\ R\(o\`0Z H`"H  Y P*̀   f@ @ GF$@* L="@L<"O>`* -p %4;@a@ @-o*`~O逊</  ,0 @-|!o` -0 @ @-sxo\`( ̀\` oŐ@o\`os\\]}+omX`0\`[ oX`0\` \`(o\?+ H"O~ Y P*{   `ouf@\Z q+oX`0\0o[\`0X@ H`"H  Y P*̀   `f@ @ GȀ$@*)L="@L<"O ; `*p -p %4-@a@& @- o~O逊<1   * @@,!o   ,0 @@,xoo\`\`( ۄ\` oÐ@\`]oX`0z\` w\`(o\( Tp\ o @-)0 + u; ]?`* r]bx"]]r ]?ĀO]`8HP\(N1`- +0cZ@ @-{-p / u%]?.0 +rb]'`]]s`]?ĀI]`8H\(-N1`* )p [\ \(o\0[@+ H"H  Y P*    f@@B@`8H\`(N1`- +0b]\0X@+ H"H  Y P*    f@ @R@`8H\`(-N1`* )p [\`0[@ H`"H  Y P*̀   `f@ @ G̀$@q)L="@`L<"O1` * -p %4@@`@+ @,`o\`0X@ H`"H  Y P*̀   `f@@ G뜀$"@*L ="@L<"O!`  -p - %4@a`@ @+ߐ`o~O逊<- * @@+Ғ os!  -0 @@+ɐxoj`~O< -  @+!o]1  )0 @@+xoTo\`\`( B\` o@\`_`oX`08\` 5\`(oo^\`\`( @ ,\` of@\`[aoQX`0"\` \`(oXo'\\( \ o.\_`*+oX`0 \  \(o!o\\( @ \ o\[~+oX`0\ \(o + @,$tb ]?r\bo"  @,*p  t]?r\o'`](p oub- osb]?+ @ou" )p @+t]?r\]?v \]ot @+(p +`t)0 @]?@ #`` 7r * \Z!`"@\v \or!` , +@+Р@-@`t")0 ,p ``7@ "^!`\"r`\"ov!` ,0 @+;9 t"`+0 @(@$%'9-0 @]r \"owu ,0 @+@7t" /p  !p @)+7 , @Zhr \"o^rh +p @@*"oU#` + @*"oK @+u,  @`@* u@`o<"  * @+e@@t" /p   `o." -0 o)ub]- @o#sb]?)0 tb]oq`]?,0 u]?r`]]ov ], o ub]]?- @s`]os] * @"Y q  oq@'-7-p `(p p 7(@aH Zh;1` *0 @*: (9``$(*pot @*+0  u]?r]?]v ]\@&-@`8H\`( N 1`(p +pa(Z+ @oub\`0\- H"H  Y P*   `f@ @ 7`+p @Zh@  @p`X`* @@ ! - @)!@ u \@,!    +p 1(p )p @ @ \@`b@`@f"@\b@ *p    `@)$ `$ `\*\\@9! - ;1+p ,p @@ `?\"\ $\@X` @CX`*X`\@ X`@ \Ozd@f@9 2H\!@)} \ ݤtt/17/p `*0 ap)7( `Hh!(< )pY os@2O\o ` -0  @)TcPo/"?tY "q o@c0+p   `@)@$ `\o$ `o{@ #owo)\`\`\3-o#X`0ow\`( @׿\` o(],0 opb+p oq"װ\` ׭\`(o] * @"Y q  oq@], @ou"]]?.0 r`]ot" '7 /p @,0 !p/7(!H [h-` +p @(ߐ`( '9 /p @.0 ሩ; h9-0@t a$(H Z!` - @ @( h;``$h*0o]t@ 7;, `,0 p7( !H ]h  +0 @@(( 9')p @,p ሱ; h/9.0t a$(H ]a  (p  @(h;``$h-po"t@ p+0 @)K@t7]?Ђ`(p r \]?Yahq @\  @p`X`* @9-p @ Z!@  @p`X`* @ 7 `, ,0   !ph(`H !(<)pY+s@9`,p *0 @ @ (`H !(= +Y os@ + @(@t7]?`-p r\]?Xaht\]?q`]?\w`€\ "rZ*"9 .0  ]!@  @p`X`* @;7 `)p +p !ph(`H !(8`-Y19s@  - -0 @@ a!(`H !(< *Y o~s@]- rb aH ! H`OqY P 'o!1  * @'Ð#pod]?, r aH  H OVY P*gS%` * @'cpoI]?* 'Bu a@ % H O;Y P 9%  *0 @@'#o.]*p @r H 1 HO Y P g1  - @ @'r#o @(<-p +@ t`"+ -0\@]cr\Y`ps`]fX`h H @ ?o x-0  ;@(]!r @& @( H 8t`@( $@``r +0 +@+ #```)0 \` @ &v  & (@'v r \`X"r ou @'-p + t"`"*p -0\"@]r\"Y`hs`]fX`h H@ ?o @'ǡ)p  t0"] \-0 @w`c\Z8or  @'*  t"` 0", ]@\"u \"[0ost` @'(p t "-p 0]\s`\Y`(o^u  @')0 #0ub  "*p ]@]br]bZ oIu @'s* @t" `"- 0]\"q`\"]Xo4s *p  @'\@;u`0", ]@ ]#s`]^ @ot] -p +@]@'D-0t" `"* ]\"cs \"Y``fs\`h H@7 ?o x-0  ;@'$]!r @$ H@'#@ 8v @'&``r + @-p #``^ )0 @ $t#$(t@' r  ^ X"r ou x-0  @&\!r @$@& H 8t`@&$@`r (p @-p @ #@  `].0 @ $ tc $(@&tr ]X"r ot @&ť.0  tb `" 0]- \br`\bX`ow` @&*  /0u" ]]* q`]] oqs @&+0 @u `", ;0]]cr]^ o\t - @&@ 0tb` "-0 \bcX`oJw`]?* @oDu]* o>t"]- @o8u"]'@]?)0 +0 r`@]``%]o'v"] , Y q  oq@ b`)p + @@lc@&So t+b`* -0 @&Gov"@&* x, -tb+p  " \b@&5cow`], @ou"]-p %r".0 ],0 -5 5@q!@ora(']+5(p * \!(rp]v"ot!(-0 os] , "Y pq p ?s@*p (p ]b/5r(d `,p @#"H\ pc@$ \ p*?o-5] + @ `Z!()0 ,p 5@rp@]ur!(ov!8%5],0 - @\(t`p]rbort(+p ompb]-p ogu@kC] -] )p + 4'`@ʐ` @$`15`*0 L!`@A'%5.0 #  + `])p )0 *p '57@@ @r!u"o/u`]?؊   `Y p( ?a`H  '` +0 @$w` 5`* Xa8q ppa8 @%:-p  t]?r \]?r`\ `]?\Y pq p %s` 5]?+p * @J![" H8r ( -]?@%.0 19@Xax `, +4+0 \@A* \ `P@B @$'\ *?\t* @]xtux-7 + + @ `* \`* 55@ v!( , ,0 Y"rZ Y"/;4]?Ȕ* `@+p 5\ At,0 @V]`w_Z (@%-]?Ȟ,p + 4 @ x@  @#ؐ 5`+p os*"@$ x?" ?d@L#7`- @ \a` @ ]`* \+0 4`@ʐ` @#`\a`@'   , ,p +@-4+ )p @ @ \ `` @|$``\ `@X` @#`\  ?$``].0 r`0]o!t'* b*0  5^#p@@ڒ` Z (*1 tɐot@+b]* @@\#p" ]-5 + @ *a"] W\#p@Q @01_W O_WY`( ~@$ _W "oq`( Oш oZ Y`(\"?Y`( ' * *p 4 @@>   @#"o}!  , oሐ 5 o\ 1b]?Ȃ  ["(p g@[cp @#_g O-_gX`( ʀ @#ʦ _gw"u`(>-_oq`X`(ow-` ,0 @"!o-@ t    )p @"ِ(\ 1r ` *p %, - @㠠  I\_@\ 2HH@" O (oȠ]?%`*0 @@ 5`,0  N! `@m]?;5`-  Z(9\ @૒(o\ p!' +0 .0 )5%b@@ @ʒ# 5`- @J H #5`#* @๐`)0 @;o%@#@ !@@#{]?@#y]?o  5 , @M!`H'15 , @Xa0\ @d?o\ p%]?`*0 )0 4@   @X @"= o b* @\cp Z (*8 o @-p @o""+p  o% )0 @o# * @o$""* @o$"!+0 o%"-;`*p - 4 a(o Oʈ oZ  +0 o%" -p @o""+p  o% )0 @o}#]* @owt" x)p @"@t"]")`"@)HI`"@;\ \ (1\ Ю#* \ ()  -p @!!@+p ;Y"oO%]+0 oIu"]]?-p @r p]o@uЌ#"?)] +0 @^"o4# Oo)"?)Y *) c"o)o (O)o\ ( x@"F* /  + v"@ @"Sahw` 8^"# @"5^"t ^"]?]`Y pq p oq` , ou" H@"(p  tb"\b]ow`])0 oqb,0 @ou]+0 oub]?@g *]? ]? * )p 4'@ @ax @: @! ]?"?`@'H`"@\ \ (\ !*\ ('! -p !@@! x)0 @!Π@t"?" \"]?r`\"H$H\" &?@%, @(p Z"O (H)0? f@?@J@!; t@8?$ `?@ H' (p [bZ@Y@ N]@\ ' ` d@$ `o\ p@g1]  #] `(p .0 4 x@޸ @  x@!i,0 #`t", %5?Ia " \"]H.s`'\"+b*p [@Zp `Z (`"@Z `)0 +p @Ha Zb@Z -%5* @[!(y\ @r$o\ p'+b] \"*0 w@R]p @_w "@Y (?d@$], 0]o, @ Yb`)0 .0 4Z` @B  @ &o?#`* , %5]p)p @~]b Z (* t !5`+p @N!! @-`5)0 )p @ ]a@ `)p ]Tt`@]\@]` ? $"@ Ho\ p``(p ,0 14ᘐ`@ @אo`@6 \ @Y@GL<`  `*0` ;DY@ H$G\ po\ @O`'15,0 @L @o+p @+ 5["\a(Z`M1\ @ݲ o\ pD ` \ @o\ p@* @ Yb`,0 , 14@\ @ݜ  @]?,0 @j\"\" `@2H  )0 @l`\"`o ]?*_% *0 @\!o%5 -p Ha! @Q 5`+0  \0K\ @X?o\ p%-b]?(p *0 @Y#p [@5o @*_o 2O_oY ( @ @ _o w"s`("?_or Y (w^ "Y (* )0 4@ ᘖo 1  , @o b+ @c\cp Z (* o]`O oZ 5`*p J! H 5`+0 @^!0 \ @>o\ p* @9\cp Z (* oO oZ  H @) \ @Y@G L<`  `*0` ;2Y@ H$G\ po\ @>4-\"* ,0 \ 4 @a@ܳ or \ @8` o\ pY (w'[ €%Y ( @ @Y _w w'"u(">;?_'o7r  )p )0 4 aoH ` ,0 oEሀOZ oXZ T!=Y' ; )p  x@ @xa ]?@\3OP+%`*0 ,0 4@ =@Y   o: +! O o-'< ,p@:` @ ڋtO oP+\" b`,p  *0 5\p@@  Z (* o%t ='Y *}! oЀa O'o\ (`O oZ ]?]?q`8]?@]?H`2H@H @`@# `*   cؤ]?, o~u#``+ @(`H``"@t-(p b0 `,0 , +41"8@Ґ` `@]?ot8]]?- t]oLtb]? ]?]?]F@ @ \`]?Āt`t o9\` \`8t 0"$]? Ht (@Z"@o@d] -/]* /p '4@"X@ۇ  @l +5` (p o+a #'5` - ,!!@c]?  ]?` +0 -p 14@bp@b @G 8* @t" ]?r ]\"Y pq p s` + \b] Ā+O`.0 @ b(H "H~? f@)p ?@dJ@9 t@\p*H]?*0  @-p ^"b@ `+ \ -5\p @u!0 "@'i_ "@XY ()0 ы]oܔ ]5`*  o܋v!]Z "@]? 8@!] x\ @u`  )0  "  @"(v v @v ]?r`(]]?%*p p`0+ @]?)5@waoau, o\#b< *@: @ tO o$2O\pot@ @ @n _ w/"v (?_/oq`Y (w/] "Y (``+ (p %4ᘖ@ژ   @|o) ,0 o!,p o%" @9*  ub"]b]?q ]?]bY`or]?   )p + + @ bHhb@I  h@\ p  ,p @ @tb5]?`-p r  \b]?K!"r\bH$ \b # H+!"-* +p '4@!@0  @\b#b`]? (p @@ ^#p "@_ "@dY (14 )0 @ \ @0]? !4, @@ Z^ wZ (€ ]?``+0 *0 4@`x@ @ܐ?؀@G `*0 (p %55@ u(om, @ t - +p @(\  r   )p %@ , c@  I\@ \ 2HH@ O (o  ̀ @k _"v (*?v`o1@a x?" ?؀$@5* ]ow`0Y (^`"Y (-* +p '4!@ي   @n1oo4].0 ou"""@a o\ p  ,0 oa`b, `@- !5Zp@@   Z (* tעt@Z ? $"@  Ho\ p`O oZ `@ \ @Y@G L<`  `-p`Y@բ: H@$G\ po\ @@a]? ']? ,0 *p 4@b@@!  @ + @Ґ xu?" ]]?r]?āA9`-p @ ^!x"A;?\@@@(o\`])0 oڂu"+5]`)p +0 @@](t`p]sosu(]?(p @t]?]@ ; +` +0 @b;`)0 - '5)5*!!oUra0# 5]`+ , Z!(tp]t"oFr!(D `  \ @o`\ p] +0 @t"o8%`]?@a *]?-]?`* *0 '4@b@@ؚ  @ ]?"?`@Hh`"@]\ \ (S\ ^!*&\ (!  +p @!@@c x- @.@t"?" \"]?q`\"H# H\" $@]?Ā 9 .0 Zx"@?\@@t@ho\`@ ` +0  @3?؀"@R%/ 5, Ka! H&'#5*p Xa0Y;+``, )0 4 ]?\`@!* \`p@"ᘒ @\`p*]?o٥5)p @ \!(Y*0 * -4/@@]?\`@* \`p@ᘒ @\`p*]?oق-p b*0 5@ ,p Zp`@ 7] Z (* ot `O oZ @ ' *0 @@#?d@R/5*p  L!`H& %5 + Z0YF ` /p (p !41@@]?\`@ק* \`p@רᘒ @\`p*]?o+5`* @\(Y#+  `, .0 -4/]?\`@ׄ* \`p@ׅᘒ @j\`p*]?o !b(p `@,p 5^#p, @] Z (* ot `O oZ 6!>;`o*0  x@Za ]?@>`OҬ+``)0 ,0 14<`@;  o ! Oo>Y *! o! Oo\ (/]15(p -p @\!(r p]tbo؞t!( ]  5* * ^!(r`p]uo؏v!(] (p to؇" 8@,0 @ u  "]]?q`]]?s ]& ]?]Y pq p  1q`  %b]?- (p @\p @ ]" @(+ _ "@Y (),p E\"@\" )0 * 55@ - oAwa(] (p sbo9"1/7 - @\`1 '`+ *0 4+\ "@ \ ]`0@֕[` @z`\ *?\ o !``+ @D O/;b)0 @@ ]\#p()`+  `, #4`* 1+ (p w  \(@ ]p@ @̀ "@X`]p@ ? ?)+  -p 1Zp@" Z (* '` +p @$c\  ` "@ H  *p ,0 4 @@<`@% @ \0@ ` @ +1` * @` '7`+ Z!X1'+ +  `-0 - /* * @4; @@]#p@C\ Z (* @7t#!@[`` +0 @``Y p@ o`O oZ  d`@`,  H$ `(` @ @\x; f@ 0`9 @պs @`$ `\0 ]#po<[`  \  |t|4@/\<ɪ\`p  o\ @`OX Z *^\oT 2O` Y p"Y p  "@ H Y p̀ `)+  *0 @g ``"O]\0oI#!@`+0 @o#``2OY po  8)0  @ t"  "\"]?u\"]?t`\""`]?\"Y pq p  q` + ["Z $1% ,p -  @ @ \ J 2H\ p\ `! @39`@0 @bxt \ p*?\ 'b]?`*p (p \#p @ ]b @C1(_ "@Y (*p ˎ\"]?@#@1A\"#!` * -p 5 5 +! oֆu!( @ @ "_r (*?w oY (_ "Y (+`* ,0 4 !@ݐ @oǒ  - oa @ @  "_r (*=voY (^"Y (') * ,0 4  !@԰` `@o)` .0 ob"@,\  \ X@$>@]p!oY pX`"@\ \` >5]p`2o\ p_ \ \`@Ԃc @g o\ p@y# @^o]pc`@p @Uo 8*p @@v" ]?r ]?^"Y pq p ? %s` b]?* -0 \#p [@2 @'_ "@Y (,p [ʼ15 `*p -p 5 /a oպu(]- oմt], oծu" x* @צ@t?" \]?w`?dH !  ,p @@Z]?W]?+-\`@Ԥu .0 @]?@@?]?J @)/15-p Z(Uw  )p ,0 4; @]?L "H\`p\`@Ԓ* \`p@Քᘒ @\`p*]?oX@\3*?/%]?`* , 4@@@@Ӻ  @ o/@\w` @Z ]?*?]?\@Z` \op` @ @\  "_r (*?]vo\Y (^"Y (!  *p + 41@a@ӈ @loD,p  ,  oa]?И @n]?o`OZ`` O"wrt8d"@7H<]?Z `d@@T]?@(o$@Gw`Op "@]?oZ`!+  , ox @<\`\`X`   `@h\ pd@@/ @+o]?"H3\@Z`\ `d@\@  ,p @o]?3o f  }t@3<]` +0 ][` Y |t|4@ ]`p of  Z`[ Z |t|4Gɒ\`p  o\ p’\ p  \`p|4|t@ OoH{' - oc@\ @oX0X8XX00000000LDLhLLDDDDDDDDݤݜݤݤݤݜݜݜݜݜݜݜݜ ڈTLTpTTLLLLLLLLD`DֈDD````````(D<D`DD<<<<<<<< ԰ּ԰԰԰ּּּּּּּּؔhؔpؔؔhhhhhhhh,$|t|Ϙ||tttttttt̰X$XXX$$$$$$$$̤ˠȄ|ȄȠȄȄ||||||||D4,4P44,,,,,,,,ɌɄɌɨɌɌɄɄɄɄɄɄɄɄ<xxxxxxxxxlPphppphhhhhhhhx4*4).)(t(T('3332`6|<XT< dDx  !<! p! <0 lTlT<t\$8|@d,h x$plHpD0 t<hP$hP߄H0ޤLذӐhĠ´x Xxh $,4|dL8lp<hxH`0$@^"# \ "@^ ``@^  @  dZ@*?\ h N@I@O@Ήo^ o&@@J``8H Z` S`1`+p )p@a@X@  hZ@I`@ @t `Z`"rY@ "`qq Y`q`@r@p`+`q`9 `@r` *`)`@Z`@K`[@` fPo+`Z`I` @ @% `Z`"frY@ "`qq Y@q`@r`p`+`q@9 `Or`  *`ha)`@^Z`@[K`[@`oՂZ`@MY@[@@ "`s@s`Y q @q@p`Yq q`@r`p`I q`@2r` *`I `@  )` o) Z`@'Y`[@@ "`s@s`Yq @q`p`Y qq`@r@p`I q `@r` *`I `2O߂ o݂ o `ot `oт o oror *` )`JKKKK@p/^  h @!`@@ <`I?0`O^  h @*: ^ "^ `<`)?0o(0`O^`)?0<`o(0@)'^);)0 h@t@ \ \  t  +p ZPvhrP^  @\ \PtotP@o\Pp  _  / h @5`@@ <H0`O\  O h' @ \<)?0o*0@ : \*? \ * \ ߐ<*?0o*0`"O\ o@^` @` ^@  ^` @ N`$` H*h!^` o * !@\M * @  @\ @b`3. o f ;`p@ ^`^@ ( ^`"@ v[@"`T ` `s`$@ +`*@q`"@^  ```D^  @=-); (-p `ZbPv@@,rbP`Hqh ^`ڊ  Y`*Y`@"`D`Y@@r`p` `s ^`?*``q@r)`q`*[@ov (p @@ a ^ *^^d hD@o-Ԕ o^ s@o /  h @#`@<`I?0`O\ orq`o)` *?^\ `<`+?0o+0`O\`)?0<`o+0p^ /^ @)`"`0\ \ @`&G\@)\ *?^ /;;*p XbP@"[@ ,  rP+`s@s`s`+`+` @/+`h \ N@J@O݀`@ېoآo֢&@*vh  K-@U-? @x` \Pt 0*ottP]"PoǦs` Ā"s`(`&@!  t`,Ā t L @%  (`@`@3*vhG ^ oovto-`- @@2@^ ^ /  h @`@ ?<I?0`O\o@ *?^\?<.0o/0`O\?)?0<o/0@)+; )0 @XbP@ [@ *  r"P+`s@s`s`+`+`@!+`#`(s`hs`  K,@˹, @ܔ` \"Pv 0*ovt"P\bP o[@Zh Z*?@^`@ X@*Hh^`h@g^ *?^HFZh Z *?@^@@ X`*Hh^`h@g^ *?^ H0^ h  @? 9`*p pwY h ?` @y/ ) <*p M-p , ,0 @@  h/@Y @?\7`@*Z\7Z P" . @ ah@= \7 .?@A! `@Ʊ8@* b`o ,(p o@ :*p :@ƛb8@)p "`o,@,0 ob``:- :@ @ƅb8@ې+0 @b`oCjjjj@jjiiti\hiDi,gXg@g(fgfbaaahaa`<`$` ___ @@^  )p @_bH `(p @@V" \ ^`0 ` "@pHa`"@H``@D1`Hi`+0  ha#`+0  @3" *\ [0 ` @Ha`@H``@Y`H `,p  h%M &,p  @ @Œ^ ZA)0 @# M%\ ^`0 ` "@Ha`@!H ``@R `@[  *0  ]@@t@\ Zh\ 81`*p @ .p  )@c@a\ @F%M `*p `@저@ aHEb`@@`O%+  oݢ`,p @@Į#8 7\ 3  ]Y (p Z@2cp\ oZ`@@aHb`@@1`"@3+p  ) o#(@`O+p  o@dOY oZ`#`+ 3 %M@#\ "F``)0 @,0 h`@8@Ӑ#^ @  `@#o^ @1`* @o`b * ob%`.0 @of`(p @ o`#H@iaHXb`@@`OD `, @o=c`` )*0 oZ@@d%`O#`)p @o#@RdOY o}Z)0 @ovc  * op#H , @o##  .p @oc * oc *0 @ocX@P`O %+ @ o#@8d2O Y o^  .0 @o(p  oߢcH3 (p @o2c%`.0 o,c+  o& , @o #X `(p @oc`  *0 @oX `+0 oc%`*p @o  .p oc+p @ o#`@^`1`+0 *@ !X@ 8` @ʀ` @!^ !M  8` * (*p @ cP*0`X@ @"^ (h M  (,p  `@  ^ 0\@`(* *@ #@[\` )@h^ q h ^  `*0 @P@.^  qo^ #M` ()0  @ؒ@^ `*p   @ `^   )p  @ h@ؖo^ (#`!M+  @(p @ ` p @Ɣ  +^ hP^ &   M,p `+0 ` p @î h;`+0 M*0 ``oאx^  ! +p M` * ` oސ xShM  ~+p  @i`oP^  M` ()p @ @]ob^ vtwXv\wlvtwx0x0xxxxyyvԝ@ ` @_`1`+0 *@ !X@\   + M *0 @``  @/\ ԁ\3`M+0 *p ` o\1M `(p )p `  @ \ \1 `M*0 `@ .p ` o \  * M` .p  `o \3`M.0 * @   o`z\ M* (p  @ `o j\`+p M * `@   o `\  M* (p @ `@  @  oP\ \K3M* ` )p  o`3 M` (.0  )` @k1\@g1M )0  @* ``В  @no )}zz{{p{{|8|x|}}P}@`H,``1`+0 *@ #(X@#``*p @@  ؑ, bX?h%bX^  1+%`   M(p -0  x@`; * @ "X`H#`*p @@ h^  1+k%`   M(p -0  p@`; * @ "X`H#o^  1+('ML\@  ``(p )0 #+p[ @Œ{\` @h^  `)p ^ @@ "^  M`+0  `@ h+0  @h % *0 @fa^ \?#Ho`+  @W!^ #h~^ "~ ,@ o^ Z [@ho!(,\Pd~ԝ^ P @* HH ` "@i H;a`"@d H``@p`H^`h\ ` "@f^ 0H9a`"@ ^ 0Hz``@Ā`H^ 0 h& @@  ` @c^ @` H-a`"@ ^ 0H``@`H^ 0<` @h) @kaHe`@b@dH&`^ 0@ h @ aHLb`@@%`H^ 0\hv @@ aHUb`@@.`H^ 0<`(pZhs@ `@ H H^ 0J^ @@<`hw^ 0@hs& @ H `@n^ @< ^ 0)0[@@  HO< ha<`^ 0,@h[#@@`HW^ 0@hS& @@9dHO^ 0[@7hIGĀ`OĀ`o @`O`o @)dH9o@y x^ @<*^ Y@'w ^ 0Lw<`@ h$@`H <`^ 0  h3@ ^ 0h> @o : ^ 0*@h;@^ 0 @@F[h: ^ 0+[ @> ^ P @* HH ` "@} H:a`"@x H``@`Hr`hp ` "@z @HCa`"@  @H``@Հ`H @^ 0h(@@   ` @}^ @` HAa`"@ <`H``@̀`Hݑ<`^ 0 h)@@aH`@b@dH;` @o^  H ^ 0J @9 @֐ h) @baH\`@b@dH @oؐ^ ^ 0C[@@@h@ aHYb`@@4`H<`^ 0(p\hr `@ H H^ @L;@^ 0h @^ 0h$ H `@^ @<^ 0+pZ@ @\@a H@O<ho<`^ 0, hi# @`He @^ 0ha4Gր`H]^ @^ 0hYr@`O`o G`O`o @FdHIo x@i ^ @<*0wY@'@o_w^ ^ 0L<`;o@ @`H-<`^ 0  h'2 o ^ 0[!@S^ @@h @^ 0h:: ^ 0*Z@A\@h: ^ 0*p9@ww+p w*0  w wa0@a@@ K  5`.p  D "D`)0 @J`H`H`HN5 + .p @3M`@```/p a!H@  )p @@X H3 *p (p 7b@!`@#?`Hk1h67cG H  8O ` *   )p `D@ axo&`D3`+p o@J oܺ?@ o  c *0 `@. c5@`oh5 ,0 [#  +p @Y\#@^ ? \#(p @` @Z @@5 ` .0 *  !O*p ;[" @@,!o@@Ơ ` )p $!@ @ @D : @  @ʐ@Gh *p  @!o@m@@@ @ : @x @@^ @Qh v*p  @ǐ!ov@ )p @ɒa I  `*p 1M,p >` ,  rh@\hKcP`` b,0 @ d*0 \cp@t *  @ ""  z\cp` (p @ے!! \cp! \cp\h@! +  @a >``* , @@pbh\h ? )p U!o!  +  Kao0^ (@ @ H&hX`X`Z`8@ @ hZ` +瀢 @ _h*`@ bHoZ`( +p  "_*` @w` >w+0 w*0 wMYbh@w   qbh@@" d2h d &*p (@@9"   @Y ^ ʀ @\HB! @ H  @瀡 HV *  hObH@e H! @oH  @ 2H` `*0 @hXH  )p  "XhͰ @b!H" @@ 2HF`* @h>"`@K!Hh" @@ H *  hb``*0 @o"(o  *  b0+p  "@_ HG`H `:`+0 Q"ph  *p  b0^  +  oP`+0  ob8 `*0 o͠bx `,0 @o"x `*0 ob8@9 2O! * @oԠb@<$O^ oX`@C$2O^ oX`@ O `*0 ob!  )0 ob *  ob `*0 ob )0  o!(p @o" *  orb `*0 okb+  o⨁@ `@"%H``"@a HH=``@`H F @ (p @ "h@h`Ha` G`@H% @!* ob@;bH{%^ @ *p @" .@͐"P%+p oӐ"Hb ^ @1 ,p @A&а @ #)``@ %<9``"H i 1`(p *@[ €`H"#^ @ #)``@q%<9``"HU'i1`+ +p Z@'^ @ +p o"> @`!+0  0H,"`'@! >*,0 @ "`*"`#,%<"@ɔ`*8``"Hh0`)0 )p p[ 1>+p '"`1"`)``, oON _(p b1 @W@z`< (p  `*@ + `O9`` *p `*0 `@< "o),`< +  :b` \ "(@  o(@ `< +0  :b` \ r(@  o(@ `< *0  @;`` \ t(@  o(@ `< *  @: b` \ (@ bo(@ `< *p  ;`b` \ 0(@ o(@ `< )p  ;`` \ f(@  o(@ `< *  :`b` \ n(@ o(@ N _)0 "1  W@ `< +  @`) +``O9`` *  @)p ` < ",@@vo̒_`*8(p ;p81 W@`< (p  @`)@ No @{ e >' +p o"`< )p  @;`b` \ "(@ o(@ `< *0  ; b` \ 0(@  o(@ `< *p   \"`;`(@   "o(@ `< )0  @;`` \ r(@ o(@ `< ,  ;`b` \ b(@  o(@ `< +  :` \ (@ 0o(@ `< *p  ;`b` \ r(@ o(@ `< *  9 b` \ f(@ o(@ `< *0  ;`b` \ n(@  o}(@ `< +0   \"`:(@   top(@ `< *  @9 b` \ f(@ o9(@ `< *  ;`` \ n(@  o,(@ `< +0  @:b` \ (@ to(@ `< +p  ; b` \ (@ bo(@ ` )p < ;"` \+  x+  *p N@<@"@E oy #^ @`)0 oc< * "`oP(@` (p < ; "` \ +  x +  )p N;@ b@ oӰ `+p +0 "` <  *@:9` \) ;` x):@ o $X T T\( `@`)p  7c d@ H ^ @H h=-@|HA``@<?@&@.- ` @U<O퀤`a@[H ` \ n(@`oT(@ <`+p `:b` \`(@ toG(@ <`*0 `@9 b` \ b(@ `o:(@ <`* `@: b` \`(@ 0o-(@  <`+ `;`` \`(@ "o(@  <`* `;`b` \ r(@ `o(@  <`* ` \b`: (@ ` fo(@  <`)p `;`b` \ n(@`o(@  <`)0 `:b` \ t(@`o(@  <`*p `@ \`9 (@  b`o(@  <`+0 `@9 b` \ 0(@ `o(@ h4d0`,`H `, ,f`;`@` @`` @[ p`1`(p )p!8^@^ @ X` (ǀ @4 ^ !3%``+p +0 +   ^ P@=^ cH`2`^ ^ *?^ ! *  #`撐h* @ch^  HZ hh !` ?)0 @ph \`*0 #x\` # * @@1\ @"@c\ @ '1!(p c ?`)0 @o֐p^ `+0 \` #@ \` ^ oaZ`@^ ^\ h \ \ P  ` 8O^ #!p`1`*0 )0@[ ^ ^ h s^ ^ P @  ?*  hh^ ^ h `^ ^ P 3` ?, Uh@! ?`)0 @o~p#!`)0 @Coc^ +p :oZ^ *0 @ 1coQ^  3 ,0 'oG^ `+0 o>^  `*0 @#o5^ !' .p  co,^  * co#^  #`*0 #o^ 3`, @#o^ * @c@_\ P `*0 `oY @+p  ՐoH+p  ͐@C^ P  *p @Đ oh3@ *  `oD@3`, `oM  !*p  @'#@^ P.p `o/^ `)p \ #x\ >`+0 h ~ڰ@^ @"~հ#o^ @Hp`1`+ +p `\@ %'+ @m`h! *  d h ^ `%)0 '@X (@^`+ @Q`0h  .p 8G^ @^`, @ > @ b^  >t`+p h ">^ \  9ǀ 2O\  3 o\ ^  *p  `H^ `,hٓ<`\ 〤`,O\  o{,'#^ +0 `P^3h ,<`\ x3`,O\  o{t, ^  %)p  ``@"\(p @ܐ @\ `,hJ'<`^ K`,O^  oz,^ 3*p   `h@^  ,0 @^  `,hl{<`\ m`,O\  o|, 3,0 x\` = `,p h@}@\ @"}co\ @#+0  0  .p `h`, @y X^  jt X^ h ,4<`\  `,O\  oy4, *p  [`@^  ,o'< ^ ?ʀ ,O^  o{t,`+  E`0  )p >`p^  Ā3 ,p @ 5xhe`, @ - 0*p  &`@d^   .p  hM=%ߒ \ = ⊒*=^ o@Lo  ,p @ ^  ,h 'Ó< ^  ,O^  o|,(p @ 0  )p `o` )0 @ o^ !  *  `o^ D@D(|X4 @0t b`H^s`1`+0 *@ #X@^ hP +p  n`^ 0  w'ww,w (p ]ch6^ ^ n^ h*AÐR^ PC**0 @ I#^ P  *0 ?`h^ ( #`+ @4 ^ o^  (p ^  `@E? `)p @<`v  + @@3 H ^ Y`0 ` "@ Ha`@&H``@j`H # * bH`+0  ao^ * @#@%^ `*0  ߐ!U^ `)0  ֐aL^ (oq ^  )p @ʐ! ^ h ^ ^ PBot^ ^ h ^ ^ P @.0   h^ `+0 (^ h ^ ^ PyoP^ ^ h ^ ^ P #1`*0 @!(he^  8` Hs`1`(p +0c8Y € * sa0^ (hJ#`+ @h!8o ,0  _@o)p VaHo`*0  MaPo  * @ XCo`,p  :!`o!  *p 1ho `+ @(apo! *0 @!xo@3# `)0 oq@( *  `oB!*p cv^ P  ,p  oB@  * @  o1)h`,0 @#W^ P(p @ ؐ oF@# `)0 o5 *p @@ <^ \ 0 ` "@ Ha`@ H``@V`@w `+  aou^ `*  a^ \ ^ h W^ ^ PApoG@# `)0 o6^ )0 @a G^ \ 0 ` "@Ha`"@ H``@/`H +p @ "H`* @ _^ \`o^ 8@aHKb`@@`O\ `(p @oT"`  *p oNb0@[ `)0 @< o)p @@Sa 7^  [`*0 @Y '!^ oZ@@}aHnb`@@Ȁ`On ! (p @ of`! * @o`b0@|dOY oZ@|`O `+0  o * cx^ = `,0 h@}a^ @"}#o^ @(p  o8 ,p oޢbx@iaH`b`@@`Oh  (p  o`b`  ,0 oZb0@o`O `+  o@OdO Y oZ `(p ob8 ,p ox*0 @ o"  ,0 @ ob+p  o"# `,0 @ob (p @ ob8@I`O *p ob@EdO Y o[``,p  o"x`)p @o"  *0  ob`+0 @ o"  ,p o" `+ @ oݢ"  *0 o֢b * @oH ,p oɢ* @ o¢⨁0 ƜxT0 ,\ , ĀĀXX@^ h @^ ^ P`+  ې#Q^ P `)p ґ  *p ɐ o@U ` @Qt`1`+0 *@ "(X@'^  )* (p@ Y^ ^ )0 @"o^ ^* @ob )0 @ ^  +  |#* @ub^  +  l#Dtј@  +0 b+p t @ )0 zc@@ƀ ޥ[#p*0  ."h[#pޙc` @^ (@ @^ 2H hIX`X`\`8"A @ "h \`@,* N`@j\`0"@5` @Ht! @H  @Ȁ @1`+0  "051, x\`\`ƀ; #`(p h@@4^p#o^p b2H ^ (@* N@/  * @ ﻐ8ِ" ^ 8 @A h`H !`,p 0並 h *   h `+0  " o. *0  @b o.@H!H4" @@^ O1`. o"` *0 @ob0!`,p hn^ 8o  * @ c#h!^ Xh& w!Y p*?o @$OaX`o^Z @- OZ5%.0 oS * oKbx  )p @oE8! + @ o>" 5`(p o7"*p  o0`+p  o)! , o#bH@ ` @v`1`+0 *@  X@o^^o^ @)^^ @&ĝ `@z` @``@x1`+p +0 `Z\ @\ @ ?h^ ^ h*^ 0` `h d@2Ǡ\ 8 -`U`)p @ 0ht^ ^\ h*\ " ^ 3 `"h^  $@"^ \ 8 A(`  +  q0^ @hJ^  )p \ @#*-\ \ [ oZ@^ X` 7@^ @ ?h0H.x1`+p +0 Z ^ @sZh^ @n\\ Y``^  ?h^ h^V\  ?^  ` H x1`*0 *p@`[@ ^ ^"^ <^ "P^  ` 8HL^ x1`* )p@`Y@^ ^"P^  ` 8HL^ w 1`* *@cY^ ^"^  ` 8H^ w`1`+0 * c@X@@ \@\ h^ \  ?^ ^  ?h\^ "^ ^ ^  ?h@\@\ ^ Ԑ^  ?h\o^ \\ o^ ^^ hu@^o%^ \\ o^ {\o^ w^hcs\o\ @\@\ o^ @ ^ o^ `+0  q#h\ 8o@\ o\ *  cch\ 8o `*0 @Y#h\ X h$ !Y p*?o 1*0 @D#h\ Xwh$ !Y p*?o*@ \ \ "\ Z 0"ʀ\ @\ @W\ @ ?hXXXXXXhh||ݔ<<,ܸܸܸݴݴܬ8llllll88TTݤ8 `ڰpش@0 h,^ (A) ^ 0 @>&^ " ^  d@3\ p*? ^ "^ ( d@9\ 8 €2 \ p*? h^ (\  ?^ 0@? ` @H'! "@ H  @܀ H'! +  hH@\ o\ p`$2O^ @Y`o^ @o\ p@\ o\ 8@!H" @@ƀ @+p  @@ #^ `*0 8#x^ )0 h@ @ L\ pc'\ p ! +  H^ "`, #)0 @h@"^ ("o\ p("?\ p\ 8 'h`)`0\ p*?^ (  h5< ^  ,O^  y4,< ^  ? ,+p  ޑ`ܐhR\ 8o֐h\ X 7h$ w!Y p*?o `)p @o|"0#`, 뼐 0o@ Oq#!`, oib@"$OfX`ocY  (p @o\8 * @oUbx * @ oNb `(p @oG"%,0 @o@"+p  o9#`*0 o3"`@`hނ`^ 0@#&\`0* \`" \`  $@\ p*? \` "\`( $@\ 8 @ \ p*? h\`(r\  ?^ " ^ ( @p\ p*? ^ ("@X`@Z "  $@q\ p*?  ``"@Hs``@')%^ 0 , @ "` `*0 @bh+p  0^  @c)^ *0 bx^ ( ``*p , %#c*0 )0  h@ D `\ p"^ 0obߐ x\ p ?^ 0 ? ,p  ґ"`\ o\ p\\ oo\ pd2Oe\`UY oa\`Q\ o\ p@om\ pI\ of\ 82O) )0 @ꮐ"o)% , @ꦐ"po`+0  ꞐbPoz)o#, X)on%@^ (@`"@Z H``H_ h5Z H[ Z XZ 8 @UhQƀO `hKꈐ"^8 &`, 1 (p X`02` `"h4 ^ *  Kh* (  h$h `+0  9ch^8o *0 @ /#h^Xwh& 7!Y p*?o @^ (@ @^ H9hX`X`^8@3 h/@%^ +^0"^ d@ ^ƀ!$@o^p bH@ ^( Ht^h p^o^plY o^ @ `@|`1`+0 *@  X@^ ^ h*^ 4 hh> ^ 0Y\ h*\ "?Y 2 `"oY  @X龠"^ 0\ 8 E h`S* @鏐 0^ 0oY ^ `*0 ^ @ @ So^ ^ ^ ( ?h$@.r鐠\ 8 h`v `+  `0 * @ Z#h\ 8o  )p @P#h\ 8o\ o\ ^ o^ +p  =h\ X h$ w!Y p*?o+p  @H*I^ ^ \ ^ h*^ [1` hV d@J1L\ 8 ?ho `*0 #h\ X wh$ !Y p*?o `+0  ch\ X 7h$ 7!Y p*?o{ * ^ ^ "^ Z 0 @^ ^ @ ?h [^ o^ o^ 0 >`*0 @\"@ !b`, cx @e>* @ \" ^h-@Gt"Q>* @ 5tbp )`*p @P\  ,p h \  \ps" O`h@T.o\ * t" |`*p @ h%r +p  @T`o\"! +  @T o %O )p @@wD"+p  @So@^`(#`@ `@ h^ @@>``*pY@?ֹ o^ ִ^ *^ '%@^`  )p @` +p  @*N`^`( 2O^`(@^`  )p @`/+p  @& `(p @@ `*0  @ݒ  `.0 @@Ӱ ^`(΁^`(\ o^`(0)+> ^ )0 @\"p >w"r  ^  : $@t`^ @Аz4} * @h ! < .0! s`@ ?H  <,0* @@#t\`*0 tbn\bp H 1h\"poÐ" +  @S a(@+0 * >@ #XbpԳ>\ ( ^`   < ,p@Z`* ,p' @ t`.0 1>< +0\b€ t ,p Ԏ\",\"ւtb! |+ ,p   r y\" ?\"h 3 (p @RŐaHo\ (`*0  @R`o\b^ x^`B @^`p ^`ߒI @^`p ^`ӒN @^`p ^`ǒ"T @^`p ^`ֻY @x^`p [ ֯^ 2H hr )p @R`!p^`p ^`֙ ?  `(p @RO!p^`p ^`ֈ ? ` *0 p@R=^`p ^`v ?  1)0 @R,ap^`p ^`e ?   .0 @@R!p^`p [ T ? `5* @@R !ph3 `+0 @ @RXoi^`p`(p @ @Q!Xo^`p `*0 X@Q h *  @QaXo\^`p*p @QaXo`^`p+p  @QِaXo4^`p^ x^` 6 @^`p ^`= @^`p ^`B @{^`p ^`"H @w^`p [ ےM Hxhq )p @Q!p^`p ^`Œ ?ɀ  `(p @Q{!p^`p ^`մ ?Ā ` *0 p@Qi^`p ^`բ ?  1)0 @QXap^`p [ Ց ? 5+p @@QG!ph'+p  @Q?aXoz^`p`+0 @ @Q7Xo~^`p *  @Q/aXo^`p*p @Q'aXo^`p*0 @Q !X ^ x^`RZ @^`p ^`Ga @^`p ^`;f @^`p ^`/"l @^`p ^`#q @^`p ^`v @^`p ^` "{ @^`p X` H h1)p @P!p^`p ^` ?  `(p @P!p^`p ^`ؒ ? ` *0 p@P^`p ^`ƒ ?  1)0 @P|ap^`p ^`Ե ?   .0 @@Pk!p^`p ^`Ԥ ? 1 +  @PZp^`p ^`ԓ ? 1 +  @PIp^`p X`Ԃ ?  5* @@P8!phA`+0 @ @P0Xo/^`p *0 @P(aXoc^`p *p @P!aXh*`(p @ @P!Xo<^`p `* @P!Xo@^`p *  @P aXo^`p*p @PaXo^`p+p  @OaXo^`p ^ x^`* @^`p ^` @^`p ^` @^`p ^`" @^`p ^` @^`p ^`ʒ @^`p ^`"ϒ @^`p ^`ג @Y^`p ^`˒ @U ^`p $^`ӿ @R ^`p (^`ӳ @N^`p ,^`ӧ @J1^`p 0^`ӛ @F^`p 4^`ӏ" @B^`p 8wX`Ӄ Huh<)p @O4!p^`p ^`m ?Q  `(p @O#!p^`p ^`\ ?L ` *0 p@O^`p ^`J ?F  1)0 @Oap^`p ^`9 ?A   .0 @@N!p^`p ^`( ?< 1 +  @Nސp^`p ^` ?7 1 +  @N͐p^`p ^` ?2 +p @Np^`p ^` ?- `(p  @Np^`p $^` ?( `+0  @N!p^`p (^`Ӓ ?#  *  @Nap^`p ,^`’ ? *0 @ @Nx!p^`p 0^`ұ ? *0 @ @Ng!p^`p 4^`Ҡ ?   * @NV!p^`p 8wX`ҏ ?   5.0 @@NE!phz+p  @N=aXoX^`p  )p @@N5!Xo^`p`)0  X@N,o^`p1 *p @N$aXo^`p`.0 @NaXo^`p (p @@N!Xo^`p`+  @N aXo^`p+p @ @NXo^`p`*0  @MaXh2*p @MaXo4^`p`(p @ @M!Xo8^`p `* @M!Xo<^`p *0 @MݐaXo@^`p`+0 @ @MՐXo^`p *  @M͐aXo^`p 㽐^`p^ xY`p X`p\  @ \ p \  @\ p \ ߒ @3\ p \ Ӓ" @\ p $\ ǒ @o\ p (\ ѻ @k\ p ,\ ѯ @\ p 0\ ѣ @\ p 4\ ї @\ p 8\ ы" @\ p <\  @\ p @\ s @\ p D\ g @ \ p H\ [ @ \ p Lw\ O" @3\ p Po\ C @\ p Tg\ 7 @\ p X_\ + @\ p \W\  @\ p `O\  @\ p dG\  @\ p h?\ " @\ p l7\  @\ p p/\  @\ p t'\ ג" @| \ p x\ ˒" @y\ p |\ п  @ \ p \ г @3\ p \ Ч @m\ p \ Л @i\ p \ Џ @\ p \ Ѓ# @\ p \ w( @]\ p \ k- @Y\ p \ _"2 @v\ p \ S7 @r\ p \ G"< @M\ p \ ;A @J \ p \ /F @d \ p \ #K @`3\ p \ P @<\ p \  U @8\ p \ Z @T\ p \ ` @P\ p Ė\ e @,\ p Ȗ\ ےj @(\ p ̖w\ ϒ"o @D\ p Жo\ Òt @@\ p Ԗg\ Ϸ"y @ \ p ؖ_\ ϫ~ @\ p ܖW\ ϟ @3\ p O\ ϓ @0 \ p G\ χ @ \ p ?Y {" HKh`+0  @K,!p\ p \ e =}  *  @Kap\ p \ T =x *0 @ @K !p\ p \ C =s  * @@J!p\ p $\ 2 =n  (p @Jap\ p (\ ! =i ` )p @p@J\ p ,\  =c ` )p @p@J\ p 0\  =]  `3)0 @Jap\ p 4\  =X   .p @@J!p\ p 8\ ے =S 3`+  @J!p\ p <\ ʒ =N +p  @Jp\ p @\ ι =I `+0 @Jop\ p D\ Ψ =D  *0 @J^p\ p H\ Η =?  *0 @JMp\ p Lw\ Ά =:  (p  @J<ap\ p Po\ u =5 `* @ @J+!p\ p Tg\ d =0  * @Jap\ p X_\ S =+  )p @p@J\ p \W\ A =%  `3)0 @Iap\ p `O\ 0 =  `3)0 @Iap\ p dG\  =   .p @IՐap\ p h?\  = 3`(p @@IĐ!p\ p l7\  = `+  @I!p\ p p/\  = *0  @Ip\ p t'\ ے =  +p  @Ip\ p x\ ʒ =  +p  @Ip\ p |\ ͹ < `+0  @Ioap\ p \ ͨ <  * @I^ap\ p \ ͗ < (p @ @IM!p\ p \ ͆ <  `* @I<ap\ p \ u <逢  )p @p@I*\ p \ c <〢  `3)0 @I!p\ p \ R <ހ  `3)0 @I!p\ p \ A <ـ   .p @Hap\ p \ 0 <Ԁ 3`+ @Hap\ p \  <π *0 @@HՐ!p\ p \  <ʀ  (p  @HĐp\ p \  <ŀ `+p  @Hp\ p \  < `+p  @Hp\ p \ ے < `+0  @Hap\ p \ ʒ <  * @ @H!p\ p \ ̹ <  * @Hoap\ p \ ̨ <  )p @p@H]\ p \ ̖ <  `3)0 @HL!p\ p Ė\ ̅ <   .p @H;!p\ p Ȗ\ t <   .p @H*!p\ p ̖w\ c < 3`(p @Hap\ p Жo\ R < `*0 @@H!p\ p Ԗg\ A <  +  @Gp\ p ؖ_\ 0 < +p  @Gp\ p ܖW\  < `+0  @GՐap\ p O\  <~ `+0  @GĐap\ p G\  3`)0 X@G"o\ p3 *0 @GaXo\ p `(p @X@Go\ p3`)0 @G aXo\ p *p @GaXoX\ p`)p @FaXo\\ p*0 @ @F!Xo\ p *p  @FXo\ p .p @@F!Xoh\ p`+  @FِaXol\ p`+0  @FѐaXo\ p * @ @FɐaXo\ p`+p @FXox\ p`(p  @FXo|\ p `)p @X@Fo\ p3`)0 @F!Xo\ p* @ @F!Xo\ p *p @FaXo\ p(p @ @FaXo?\ p`* @ @F!XoC\ p *0  @FaXo\ p * @FxaXo\ p3`)0 @FpaXoO\ p .p @@FhaXoS\ p *p @F`aXo'\ p `)p @X@FWo*\ p`*p @FO!Xo^\ p`(p  @FGXob\ p`+ @ @F?!Xo6\ p+p  @F7!Xo:\ p * @ @F/aXon\ p* @ @F'!Xor\ p`*0  @FXoF\ p +0  @FaXoJ\ p`+p  @F!Xo\ p`+0  @FXo\ p`+ @ @E!Xof\ p*p  @EXoj\ p3 (p @EaXo>\ p  ^`p^ xY`p X`p\  @H \ p \ % @D\ p Y "* HEh>`+0  @E!p\ p \  ?ဢ  *  @Eap\ p Y  ?܀  5)p @E!ph3 (p @EaXo\ p`.p @@EaXo\ p`+p  @EX @^`p^ xY`p!X`p\ ɮn @w \ p \ ɣu @T\ p \ ɗz @P3\ p \ ɋ" @\ p \  @\ p \ s @\ p \ g @\ p \ [ @\ p \ O @\ p $\ C" @\ p (\ 7 @\ p ,\ + @\ p 0\  @ \ p 4\  @ \ p 8w\ " @3\ p <o\  @\ p @g\  @\ p D_\  @\ p HW\ ג @\ p LO\ ˒ @\ p PG\ ȿ @\ p T?\ ȳ"ܒ @\ p X7\ ȧ @\ p \/\ ț @\ p `'\ ȏ" @ \ p d\ ȃ" @\ p h\ w @ \ p l\ k @3\ p p\ _ @\ p t\ S @\ p x[G" Hh`+0  @C!p\ p \ 1 >  *  @Cap\ p \   > *0 @ @C֐!p\ p \  >  * @@CŐ!p\ p \  >  (p @Cap\ p \  >} ` )p @p@C\ p \ ے >w ` )p @p@C\ p \ ɒ >q  `3)0 @Cap\ p \ Ǹ >l   .p @@Cn!p\ p $\ ǧ >g 3`+  @C]!p\ p (\ ǖ >b +p  @CLp\ p ,\ Dž >] `+0 @C;p\ p 0\ t >X  *0 @C*p\ p 4\ c >S  *0 @Cp\ p 8w\ R >N  (p  @Cap\ p <o\ A >I `* @ @B!p\ p @g\ 0 >D  * @Bap\ p D_\  >?  )p @p@B\ p HW\   >9  `3)0 @BÐap\ p LO\  >4  `3)0 @Bap\ p PG\  >/   .p @Bap\ p T?\ ڒ >* 3`(p @@B!p\ p X7\ ɒ >% `+  @B!p\ p \/\ Ƹ > *0  @Bnp\ p `'\ Ƨ >  +p  @B]p\ p d\ Ɩ >  +p  @BLp\ p h\ ƅ > `+0  @B;ap\ p l\ t >  * @B*ap\ p p\ c > (p @ @B!p\ p t\ R >  `* @Bap\ p x[A =   5.p @A!ph3 (p @AaXo\ p+p  @A!Xo2\ p`*p @Aߐ!Xo6\ p`(p  @AאXo:\ p`*0  @AϐXo>\ p +0  @AǐaXoB\ p * @ @AaXoF\ p* @ @A!XoJ\ p *p @AaXoN\ p`)p @AaXoR\ p `(p @X@AoU\ p3`)0 @AaXoY\ p .p @@A!Xo]\ p`+  @AaXoa\ p*0 @ @A~!Xoe\ p *p  @AvXoi\ p * @AoaXhs * @AgaXoR\ p(p @ @A_aXoV\ p`* @ @AW!XoZ\ p *p @AOaXo^\ p `)p @X@AFoa\ p3`)0 @A>aXoe\ p .p @@A6aXoi\ p`+ @ @A.!Xom\ p*p  @A&Xo\ p`+p  @A!Xo\ p`+0  @AXo\ p *0  @AaXo\ p`.p @@AaXo\ p`+ @ @@!Xo\ p ^ x^`2B @^`p ^`'I @^`p ^`N @^`p ^`"T @^`p ^`Y @x^`p [ ^ 2H hr )p @@!p^`p ^` ?  `(p @@!p^`p ^`В ? ` *0 p@@^`p ^`ľ ?  1)0 @@tap^`p ^`ĭ ?   .0 @@@c!p^`p [ Ĝ ? `5* @@@R!ph3 `+0 @ @@JXoi^`p`(p @ @@B!Xo^`p `*0 X@@9 h *  @@1aXo\^`p*p @@)aXo`^`p+p  @@!aXo4^`pP   8)p @@_a ^ x> +p  hrb1`)0  @L*p @ @C! ')>+ @[" %1 >)p Xb^ h\  WO @% ?!@! 8*?\ \ x)0 @s1D4 o+   !@#`* g`Z @^#D4+ @^`pZ"+0Z`p\x] pD^`ǐږ_7 @e^`;wg * D^`pҳ^`ƖW @I^`'wg * D^`pҟ^`òO @-^`wg * D^`p@ҋ^`ÞG܀ "@'^`wg * ?^`p^`Í @8!^`p 7^` @%#^`p /^`w @^`p '^`l @ ^`p ^`am @,#^`p ^`VX @)^`p ^`KC @ ^`p ^`@. @^`p (Z`5 "@'h   * @>!Xh`*0 @ @>ߐao! 3+  @>Ԑph)' (p @>ʐapo^`p%`,p @>po^`p  !*0 @>apo^`p)' (p @>apo^`p#`,  @>!po{^`p  !*0 @>apof^`p`, @ @>!poQ^`p#`,  @>!po<^`p*0 @ @>zpo!^` `!)0 @>p!po^`` )p p@>eo^` (p @>[!po^`_gѭ (o`* @@>M!Xo * @>E!Xo^`-0 @>=Xo^`)`* @>5Xo^` *p  @>-Xo^`! *0 @>%aXo^`p`, @ @>aXo^`p`,  @>!Xo^`p *0 @@> aXo^`p%`,p @>Xo ^`p! *0 @=aXo^`p' (p @=aXo^`p`,  @=aXo^`p㾀^`p^ xY pX`p\  @\ p \   @*3\ p \  @&\ p \  @\ p \ "$ @\ p \ ܒ* @\ p \ В/ @\ p \ Ē4 @B\ p \ "9 @> \ p \ > @:\ p \ C @6\ p \ H @3\ p \ M @/ \ p Ė\ |R @+3\ p Ȗw\ pW @'\ p ̖o\ d\ @#\ p Жg\ X"a @\ p Ԗ_\ Lg @\ p ؖW\ @l @\ p ܖO\ 4q @\ p G\ ("v @\ p ?\ { @ \ p 7[  H> h * @ @<!p\ p \  >  * @<!p\ p \  >쀢 )p @<!p\ p \ ؒ >瀢  `*0 @<ap\ p \ ǒ >•   (p @p@<|\ p \  >܀ `3)0 @׀ `3)0 @Ҁ   .p @@̀ 3`+  @<8p\ p \ q >Ȁ +p  @<'p\ p \ ` >À `+0  @<ap\ p \ O >  * @ @<!p\ p \ > > * @@;!p\ p Ė\ - > * @@;!p\ p Ȗw\  >  (p @;Ґ!p\ p ̖o\   >  `*0 @;ap\ p Жg\  >   )p @p@;\ p Ԗ_\  >  `3)0 @;ap\ p ؖW\ ג >   .p @@;!p\ p ܖO\ ƒ >   .p @@;|!p\ p G\  > 3`+ @@;k!p\ p ?\  > (p  @;Zp\ p 7[  > 5*0 @;I!ph`.p @@;AaXoo\ p)p @;9aXo\ p`*0 @@;1!Xo\ p (p  @;)aXo\ p `*p @X@; o\ p3`)0 @;aXo\ p .p @@;!Xo\ p`+  @;aXo\ p+p @ @;Xo\ p`+0  @:Xo\ p *p @:Xo\ p`(p  @:!Xo\ p`*  @:aXo\ p*0 @ @:ؐaXo\ p  * @@:А!Xo\ p)p  @:ȐaXo\ p .p @:aXh2`*p  @:Xo \ p`+0  @:aXo\ p * @ @:!Xo\ p * @:aXo\ p`+ @ @:!Xo\ p+p  @:Xo\ p `^ yDF q*   ) @K'!* ߚ a0 @C @4\` @ @ @` < !. @:Mh ) *0 '!p@:A!ߟ*  ax ?ր  `)p @:.!p O\`  }  0*p '@ @0v " 5+ * `TQ @8' 0%#`80, t * @ >1 @*'(p  @! *  0 *  `4* @$` !!( @!` @ G^`x) `, , *0  @h `@ Gy 0"?`L`"O`@@ ې @o``| )0 ` #@v ^`x ,0 ̥@  "Ζ @|)5!\`p`8* ̩`z @{ !\`p``4. a @b \`p    ,p (p @ h @.`^p ` d~@ @^>`*0 ?@9Aapo` O |+0 `@ )0 '#v  ="gP @`8+p  C`V* @! * `4ǠaG @\>*ѐh `!| +p @v !'^`x  * @`"l @f5\`p`8,0  ` wP @ 5\`p`4,0  oa6 @ \`pg\`! @)\`p_\` @&5\`pW\`ܒx @3\`pO\`ђc @)\`pG\`ƒN @\`p ?\`9 @3\`p(7\`$ @\`p0/\` @\`p8'\` @'\`p@\` @\`pH\` @x\`pLZ`y 2H3 `(p X@8-h@8)XoӲ`+0 @@8!aXo'+p  @8aXo@@ڐo]`)p @8  o@8po<` +0 @7apo )0 @@7pog5%'*p @7!oK +0 @7ݐpov\`p@7ِ!Xo`',0  @7ϐapo`*0  @7Ő!pô! * @@7!po 0#`, @7!po`)  +0 @7aphh'.p @@7!po^\`p`5* @7poI\`p5,0  @7apo\`p)  +0 @@7po\`p)  +0 @@7upo5 )0  @7kpo5 + @7b!ou!-0  @7Xapo\`p'.p @@7N!po\`p!. @7Dpo\`p-0  @7:apo\`p3`)p p@70o\`p!. @7&po\`p)  +0 @@7po\`p3`)p p@7op\`p' *p @7 !Xo5`-0  X@7o\`p`-0  X@6o `*0 @6po\ '-0 @6po!) )p @6ܐaXo`5+ @6ԐaXoŐ 05+ @6̐aXoӂ5`* @6ĐXo\`p  +0 @@6Xo\`p`*p X@6o\`p`*p X@65o-0  @6aXoX\`p.p @@6!XoE\`p!. @6Xo\`p  +0 @@6aXo\`p`)p X@6o\`p,0  @6yaXo\`p`*0 @6q!Xo5!. @6iaXo \`p-0  @6aaXo\`p`)p @6YaXo\`p+p @6QaXoO\ *p @@6I!Xo8! `)p @6A!Xo >*0  @ XbpwZ ( \@X  '>,p Z[`9'!  ` . -0 3,p +p Ow׈  wh ^ _ W@ 2O^ H3\J@ G 8h  @B,_"\"^ J@ "G^ J@` *O@Q@Eo+- @5Ԑ0h\K*O'o @ 8*?^ _" @: ?@4 @A?`-,]`s ]`Z *`"@ 3^ *? WHy2H%`37>\`/p \? Hi#`(p @ @5aXha@ے _ߐ 8@֒a"?Ȁ_@Bb_ג@5}bo 'ȇ _"[" ."h\ *G W@2O\ \J@`G 8 h w@"*\@"\ J@`"G\ J@``*O@_@oGӮ)0O< ou`K " %`ou` o'Ӂ^ hB  ')>X`*0 @Xb@Y X`@h"\>+p  ZpZ (+p r\ Y!\L`*@U' >\(p \"Z (`2Hq Z ] `-0 !\ (+>,0 D"x@ ` `*p @x w Z (1> )p [@= ?@ 1D"x!D"x_t( "@\`(@܀ @ɀ Hh'] .0 @@  ]h H`@Z @Z @  +p \`@ \`p*\`1'\  -0 @`"Ho1o`@ 5`@d H=`A`?h^$`@Z +\ AW?hU$`@ 1c )p 㐀` hL]  * @@ĒxA!+ *0 @@4Sh8!#] , @`%]h H @Z @Y $ * ^ @ ^ p*?^ h ``H`1`(p )p YĀ?h& @`"@\`(H``"@\`(Hu``H\`(@fh[` hu@` h%@L``"Hu[` [` o@@cU ]h: *0Z@X@o[Y` \\"\*>Z (@Ԥ?h$`@ "G\`(\`(h%@+`+p  @3ܐo_ǀ H]P*@X`"@5\`(Hj``"@H\`(H``Ho\`( * @@3"oO *0 @@%Bb`* @3oD"x@c ]h: )pX`@^oe]` @`H\`(h%@@`H=a` G`@Hxo\`(@w[`(/whm\`( hi%@\`(Zheu@@bԒ `@:]@`H$``"@V\`(H.``HT: \`(,]hMG䀠`H*a` Gz`@HDow\`(GـbH>\`(@h:=@@.`H#a` @`@H1: \`((p@ h+& @%`H': \`( h!6GbHo\`(G`Ho\`(@ bH: \`(-h >: \`(+p[ hv \`(: -rrrrrpޗ)%  ;-` +p |`(p -p , ,p - >O > @@ @g\b@[\"t"Nt"\"r`@V\b ?+%> `-0 @x HP"x^ @] N  >+p `(p /> @  o  H H3\ "\ x \\ \(\0\8\@ww/w7w?wGwOwWw_'@w' H`@ 'wv P'l` H4Ohv P@2\"or`@Eb@2"oX^ p*? HhQ >`)p Xb@@@@^   )p @`#%`+0 @+'`-0 @a^ hA)+>^` *p @Y"@Y`X`@"\^`>`+0 Z ^bp Z (* r"\ J`\K`*"@F^ )>\`)0 @^bZ (`2H/ Y ^ I "@_\ (@Ȁ @ "@ -*p `ؠ\ (%>  * @z\☀?H)#)^ `-p @1"@H0=?h$ @^ -p @# ^ h H @cZ @Z  `*0 @\ @`\ p*?\ \ +p  @]ՐHo?o @Y ,pZ ?h$ @ `O-  1`-p -0@ Z^ @or  @o" ^ @"- @ o-`^ , @Ғ+^ h H @|Z @Y` `.p @\ @’`\ p*?\ h@` ^ h: .pY`@X@ oY (\^b\*?LZ (?h$ @?h$ @`"@N\ (H<``"@V\ (HB``OL-^ @oHt ( `"G^ @\ ( @o@$ O>-^ P"? @`   @[^ @ HE @f: HO  O)-: \ ()p[@ o"r .p @ @1"o$@(`Ha` GЀ`@O-o\ (@`O -\ ( @o4@`W ^ h: (pY @]@o^ \ ( @o.@@bO-\ ( @o=\ (^ @osGŀ H! @ @O-: \ (-0@ o# @ O-: \ (@ o4 G"O-: \ ((p@o9: \ ( o)@|||||p? d"@^ @IhAY >>+p  *p >  o  H H'\ "\ x \\ \(\0\8\@ww7w/w?wGwOwWw_'@w' H`@ 'wv P'` H4Ohv P ^ p*? H㾰 $HM H`2H%^ P^ @\` E %>`)0 h $@8^ p9F `  Ov 0 Hg O @\#h 2o^ p_gov 0*?^ @?^ @ o*0   xc@  H`@'w<`(p\w` H@O<`ho^ p㾀 a`*0 @ H`HR>+p  \ch ʁK @;`5E * `c` *0 )p /0 F1E-E@@]!@ \H@\8 tch%>,0  #t`@;@@oh H>9-0 < @/p@1*0 9`ˮ -!bt<ŵ. 3>- -p  t㘒ZpH > *p @#`@-\ch@T\?@5# @wWw7hw/#@>_W@_c,X`"?#` "O## G'c_7? >,p +p  wG`w?=],0X@ @n^c],0Z `@p^cc`H\_/]-p^cX@] [X@Rs0_?!> *p hwO\`p@I_/_c`Y $Ot`0`H"H\`@\`P_G\`@] "?\`pD `  @!t 0$@o\ po\ po x\`@@x `H'w`Gҡ<o,0]w`Ho Hg O _O@[#h 2o\ p_gt 0o\ p_/O=og#Y \@>` ?] o'cY @6Z ?c o'c;>5* .p ^1>%#]o7O`1/0  - Fb- @5@@Z#Ho$#t-p @@.#o\ch1.p @.c0o##%>`)p @\#h  \#h`w+0 wװ @KZh_ǀ?f@ @^ (@@ "@;X`H  HhzX`HX`X` ; 1`` .p (p )0 5>;> >@#Y#h ^?`@(p`@U)0^p"'#?`@(p c`O)0^`v@`ov#@! `Hv5>[`;(p 3`#`)0 >. ;>>@^c.@Y#)p'#w@h[v5>[`;.0 `# (p . >>;>Xc`Y#.)p'#w@h>p@^`v@ov^ 0@6X` 3 13 ``)0 ;>. 1>(p >^c_ch #?`@(p`@)0^p"'#?`@(p c`O)0^`v@`ov^`v@ov 03;>`)p @\#h \0"\h` "@ ` H|a`"@ H``@`Hdh A D`X`0@t0` O d@ -H`H-M\P{T -/>+, 9>@ H = `. \cx = tcx$@ ``\0(p )0 @\ch@ \x` > * @ cp 'cp @V@@\P">Hd@@\ \@w瀠` @`H|a`"@ `H``@.`H^`>_. ]x hV,@ aHb`@G`Odo '\#h*?o\0>`+0  #`H=+h'`H7`"@n\@H``@߂`\@(p @^x@}p H`@  >,p @< \cx(p]#h_@@~ $`p`$p\cxHOr;o` @E`H`a`@ `H``@`H,0 ]x @h$@@ aHbb`@@2`H`>_. ,0]x]@hv@`O!do @d2OH\H O oM\@ `.0 t@@^x@}`+p @[xh$@`>_.0 *Zcx@h!= o5\ /0 @,`o@ aH:b`@G݀`H`)p @Y#x_@ht@Gƀd@`o]\@@JdH. `D#- tD#@|]cx@}@>b@`Hn`>,p @ @_[xhd7@VdH`oܱ. @`HZ`+0 ]#xhS$@`@< h\@@@9`<  ,^  yHo\@`>,p +p@_[x?_h4w`>_*p )p@@Xcxh`-0 @X+c h"$#ol H`Oh)\P*fH ob \@`o(p FoJ`, Zx@h<@`@. oׂ`H`"H^`@^`P9o@[/ o x@|1^`@< *0'ZwwhYY @Voh!@N^`p@O``Od^`0 x@8`H`@  H.* F``9 ^`@@|o^`p@{ x `Hw`@-'< ^`@(p[  w`H@ < ^`@(p[  w`HO< hoF``@{'w'w_ov`0o^`p ^ 0 @  ^ h@SF `X`0 v 0 $@-'^ P  "@ @H5 "@ @Hր  @( Hhۀ  @Z  @\^ @ H퀡 @&: HP  HW: ,0Z@ A* hO/#>,0 \#h d"@ Hh@ހ Hڀ! @ @2H H @  Hh' ^ * @+ #`o `"Hj^ @^ P*g^ @`^ @@ <`,0\[` " `\ p ? H`@4O<`h@Ӏ H: @ @7@| HL F H/>^ @)`9 ^ 0`,p @|e\ch` >`,0 @p "p H@ #`%- =  ,0_@@{#: ]@]h@|m`]@@*^  H@O= h\` 1^ p ?h+>^ 0 - < @|S_ch@ ^  * @ @*#@|/@|hx@> 2H H @  H7뀡 OLo^ @b\#h*?A ;->`.0 #`H[ * @Vx# hR$#@4 H#! @ @Ok: )0 @od'H"^ @ߠ  How @  Ho/O H @נ o?@"OK: י+p @ oE?׀ @o : ߕ* Z@ o9w߫:  @  o3/^ @@z@z~ Ho @z@zwo$@ >`*0 @\#h@`$"@`H\#h*`!> + @ #H1h( `"H\`@\`P*@\`@`\`@@% < +0\ Z "  i^ p ?`H @O< h[` Z^ p ?h ` )0 @Uא$# >`)p Xch@@{w@@/`-A* *0 @@Y x@`x h'c (h@I'!@, @`t@D;``'# (p `.0 +M`@-0 , ,0 * c@A@ @   x]# x@{=N xtx`` t $ $``O$ t,0 ]xI@`uxh= Oo']#` @zh!Y"`tJ `@  E` *  _`I@K H` )@;`I@ 2OI@:0')@)p @\`h *  \`h*2B ,h0"t`h !/r  , @[ *0 h@\D  *\h  Ob($o\` +0  "@o\`h㲠!E  +    @yƐ wg*p HbXbX`@ bX `(p8K@=08*`O @N7/. @yHbx@y; o@z~?@Ŧ_+-/Ed/0 f%!75E)0 @\! ).0 +9Da;c t! +p @yВ— * @ Vv#.p  @x h -)/E.0  @/0 +E\a  @$!: b7 ta  )p @}"`9*   b@z(;c,p  pc ,p Xc  "H o ,p Xc?  * +0 @E! @z] o쀤Da @z \! ^#@y@ *  @ @xrb*s# s` (p )p !1bb@xM  ,0 @y?^c.0 @yҒ"?wvc(p )0 @Ea @y] hy *oT)-/E,p oB&! 9` /p 7M)0 ;c ovc% `/p @xJc +p * A  @@x  @x> %c@x2 ?oooD!`*  b@wo  ` )0 Ð"ooΤ oޒo#*p  @wے  3@^#-0  ``@y_# `wg 7`  )p .0  H@wۦ_g @yW\ E`*0 @Xa @@ C*p @+p  3 #B`@#`*0 @y4``* @`@y6d ` $ *0 @y&`@N`"H @w*?/*p A)p ;b@ `# `H#(`!`; hO: `*p A (p  ^x1@.p +Ax$@ #>C`' E > (p `M H  ". "H) \@f',o ' `?`?H?!Y *0 .@<`|@C`HE!@ +p @pO,o߶ - @c`f .@r,c`)  @+5_`, @1)p8>p8 @ "`a @`+ O .,o2O,. #`а!Y3@,`!I,p @ `th'`t-@` )0 !`po,# A`+ +0 @Z`x  x@ hc@(hI@ 5@ (p `tH3#!Y"`toc.@ ,p z0oc ?߀`]OV 0`` (p ,0xZ  @ @ "H|!I!Y@ A`+0  \xtxhp!I` 5+p )p M`@ ,0 - -p -0 #c1A@A@    x]c x@wL xu x`` t`$ $``O& t15A  ,0 \xM@``nGtx`nH|`t`bG `bH`f`0O '1 +- * `'A!@`)0 * @ A`xw  h!Y#`t@Cˀ`@ˀ`@ >@+]`x@ h##A *p @ w@ h#H@H"]`x#@`+p @ * `tc OӠ \cx@wVLxv x ` t`_% `$ tO" ]`xI@` Ou`xG˩>@ϒ @w{.o.@`O|1o G `tH`x`rO os.@]c` @v oO oe.@O ou'A`.  Y xMH# )c-p `, ;M\@ `3 `)0 A- @^ x `x@ h ;c@8h @I@`H ; @`/0 `tH5!Y"`t!Y@ ?`H 3A`.  _ x?w x+`:  =@J!M7A  * @M@ H7% ;c,0 `* /M\c`2 7`+ 1A-p @^x@ `x@ h /c@ h)@I@ H+/)@- `t`H9!Y"`t!Y@ `H !9A /p ]xux+`>`~H!/!:hh!#;9A`)p @^xNH9+'`-c+0 @-0 #MZ@`3 9 `. A@.0 @Zxx@ h #c@h5@I@ H1#5@`.p `t`H!Y"`t!Y@ `H !A )0 @^`xv`x+`; =H!3!-hC)p  J `H  #``-  @t H` .p @,0 +#H@t`x#H@t ""5@vB#H@t "5J"@ L`H5 `--p )@@t`H* $`5 A--p [`x-0 .0 * @,A@@ .c$ to$`hF!WhD!$hB!Vh@!=A`+  ] xJ`H' 9c* . #M[c``2 ` A-0 *0 @!@_`x x@ h #c@h-@I@`H#-@`, @`t "H!Y"`t!Y@`H ;7A`/0 @\x?tx+`; `=@`>@!A.p  Y xM`H!- %c(p @.0 MZ@`3 5`)0 A-  ;@^x`x@ h c@8h @I@H  @-0 `t H!Y"`t!Y@ D`H !A .  [`xs`x+`?` =H!C!Eh;9A`* @^xI H9/)c,  , M[c@ @`3 9 `. 1A)0 @Z x `x@ h c@ 8h @I@`HT  @,p `t`"H!Y"`t!Y@ `H !A .p  ^xvx+`: `=@N`~HJ!M!9hF 3A * @^xM H31' )c+ @)p #MZ#@`2 3``. A- @ 9@^xx@ h #c@ h+@I@ H5#+@`, `t`H!Y"`t!Y@x`H 7A.0 \`x?t`x+`9``<@ `=H!)!!hh!A'%A+0 @_ xNH%-c* .p +M[c@`3 %;`/0 /A@ @. \ xx@ h +c@ h5@I@H'7+5@`*p `t`"H!Y"`t!Y@n`H !A .0 @ ] x?u x+`: `=@ `|H!4!1hh!"!;A ,p \xMH;-)c* )p M\㸞@ `3 ;9` , 7A- +@[ x`x@ h c@h@I@ H7@`(p `t`H1!Y"`t!Y@7`H A`,0 Z x?r x+`; `=HJ!M!UhFhD!@hB! 5A/p @ ZxO`H / c+0 @-p %M\c `2 `* A @/0  [x x@ h %c@h'@I@H%'@- `t`H3!Y"`t!Y@0`H !3A *0 ]xux+`; =H !G!Hh 91A . @]xM2H1%`#c* @)p ;M^``2 1 `- A-0  @\ x x@ h ;c@h'@I@ H-;'@`- @`t`Ha%!Y"`t!Y@`H 35A`, @]x?ux+`: `.@ ! A .0 @ ZxK`H;+`c,0 `, #M_#`3 `* A @+  @\xx@ h #c@h)@I@ H#)@`+0 `tH+!Y"`t!Y@`H !+A /p [`x?s`x+`8`.H Q!XT!h Mh K!MA.0 @ Z xN@`H - c* , #MZ@`3  `*0 A @.p  _`x x@ h #c@h+@I@H#+@`-0 `tH!Y"`t!Y@`H !A *  [`x?s`x+`? `&@ `=H !!h h ! 5A/p  ] xJ H c.0 ` *0 3M\c`@`2 -`-0 A*  !@\xx@ h 3c@h+@I@H[)3+@`- @`t H!1!Y"`t!Y@*`H !1A + ^`x?v`x+`>`=H !!Nh h !?h !>1A +  ] xK`H+ c,p `/p 9MZ㸦`2 -`(p A-0  @^`x x@ h 9c@h7@I@ H-97@ - `t Ha;!Y"`t!Y@`H !;A . _ x?w x+`>``-@ 8`=H N!+Q!,h J3A`. @ Y xM`H% c,p  -p M^㸦@`3 ;``(p -A)0 !@Zxx@ h c@8h @I@`H @.0 `t H%!Y"`t!Y@\`H !%A /0 [`xs`x+`:`+@ `=H !5!6h (p 㐀h  !Ih ,?Ѐ`(O>]`xou`x _`; ,0 @1J &Oۣ>o]`x-M\c`.0 @ "g G@poG1 A, !I- \ x?h t x;/`  , `` /0 M@@ ,0 - , #c+A%A + @  @ x \㸐 x@qL xu x``t  %``$``O$t A - ]`xL@`o(u`x#``+-. , `)@M ,0 , /A)p * 5c@A@ `   x\㸐 x@pL xu x``t  %` $``O$tA )p  ]xN@`oGux`5  , ,p `+M7@ @, ,0 + -@.0 cAA@    x\㸐 x@pL xu x``t  %``$``O$t A .0 ]xMoux`%3;1,p `)0 ` M7@ ,0 (p * , -@cAA  @  x \㸐 x@pi L xu x``t%` $``O$t1'A (p ]`xMou`x `3;7)p + `!M/@ `@, +c-@/0 . * A A    x\㸐 x@p/ VL xu x``t  %``$``O$t7A.  ] xM@`o@u x  /)`+M -@ )0 .p ,0 * @, #c* 7@ AA`  x\㸐 x@o)L xu x``t`%``$``O$t)A *  \xO otx %/5,p  )0 M3@@,0 - , )@* 9c AA@`  x\㸐 x@oL xu x``t`%``$``O$t5A-  ] xO@`ou x%`)'5- -  M@,0 #c+A/A@@ )p /0 . @ @   x\㸐 x@oL xu x``t  %` $``O$t9A)p ]`xKou`x'  .0 -0 `M5@ ,0 - ,p %c-@+A@@(p 1A@   x\c x@oGRL xtx``t `% $`O%`t /A (p @]`xLou`x9 `-7,p )M)0  @@,0 *0 %c/A )p + @9A@@@  x\c x@o 5L xtx``t`% `$`O%`tA)p ]xLoux -'+- `)0 M@,0 ,p %c.0 *0 5@ AA`@@   x\c x@nL xtx``t`% `$`O%`t+A`.0 @^`xK o4v`x#`%+`- -0  7M1@ ,0 , -@/A@)p .p ;cA   x\㸐 x@n2L xu x``t  %`$``O$t3A )p ]xNoux`/'- )0 /0 7M@@,0 #c+A(p -0 * 3@A@@   x\㸐 x@n_L xu x``t `%`$``O$t-)A(p ]`xL@`oku`x+``#%57.p -0 `'M9@,0 -@@)p * * c1AA@   x\㸐 x@n%o \㸀"g @h6o -!+5 ` )0 + @3M-0 ,p , /@-A , 9cA@@  x\c x@hL xtx` t`%$`O% t5'A,p ]xO@`uxo\\㸀"g @go % 3 -p `.0  5M9@`,0 @,p -@)A+A@* * c x \c x@h]L xtx``t`% $`O%`t #A`* ] xMu xop!)' 9-    /p @1M,p %c/@+A-A +p )p *0 @  x`\c x@h"UL xtx` t` %`$`O% t'A)p @]`xLu`xo @fo*\㸀"g& @goo" \㸀"gs @ggoo \c"gÈ @g_o !#  -0  %M``(p  @-p /p /@)A@ . * 7cA  x\c x@gPL xtx` t %$`O% t ;A`-p \xO txoڊ!'1-0  %@+0 7M *0 ,p /@+A)A+p )p c@ ` x\c x@gL xtx` t` %`$`O% t'A)p @]`xN@`u`xo\㸀"gC @fo? \㸀"g @fo݈ \㸀"g؈ @foԈ -`!#)9  /M`)0 (p  @-p 'A-A +p , . 1c@@@@  x\c x@g;L xtx` t` %$`O% t)+A , \xKtxo!-)1 +0   /M)0 3@, ,p +A(p * 5c;@A@@   x\c x@gL xtx` t``% $`O% t)A , @ ]`xK@`u`xoj\㸀"g @fSo \㸀"g @fKo \㸀"g @fCo W!hP\c"` @f7 o\c"` @f. o8\c"` @f% o\c"` @f oӊ\c"` @f on\c"` @f  o!h!2h\c"` @e o\c"` @e o!h\c"` @e o\c"` @e o!h\c"` @e o݊\c"` @e o{\c"` @e ok-'-0 A* @ 3@^x`x@ h c@h@I@H'@*p @`tH7!Y"`to'A-0 @ ^xN@`ovx!-'.0   /@+M(p -0 ,p %c+p * @ A1A@@  h  xtx` t `% $`G% t\c x@e ?L x\c"g @eSo \c"` @eK o^!hW-)3 -p ,  `M;@ ,p ,0 %c+A@ )p /0 @A  h  xtx``t % $`@%`t\c x@e ?L x\c"g @e o 9A )p @^ xNov x\c"` @d o\c"` @d oNHLld\tld\T\@;9@`+0 *p bX`h @c#3%D`, @L @+ɪ`-p @t`h'/r , Z@ ) .p h@\"@D נ \`h  O"(\*D ``-p ,p @@ \`hB! '\`h!&t (, 6-\`h!Pt (-p @*!'t (\`h, aP!Pt (i!YO!I"@Nh< !8`"@`'@[ )_ +08.p 9p81  `B`H`.@`0@o@bΐ .@bÐ"J  "Hy *@b e" %`-0 .*!5!+`?cX `?@;9A`-0 \`xKH`/+c*0 ` (p M\#@@"`G7,p , 3@[xx h !ch@I Hߤ`!@ )0 @ `t`H!Y"`t!Y@`"H"``)0 @]x?@ux`-,p 3Zx-0 'b``)@. -p +#@A '`t' + :`0@͔ N @#'_`-0 b1)p8 @`<8@ )` 6 ` O@A  @c'!b*p !hs# E` +p 1@@cʮ &(- @b-E@ Z h!,Y  d*? W@c ` f@@b$Z 6)% , ,p h ^ ) W`2O^  @b  G ^ x<` `@ +p@aCc@a"@ O<`^ `? ?ܶ @b'#E, /E !0"7@b.0 Z ha4Y `d?*? W@b``  (p f@D @ $@', -p @ >`t`h7/ .0 ["@oV\`hoä` * `@b. ] hc7Z (![`p/h6!Z!\`!]`k;h;: N`x`X`?`?HAN`GB/3_+0 1)p8 @`6`  `Oo耢E` /0 ` * oF47/ .0 Ő#o'1 . #o'  +p @co-3`D -p . c` @`-   !b+p @ hro#E`'* *p oD!0@` E > Oo p@o #_ - 1)p88p8 `! @`. `OL`@ !_`-p 1+08>p8 ` @`-O OG9f!`)0 w-p ,p !c #'R)褐R+ /p4w,9`#w ` @53_- h1 ) ? `@ +p8`0=8@ 4@ "O  ) 8``+@f`-"@_?wߖ +`'7뀣 @/%_)p b1+p8:=8``  @1)~ +` O+p8 @' 9`,(w@>I?' NVOH; `H,`. hR- *p @oMcP! b/p  J `@ -_ *p @b1+p8:8"g  + O3b)p !c@_1ba5s   +* f`-+ @#;`@_#o Oo!`# ``-M `)0 *0 , -0 , +@+p cA   x]# x@aL xtx``t`%` $`O$`t`, @]xLo)uxbc(p @\pP< Z (AM@`O!RhGN '@ - -p >cN/b!. h3v`- +0 @Zx x@ h c@h1@I@`H<`1@*p `t H!Y"`to- -p ,0 `1M  (p +p ,p %c/@+A*  x @`\c x@`&L xtx` t`%$`O% t`,p ]xLuxo]#"g @_o 3E+0 (p oEa,\c"` @_ o% 1c (p  @/0 #O " P""!;h:' o o @; eE@ @ @ 2H TJ `+@, `-@)?T o③N  +` G;% `,(w(p _1+p8; >8 @ `'  +` JODoܕT +`: `@  `0@ ) o  "OΕTo; ) wߖ '7@/ -_ /0 @"1+p8:<8 @`` @(~K`O #*4w @/ 9`-(w@I?'ﱠ NJOV  `)p(w@ /fᙳ+0 i. 陛*`w#*p4w w@ `'N﹠o ЃR JHCoO^@www@^)wƀ  )p h @@_Z@@^@ @O@_֐Z@ ?@I -/E+0 \!P€)p h]P@]А"5 \ *?\hG?`'# , @_`=@_ -J   .G@]? ,m ]!Pv u!Pv@_t& @_ ? -@_oNJ oλf E )p @XaP  \ \taP\aP*?\   }@^)#O@^ʦ %, 4 (@^"  ~>@@r!@@_k  @b .@]*@_* * `*0 `@ @_  *`(`@9@' <+> ^@`*0- -O@; tb 9 ) ܴ!b p \ / rcs*  P@wb  Q. *0 #_ [ w !bwal '@!7 <`,^@L-@ @@ <`&/0; Y@ ,0`Ot&``@O<``)p  @]F(%53`.0 @]+ 8  #(p *p  `@`Hɚ  @] 8 ?Ґ5c)p  #`9`` /p #1`, *0  ;b.p ++p )p  Prch@   h `@\ @\ ^b YB:`@\ ` ?@^"N`h`@\ @\ΐ ? @\ /**Uuh #* `@.p +^#h@`,0 @\s9@]o`9 ` 3 1 *0 `*p `*  `93+0 /p * , @@o>_- @r+ vO @@ ~ r@@ >w~Ww@; !r@g>q@~@@r@]AO`#G@\2 , *, `O@\@?@[ @[`@[ *?ݐ~@@# @\&?+~@D+0`$u@][ ?O@\ϐ  -3/0 * ;`@!   ! *p  @[!(  ~@Z@ t9c- @#`h }J\ `+0 D@+c,p #`` #7`@5\ @[Q  (p @[r >] ^@L Gk  ,^@ J `6@ Ȕ`1`* ,0@"^,^@ *p   @[N `5-0 a(toF@1 o#1`@Y/0 +0&w@#@  H)p ,  ~J'@aPa?`$;@["s oM%),p @oca(` )p !0ov@[A> @[<> @[7>@\Ð">ې[ Ԕ`@oϐ@[ >ʠ @[>Ū @[> >o! Z~w(p `Y@b@Z[@g ~w@Z\@\vd  ~_>WZ@Z`@\C>@\-@ZȒ **@\R"?+~X@@~ @[ow`/0 7*0 \ +M- '@`!a@[W  @ZL5c-0 @c` c, ^@: I `2O,`od@!c * co @@oܐ ,9^@> `s@Zkoߐ?c`)p  coֈ ,^@  E* @@  u!8^@@ZToȐ?,^@~@ @ZItc?(p  㐴 o"c`)p  co ,^@  E* @@  u!@^@@Z*o?',^@3,p @Ya ?uM` )p / #`!.p @Z5@@3@Z `*0 - ]b 7-a@Z'  a@Z'  /  /0 @Z)  /`)p  @Z" * @ P@Z7,p  !@ @Z"(1@Zc   ` /p ;@Zo5  # + @ "@Zd5   * b@ZZ+ -  @/bh@ZO3   (p `3@ZE" %-0 @ @Z=c0@Z"    :*0  `@Z/7` *  <c@Z&.0  <@ c@Z- + @Z #  B /0 7X@Z )  <`)p  @Z!P > @Yࠒ@Y  `*  <@Y`  A` (p  @Y@Y͐   +  >@ @Yܐ!  . * @YӐ`@Y o !c`* @co ,9^@  )E. @ `r!H@Y ^@ o~?) ,+ ^@@  @̘ @X^@on?,*0 ^@@  @@X^@o^? ~OY@ oڐ 3/`.0 @ZѐaoC 5-1M.p -p ' ! @Yw !o1 K9>@@@}`H @ - )\@\@`?O c+0 h M` )p  @Z'%O/p >@@3z%"pծ@<@@X@=`                                p P (      D  $   x@ `*p `@`Hu!0 + @ "Hm @Y.#  (p @@Y"P?@(&" #)*p : @4p @Y"`?@K F"`4p ,0 @Y"?@6 ``,0 @oo#  7E /p !t@<_@3_ hGa"@`H aaO'_`oȂax@$aO'_`ohob Oo` O ``O{ @W@Wo_@box Ko_`ob*  @2c@ o$!t%.p @o% 0`)p b@9`@Xn@@ E*p @\# @!  t#``)0 *p E!E@*0 E" @"c t#!E @+  "#@ E *p +@'E]#%@#E`)0 , @@c @*<h9]#`u#,0 + @*0  E!c@ "t#!`)0  , + @E@ @c "#Oډ<@*0l:`Dc]#  @U*]#$cu#; ^  $?(pu@@^ $`t`$` ^ h@  EX`*p Y#\X`@Uy\ ?h"@t\` /) `` ,p E;@-p /0 . . )0 - ,0 9O75bE; @@@Dc @U\#\#c^ ''w'I@`_`?@@`@@ @ `@[` @:`F @x@U' D*a@WJ*?@X@@q `@K#@@2 @ \# IH`)׶ O \# @hU@W ?O$ hL3/O`).0  , Eb@V#@0\`h9$\##@%#:`Ot#h,@T oD^ @:`o ` H!@W\#h& @!"@@bhGb;@Uծb@^ #d@@0} h$ 2O@ d@ '.p ^ @Y`  .p ^ p ?@ d@3N6p ^ @Y` 6p ^ p ?@E*p @Xc\   @:@V\*?  ϒ  x@U O^ @3EY ! O*p *(@ `@@ @E !*0 @@TCc  * *p  @cЖ#< @T+ @VH!?@: @U !`?'W@V[^ \ @\`0㹠%'E)p @\#"A#E`O)0 !c@T`+ +0 * ?'W@@@U\5cJ  `.O@S @U: !@ @T!`@Vo8`@V h^ * @@Uc ?t#c#`,0 @@b#o^ Z`@c\0@'%E* @*p \#@ c )p @U\c@Uz ?t#`c,0 @@0#o@^6`@S| @`a^2@Ss @6`^`p  @S`2+-F`)*0 @a؀ H'0 * Zcc?o30 @T̒?@\ g7#@ \ ?` )0 $!ج - @]##+?`50 +p %F60 @hZ@"@Z Z*Z0 *  h^#Z@ "@Z Z*Zo*@!XhZ@ c`)p @c  c c`)p @c` cZ [ [ Y Y`0[`0s @ @@( a`@ `?@2H `@$`@ H H` ^ P"|` @ ` H8``"@  @H``@`H` @h h&  O쀣` ^ P 〣 a"O Ho!H`F @ `@1& ` H ` `H逦` "@ BHy``"@~BH``HBh& @@`H0`@a@^bO•` @oޒ @ ` H``"@& @H``Hh& @` "@& @H``"@& @HD``Hh& @@퀦`Ha`@Hh& @O`o @@ `H a`@Hh& @ O'˞`6`'Ǒ+ )p^ @b(@ K :` H ǀ v @$@&  ` @l;`HL``@;`H{``@;`"@M` H-` "@` `o瀣 @πbO;` )p` @;`` H``"@9JH``2O`J';`^ @)@ H`oǀ ;` )p\` @=;`` H1``"@^ @Ho``2OΚ`^ @;`+ o HG造`Oǀa`@O;` * ` @:;`` H.``"@^ @H``2O`^ @;`* o H *0oD@.;``H1a`@2O`;`^ @)0"o Hh@i`O;` o @6;``HHa`@2O`;`^ @*" o H o o^ @^ @`*p oZsG;`b2On`w;``(p ^ @ oK: @;``2O_`;`^ @` o?2 hv @^ @`)p o7rGbHw h> @G`Hh& @G;`b2O<`;`^ @Ā)0w:`o ;` *0op\;` @oMT  oJJ@;``2O`;`^ @` o1hv @GbH~€u whw> @^ @o G`Hphn& @@%`Ha`@HgBhd& @"@J`H1a`@2O`;`^ @J*p!o HGx`HQo둠B@3b"@K> @hIBhF> @;`^ @`*0 o: "@!J`2OΚ`J';``^ @@ o2 "GꝠJb2O`;`^ @`+ o9@';`^ @o)@o'@Sߐ__w@Swhv @4 @ wBok:2@w怒R> @@^ `"@Y H ``@ `Hh Y H Y  @R Y  @R`@^ `"@Y H``H hY H Y @RА  @R͐`@@ w5 w7M)p w@.p ww x  @Q @QG` F*0 @a"H ;*p :@Q @O @Pِ o@^ @^`@Y X` #`O+  * b(o H "H. H H@@P H\ @@7^ @ `@%d@I0` H )p |d?d`|@-I c"@^ p^ ^ p ?\ phO`@#d"@&\ @ov @ H `$G^ p>``*0\̐@ Ho HGɐPko^ @@Oŕ9`o^ p\ @ @o^ p>o^ p x@O  x@O' H`G>>`+\@ `w\ xw/ HO>`o^ p@ d"@1 H HH`F ` >`3`,0 ^ @,p3O@ (  ~d|$ @YK >@Op@M`H8``"@b `HB``HaF `>^ @@h[r@`"H^ @`^ @@T ><`*0\Y " `\ p ? H`@O<`h?Y` <>^ p ?h3GҀ`H!a` @`@H*F `> @ h$$@`H F `> @@h2^ `+0  oGbH >F ` @ h> ` @<`*@@ H `H^ @Y@X` ^ ``` @2K@ H2h Ho^ @`"H^ @`^ @@' < <+p\ Z "@ H^`p  H@O<h[ < 7^ p ?hp: o΢@ "@2 H H H OF ``2)p ,0^ @@>b(  @^K@  |$~d@@w#>@N@LH7"@b `HAHq>F `@\} @`"H^ @`^ @@e ><`*0\Y " `\ p ? H`@O<`hPY` M>^ p ?hD@3H" @@H;F `> h5& @@H1F `>@ h+& @ @( Y@?q@O`h @H>F `h> @ `8` h& @F `>Zh v @^ `+   o>㼠%'F^ o)0 \@ x\ @Na  @"F * @ [Y Y @Y Y Y Y (Y 0Y 8wwwwwwwwwww'w/w7w?wGwOwWw_ Hw Ւ4 *p )p"X@ @n w @ "@ ^ P@ "@!2`^ P @* H Hr`hp ` "@H뀠a`"@ HȀ``@ `HUchQ& @hy'w_"?@M & H'^ P" HO*  x@M! ^ P@,W O,p +@b(@ `@ `@ H4H  +'^ `:*p <`   ` @~^ @` Hla`@ H8``@`2H<`-cH` @pHEa`HhW _` @^ @` Ha`"@ Hh``@0`Hmh @ aHcb`@@ `Hbh  Ho' ``"?@C  ||@M@o G+^ `-0 @o@bHlǐhhMo^ @@L:o@ aHـb`@@ `2O<`_,0ot<`+0o$oJ& HҐhCM}& Ho&@`Ho Gd@2O`ovc@ aHրb`@@`Omc_oiv @of& @  'Ϟ ww' 'w'@Low  w w'' 'wo'w   w'' 'wo'  'Ϟ ww' 'wo'  w w'' 'wo'w   w'' 'wo'  'Ϟ ww' 'wo'w  w' ''w@'o|ww  w' ''w@'omww   w'' 'wo~'@`2O<`o4@cd2O x@L <`(p\ w/o``X@f`G \@@`?2O\@o`hYєhU@;dOc” o@`Oco& @``8 x@Kِo x@K'7 Hd`Gv \@ w/\@`w?2O\@oh<`*pob<o_> @LR^ @o H<`_-p@oSLFo^ @_ @oJMPM@SlS0RRRRPRQQSbw_`hn`!@Mߐ @ 6__`h6_Y `1!)' ,0 #F+ @"@   h  @@D^ p"_^ 8?\"\\``wwww'w''4wo^ p_ h1&_]`(?  `,p !F-0 ch^ ^ "?_ #`o$ao^ `)p !o_^ Z`0@#o^ p \ h*\ X`0@``<`F o*0   x@Ja\  'w^ (*@X`w w \ @[`(h@ X$@`$w w \ @\(h Eo$@oZ X` Y  `@H ``@`@ @O|@9@@@^ \` @0\`Z (\` ` * F)0 Fbp[bp\ \[∈ Z`Z`wwwwwww'w_w^ p ?\ @\`h@㴀@`H 3`+0 *@  X@^` > `"@  @H3`@`"@ @H``H  @8h& @#F^`0 ϓ* wߴ @ZX`X`www'ϐ^`0 x\@J%h^`@ Wv` &@>"Hv`^`w\ P*ƅ) `"@ @Hŀ`@`"@ @H(``"@ @v` h&@ &@> H&@^`w^`P*C ``"@ `@H`@`"@`@H``H`@h&`@^`@ Hv`wZ P D' `"@@ @H`@`"@; @H``"@6 @> ]&@ v`hx&@H^`w\ P   `"@ @H`@`"@ @H``"@ @> =&@ hY&@^`@ΐv` &@/>"Hv`^`w\ P ƃY `"@v @H-`@`"@q @Hǀ``"@l @v` h4&@H>^`w\ P DE' `"@ @H`@`"@ @H``"@ @> &@ h&@^`@ ` `(>z\h `"@6^`^`w\ B\Z (\ ``* F)0 F"pZ"p [ \∈[ X`X`wwwwwww'w w\ p ?\`@\^`\\`0^`"^`P@"H ^`P`@@mH瀠a`@怠` @^`Pٔ x'F`+  x@H#>^`P`O(p @ *b( @@ O @`H4H ` ^``:*p < p`` @W^`@` H?a`"@ & H``@@`H~& < @ hy& @ &@T> Ho&@^`w^`P*``"@ `@Hu`@`"@`@H``H\`@hX&`@^`@͐Hv`wZ P C$  `"@ @HQ`@`"@ @H``"@ @> &@ v`h4&@`8` @` GF';o'7,  x@Ha> x@H]^` ^`(w ;@ 7g@ @ & 2`x 7;@ @ 2`';m'77;w` @H``"@uHF``@pO` @/Ho``@K2H!``@#O2`8` 8H* 1`(p ,  x\@€ @  $ @ov` @ ?$ @ov`  +p @!(%+ @8G? ` "@J` H'``"@,JHဣ``HJh& @G?o앤NG?G?_C ?_j@J"@woݕw?ZOG^` @`H#1`,0 )p`YƀG?o VG?o `@GHU`@`@H``O` G?F?_L?_h1+ `@GH$`@`@H``O` G?@?_ﻠ_?_h `@GH`@`@H``O` G?[?_﫠W?_wos `@GH耣`@`@H``Of` G?O?_K?_o|  `@6GHǀ`@`@1H``ON` G?T?_P?_o΃:P`, @ (^`(`O(#ߠ1`,0 )0\@!  )p @oX# `* @o!h#,0 o X[`[  ْ 5, @oҒx `*0 o!Z [  ~ %3+ @o#5`* ohZ Y` >3'`(p oޔax +p  oa[`X` 5`*0 o@瀣`Ha`@HJh}& @@o^`@܀`Hƀa`@2O`8/L wo??@ꀠ`Ha`@O{` &E wor?G @`o$ @ @o$ @ @`o3$ @ @?o$ @@ aHb`@@`HB< & +Z@h `@ H4H   \  :*p <` ` `"@\ @H`@`"@\ @H``O>\ @<` o*5FO*p  x@D! \ P| W O +p ,"(@ ` @ `@ H4H   \ `:+0 <`\  `"@\ @H `@`"@\ @H``2Ov`\ @<` *ov` F O+p  x@D \ P9 WO(p *(  @@ `@ H4H  \  :*p <` `"@[\ @H`@`"@\ @HQ``Oː\ @<` o*^` >hG~`@H`` Hox`@GF`@Ha`` 2Ov`o@ @G`@8Hx`o耠` G=`@H\`` 2OAv`o7 @G`@8Hu`ou` G`@8H`o` G`@Hq`` Ho`@G`@8H`o` @aH(b`2O^`P욐o^`PG׀`@H`` Ho @@€b"@> @hG$`HoEJ@t`2O`81' o??@nbÒ` o?G@eb2O`8/o??@b`O` ' o?GJh> @/o0' o??@`H< &  @h& @@EdH< ^`)0& v Z@hv @o"' o?G@`@H|`` O6\ @<`,0`o.#@`@H(`` 2Ov`\ @<`+0v`  o" @`@Hi`` HS^`@< +0@hL!@@`@H-`` OƐ\ @<`)0 ?o# @`@H `` H7^`@< +@h0!@@`@H'`` 2Ov`\ @<`)pv`` o$@`@H`` O\ @<`*0o#@`@H`` O>\ @<`)0@ `o!@ H^`@<  @`h1@O\ @<`@ `o4OՕ>\ @<` o32Ov`\ @<` @ v`o6O}\ @<`ou3OT\ @<`@?oL4H^`@<  @?h1@2Ov`\ @<` @ v`o62O^`Po^`P@a2Oyv`\ @ t @otv`@a2Ov`\ @ t @ov`2Ov`o @@aH^`@hv`@@aOs>\ @ont @Ho`@@aO\ @ot @@aHz^`@ hvv`@2O?v`o @Hpo`@@aO/\ @ o*t @@aO\ @?ot @o^`PHXoY @@aHR^ @8hNv @o1o_/o_oW< & ,@h@> @@a2O~v`\ @<` +pv`Y@ovq@@aH/^`@< *0Y@h(q@@aOŐ\ @<`,Zor@aO\ @<`,Z@ ?or@ @aO>\ @<`,Zor@a2Ov`\ @<` *v`Z `or @aO\ @<`,Z  or @aH^`@< )0Y@`hq@so!^`Po^`Po^`PGۀaO%` G@Dbϐ__w@Ddw?@DX__w@DZw4P@o`wo GaO` G@DDϐ__w@DFw?@D:__ww@D<oGaO` G@D+__w@D-w?@D!ߐ__w@D#wׂ @8`woҕG;aOЀ` G@D ϐ__w@Dw?@D__w@DwoG aO` G@C__ww@C?@C__w@Cwo.P0p wﵠ oZG`@O`` OGo?Gl`@Of`` OGo>?G`@O`` OGo?G`@O`` O{Go?10 wDoA??10@w Bo,?GG`@O`` ObGo?J@Cϐ__w@Cwv @dxhhhdxhdxdxdxdxdxdxdxdxhHghdh,i<gi gggggggghdeeeePefff,egX|_\b_\|_0^b$a^ ]]\[[^ h@   )p h@<*v@ \`h@ OU<*v@ \`h <*^@ @\!; `O*  `- @/F+)p )0 @@"( o\P €\`@H^@X` " \\\ @@q/\ p*?\ \aOh' x@@p \P w(p@ @퓒 `@HH8`8`\:`\`@,0o\*?ڲo\^ ^ P @ `"@  @HO`@`"@ @Ht``H} @hy& @F`o)p  x@@@*! ^ PƐwO`+ * b( @@G  @ H4H  ^ `:)0 < 戀  `"@.^ @H`@`"@^ @H$``H>^ @< h8*G`@H `` H1o @@'`@H#` `@aH&^ @< *pZhrH^ @< @?h1@@aH^ @hv @H o @H^ @< *@?#@^ ^ P @ `"@  @HO`@`"@ @Ht``H} @hy& @F`o)p  x@@?! ^ P6wO`+ * b( @@췒  @ H4H  ^ `:)0 <   `"@.^ @H`@`"@^ @H$``H>^ @< h8*G`@H `` H1o @@'`@H#` `@aH&^ @< *pZ`hrH^ @< @ h1@@aH^ @`hv @H o @H^ @< *@ #@㵠^  Z` Z`Z  #b@*Y`0 H`"H ^ P) >'O  +p *"(?@bL^ @;  ht`@`"@) BH``"@ CH``H^ @ht`@ H"H^ 0^ P T^ 0ht`@@ `HGa` @`@H @ht`@@}`H} Bh{t`@F O)0  x@@>ђ! ^ Pm * W@()p@`@  @ H4O^  :*p < @Oo `*0 FoLGbH@ @h>t`@Fϧ*p  x @>% 'O^ P/*0 ׂ@b()0@ @벒  @ HH  ^  :-0 < @  +0 ^ 0*p(L8`ht`@ Ct`@@`H`H^`@^`P\X`  ` € `dHt`hO^`P\ `` F *   x@>:a ^`P֐  O(p @,( @ @W /`@`HH 8` '^` 8`)p :o@> x^`@,0wZ$'wH1wX` @.<`I^`p h%"H\ `@  <`<+0\ Z " 4\ p ?`H@O<h  <`$\ p ?@Fo*p  x@!@=Œ x@= `(@^` HX 1`* )p@#X@@@_HȀa` @`@HE/ h?`?=  9^ Hw7 Hc`@ c"O @"G :H 걓0`o `O7 o'w꧓2`o ^h`?^h ^  h< ^ "< ^ z4h< _/@?@>_o_/@>@>_h@ w`@ H``"@/H ``H_@_/*@ I@#`.0  ̐"_/_I@J@@ HĐ @= z8h8`w`"@H``@ H``H_@_/*@ I@+p @ 즐"0_/_I@J@H @< z(h8`w`@Hw``@/H9``H_ A}_/_/ hxtw`G>O2``G:/H``Hv_ A^_/_/ hpxdw`@jH^``"@/H``Hb_@_/*@ I@1 ,p XX_/_I@J@ HP @<82 hJ: w`@cHW``"@/H|``H<_@_/*@ I@1 *  2b_/_I@J@H* @  `7F#*p )0 @?h ,0"@n`HHZ  "@w\`@\@Ā%  x@6=  앐,0` @;&@ O怡  @;,0HD! @c @2O\@,0`@@p@\@ ߨ  @d (@l? @z7!?-h?@pO^y?2OhdG O!_` oZ@`B,0@op@,0\`@@op@@& 2O\@T`Bo,0G"2O\@ ,0?@\op@ @,0oL`C *p .#o^ ,0yPov@ `Coу,0D`@o΃,0,0yD\`@ toy&@o_`?_/p\0@7no&@_>.0@8o )- oD\`@ Fo*0  xa@6F ^ X`  @8G@^ ?* Y @ X`0y`@M`*  @  ՞@F o*   xa@5 ^ Y` ^ _Y @6X`0$ @@ F^ `o+   x!@5 x@5 ^ | ^ wZ@`_/  *0 @<@^ 1O w+0  ,[0"(# `(p F `f * ! [@`09 ,pZt@_/r@5    `*0 @@5@  h`* hc@4`o^ @8  Fo*0  x@5a ^ X`  _=  F^ o*0  x@5fa ^ ^ Y 0\ @@7Y 0w @)Z@ H @ @$H/  H= G` .0 @ P@5<h2@ @H! @"!H)  _*p  o X  *p  o Hw֐ t @o^ Ho H o  _` .0 @oΔ `0^ Fo* Y`  xY`a\ @4Y 0 \ @ꖐ^ @"  $"@k Hww O )p *p@"( H_& H HH&H%H4#!F+F`v @`w/)0 )p w`F@ * "Z"pX`(\"OX`0 ]"X`@Y X`X`X` X`8Y ww7w/wwwwwwwOwWwgw_w?''7]@"* H$"@Hwh" HG < ,Z5& H4O]@wx]@h H`G <  ,5Z H4O^ @wh^ @o4%Hu@w/^w^ FoY` *  xY`[`a@4ZY 0 \ 8^ @  $"@ Hw=wO+0 )p b( 4H_hG <  *p4Z H@4O^ @w!^ @o& H4Dv @^ Fo* \` x@a@4Y 0 \` 鰐_@%' ` "@_Ha`"@ _H"``@`HN_@hK& @@ aHb`@@`HB_Z@h>v @_o , @ㄐ ho @`H/_o@GꀠdH( H`H_`^ @@  <*\ Z "   \ p ? H@O<h ^ @Y`  \ p ?㶀^  F`*0 wg^  a x@3 x?O xo@3 _gZ o^h*\p] @h=,0 #*,0hh%@z@ @ @ @2`,0%@,zdOܤ,0]z@H@ `H0t?\@ Y\X` ` `K v9`d@ouz@H`"H\@`\@G > =+p_@ Z " 㨔^ p ?H@O=ouz@o\@[ "?uz@> 㔔\ p ?ouz@^0^8 ` "@C Hda`"@> H``@e`@7 _g\ č2 ;1` )0  #O`+p * F @"(hoč<,p%-p:2O\@:H`H,p\:PI:,p#@-0@u\z@\@*<h  8O% @;%`5- -p@"^O+p +0 (@ H_/720 d@o% @@ aHb`@G׀`2O_g 8HYd9 5. )p Z  x@2o,pZ wHG\:@X@_Z  ` F wO,p`"H_`_G = =*][ " 㽔\ p ?@O=o,p ooM'w/1O, )0b(`H_/720 `d@  d@BoCu @X` _``? a x@2D _w-@g `@RHO8`o@2, x_,0Z@$'7w?OAw/X` ?>= d\ p ?o6,p@dohG;`o H`H ] @\Y`  ` ] P ! O_g`"H \ `G <`<-\[ " 5\ p ? H@O<o_g8`_: }ooY` >= \ p ?o,p95O . )p@"( `H_/720 d@o.0`H_2p d@+0 H_'2 d@ _,p`H_2 `d@ױ)0H_30 d@O.`H_3p `d@ǭ/pH_1p d@?s.H_w1p d@s-`H_1p d@/s(p H_go1p d@sǥ-p H_1p `d@sω,?H_W_1p `d@sןo1-O /p )p@"( `H_/720 `d@o.H_2p `d@+0 H_'2 d@ _)0`H_2 `d@׷/0H_30 d@O/p`H_3p d@ǯ.H_1p d@?s-`H_w1p d@s- H_1p d@/s-p H_go1p `d@slj,?H_1p `d@so/ O, )p@"( `H_/720 d@o-p H_2p `d@+0  H_'2 d@ _.`H_2 d@׫-`H_30 d@O,`H_3p d@ǣ,?H_1p d@?s)0?`H_w1p d@s/0H_1p d@so;+O`- )p@"( `H_/720 `d@o. H_2p d@+0 `H_'2 `d@ _.0`H_2 `d@׵.H_30 `d@O-H_3p d@ǧ- H_1p d@?s-p H_w1p `d@s, H_1p d@/s,pH_go1p `d@so1O`)0 )p@"( `H_/720 d@o,pH_2p `d@+0 H_'2 d@ _,`H_2 d@ף,?H_30 d@O(p?`H_3p d@Ƿ/0H_1p d@?s/pH_w1p `d@so9/O . ."( `H_/720 `d@ o/pH_2p d@+0  H_'2 d@_+pH_2 d@׻)p`H_30 d@O.`H_3p d@ǥ-pH_1p `d@so\+9O`, ,p(@H_/720 `d@o*@ H_2p d@-@ H_'2 d@ o1/O, + "(@ `H_/720 d@o-p@ H_2p `d@.0@ H_'2 d@ _.@H_2 d@ץ-p@`H_30 `d@o O+0 *b(`H_/720 d@o+pH_2p d@)p`H_'2 `d@_-? H_2 d@ף, H_30 d@O.0O#_3p `d@o +O /p -b(@H_/720 `d@ o*@`H_2p `d@ o +O /p -b(@`H_/720 `d@o+0@ ?H_2p d@/0@H_'2 d@_/p@`H_2 `d@oO oK^ *0  ݘ o H o 1-O /p )p@"( `H_/720 d@o)0H_2p d@+p `H_'2 `d@_-?`H_2 `d@׉, H_30 `d@O.0H_3p d@ǹ,pH_1p d@?s.0`H_w1p d@s,pH_1p d@/s.0`H_go1p d@sǹ,pH_1p d@sϭ/pH_W_1p d@sן o /1O, )p@"( `H_/720 `d@o,? H_2p d@+p `H_'2 `d@_(pH_2 d@׫-`H_30 `d@O- H_3p `d@ǣ,? H_1p d@?s-?`H_w1p `d@s,? H_1p d@/s-?`H_go1p `d@slj,p?H_1p `d@soy  9O`, ,p@"( `H_/720 d@o-?`H_2p d@+p `H_'2 `d@_-H_2 d@׷)0H_30 `d@ O)p H_3p d@ǧ-?`H_1p d@?s,pH_w1p `d@so -%O-p )p@"( `H_/720 d@o(pH_2p d@+p `H_'2 `d@_.0`H_2 d@׉/0H_30 `d@O-H_3p d@Ƿ(pH_1p d@?s-`H_w1p d@s(pH_1p d@/s-pH_go1p `d@so -%O-p )p@b(@`H_/720 d@o-@ H_2p `d@ ,p@ H_'2 `d@_/p@`H_2 d@ oq1-O /p )p@"( `H_/720 d@o/0H_2p d@+p `H_'2 `d@_-?`H_2 `d@ף,? H_30 `d@O.0H_3p d@lj/0H_1p d@?s.0`H_w1p d@s)0H_1p `d@so 7 O(p +0(`H_/720 `d@o-p H_2p `d@* H_'2 d@_,p`H_2 `d@׭/p`H_30 d@O(pO_3p d@o %9O,p )p@(@ H_/720 d@o)0@`H_2p d@ o+%O`+p )p@"( `H_/720 `d@o)0 H_2p `d@,p  H_'2 `d@_/p`H_2 d@׉(pH_30 `d@O-H_3p d@ǯ.H_1p `d@so2  7O`/0 +p(@ `H_/720 d@o+@`H_2p d@*@H_'2 d@  o7 O(p +0(@`H_/720 `d@o-@H_2p d@*@ H_'2 d@_,p@`H_2 `d@׭/p@`H_30 d@ oѶ 8O_g5 5*0 *!0_@#7O`)0 )p@( `H_/720 d@o/0H_2p `d@* H_'2 d@ _/p`H_2 d@׹,H_30 d@O,p`H_3p `d@ǵ- H_1p d@?s.`H_w1p d@s.?`H_1p d@/s(pH_go1p `d@sDZ, H_1p d@sϥ-p?H_W_1p `d@sןou= @95O - )p@( `H_/720 `d@o.`H_2p `d@*  H_'2 d@ _,`H_2 `d@׉,pH_30 d@O-H_3p d@ǭ.`H_1p `d@?s.?`H_w1p d@s-H_1p d@/s,`H_go1p d@sǥ-p?H_1p `d@so= @5;O, .0@(@H_/720 d@ o(p@H_2p d@-p@`H_'2 d@o= @# O`. -@( `H_/720 `d@o)p H_2p `d@*  H_'2 d@_/pH_2 d@ ׋-H_30 `d@O-H_3p `d@DZ,H_1p d@sol= @O, )0 b(H_/720 d@oW= @ %O -p )p@( `H_/720 d@o,`H_2p d@*  H_'2 d@ _-`H_2 `d@ק.?`H_30 d@O-p`H_3p d@ǻ.0H_1p d@?s,?H_w1p d@s,pH_1p d@so= @5O+0 *"(@H_/720 `d@ o)0@H_2p d@ o= @- O-p +"(@ `H_/720 `d@o.@?`H_2p `d@ /0@ H_'2 d@_.@H_2 `d@ק.@?`H_30 d@o= @ o= @/'O. )p@( `H_/720 `d@o-H_2p `d@* ?`H_'2 d@ _/0`H_2 `d@׉.`H_30 `d@O. H_3p d@ǫ-H_1p d@?s,`H_w1p d@s-p H_1p d@/s/pH_go1p d@so= @%9O(p )p@( `H_/720 d@o/pH_2p d@* H_'2 d@ _-p`H_2 d@׻.0H_30 d@O(p?H_3p `d@Ƿ,p H_1p d@?s-H_w1p `d@so= @9O)0 ,b( `H_/720 d@o+pH_2p d@+0H_'2 `d@ _-p H_2 d@כ.0 `H_30 d@O(pO_3p d@oZ= @5O+0 *"(@`H_/720 d@o,@?`H_2p `d@/p@H_'2 d@_)p@ `H_2 `d@o$= @\ ``o' F o*  x @& 5 ] P, ۹1O@wb(-@@> `@ HH 8`98`]  /(p :@՜`@% x] @,0Y $'7w?Ow/X` 2<`0\ p ?o_g2ף<`%\ p ?o_gD@T@Tތ<̰lLԨ@0ՄҼ|`$Hˤ`tL㾠^ ^ ^ wgw_@'wW UF`o*  x @%n __ җ!_gZ`V__WZ (<`)p ,p Fch\ @\ , # o$aco\ @ X` ``,p .0 !c F@h\ €\   co&!co\ ^ X`*@X`X` @'y @ wZ`0'wwo^ 㾠 `)p 2  ;b 7*0 ,p -F@<`-0g<`@t!  * @ `0q@?O`-/b+p @Y\cp67 , 9F@-0 @ @ hO\cpY !\ (?\cp`OY Z8?o\]`]` `wowOw_'swww'W'o֛w\cpY ?,p Yx\cph\cpYz "\Z ("?\cp2O\cpZ  @2O\cpZ [`0 o z!o\cp@&X`pĀ# `@\@ '> -p;g$$H @ t@ g5\@\@?uO`\Xh$\@!`H ?q`@!@Y`p*@ذ \0*B @hgAoڟ-p +p  oI @ w Mw(p w@ 7w+p cw. `c a   `h @$7@%F. 3*0 @ !` H> @$h@$ @^ \ Z3\  x@#Z0\ \`PZ 0_q`Pq`h㶀^ X` Y Y`@` "@B^  HO`HM^ _\ Pr h^r Pw^ w^ w^ ww "@\`P\`P*@``"@H`@H>`@`"@C`@H怠``H'h<`@ =``"@ `@Hǀ`@`"@`@H ``H`@ h$`@\@Ր\ P_tPth\@w\`w\`w^ww^ w^ w^ wuwhtP@`@H`` H`@h$`@F`/)0  x@#oa \`P O7 * ,@ "(@`@Ќ o @`H4H `%\` :*p < ```"@\`@H}`@`"@\`@H``H\`@< @`h)@F`/,  xa@#-1O \`Pɐ 7 + *@(@ `@K o @`H4H ` 1\` :+ < @Ҫ ``"@,\`@H`@`"@\`@H"``Hl\`@< @hf)@@`@HA`` H_\`@< *0@hX!@GC`@H>`` HQo=`@HM\`@<  @?hF1@HDoY`@@aH>\`@h:t`@@`@H,`` H3\`@< +p@h,!@H*\`@<  @ h#1@@aH\`@< ,Y@hq@@aH\`@`ht`@Ho`@@aH\`@< +Y@ q@w``w*p F +0 ` F* p3@bX`Zb[`   `[`ww'ww''Tw0w wwww;7F`1/0 o  xa-p @"?)F \Y @Y Y Y Y Y (Y 0Y 8ww'w/w7w?wGwOwWw_\ @F''  , #F*0 F@@ * @@ pߤ∰  `'w`` @:H.a`@DH=``@0`"@> `H`2H_d@_w']`^^^``wwwww''w'w_`p*``h&\ 0ow'@ aH b`@@`2O`H Zow@d2O`Ho@`2O`H `o' o?@J`,0  @*   h@  9``H(p@ Y 9=   *p +! B`@@F`,0  @*   h@ !P9``H(p@ Y      *p !xB`@ F` (p @`Xa*p*0  [@ 0s@@@#!H` *0 @ch H ?9`#h*h[@ o` ? ַ@Տ@ F`o,p  x!@ >`\`P֚! wO*p *(@ `@@ `@!`HH8`!\` 8`+ :@ w`h `H 8`\`+ :@ j` Ж@^ 1 F+ `Z oZ *0 #Y`0a x@  Bϒ""<@^ 1 F+ `Z oZ *0 #Y`0a x@  "ͯ"#<@^ 1 F+ `Z oZ *0 #Y`0a x@ f ͏"# <@^ 1 F+ `Z oZ *0 #Y`0a x@ F o"#@<@^ 1 F+ `Z oZ *0 #Y`0a x@ & O"#`<@@^ 1F + `Z oZ a*0 Y`0# x@ @  x ՜ ՘] @%"""c/=`@^ 1 F+ `Z oZ *0 #Y`0a x@֠ r"#<@^ 1 F+ `Z oZ *0 #Y`0a x@ Rߒ"#<@^ 1 F+ `Z oZ *0 #Y`0a x@ 2̿"#<@@^ 1F + `Z oZ a*0 Y`0$ x@t@p x   ] @̕"̒"`/=`@^ 1 F+ `Z oZ *0 $Y`0a x@F o" <@^ 1 F+ `Z oZ *0 $Y`0a x@& O" @<@^ 1 F+ `Z oZ *0 $Y`0a x@ Ԣ/" `<@^ 1 F+ `Z oZ *0 $Y`0a x@ Ԃ" <@^ 1 F+ `Z oZ *0 $Y`0a x@Ơ b" <@^ 1 F+ `Z oZ *0 $Y`0a x@ Bϒ" <@^ 1 F+ `Z oZ *0 $Y`0a x@ "˯" <@^ 1 F+ `Z oZ *0 $Y`0a x@f ˏ"!<@@^ 1F + `Z oZ a*0 Y`0$ x@D@@ x ܐ ] @e"b"a /=`@@^ Fo* Y  xY aY`0@ x@ ӱ ӭ\@:"@!7_/= @^ 1 F+ `Z oZ *0 $Y`0a x@ ӊ"!`<@@^ Fo* Y  xY aY`0@ђ x@͐ i e\@"_/?@ _' = @@^ 1F + `Z oZ a*0 Y`0$ x@@ x 4 0] @ʽ"ʺ"a/=`@^ Fo* Y` xY` a@sY 0 ʜ"@ $@^ Fo* Y` xY` a@SY 0 |"@ $@^ 1 F+ `Z oZ *0 $Y`0a x@. ʐW""<@^ 1 F+ `Z oZ *0 $Y`0a x@ Ҫ7"" <@@^ Fo* Y  xY aY`0@ x@ ҉ ҅\@"G@ O/= @@^ Fo* Y  xY aY`0@ɒ x@Ő a ]\@"G/@ /= @^ 1 F+ `Z oZ *0 $Y`0a x@ :ǒ""<@@^ Fo* Y  xY aY`0@ x@}  \@ɢ"_/?@_' = @^ 1 F+ `Z oZ *0 $Y`0a x@N w""<@^ 1 F+ `Z oZ *0 $Y`0a x@. ʐW""<@^ 1 F+ `Z oZ *0 $Y`0a x@ Ѫ7"#<@^ 1 F+ `Z oZ *0 $Y`0a x@ ъ"# <@^ Fo* Y` xY` a@Y 0 o@}_$`@@^ Fo* Y  xY aY`0@ x@ Q M\@ڒ"@__/= @@^ 1F + `Z oZ a*0 Y`0$ x@@ x $  ] @ȭ"Ȫ"c/=`@@^ 1F + `Z oZ a*0 Y`0$ x@\@X x  ] @}"z"c/=`@@^ 1F + `Z oZ a*0 Y`0$ x@,@( x Đ ] @M"J"c/=`@^ 1 F+ `Z oZ *0 $Y`0a x@ К'"#<@@^ 1F + `Z oZ a*0 Y`0% x@ܤ@ؔ x t p] @""`/=`@@^ Fo* Y  xY aY`0@ x@ I E\@Ғ"G/@= @^ 1 F+ `Z oZ *0 %Y`0a x@ "ǯ" @<@^ 1 F+ `Z oZ *0 %Y`0a x@f Ǐ" `<@^ 1 F+ `Z oZ *0 %Y`0a x@F o" <@^ 1 F+ `Z oZ *0 %Y`0a x@& O" <@^ 1 F+ `Z oZ *0 %Y`0a x@ Ϣ/" <@^ 1 F+ `Z oZ *0 %Y`0a x@ ς" <@^ 1 F+ `Z oZ *0 %Y`0a x@Ơ b"!<@^ 1 F+ `Z oZ *0 %Y`0a x@ Bϒ"! <@@^ Fo* Y  xY aY`0@ x@ ! \@ƪ"G@/= @0 `*p   @! s` * ,0 +    @ @Ș!o@G @s@/ℂ`0]Y?`?@?\o@PPNOOPPPPPPPPPP==>?887:QQ BB;< ((''))9%%## 34455AAAAAAAAAAAR--&&112266  ..//CDSTEUHFFGGIJLMKKV000WX+""!!@@@@@@**,,,$p /  5*w_^\ZYVUTSEC=43-+D)$"              6#F, )289:;<=>?@ABFQR!*DL" ,/KNOP+01& $C.#567%-HM3'LGJ4SUVXYZ[\]^_`abcdkltIETWp~egfh(onrqmpuw|}sv{{yzjxiTSu\m1-Y+0'|W@Z0qcV'UVMLD$@?>~qUbpALXYeMTAa}'9ds 0c0|b'y[ #"%!ta~{~zeB$B{}ErIGzFE8nihH' #"%!K=dx yu; O/<# 8N^FfOH g $J$<()+2/7#*)$ 3nlKPQ"!N,R. #"%!wvv(//##]\[ijst`m_ #"%!/#//##lop`$/#[WX|//#/#//##-.14k >?3$'0G}b&% #"%!Rera$;jd,0cI'5Z$C62 #"%!k1$ 9|ny #"%!$~I #"%!x{}w #"%!^|WzyZV #"%!~UbWZXYxeVa{}wd0cUb=PXzYI'e[WaZd0cVJ'Ub[WZXYeVad0cUbWQPZXY'eV[ad0cUbPXY'e[a|dy0c|y|y'~[~x~{}wx|yx|{}wy{}wzgf~z~z|yxx{}w{}w~_S|zyzx7|y{}w~:z~|xy{}wx4{}w~z ]&z&x{}w*&56:zho*hCD**hoh&hhgiK.* 7 J F'&OSQPRIKK8#""A>$"A#"%(M0;5+AA? 5+G34BC###$;;>"">@"?1=?6,NH-2UDE)!9:/#> $#AA$A#A#??? @>>A< TL ?@@AAA?>A###"#AAA??AAA???A >??""T"A#>>> ?? ""A>>hgihgigigigigigigigigigigigigigigigigigigigigigigigigigigigigigigiHgipgigigip+gigigigigigigigigiggigigigigikZgigigigigi*:)gigigi[gigigigigiogigimmgigigigigigigigigi_giYYgigigi44gi 4gigigi vgigigigigigi_gigigikgigigiIgigigi2gigigi;gigigigigigigigigigigigigigigi~wuSgigigigigi,gigigigigigigigi44gigigigigigigi&gigigi0gi8gigi4gigit7542gigigigigigigigigigigi/.gigiacosacoshasinasinhatanatan2atanhatexitbsearchcbrtceilcopysigncoscoshdebug_offdebug_onerferfcexpexpm1fabsfilenofirst_procpsinfo_tfloorfmodfprintffrexpgammagamma_rget_prochypotilogbisnanitoaj0j1jnkvm_addresskvm_cvtkvm_declareldexplgammalgamma_rloglog10log1plogbmatherrmodfnext_procnextafterpowprintfqsortrefresh$remainderrintscalbscalbnsignalsignificandsinsinhsizeofsprintfsqrtstruct_emptystruct_fillsyslogtantanhy0y1ynstdinout of memoryredeclaration of %sstdoutstderrcannot initialize parseroperands have incompatible types: op "%s"operands must have integral type: op "%s"invalid member name: %sleft operand of "." must be struct objectvariable: %s is not a structureargument type mismatch: arg #%d: %s%s type mismatchkstat variables are structures onlymib variables are structures onlyname: %s designates a class typekvm$kstat$mib$ndd$incorrect special class prefix for class %s, use %sinitialization type mismatchinitializationtoo many struct initializersillegal initializerinitializer does not fittoo many array initializersargument type mismatch: arg #1: refresh$arrays of active class variables not allowedinsufficent arguments to %sinternal errorcannot take sizeof void%s must take kvm variable as arg #1%s requires a struct variable as arg# 1:%s/%sPATH/opt/RICHPse/lib/%s/%sLD_LIBRARY_PATHcannot find: %s in library: %sLD_LIBRARY_PATH=/usr/lib/sparcv9:%s%s/../lib/%s/%sdlopen(0): %sdlopen(%s): %sclass_local_structclass_local_variablessbuiltin: %s expects %d parameter%s, %d sentundefined user type: struct %syacc stack overflowsyntax error~indirection only on ulong typesindirectioninvalid cast expressiontype_castillegal type cast>><<^|&%/*division by zero-newundeclared variable: %scannot renew non-array typecannot renew non-dynamic arrayrenew+cannot take structure addressesaddress_ofse_lazy_value?:>>=assignment<<=^=|=&=%=/=*=-=+=cannot new non-dynamic arraystatement stack overflowmembervariable%s: %s is not an arrayinvalid subscript typesubscript: %d out of range for: %s!=!=~structure comparisons not supportedoperands must be type string: op "=~"=~==recursive call to: %scannot send more than %d args to attached functionsout of builtin_tree memoryout of builtin_tree node memory>=<=><"continue" outside loop"break" outside loop or switchnon-integral case expressionswitch/case type mismatchduplicate default in switch  duplicate case in switchnon-integral switch expressionoperands must have scalar type: op "--"operands must have scalar type: op "++"se_lazy_lvalueellipsisspecial variables cannot be parametersinvalid block name: %sellipsis only allowed for attached functionsredeclaration of special prefix: %sredeclaration of builtin: %sfunction: %s returns no valuefunction expects to return value: %sreturn valuereferencedpragma: variable %s is not declaredunknown pragma: %sintegral constant expression expectedaggregateinvalid variable name: %sincomplete type: %sdynamic arrays of kvm variables not alloweddeclaration of %s hides earlier oneabsurd subscript value: %d"CALL""VALUE"non-constant initializer: op %sinvalid struct name: %sinvalid class name: %scannot pass double values to attached functionsellipsis must be last parameterclass code may not accept parametersstructure members may not be active variablestypeless function: %s may not return a valueunused global variable: %svariable: %s unused in block: %sundeclared block: %smainundeclared block: mainargument type mismatch: arg #%d: mainmain must have a return type of intfunction: %s expects %d parameter%s, %d sentfunction: main accepts only 2 parameters missing%dkstat contains no structuresSYM_%s{}-enclosed initializer requiredBad avl balance at %X Bad parent ptr at %X ********* After deleting ********* After inserting%s[%d]dot notation overflowcannot evaluate member: %s%s[%d]<%lld>%s[%d]<%d>LAZY_VALUE%s[%d]%s[%d](STRUCTURE)%s<0x%llx>%s[%d]<%u>%s<%d>%s[%d]<%llu>\x%x(nil)%s[%d]<%g>%s<%u>%s<%llu>%s[%d]<%s>%s<%g>%s<%s>%s<0x%llx>(STRUCTURE)%s(STRUCTURE)%s<%lld>address_oftype_castindirectionintucharstring((%s) charnew*((%s *) renewnew %s[ulonglonguintlonglongrenew %s[shortushortdouble%s(, + - * / % & | ^ << >> = += -= *= /= %= &= |= ^= <<= >>= se_lazy_value ? : ++-- == != < > >= <= =~ !=~ && || !();se_lazy_lvaluebreak;return switch(for(while(if (; syntax errorerror"%s", line %d: %s: %s before or at: %s fatalstdinwarning%s: cannot recover: exiting Out of memory-cannot open output filewcannot grow lib_treeout of lib_tree node memory...kvm intuchar%s "%s"char%s %s[]longlong[%d]ulonglongushortstringshortuintdouble%u%d%g%snil%lld'%s'"%s"%s.0%x%llu{ } , out of case_tree node memorycase : default: } = %c %s()se_lazy_lvalue[++%c --%c >>= <<= ^= |= &= %%= /= *= -= += ].continue; break; return ; switch() { do { for(; while(if (} } while(); else { }cannot grow case_tree(se_lazy_valueaddress_oftype_castindirection((%s) ? : ++-- + >> << ^ | & %% / * - new*((%s *) &renewnew %s[renew %s[ == != < > >= <= =~ !=~ && || !(}; attach "%s" { %s extern %s ) { ndd kstat classstruct"%s" %s { ; // var_offset == %d mib pragma referenced %s; ks_sysinfosysinfoks_vminfovminfoks_cachefscachefsks_ncstatsncstatsks_flushmeterflushmeterks_varvarks_cpu_sysinfocpu_statks_cpu_syswaitks_cpu_vminfoks_nfs_mountnfsks_interruptsespfdzshmefdccgsixaudioks_disksidsdssdptesp-scsi-bus*ptesptdmdcmdkFTscsidadatapicdout of types tree node memorycannot allocate kstat treesunable to grow types treeunable to init kstat: %snumber$name$$link$refcountinstance$:out of kstat type node memory%s vanished!cannot allocate nodeduplicate structure member: %skeylogstatscachefs%dcachefs.0.key vanished!type not found: %dSYM_%stime to fix the (ks_ndata > 1) problemcannot read kstats: %sduplicate structuresstruct %s does not contain a "number" membermissingmember: %s vanished!link vanished!refresh_count vanished!kstat_read failed: %skstat_chain_update() failed: %scannot modify: %scannot find any kvm variablesunable to nlist kvmCannot init kvm: %skvm variable: %s has no addressKvm not initialized: Variables will have invalid valueskvm_write of %s[%d](0x%x) failedkvm_write of %s failedthe kvm system is not initialized, variables will have invalid valuesMAX_CPUMAX_DISKMAX_IFMAX_INTSattachbreakcasecharclasscontinuedefaultdodoubleelseexternforifintint32_tint64_tkstatkvmlonglonglonglonglong_tmibnddnewnilpointer_tpragmarenewreturnshortstringstructswitchucharuchar_tuintuint32_tuint64_tuint_tulongulong_tu_longlong_tulonglongushortushort_twhileout of keyword memoryout of tree memory[]{}()@|!&#;:.,+*/=-><~%? \^SEPATHrCannot open %sstdinUnexpected EOF#!%s %s(echo '#line 2 "%s"' ; %s %s) | %s/usr/bin/tail +2:%s/%s^[a-z,A-Z,_][a-z,A-Z,0-9,_,$]*$Token buffer overflow False0Invalid numeric value: %sipacketsopacketsCannot find builtin types%s.%se%c%sinvalid character constanttoo many command line arguments/var/sadm/patch-SEINCLUDE: -I/opt/RICHPse.cannot get working directory%s/../bin/se%s/etc/se_definesr patch%s.*%sdriver/usr/sbin/modinfodiskToo many disk names in se_defines-D_LP64stdinErrors detected. Exiting. -I%s -D%s -DMINOR_VERSION=%d -DSE_VERSION=%d/opt/RICHPse/includeUsage: %s [ options ]. Use '%s -flags' for details. -flagsUsage: %s [-dnsvwz] [-ccore-file] [-kkernel-file] [-ppaging-file] [script-name | -] [script-args] [-o- | -ooutput-file] -v Display the version -n Run without the pre-processor [-Iinclude-directory] [-Ddefine] [-Uundefine] -s Syntax check only -w Suppress warning messages -d Run in debug mode -z Complain about vanished members -Iinclude-directory Add an include directory to the search path -kkernel-file Specify kernel file for kvm variables -ppaging-file Specify paging file for kvm variables -o- Regenerate a minimal script to stdout -ccore-file Specify core file for kvm variables -Uundefine Undefine a symbol for the pre-processor -t tag Names the program when stdin is used - Input is stdin followed (optionally) by script flags -Ddefine Define a symbol for the pre-processor -ooutput-file Regenerate a minimal script to output-file unamese requires Solaris 2.7 or newer ްmib2_tcp_tmib2_ip_tmib2_udp_tmib2_icmp_t/dev/arptcpcannot push %s moduleudpicmpcannot open %scannot send control messagecannot read control messageerror reading control messageinvalid control message receivederror reading dataMib not initialized: Variables will have invalid values%s%c%d%s%c%sgetset%s ioctl of %s failed: %scannot open %s: %s%s/%d/psinfo/proc%s/%s/psinfocannot open procdir: %s/dev/consoleconsole/dev/pts/0pts/%d/dev/ttyatty%c/dev/ttyp0tty%c%d?Fatal: : Near line %d reference through nil pointer assigning to %sreference through nil pointer accessing: %ssubscript: %d out of range for: %s[%d]nil blockdivision by zero: (%s / %s)ASSIGNMENTEXPRESSIONCONSTANTQC OPERATORdot notation overflowcannot evaluate member: %sstructure slipped through run_address_ofreference through nil pointer: op ">"reference through nil pointer: op "<="reference through nil pointer: op ">="reference through nil pointer: op "<"callback function stack overflowreference through nil pointer: bsearchreference through nil pointer: atexitreference through nil pointer: qsortreference through nil pointer: kvm_declarereference through nil pointer assigning to: %sreference through nil pointer: intf function(nil)arg count overflow to intf functionreference through nil pointer: signal@default@ignore%u%d%llu%lldreference through nil pointer: indirectionreference through nil pointer: assign from %smainmain vanished!Warning: bsearch compare function stack underflowbsearch compare function: %s does not existqsort compare function stack underflowqsort compare function: %s does not existv9%s (%s) for %s%s@(#)se - Version 3.403:59 PM 01/05/05pǘǐǀxX0o0o0o0o0o 0o@0o`0o0o0o0o0o0o 0o@0ow`0oo0og0o_0oW0oO0oG 0o?@0o7`0o/0o'0o0o0o0o 0o@0o`0o0o0o0o0o0o 0o@0o`0o0o0o0o0o0o 0o@0ow`0oo0og0o_0oW0oO0oG 0o?@0o7`0o/0o'0o0o0o0o 0o@0o`0o0o0o0o0o 0o 0o @0o `0o 0o 0o 0o 0o 0o 0o @0ow `0oo 0og 0o_ 0oW 0oO 0oG 0o? @0o7 `0o/ 0o' 0o 0o 0o 0o 0o @0o `0o 0o 0o 0o 0o 0o 0o @0o `0o 0o 0o 0o 0o0o 0o@0ow`0oo0og0o_0oW0oO0oG 0o?@0o7`0o/0o'0o0o0o0o 0o@0o`0o0o0o0o0o0o 0o@0o`0o0o0o0o0o0o 0o@0ow`0oo   ! L , 8 X g B  x$@ s 0 oJo.o 0P/xX ooLN<eN=eN>eN?eN@eNAf NBeN3 h`N4nNCeNDeOEf OFeOGeO (O0'O@HeOHIeOPJeOXKeO`LeOh) e`Op!OOMeONf O$ p OOfOPeOQfO#Oe`ORf OS eOT eO e`OUeOVePWgP-t@P,s P 0h`P0XfP8YeP@ZfPP[ePX\eP`]ePh^ePp_ e`Px`fP"OPaf Pbf P j P2mP5hPcf PdePef PffP&qPgeQheQieQ+ r@Q %j Q(jeQ0/uQ@.uQP*pQXkeQ`leQhmeQpneQxogRS T cccccccccccddddd d(d0d8d@dHiiiiiiiijj@jjjkkBkk k(k8? kHkP@kXkhk kxkhk+`kkhk- kkkKkkkkkkkkkllkll l0l8l@lHlPlXl`p@ZpH[pX\p`]pppxpp p p pppppppp'p'p&pq q'q&q &q0*q8.q@%qH0qPQq`7qh(qp<qxFqJqKqLqOqOqQqQqPqQqQqQqPqPrSrSr Tzz xz0hz@|| |(|86`|@|P6|X|h6|p`BBZ L@`9 ` 54 2`88`@`9@Y   ``            @`@     @ 333333has: Sun WorkShop 6 03/08/05 Compiler Common 6.0 Patch 114802-01 as: Sun WorkShop 6 03/08/05 Compiler Common 6.0 Patch 114802-01 @(#)SunOS 5.8 Generic February 2000as: Sun WorkShop 6 03/08/05 Compiler Common 6.0 Patch 114802-01 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch 114802-02 GCC: (GNU) 3.4.3as: Sun WorkShop 6 03/08/05 Compiler Common 6.0 Patch 114802-01 GCC: (GNU) 3.4.3as: Sun WorkShop 6 03/08/05 Compiler Common 6.0 Patch 114802-01 ld: Software Generation Utilities - Solaris Link Editors: 5.8-1.290.interp.hash.dynsym.dynstr.SUNW_version.rela.got.rela.bss.rela.plt.text.init.fini.rodata.dynamic.data.ctors.dtors.eh_frame.jcr.data.rel.local.symtab.strtab.comment.stab.index.shstrtab.stab.indexstrXX xx  0 0"$@$@ so..-B/x/xH 7B//AB0P0P K== QW]b2PF enxx/tPP{``ppxxǀǀ<ǐǐ4Lj X07070100117b06000081ed00000000000000010000000141dc5ea30000045e000000880000000400000000000000000000002900000005reloc/RICHPse/bin/workollator_example.sh#!/bin/csh # a web server setenv PW_ARGS_0 httpd # user1 runs the messaging system setenv PW_USER_1 'user1' # se monitoring scripts setenv PW_CMD_2 'se.sparc' # shareplex replicating the database setenv PW_CMD_3 'sp_' # various monitoring agents setenv PW_CMD_4 'Agent' # bigbrother monitoring scripts setenv PW_USER_5 'bb' # database sid1 setenv PW_ARGS_6 sid1 setenv PW_CMD_6 'oracle' # database sid2 setenv PW_ARGS_7 sid2 setenv PW_CMD_7 'oracle' # database sid3 setenv PW_ARGS_8 sid3 setenv PW_CMD_8 'oracle' # all other oracle userid activity catchall setenv PW_USER_9 'oracle' # applications running in java as user1 setenv PW_USER_10 'user2' setenv PW_CMD_10 java # all other user2 userid activity setenv PW_USER_11 'user2' # Veritas cluster tools setenv PW_ARGS_12 VRTS # Other veritas tools for volume and filesystem setenv PW_ARGS_13 vx # All other root userid activity setenv PW_USER_14 'root' # Catchall for all other users as 15, blank matches setenv PW_COUNT 16 setenv OUTDIR /var/tmp/pwlog umask 022 setenv HOSTNAME `hostname` exec /opt/RICHPse/bin/se -DMAX_WORKLOADS=$PW_COUNT -DWIDE workollator.se 10 0707010019fa52000041ed00000000000000000000000841dc5ea40000000000000088000000040000010a000000010000001600000005reloc/RICHPse/contrib07070100249f51000041ed00000000000000000000000241dc5ea40000000000000088000000040000010a000000010000001e00000005reloc/RICHPse/contrib/dfstats07070100249f52000081a400000000000000010000000141dc5ea300000101000000880000000400000000000000000000002500000005reloc/RICHPse/contrib/dfstats/authorPeter Samuel peter@uniq.com.au Technical Consultant or at present: Uniq Professional Services Peter.Samuel@nms.otc.com.au Phone: +61 2 287 4647 Fax: +61 2 287 5754 07070100249f53000081a400000000000000010000000141dc5ea30000281d000000880000000400000000000000000000002a00000005reloc/RICHPse/contrib/dfstats/df_stats.se/* * Repeatedly display disk usage stats for read/write ufs file systems. * * $Header: /home/peters/src/SymbEL/RCS/df_stats.se,v 1.1 1995/07/27 02:56:20 peters Exp $ * * $Revision: 1.1 $ * * $Log: df_stats.se,v $ # Revision 1.1 1995/07/27 02:56:20 peters # Initial revision # * */ #include #include #include #include #include #include #include #include #include #include "fs_class.se" #define ST_GREY75 ST_USER_COLOR #define ST_PALE_VIOLET_RED ST_USER_COLOR + 1 #define INTERVAL_MIN 10 #define INTERVAL_MAX 120 #define INTERVAL 30 /* gui main loop interval */ #define TEXT_WIDTH 110 #define TEXT_HEIGHT 28 /* default */ #define DISK_ICON "/opt/RICHPse/examples/data/disk" #define INODE_ICON "/opt/RICHPse/examples/data/inode" #define BLANK_ICON "/opt/RICHPse/examples/data/blank" #define MAXENTRIES 100 /* max number of ufs file systems to consider */ #define K_GREEN 0 /* kbytes threshold for green status */ #define K_AMBER 75 /* kbytes threshold for amber status */ #define K_RED 90 /* kbytes threshold for red status */ #define I_GREEN 1000000 /* free files threshold for green status */ #define I_AMBER 1000 /* free files threshold for amber status */ #define I_RED 100 /* free files threshold for red status */ /* top level frame definition */ resource_t frame_gui[6] = { /* type, fg, bg, label, data, callback, callback data */ { R_VFRAME }, { R_MENUBAR, ST_BLACK, ST_PALE_VIOLET_RED, "MenuBar", nil, nil, nil }, { R_BUTTON, ST_GREY75, ST_GREY75, " ", nil, nil, nil }, { R_TEXT, ST_BLACK, ST_GREY75, nil, nil, nil, nil }, { R_HSCALE, ST_BLACK, ST_GREY75, "Interval", nil, "scan_cb", nil }, { R_END } }; /* index into frame_gui */ #define MENU_BAR 1 #define STATUS_BUTTON 2 #define TEXT_CANVAS 3 #define INTERVAL_SCALE 4 /* * menu bar definition - colours are meaningless as they are really set * in the definition of the frame above. But they MUST be defined here * anyway. */ resource_t menu_bar_gui[5] = { /* type, fg, bg, label, data, callback, callback data */ { R_OPTION, ST_WHITE, ST_BLUE, "Start", nil, "start_cb", nil }, { R_OPTION, ST_WHITE, ST_BLUE, "Stop", nil, "stop_cb", nil }, { R_CASCADE, ST_BLACK, ST_PALE_VIOLET_RED, "Display", nil, nil, nil }, { R_OPTION, ST_WHITE, ST_BLUE, "Exit", nil, "exit_cb", nil }, { R_END } }; /* index into menu_bar_gui */ #define START_MENU 0 #define STOP_MENU 1 #define DISPLAY_MENU 2 #define EXIT_MENU 3 /* * display menu bar definition - colours are meaningless as they are * really set in the definition of the frame above. But they MUST be * defined here anyway. */ resource_t display_menu_gui[3] = { /* type, fg, bg, label, data, callback, callback data */ { R_OPTION, ST_WHITE, ST_BLUE, "kbytes", nil, "kbytes_cb", nil }, { R_OPTION, ST_WHITE, ST_BLUE, "inodes", nil, "inodes_cb", nil }, { R_END} }; /* index into display_menu_gui */ #define KBYTES 0 #define INODES 1 /* global variables */ int scan_interval = INTERVAL; int running = True; int status = K_GREEN; int display = KBYTES; ulong start_menu; ulong stop_menu; ulong display_menu; ulong status_button; ulong disk_icon; ulong inode_icon; ulong blank_icon; utsname_t u[1]; main(int argc, string argv[]) { ulong frame_handle; ulong menu_bar_handle; /* reset window and icon title */ argv[0] = "df Stats"; /* set interval scale parameters - must be done before frame is created */ frame_gui[INTERVAL_SCALE].r_data = gui_scale_data(INTERVAL_MIN, INTERVAL_MAX, INTERVAL); /* resize text canvas - must be done before frame is created */ frame_gui[TEXT_CANVAS].r_data = gui_text_data(TEXT_WIDTH, TEXT_HEIGHT); /* create top level frame */ frame_handle = gui_create_frame(argc, argv, frame_gui); /* set new colours */ gui_add_color("grey75", ST_GREY75); gui_add_color("pale violet red", ST_PALE_VIOLET_RED); /* set icons */ disk_icon = gui_load_bitmap(DISK_ICON, ST_BLACK, ST_WHITE); inode_icon = gui_load_bitmap(INODE_ICON, ST_BLACK, ST_WHITE); blank_icon = gui_load_bitmap(BLANK_ICON, ST_BLACK, ST_WHITE); gui_set_icon(disk_icon, 0); /* initialise menu */ menu_bar_handle = gui_get_object(frame_handle, MENU_BAR); gui_add_group(menu_bar_handle, menu_bar_gui); start_menu = gui_get_object(menu_bar_handle, START_MENU); stop_menu = gui_get_object(menu_bar_handle, STOP_MENU); status_button = gui_get_object(frame_handle, STATUS_BUTTON); display_menu = gui_get_object(menu_bar_handle, DISPLAY_MENU); gui_add_group(display_menu, display_menu_gui); /* main gui loop */ gui_main_loop("main_loop", nil, scan_interval); } main_loop(ulong handle, string client_data, string call_data) { ulong text_canvas; mnttab_t mnt$m; mnttab_t mt[MAXENTRIES]; fs_t vfsstat$f; fs_t fs[MAXENTRIES]; int fsnum; int i; int initial = 1; long ltime; char tm_buf[64]; if (running == False) { return; } if (initial == 1) { gui_grey_option(start_menu, True); gui_grey_option(status_button, True); initial = 0; } fsnum = 0; text_canvas = gui_get_object(handle, TEXT_CANVAS); /* traverse the mount table to find mounted read/write ufs file systems */ for (mnt$m.number$ = 0; ; mnt$m.number$++) { if (fsnum >= MAXENTRIES) { printf("Maximum of %d ufs file systems exceeded\n", MAXENTRIES); break; } mt[fsnum] = mnt$m; if (mt[fsnum].number$ == -1) { break; } if ( mt[fsnum].mnt_fstype == "ufs" && (mt[fsnum].mnt_flags & MNT_RW) != 0 ) { vfsstat$f.mp$ = mt[fsnum].mnt_mountp; fs[fsnum] = vfsstat$f; if (vfsstat$f.status$ == -1) { printf("WARNING: statvfs returned error for %s, ", mt[fsnum].mnt_mountp); printf("filesystem will be ignored\n"); continue; } ++fsnum; } } if (fsnum == 0) { /* don't print anything if there are no filesystems processed */ return; } gui_clear_text(text_canvas); uname(u); gui_append_text(text_canvas, sprintf("Host: %s\t", u[0].nodename)); ltime = time(0); strftime(tm_buf, sizeof(tm_buf), "%A %B %e, %Y, %l:%M:%S %p", localtime(<ime)); gui_append_text(text_canvas, tm_buf); if (display == KBYTES) { gui_append_text(text_canvas, "\nThreshold values:\t"); gui_append_text(text_canvas, sprintf("AMBER > %d%% capacity, ", K_AMBER)); gui_append_text(text_canvas, sprintf("RED > %d%% capacity\n\n", K_RED)); status = K_GREEN; /* reset status */ gui_append_text(text_canvas, "Filesystem kbytes used avail capacity minfree"); gui_append_text(text_canvas, " Mounted on\n"); for (i = 0; i < fsnum; i++) { gui_append_text(text_canvas, sprintf("%-20.20s", mt[i].mnt_special)); gui_append_text(text_canvas, sprintf("%10ld%10ld%10ld%6ld%%%7ld%%", fs[i].f_kbytes, fs[i].f_used, fs[i].f_avail, fs[i].f_capacity, fs[i].f_minfree)); gui_append_text(text_canvas, sprintf(" %s\n", mt[i].mnt_mountp)); if (fs[i].f_capacity > K_RED) { status = K_RED; } else { if (fs[i].f_capacity > K_AMBER && status < K_RED) { status = K_AMBER; } } } } else { gui_append_text(text_canvas, "\nThreshold values:\t"); gui_append_text(text_canvas, sprintf("AMBER < %d free files, ", I_AMBER)); gui_append_text(text_canvas, sprintf("RED < %d free files\n\n", I_RED)); status = I_GREEN; gui_append_text(text_canvas, "Filesystem block sz frag sz total files free files"); gui_append_text(text_canvas, " Mounted on\n"); for (i = 0; i < fsnum; i++) { gui_append_text(text_canvas, sprintf("%-20.20s", mt[i].mnt_special)); gui_append_text(text_canvas, sprintf("%8ld%9ld%13ld%12ld", fs[i].fs$.f_bsize, fs[i].fs$.f_frsize, fs[i].fs$.f_files, fs[i].fs$.f_ffree)); gui_append_text(text_canvas, sprintf(" %s\n", mt[i].mnt_mountp)); if (fs[i].fs$.f_ffree < I_RED) { status = I_RED; } else { if (fs[i].fs$.f_ffree < I_AMBER && status > K_RED) { status = K_AMBER; } } } } /* update colour of status bar */ switch(status) { case K_GREEN: case I_GREEN: frame_gui[STATUS_BUTTON].r_foreground = ST_GREEN; frame_gui[STATUS_BUTTON].r_background = ST_GREEN; gui_update_object(status_button, frame_gui[STATUS_BUTTON]); gui_blink_icon(blank_icon, 0, False); break; case K_AMBER: case I_AMBER: frame_gui[STATUS_BUTTON].r_foreground = ST_AMBER; frame_gui[STATUS_BUTTON].r_background = ST_AMBER; gui_update_object(status_button, frame_gui[STATUS_BUTTON]); gui_blink_icon(blank_icon, 0, False); break; case K_RED: case I_RED: frame_gui[STATUS_BUTTON].r_foreground = ST_RED; frame_gui[STATUS_BUTTON].r_background = ST_RED; gui_update_object(status_button, frame_gui[STATUS_BUTTON]); gui_blink_icon(blank_icon, 0, True); break; default: break; } return; } start_cb(ulong handle, string client_data, string call_data) { gui_grey_option(start_menu, True); gui_grey_option(stop_menu, False); running = True; gui_set_loop_interval("main_loop", call_data, scan_interval); } stop_cb(ulong handle, string client_data, string call_data) { gui_grey_option(start_menu, False); gui_grey_option(stop_menu, True); running = False; gui_set_loop_interval(nil, nil, 0); } scan_cb(ulong handle, string client_data, string call_data) { scan_interval = atoi(call_data); gui_set_loop_interval("main_loop", call_data, scan_interval); } exit_cb(ulong handle, string client_data, string call_data) { exit(0); } kbytes_cb(ulong handle, string client_data, string call_data) { if (display != KBYTES) { gui_blink_icon(blank_icon, 0, False); gui_set_icon(disk_icon, 0); display = KBYTES; } } inodes_cb(ulong handle, string client_data, string call_data) { if (display != INODES) { gui_blink_icon(blank_icon, 0, False); gui_set_icon(inode_icon, 0); display = INODES; } } 07070100249f54000081a400000000000000010000000141dc5ea30000067a000000880000000400000000000000000000002a00000005reloc/RICHPse/contrib/dfstats/fs_class.se/* * File system class - used for determining the status of file systems * * $Header: /home/peters/src/SymbEL/RCS/fs_class.se,v 1.3 1995/07/25 09:31:40 peters Exp $ * * $Revision: 1.3 $ * * $Log: fs_class.se,v $ * Revision 1.3 1995/07/25 09:31:40 peters * added return if mp$ is nil * * Revision 1.2 1995/07/25 02:39:28 peters * moved status$ to body of class rather than inside vfsstat() * allows it to be accessed by calling program * * Revision 1.1 1995/07/25 01:37:13 peters * Initial revision * * */ #ifndef _FS_CLASS_SE_ #define _FS_CLASS_SE_ #include #include class fs_t { string mp$; /* file system mount point */ statvfs_t fs$; /* storage for file system status */ int status$; /* return status of call to statvfs() */ ulong f_kbytes; /* df -k, total kbytes in file system */ ulong f_used; /* df -k, kbytes used in file system */ ulong f_avail; /* df -k, kbytes avail in file system */ int f_capacity; /* df -k, % used in file system */ int f_minfree; /* df -k, % avail to root in file system */ vfsstat$() { statvfs_t vfs[1]; /* return if filesystem string is NULL. Avoids division by * zero in calculation of minfree on initialisation. */ if (mp$ == nil) { return; } status$ = statvfs(mp$, vfs); fs$ = vfs[0]; /* do some pre-calculations to make df -k type programs easier */ f_kbytes = fs$.f_blocks; f_used = fs$.f_blocks - fs$.f_bfree; f_avail = fs$.f_bavail; f_capacity = f_used * 100.0 / (f_kbytes + f_avail - fs$.f_bfree) + 0.5; f_minfree = (fs$.f_bfree - f_avail) * 100.0 / f_kbytes + 0.5; } }; #endif 07070100249f55000081a400000000000000010000000141dc5ea300000743000000880000000400000000000000000000002500000005reloc/RICHPse/contrib/dfstats/mdf.se/* * Display disk usage stats for all local rw UFS file systems * Simulates "df -k -F ufs" but only looks at read/write file systems. * * $Header: /home/peters/src/SymbEL/RCS/mdf.se,v 1.1 1995/07/25 02:41:48 peters Exp $ * * $Revision: 1.1 $ * * $Log: mdf.se,v $ * Revision 1.1 1995/07/25 02:41:48 peters * Initial revision * * */ #include #include #include #include #include #include #include "fs_class.se" #define MAXENTRIES 100 /* max number of ufs file systems to consider */ main() { mnttab_t mnt$m; mnttab_t mt[MAXENTRIES]; fs_t vfsstat$f; fs_t fs[MAXENTRIES]; int fsnum = 0; int i; /* traverse the mount table to find mounted read/write ufs file systems */ for (mnt$m.number$ = 0; ; mnt$m.number$++) { if (fsnum >= MAXENTRIES) { printf("Maximum of %d ufs file systems exceeded\n", MAXENTRIES); break; } mt[fsnum] = mnt$m; if (mt[fsnum].number$ == -1) { break; } if ( mt[fsnum].mnt_fstype == "ufs" && (mt[fsnum].mnt_flags & MNT_RW) != 0 ) { vfsstat$f.mp$ = mt[fsnum].mnt_mountp; fs[fsnum] = vfsstat$f; if (vfsstat$f.status$ == -1) { printf("WARNING: statvfs returned error for %s, ", mt[fsnum].mnt_mountp); printf("filesystem will be ignored\n"); continue; } ++fsnum; } } if (fsnum == 0) { /* don't print anything if there are no filesystems processed */ exit(0); } printf("Filesystem kbytes used avail capacity minfree Mounted on\n"); for (i = 0; i < fsnum; i++) { printf("%-20.20s", mt[i].mnt_special); printf("%8ld%8ld%8ld%6ld%%%7ld%%", fs[i].f_kbytes, fs[i].f_used, fs[i].f_avail, fs[i].f_capacity, fs[i].f_minfree); printf(" %s\n", mt[i].mnt_mountp); } } 0707010029fe50000041ed00000000000000000000000241dc5ea40000000000000088000000040000010a000000010000001b00000005reloc/RICHPse/contrib/iops0707010029fe51000081a400000000000000010000000141dc5ea300000052000000880000000400000000000000000000002200000005reloc/RICHPse/contrib/iops/authorRichard.Elling@East.Sun.Com Ambreesh.Khanna@East.Sun.Com mpurdy@ns1.bloomberg.com 0707010029fe52000081a400000000000000010000000141dc5ea300000e49000000880000000400000000000000000000002300000005reloc/RICHPse/contrib/iops/iops.se#include #include #include #include #include #include #include #include #include #include #include /* @(#)iops.se 1.5 06/19/98 Richard.Elling@East.Sun.Com */ #define MAX_CONTROLLERS 160 #define SAMPLE_INTERVAL 1 #define LOTS 1000000 struct ctrl_info { int controller; double reads; double writes; double kreads; double kwrites; }; main(int argc, string argv[3]) { p_iostat p_iostat$disk; p_iostat tmp_disk; int ctrl_list[MAX_CONTROLLERS]; ctrl_info ctrl_sum[MAX_CONTROLLERS]; ctrl_info total; int i; int j; int k; int foundflag; int nctrl; int interval = SAMPLE_INTERVAL; int iterations = LOTS; int ndisks; ulong ts; char timestamp[128]; switch(argc) { case 1: break; case 2: interval = atoi(argv[1]); break; case 3: interval = atoi(argv[1]); iterations = atoi(argv[2]); break; default: printf("use: %s [interval] [count]\n", argv[0]); exit(1); } ndisks = p_iostat$disk.disk_count; /* figure out how many controllers there are and build stats stucts */ for(i=0; i= MAX_CONTROLLERS) { printf( "error: %s: number of controllers exceeds MAX_CONTROLLERS (%d), adjust in source\n", argv[0], MAX_CONTROLLERS); exit(1); } } } } /* debug for(i=0;i> found controller c%d\n", ctrl_list[i]); } */ for(; iterations > 0; iterations--) { sleep(interval); print_header(); ts = time(0); strftime(timestamp, sizeof(timestamp), "%D\t%H:%M:%S", localtime(&ts)); total.reads = 0.0; total.writes = 0.0; total.kreads = 0.0; total.kwrites = 0.0; for(i=0; i #include #include #include #include #include #include struct nlist_t { string n_name; /* symbol name */ ulong n_value; /* value of symbol */ }; #define NAME_LENGTH 32 #define MAX_NAMES 32 #define SCALE_MIN 1 #define SCALE_MAX 60 #define SAMPLE_INTERVAL 5 #define MENU_I 1 #define TEXT_I 2 #define SCALE_I 3 resource_t kview_gui[8] = { /* type fg bg label data cb * * */ { R_VFRAME }, { R_MENUBAR, ST_WHITE, ST_BLUE, "MenuBar", nil, nil }, { R_TEXT, ST_BLUE, ST_WHITE, nil, nil, nil }, { R_HSCALE, ST_WHITE, ST_BLUE, "Interval", nil, "int_var" }, { R_END } }; #define ADD_I 0 resource_t kview_menu[8] = { /* type fg bg label data cb * * */ { R_OPTION, ST_WHITE, ST_BLUE, "Add", nil, "add_var" }, { R_OPTION, ST_WHITE, ST_BLUE, "Del", nil, "del_var" }, { R_OPTION, ST_WHITE, ST_BLUE, "Clear", nil, "clear_var" }, { R_OPTION, ST_WHITE, ST_BLUE, "Exit", nil, "exit_kview" }, { R_END } }; int kview_interval = SAMPLE_INTERVAL; int kview_last_var = 0; ulong kview_menubar; ulong kview_frame; ulong kview_prompt; nlist_t kview_nlist[MAX_NAMES]; main(int argc, string argv[]) { kview_gui[SCALE_I].r_data = gui_scale_data(SCALE_MIN, SCALE_MAX, SAMPLE_INTERVAL); argv[0] = "Kview"; kview_frame = gui_create_frame(argc, argv, kview_gui); kview_menubar = gui_get_object(kview_frame, MENU_I); gui_add_group(kview_menubar, kview_menu); kview_prompt = gui_get_object(kview_frame, TEXT_I); gui_main_loop("kview_loop", nil, SAMPLE_INTERVAL); } kview_loop(ulong handle, string client_data, string call_data) { ulong member = gui_get_object(handle, TEXT_I); int i; ulong kvm$ulong; ulong value; gui_clear_text(member); for (i = 0; i < kview_last_var; i++) { if (kview_nlist[i].n_value != 0) { kvm_cvt(kvm$ulong, kview_nlist[i].n_value); value = kvm$ulong; gui_append_text(member, sprintf("%s = %u (0x%x)\n", kview_nlist[i].n_name, value, value)); } } } int_var(ulong handle, string client_data, string call_data) { kview_interval = atoi(call_data); gui_set_loop_interval("kview_loop", call_data, kview_interval); } add_var(ulong handle, string client_data, string call_data) { popup_frame("popdown_add"); } del_var(ulong handle, string client_data, string call_data) { popup_frame("popdown_del"); } popup_frame(string action) { #define VNAME_I 1 resource_t kview_ask[4] = { { R_VFRAME }, { R_TFIELD, ST_WHITE, ST_BLUE }, { R_END } }; ulong popup; ulong text; kview_ask[VNAME_I].r_callback = action; if (popup == 0) { kview_ask[VNAME_I].r_data = gui_tfield_data(NAME_LENGTH); popup = gui_create_subframe("Enter Name of Variable to Add/Del", kview_ask); text = gui_get_object(popup, VNAME_I); } else { gui_update_object(text, kview_ask[VNAME_I]); } gui_popup_subframe(popup); gui_clear_text(text); } popdown_add(ulong handle, string client_data, string call_data) { ulong frame = gui_get_frame(handle); ulong text = gui_get_object(frame, VNAME_I); char tmpname[NAME_LENGTH]; int i; gui_get_text(text, tmpname, sizeof(tmpname)); for (i = 0; i < kview_last_var; i++) { if (kview_nlist[i].n_value == 0) { break; } } if (i == MAX_NAMES) { gui_popdown_subframe(frame); gui_warning_dialog("Cannot list more than %d names", MAX_NAMES); return; } kview_nlist[i].n_name = tmpname; kview_nlist[i].n_value = kvm_declare(tmpname); if (kview_nlist[i].n_value == 0) { gui_popdown_subframe(frame); gui_info_dialog("Variable \"%s\" is not a kernel variable", tmpname); return; } if (i == kview_last_var) { kview_last_var++; } gui_popdown_subframe(frame); } clear_var(ulong handle, string client_data, string call_data) { int i; for (i = 0; i < kview_last_var; i++) { kview_nlist[i].n_value = 0; } kview_last_var = 0; } popdown_del(ulong handle, string client_data, string call_data) { ulong frame = gui_get_frame(handle); ulong text = gui_get_object(frame, VNAME_I); char tmpname[NAME_LENGTH]; int i; gui_get_text(text, tmpname, sizeof(tmpname)); for (i = 0; i < kview_last_var; i++) { if (kview_nlist[i].n_name == tmpname) { kview_nlist[i].n_value = 0; if (i == (kview_last_var - 1)) { kview_last_var = i; } } } gui_popdown_subframe(frame); } exit_kview(ulong handle, string client_data, string call_data) { exit(0); } 070701002bc052000041ed00000000000000000000000241dc5ea40000000000000088000000040000010a000000010000001e00000005reloc/RICHPse/contrib/perfbar070701002bc053000081a400000000000000010000000141dc5ea30000001c000000880000000400000000000000000000002500000005reloc/RICHPse/contrib/perfbar/authorRichard.Elling@East.Sun.Com 070701002bc054000081a400000000000000010000000141dc5ea3000016e3000000880000000400000000000000000000002900000005reloc/RICHPse/contrib/perfbar/perfbar.se/* * Copyright (c) 1998 by Sun Microsystems, Inc. */ /* * perfbar.se * * This is an SE version of perfbar which allows one * to format how the processor instances are shown. This is * useful when dealing with large systems and processor sets. * * usage: [-p proclist] [interval] * where, * proclist is a comma separated list of processor * instances (available in Solaris via the psrinfo command) * The special character 's' in the list will cause a * separator to be inserted and is useful for separation. * Redundant occurances of processor instances will yield * odd and probably uninteresting results. Only those * processors in the list will be monitored. * * interval is the number of seconds between samples. * * * Author: Richard Elling * ident @(#)perfbar.se 1.1 06/30/98 Richard.Elling@East.Sun.Com */ #include #include #include #include #include #define SAMPLE_INTERVAL 2 #define BAR_WIDTH 8 #define BAR_HEIGHT 100 #define BAR_MIN 0 #define CTR_MIN 1 #define CTR_MAX 30 #define BAR_MAX 100 #define CPU_METER_ICON "/opt/RICHPse/examples/data/cpu_meter_icon" /* gui */ resource_t gui[7] = { /* type fg bg label data cb * * ---------------------------------------------------------------- */ { R_VFRAME }, { R_BUTTON, ST_WHITE, ST_BLUE, "Exit", nil, "exit_cb" }, { R_SEPARATOR }, { R_ROW, ST_WHITE, ST_BLUE, nil, nil, nil }, { R_SEPARATOR }, { R_COUNTER, ST_WHITE, ST_BLUE, "Interval", nil, "interval_cb" }, { R_END } }; /* array indeces for gui */ #define EXIT_I 1 #define ROW_I 3 #define SCALE_I 5 resource_t bars[MAX_CPU * 2]; ulong cm_frame; int ncpus; int nproclist; int proclist[MAX_CPU * 2]; main(int argc, string argv[]) { int i; int j; int k; string s; ulong member; ulong icon; int interval = SAMPLE_INTERVAL; int maxproclist = MAX_CPU * 2; p_vmstat p_vmstat$v; p_vmstat tmp; ks_system_misc kstat$misc; ncpus = kstat$misc.ncpus; nproclist = 0; for(;;) { i = getopt(argc, argv, "p:"); if (i == EOF) { break; } switch (i) { case 'p': for( s=strtok(optarg, ","); s != nil; s=strtok(nil, ",")) { if( s == "s") { proclist[nproclist] = -1; nproclist++; } if( s =~ "[0-9]") { proclist[nproclist] = atoi(s); nproclist++; } if ( nproclist >= maxproclist) { break; } } /* convert processor instance numbers to list numbers */ for( j=0; j < nproclist; j++) { if( proclist[j] >= 0) { k=0; for( i=0; i= 0) { p_vmstat$v.number$ = proclist[i]; tmp = p_vmstat$v; bars[i].r_data = gui_bar_data(BAR_WIDTH, BAR_HEIGHT, BAR_MIN, BAR_MAX, ((int) tmp.user_time)); } } } } gui_update_group(member, bars); } exit_cb(ulong handle, string client_data, string call_data) { exit(0); } /* scale slider callback */ interval_cb(ulong handle, string client_data, string call_data) { gui_set_loop_interval("loop", call_data, atoi(call_data)); } 070701002e6319000041ed00000000000000000000000241dc5ea40000000000000088000000040000010a000000010000002100000005reloc/RICHPse/contrib/psrsetstat070701002e631a000081a400000000000000010000000141dc5ea300000065000000880000000400000000000000000000002800000005reloc/RICHPse/contrib/psrsetstat/author* Author: Richard Elling * ident @(#)psrsetstat.se 1.1 05/31/98 Richard.Elling@East.Sun.Com 070701002e631b000081a400000000000000010000000141dc5ea300001266000000880000000400000000000000000000002f00000005reloc/RICHPse/contrib/psrsetstat/psrsetstat.se/* * Copyright (c) 1998 by Sun Microsystems, Inc. */ /* * psrsetstat.se * * This is a modified version of mpvmstat.se which allows one * to format how the processor instances are listed. This is * useful when dealing with large systems and processor sets. * * usage: [-p proclist] [interval] [count] * where, * proclist is a comma separated list of processor * instances (available in Solaris via the psrinfo command) * The special character 's' in the list will cause a * blank line to be printed and is useful for separation. * Redundant occurances of processor instances will yield * odd and probably uninteresting results. Only those * processors in the list will be monitored. * * interval is the number of seconds between samples. * * count is the number of samples. By default, the maximum * count is some large number (10000) * * Author: Richard Elling * ident @(#)psrsetstat.se 1.1 05/31/98 Richard.Elling@East.Sun.Com */ #include #include #include #include #include #include #define SAMPLE_INTERVAL 1 #define LOTS 10000 main(int argc, string argv[3]) { p_vmstat p_vmstat$v; p_vmstat tmp; ks_system_misc kstat$misc; int ncpus = kstat$misc.ncpus; int interval = SAMPLE_INTERVAL; int iterations = LOTS; int maxproclist = MAX_CPU * 2; int nproclist = 0; int proclist[MAX_CPU * 2]; int i; int j; int k; long n; string s; for(;;) { i = getopt(argc, argv, "p:"); if (i == EOF) { break; } switch (i) { case 'p': for( s=strtok(optarg, ","); s != nil; s=strtok(nil, ",")) { if( s == "s") { proclist[nproclist] = -1; nproclist++; } if( s =~ "[0-9]") { proclist[nproclist] = atoi(s); nproclist++; } if ( nproclist >= maxproclist) { break; } } /* convert processor instance numbers to list numbers */ for( j=0; j < nproclist; j++) { if( proclist[j] >= 0) { k=0; for( i=0; i 0; iterations--) { sleep(interval); print_header(); if( nproclist == 0) { for( i=0; i #include #include #include #include #include #include #define PID 0 #define NAME 1 ulong output = stdout; int get_data(long pid, int delay) { psinfo_t p; long mins; long secs; long msec; long old_sec = 0; long old_msec = 0; long dif_msec; long dif_sec; int i=0; long pagesize = sysconf(_SC_PAGESIZE); puts(" TIME ABS_TIME MEM"); p = get_proc(pid); secs = p.pr_time.tv_sec % 60 ; msec = p.pr_time.tv_nsec / 10000000; do{ i = (i+1) %25; if ((i == 0) && (output == stdout)){ puts(" TIME ABS_TIME MEM");} p = get_proc(pid); old_sec = secs; old_msec = msec; mins = p.pr_time.tv_sec / 60 ; secs = p.pr_time.tv_sec % 60 ; msec = p.pr_time.tv_nsec / 10000000; dif_msec = (( msec - old_msec + 100) % 100); dif_sec = (( secs - old_sec + 60 ) % 60); if( msec < old_msec) {dif_sec--;} fprintf(output ," %02d:%02d %2d:%02d:%02d %i\n", dif_sec, dif_msec, mins, secs, msec, p.pr_size*pagesize/1024); sleep(delay); } while (p.pr_start.tv_sec != 0); fclose(output); return(1); } son(int delay) { long pid = getppid(); get_data(pid, delay); } father(string argv[]) { fprintf(stderr, "%s started \n", argv[0]); execvp(argv[0], argv); exit(1); } int main(int argc, string argv[]) { int delay = 1; int i; int c; int option = -1; int value; string args[MAX_ARG]; opterr = 0; if(argc < 3){ fprintf(stderr, "Usage: watch.se [-f statfile][-d delay][-n name [params]|-p pid]\n"); exit(-1); } for(;;) { c = getopt(argc, argv, "f:p:n:d:"); if (c == -1) { break; } switch (c) { case 'p': option = PID; value = atoi(optarg); break; case 'n': option = NAME; value = optind-1; fprintf(stderr, "Arg: %i\n", optind); break; case 'd': delay = atoi(optarg); break; case 'f': output = fopen(optarg, "w"); default: fprintf(stderr, "Usage: watch.se [-f statfile][-d delay][-n name [params]|-p pid]\n"); exit (1); break; } } switch (option) { case PID: get_data(value, delay); exit (0); break; case NAME: for (i=value; i #include #include #include #define SCALE_MIN 1 #define SCALE_MAX 30 #define SAMPLE_INTERVAL 2 #define LOAD_STRING "Load" #define SAVE_STRING "Save" #define ST_GREY ST_USER_COLOR #define ST_MNBLUE ST_MIDNIGHTBLUE #define TEXT_WIDTH 90 #define TEXT_HEIGHT 52 #define SAVE_LINES 1024 int dio_interval = SAMPLE_INTERVAL; int dio_running = True; int dio_savelines = SAVE_LINES; pointer_t dio_menu_bar; pointer_t dio_start; pointer_t dio_stop; pointer_t dio_text; pointer_t dio_totals; resource_t dio_gui[5] = { // type fg bg label data cb cbd container { R_VFRAME, ST_WHITE, ST_GREY }, { R_MENUBAR, ST_MAROON, ST_LIGHTGREY, "MenuBar", "dio_menu", nil, nil, "dio_menu_bar" }, { R_LABEL, ST_MAROON, ST_LIGHTGREY, "\n\n", nil, nil, nil, "dio_totals" }, { R_VPANED, ST_WHITE, ST_GREY, nil, "dio_text_int" }, { R_END } }; #define LABEL_O dio_gui[2] resource_t dio_text_int[3] = { // type fg bg label data cb cbd container { R_TEXT, ST_NAVY, ST_LIGHTBLUE, nil, nil, nil, nil, "dio_text" }, { R_HSCALE, ST_MNBLUE, ST_LIGHTGREY, "Interval in Seconds", nil, "int_cb" }, { R_END } }; #define TEXT_O dio_text_int[0] #define INT_SCALE_O dio_text_int[1] resource_t dio_menu[2] = { // type fg bg label data { R_CASCADE, ST_MNBLUE, ST_LIGHTGREY, "&File", "dio_file_menu" }, { R_END } }; resource_t dio_file_menu[9] = { // type fg bg label data cb cbd container { R_OPTION, ST_MNBLUE, ST_LIGHTGREY, "&Start", nil, "start_cb", nil, "dio_start" }, { R_OPTION, ST_MNBLUE, ST_LIGHTGREY, "S&top", nil, "stop_cb", nil, "dio_stop" }, { R_SEPARATOR }, { R_OPTION, ST_MNBLUE, ST_LIGHTGREY, "Sa&ve Lines", nil, "savelines_cb", nil }, { R_SEPARATOR }, { R_OPTION, ST_MNBLUE, ST_LIGHTGREY, "&Clear", nil, "clear_cb", nil }, { R_SEPARATOR }, { R_OPTION, ST_MNBLUE, ST_LIGHTGREY, "E&xit", nil, "exit_cb", nil }, { R_END } }; pragma referenced dio_menu_bar; pragma referenced dio_file_menu; pragma referenced dio_menu; pragma referenced dio_text_int; main(int argc, string argv[]) { TEXT_O.r_data = gui_text_data(TEXT_WIDTH, TEXT_HEIGHT); INT_SCALE_O.r_data = gui_scale_data(SCALE_MIN, SCALE_MAX, SAMPLE_INTERVAL); LABEL_O.r_label = sprintf("%s%s", sprintf("Max read rate: %8.1f MB/s Total bytes read: %8.2f MB\n", 0, 0), sprintf("Max write rate: %8.1f MB/s Total bytes written: %8.2f MB", 0, 0)); gui_add_color("#AE00B200C300", ST_GREY); argv[0] = "DIO"; gui_create_frame(argc, argv, dio_gui); gui_main_loop("dio_loop", nil, dio_interval); } dio_loop(pointer_t handle, string client_data, string call_data) { string one; string two; string output; dio_disk_t disk; int initial = 1; int lines; int total_lines; if (initial == 1) { initial = 0; for(refresh$(disk); disk.number$ != -1; disk.number$++, refresh$(disk)) { ; } gui_grey_option(dio_start, True); gui_grey_option(dio_stop, False); gui_set_loop_interval("dio_loop", nil, dio_interval); dio_running = True; return; } one = sprintf("%s%s%s%s", " ", "| rq | | wq |\n", "name | kbr| kbw| kbr/s| kbw/s| %r:%w | kbr+kbw ", "| rq | %b | wq | %b |\n"); lines = 2; for(output=nil, disk.number$=0, refresh$(disk); disk.number$ != -1; disk.number$++, refresh$(disk)) { if (disk.name$ =~ "^fd.*") { continue; } two = sprintf( "%-8.8s %5lld %5lld %7.1f %7.1f %3d:%-3d %9lld %5.2f %3.0f %5.2f %3.0f\n", disk.name$, disk.kbr, disk.kbw, disk.kbrs, disk.kbws, disk.rr, disk.wr, disk.total, disk.rq, disk.rqbusy, disk.wq, disk.wqbusy); if (output == nil) { output = two; } else { output = sprintf("%s%s", output, two); } lines++; } if (total_lines >= dio_savelines) { gui_set_text(dio_text, sprintf("%s%s", one, output)); total_lines = lines; } else { gui_append_text(dio_text, sprintf("%s%s", one, output)); total_lines += lines; } one = sprintf("Max read rate: %8.1f MB/s Total bytes read: %8.2f MB\n", disk.maxkbrs / 1024.0, disk.totr / 1024.0); two = sprintf("Max write rate: %8.1f MB/s Total bytes written: %8.2f MB", disk.maxkbws / 1024.0, disk.totw / 1024.0); LABEL_O.r_label = sprintf("%s%s", one, two); gui_update_object(dio_totals, LABEL_O); } start_cb(pointer_t handle, string client_data, string call_data) { gui_grey_option(dio_start, True); gui_grey_option(dio_stop, False); gui_set_loop_interval("dio_loop", nil, dio_interval); dio_running = True; } stop_cb(pointer_t handle, string client_data, string call_data) { gui_grey_option(dio_start, False); gui_grey_option(dio_stop, True); gui_set_loop_interval(nil, nil, 0); dio_running = False; } clear_cb(pointer_t handle, string client_data, string call_data) { gui_clear_text(dio_text); } exit_cb(pointer_t handle, string client_data, string call_data) { exit(0); } int_cb(pointer_t handle, string client_data, string call_data) { dio_interval = atoi(call_data); if (dio_running == True) { gui_set_loop_interval("dio_loop", call_data, dio_interval); } } cancel_cb(pointer_t handle, string client_data, string call_data) { ulong_t frame; frame = gui_get_frame(handle); gui_popdown_subframe(frame); } sl_cb(pointer_t handle, string client_data, string call_data) { dio_savelines = atoi(client_data); } savelines_cb(pointer_t handle, string client_data, string call_data) { resource_t menu[4] = { // type fg bg label data cb { R_VFRAME }, { R_HRADIOBOX, ST_MNBLUE, ST_LIGHTGREY }, { R_BUTTON, ST_MNBLUE, ST_LIGHTGREY, "Dismiss", nil, "cancel_cb" }, { R_END } }; #define RB_I 1 resource_t radio_buttons[6] = { // type fg bg label data cb cb_data { R_TBUTTON, ST_MNBLUE, ST_LIGHTGREY, "0", nil, "sl_cb", "0" }, { R_TBUTTON, ST_MNBLUE, ST_LIGHTGREY, "1024", nil, "sl_cb", "1024" }, { R_TBUTTON, ST_MNBLUE, ST_LIGHTGREY, "2048", nil, "sl_cb", "2048" }, { R_TBUTTON, ST_MNBLUE, ST_LIGHTGREY, "4096", nil, "sl_cb", "4096" }, { R_TBUTTON, ST_MNBLUE, ST_LIGHTGREY, "8192", nil, "sl_cb", "8192" }, { R_END } }; pointer_t frame; pointer_t rb; if (frame == 0) { frame = gui_create_subframe("Set Save Lines", menu); rb = gui_get_object(frame, RB_I); gui_add_group(rb, radio_buttons); } gui_popup_subframe(frame); } 070701002e9538000081a400000000000000010000000141dc5ea30000141e000000880000000400000000000000000000001e00000005reloc/RICHPse/dio/dio_disk.se#ifndef _DIO_DISK_SE_ #define _DIO_DISK_SE_ #include #include #include #include #include // dio.c written by Donald McIntosh // dio_disk.se translation by Rich Pettit struct dio_can_t { string name; uint64_t nread; uint64_t nwritten; int32_t reads; int32_t writes; int64_t wtime; int64_t wlentime; int64_t wlastupdate; int64_t rtime; int64_t rlentime; int64_t rlastupdate; uint32_t wcnt; uint32_t rcnt; double last_time; int is_a_disk; // not a partition }; class dio_disk_t { string name$; int number$; uint64_t kbr; // kbytes read uint64_t kbw; // kbytes written uint64_t total; // sum of kbr and kbw double kbrs; // kbytes read per second double kbws; // kbytes written per second int rr; // read ratio int wr; // write ratio double rq; // average run queue length double wq; // average wait queue length double rqbusy; // % of time disk busy (runq occupied) double wqbusy; // % of time waitq occupied uint64_t totr; // total kbytes read uint64_t totw; // total kbytes written double maxkbrs; // max kbrs double maxkbws; // max kbws dio$() { int i; int j; int disk_count; int first_pass; int initialized = 0; dio_can_t can[]; dio_can_t old[]; ks_disks disk; double deltawtime; double deltawlentime; double deltartime; double deltarlentime; double this_time; double ival; timeval_t tv[1]; gettimeofday(tv, 0); this_time = tv[0].tv_sec + (tv[0].tv_usec / 1000000.0); if (initialized == 0) { if (setup_diskinfo_inst() == 0) { puts("couldn't map disk instances"); exit(1); } if (setup_diskinfo_part() == 0) { puts("couldn't obtain disk partition usage"); exit(1); } can = new dio_can_t[MAX_DISK]; old = new dio_can_t[MAX_DISK]; for(i=0, refresh$(disk); disk.number$ != -1; i++, disk.number$++, refresh$(disk)) { j = find_inst(disk.name$); if (j == -1) { can[i].name = disk.name$; can[i].is_a_disk = 1; } else { can[i].name = GLOBAL_disk_info[j].long_name; if (GLOBAL_disk_info[j].partition_count > 0) { can[i].is_a_disk = 1; } } can[i].nread = disk.nread; can[i].nwritten = disk.nwritten; can[i].reads = disk.reads; can[i].writes = disk.writes; can[i].wtime = disk.wtime; can[i].wlentime = disk.wlentime; can[i].wlastupdate = disk.wlastupdate; can[i].rtime = disk.rtime; can[i].rlentime = disk.rlentime; can[i].rlastupdate = disk.rlastupdate; can[i].wcnt = disk.wcnt; can[i].rcnt = disk.rcnt; can[i].last_time = this_time; old[i] = can[i]; } disk_count = i; initialized = 1; return; } else { // reduce typing i = number$; // bounds if (i < 0 || i >= disk_count) { number$ = -1; return; } // get new numbers disk.number$ = i; refresh$(disk); can[i].nread = disk.nread; can[i].nwritten = disk.nwritten; can[i].reads = disk.reads; can[i].writes = disk.writes; can[i].wtime = disk.wtime; can[i].wlentime = disk.wlentime; can[i].wlastupdate = disk.wlastupdate; can[i].rtime = disk.rtime; can[i].rlentime = disk.rlentime; can[i].rlastupdate = disk.rlastupdate; can[i].wcnt = disk.wcnt; can[i].rcnt = disk.rcnt; ival = this_time - can[i].last_time; can[i].last_time = this_time; } name$ = can[i].name; kbr = (can[i].nread - old[i].nread) / 1024; kbw = (can[i].nwritten - old[i].nwritten) / 1024; kbrs = kbr / ival; kbws = kbw / ival; total = kbr + kbw; if (total > 0) { rr = (kbr * 100) / total; wr = (kbw * 100) / total; } else { rr = 0.0; wr = 0.0; } if (can[i].is_a_disk == 1) { totr += kbr; totw += kbw; if (kbrs > maxkbrs) { maxkbrs = kbrs; } if (kbws > maxkbws) { maxkbws = kbws; } } deltawtime = (can[i].wtime - old[i].wtime) / 1000000000.0; wqbusy = (deltawtime * 100.0) / ival; deltawlentime = (can[i].wlentime - old[i].wlentime) / 1000000000.0; if (deltawtime > 0) { wq = deltawlentime / ival; } else { wq = 0.0; } deltartime = (can[i].rtime - old[i].rtime) / 1000000000.0; rqbusy = (deltartime * 100.0) / ival; deltarlentime = (can[i].rlentime - old[i].rlentime) / 1000000000.0; if (deltartime > 0) { rq = deltarlentime / ival; } else { rq = 0.0; } old[i] = can[i]; } }; #endif 07070100305752000041ed00000000000000000000000241dc5ea40000000000000088000000040000010a000000010000001200000005reloc/RICHPse/doc07070100305753000081a400000000000000010000000141dc5ea30000406a000000880000000400000000000000000000001a00000005reloc/RICHPse/doc/CHANGES******************************** ORIGINAL RELEASE: SymbEL is an interpretive language based on C that was created to address the need for simplified access to data residing in the SunOS kernel. The RICHPse.tar.gz files contain the SymbEL engine binary, "se", the "include" directory of SymbEL header files, a man page for "se", the user's manual for the language, and example programs. To install "se", do this: ksh# gzcat RICHPse.tar | tar xvf - ksh# pkgadd -d . RICHPse Please send all bug reports, problems, suggestions, recommendations, etc. to me: se-feedback@setoolkit.com. If the problem includes a core dump, please provide instructions on how I can get at the core file. The core file should be from a run of "se", not the script, so if you have a #! at the top of the file and are running the script, generate the core file by running "se script-name". ******************************** NEW TO VERSION 3.4 Bug fixes: MAX_IF, etc. now err on the side of "lots" to stop the subscript issues. New kstat structures: bge, fjgi Features added: vertical and horizontal paned windows in GUI code Other: x86 support is back. se.sparcv9 and se.i386 instead of individual binaries for each platform floating rtu license server ******************************** NEW TO VERSION 3.3 Bug fixes: An internal piece of an internal piece was doing the wrong thing when an obscure condition might possibly occur. New kstat structures: ks_dnlcstats, ks_vmem, ks_pollstats, ks_segadvstat, ks_fpu_traps, ks_fpu_info, ks_memscrub_kstat, ks_ecc_info, ks_mm, ks_intrstat Features added: instance$ variable now in all repeating kstat structures. Corresponds to the ks_instance value in the kstat_t type in sys/kstat.h. Other: x86 support is gone. Solaris 2.6 support is gone. ELF32 binaries are gone. ******************************** NEW TO VERSION 3.2.1 Bug fixes: Fixed memory leak in array-of-structures garbage collection Widespread use of snprintf() in the interpreter instead of sprintf() Structure offset screw-up in 64 bit versions fixed. Minor bug fixes in example scripts. New kstat structures: pf, dmfe, eri, skge network interfaces Features added: diskinfo.se now translates StorEdge volumes into charlie target notation. refresh$() now works on all special variables ******************************** NEW TO VERSION 3.2 Bug fixes: zillions of bugs fixed (and countless more introduced, no doubt) Features added: new builtins: refresh$ "new" and "renew" were added some releases ago. I don't see it mentioned anywhere else here. inline aggregate assignment: int x[4]; x = { 1, 2, 3, 4 }; ******************************** NEW TO VERSION 3.1 Bug fixes: zillions of bugs fixed (and countless more introduced, no doubt) Features added: new builtins: qsort, atexit, bsearch new syntax *((type *) var) for indirecting pointers (including structs) values only, no lvalues operator new for arrays only ( int intvec[] = new int[4]; ) types uchar_t, ushort_t, uint_t, ulong_t, longlong_t, u_longlong_t, same as the original types (original types still there) bitwise not operator ~ logical not operator ! for parenthetical logical expressions only: if (!(i == 2)) { vastly improved debug output null statement all KSTAT_TYPE_NAMED structs are now completely defined in kstat.se parenthesized assignments as expressions: while((c = getchar()) != -1) comma separated statements in before and after part of for loop: for(i=0, j=1, k=3; i<5; i++, function_call(j), k += 4) { Optimizations: proc interface is now structured FS, Solaris 2.6 and newer only big optimizations in mib code ******************************** NEW TO VERSION 3.0 Bug fixes: minor cleanup of p_iostat_class better handling of scripts beginning with #! parameter checking broken for parameters of type char[] *hairy* bug passing lazy evaluated arrays of structures to attached funcs calling se functions from C with arrays as parameters didn't work just right attached functions returning structures did not work *at all* and many more Features added: all kstats can now be dumped, see ks_cache type in include/kstat.se support for clarion array disk types example scripts no longer executable, start with "se filename.se" (#! still works, but the examples have been changed) added ppp interface to kstat.se and netif.se extern variables inside of attach blocks (for things like errno) rewrite of kvm reading code to cut down on system calls and to make sure string variables inside of kvm structures are themselves read (see kvmname.se) use &c instead of address_of(c) now deletion of the following builtins getopt, time, ctime, localtime, uname, stat, fstat, lstat, processor_info optimized kstat code such that if the only thing that the application touches is ks_system_misc then the only thing read from the kstat chain will be unix.0.system_misc warnings now issued about ununsed variables C++ style comments now accepted code regenerator with -o =~ regex operator for strings (a < b ? a : b) syntax for expressions use of increment/decrement in expressions (such as "printf("%d\n", j++);") support for oldold etherlink cards "el" and PCMCIA etherlink 3 cards "pcelx" syntax for definition of KSTAT_TYPE_NAMED structures without modifying the interpreter (see ks_inode_cache in kstat.se) and many more ******************************** NEW TO VERSION 2.5.0.2 (2.5.0.1 didn't last long) Bug fixes: Didn't work on Solaris 2.5.1 for lots of reasons, all fixed, I hope. ks_segmap was confused on 2.5.1 postinstall script just did the wrong thing on 2.5.1 ks_fddi_network was confused If CPUS_CONFIGURED > CPUS_ONLINE vmstat classes didn't work. many examples and include files still had old MINOR_VERSION numbers ******************************** NEW TO VERSION 2.5 Bug fixes: inst_to_path_class fails with double digit controller numbers also had pretty ugly code, now cleaned up arrays of structures passed to attached functions should act as reference parameters not value parameters cleanup of package installation scripts arbitrary limitiation of 32 characters in symbol names is gone Changes: kstat ie structure added to netif class (Intel ethernet) kstat elx structure added to netif class (for PowerPC) kstat hme structure added to netif class (for E class Ultra) kstat sa structure added to netif class (SAHI ATM) kstat ieef structure added to netif class (some PC board) kstat fddi structure added to netif class (fddi/cddi) ulong kvm_declare(string name) for declaring kvm variables on the fly return value is the kvm address, used as the second parameter to kvm_cvt zero return value means the variable was not found poll() call in poll.se now works normally without poll_se() due to array-of-structure-parameters-to-attached-functions changes SEPATH environment variable is a colon separated list of include directories MAX_CPU, MAX_DISK, MAX_IF, AND MAX_INTR are now "builtin constants" and are no longer defined in sysdepend.se command line parameter "-" available so args can be passed to scripts read from stdin. ex: tail +2 aw.se | se - -sxy command line parameter "-t name" available to identify script name when read from stdin. ex: tail +2 aw.se | se -t aw.se - -sxy definition of NANOSEC now in time.se instead p_iostat.se New include files: dlfcn.se - for dynamic lib calls dlopen(), dlsym(), etc. statvfs.se - for statvfs system calls and structure definition systeminfo.se - for sysinfo() system call sadc_class.se - renaming of sadc.se ******************************** NEW TO VERSION 2.4: Bug fixes: values returned by itoa() in a loop are not correct passing arrays of ints to a function with an empty array declaration causes a core dump uninitialized local variable in two kstat functions causes core dump severly grizly memory screw-up in the kstat module causes se to grow installing RICHPse in a directory other than /opt now works minor debug-mode bugs certain array assignments cause core dump aggregrately initialized class block local vars aren't being propogated to new instances of active class vars Changes: SMCCse now RICHPse so noone will think that SMCC supports it. They don't. RICHPse now available for Solaris 2.4 x86 fix-maxs script now in bin directory for updating the MAX_DISK and MAX_IF values in sysdepend.se change to live_rules.se to recognize smc ethernet controller (for i86pc) change to netif.se to recognize smc ethernet controller (for i86pc) ifdef(i86pc) in various include files address_of() function finally added even though I didn't want to RICHPse package no longer installs virtual_adrian curses.se nixed, sar_io.se just prints on stdout lots of functions uncommented in some include files xit program nixed integral constant expressions (including strings) now allowed in aggregate initialization ellipsis (...) as last parameter to attached functions calling an attached function with a structure will now send a pointer to a "C" version of the structure to the attached function New include files: signal.se - for signal names and kill() declaration poll.se - for poll events and poll() and poll_se() declarations partinfo.se - get partition info for disks from vfstab se.se - for attaching functions that are inside of the se binary ******************************** NEW TO VERSION 2.3.1 Bug fixes: auto struct initialization broke when aggregate initialization was added array of structures offsets were wrong Changes: multiple instances of active class variables now allowed at last, array dimensions can be expressions, not just digits! se_function_call(char *fn, ...) entry point for attached libs (for callbacks) -n flag to se for running without cpp empty array declaration for parameters ******************************** NEW TO VERSION 2.3 Bug fixes: printf("%d %s\n", 1, sprintf("%d", 2)) resulted in "2 2" being output malloc memory wasted on strings in structure assignment *nasty* string memory allocation problems *nasty* free() problem in kstat Changes: include files no longer include other files scripts need to include the necessary files themselves changes to inst_to_path_class.se New builtins: struct_fill(struct, ulong) builtin struct_empty(struct, ulong) builtin New include files: curses.se (work-in-progress) mutex.se condvar.se tiuser.se rpc_clnt.se nfs_clnt.se devinfo.se vfs.se sar_types.se sar.se New examples: sar_io.se kvmname.se New language constructs: do { } while(); construct ******************************** NEW TO VERSION 2.2 Bug fixes: kvm code more robust infinite loop when parsing structures with only structures as members New builtins: long kvm_address(kvm_var) - return the kvm address of kvm_var New include files: ndd.se - defines ndd variables for ip, tcp, udp, arp, and icmp nfs_class.se - returns the mnttab and mntinfo for all nfs mounts mnt_class.se - returns records from the /etc/mnttab file New scripts: nfsstat-m.se - does what nfsstat -m does New language class: ndd$ variables as defined by structures in ndd.se ******************************** NEW TO VERSION 2.1.3 Bug fixes: if (geteuid() == 0) now works like it's supposed to get_proc() bug for pids >= 30000 New builtins: kvm_cvt(kvm_var, new_address) - change the kvm address of a kvm variable timeval_t gettimeofday() - variation of the Unix version New scripts: modifications to virtual_adrian.se and mpvmstat.se New installation stuff: adds /etc/init.d file for auto startup of virtual_adrian ******************************** NEW TO VERSION 2.1.2 New include file: netif.se - finds all the network interfaces New example scripts: netstatx.se - Adrian Cockcroft xio.se - Adrian Cockcroft virtual_adrian.se - Adrian Cockcroft fsflush.se - Adrian Cockcroft pwatch.se - Adrian Cockcroft Changed example scripts: net.se - gives info from netif user class collisions.se - gives info from netif user class Other changes: Functional port to 5.4 ea2 - complete port later ******************************** NEW TO VERSION 2.1.1 Bug fixes: kvm structure sizes kvm structure member offsets misc. annoying bugs Other changes: sysconf.se removed, defines put into unistd.se where they belong ******************************** NEW TO VERSION 2.1 Many builtins deleted in lieu of the new attachment mechanism which allows shared libraries to be attached to a script and functions within the library called. New include files: stdio.se unistd.se stdlib.se string.se socket.se p_netstat_class.se - Adrian Cockcroft New example scripts: vmmonitor.se - Adrian Cockcroft iomonitor.se - Adrian Cockcroft netmonitor.se - Adrian Cockcroft Application: xit - eXtended Iostat Tool - Motif GUI called by xit.se, a script ******************************** NEW TO VERSION 2.0 (beta) New builtins: int getopt(int argc, string argv[], string opts) void debug_off(void) void debug_on(void) New include files: sysinfo_class.se - gathers system information from kstat app_wrap_class.se - wrapper an application run and compute stats wait.se - for gleaning information returned from spawn() New example scripts: aw.se - application wrapper New features: arrays of structures indefinite dot notation interchangability between string type and array of char "se" is now the installable Solaris package "SMCCse" ******************************** NEW TO VERSION 1.9 New builtins: long time(void) string ctime(long seconds) struct tm_t localtime(seconds) string strftime(string format, struct tm_t ts) int strlen(string s) string fgetl(int fp) string getenv(string name) New include files: time.se - for the definition of struct tm_t Updated example scripts: cpg.se - now version 2.3.4 Also: improved debugging output (still far from what's desired though) now comes with libse.a for building the interpreter into an application (sorry, no docs on how to do it yet) ******************************** NEW TO VERSION 1.8 New builtins: int fclose(int file_handle) int fflush(int file_handle) string fgets(int file_handle) int fopen(string file_name, string mode) int fprintf(int file_handle, string format, ...) int fputs(string text, int file_handle) int fseek(int file_handle, int offset, int whence) string gets() int popen(string command, string mode) void perror(string complaint) int pclose(int file_handle) string sprintf(string format, ...) string strchr(string source, char c) string strrchr(string source, char c) string strtok(string source, string pattern) New feature - pre-defined variables: stdin stdout stderr ******************************** NEW TO VERSION 1.7 Changes to language classes: sysconf class has been removed mib class has been added New builtins: struct proc_info_t processor_info(int instance) void puts(string) long sysconf(int flag) is now a builtin struct utsname uname(void) New include files: mib.se - for the mib language class processor.se - for processor_info() sysconf.se - changed to reflect the new builtin utsname.se - for uname() New example scripts: uname.se - almost identical to the uname(1) command cpus.se - show the instance number, state, and clock speed of cpus cpg.se - modified to use mib class variable and look for udpInOverflows ******************************** NEW TO VERSION 1.5: New builtins: long strtol(string pattern, int base) string itoa(long) prpsinfo_t first_proc() prpsinfo_t next_proc() prpsinfo_t get_proc(int pid) Bug fixes: string operations New functionality: builtin functions return a user defined type; odd, but necessary comparison of string variables to constant nil bitwise operators: &, |, ^, <<, >>, &=, |=, ^=, <<=, >>= New include file: proc.se - for traversing procs New example scripts: ps-a.se - does a /usr/ucb/ps -a (almost) ps-p.se - does a /usr/ucb/ps on supplied process id nproc.se - counts the processes on the system 07070100305754000081a400000000000000010000000141dc5ea3000068e2000000880000000400000000000000000000001f00000005reloc/RICHPse/doc/EXAMPLES.DOC A guide to the example programs provided with SE ------------------------------------------------ Rich 10 Jul 2002 aw.se mrvmstat.se pwatch.se bigbrother.se msacct.se register.se collisions.se msacct_off.se rvmstat.se cpg.se multi_meter.se siostat.se cpu_meter.se net.se swap.se cpuchk.se net_example swapctl.se cpus.se netmonitor.se syslog.se cpustat.se netstat.se tcp_monitor.se ctlr.se netstatx.se tpry.se darth.se nfsmonitor.se uname.se data nfsstat.se uptime.se disks.se nproc.se util.se dumpkstats.se nx.se vader.se hostid.se pea.se virtual_adrian.se infotool.se peac.se virtual_adrian_lite.se iomonitor.se peer.se vmmonitor.se iost.se percollator.se vmstat.se iostat.se perfmeter.se webtune.se kvmname.se pry.se workollator.se limits.se ps-ax.se xio.se live_test.se ps-p.se xiostat.se mon_cm.se pure_test.se xit.se monlog.se pw.se xload.se mpvmstat.se pw_log.se zoom.se Notes on use of examples in SE 3.3 --------------------------------- Set the environment variable SEPATH to the examples directory and any other directories with SE scripts, like the PATH variable. Set SEINCLUDE to any directories containing include files. By default, SE will look in /opt/RICHPse/include. This guide has not been updated to reflect any examples that have been added since the last release. There are just too many examples to document and they're not that complex to figure out. What I will point out is "darth" and "vader". vader.se is the "Virtual Adrian Daemon" ("vad" with "er" tacked on). darth.se is the front-end to vader. Run vader.se on any machines you want to monitor and then run "darth.se -h remote-host". It's a smooshed-down zoom that can monitor a host remotely. You may find minor bugs. If you're feeling ambitious, fix them and send me an update. I don't have the time. aw.se ----- An application wrapper for finding out what's up on the system. Uses just about every class provided. Use: aw.se [-abcdefghijlmnopqrstuxy] [-[w|z] interval] command [args] -a All Info -b Misc System Info -c CPU System Info -d CPU VM Info -e Disk Info -f Network Info -g RPC Client Info -h RPC Server Info -i NFS Client Info -j NFS Server Info -l Segment Map Info -m Buffer Cache Info -n Inode Cache Info -o Interrupt Info -p Process Info -q Memory Info -r VM HAT Info -s DNLC Info -t VAC Flush Info -u System Variables Info -v Generate Continuous Running Info -w Pause for interval Seconds When Running -x Give totals -y Don't prompt for input -z Snapshot for interval Seconds collisions.se ------------- Prints out the collision rate for each ethernet interface on the system test program for netif class. cpg.se ------ The Capacity Planning Guide script written in SymbEL Use: cpg.se [-c] [-s count] [-i interval] -c Continuous mode -s count Sample count -i interval Sleep time between samples % se cpg.se ----------------------------------- Sun May 18 23:53:30 BST 1997 ----------------------------------- Gathering information........ok Checking paging/swapping... Checking disk saturation... Checking DNLC hit rate... Checking CPU times... Checking network condition... Errors on interface: le0 (ierrors = 0 oerrors = 53869) NB - these errors occurred because I ran it on my Tadpole SPARCbook which is normally disconnected from an ethernet but the interface is up. cpu_meter.se ------------ Basic meter showing usr/sys/wait/idle CPU as separate bars, using the se graphics extensions library. cpus.se ------- Prints out the CPUs and clock rates, like psrinfo % se cpus.se cpu: 0 state: online clock: 85 MHz disks.se -------- Prints out the disk instance to controller/target mappings, and partition usage. The way this works has been rewritten in SE3.0 so that inst_to_path mappings are always generated and stored with the disk data by the p_iostat_class code. There is no separate need to invoke inst_to_path_class which simplifies code. Unbundled old SE scripts will need to be modified to work with the new p_iostat_class. e.g. % se disks.se kernel -> path_to_inst -> /dev/dsk part_count [fstype mount] sd3 -> sd3 -> c0t3d0 2 c0t3d0s0 ufs / c0t3d0s1 swap swap dumpkstats.se ------------- Dumps out every kstat it can find on the system. If you are trying to add a new kstat, you can use dumpkstats.se to find out what the structure should contain. SE3.0 can dynamically add new kstats. infotool.se ----------- Neat gui based tool that shows you the most interesting sets of data that the system can read via kstat. It shows totals since boot, or updates over a time period based on a slider setting. It is related to the aw.se program described above. iomonitor.se ------------ Uses p_iostat_class and inst_to_path_class. Like iostat -x, but doesn't print anything unless it sees a slow disk When it does it tries to sound an alarm and prints out a timestamped complaint based on iostat -x. The additional column headed "delay" prints out the total number of I/O's multiplied by the service time for the interval. This is an aggregate measure of the amount of waiting for I/O that is happening due to that disk on a per-second basis. High values could be cause by a few very slow I/Os or many fast ones. The disk name is converted to a more useful form, and the "slow" thresholds can be set using environment variables. use: /opt/SMCCse/examples/iomonitor.se [interval] [-|command] with environment IOSLOW (default 50.0) and IOMINBUSY (default 20.0) % se iomonitor.se iomonitor.se thresholds set at 50.0 ms service time and 20.0 %busy iomonitor.se detected slow disk(s): Tue Mar 21 21:22:24 1995 disk r/s w/s Kr/s Kw/s wait actv svc_t %w %b delay c0t5d0 0.3 21.7 0.9 1026.5 1.9 1.8 170.1 57 61 3736.0 iost.se ------- Uses p_iostat_class and inst_to_path_class iostat -x output that is trimmed to *not* show inactive disks. The bottom line shows totals of I/O activity in reads and writes per second and Kbytes read and written. Default to skip 0.0% busy but threshold can be set on the command line. use: iost.se [interval] [min busy to disp] % se iost.se extended disk statistics disk r/s w/s Kr/s Kw/s wait actv svc_t %w %b c0t1d0 13.5 0.0 108.0 0.0 0.0 0.3 25.8 0 35 c0t2d0 14.0 0.0 112.0 0.0 0.0 0.3 23.1 0 32 TOTAL w/s 0.0 0.0 r/s 27.5 220.0 iostat.se --------- Uses p_iostat_class. Output like iostat -D % se iostat.se sd3 sd5 rps wps util rps wps util 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 kvmname.se ---------- Test program for devinfo using kvm. Must be run as root. ipx# se kvmname.se SUNW,Sun 4_50 live_test.se ------------ This program exists to test and display everything in live_rules.se, it also provides a crude system monitor output with a 30 second interval and ascii display, for times when zoom.se is inconvenient. use: live_test.se [interval] [-|command] % se live_test.se live_test.se Version 1.0: Started monitoring at Wed Oct 22 16:07:26 1997 Live rule specific thresholds: LR_DISK_SLOW_FD default=10.0x getenv=10.0x derate slow floppys LR_DISK_SLOW_CD default=10.0x getenv=10.0x derate slow CDs LR_DISK_FLOPPY default= fd0 getenv= fd0 default floppy device LR_DISK_CDROM default=c0t6d0 getenv=c0t6d0 default CD device TCP_ACTIVE default= 2.0KB/s getenv= 2.0KB/s ignore if no output activity TCP_RETRANS_WARN default=15.0% getenv=15.0% moderate retransmissions TCP_RETRANS_PROBLEM default=25.0% getenv=25.0% excessive retransmissions TCP_LISTEN_WARN default=0.00/s getenv=0.00/s look out for listen drops TCP_LISTEN_PROBLEM default=0.50/s getenv=0.50/s excessive listen drops Overall current state is green at: Wed Oct 22 16:07:31 1997 Subsystem State Action Disk white No activity cdrom white c0t2d0 white c0t2d0s0 white c0t2d0s2 white c0t3d0 white c0t3d0s0 white c0t3d0s2 white c0t5d0 white c0t5d0s0 white c0t5d0s2 white c0t5d0s7 white fd0 white Networks white No activity le0 white be1 white NFS client white No client NFS/RPC activity Swap space green No worries, mate RAM demand white RAM available Kernel mem white No worries, mate CPU power white CPU idling Mutex green No worries, mate DNLC white No activity Inode white No activity TCP white Low TCP activity mon_cm.se --------- use: mon_cm.se [interval] [calendar] This program runs the live_rules over a 15 minute period then if any rule gives an amber or worse state it uses cm_insert to create a calendar entry for that time period in user@nodename indicating the rule states e.g. ** Calendar Appointment ** Date: 5/15/95 Start: 3:05am End: 3:20am Repeat: One Time What: amber - state from RICHPse.mon_cm blacks - reds - ambers - Disks DNLC In this case both the Disk and DNLC rules are amber, all other rules are white, blue or green and are not shown. This data fits neatly in the calendar manager display. The default interval is 900 seconds, to set a different calendar use % se mon_cm.se 900 username@server This can be useful to centralize calendar files on a server machine although either a different user should be specified for each client system or the script should be changed to add the hostname to each entry. Insert permissions will be needed for the calendar specified. This can be browsed remotely using cm. Multiple machines can be viewed on a weekly basis using the multi-browse capability of cm. It is necessary to run /usr/openwin/bin/cm one time as that user, to create the initial calendar. If mon_cm.se is started at boot time it runs as root and the root calendar must be created. There is no need to restart mon_cm if it is running and failing to add the calendar entry. Just create the calendar and it will add an entry next time it tries. This is a very low overhead way to keep track of a large number of systems and browse their condition over long time spans looking for periods of peak activity. monlog.se --------- This program runs the live_rules and logs state changes to syslog at 2 minute intervals. The syslog identifier can be set, it defaults to a parseable proposed syslog message standard. Loghost can be set to send syslog messages to a central logging machine. use: monlog.se [interval] [identifier] Mar 21 20:30:59 bloodnok ID[RICHPse.monlog.2000]: Disk state white entered, Action: No activity mpvmstat.se ----------- A modified vmstat-like display. It prints out a line per CPU including mutex enter failures (smtx) and a wait time breakdown (which is always zero for sw and pio). use: mpvmstat.se [interval] [count] % se mpvmstat.se mpvmstat.se 1 second intervals starting at Tue Mar 21 21:54:34 1995 cpu r b w pi po sr smtx in sy cs us sy io sw pio id swap free 0 0 0 0 0 0 0 20 191 182 155 2 0 0 0 0 98 52940 1552 1 0 0 0 0 0 0 23 142 172 139 2 0 0 0 0 98 msacct.se --------- This uses a little-known performance measurement called microstate accounting to show the detailed sleep time and causes for a process. For Solaris 2.3 this data is always collected. For Solaris 2.4 and later the data starts to be collected after the first measurement. usage: msacct.se pid [interval] Elapsed time 3:29:26.344 Current time Tue May 23 01:54:57 1995 User CPU time 5.003 System call time 1.170 System trap time 0.004 Text pfault sleep 0.245 Data pfault sleep 0.000 Kernel pfault sleep 0.000 User lock sleep 0.000 Other sleep time 9:09.717 Wait for CPU time 1.596 Stopped time 0.000 multi_meter.se -------------- A useful tool that shows a total of 8 measurements as horizontal bars in a gui meter. CPU system time and context switches, Inode cache and DNLC hit rates, VM scan rate and pager runs, and mutex and syscall rates. It includes an interval widget to set the update rate interactively. net.se ------ Test program for netif class, output like netstat -i plus collision %. % net.se Name Ipkts Ierrs Opkts Oerrs Colls Coll-Rate le0 0 0 0 6 0 0.00 % net_example ----------- This example shows how to build a distributed client/server tool using SE. An unresolved problem is that the client and server configuration environment is different. So the number of disks that SE thinks it deals with on the client does not match the server. Careful coding is needed to workaround these issues. netmonitor.se ------------- Same concept as iomonitor.se, waits for a slow network, then prints out same basic data as netstatx.se. Uses p_netstat_class which gives per-second rates, whereas the netif class gives counts since boot time. use: netmonitor.se [interval] [-|command] with environment NETACTIVE (default 10.0) and NETMAXCOLL (default 2.0) % se netmonitor.se netmonitor.se thresholds set at 10.0 packets/s and 2.0% collisions netstat.se ---------- This script prints out the updated netstat class information. NoCP means nocanput, which is an IP packet discarded due to lack of buffering on input. It can cause a TCP connection to need to retransmit the packet from the other end. Defr is defers, this is an ethernet metric that counts the rate at which output packets are delayed before transmission. % se netstat.se Warning: Cannot init kvm: Permission denied no root permissions - get tcp data with slow locking Current tcp RtoMin is 200, interval 5, start Mon May 19 01:10:40 1997 Name Ipkt/s Opkt/s Err/s Coll% NoCP/s Defr/s tcpIn tcpOut Conn/s %Retran le0 0.0 0.0 0.20 0.00 0.00 0.00 0 0 0.00 0.00 ipdptp0 0.0 0.0 0.00 0.00 0.00 0.00 netstatx.se ----------- netstatx.se is like iostat -x in format, it shows per-second rates like the basic netstat but formats the data like netstat -i. Its a good example of how a very useful command can simply be built to fill a hole in the standard Solaris offerings. It uses p_netstat_class and also uses the ndd class to check the TCP/IP timeout, and shows the total bytes sent and retransmits using the mib class. This is the only available network throughput measure in bytes. Its interesting on WWW servers. % se netstatx.se Current tcp minimum retransmit timeout is 200 Mon May 19 01:09:17 1997 Name Ipkt/s Ierr/s Opkt/s Oerr/s Coll/s Coll% tcpIn tcpOut DupAck %Retran le0 0.0 0.0 0.0 0.4 0.0 0.00 0 0 0 0.00 ipdptp0 0.0 0.0 0.0 0.0 0.0 0.00 nfsmonitor.se ------------- nfsstat-m.se but built as a monitor. It only prints out slow NFS client mount points, ignoring the ones that are OK. Only runs as root. For Solaris 2.5 it only reports data for NFS V2 reliably. For NFS V3 it always reports zeroes (as does the regular nfsstat -m). nfsstat-m.se ------------ A clone of the nfsstat -m command, testing the nfs_class that provides per-NFS mount point information. Only runs as root. For Solaris 2.5 it only reports data for NFS V2 reliably. For NFS V3 it always reports zeroes (as does the regular nfsstat -m). nproc.se -------- A simple test program for the first_proc/next_proc builtin calls that get per-process data. nx.se ----- Improved version of netstatx.se that prints out new stuff from the netif and tcp_class classes. All errors are summed together. NoCP is nocanput, incoming IP packets being dropped. Defr is defers, packets delayed on output. tcpIn and tcpOut are in bytes/sec, incoming and outgoing TCP connections are in Conn/s, and TCP retrans percent is reported. No all interfaces report nocanput or defer. Current tcp RtoMin is 200, interval 5, start Wed Oct 22 16:11:26 1997 Name Ipkt/s Opkt/s Err/s Coll% NoCP/s Defr/s tcpIn tcpOut Conn/s %Retran le0 0.0 0.0 0.00 0.00 0.00 0.00 85 256 0.00 0.00 be1 1.2 0.8 0.00 0.00 0.00 0.00 ps-ax.se -------- /usr/ucb/ps ax command written as a script, testing first_proc, next_proc Only monitors processes that you own. ps-p.se ------- /usr/ucb/ps ax command written as a script, testing get_proc Only monitors processes that you own. pure_test.se ------------ Test program for pure_rules.se, it shows all the thresholds then drives the rules directly. When creating a new rule, first create it in pure_rules.se, then use pure_test.se to exercise it and figure out how to get the data it needs. Next build a live_rule to feed it and test that using live_rules.se. Shows the default thresholds and what is currently being picked up from environment variables. pure_test.se Version 1.1: Started monitoring at Wed Oct 22 16:16:05 1997 DISK_BUSY_WARNING default= 5.0% getenv= 5.0% ignore less than this DISK_BUSY_PROBLEM default=20.0% getenv=20.0% DISK_SVC_T_WARNING default=30.0ms getenv=30.0ms DISK_SVC_T_PROBLEM default=50.0ms getenv=50.0ms ENET_INUSE default=50.0/s getenv=50.0/s ignore fewer output packets/s ENET_COLL_WARNING default=15.0% getenv=15.0% ENET_COLL_PROBLEM default=30.0% getenv=30.0% ENET_ERROR_PROBLEM default=0.050/s getenv=0.050/s ENET_DEFER_WARNING default=2.00% getenv=2.00% some delayed output packets ENET_DEFER_WARNING default=10.00% getenv=10.00% too many delayed output packets ENET_NOCANPUT_PROBLEM default=1.000/s getenv=1.000/s incoming packet dropped by IP RPCCLIENT_MINCALLS default= 0.1/s getenv= 0.1/s calls per sec for idle RPCCLIENT_TIMEOUT default= 5.0% getenv= 5.0% calls that timeout RPCCLIENT_BADXID default= 0.0% getenv= 0.0% timeouts with badxid SWAP_WASTE default=100000KB getenv=100000KB more may be a waste SWAP_LOTS default= 10000KB getenv= 10000KB more is lots SWAP_LOW default= 4000KB getenv= 4000KB warning LOW to LOTS SWAP_NONE default= 1000KB getenv= 1000KB danger LOW-NONE, crisis RESTIME_LONG default=600s getenv=600s No scanning - long res time RESTIME_OK default= 40s getenv= 40s residence time of unref pages RESTIME_PROBLEM default= 20s getenv= 20s pages stolen too quickly KMEM_FREEMEM_LOW default= 64pg getenv= 64pg few pages for kernel to use RUNQ_IDLE default= 1.0 getenv= 1.0 Spare CPU capacity RUNQ_BUSY default= 2.0 getenv= 2.0 OK up to this level RUNQ_OVERLOAD default= 5.0 getenv= 5.0 Warning up to this level MUTEX_BUSY default=200.0/s getenv=200.0/s OK up to this level per-CPU MUTEX_OVERLOAD default=500.0/s getenv=500.0/s Warning up to this level DNLC_ACTIVE default=100.0/s getenv=100.0/s minimum activity DNLC_WARNING default=80.0% getenv=80.0% warning missrate INODE_ACTIVE default=100.0/s getenv=100.0/s minimum activity INODE_WARNING default=80.0% getenv=80.0% warning missrate INODE_IPF default= 0.0% getenv= 0.0% stolen inodes w/pages frac Overall current state is amber at: Wed Oct 22 16:16:35 1997 Subsystem State Action Disk amber Move load from busy disks to idle disks Ethernet white No activity NFS client green No worries, mate Swap space green No worries, mate RAM demand white RAM available Kernel mem white No worries, mate CPU power white CPU idling Mutex green No worries, mate DNLC hits white No activity DNLC hitrate 94.6%, reference rate 0.07/s Inode hits white No activity Inode hitrate 55.2%, reference rate 0.00/s pwatch.se --------- Watch a process, as it consumes CPU time. Defaults to pid 3 to watch the system process fsflush. Only monitors processes that you own. sar_io.se --------- Shows I/O data from sadc like sar. Tests sadc_class. siostat.se ---------- A tool that prototypes the iostat output I'd like to see, with all the right data with correct naming conventions. Normal iostat is confused about what it calls svc_t which is not the service time. siostat.se gets it right. See http://www.sun.com/sunworldonline/swol-09-1997/swol-09-perf.html for more explanation. Also timestamps every measurement, shows partitions on 2.6 (like iostat -p) and doesn't print anything until the end of the first interval. It always gives you the real name of the disk if it can. qlen - number of requests in the queue res_t - residence time (what iostat calls svc_t, but for each queue separately) svc_t - service time for the one request at the front of the queue (in ms) %ut - utilization a.k.a. busy wait queue is requests that have not been sent over the SCSIbus yet active queue is requests inside the disk drive or array controller use: siostat.se [interval] [count] 16:29:49 ------throughput------ -----wait queue----- ----active queue---- disk r/s w/s Kr/s Kw/s qlen res_t svc_t %ut qlen res_t svc_t %ut c0t2d0 24.1 6.7 101.2 40.5 0.00 0.01 0.01 0 1.32 42.74 14.96 46 c0t2d0s0 24.1 6.7 101.2 40.5 0.00 0.01 0.01 0 1.32 42.75 14.96 46 c0t2d0s2 0.0 0.0 0.0 0.0 0.00 0.00 0.00 0 0.00 0.00 0.00 0 c0t5d0 20.5 9.3 82.0 37.6 0.00 0.01 0.01 0 0.80 27.00 12.29 37 c0t5d0s2 20.5 9.3 82.0 37.6 0.00 0.01 0.01 0 0.80 27.00 12.30 37 fd0 0.0 0.0 0.0 0.0 0.00 0.00 0.00 0 0.00 0.00 0.00 0 syslog.se --------- Tests syslog interface. uname.se -------- Clone of the regular uname command. % uname.se -a SunOS bloodnok 5.4 Generic_101945-10 sun4c sparc uptime.se --------- Continuous display as each second of uptime occurs. % uptime.se System up for: 3 days 5 hours 19 minutes 27 seconds virtual_adrian.se ----------------- Based on the previous version of virtual_adrian.se, (now renamed virtual_adrian_lite.se) the latest release uses all the predefined live_rules, and adds pwatch and nfsmonitor.se functions as well as updated static checks. Since the rules and tuning recommendations are all provided in Adrian's book (Sun Performance and Tuning: SPARC and Solaris, SunSoft Press/Prentice Hall) running this script is like having Adrian actually watching over your machine for you, wingeing about anything that doesn't look well tuned. If it is not run as root then it cannot perform all its checks, but it does the basic rules. During install it can be setup to run automatically, logging output to the console and to /var/adm/sa/monitor.log The thresholds are controlled by setting environment variables, the first three are specific to this script, but the rest are the generic ones used whenever the pure_rules initialize themselves. Set them once in a shell window and they will persist for any commands that use the rules. use: virtual_adrian.se [interval] [-|command] with environment variables: PWPID (default 3 is fsflush) PWMAXCPU (default 5.0% max CPU usage) NFSRTALLSLOW (default 50ms max NFS round trip time) virtual_adrian_lite.se ---------------------- This program started life as iomonitor.se, vmmonitor.se and netmonitor.se all combined together so that one script would watch everything. It now includes the functionality of pwatch.se as well, and the latest version includes nfsmonitor.se. In addition a static check is made to see what the system parameters are set to when it starts. If it is run as root it can read the parameters, and will recommend changes or directly modify well known kernel parameters in safe ways. If there is insufficient RAM (under 24MB) it will exit, as it will only make the system slower. If it sees swap space get very low, it will also exit. This guards against memory leaks. In se2.3.1 a leak could cause long running scripts to grow to several tens of MB over a few months. This older version of virtual_adrian.se is provided as it is simpler, smaller and hence uses less RAM and CPU. At 30s intervals, you don't save much CPU, even on an old SS2 or IPX as all the scripts are pretty lightweight. vmmonitor.se ------------ vmstat based monitor script. Looks for low RAM, swap and CPU overloads. vmstat.old.se ------------- Clone of the regular vmstat vmstat.se --------- Modified vmstat that shows a measure of page residence time. i.e. the approximate time a page stays in memory if it is never used again. If this becomes a small number of seconds then active pages may become stolen. xio.se ------ Modified xiostat.se that tries to work out whether accesses are mostly random or sequential by looking at the transfer size and typical disk access time values. Based on the expected service time for a single random access read of the average size results above 100% indicate random access, and under 100% indicate sequential access. extended disk statistics disk r/s w/s Kr/s Kw/s wait actv svc_t %w %b %randsvc c0t3d0 2.0 33.0 9.0 264.0 28.2 2.9 886.7 93 98 151.7 c0t5d0 0.0 1.0 0.0 2.0 0.0 0.0 26.7 0 3 155.9 fd0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0.0 xiostat.se ---------- Basic iostat -x clone that actually prints the name of each disk in a usable form rather than sdxx! extended disk statistics disk r/s w/s Kr/s Kw/s wait actv svc_t %w %b c0t3d0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 c0t5d0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 fd0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 xit --- This is xit - the eXtended Iostat Tool. What it does is the same as running iostat -x in a cmdtool. But beyond that, it shows how to write a SymbEL program that sends it's output to a GUI that can then display that data. zoom.se ----------- GUI frontend to live_rules.se with popup screens to show you all the background data that the state is based upon. Probably the most functional program written in SE so far, its a powerful tool for monitoring a system. Click on any of the buttons to see its details, and click on the little "face" icons to learn more about the kind of guys who write this stuff. 07070100305755000081a400000000000000010000000141dc5ea3000030b2000000880000000400000000000000000000001600000005reloc/RICHPse/doc/FAQFAQ: Last update: 9/26/01 ------------------------------------- Q: What is the SE Toolkit? A: Language->C instead of the en_US.UTF-8 locale. If you're not using CDE, do whatever it takes to get out of the U.S. Unicode character set. 07070100305756000081a400000000000000010000000141dc5ea30000ba0e000000880000000400000000000000000000001d00000005reloc/RICHPse/doc/GUI.MANUALIntroduction The "attach" statement of the SymbEL language provides the user with the ability to extend the language into a shared library. This capability has been very useful in providing access to system libraries. It is not limited to system libraries, however. The end user may develop shared libraries for their own purpose and create an include file with an "attach" statement so they can make use of new features. The purpose of the SE eXtensions package is to provide shared libraries that extend the language into areas that are of wide application. Clearly, one such area is the Graphical User Interface (GUI). This is the first extension that has been developed for SE. A GUI Extension Anyone who has written code with the X Toolkit (libXt) and a Toolkit based Widget library (such as Athena or Motif) knows that this is dense and sometimes difficult to understand code. Developing an SE extension that talks directly at this level would be impractical. A higher layer that provided an interface to graphical entities without the complications of writing toolkit code is necessary. The method decided on was to define a user interface as an entity with graphical objects stacked vertically on top of each other, or horizontally next to each other from left to right, each optionally separated by a graphical separator. The framework of the application could then be defined within the SE code as an array of structures. By defining an array of structures with an aggregate initialization as the framework of the GUI, most of the programming required to define the appearance of the application would be done. The "resource_t" Structure The data (called resources) necessary to construct an object for the GUI is contained in the "resource_t" structure defined in gui_lib.se. This structure is: struct resource_t { int r_type; // R_BUTTON, etc. int r_foreground; // one of ST_WHITE, ST_BLUE, etc. int r_background; // ditto string r_label; // label string r_data; // additional data for the widget string r_callback; // name of function to call if button is pressed string r_callback_data; // data to pass to callback string r_container; // name of variable into which to store handle }; The "r_type" Member The "r_type" member is a numeric code representing what type of graphical object this member of the GUI should be. The possible values for "r_type" are contained in the "gui_defines.h" file. They are: /* r_type values */ #define R_HFRAME 0 /* first member of horizontal frame or subframe */ #define R_VFRAME 1 /* first member of vertical frame or subframe */ #define R_BUTTON 2 /* button, when just one is needed */ #define R_GROUP 3 /* just a group of objects */ #define R_BGROUP 4 /* a button as a title with a group of objects */ #define R_LGROUP 5 /* a label as a title with a group of objects */ #define R_HSCALE 6 /* horizontal scale control */ #define R_VSCALE 7 /* vertical scale control */ #define R_MENUBAR 8 /* a menu bar */ #define R_CASCADE 9 /* cascading menu option */ #define R_OPTION 10 /* option in a cascading menu */ #define R_HRADIOBOX 11 /* horizontal radio box */ #define R_VRADIOBOX 12 /* vertical radio box */ #define R_TBUTTON 13 /* toggle button for radio box logic */ #define R_COUNTER 14 /* two arrow buttons and a text field */ #define R_ROW 15 /* form with horizontal orientation */ #define R_COLUMN 16 /* form with vertical orientation */ #define R_VBAR 17 /* vertical bar with no labels */ #define R_HBAR 18 /* horizontal bar with no labels */ #define R_VBAR_CHART 19 /* vertical bar with label, min, max, value */ #define R_HBAR_CHART 20 /* horizontal bar with label, min, max, value */ #define R_LABEL 21 /* just a plain ol' label */ #define R_TEXT 22 /* scrolled text widget */ #define R_TFIELD 23 /* an editable text field */ #define R_FSBOX 24 /* file selection box */ #define R_SELBOX 25 /* plain selection box */ #define R_EDITOR 26 /* an editable scrolled text widget */ #define R_SEPARATOR 27 /* visual separator */ #define R_STRIPCHART 28 /* the Athena widget */ #define R_POINTCHART 29 /* a modified strip chart that draws lines */ #define R_CLOCK 30 /* an xclock clock */ #define R_VPANED 31 /* a vertical paned window */ #define R_HPANED 32 /* a horizontal paned window */ #define R_END -1 /* end of list of resources */ The "r_foreground" and "r_background" Members The "r_foreground" and "r_background" members are numeric codes representing what color the foreground and background should be. This can be one of the standard colors defined in the "gui_defines.h" include file or a user defined color. The only object type that does not use the foreground and background colors is the R_HFRAME and R_VFRAME objects. To set these colors, the -fg and -bg options of the X Toolkit are used. The standard colors are: #define ST_WHITE 0 #define ST_BLUE 1 #define ST_GREEN 2 #define ST_AMBER 3 #define ST_RED 4 #define ST_BLACK 5 #define ST_YELLOW 6 #define ST_LIGHTBLUE 7 #define ST_CYAN 8 #define ST_MIDNIGHTBLUE 9 #define ST_OLIVEGREEN 10 #define ST_GOLDENROD 11 #define ST_FIREBRICK 12 #define ST_LIGHTGREY 13 #define ST_NAVY 14 #define ST_MAROON 15 The "r_label" Member The "r_label" member is a string that means different things to different objects. For those objects that use the "r_label" member, this is what it means: R_BUTTON The text on the button R_HSCALE The label next to the scale R_VSCALE The label next to the scale R_OPTION The text for the option R_TBUTTON The text for the button R_COUNTER The text next to the counter R_VBAR_CHART The text next to the bar R_HBAR_CHART The text next to the bar R_LABEL The text on the label R_SELBOX The text over the list The "r_data" Member Some of the objects require more resources than are provided by the members of the resource_t structure. In this case, additional resources are placed in the "r_data" member. This is done by creating a colon (:) separated list of values. These values are most often integer values so sprintf() or itoa() can be used to create the string value that is used in "r_data". If this list of additional resources is omitted, the library will use default values, but the results may not be what you expect. The definition of the additional resources for those objects that use them are: R_BUTTON +------------------------------------+--------+---------------+ |Description | Type | Default Value| +====================================+========+===============+ | If the "r_label" member is nil and | | | | "r_data" has a value, then it is | | | | the path name of an X Bitmap file | | | | to use as the label pixmap. | string | nil | +------------------------------------+--------+---------------+ R_GROUP R_BGROUP R_LGROUP +----------------+------+--------------+ |Description | Type | Default Value| +================+======+==============+ |Objects Per Row | int | 10 | +----------------+------+--------------+ R_HSCALE R_VSCALE +---------------+------+--------------+ | Description | Type | Default Value| +===============+======+==============+ | Minimum value | int | 1 | +---------------+------+--------------+ | Maximum value | int | 100 | +---------------+------+--------------+ | Initial value | int | 1 | +---------------+------+--------------+ R_OPTION +------------------------------------+--------+---------------+ |Description | Type | Default Value| +====================================+========+===============+ | If the "r_label" member is nil and | | | | "r_data" has a value, then it is | | | | the path name of an X Bitmap file | | | | to use as the label pixmap. | string | nil | +------------------------------------+--------+---------------+ R_TBUTTON +------------------------------------+--------+---------------+ |Description | Type | Default Value| +====================================+========+===============+ | If the "r_label" member is nil and | | | | "r_data" has a value, then it is | | | | the path name of an X Bitmap file | | | | to use as the label pixmap. | string | nil | +------------------------------------+--------+---------------+ R_COUNTER +---------------+------+--------------+ | Description | Type | Default Value| +===============+======+==============+ | Minimum value | int | 1 | +---------------+------+--------------+ | Maximum value | int | 100 | +---------------+------+--------------+ | Initial value | int | 1 | +---------------+------+--------------+ R_VBAR R_HBAR R_VBAR_CHART R_HBAR_CHART +---------------+------+---------------+ | Description | Type | Default Value | +===============+======+===============+ | Width | int | 8 | +---------------+------+---------------+ | Height | int | 64 | +---------------+------+---------------+ | Minimum value | int | 1 | +---------------+------+---------------+ | Maximum value | int | 100 | +---------------+------+---------------+ | Initial value | int | 1 | +---------------+------+---------------+ These are the default values for a bar or bar chart that is vertically oriented. For horizontal orientation the width and height values are reversed. R_LABEL +------------------------------------+--------+---------------+ |Description | Type | Default Value| +====================================+========+===============+ | If the "r_label" member is nil and | | | | "r_data" has a value, then it is | | | | the path name of an X Bitmap file | | | | to use as the label pixmap. | string | nil | +------------------------------------+--------+---------------+ R_TEXT +-------------+------+---------------+ | Description | Type | Default Value | +=============+======+===============+ | Width | int | 84 | +------------------------------------+ | Height | int | 28 | +-------------+------+---------------+ R_TFIELD +-------------+------+---------------+ | Description | Type | Default Value | +=============+======+===============+ | Width | int | 10 | +-------------+------+---------------+ R_FSBOX +-------------+---------+---------------+ | Description | Type | Default Value | +=============+=========+===============+ | Directory | string | "." | +-------------+---------+---------------+ | Pattern | string | "*" | +-------------+---------+---------------+ | File Type | int | R_ANY | +-------------+---------+---------------+ "File Type" can any one of F_REGULAR, F_DIRECTORY or F_ANY. R_EDITOR +-------------+------+---------------+ | Description | Type | Default Value | +=============+======+===============+ | Width | int | 84 | +------------------------------------+ | Height | int | 28 | +-------------+------+---------------+ R_STRIPCHART +------------+------+---------------+ |Description | Type | Default Value | +============+======+===============+ | Width | int | 50 | +------------+------+---------------+ | Height | int | 50 | +------------+------+---------------+ | Scale | int | 0 | +------------+------+---------------+ | Jump | int | 0 | +------------+------+---------------+ | Interval | int | 2 | +------------+------+---------------+ R_POINTCHART +------------+------+---------------+ |Description | Type | Default Value | +============+======+===============+ | Width | int | 50 | +------------+------+---------------+ | Height | int | 50 | +------------+------+---------------+ | Scale | int | 0 | +------------+------+---------------+ | Jump | int | 0 | +------------+------+---------------+ | Interval | int | 2 | +------------+------+---------------+ "Scale" is the minimum scale for the chart. "Jump" is the number of pixels to jump for each update. "Interval" is how often to update the chart. R_CLOCK +------------+------+---------------+ |Description | Type | Default Value | +============+======+===============+ | Width | int | 50 | +------------+------+---------------+ | Height | int | 100 | +------------+------+---------------+ | Update | int | 1 | +------------+------+---------------+ | Chime | int | 0 | +------------+------+---------------+ "Update" is the update interval for the sweep second hand. "Chime" is whether the clock should chime on the hour and half hour. If set to zero, the clock will not chime. If set to non-zero, it will chime once on the half hour and twice on the hour. Convenience Functions for the "r_data" Member. To simplify the process of creating this string for the "r_data" member, convenience functions have been created that build the string and return it. This will provide a notation for what resources are needed for each type of object and removes the need to know what the order of the arguments are. These are the function prototypes for those objects that use "r_data". R_HSCALE R_VSCALE string gui_scale_data(int minimum, int maximum, int initial) R_COUNTER string gui_counter_data(int minimum, int maximum, int initial) R_VBAR R_HBAR R_VBAR_CHART R_HBAR_CHART string gui_bar_data(int width, int height, int minimum, int maximum, int initial) R_TEXT string gui_text_data(int width, int height) R_TFIELD string gui_tfield_data(int width) R_EDITOR string gui_editor_data(int width, int height) R_STRIPCHART string gui_stripchart_data(int width, int height, int scale, int jump, int interval) R_POINTCHART string gui_pointchart_data(int width, int height, int scale, int jump, int interval) R_CLOCK string gui_clock_data(int width, int height, int update, int chime) The "r_callback" Member Some of the objects provide the user with the option of interacting with the graphical object defined. In the case of an R_BUTTON, if the user presses and releases the button with the pointer, some action should take place. This situation is handled by providing the name of a SymbEL function to call should the event take place. The name of this function goes into the "r_callback" member. If the value of "r_callback" is nil, then no callback is registered for that object. There are two objects that represent special cases with respect to callback handling. These are the R_FSBOX and the R_SELBOX. These two objects present the user with multiple buttons to press. Two of these buttons are of interest to the application. These are the "OK" button and the "Cancel" button. In the case of these two objects, two callback values may be specified. These two function names, as is the case with the "r_data" member, are separated by a colon (:). If only one function name appears in "r_callback" then it is assumed to be the "OK" callback. Not all objects have callbacks, since there is not always an action associated with the object. Or if there is, it is beyond the scope of this GUI interface to deal with the types of situations that may arise for that object. These are the objects and events that use callbacks. R_BUTTON Event: Button pressed and released. R_HSCALE R_VSCALE Event: Slider value changed. R_OPTION Event: This menu option was selected. R_TBUTTON Event: This button has been toggled. R_COUNTER Event: The counter value has been changed. R_TFIELD Event: The "Enter" key has been pressed and released. R_FSBOX Event: The "OK" button has been pressed and released. Event: The "Cancel" button has been pressed and released. R_SELBOX Event: The "OK" button has been pressed and released. Event: The "Cancel" button has been pressed and released. R_STRIPCHART R_POINTCHART Event: At each interval. The callback function differs from the standard callback. These callbacks return a double whereas the other callbacks are void. The value of the double returned should be between 0 as the minimum and the value set by the scale argument as the maximum. Convenience Functions for the "r_callback" Member. To facilitate the creation of the callback string for the "r_callback" member in the case of the R_FSBOX and R_SELBOX objects, two convenience functions were created that build the appropriate string. This will provide a notation for what callbacks are needed for each of these two objects. R_FSBOX string gui_fsbox_callbacks(string ok_callback, string cancel_callback); R_SELBOX string gui_selbox_callbacks(string ok_callback, string cancel_callback); The Declaration of a Callback Function. All callback functions have the same declaration with the exception of the R_STRIPCHART and R_POINTCHART, which is described in the "r_callback member" section. This declaration should be: callback_function(ulong handle, string client_data, string call_data) { ... } This function returns no value and has 3 parameters. "handle" is the handle to the object that owns the callback. "client_data" is the data that was placed in the "r_callback_data" member of the object declaration. "call_data" is data specific to the object. Not all of the objects will receive a value in the "call_data" parameter. For those objects that do not, this value will be "nil". For those that do, the value will be: R_HSCALE R_VSCALE The current value of the slider (as a string, use atoi()). R_COUNTER The current value of the counter (as a string, use atoi()). R_TFIELD The contents of the text field that has been entered. R_FSBOX The name of the file selected. R_SELBOX The option from the list that was selected. There is one other case of the possible value of "call_data". That case is described in the section on dialog boxes. The "r_callback_data" Member. When the application needs a value to be passed to a callback function this value can be specified in the "r_callback_data" member. When the callback function is called, the value specified here will be sent in the "client_data" parameter of the callback function. The "r_container" Member. If this field has a value, it is the name of a global variable declared as a ulong which can be used as a holder for the handle to the data structure. This is a convenience so the programmer will not need to use the gui_get_member function to look up these handles. The Structure of the GUI. Each object defined in the top-most level of the GUI may be either a single entity or a group that contains many other objects. An example of this would be a menu bar. The menu bar is itself an object that must be defined in the top level object. But the options on the menu bar also must be defined. Since there is no way to insert these sub-objects into the top level object through the aggregate initialization process, these sub-objects must be inserted through another process. This process will be described when the GUI utility functions are defined. The types of objects that are groups are: R_GROUP R_BGROUP R_LGROUP The group, button group and label group objects can contain multiples of any object. Most often, these are buttons. Although the GUI library will allow the grouping of any type of object, the output may not be what is expected. This is due to geometry management problems in the X Toolkit. R_MENUBAR The menu bar expects objects under it to be of type R_CASCADE or R_OPTION. Using any other type of object will cause undefined results. R_HRADIOBOX R_VRADIOBOX The radiobox expects objects under it to be of type R_TBUTTON. Using any other type of object will cause undefined results. R_ROW R_COLUMN The row and column objects can contain multiples of any object. The grouping of the objects under it will be horizontally oriented in the case of the row object and vertically oriented in the case of the column. R_VPANED R_HPANED The paned objects can contain multiples of any object. The grouping of the objects under it will be horizontally oriented in the case of the hpaned object and vertically oriented in the case of the vpaned object. There will be a slider handle between the objects that can be used to adjust the size of the object between the handle and the next object or the edge of the gui. Building the GUI. Once the aggregate structure array declarations have been written, the code to build the GUI can be written. The "gui_create_frame" Function. The first step in this building process is to initialized the GUI library and specify the top level array of structures that define the structure of the GUI. ulong gui_create_frame(int argc, string argv[], resource_t objects[]); The "gui_create_frame" function takes as parameters the "argc" and "argv" arguments passed in from the command line. Any X Toolkit argument can be used and will have the expected effect on the application. To change the name that appears in the title bar of the application change the "argv[0]" value to the desired string. The "objects" parameter to this function is the top-most level GUI description in the form of an array of structures of type "resource_t". The value returned by "gui_create_frame" is an opaque handle that can be used to get and put values into the GUI later in the program. "gui_create_frame" should only be called once. To create other frames, another function is used. That function will be described later. The "gui_main_loop" Function. Once the GUI has been initialized, it can be started. In the most simple case, only two function calls are required in the main program. The first is the "gui_create_frame" function and the second is the "gui_main_loop" function. gui_main_loop(string callback, string callback_data, int interval); The "callback" and "callback_data" parameters specify what callback function to call and the "interval" parameter specifies, in seconds, how often to call that function. If "nil" is specified as a callback, then no callback is made. If "callback" is not nil and the "interval" value is zero, then the callback is called only once as an initialization step. When "callback" is not nil and interval is not zero, the callback function is called as an initialization step and then every "interval" seconds thereafter. Note that "gui_main_loop" does not return. Exiting the program can be accomplished through callbacks. To change the callback interval while the program is running, the "gui_set_loop_interval" function can be used. gui_set_loop_interval(string callback, string callback_data, int interval); This will set the loop interval to "interval" seconds and call "callback" with "callback_data" when that time expires. Any pending callback with the previous interval value will not be honored. The First Program. At this point, the obligatory "Hello, World" program can be written: #include #include resource_t gui[3] = { /* type fg bg label */ { R_VFRAME }, { R_LABEL, ST_WHITE, ST_BLUE, "Hello, World" }, { R_END } }; main(int argc, string argv[]) { gui_create_frame(argc, argv, gui); gui_main_loop(nil, nil, 0); } This program will create a label with the text "Hello, World" in white on a blue background. The program will need to be terminated using either the window manager or using Crtl-C from the command line. Reviewing the program: #include #include The string.se include file is needed by gui_lib.se so it is included. The gui_lib.se file contains all of the necessary declarations for the program. resource_t gui[3] = { { R_VFRAME }, This defines the frame of the GUI as having a vertical orientation. Since no other members of the structure are needed the initialization ends at the "r_type" member. { R_LABEL, ST_WHITE, ST_BLUE, "Hello, World" }, This defines an R_LABEL object with an ST_WHITE foreground, an ST_BLUE background and containing the text "Hello, World". There is no callback or callback data, so these members are omitted from the initialization. { R_END } }; This ends the structure. If this is omitted, a subscript error will occur in the "gui_create_frame" function. main(int argc, string argv[]) { gui_create_frame(argc, argv, gui); The frame is created and the return value of "gui_create_frame" is ignored since it is not used further in this program. gui_main_loop(nil, nil, 0); } "gui_main_loop" is called and the program is under way. There is no callback function so the callback parameter is nil. A Variation on the First Program. A slight modification can now be made to this program to demonstrate callbacks and exit the program more elegantly. Instead of using a label, the program will use a button. When this button is pressed and released, the program will exit. #include #include #include resource_t gui[3] = { /* type fg bg label data cb */ { R_VFRAME }, { R_BUTTON, ST_WHITE, ST_BLUE, "Hello, World", nil, "exit_cb" }, { R_END } }; main(int argc, string argv[]) { gui_create_frame(argc, argv, gui); gui_main_loop(nil, nil, 0); } exit_cb(ulong handle, string client_data, string call_data) { exit(0); } Differences in this program are: #include This is for the declaration of exit(). { R_BUTTON, ST_WHITE, ST_BLUE, "Hello, World", nil, "exit_cb" }, Now, instead of an R_LABEL, this is an R_BUTTON. The "r_label" member remains the same but the "r_callback" member now has the value "exit_cb" which is the name of the function declared after "main". When this button is pressed and released, the "exit_cb" function will be called. exit_cb(ulong handle, string client_data, string call_data) { exit(0); } This is the exit callback for the button. Note the declaration of parameters standard to all callbacks. They are not used, but are declared anyway. When this callback is called, the program exits. Getting and Putting Objects and Sub-Objects. The next step is defining the functions used for getting and putting objects within a GUI and how to add sub-objects to groups. The function for getting an object from a GUI is "gui_get_object". ulong gui_get_object(ulong handle, int index); In this function, the parameter "handle" is an opaque handle representing an object that is a group type object. This can be the handle returned from "gui_create_frame" or the value returned from another call to "gui_get_object" when the object obtained is a group type object. The index value is the subscript for the upper level object that represents the sub-object of interest. Once the opaque handle for the group object has been obtained, placing sub-objects into the group can proceed. This is accomplished with the "gui_add_group" function. gui_add_group(ulong handle, resource_t subobjects[]); The "handle" parameter is an opaque handle representing an object that is a group type object. Typically, this is the result of a call to "gui_get_object". the "subobjects" parameter is an array of structures defining the sub-objects that will be in the group. The difference between arrays of objects at the top-most level and arrays of sub-objects is that the top-level array needs a R_HFRAME or R_VFRAME as the first element of the array. The sub-objects array does not need this. It simply enumerates a list of sub-objects to be added to the parent object. The R_END object is used, however, as the terminating member for the array. An Example Program Using Sub-objects. This example program shows the use of group type objects and sub-objects. A menu bar with option buttons is a good example. #include #include #include #include /* a vertically oriented frame with just a menu bar */ resource_t gui[3] = { { R_VFRAME }, { R_MENUBAR, ST_WHITE, ST_BLUE }, { R_END } }; #define MENU_BAR_I 1 /* index of menu bar object in "gui" */ /* three menu bar options, ending with the R_END terminator */ resource_t menu_bar[4] = { { R_OPTION, ST_WHITE, ST_BLUE, "Start", nil, "start_cb" }, { R_OPTION, ST_WHITE, ST_BLUE, "Stop", nil, "stop_cb" }, { R_OPTION, ST_WHITE, ST_BLUE, "Exit", nil, "exit_cb" }, { R_END } }; main(int argc, string argv[]) { ulong top_handle; ulong menubar_handle; /* initialize the application */ top_handle = gui_create_frame(argc, argv, gui); /* get the handle to the menubar group object */ menubar_handle = gui_get_object(top_handle, MENU_BAR_I); /* add a group of options to the menubar */ gui_add_group(menubar_handle, menu_bar); /* go */ gui_main_loop(nil, nil, 0); } start_cb(ulong handle, string client_data, string call_data) { puts("Start"); } stop_cb(ulong handle, string client_data, string call_data) { puts("Stop"); } exit_cb(ulong handle, string client_data, string call_data) { exit(0); } Updating Objects and Sub-objects. After the objects for the GUI have been built, it is often desirable to change the attributes of the object. For instance, changing the colors or the text contained in an object. Updating objects and sub-objects can take place one at a time or in groups, much the way the GUI was built. The functions for updating objects are: gui_update_object(ulong handle, resource_t value); This is used for updating a single object such as a button. The handle to the object is obtained by using "gui_get_object" and used as the "handle" parameter to "gui_update_object". The "value" parameter is the structure containing the updated values to use in the object. gui_update_group(ulong handle, resource_t subobjects[]); This function is used to update a group of objects. When sub-objects are added to a parent object the handle to the parent is obtained with the "gui_get_object" function and then the sub-objects are added with the "gui_add_group" function. Updating many sub-objects at once is performed the same way. The "handle" parameter is a handle to the parent object and the "subobjects" parameter is an array of objects that have been modified and need to be put in sync with the internal representations held by the GUI library. This program will change the button from blue to green and change the text appropriately when pressed and released. #include #include #include resource_t gui[3] = { /* type fg bg label data cb */ { R_VFRAME }, { R_BUTTON, ST_WHITE, ST_BLUE, "Blue", nil, "change_cb" }, { R_END } }; #define BUTTON_I 1 main(int argc, string argv[]) { gui_create_frame(argc, argv, gui); gui_main_loop(nil, nil, 0); } change_cb(ulong handle, string client_data, string call_data) { switch(gui[BUTTON_I].r_background) { case ST_BLUE: gui[BUTTON_I].r_background = ST_GREEN; gui[BUTTON_I].r_foreground = ST_BLACK; gui[BUTTON_I].r_label = "Green"; break; case ST_GREEN: gui[BUTTON_I].r_background = ST_BLUE; gui[BUTTON_I].r_foreground = ST_WHITE; gui[BUTTON_I].r_label = "Blue"; break; } gui_update_object(handle, gui[BUTTON_I]); } Building Additional Frames. GUI applications often need to use a "popup" to display information or to select something from a list. The "gui_create_frame" function is used to initialize the system and create the top-most level of the application. The function used to create additional frames is "gui_create_subframe". ulong gui_create_subframe(string title, resource_t objects[]); Since the system has already been initialized, there is no need for the "argc" and "argv" parameter that "gui_create_frame" uses. Instead, the "title" parameter specifies what should be placed on the title bar of the popup sub-frame. The "objects" parameter is the same insofar as it specifies the structure of the sub-frame. Once the sub-frame is created, it needs to be "popped up" and "popped down". These are accomplished by "gui_popup_subframe" and "gui_popdown_subframe" respectively. gui_popup_subframe(ulong handle); gui_popdown_subframe(ulong handle); The "handle" parameter to these two functions is the opaque handle returned by the "gui_create_subframe" call. A common error is to specify a callback function for a button contained on a sub-frame and then use the "handle" parameter of the callback function in the call to "gui_popdown_subframe". The "handle" parameter is the opaque handle to the button that was pressed, not the sub-frame. In order to get the handle to the frame that was popped up, the "gui_get_frame" function is used. ulong gui_get_frame(ulong handle); This function will search upwards looking for the frame that the button is contained within. That handle will be the handle to the sub-frame. That value can then be used to pop down the sub-frame. Here is a simple example. #include #include #include resource_t gui[3] = { /* type fg bg label data cb */ { R_VFRAME }, { R_BUTTON, ST_WHITE, ST_BLUE, "PopUp", nil, "popup_cb" }, { R_END } }; main(int argc, string argv[]) { gui_create_frame(argc, argv, gui); gui_main_loop(nil, nil, 0); } popup_cb(ulong handle, string client_data, string call_data) { resource_t popup[3] = { /* type fg bg label data cb */ { R_VFRAME }, { R_BUTTON, ST_WHITE, ST_BLUE, "PopDown", nil, "popdown_cb" }, { R_END } }; ulong popup_handle; /* since local vars are static in SymbEL, this will be done only once */ if (popup_handle == 0) { popup_handle = gui_create_subframe("POP!", popup); } /* the sub-frame is created. Pop it up. */ gui_popup_subframe(popup_handle); } popdown_cb(ulong handle, string client_data, string call_data) { /* The handle is to the button. Get the handle to the sub-frame */ ulong popup_handle = gui_get_frame(handle); /* pop it down */ gui_popdown_subframe(popup_handle); } Using Dialog Boxes. Motif provides pre-built dialog boxes which display information and errors in a popup. The GUI library provides convenience functions for popping up these dialog boxes. The functions are: gui_warning_dialog(string format, ...); This is meant to provide the user with a warning. The user is presented with one button labeled "OK". The dialog can be dismissed by pressing and releasing this button and the application can go on its way. gui_fatal_dialog(string format, ...); This is a more severe problem. The user is presented with a dialog with one button labeled "EXIT". When this button is pressed and released, the application will exit. gui_info_dialog(string format, ...); This is meant to provide the user with an informational message. The user is presented with one button labeled "OK". The dialog can be dismissed by pressing and releasing this button and the application can go on its way. The difference between this and the warning dialog is that the symbol presented in the dialog is a lower case "i" instead of an exclamation point. gui_yes_or_no_dialog(string callback, string callback_data, string format, ...); This dialog allows the user to select a yes or no answer. The dialog contains two buttons labeled "Yes" and "No". When either of these is pressed and released the function specified by "callback" is called with "callback_data" sent in the "client_data" parameter. Data sent in the the "call_data" parameter of the callback will be one of two values: ANS_YES This is the string "yes", meaning the "Yes" button was selected. ANS_NO This is the string "no", meaning the "No" button was selected. The callback function takes the standard parameters of all callback functions as described in the section on the declaration of callback functions. Object Support Functions. Certain objects require additional support functions for their operation. The usefulness of others is improved by the addition of support functions. Those objects that have support functions and the declaration and description of those functions follows. R_TEXT R_EDITOR gui_append_text(ulong handle, string text); Append the text specified in "text" to the object referred to by "handle". The output window will be adjusted so the end of the text is viewable. gui_clear_text(ulong handle); Clear the text from the object referred to by "handle". This will result in the window containing no text. gui_set_text(ulong handle, string text); Set the text for the object referred to by "handle" to the text specified by "text". The output window will be adjusted so the beginning of the text is viewable. gui_get_text(ulong handle, string buf, int buf_size); Retrieve the current contents of the object referred to by "handle" and place the results in "buf" but no more than "buf_size" bytes. gui_load_text_file(ulong handle, string file_name); Load "file_name" into the object referred to by "handle". The output window will be adjusted so the beginning of the text is viewable. gui_save_text_file(ulong handle, string file_name); Save the current contents of the object referred to by "handle" in the file "file_name". R_SELBOX gui_add_list_items(ulong handle, string items[], int nitems); Add a list of items to the selection box referred to by "handle". The list is sent in "items" and "nitems" is the number of items in the list. Icon and Bitmap Support. Support functions have been added to the GUI library that facilitate the creation of bitmaps for use as icons. It is also possible to make the icon blink. The functions for accomplishing this are: ulong gui_load_bitmap(string file_name, int foreground, int background); Load the bitmap specified by "file_name" using the specified foreground and background colors. Currently, only black and white can be used for icon colors. This will likely change. gui_set_icon(ulong icon, ulong icon_mask); Set the application icon to the bitmap specified by "icon". If there is an icon mask, this is specified by "icon_mask". Otherwise, "icon_mask" should be 0. gui_blink_icon(ulong blink_icon, ulong blink_mask, int on_off); Cause the icon to blink or stop blinking depending on whether "on_off" is non-zero or zero, respectively. "blink_icon" is a bitmap that is displayed as the "blinking icon". "blink_mask" is a mask for that icon. The GUI library will alternate the application icon (and mask if specified) with "blink_icon" (and "blink_mask" if specified) once every second. Other Functions. Other support functions for changing the appearance of a GUI are: gui_grey_option(ulong handle, int grey); This function will render an option unselectable. An option can be either on a menu bar, in a cascading menu, or a button. "handle" refers to the handle to the object in question and "grey" is a boolean that specifies whether the option should be "greyed out" or not. gui_add_color(string name, int code); This function allows new colors to be added to a GUI. "name" is the string name of a color, such as "aquamarine". "code" is a unique numeric code that will represent the color. gui_set_medium_font(ulong handle, string font_name); gui_set_bold_font(ulong handle, string font_name); gui_set_text_font(ulong handle, string font_name); These functions change the three fonts that the GUI toolkit uses. The "handle" parameter is a handle to an object retrieved with the "gui_get_object" function. The "font_name" parameter is the name of a valid X11 font. The names of all fonts available can be displayed by using the standard X11 program "xlsfonts". The most widely used font is the medium font. The text font is used in the R_TEXT, R_EDITOR and R_TFIELD objects as well as in the list and text field portions of the R_FSBOX and R_SELBOX objects. The bold font is used for the label or button in an R_LGROUP and R_BGROUP object respectively. Everything else is medium font. Not pertaining to appearance is the function: gui_realize_frame(ulong handle); This function is necessary in order to perform certain tasks before calling "gui_main_loop" or "gui_popup_subframe". These tasks are * setting fonts in objects * creating and setting icons * "greying out" labels, buttons or options "gui_realize_frame" does not cause the GUI to appear on the screen, it simply causes all of the internal X Toolkit code to be called to create the internal data structures that represent the GUI. This example program demonstrates some of these functions. #include #include #include /* codes for my own colors */ #define ST_FIREBRICK ST_USER_COLOR #define ST_GOLDENROD ST_USER_COLOR+1 #define ST_AQUAMARINE ST_USER_COLOR+2 #define ST_YELLOW ST_USER_COLOR+3 #define ST_SLATEBLUE ST_USER_COLOR+4 /* new fonts */ #define NCS_BOLD_I_12 \ "-adobe-new century schoolbook-bold-i-normal--12-120-75-75-p-76-iso8859-1" #define SC_BOLD_R_14 \ "-schumacher-clean-bold-r-normal--14-140-75-75-c-80-iso8859-1" resource_t gui[5] = { /* type fg bg label data callback */ { R_HFRAME }, { R_BUTTON, ST_FIREBRICK, ST_GOLDENROD, "One", nil, "one" }, { R_BUTTON, ST_AQUAMARINE, ST_BLACK, "Two", nil, "two" }, { R_BUTTON, ST_YELLOW, ST_SLATEBLUE, "Exit", nil, "exit_cb" }, { R_END } }; #define ONE_I 1 #define TWO_I 2 ulong uno; ulong due; main(int argc, string argv[]) { ulong frame = gui_create_frame(argc, argv, gui); /* add my own colors */ gui_add_color("firebrick", ST_FIREBRICK); gui_add_color("palegoldenrod", ST_GOLDENROD); gui_add_color("aquamarine", ST_AQUAMARINE); gui_add_color("yellow2", ST_YELLOW); gui_add_color("slateblue", ST_SLATEBLUE); /* grab these for later use */ uno = gui_get_object(frame, ONE_I); due = gui_get_object(frame, TWO_I); /* cause the widgets to be built so I can grey them out */ gui_realize_frame(frame); /* grey out the One button */ gui_grey_option(uno, True); /* set the font for this button */ gui_set_medium_font(uno, NCS_BOLD_I_12); gui_set_medium_font(due, SC_BOLD_R_14); gui_main_loop(nil, nil, 0); } one(ulong handle, string client_data, string call_data) { /* grey "one" and ungrey "two" */ gui_grey_option(uno, True); gui_grey_option(due, False); } two(ulong handle, string client_data, string call_data) { /* grey "two" and ungrey "one" */ gui_grey_option(uno, False); gui_grey_option(due, True); } exit_cb(ulong handle, string client_data, string call_data) { exit(0); } More Examples. To see more examples of how to write a GUI with the SE GUI library, see the programs in the "examples" directory. xit.se is an especially good example since it uses menu bars, popups, file selection boxes, and text utilities. 07070100305757000081a400000000000000010000000141dc5ea300002f2b000000880000000400000000000000000000002100000005reloc/RICHPse/doc/README.INSTALL SE 3.4: Changes since release 3.3.1 ------------------------------------ 09 December 2004 Support for x86 has returned and Solaris 10 support has been added for both platforms. No specific additions for Solaris 10 have been added such as dtrace. The binaries are not as numerous, just se.sparcv9 and se.i386. SE 3.3: Changes since release 3.2.1 ------------------------------------ 10 July 2002 This release is primarily for supporting Solaris 9. Significant, however, is that it no longer supports Solaris 2.6 or any x86 release. Since the remaining systems, Solaris 7 through 9 are all 64 bit OS releases, the only binaries shipped with SE 3.3 are ELF-64 binaries. If you're running your system in 32 bit mode and need ELF-32 binaries, you need to use SE 3.2.1. I fixed a small memory leak that happened when the kstat chain changed state. An instance$ member is now added to all kstat structures that repeat. This is in addition to the existing name$ and number$ members. Adrian added a bigbrother.se script and a workollator script to use the workload_class include file he had written so long ago. Rich SE 3.2.1: Changes since release 3.2 ------------------------------------ 22 August 2001 This is a bug fix release to 3.2. No real big gotchas, just nice cleanups. As usual, download the RICHPse.tar.gz file and as root: # pkgrm RICHPse # gunzip RICHPse.tar.gz # tar xf RICHPse.tar # pkgadd -d . RICHPse If you have made changes to the se_defines file in /opt/RICHPse/etc, make sure you save that file before removing the /opt/RICHPse directory. You otherwise shouldn't be modifying files in /opt/RICHPse. Once installed, as Joe User (in ksh, for instance): $ export PATH=$PATH:/opt/RICHPse/bin $ export SEPATH=/opt/RICHPse/examples:/opt/RICHPse/toptool $ se toptool.se & If you haven't checked out darth.se and vader.se, do so. I fixed some issues with darth for 3.2.1. /opt/RICHPse/etc/init.d/vader init.d script to start vader /opt/RICHPse/examples/vader.se the "Virtual Adrian Daemon" /opt/RICHPse/examples/darth.se the GUI client side of vader darth.se is intended to be a replacement for zoom.se. Rich SE 3.2: Changes since release 3.1 ---------------------------------- 16 February 2001 I'm not going to release a preFCS version. This is it. If you find bugs, let me know and I'll fix them. A 3.2.1 version will be forthcoming shortly thereafter if there are enough bugs. All the packages are now in RICHPse. I'm sick of pkgadd'ing multiple packages. The registration bit is also gone. If you're feeling kind, run the register.se script in the etc directory. The /etc/rc*.d files are no longer installed by pkgadd. If you want them, they're in the etc/*.d directories. The old scripts are there and a new one for vader.se. Toptool, orcallator and perfmon have their own directories at the top level signifying their status as useful applications, not just examples of how to do something. Docs for orcallator can be found at http://www.gps.caltech.edu/~blair/orca. Toptool is self documenting, as is all of my code ;^>. Perfmon has built in help. Just run it by running the perfmon shell script. It's really cool. Thanks, Mark. Many thanks also to Rainer Orth, Faculty of Technology, Bielefeld University for his efforts in making pkgadd work smoother and providing me with diffs for the qe interface on Solaris 8. Other acknowledgements for people who have contributed to the toolkit are in the comments in the code. For a good cross section, see the netif.se include file. Thank you, everyone for your hard work. I know it's not easy to learn new languages and especially ones that restrict you the way SymbEL does. SE has really become a very widespread application with around 5000 installations in 61 countries. Rich SE 3.1: Changes since release 3.0 -------------------------------------- 1 February 99 Make sure you use pkgrm to remove all the old packages and then /bin/rm -fr /opt/RICHPse for sanity. There may be remnants of SE 3.0 patch files hanging around. This release will only support Solaris 2.6 and Solaris 2.7 for SPARC and Intel. If you need a performance product for releases of Solaris older than 2.6, go to http://www.resolute.com. Become familiar with the /opt/RICHPse/etc/se_defines file. It can resolve a lot of the configuration issues that plagued SE 3.0. Rich SE 3.0: Changes since release 2.5.1 -------------------------------------- 3 December 97 You'll no longer be asked about the architecture neutral option since it is no longer optional. It's default. You *will* be asked if you'd like to send e-mail to the se-support alias though. I urge you to do so, it helps validate that the work we're doing is being used by someone important. And this justifies to the management people of the world the rationale for using valuable programming time to work on a fairly large software package that is given away! It's in the install script and only asks you once, and is preferable to just hand-editing an e-mail message since I can just "grep ORGANIZATION MailFile" to find out who all our users are when the paycheck writers put my feet on the fire. Rich SE 2.5: Additions Since release 2.4 ------------------------------------ 10 February 96 1) Binaries included: SPARC Solaris 2.3 Solaris 2.4 Solaris 2.5 (also works on 2.5.1) Solaris 2.4 Intel Solaris 2.5 (hasn't been tested on 2.5.1) 2) When installing, pkgadd will ask: Do you want the scripts to be architecture neutral? What this means is that SE can now be installed on a server machine that serves clients using various releases of Solaris (2.3, 2.4, or 2.5). The scripts will evaluate which SE binary to use and invoke it. If you are installing on such a server machine you should answer "y" to this question. If you are installing SE on a client machine, then answer "n". 3) Addition of the "contrib" directory. These scripts are unsupported by me (you can ask the author to fix something if you like). They are great examples of how to implement performance monitoring/analysis tools in SymbEL. I'm looking for additions to this directory. 4) See the CHANGES file for fixed bugs and minor additions. Richard Pettit README and Installation Instructions for SymbEL release 2.4 ----------------------------------------------------------- 22 May 95 SymbEL (known as SE) is an interpreted language that provides an extensive toolkit for building performance tools and utilities. If you are fed up with the limitations of vmstat, iostat and sar, then this is the tool for you. We provide trivial scripts that are improved versions of the basic utilities and build on them to provide powerful rule based performance monitors and viewers. The extensions package includes a Motif based GUI library and the rules package implements the complete Appendix A ruleset of the bestselling reference book "Sun Performance and Tuning: SPARC and Solaris" by Adrian Cockcroft, SunSoft Press/Prentice Hall. This package is not a Sun supported product. Think of it as a vehicle for documenting the data sources, processing and behavioural rules of Solaris 2. All the real work is done in scripts, so you can fix, maintain and modify the package. If you want to incorporate the scripts in a product you should recode them in C first, so you do not depend on the unsupported SymbEL interpreter. If you want support you should buy one of the many commercial performance management products. If you are writing such a product we want it to do a good job of collecting data and monitoring Solaris 2, so use the information provided here and give us some credit for our efforts. Adrian Cockcroft Rich Pettit Installation ------------ There are three packages provided, they are: RICHPse The SymbEL Interpreter RICHPsex The SE eXtensions Package ANCrules Adrian's Rules & Tools All packages contain support for installation on four OS/hardware combinations, there are four binaries of the interpreter provided as part of RICHPse that are selected automatically during install: Solaris 2.3 on SPARC Solaris 2.4 on SPARC Solaris 2.4 on Intel x86 Solaris 2.5beta on SPARC This stuff will never work on SunOS 4/Solaris 1, so don't ask! The Intel release doesn't get tested very much, but the SPARC release is regularly used on everything from a SPARCstation IPX, a 16MB SPARCstation Voyager, a dual CPU SPARCstation 20, SPARCserver 1000, and a 20CPU, 1.5GB RAM, SPARCcenter 2000 database server. It should work on any sun4c, sun4m and sun4d kernel architecture systems. You may find that the code is provided as compressed tar files, first uncompress to create the spooled package directories: # zcat RICHPse.tar.Z | tar xf - # zcat RICHPsex.tar.Z | tar xf - # zcat ANCrules.tar.Z | tar xf - Then install the packages with pkgadd, the postinstall scripts setup some machine dependent limits so its best to install individually on every machine you want, you need 2MB in /opt to install all three packages, you could save 700KB by deleting the three interpreter binaries you don't need after install if space is tight. The packages must be installed in this order, as there are dependencies. # pkgadd -d . RICHPse RICHPsex ANCrules At the end of ANCrules installation you are asked if you want to install startups in /etc/rc2.d. The first time you try this out you should probably say no. You can then try out the scripts by hand as a regular user to build up confidence in them then try them as root. If all seems well, enable the auto-startup next time you pkgadd ANCrules on a system. ------------------------------------------------------------------------------ Special installation instructions. This package includes three scripts that can be started automatically at boot time from files in /etc/rc2.d. These scripts all use the same basic rules but have different outputs and update rates. virtual_adrian does much more than use the basic rules, it checks and tunes your system before it starts, then monitors every 30 seconds, with output sent to the console as messages in the form of modified vmstat, iostat nfsstat or netstat output. Its most useful for detailed diagnosis, and its output is also logged to /var/adm/sa/monitor.log monlog runs the basic rules and looks for state changes, these are entered into syslog, so can be redirected to the loghost system. It runs every 120 seconds and just logs the state and action string. mon_cm runs the basic rules and logs the state codes only into the local root calendar. You must run /usr/openwin/bin/cm as root to create the root@nodename calendar before entries will appear. It runs every 15 minutes and the output can be browsed with cm, and multiple systems can be multibrowsed to see correlated activity. ------------------------------------------------------------------------------ The reason there are three packages is that we hope that the base level RICHPse package will remain stable for longer periods than the RICHPsex and ANCrules packages. Updated rules and extensions may become available relatively more often. The whole thing can be removed cleanly by removing the packages in reverse order. The preremove script kills any monitors via the /etc/init.d files before removing the package. # pkgrm ANCrules RICHPsex RICHPse You can check the version you have installed and who to send neat bits of code to with pkginfo: As of May 22 1995 the web pages at http://www.sun.com/smi/performance are not yet installed. By the time you read this you may get lucky. Please look there for updates and general FAQ before mailing us directly with questions. If you just want to say how much you like it, then send us mail, contribute rules and scripts, and pass it on. 07070100305758000081a400000000000000010000000141dc5ea300001883000000880000000400000000000000000000002100000005reloc/RICHPse/doc/README.RELEASE Release Notes for Version 3.4 of the SymbEL Language Richard Pettit 09 December 2004 What was old is new again. Support for the x86 platform has been restored. Solaris 10 is now supported for both sparc and x86 platforms. The sparc platform is 64 bit only and the x86 platform is 32 bit only. The binary names have changed to se.sparcv9 and se.i386. No longer will there be a separate binary for each release of Solaris. Release Notes for Version 3.3 of the SymbEL Language Richard Pettit 10 July 2002 There are no significant changes to note for this release other than the loss of support for old releases (Solaris 2.6) and removal of x86 support. Reread the notes for the 3.2 release for issues regarding permission to read /dev/ip and /dev/kmem. Release Notes for Version 3.2.1 of the SymbEL Language Richard Pettit 22 August 2001 Check the 3.2 notes for the most interesting stuff. I've fixed the diskinfo.se include file to translate StorEdge volumes into charlie target notation. Note that this requires access to the /dev/osa directory which may not be accessible for non-root users. If this is the case, then when you run scripts that try to translate these volumes as Joe User, they won't translate. They need to be run as root. If you have vader started automatically when the system boots, then it shouldn't be a problem with darth.se. Otherwise, make yourself root or change the permissions of the directories in /dev/osa. Release Notes for Version 3.2 of the SymbEL Language Richard Pettit 16 February 2001 Many changes have occurred in Solaris over the years and it's made quite a puzzle for SE. The most problematic are the permissions of the network pseudo-devices in /dev. The permissions change, how they work changes, etc. By default, the SE binaries will be installed with a group id of sys. When you run the applications, you'll see that some things don't work. Reading mib variables, especially. The simple fix to this is: # cd /opt/RICHPse/bin # chgrp sys se.*.5.* # chmod g+s se.*.5.* This will make the binaries setegid sys. It will allow reading of any file that has the read bit set and whose group ownership is sys. THIS MUST BE THE DECISION OF THE SYSADMIN. IF YOU DON'T WANT PROGRAMS HANGING AROUND YOUR SYSTEM THAT ARE SETEGID SYS, DON'T DO THIS! The effect of not doing this is that mib variables will not be readable. There is no other good work-around. If you look at /bin/netstat, you'll see that it's setegid sys. That's how it does it, that's how the SE binaries must do it. Release Notes for Version 3.0 of the SymbEL Language Richard Pettit 3 December 97 The architecture neutral installation mechanism didn't live long, thankfully, but the feature is still in place. The "se" program is no longer a symbolic link, but a shell script that encapsulates the architecture resolution and execs the appropriate binary. There are many changes to the include files and the interpreter, so if you have some old stuff lying around that you wrote, don't be surprised if it doesn't work. The changes to a script to make it work with 3.0 won't be major, just leg-work. The etc directory contains a lisp file for SymbEL mode in Emacs (thanks to Rajesh Godbole ). I don't use emacs so I can't attest to how it works. -rw-r--r-- 1 root other 69615 Dec 2 15:41 ANCrules.tar.gz -rw-r--r-- 1 root other 7486 Dec 3 17:28 README.INSTALL -rw-r--r-- 1 root other 3731 Dec 3 17:30 README.RELEASE -rw-r--r-- 1 root other 612166 Dec 2 16:20 RICHPse.tar.gz -rw-r--r-- 1 root other 111193 Dec 2 15:44 RICHPsex.tar.gz ------------------------------------------------------------------------------- Release Notes for Version 2.5 of the SymbEL Language Richard Pettit 2 April 96 I've released a teeny-tiny version (2.5.0.1) to fix a problem with fddi interfaces and to clean up the Solaris 2.5.1 version (there are now two extra binaries for SPARC and Intel). -rw-rw-rw- 1 richp staff 809634 Apr 2 14:43 RICHPse.tar.Z Richard Pettit 10 February 96 This release has some additions and fixes but nothing major. Work-arounds for bugs in the 2.4 release are no longer necessary as these bugs have been repaired. The binaries supplied in this release are: SPARC Solaris 2.3 Solaris 2.4 Solaris 2.5 x86 Solaris 2.4 Solaris 2.5 I don't have a PowerPC machine at home yet so the binary for Solaris 2.5.1 PowerPC must wait. -rw-r--r-- 1 root other 104785 Feb 10 12:12 ANCrules.tar.Z -rw-r--r-- 1 root other 8560 Feb 10 12:12 README.INSTALL -rw-r--r-- 1 root other 2257 Feb 10 12:12 README.RELEASE -rw-r--r-- 1 root other 659971 Feb 10 12:12 RICHPse.tar.Z -rw-r--r-- 1 root other 131861 Feb 10 12:12 RICHPsex.tar.Z ------------------------------------------------------------------------------- Release Notes for Version 2.4 of the SymbEL Language Adrian Cockcroft 12 June 95 After testing and fixing several bugs, this is the version that can be provided to customers. It will be included on a CD of free tools that DevPro is producing, and we are working on a place for it to live on the internet. -rw-r--r-- 1 root other 88049 Jun 12 14:33 ANCrules.tar.Z -rw-r--r-- 1 root other 7418 Jun 2 18:36 README.INSTALL -rw-r--r-- 1 root other 530072 Jun 9 13:07 RICHPse.tar.Z -rw-r--r-- 1 root other 124405 Jun 9 13:07 RICHPsex.tar.Z Some of the bugs fixed after internal early access release: RICHPse: Possible kvm_read warnings with nfs mount points and virtual_adrian.se language bug in class definition code (found by inspection) ANCrules: bug in kvm pure rule caused black state to persist rather than amber bug in mon_cm caused black kvm rule state to be unreported bug in zoom CPU popup not showing data for CPU2 when CPU1 is not there various documentation errors and omissions Unfixed bug: More than 10 disk controllers causes inst_to_path_class to fail workaround diff for RICHPse/include/inst_to_path_class.se line 189 < tmp[6] = '\0'; --- > if (strlen(tmp) >= 9 ) { > tmp[7] = '\0'; > } > else { > tmp[6] = '\0'; > } 07070100305759000081a400000000000000010000000141dc5ea300000014000000880000000400000000000000000000002100000005reloc/RICHPse/doc/REPORTING.BUGSYou're on your own. 0707010030575a000081a400000000000000010000000141dc5ea300017795000000880000000400000000000000000000001f00000005reloc/RICHPse/doc/USERS.MANUALThe SymbEL Language Reference Manual Introduction Tuning and Performance 0.1 Kvm 0.2 Kstat 0.3 Mib 0.4 Ndd 0.5 Summary Chapter 1 Basic Structure 1.1 First Program 1.2 Simple Types 1.3 Simple Program 1.3.1 About the Program 1.3.2 Embellishing the Program 1.3.3 About the Program 1.4 Array Types 1.4.1 A Program Using Arrays 1.4.2 About the Program 1.5 Functions and Parameters 1.5.1 A Program Using Functions and Parameters 1.5.2 About the Program 1.6 Global Variables Chapter 2 Operators and Expressions 2.1 Variable Names 2.2 Constants 2.2.1 Integer 2.2.2 Floating Point 2.2.3 Character 2.2.4 String 2.3 Declarations 2.4 Arithmetic Operators 2.5 Logical Operators 2.6 Bitwise Operators 2.7 Increment and Decrement Operators 2.8 Compressed Assignment Operators 2.9 Address Operator 2.10 Type Casting Chapter 3 Control Flow 3.1 Blocks 3.2 If-Then-Else Statement 3.3 Conditional Expression 3.4 Switch Statement 3.5 Loops 3.5.1 While Loop 3.5.2 For Loop 3.5.3 Do Loop 3.6 Break 3.7 Continue 3.8 Goto Chapter 4 Functions, Procedures and Notes on Programming 4.1 Function Return Types 4.2 Scope 4.3 Initializing Variables 4.4 Notes About Arrays and Strings 4.4.1 Array Assignment 4.4.2 String Type and Character Arrays 4.4.3 Assignment to String Variables 4.4.4 Empty Arrays 4.5 Recursion 4.6 Builtin Functions 4.7 Dynamic Constants 4.8 Attachable Functions 4.8.1 Ellipsis Parameter 4.8.2 Attached Variables 4.9 Builtin Variables 4.10 Parameters to "main" and its Return Value Chapter 5 Structures 5.1 Accessing Structure Members 5.2 Arrays of Structures 5.3 Structure Assignment 5.4 Structure Comparison 5.5 Structures as Parameters 5.6 Structures as Return Values of Functions Chapter 6 Language Classes 6.1 The kvm Language Class 6.2 The kstat Language Class 6.2.1 Multiple Instances 6.2.2 Other Points About kstat 6.2.3 Example kstat Program 6.2.4 About the Program 6.2.5 Runtime Declaration of kstat Structures 6.2.6 Adding New Disk Names 6.3 The mib Language Class 6.4 The ndd Language Class Chapter 7 User Defined Classes 7.1 The refresh$ Builtin Chapter 8 Pitfalls Chapter 9 Tricks 9.1 Returning an Array of Non-Structured Type from a Function 9.2 Using Attached Functions Return Values 9.3 Using kvm Variables and Functions 9.4 Using an "attach" Block to call Interpreter Functions Preface SymbEL is an interpretive language based on C that was created to address the need for simplified access to data residing in the SunOS kernel. Although kernel interface API libraries have made this data more available to C application programmers they are still out of reach by means other than writing and compiling a program. The goal was to create a language that did not need compilation to run and would allow the development of scripts that could be distributed to a large audience via e-mail without sending very large files or requiring the end-user to possess a compiler. The control and data structures of SymbEL are extensive enough to write a complex program, but the language is not burdened with superfluous syntax and the resulting grammar is far more compact than C. The original interpreter, "se" was developed under SunOS 5.2 FCS-C and tested on an MP690, SC1000 and an LC. Since then, it has been modified and tested on every subsequent release of SunOS. The latest release is SunOS 5.8, a.k.a. Solaris 8. The SPARC and Intel platforms are supported and every effort has been made to support new devices and configurations for each of these hardware platforms. The "se" interpreter does not now, nor will it ever, run under any release of SunOS 4.x. This manual is written with the assumption that the reader is conversant in the C programming language. Expertise is not necessary, but the reader should be comfortable with C to best understand this document. 0.0 Tuning and Performance Operating system performance is one of the most painful areas of system administration. This is because it seems to involve so much magic. In fact, gaining proficiency in performance tuning is much like any other endeavor. Time and experience are the best teachers. Yet for all that is known about tuning, the need to tune systems becomes a more desperate one due to the lack of adequate tuning tools. This lack of tools is present because of the rapid advances in machine architecture and operating system design. And as the underlying technology continues to expand, the existing tools for performance tuning become insufficient to solve the problem. SunOS provides an excellent starting place for the development of tools for tuning. The existing tools shipped with SunOS provide a wealth of data regarding the workings of the kernel in its management of the process spaces and of the underlying hardware. It is from the examination of this data that the decisions on how to tune the system are made. Traditionally, examination of this data is a manual process, typing in commands and examining the output and making decisions based on some preset rules. This is a time consuming and tedious process, especially when trying to talk another person through it over the telephone or explaining the procedure via e-mail. It also leaves the information about how to make decisions regarding system performance where it does the least good. In someone's memory. In an attempt to translate this expertise from memory to written form, C, Bourne, or Korn shell scripts could be written to run these commands and extract the output and compare them to known threshold values. This serves the purpose of making the expertise more portable and thus more accessible by the masses. It also impacts the performance of the machine under analysis enough to render the script useless as a "round the clock" diagnostician. Access to the data is needed without the overhead of the multiple applications and the shell language. The first step towards the solution to this problem is to determine how the applications themselves retrieve the data from the kernel. An application programming interface (API) can then be built that performs the same actions as these applications. These APIs could extract their data from any of these sources on SunOS 5.x. * kvm - Kernel Virtual Memory * kstat - Kernel STATistics * mib - Management Information Base * ndd - Network Device Driver * procfs - The Process File System 0.1 Kvm The kvm library is an API for reading the values of kernel variables from the kernel memory. Before the kvm library, this was all done manually using open(), lseek(), and read(). The code for reading values from the kernel is repetitive, so the kvm library was developed. It solved this problem and provided additional functionality for reading core files and checking the validity of the addresses being read. The kvm library functions that perform the work are kvm_open(), kvm_nlist(), kvm_read(), kvm_write(), and kvm_close(). 0.2 Kstat A limitation of the kvm library is that the program reading values from kernel memory must have super-user permission since /dev/kmem is not readable by the world. A solution developed by Sun is the addition of a kernel framework that is accessible for read only access by the world and write access by the privileged user. This framework is called the kstat framework. Kstat also has the benefit of having low overhead and being extensible to accommodate any new kernel statistics that may be useful on future architectures. The kstat interface, /dev/kstat is an entry point into the kstat driver which resides in the kernel and collects data from predefined functional areas within various subsystems and drivers. In addition to collecting data from drivers, data is also collected from the I/O and VM subsystems, the HAT layer, and various information about network interfaces and CPU activity. The software interface to /dev/kstat is the kstat library, libkstat. It contains functions for opening and reading the kstat data from the kstat driver and for the super-user, writing data back to the kernel. When the kstat data is copied out of the kernel, it is put into a linked list of structures. Each node in the list is a structure which contains data about a particular functional area and what format the data is in. The possible data formats are KSTAT_TYPE_RAW The data is a pointer to a structure, commonly defined in a /usr/include/sys include file. KSTAT_TYPE_NAMED The data is an array of structures which represent a polymorphic type. Each structure contains a textual name, a type designation and a union of members of the supported types. The supported types are KSTAT_DATA_CHAR 8 bits signed or unsigned KSTAT_DATA_INT32 32 bits signed KSTAT_DATA_UINT32 32 bits unsigned KSTAT_DATA_INT64 64 bits signed KSTAT_DATA_UINT64 64 bits unsigned KSTAT_TYPE_INTR The data is a pointer to a structure containing an array of unsigned long values whose indices represent the type of interrupt. The types of interrupts and their index values are KSTAT_INTR_HARD=0 From the device itself KSTAT_INTR_SOFT=1 From the system software KSTAT_INTR_WATCHDOG=2 Timer expiration KSTAT_INTR_SPURIOUS=3 Entry point called with no interrupt pending KSTAT_INTR_MULTSVC=4 Interrupt serviced prior to return from other interrupt service KSTAT_TYPE_IO The data is a pointer to a structure containing information relevant to I/O. KSTAT_TYPE_TIMER The data is a pointer to a structure containing timing information for any type of event. The structures used by the kstat library are defined in /usr/include/kstat.h and /usr/include/sys/kstat.h. Note that the kstat framework is constantly evolving, and developing code around it is precarious as the mechanism may grow, shrink, or change at any time. 0.3 Mib The management information base is a set of structures containing data relative to the state of the networking subsystem of the kernel. The nature, structure, and representation of this data is based on RFC 1213, "Management Information Base for Network Management of TCP/IP-based internets: MIB-II". Specifically, there is data stored regarding the performance of the kernel drivers for IP, TCP, UDP, ICMP, and IGMP. This data is contained in one structure for each driver. The data can be retrieved by building a stream containing the drivers whose MIB data is to be read and sending a control message down stream and reading the results sent back by all modules in the stream that interpreted the message and responded. The structures are also declared as variables in the kernel address space and therefore can be read using conventional kvm methods. 0.4 Ndd The NDD interface is another source of data regarding the state of the networking subsystem. Whereas the MIB is a source of data that is statistical in nature, the NDD interface allows for tuning of driver variables that control the function of the driver. The NDD interface can access variables kept by the IP, TCP, UDP, ICMP, and ARP drivers. Whereas the interface to the MIB structures is through the streams control message interface, retrieval of NDD variables is through a much simpler ioctl() mechanism. The structures kept by the drivers are also accessible through the kvm interface but are rather convoluted and therefore are most easily modified by use of the NDD interface. 0.5 Summary From these sources comes a great deal of data to manage in an application when the mechanisms used to retrieve it are the conventional APIs. It is possible to distill this information into library calls so that the information is more generalized. The next step beyond that would be to develop a syntactic notation for accessing the data, a language whose most significant feature is the retrieval of the necessary data from the appropriate places without the notational overhead of actually performing the read. What follows is the description of a language that was designed to remove the complication of accessing these values and provide a framework for building applications that can make use of these values. This language is called SymbEL, the Symbol Engine Language. 1.0 Basic Structure In response to the need for simplified access to data contained inside the SunOS kernel, the SymbEL (pronounced "symbol") language was created and the SymbEL interpreter, "se", was developed. SymbEL resembles C visually and contains many similar syntactic structures. This was done for ease of use and to leverage existing programming knowledge. 1.1 First Program Since the best way to learn a new language is through example, the first example SymbEL program is presented. main() { printf("hello, world\n"); } This program shows that the language structure is very similar to C. This does not imply that you can pick up a book on C and start writing SymbEL programs. There are a lot of differences and the interpreter will let you know if the syntax is incorrect. This short program demonstrates some of the similarities and differences in the language. First, a SymbEL program MUST have a function called "main". This is the similarity. But then, the printf() function in SymbEL is a builtin, not a library call. To test this small program, put it in a file called hello.se and enter se hello.se and the resulting output is what you expect. The format string used in printf() works the same as any equivalent statement that could be used in a C program. Syntax of the printf() format string will not be addressed in this document. Additional information can be found in the printf() man page or any good book on the C language. 1.2 Simple Types The simple types available in SymbEL are scalar, floating point, and string. They are Scalar char 8 bit signed integer uchar uchar_t 8 bit unsigned integer short 16 bit signed integer ushort ushort_t 16 bit unsigned integer int32_t int 32 bit signed integer uint32_t uint uint_t 32 bit unsigned integer long 32/64 bit signed integer ulong ulong_t pointer_t 32/64 bit unsigned integer int64_t longlong longlong_t 64 bit signed integer uint64_t ulonglong u_longlong_t 64 bit unsigned integer Floating Point double double precision floating point String string pointer to null terminated ASCII text The "long" and "ulong" types can be either 32 or 64 bits in size depending on whether you are using the 32 or 64 bit version of the interpreter respectively. On Solaris 7 and later, if the kernel is running in 64 bit mode, the 64 bit interpreter will be used by default. There are also structured types that will be covered in Chapter 5. There are no pointer types in SymbEL. 1.3 Simple Program The following program demonstrates some of the features of the language. It has nothing to do with extracting data from the kernel but serves the purpose. /* print the times table for 5 */ main() { // C++ style comments are also allowed int lower; int upper; lower = 1; // lower limit upper = 10; // upper limit while(lower <= upper) { printf("%4d\n", lower * 5); lower = lower + 1; } } 1.3.1 About the Program lower = 1; // lower limit Since "se" uses the C preprocessor to read the programs, the use of C and C++ style comments and "pound sign directives" such as #define and #include are valid. while(lower <= upper) { The "while" structure is one of the control structures supported by SymbEL. This example requires curly braces around the two statements inside the block of the while loop. However, the syntax of SymbEL requires all sequences of statements inside control structures to be bracketed by curly braces, even sequences of just one statement. The purpose for this is cleanliness of the grammar. printf("%4d\n", lower * 5); The function printf() is a builtin function. Builtin functions are used for library functions that cannot be implemented as attached functions or represent a functionality that is specific to the interpreter. Attached functions will be discussed in Chapter 4. lower = lower + 1; This is simply an incrementing of lower by one. 1.3.2 Embellishing the Program The program will now be rewritten using different constructs and techniques. #define LOWER 1 #define UPPER 10 #define DIGIT 5 main() { int lower; int upper = UPPER; for(lower = LOWER; lower <= upper; lower = lower + 1) { printf("%4d\n", lower * DIGIT); } } 1.3.3 About the Program #define LOWER 1 As pointed out before, the use of "pound sign directives" is valid since the interpreter reads the program through the C preprocessor. int upper = UPPER; Variables can be initialized to an expression. The expression can be another variable, a constant, or an arithmetic expression. Assignment of the result of a logical expression is not allowed. for(lower = LOWER; lower <= UPPER; lower = lower + 1) { printf("%4d\n", lower * DIGIT); } The syntax of the "for" loop in SymbEL is virtually identical to the "C" equivalent. The specifics of the "for" syntax is covered in Chapter 3. 1.4 Array Types SymbEL supports single dimension arrays. Subscripts for array types start at zero as is the case in "C". The next example is a new version of the previous example using arrays. 1.4.1 A Program Using Arrays #define LOWER 1 #define UPPER 10 #define DIGIT 5 main() { int value[UPPER + 1]; int i; for(i = LOWER; i <= UPPER; i++) { value[i] = i * DIGIT; } for(i = LOWER; i <= UPPER; i++) { printf("%4d\n", value[i]); } } 1.4.2 About the Program int value[UPPER + 1]; for(i = LOWER; i <= UPPER; i++) { The size of the array is declared as UPPER + 1. You can use expressions as the size of an array in its declaration provided that it is an integral constant expression. That is, it can't contain other variables or function calls. The size of the array must be UPPER + 1 since the for loop uses the (i <= UPPER) condition for terminating the loop. If the array were declared with a size of UPPER, "se" would abort with a "subscript out of range" error during the execution. Also, instead of using the "i = i + 1" notation, the increment notation is used. Prefix and postfix increment and decrement are supported by SymbEL. 1.5 Functions and Parameters So far, only one function has been shown in the examples, "main" with no return type. If there is no return type declared on a function, returning values will result in an error from the parser. A function can be declared as returning a type and the function can then return a value of that type. As an example, here is a function to raise a value to a power. 1.5.1 A Program Using Functions and Parameters #define BASE 2 int64_t power(int b, int p) // raise base b to power p { int64_t i; int64_t n; for(n = 1, i=1; i<=p; n *= b, i++) { ; } return n; } main() { int i; for(i=0; i<=32; i++) { printf("%d raised to power %d = %lld\n", BASE, i, power(BASE, i)); } } 1.5.2 About the Program int64_t power(int b, int p) /* raise base b to power p */ This is the declaration of a function returning a signed 64 bit integer and taking as parameters two integers. All parameters to SymbEL functions are value parameters and have the syntax of ANSI C parameters. As in local declarations, each parameter must be declared separately. The syntax does not support comma separated lists of parameters. Parameters are treated as local variables and have all of the semantic constraints of local variables. In this example, the power() function is declared before main. This allows the parser to obtain type information about the function's return value so that type checking can be done on the parameters to printf(). int64_t i; int64_t n; for(n = 1, i=1; i<=p; n *= b, i++) { It is important to point out a semantic feature of local variables that this code demonstrates. In C, the assignment of n could be made part of the declaration. Although SymbEL supports the initialization of local variables, the semantics of local variables are equivalent to a "static" declaration in a C program. That is, the initialization of the local variable is done only once upon entry to the function for the first time. It is not performed on every call. The rationale for this is that the overhead of maintaining automatic variables in an interpretive environment would be too high for the language to perform reasonably. One of the goals of "se" is put as little load on the system as possible and still provide usable runtime performance. for(n = 1, i=1; i<=p; n *= b, i++) { ; } The "for" loop is like the one shown in the previous example, however, the statement in the do-after part of the loop shows that SymbEL supports the compressed arithmetic assignment operators. These work just as the "C" counterparts and are supported for the operations add, subtract, multiply, divide, and modulus. printf("%d raised to power %d = %lld\n", BASE, i, power(BASE, i)); Here, the call to power() is part of the parameter list for printf(). The printf() format strings conform to the types being sent, including the "%lld" for the 64 bit integer. The order of evaluation of actual parameters is from left to right. 1.6 Global Variables The language also supports global variables. These act in the same way as globals in "C". They are declared outside of the block of a function and can be accesses by any function in the program. Global variables can have initial values just as local variables and will be initialized before the function "main" is called. 2.0 Operators and Expressions In order to better understand what operators are available in SymbEL and how expressions are constructed, an overview of the constituent parts will now be presented. 2.1 Variable Names Variable names are limited to 1024 characters and may begin with any alphabetic character or an underscore. Characters beyond the first character may be any alphabetic character, digit, underscore, or dollar sign. 2.2 Constants There are four types of constants: integer, floating point, character, and string. These constants may be used in expressions (except for strings), assigned to variables, and passed as parameters. For convenience, these constants may be placed into #define statements for expansion by the preprocessor. 2.2.1 Integer An integer constant can be any integer with or without sign whose value is no more than 2 to the 64th power. Note that a large enough value that has been negated will result in sign extension. 2.2.2 Floating Point A floating point constant can be {0-9} . {0-9} [ {eE} {+-} {0-9}+ ] Some examples of valid floating point constants are 0.01 1.0e-2 0.001E+1 These constants all represent the same value, 0.01. 2.2.3 Character A character constant is a character enclosed in single forward quotes. As in C, the character may also be a backslash followed by another backslash (for the backslash character itself) or a character which represents a special ascii value. The current special characters are \b Backspace \f Form Feed \n New Line \t Tab \r Carriage Return \0 Null The value following the backslash may also be an octal or hex value. For an octal value, use a backslash followed by a valid octal digit beginning with 0. For hex, use a backslash followed by the character 'x' followed by a valid hex digit. Examples are \012 New Line in Octal \xA New Line in Hex 2.2.4 String A string constant is enclosed in double quotes and may contain regular ASCII characters or any of the special characters shown above. Examples are "hello" "hello\nworld\n" "\thello world\xA" There is also a special string value "nil" which defines a pointer value of zero. String variables can be assigned nil and compared to it. Parameters of type string can also be sent nil as an actual parameter. 2.3 Declarations The syntax for a variable declaration is the same for local and global variables. There may be an initialization part which is an expression. An oddity of the interpretive environment is that the initialization part of a global declaration may contain a function call. Great care should be taken not to break your program however. Some example declarations are char c; int n = 5; ulong ul = compute_it(n); string hello = "world"; Note that the syntax only allows one variable per line. 2.4 Arithmetic Operators The current operators available for performing arithmetic on numeric values are + Addition of scalar or floating types. - Subtraction of scalar or floating types. * Multiplication of scalar or floating types. / Division of scalar or floating types. % Modulus of scalar types. These work the same as they do in "C" and arithmetic operations between numeric variables of different types is allowed. Explicit modulus of floating point types will be caught and disallowed by the parser, however, if the result of an expression yields a floating point value and is used as an operand to the modulus operator, it is converted to type longlong first then performed. It has the potential for yielding unexpected results so care should be taken. In expressions that contain mixed types of scalar or scalar and floating point, the resulting expression will be of the type of the highest precedence. The order of precedence from lowest to highest is char uchar short ushort int / long uint / ulong longlong ulonglong double so, in this statement int fahrenheit; double celsius; ... celsius = (5.0 / 9.0) * (fahrenheit - 32); the resulting value will be double. The (5.0 / 9.0) expression yields a double while the (fahrenheit - 32) yields an int. The multiply operator then changes the right side of the expression into a double for multiplication. The programmer needs to take care not to lose accuracy. The precedence of the operators + and - are at the same level and of lower precedence than the *, /, and % operators which are also at the same level. Parenthesis can be used to create explicit precedence as in the expression above. Without parenthesis, the implicit value of the expression would be celsius = (5.0 / (9.0 * fahrenheit)) - 32; 2.5 Logical Operators The logical operators of SymbEL are < Less than > Greater than <= Less than or equal to >= Greater than or equal to != Not equal to == Equal to =~ Regular expression comparison They are all of equal precedence since the syntax does not allow for expressions of the type a < b != c. The junctural operators for short circuit logical AND and short circuit logical OR are && and || respectively. They are implicitly of lower precedence than the comparators. There is no logical NOT defined by the language. Statements can be rewritten without the logical NOT operation by comparing the value to zero or using inverse comparators and/or juncturals. The regular expression comparison operator =~ expects the regular expression on the right side of the operator. Comparisons with regular expressions on the left side of the operator will not yield the expected results. 2.6 Bitwise Operators The bitwise operators of SymbEL are & Bitwise AND | Bitwise OR ^ Bitwise XOR << Shift left >> Shift right Just as there is no logical NOT, there is also no bitwise NOT. The addition of a bitwise NOT would add certain unwanted complexities to the parser. Working around this issue is more complex than the logical NOT but the problem is not insurmountable. 2.7 Increment and Decrement Operators SymbEL supports the prefix and postfix increment and decrement operators. These operators can only be used on scalar types. Use on non-scalar variables will result in an error from the parser. Variables using these operators can appear in a stand-alone statement or as part of an expression. 2.8 Compressed Assignment Operators Support for the operators +=, -=, *=, /=, and %= is present and the semantics for these operators are the same for the arithmetic operators and the assignment of values. Statements with these operators may be used in the "do part" of the "for" loop as well as in a statement by itself. For instance for(i=0; i<10; i+=2) { ... } The bitwise version of these compressed operators are also supported. These are the &=, |=, ^=, <<=, and >>= operators. 2.9 Address Operator To obtain the address of a variable, the address operator is used as a prefix to the variable name. This is the same as C with the exception that the address of a structure cannot be taken. The address operator only works with simple types and arrays of simple types. In the case of arrays, using the address operator is equivalent to taking the address of the first element of the array. The address of an array will not result in a pointer to a pointer. The return value of the address operator is ulong. Since there is no pointer type in SymbEL, ulong satisfies the requirements for an address in that it is 32 bits in length and has no sign associated with it. An example of the use of the address operator is int int_var = 5; ulong pointer = &int_var; The address operator is useful for functions such as "scanf". The address operator can be viewed as a type cast when dealing with strings. When the address operator is used on a string variable, the result is not a pointer to a pointer to char. It simply has the effect of casting the type of the variable from string to ulong since strings variables are already addresses by definition. 2.10 Type Casting SymbEL supports type casting between string and 4 byte numerics. This is useful for orthogonality when taking the address of a string. If the ulong result needs to be viewed as a string again a type cast can be used. The syntax of the type cast is slightly different than C. The entire expression must be enclosed in parenthesis. This is yet another effort to keep the complexity of the grammar to a minimum. This is an example of type casting. #include #include #include main() { char buf[128]; iovec_t iov[1]; iov[0].iov_base = &buf; iov[0].iov_len = sizeof(buf); if (readv(0, iov, 1) > 0) { fputs(((string) iov[0].iov_base), stdout); } } Type casting between string and double or casts of structured types is not allowed and will result in an error message from the parser. 3.0 Control Flow Some of the control structures have already been covered. This chapter will discuss all of the control structures in detail. 3.1 Blocks All control statements in SymbEL must have a block associated with them. The block will begin with a left curly brace, {, and end with a right curly brace, }. This was done for the purpose of keeping the grammar clean. It also provides additional clarity of the code. 3.2 If-Then-Else Statement The "if" statement may be an "if" by itself or an "if" statement and an "else" part. The structure of an "if" construct is if ( logical expression ) { ... } There are two points that need to be made about this construct. The first is that the condition that the "if" checks on is not an expression. It is a logical expression. Therefore, statements such as if (running) { ... } are not correct. The condition must be a comparison for it to be a logical expression. This "if" is correctly written as if (running != 0) { ... } where there is a logical expression instead of an expression as the condition. The second point is that there are always curly braces surrounding the statement blocks of the "if" and the "else" parts. This is true even if there is only one statement. Here are some examples. if (x > y) { printf("x is greater than y\n"); } if (x < y) { printf("x is less than y\n"); } else { printf("x is greater than y\n"); } Care should be taken when writing if-then-else-if-then statements. It is easy to mistakenly write if (x == 2) { printf("x is equal to 2\n"); } else if (x == 3) { printf("x is equal to 3\n"); } which is incorrect. The "else" part must begin with a curly brace. This is correctly written as if (x == 2) { printf("x is equal to 2\n"); } else { if (x == 3) { printf("x is equal to 3\n"); } } 3.3 Conditional Expression The ternary operator "?:" known as a conditional expression is supported as a value in an expression. There is a syntactic requirement on this expression type however. The entire conditional expression must be enclosed in parenthesis. The logical expression part can be any supported logical expression. The two expression parts can be any supported expression provided their types are compatible. Here's an example that prints out the numbers from 1 to 10 and whether they're even or odd. main() { int i; for(i=1; i<=10; i++) { printf("%2d %s\n", i, ((i % 2) == 0 ? "even" : "odd")); } } 3.4 Switch Statement The "switch" statement is used for selecting a value from many possible values. This statement type works exactly like the C equivalent with an addition. The "switch" statement in SymbEL also works on strings. Some examples are // character switch main() { char t = 'w'; switch(t) { case 'a': printf("a - wrong\n"); break; case 'b': printf("b - wrong\n"); break; case 'c': printf("c - wrong\n"); break; case 'w': printf("w - correct\n"); break; default: printf("say what?\n"); break; } } // string switch main() { string s = "hello"; switch(s) { case "yo": case "hey": case "hi": printf("yo/hey/hi - wrong\n"); break; case "hello": printf("%s, world\n", s); break; default: printf("say what?\n"); break; } } 3.5 Loops 3.5.1 While Loop The three looping constructs in SymbEL are the "while", "for", and "do" loops. The structure of the "while" loop is while( logical expression ) { ... } There are two points that need to be made about this construct. First is that the condition that the "while" checks on is not an expression. It is a logical expression. Therefore, loops such as while(running) { ... } are not correct. The condition must be a comparison in order for it to be a logical expression. This loop is correctly written as while(running != 0) { ... } The second point is that there are always curly braces surrounding the statement blocks of the "while", "for" and "do" statements. This is true even if there is only one statement in the block. This is consistent with the other control constructs of SymbEL. 3.5.2 For Loop The structure of the "for" loop is for( assign part; while part; do part ) { ... } The "assign part" can be an optionally comma separated list of statements or it can be omitted. The "while part" can be any logical expression or it can be omitted. The "do part" can be an optionally comma separated list of statements or it can be omitted. Simple "for" loops such as for(i=0; i<10; i++) { ... } are valid as well as the more complex for(i=0, j=0; i main() { ks_system_misc kstat$misc; printf("This machine has %u CPU(s) in it.\n", kstat$misc.ncpus); } Just as in the kvm example, no explicit access must be done to retrieve the data from the kstat framework. The access to the member of the active ks_system_misc variable in the parameter list of printf() causes the member to be updated by the runtime. 6.2.1 Multiple Instances The kstat.se header file contains many structures that have information that is unique in nature. The ks_system_misc structure is an example. The number of CPUs on the system is unique and does not change depending on something else. However, the activity of each of the individual CPUs DOES change depending on which CPU is in question. This is also the case for network interfaces and disks. This situation is handled by the addition of two members to structures that contain data for devices that have multiple instances. These members are "number$" and "name$". The "name$" member will contain the name of the device as supplied by kstat. The "number$" member is a linear number representing the "nth" device of this type encountered. It is NOT the device instance number. The reasoning for this is to allow a "for" loop to be written such that all of the devices of a particular type can be traversed without needing to skip over instances that are not in the system. It is not unusual, for instance, for a multi-processor machine to contain CPUs that do not have linear instance numbers. When traversing through all the devices, the end of the list will be encountered when the "number$" member contains a -1. Here is an example of searching through multiple disk instances. #include main() { ks_disks kstat$disk; printf("Disks currently seen by the system:\n"); for(kstat$disk.number$=0; kstat$disk.number$ != -1; kstat$disk.number$++) { printf("\t%s\n", kstat$disk.name$); } } In this program, kstat$disk.number$ is set initially to zero. The "while part" of the loop is then run checking the value of kstat$disk.number$ to see if it's -1. That comparison causes the runtime to verify that there is an "nth" disk. If there is, then the number$ member is left with its value and the body of the loop runs. When the runtime evaluates the kstat$disk.name$ value in the printf() statement it reads the name of the "nth" disk, places it in the name$ member and which is then sent to printf(). 6.2.2 Other Points About kstat There are some points that need to be made about how to best use kstat variables in a program. Some of the values contained in the kstat structures are not immediately useful by themselves. For instance, the "cpu" member of the ks_cpu_sysinfo structure is an array of four unsigned longs representing the number of clock ticks that have occurred since system boot in each of the the four CPU states: idle, user, kernel, and wait. This data needs to be disseminated to be useful. If a program needs to access many members of a kstat variable then it is in the best interest of the performance of the program and the system to copy the values into an inactive kstat variable using a structure assignment. The single structure assignment will cause all of the members of the structure to be read from the kstat framework with one read and copied to the inactive variable. When these values are accessed using the inactive variable, no more reads from the kstat framework will be initiated and the net result will be a reduction in the number of system calls being performed by the runtime and therefore "se" will not have a significant impact on the performance of the system. Here is an example. 6.2.3 Example kstat Program #include #include #include main() { ks_cpu_sysinfo kstat$cpusys; // active kstat variable ks_cpu_sysinfo tmp_cpusys; // inactive kstat variable ks_system_misc kstat$misc; // active kstat variable int ncpus = kstat$misc.ncpus; // grab it and save it int old_ints[MAX_CPU]; int old_cs[MAX_CPU]; int ints; int cs; int i; // initialize the old values for(i=0; i<~%? \t\n\\^ *) Members of KSTAT_TYPE_NAMED structures sometimes have no name. This situation will also by correctly handled by the interpreter. Any member of a structure with the name "" will be changed to "missingN" where N starts at 1 and increments for each occurrence of a missing member name. A declaration of kstat struct "asleep" ks_zzzz { ulong ""; // translates into missing1 }; will translate into kstat struct "asleep" ks_zzzz { ulong missing1; }; for the purposes of the programmer. It would be a good idea to document such declarations as above. *) Members with reserved words as names will also be munged into another form, the prefix "SYM_" is added to the name. For instance this declaration kstat struct "unnecessary" ks_complexity { short "short"; }; will be munged into kstat struct "unnecessary" ks_complexity { short SYM_short; }; so the programmer can continue. *) The quoted string following the keyword "struct" in the declaration represents the name of the KSTAT_TYPE_NAMED structure in the kstat framework and is an algebra onto itself. First, an introduction. Each "link" in the kstat "chain" which comprises the framework has 3 name elements: a module, an instance number, and a name. The "kstat_types" link, for instance, has the complete name "unix".0."kstat_types". "unix" is the module, 0 is the instance number, and "kstat_types" is the name. Here are the possible ways to specify the kstat name within this quoted string. +) "kstat_types" - This is the "name" of the kstat. +) "cpu_info:" - This is the "module" of the kstat. A link with the full name of "cpu_info".0."cpu_info0" would map onto this structure. However, so too would "cpu_info".1."cpu_info1", which brings up an issue. When a kstat structure is declared with a kstat module name, the first two members of the structure must be long number$; string name$; This is in keeping with other kstat declarations with multiple instances. In the case of structures with multiple module names that have the same structure members, the list of names continues with colon separators, e.g. kstat struct "ieef:el:elx:pcelx" ks_elx_network { ... +) "*kmem_magazine" - This is the prefix of the name portion of the kstat. In the case of the kmem_magazines, the module name will always be "unix" which is the module name of many other links that do not share the same structure members as the kmem_magazines. As is the case with specifying a module name, the number$ and name$ members must be present. Note that when a dynamic kstat structure declaration replaces a static declaration inside of the interpreter, the old declaration is discarded and replaced with the new one. Therefore, if a kmem_magazine declaration were used to replace the "ks_cache" declaration from kstat.se, the only kstat links seen would be the kmem_magazine members, and all of the other cache links (and there are a lot of them) would no longer be seen. 6.2.6 Adding New Disk Names The internal function "se_add_disk_name(string name)" can be used to add new disk names to the existing list internally. Therefore, if the tape drives and nfs mounts that are recorded in the KSTAT_TYPE_IO section of the kstat framework were to be added to the list of disks for display by any script that shows disk statistics, these lines could be added at the beginning of the script. se_add_disk_name("st"); se_add_disk_name("nfs"); This function is declared in the se.se include file. 6.3 The mib Language Class There is a lot of data residing in the mib variables of the kernel regarding the network. Unfortunately, these mib variables are not part of the kstat framework. Therefore, a new language class was created to ease the access to this information. Variables of the mib class have a unique feature in that they can be read, but assigning values will generate a warning from the interpreter. This is to remind the user that assigning values to the members of the mib2_* structures will NOT result in the information being placed back into the kernel. The mib variables are read-only. Mib variables do not have the permissions limitation of kvm variables. Any user can view mib variable values without special access permissions. To view the mib information available from within SymbEL, run the command "netstat -s" from the command line. All but the IGMP information is available. Since all mib variables are structures, the rules regarding structure assignment being used to cut down on the overhead of the interpreter are the same as the kstat and kvm classes. Here is an example of using mib class variables. #include main() { mib2_tcp_t mib$tcp; printf("Retransmitted TCP segments = %u\n", mib$tcp.tcpRetransSegs); } 6.4 The ndd Language Class SunOS 5.x makes access to variables that define the operation of the network stack available through a command called "ndd" (see ndd(1M)). The ndd language class within SymbEL provides access to the variables within the IP, ICMP, TCP, UDP, and ARP modules. The definition of the variables available are in the ndd.se include file. For each module, there is a structure that contains all of the variables available for that module. Some of these variables are read-write and others are read-only. If an attempt is made to modify a variable that is read only a warning message will be produced by the interpreter. Some of the read-only variables are tables which can be quite large. Like kstat and mib variables, all ndd variables are structures. The following program displays the tcp_status variable of the TCP module. This variable is type string and when printed looks like a large table. #include #include main() { ndd_tcp_t ndd$tcp; puts(ndd$tcp.tcp_status); } 7.0 User Defined Classes The four language classes provide a significant amount of data to a program for analysis. But the analysis of this data can become convoluted and make the program difficult to deal with. This is one of the problems that SymbEL hoped to clear up. Adding more language classes is a potential solution to this problem. An example of an additional language class that would be useful is a "vmstat" class. This would be a structure that provided all of the information that the "vmstat" program provides. The problem is that such an addition would make "se" larger and provide functionality that didn't really require the internals of the interpreter to accomplish. All of what "vmstat" does can be done by writing a SymbEL program. In addition to the "vmstat" class, it would be useful to have classes for "iostat", "mpstat", "nfsstat", "netstat" and any other "stat" program that provided this type of information. What was needed to accomplish this task correctly is a language feature that allowed the programmer to create their own language classes written in SymbEL. This "user defined class" would be a structure and an associated block of code that was called whenever one of the members of the structure was accessed. This lead to the development of the aggregate type "class". A "class" type is a structure and a block of code inside the structure that is first called when the block that contains the declaration of the class variable is entered. Thereafter, whenever a member of the class variable is accessed, the block is called. To illustrate the class construct, here is a program that continually displays how long the system has been up. The first example is without the use of a class. #include #include #include #define MINUTES (60 * hz) #define HOURS (60 * MINUTES) #define DAYS (24 * HOURS) main() { ulong ticks; ulong days; ulong hours; ulong minutes; ulong seconds; ks_system_misc kstat$misc; long hz = sysconf(_SC_CLK_TCK); for(;;) { ticks = kstat$misc.clk_intr; days = ticks / DAYS; ticks -= (days * DAYS); hours = ticks / HOURS; ticks -= (hours * HOURS); minutes = ticks / MINUTES; ticks -= (minutes * MINUTES); seconds = ticks / hz; printf("System up for: %4u days %2u hours %2u minutes %2u seconds\r", days, hours, minutes, seconds); fflush(stdout); sleep(1); } } This program continues in an infinite "for" loop computing the uptime based on the number of clock ticks the system has received since boot. The computation is contained completely within the main program. This code can be distilled into a user defined class as the following code shows. #include #include #define MINUTES (60 * hz) #define HOURS (60 * MINUTES) #define DAYS (24 * HOURS) class uptime { ulong ticks; ulong days; ulong hours; ulong minutes; ulong seconds; uptime$() { ks_system_misc kstat$misc; long hz = sysconf(_SC_CLK_TCK); ticks = kstat$misc.clk_intr; /* assign these values to the */ days = ticks / DAYS; /* class members */ ticks -= (days * DAYS); hours = ticks / HOURS; ticks -= (hours * HOURS); minutes = ticks / MINUTES; ticks -= (minutes * MINUTES); seconds = ticks / hz; } }; The start of the class looks like a structure but the final "member" of the structure is a block of code called the "class block". The name used after the "class" keyword is the type name that will be used in the declaration of the variable. The name of the class block is the prefix used in variable names to denote that the variable is active. Variables declared of a user defined class type that do not use the prefix in the variable name are inactive. The main() function of the uptime program would now be written to use the uptime class as shown in this example. #include #include #include "uptime_class.se" main() { uptime uptime$value; uptime tmp_uptime; for(;;) { tmp_uptime = uptime$value; printf("System up for: %4u days %2u hours %2u minutes %2u seconds\r", tmp_uptime.days, tmp_uptime.hours, tmp_uptime.minutes, tmp_uptime.seconds); fflush(stdout); sleep(1); } } The previous chapter discussed how the assignment of entire structures cuts down on the overhead of the system since only one copy is required. Not only is this true here as well, but the structure copy also assures that the data printed out represents the calculations of one snapshot in time, instead of printing different values for each time that the class block was called to update each member of the class that was used as a parameter to printf(). 7.1 The refresh$ Builtin As a space saving measure, there is also a builtin function not discussed previously. This is the "refresh$" builtin. This function can be used with user defined classes to refresh the contents of the class. It works the same way as assigning the active variable to the temporary one. In the above example the code could be changed to #include #include #include "uptime_class.se" main() { uptime up; for(;;) { refresh$(up); printf("System up for: %4u days %2u hours %2u minutes %2u seconds\r", up.days, up.hours, up.minutes, up.seconds); fflush(stdout); sleep(1); } } Care must be taken when using the "refresh$" builtin. When a program is written using active variables, the interpreter will call the class method as an initialization step when it first encounters it. This is not the case for non-active variables. If this initialization step is required in a program, it should be performed early in the function. Then, when it is refreshed later, it will have the initial values already. 8.0 Pitfalls These are some of the idiosyncrasies of the language that will catch the programmer by surprise if they're accustomed to using a particular feature in C and assume that it will be supported in SymbEL. * Only one variable can be declared per line. The variable names may not be a comma separated list. * There is no type "float". All floating point variables are type "double". * Curly braces must surround all sequences of statements in control structures. This includes sequences of length one. * The comparators work with scalars, floats and strings. Therefore, the logical comparison ("hello" == "world") is valid and in this case will return false. * If the result of an expression yields a floating value as an operand to the modulus operator, it is converted to long before the operation takes place. This happens while the program is running. * Assignment of the result of a logical expression is not allowed. * The "for" loop has some limitations. - There may only be one assignment in the assignment part. - There may only be logical expressions in the while part. - There may only be one assignment in the do part. * All local variables have "static" semantics. * All parameters are passed by value * Global variables can be assigned the value of a function call. * while(running) is not syntactically correct. while(running != 0) is. * There is no recursion in SymbEL. * Structure comparison is not supported. * Syntax of conditional expression is rigid: ( condition ? do_exp : else_exp ) * Calling attached functions with incorrect values can result in a core dump and is not avoidable by the interpreter. This simple but effective script will cause a segmentation fault core dump. #include main() { puts(nil); } 9.0 Tricks Knowing the internals of the interpreter gives me insight into how to accomplish some things that may not seem immediately obvious. Here are some novel ways to shoot yourself in the foot. 9.1 Returning an Array of Non-Structured Type from a Function Although it is not allowed to declare a function as int [] not_legal() { int array[ARRAY_SIZE] = { 1, 2, 3, 4, 5, -1 }; return array; } it is still possible to return an array. Granted this is unattractive, but most of the tricks in this chapter will involve something that is not very appealing from the programming standpoint. But SymbEL is, after all, just a scripting language. And if it can be done at all, it's worth doing. So here's how it can be done. #define ARRAY_SIZE 128 ulong it_is_legal() { int array[ARRAY_SIZE] = { 1, 2, 3, 4, 5, -1 }; return &array; } struct array_struct { int array[ARRAY_SIZE]; }; main() { array_struct digits; ulong address; int i; address = it_is_legal(); struct_fill(digits, address); for(i=0; digits.array[i] != -1; i++) { printf("%d\n", digits.array[i]); } } 9.2 Using Attached Functions Return Values It is common to read input lines using "fgets" and then locate the new-line character with "strchr" and change it to a null character. This has unexpected results in SymbEL. For instance, the code segment while(fgets(buf, sizeof(buf), stdin) ! = nil) { p = strchr(buf, '\n'); p[0] = '\0'; puts(buf); } would be expected to null the new-line character and print the line (yes I know this code segment will cause "se" to exit with a null pointer exception if a line is read with no new-line character). But this is not the case since the "strchr" function will return a string that is assigned to the variable "p". When this happens, a new copy of the string returned by "strchr" is allocated and assigned to "p". When the "p[0] = '\0';" line is executed the new-line character in the copy is made null. The original "buf" from the "fgets" call remains intact. The way around this (and this should only be done when it is certain that the input lines contain the new-line character) is while(fgets(buf, sizeof(buf), stdin) ! = nil) { strcpy(strchr(buf, '\n'), ""); puts(buf); } In this case, the result of the "strchr" call is never assigned to a variable and its return value remains uncopied before being sent to the "strcpy" function. Strcpy then copies the string "" onto the new-line and turns it to the null character in doing so. 9.3 Using kvm Variables and Functions Using the kvm functions and dealing with kvm variables in general is quite confusing since there are so many levels of indirection of pointers. This simple script performs the equivalent of "/bin/uname -m". #include #include main() { ulong kvm$top_devinfo; // top_devinfo is an actual kernel variable dev_info_t kvm$root_node; // root_node is not, but it needs to be active // The next line effects a pointer indirection. The value of top_devinfo // is a pointer to the root of the devinfo tree in the kernel. This value // is extracted and the root_node variable has its kernel address changed // to this value. Accessing the root_node variable after this assignment // will cause the reading of the dev_info_t structure from the kernel // since root_node is an active variable. Note that root_node is not // a variable in the kernel though, but it's declared active so that // the value will be read out *after* it's given a valid kernel address. // And there's no need to explicitly read the string, it's done already. kvm_cvt(kvm$root_node, kvm$top_devinfo); puts(kvm$root_node.devi_name); } Another example of extracting kvm values is with the "kvm_declare" function. This allows kernel variables to be declared while the program is running. Instead of declaring a kvm variable for "maxusers", for instance, it could be done this way main() { ulong address; int kvm$integer_value; address = kvm_declare("maxusers"); kvm_cvt(kvm$integer_value, address); printf("maxusers is %d\n", kvm$integer_value); } A more general way to peruse integer variables entered at the user's leisure is shown in this example. #include #include int main() { char var_name[BUFSIZ]; ulong address; int kvm$variable; for(;;) { fputs("Enter the name of an integer variable: ", stdout); if (fgets(var_name, sizeof(var_name), stdin) == nil) { return 0; } strcpy(strchr(var_name, '\n'), ""); // chop address = kvm_declare(var_name); // look it up with nlist if (address == 0) { printf("variable %s is not found in the kernel space\n", var_name); continue; } kvm_cvt(kvm$variable, address); // convert the address of the kvm var printf("%s = %u\n", var_name, kvm$variable); } } 9.4 Using an "attach" Block to call Interpreter Functions The "attach" feature of SymbEL is an implementation of using the dynamic linking feature of Solaris. The "dl" functions allow an external library to be attached to a running process, thus making the symbols within that binary available to the program. One of the features of using dynamic linking is the ability to access symbols within the binary that is running. That is to say, a process can look into itself for symbols. This can also be accomplished in SymbEL by using an attach block with no name. With this trick a script can call functions contained within the interpreter. This does require that the author of the script know what functions are available to begin with though. Currently, the only list of functions available to the user are listed in the "se.se" include file. The most useful of these functions is the "se_function_call" function. This allows the script to call a SymbEL function indirectly. This can be used for a callback mechanism. It's the equivalent of a pointer to a function. For example, this script calls the function "callback" indirectly. #include main() { se_function_call("callback", 3, 2, 1); } callback(int a, int b, int c) { printf("a = %d b = %d c = %d\n", a, b, c); } The "se_function_call" function is declared with an ellipsis argument so any number of parameters can be passed (up to the internal limit) to the function being called. Care should be taken to pass the correct type and number of arguments. An extreme example of this functionality is demonstrated here. This script calls on the interpreter to parse a function from an external file and then run the function. It's an absurd example, but it demonstrates the tangled web that can be weaved with attached functions and variables. // this is the file "other_file" some_function(int param) { printf("hello there: %d\n", param); } // this is the demo script #include #include #include attach "" { extern ulong Lex_input; extern int Se_errors; yyparse(); se_fatal(string p); }; int main() { Lex_input = fopen("other_file", "r"); if (Lex_input == 0) { perror("fopen"); return 1; } yyparse(); if (Se_errors != 0) { se_fatal("parse errors in other_file"); return 1; } se_function_call("some_function", 312); return 0; } 07070100331354000041ed00000000000000000000000341dc5ea40000000000000088000000040000010a000000010000001200000005reloc/RICHPse/etc07070100332c55000041ed00000000000000000000000241dc5ea40000000000000088000000040000010a000000010000001900000005reloc/RICHPse/etc/init.d07070100332c56000081ed0000000000000001000000013a8dc70900000d35000000880000000400000000000000000000002000000005reloc/RICHPse/etc/init.d/mon_cm#! /bin/sh # # start/stop the system performance monitor daemon # this version logs output into the root calendar every 15 minutes # # set these environment variables to alter thresholds #Live Rule specific thresholds: #LR_DISK_SLOW_FD default=10.0x derate slow floppys #LR_DISK_SLOW_CD default=10.0x derate slow CDs #LR_DISK_FLOPPY default= fd0 default floppy device #LR_DISK_CDROM default=c0t6d0 default CD device #Pure Rule thresholds #DISK_BUSY_WARNING default= 5.0% ignore less than this #DISK_BUSY_PROBLEM default=20.0% #DISK_SVC_T_WARNING default=30.0ms #DISK_SVC_T_PROBLEM default=50.0ms #ENET_INUSE default=50.0/s ignore fewer output packets/s #ENET_COLL_WARNING default= 5.0% #ENET_COLL_PROBLEM default=10.0% #RPCCLIENT_MINCALLS default= 0.0/s calls per sec for idle #RPCCLIENT_TIMEOUT default= 5.0% calls that timeout #RPCCLIENT_BADXID default= 0.0% timeouts with badxid #SWAP_WASTE default=100000KB more may be a waste #SWAP_LOTS default= 10000KB more is lots #SWAP_LOW default= 4000KB warning LOW to LOTS #SWAP_NONE default= 1000KB danger LOW-NONE, crisis #RESTIME_LONG default=600s No scanning - long res time #RESTIME_OK default= 40s residence time of unref pages #RESTIME_PROBLEM default= 20s pages stolen too quickly #KMEM_FREEMEM_LOW default= 64pg few pages for kernel to use #RUNQ_IDLE default= 0.0 Spare CPU capacity #RUNQ_BUSY default= 3.0 OK up to this level #RUNQ_OVERLOAD default= 5.0 Warning up to this level #MUTEX_BUSY default=200.0/s OK up to this level per-CPU #MUTEX_OVERLOAD default=400.0/s Warning up to this level #DNLC_ACTIVE default=100.0/s minimum activity #DNLC_WARNING default=90.0% warning missrate #INODE_ACTIVE default=100.0/s minimum activity #INODE_WARNING default=90.0% warning missrate #INODE_IPF default= 0.0% stolen inodes w/pages frac # # use: /opt/RICHPse/examples/mon_cm.se [interval] [calendar] # default interval is 900 seconds (15min), calendar is whoever runs this file # but is assumed to be root@nodename # cm_insert dumps core if HOME is not set HOME=/ SE=/opt/RICHPse/bin/se MC=/opt/RICHPse/examples/mon_cm.se CR=/opt/RICHPse/examples/data/callog.root export HOME SE MC CR case "$1" in 'start') # Start the monitor daemon if [ -f $MC ] ; then echo "Starting performance monitor calendar daemon" if [ ! -f /var/spool/calendar/callog.root ] ; then # stop the calendar daemon id=`/bin/ps -e | /bin/grep rpc.cmsd | /bin/awk '{print $1}'` if [ -n "$id" ]; then echo "Stopping rpc.cmsd and creating root calendar" kill $id fi cp $CR /var/spool/calendar/callog.root chgrp daemon /var/spool/calendar/callog.root chmod 460 /var/spool/calendar/callog.root fi $SE -o- $MC | $SE -t$MC & fi ;; 'stop') # Stop the monitor daemon id=`/bin/ps -ef | /bin/grep mon_cm.se | /bin/grep -v grep | /bin/awk '{print $2}'` if [ -n "$id" ]; then echo "Stopping performance monitor calendar daemon" kill $id fi ;; esac 07070100332c57000081ed0000000000000001000000013a8dc736000009b2000000880000000400000000000000000000002000000005reloc/RICHPse/etc/init.d/monlog#! /bin/sh # # start/stop the syslog performance monitor daemon # # set environment variables as required #Live Rule specific thresholds: #LR_DISK_SLOW_FD default=10.0x derate slow floppys #LR_DISK_SLOW_CD default=10.0x derate slow CDs #LR_DISK_FLOPPY default= fd0 default floppy device #LR_DISK_CDROM default=c0t6d0 default CD device #Pure Rule thresholds #DISK_BUSY_WARNING default= 5.0% ignore less than this #DISK_BUSY_PROBLEM default=20.0% #DISK_SVC_T_WARNING default=30.0ms #DISK_SVC_T_PROBLEM default=50.0ms #ENET_INUSE default=50.0/s ignore fewer output packets/s #ENET_COLL_WARNING default= 5.0% #ENET_COLL_PROBLEM default=10.0% #RPCCLIENT_MINCALLS default= 0.0/s calls per sec for idle #RPCCLIENT_TIMEOUT default= 5.0% calls that timeout #RPCCLIENT_BADXID default= 0.0% timeouts with badxid #SWAP_WASTE default=100000KB more may be a waste #SWAP_LOTS default= 10000KB more is lots #SWAP_LOW default= 4000KB warning LOW to LOTS #SWAP_NONE default= 1000KB danger LOW-NONE, crisis #RESTIME_LONG default=600s No scanning - long res time #RESTIME_OK default= 40s residence time of unref pages #RESTIME_PROBLEM default= 20s pages stolen too quickly #KMEM_FREEMEM_LOW default= 64pg few pages for kernel to use #RUNQ_IDLE default= 0.0 Spare CPU capacity #RUNQ_BUSY default= 3.0 OK up to this level #RUNQ_OVERLOAD default= 5.0 Warning up to this level #MUTEX_BUSY default=200.0/s OK up to this level per-CPU #MUTEX_OVERLOAD default=400.0/s Warning up to this level #DNLC_ACTIVE default=100.0/s minimum activity #DNLC_WARNING default=90.0% warning missrate #INODE_ACTIVE default=100.0/s minimum activity #INODE_WARNING default=90.0% warning missrate #INODE_IPF default= 0.0% stolen inodes w/pages frac SE=/opt/RICHPse/bin/se ML=/opt/RICHPse/examples/monlog.se export SE ML case "$1" in 'start') # Start the monitor daemon if [ -f $ML ] ; then echo "Starting performance monitor syslog daemon" $SE -o- $ML | $SE -t$ML & fi ;; 'stop') # Stop the monitor daemon id=`/bin/ps -ef | /bin/grep monlog.se | /bin/grep -v grep | /bin/awk '{print $2}'` if [ -n "$id" ]; then echo "Stopping performance monitor daemon" kill $id fi ;; esac 07070100332c58000081ed0000000000000001000000013a8dc74500001066000000880000000400000000000000000000002000000005reloc/RICHPse/etc/init.d/percol#! /bin/sh # # Version 0.4 28 Jan 96 - Adrian Cockcroft # # set this to point to your NCSA/Netscape format access log # default points to a common Netscape server log location NCSAHTTPLOG=/opt/ns-home/httpd-80/logs/access; export NCSAHTTPLOG # point this to a squid format access log and set -DSQUID below SQUIDLOG=/opt/squid/logs/access; export SQUIDLOG # # set this to indicate the hostname or IP address of a special system # as it appears in the access log. It can be used to track fast local # accesses to your server, for example 192.9. is Sun.com # and all web accesses from inside Sun to the Internet appear to be from it # if you have DNS lookups turned on, substitute the name for the IP addr GATEWAY=192.9.; export GATEWAY # # location for web logs to be accumulated. Set to a public doc directory # if you want to view the data using a web browser or java applet. OUTDIR=/var/adm/weblogs; export OUTDIR # #Live Rule specific thresholds: #LR_DISK_SLOW_FD default=10.0x derate slow floppys #LR_DISK_SLOW_CD default=10.0x derate slow CDs #LR_DISK_FLOPPY default= fd0 default floppy device #LR_DISK_CDROM default=c0t6d0 default CD device #Pure Rule thresholds #DISK_BUSY_WARNING default= 5.0% ignore less than this #DISK_BUSY_PROBLEM default=20.0% #DISK_SVC_T_WARNING default=30.0ms #DISK_SVC_T_PROBLEM default=50.0ms #ENET_INUSE default=50.0/s ignore fewer output packets/s #ENET_COLL_WARNING default=15.0% #ENET_COLL_PROBLEM default=30.0% #ENET_ERROR_PROBLEM default=0.050/s #ENET_DEFER_WARNING default=2.00% some delayed output packets #ENET_DEFER_WARNING default=10.00% too many delayed output packets #ENET_NOCANPUT_PROBLEM default=1.000/s incoming packet dropped by IP #RPCCLIENT_MINCALLS default= 0.0/s calls per sec for idle #RPCCLIENT_TIMEOUT default= 5.0% calls that timeout #RPCCLIENT_BADXID default= 0.0% timeouts with badxid # increase swap rule from defaults for web server #SWAP_WASTE default=100000KB more may be a waste SWAP_WASTE=250000; export SWAP_WASTE #SWAP_LOTS default= 10000KB more is lots SWAP_LOTS=80000; export SWAP_LOTS #SWAP_LOW default= 4000KB warning LOW to LOTS SWAP_LOW=20000; export SWAP_LOW #SWAP_NONE default= 1000KB danger LOW-NONE, crisis SWAP_NONE=5000; export SWAP_NONE #RESTIME_LONG default=600s No scanning - long res time #RESTIME_OK default= 40s residence time of unref pages #RESTIME_PROBLEM default= 20s pages stolen too quickly #KMEM_FREEMEM_LOW default= 64pg few pages for kernel to use #RUNQ_IDLE default= 1.0 Spare CPU capacity #RUNQ_BUSY default= 2.0 OK up to this level #RUNQ_OVERLOAD default= 5.0 Warning up to this level #MUTEX_BUSY default=200.0/s OK up to this level per-CPU #MUTEX_OVERLOAD default=500.0/s Warning up to this level #DNLC_ACTIVE default=100.0/s minimum activity #DNLC_WARNING default=80.0% warning missrate #INODE_ACTIVE default=100.0/s minimum activity #INODE_WARNING default=80.0% warning missrate #INODE_IPF default= 0.0% stolen inodes w/pages frac #TCP_ACTIVE default= 2.0KB/s ignore if no output activity # increase threashold for web server TCP_ACTIVE=10.0; export TCP_ACTIVE #TCP_RETRANS_WARN default=15.0% moderate retransmissions #TCP_RETRANS_PROBLEM default=25.0% excessive retransmissions #TCP_LISTEN_WARN default=0.00/s look out for listen drops #TCP_LISTEN_PROBLEM default=0.50/s excessive listen drops # # argument is log interval - default is 300 seconds # SE=/opt/RICHPse/bin/se PC=/opt/RICHPse/examples/percollator.se export SE PC case "$1" in 'start') # Start the monitor daemon if [ -f $PC ] ; then echo "Web server percollator is bubbling" /usr/bin/mkdir -p $OUTDIR $SE -DSQUID -o- $PC | $SE -t$PC - 300 & fi ;; 'stop') # Stop the monitor daemon id=`/bin/ps -ef | /bin/grep percollator.se | /bin/grep -v grep | /bin/awk '{print $2}'` if [ -n "$id" ]; then echo "Web server percollator is off" kill $id fi ;; esac 07070100332c59000081ed0000000000000001000000013a8dc75d00000d1e000000880000000400000000000000000000002400000005reloc/RICHPse/etc/init.d/va_monitor#! /bin/sh # # # start/stop the system performance monitor daemon # # use: /opt/RICHPse/examples/virtual_adrian.se [interval] [-|command] # with environment variables: # PWPID (default 3 is fsflush) # PWMAXCPU (default 5.0% max CPU usage) # NFSRTALLSLOW (default 50ms max NFS round trip time) #Live Rule specific thresholds: #LR_DISK_SLOW_FD default=10.0x derate slow floppys #LR_DISK_SLOW_CD default=10.0x derate slow CDs #LR_DISK_FLOPPY default= fd0 default floppy device #LR_DISK_CDROM default=c0t6d0 default CD device #Pure Rule thresholds #DISK_BUSY_WARNING default= 5.0% ignore less than this #DISK_BUSY_PROBLEM default=20.0% #DISK_SVC_T_WARNING default=30.0ms #DISK_SVC_T_PROBLEM default=50.0ms #ENET_INUSE default=50.0/s ignore fewer output packets/s #ENET_COLL_WARNING default=15.0% #ENET_COLL_PROBLEM default=30.0% #ENET_ERROR_PROBLEM default=0.050/s #ENET_DEFER_WARNING default=2.00% some delayed output packets #ENET_DEFER_WARNING default=10.00% too many delayed output packets #ENET_NOCANPUT_PROBLEM default=1.000/s incoming packet dropped by IP #RPCCLIENT_MINCALLS default= 0.0/s calls per sec for idle #RPCCLIENT_TIMEOUT default= 5.0% calls that timeout #RPCCLIENT_BADXID default= 0.0% timeouts with badxid #SWAP_WASTE default=100000KB more may be a waste #SWAP_LOTS default= 10000KB more is lots #SWAP_LOW default= 4000KB warning LOW to LOTS #SWAP_NONE default= 1000KB danger LOW-NONE, crisis #RESTIME_LONG default=600s No scanning - long res time #RESTIME_OK default= 40s residence time of unref pages #RESTIME_PROBLEM default= 20s pages stolen too quickly #KMEM_FREEMEM_LOW default= 64pg few pages for kernel to use #RUNQ_IDLE default= 0.0 Spare CPU capacity #RUNQ_BUSY default= 3.0 OK up to this level #RUNQ_OVERLOAD default= 5.0 Warning up to this level #MUTEX_BUSY default=200.0/s OK up to this level per-CPU #MUTEX_OVERLOAD default=400.0/s Warning up to this level #DNLC_ACTIVE default=100.0/s minimum activity #DNLC_WARNING default=80.0% warning missrate #INODE_ACTIVE default=100.0/s minimum activity #INODE_WARNING default=80.0% warning missrate #INODE_IPF default= 0.0% stolen inodes w/pages frac #TCP_ACTIVE default= 2.0KB/s ignore if no output activity #TCP_RETRANS_WARN default=15.0% moderate retransmissions #TCP_RETRANS_PROBLEM default=25.0% excessive retransmissions #TCP_LISTEN_WARN default=0.00/s look out for listen drops #TCP_LISTEN_PROBLEM default=0.50/s excessive listen drops LOG=/var/adm/sa/monitor.log SE=/opt/RICHPse/bin/se VA=/opt/RICHPse/examples/virtual_adrian.se export LOG SE VA if [ ! -d /var/adm/sa ]; then /bin/mkdir -p /var/adm/sa fi case "$1" in 'start') # Start the monitor daemon if [ -f $VA ] ; then echo "Starting performance monitor daemon - logged to $LOG" $SE -o- $VA | $SE -t$VA - 30 | tee -a $LOG & fi ;; 'stop') # Stop the monitor daemon id=`/bin/ps -ef | /bin/grep virtual_adrian.se | /bin/grep -v grep | /bin/awk '{print $2}'` if [ -n "$id" ]; then echo "Stopping performance monitor daemon" kill $id fi ;; esac 07070100332c5a000081ed0000000000000001000000013a8dc96f0000055f000000880000000400000000000000000000001f00000005reloc/RICHPse/etc/init.d/vader#! /sbin/sh # # Copyright (c) 2001 Richard Pettit - All rights reserved SE=/opt/RICHPse VADER="$SE"/examples/vader.se case "$1" in 'start') if [ -f $SE/bin/se -a -f $SE/examples/vader.se ]; then if [ -f /tmp/.vader_pid ]; then p=`cat /tmp/.vader_pid` /bin/ps -p $p > /dev/null if [ $? -eq 1 ]; then /bin/rm -f /tmp/.vader_pid else echo 'Do not fail me again!' exit fi fi echo 'Do not fail me again! PFFFF. HHHH.' $SE/bin/se -o- $VADER | $SE/bin/se -n -tVADER & pid=$! echo $pid > /tmp/.vader_pid fi ;; 'stop') if [ -f /tmp/.vader_pid ]; then kill `cat /tmp/.vader_pid` else if [ -x /bin/pkill ]; then pkill -f VADER else id=`/bin/ps -ef | /bin/grep VADER | /bin/grep -v grep | /bin/awk '{print $2}'` if [ -n "$id" ]; then kill $id fi fi fi ;; *) echo "Usage: $0 { start | stop }" exit 1 ;; esac exit 0 07070100331355000081a4000000000000000100000001344643970000078f000000880000000400000000000000000000001d00000005reloc/RICHPse/etc/se-mode.el;;; se-mode.el --- minor mode for editing SE Toolkit interpreter files in Emacs ;;; Author: Rajesh Godbole ;;; version: 1.01 Wed Oct 15 16:36:12 PDT 1997 ;;; Borrowed from cc-mode of [x]emacs ;;; A major mode for editing SE Toolkit interpreter files. When you have ;;; entered SE mode, you may get more info by pressing C-h m. You may ;;; also get online help describing various functions by: C-h f ;;; #include #include #include #include /* for the options */ #define CPU_SYSINFO (1 << 0) #define DISK_INFO (1 << 1) #define NETWORK_INFO (1 << 2) #define SYSMISC_INFO (1 << 3) #define CPU_VMINFO (1 << 4) #define RPC_CLIENT_INFO (1 << 5) #define RPC_SERVER_INFO (1 << 6) #define SEGMAP_INFO (1 << 7) #define BUFFER_CACHE_INFO (1 << 8) #define STREAMS_INFO (1 << 9) #define INODE_CACHE_INFO (1 << 10) #define NFS_SERVER_INFO (1 << 11) #define NFS_CLIENT_INFO (1 << 12) #define INT_INFO (1 << 13) #define SYSINFO_INFO (1 << 14) #define VMINFO_INFO (1 << 15) #define DNLC_INFO (1 << 16) #define FLUSH_INFO (1 << 17) #define VAR_INFO (1 << 18) #define LINE_WIDTH 76 usage(string program) { fprintf(stderr, #if MINOR_VERSION < 40 "Use: %s [-abcdefghijklmnopqrstuxy] [-[w|z] interval] command [args]\n", #else "Use: %s [-abcdefghijlmnopqrstuxy] [-[w|z] interval] command [args]\n", #endif program); fputs( " -a All Info\n", stderr); fputs( " -b Misc System Info\n", stderr); fputs( " -c CPU System Info\n", stderr); fputs( " -d CPU VM Info\n", stderr); fputs( " -e Disk Info\n", stderr); fputs( " -f Network Info\n", stderr); fputs( " -g RPC Client Info\n", stderr); fputs( " -h RPC Server Info\n", stderr); fputs( " -i NFS Client Info\n", stderr); fputs( " -j NFS Server Info\n", stderr); #if MINOR_VERSION < 40 fputs( " -k Streams Info\n", stderr); #endif fputs( " -l Segment Map Info\n", stderr); fputs( " -m Buffer Cache Info\n", stderr); fputs( " -n Inode Cache Info\n", stderr); fputs( " -o Interrupt Info\n", stderr); fputs( " -p Process Info\n", stderr); fputs( " -q Memory Info\n", stderr); fputs( " -s DNLC Info\n", stderr); fputs( " -t VAC Flush Info\n", stderr); fputs( " -u System Variables Info\n", stderr); fputs( " -v Generate Continuous Running Info\n", stderr); fputs( " -w Pause for interval Seconds When Running\n", stderr); fputs( " -x Give totals\n", stderr); fputs( " -y Don't prompt for input\n", stderr); fputs( " -z Snapshot for interval Seconds\n", stderr); exit(1); } banner(string name) { int i; int n; int each; char left[LINE_WIDTH]; char right[LINE_WIDTH]; string extra; n = strlen(name); if (n == 0) { extra = ""; } else { extra = "\n"; if ((n % 2) != 0) { extra = "\n-"; } } each = (LINE_WIDTH - n) / 2; for(i=0; i 0) { rate = (calls * 100.0) / total; } else { rate = 0; } printf(format, calls, rate); } main(int argc, string argv[]) { int c; int options = 0; int interval = APP_STATS; int prompt = 1; int delay; if (argc < 2) { usage(argv[0]); } opterr = 0; for(;;) { c = getopt(argc, argv, "abcdefghijklmnopqrstuvw:xyz:"); if (c == -1) { break; } switch(c) { case 'a': options = (CPU_SYSINFO | DISK_INFO | NETWORK_INFO | SYSMISC_INFO | CPU_VMINFO | RPC_CLIENT_INFO | RPC_SERVER_INFO | SEGMAP_INFO | BUFFER_CACHE_INFO | STREAMS_INFO | INODE_CACHE_INFO | NFS_SERVER_INFO | NFS_CLIENT_INFO | INT_INFO | SYSINFO_INFO | VMINFO_INFO | DNLC_INFO | FLUSH_INFO | VAR_INFO); break; case 'b': options |= SYSMISC_INFO; break; case 'c': options |= CPU_SYSINFO; break; case 'd': options |= CPU_VMINFO; break; case 'e': options |= DISK_INFO; break; case 'f': options |= NETWORK_INFO; break; case 'g': options |= RPC_CLIENT_INFO; break; case 'h': options |= RPC_SERVER_INFO; break; case 'i': options |= NFS_CLIENT_INFO; break; case 'j': options |= NFS_SERVER_INFO; break; #if MINOR_VERSION < 40 case 'k': options |= STREAMS_INFO; break; #endif case 'l': options |= SEGMAP_INFO; break; case 'm': options |= BUFFER_CACHE_INFO; break; case 'n': options |= INODE_CACHE_INFO; break; case 'o': options |= INT_INFO; break; case 'p': options |= SYSINFO_INFO; break; case 'q': options |= VMINFO_INFO; break; case 's': options |= DNLC_INFO; break; case 't': options |= FLUSH_INFO; break; case 'u': options |= VAR_INFO; break; case 'v': interval = APP_RUNNING; break; case 'w': delay = atoi(optarg); break; case 'x': interval = APP_TOTALS; break; case 'y': prompt = 0; break; case 'z': interval = atoi(optarg); break; default: usage(argv[0]); break; } } if ((interval == APP_STATS) && (optind >= argc)) { usage(argv[0]); } if ((argc - optind) >= MAX_ARG) { fprintf(stderr, "%s: too many args (max %d)\n", argv[0], MAX_ARG); exit(1); } go_for_it(argc, argv, options, interval, delay, prompt); } go_for_it(int argc, string argv[], int options, int interval, int delay, int prompt) { char buf[2]; char time_buf[64]; int i; int clock; int hz = sysconf(_SC_CLK_TCK); long n; ulong read_writes; ulong total; string processor; string p; double hr_etime; double avg_wait; double avg_run; double svc_time; double wait_pct; double run_pct; double rate; app_wrapper cmd; utsname_t ubuf[1]; ks_system_misc kstat$misc; ks_cpu_syswait kstat$cpu; /* it's the smallest structure */ processor_info_t pinfo[1]; mib2_tcp_t mib$tcp; mib2_tcp_t tmp_tcp; disk_info_t info; for(i=optind; i ", stdout); if (fgets(buf, sizeof(buf), stdin) == nil) { exit(0); } puts("Running..."); } refresh$(cmd); if (cmd.status != 0) { printf("\nNOTE: The command exited with %d\n\n", WEXITSTATUS(cmd.status)); } do { if (interval == APP_RUNNING) { sleep(delay); refresh$(cmd); } if ((options & SYSMISC_INFO) != 0) { banner(" System Misc Summary "); uname(ubuf); n = time(0) - (kstat$misc.clk_intr / hz); for(i = 0; i < MAX_CPU; i++) { kstat$cpu.number$ = i; if (kstat$cpu.number$ != -1) { break; } } if (i == MAX_CPU) { processor = "pdp/11"; /* And running Version 6, no less. :-) */ clock = 2; } else { processor_info(kstat$cpu.instance$, pinfo); processor = pinfo[0].pi_processor_type; clock = pinfo[0].pi_clock; } strftime(time_buf, sizeof(time_buf), "%A %B %e, %Y at %l:%M %p", localtime(&n)); printf("System boot time : %s\n", time_buf); printf("OS Release Version : %s %s %s\n", ubuf[0].sysname, ubuf[0].release, ubuf[0].version); printf("Host name : %s\n", ubuf[0].nodename); printf("Architecture : %s\n", ubuf[0].machine); printf("Processor : %s %d MHz\n", processor, clock); printf("CPUs Configured : %d\n", sysconf(_SC_NPROCESSORS_CONF)); printf("CPUs Online : %d\n", sysconf(_SC_NPROCESSORS_ONLN)); printf("Deficit : %u\n", cmd.system_misc_values.deficit); printf("VAC : %u\n", cmd.system_misc_values.vac); #if MINOR_VERSION < 40 printf("Number of Open Files : %u\n", cmd.system_misc_values.filecnt); #endif printf("Number of Processes : %u\n", cmd.system_misc_values.nproc); printf("Ave. # procs runnable in past 1 min : %4.2f\n", cmd.avenrun_1min); printf("Ave. # procs runnable in past 5 mins : %4.2f\n", cmd.avenrun_5min); printf("Ave. # procs runnable in past 15 mins : %4.2f\n", cmd.avenrun_15min); printf("Clock ticks : %d\n", cmd.system_misc_values.clk_intr); banner(""); } if ((options & CPU_VMINFO) != 0) { banner(" CPU VM Info Summary "); printf("Page reclaims : %u\n", cmd.cpu_vminfo_values.pgrec); printf("Page reclaims from free list : %u\n", cmd.cpu_vminfo_values.pgfrec); printf("Page-ins : %u\n", cmd.cpu_vminfo_values.pgin); printf("Pages paged in : %u\n", cmd.cpu_vminfo_values.pgpgin); printf("Page-outs : %u\n", cmd.cpu_vminfo_values.pgout); printf("Pages paged out : %u\n", cmd.cpu_vminfo_values.pgpgout); printf("Swap-ins : %u\n", cmd.cpu_vminfo_values.swapin); printf("Pages swapped in : %u\n", cmd.cpu_vminfo_values.pgswapin); printf("Swap-outs : %u\n", cmd.cpu_vminfo_values.swapout); printf("Pages swapped out : %u\n", cmd.cpu_vminfo_values.pgswapout); printf("Pages zero filled on demand : %u\n", cmd.cpu_vminfo_values.zfod); printf("Pages freed by daemon or auto : %u\n", cmd.cpu_vminfo_values.dfree); printf("Pages exam. by pageout daemon : %u\n", cmd.cpu_vminfo_values.scan); printf("Revs. of the page daemon hand : %u\n", cmd.cpu_vminfo_values.rev); printf("Minor hat_fault()s : %u\n", cmd.cpu_vminfo_values.hat_fault); printf("Minor as_fault()s : %u\n", cmd.cpu_vminfo_values.as_fault); printf("Major page faults : %u\n", cmd.cpu_vminfo_values.maj_fault); printf("Copy-on-write faults : %u\n", cmd.cpu_vminfo_values.cow_fault); printf("Protection faults : %u\n", cmd.cpu_vminfo_values.prot_fault); printf("Faults due to sftwre lock req : %u\n", cmd.cpu_vminfo_values.softlock); printf("As_fault()s in kernel space : %u\n", cmd.cpu_vminfo_values.kernel_asflt); printf("Times pager scheduled : %u\n", cmd.cpu_vminfo_values.pgrrun); banner(""); } if ((options & CPU_SYSINFO) != 0) { banner(" CPU System Info Summary "); printf("Idle time : %4.2f %%\n", cmd.idle_time); printf("User time : %4.2f %%\n", cmd.user_time); printf("System time : %4.2f %%\n", cmd.system_time); printf("Wait time : %4.2f %%\n", cmd.wait_time); printf(" I/O Wait time : %4.2f %%\n", cmd.io_wait_time); printf(" Swap Wait time : %4.2f %%\n", cmd.swap_wait_time); printf(" Programmed I/O Wait time : %4.2f %%\n", cmd.pio_wait_time); printf("Physical block reads : %u\n", cmd.cpu_sysinfo_values.bread); printf("Physical block writes (sync+async) : %u\n", cmd.cpu_sysinfo_values.bwrite); printf("Logical block reads : %u\n", cmd.cpu_sysinfo_values.lread); printf("Logical block writes : %u\n", cmd.cpu_sysinfo_values.lwrite); printf("Raw I/O reads : %u\n", cmd.cpu_sysinfo_values.phread); printf("Raw I/O writes : %u\n", cmd.cpu_sysinfo_values.phwrite); printf("Context switches : %u\n", cmd.cpu_sysinfo_values.pswitch); printf("Traps : %u\n", cmd.cpu_sysinfo_values.trap); printf("Device interrupts : %u\n", cmd.cpu_sysinfo_values.intr); printf("System calls : %u\n", cmd.cpu_sysinfo_values.syscall); printf("Read() + readv() system calls : %u\n", cmd.cpu_sysinfo_values.sysread); printf("Write() + writev() system calls : %u\n", cmd.cpu_sysinfo_values.syswrite); printf("Forks : %u\n", cmd.cpu_sysinfo_values.sysfork); printf("Vforks : %u\n", cmd.cpu_sysinfo_values.sysvfork); printf("Execs : %u\n", cmd.cpu_sysinfo_values.sysexec); printf("Bytes read by rdwr() : %u\n", cmd.cpu_sysinfo_values.readch); printf("Bytes written by rdwr() : %u\n", cmd.cpu_sysinfo_values.writech); printf("Terminal input characters : %u\n", cmd.cpu_sysinfo_values.rawch); printf("Chars handled in canonical mode : %u\n", cmd.cpu_sysinfo_values.canch); printf("Terminal output characters : %u\n", cmd.cpu_sysinfo_values.outch); printf("Msg count (msgrcv()+msgsnd() calls) : %u\n", cmd.cpu_sysinfo_values.msg); printf("Semaphore ops count (semop() calls) : %u\n", cmd.cpu_sysinfo_values.sema); printf("Pathname lookups : %u\n", cmd.cpu_sysinfo_values.namei); printf("Ufs_iget() calls : %u\n", cmd.cpu_sysinfo_values.ufsiget); printf("Directory blocks read : %u\n", cmd.cpu_sysinfo_values.ufsdirblk); printf("Inodes taken with attached pages : %u\n", cmd.cpu_sysinfo_values.ufsipage); printf("Inodes taken with no attached pages : %u\n", cmd.cpu_sysinfo_values.ufsinopage); printf("Inode table overflows : %u\n", cmd.cpu_sysinfo_values.inodeovf); printf("File table overflows : %u\n", cmd.cpu_sysinfo_values.fileovf); printf("Proc table overflows : %u\n", cmd.cpu_sysinfo_values.procovf); printf("Interrupts as threads (below clock) : %u\n", cmd.cpu_sysinfo_values.intrthread); printf("Intrs blkd/prempted/released (swtch) : %u\n", cmd.cpu_sysinfo_values.intrblk); printf("Times idle thread scheduled : %u\n", cmd.cpu_sysinfo_values.idlethread); printf("Involuntary context switches : %u\n", cmd.cpu_sysinfo_values.inv_swtch); printf("Thread_create()s : %u\n", cmd.cpu_sysinfo_values.nthreads); printf("Cpu migrations by threads : %u\n", cmd.cpu_sysinfo_values.cpumigrate); printf("Xcalls to other cpus : %u\n", cmd.cpu_sysinfo_values.xcalls); printf("Failed mutex enters (adaptive) : %u\n", cmd.cpu_sysinfo_values.mutex_adenters); printf("Rw reader failures : %u\n", cmd.cpu_sysinfo_values.rw_rdfails); printf("Rw writer failures : %u\n", cmd.cpu_sysinfo_values.rw_wrfails); printf("Times loadable module loaded : %u\n", cmd.cpu_sysinfo_values.modload); printf("Times loadable module unloaded : %u\n", cmd.cpu_sysinfo_values.modunload); printf("Physical block writes (async) : %u\n", cmd.cpu_sysinfo_values.bawrite); banner(""); } if ((options & DISK_INFO) != 0) { banner(" Disk Info Summary "); if (setup_diskinfo_inst() == 0) { printf("couldn't map disk instances\n"); } if (setup_diskinfo_part() == 0) { printf("couldn't obtain disk partition usage\n"); } for(i=0; i 0) { svc_time = ((avg_wait + avg_run) * 1000.0) / read_writes; } else { svc_time = 0.0; } printf("Average service time (milliseconds) : %4.2f\n", svc_time); /* these values are meaningless when computed as totals */ if (interval == APP_TOTALS) { hr_etime = cmd.disk_values[i].wlastupdate; } wait_pct = (cmd.disk_values[i].wtime * 100.0) / hr_etime; run_pct = (cmd.disk_values[i].rtime * 100.0) / hr_etime; printf("%% of time spent waiting for service : %4.2f\n", wait_pct); printf("%% of time spent busy : %4.2f\n", run_pct); if (i < (cmd.disk_count - 1)) { puts(""); } } banner(""); } if ((options & NETWORK_INFO) != 0) { tmp_tcp = mib$tcp; banner(" Network Info Summary "); printf("Total TCP segments output : %u\n", tmp_tcp.tcpOutSegs); printf("Number of TCP segments retransmitted : %u\n", tmp_tcp.tcpRetransSegs); if (tmp_tcp.tcpRetransSegs > 0) { rate = (tmp_tcp.tcpRetransSegs * 100.0) / tmp_tcp.tcpOutSegs; } else { rate = 0; } printf("TCP segment retransmission rate : %4.2f %%\n\n", rate); for(i=0; i 0) { rate = (cmd.buffer_cache_values.buffer_cache_hits * 100.0) / cmd.buffer_cache_values.buffer_cache_lookups; } else { rate = 0; } printf("Buffer cache hit rate : %4.2f %%\n", rate); banner(""); } #if MINOR_VERSION < 40 if ((options & STREAMS_INFO) != 0) { banner(" Streams Info Summary "); printf("Stream count : %u\n", cmd.streams_values.strcount); printf("Msgblock use : %u\n", cmd.streams_values.msgblock_use); printf("Msgblock total : %u\n", cmd.streams_values.msgblock_total); printf("Msgblock max : %u\n", cmd.streams_values.msgblock_max); printf("Msgblock fail : %u\n", cmd.streams_values.msgblock_fail); printf("Stream use : %u\n", cmd.streams_values.stream_use); printf("Stream total : %u\n", cmd.streams_values.stream_total); printf("Stream max : %u\n", cmd.streams_values.stream_max); printf("Stream fail : %u\n", cmd.streams_values.stream_fail); printf("Queue use : %u\n", cmd.streams_values.queue_use); printf("Queue total : %u\n", cmd.streams_values.queue_total); printf("Queue max : %u\n", cmd.streams_values.queue_max); printf("Queue fail : %u\n", cmd.streams_values.queue_fail); printf("Linkblk use : %u\n", cmd.streams_values.linkblk_use); printf("Linkblk total : %u\n", cmd.streams_values.linkblk_total); printf("Linkblk max : %u\n", cmd.streams_values.linkblk_max); printf("Linkblk fail : %u\n", cmd.streams_values.linkblk_fail); printf("Strevent use : %u\n", cmd.streams_values.strevent_use); printf("Strevent total : %u\n", cmd.streams_values.strevent_total); printf("Strevent max : %u\n", cmd.streams_values.strevent_max); printf("Strevent fail : %u\n", cmd.streams_values.strevent_fail); printf("Strcallbparams use : %u\n", cmd.streams_values.strcallbparams_use); printf("Strcallbparams total : %u\n", cmd.streams_values.strcallbparams_total); printf("Strcallbparams max : %u\n", cmd.streams_values.strcallbparams_max); printf("Strcallbparams fail : %u\n", cmd.streams_values.strcallbparams_fail); banner(""); } #endif if ((options & INODE_CACHE_INFO) != 0) { banner(" Inode Cache Info Summary "); printf("Cache size : %u\n", cmd.inode_cache_values.size); printf("Max size : %u\n", cmd.inode_cache_values.maxsize); printf("Hits : %u\n", cmd.inode_cache_values.hits); printf("Misses : %u\n", cmd.inode_cache_values.misses); #if MINOR_VERSION < 60 printf("Mallocs : %u\n", cmd.inode_cache_values.mallocs); printf("Frees : %u\n", cmd.inode_cache_values.frees); #else printf("Kmem_allocs : %u\n", cmd.inode_cache_values.kmem_allocs); printf("Kmem_frees : %u\n", cmd.inode_cache_values.kmem_frees); #endif printf("Maxsize reached : %u\n", cmd.inode_cache_values.maxsize_reached); printf("Puts at frontlist : %u\n", cmd.inode_cache_values.puts_at_frontlist); printf("Puts at backlist : %u\n", cmd.inode_cache_values.puts_at_backlist); #if MINOR_VERSION < 40 printf("Dnlc looks : %u\n", cmd.inode_cache_values.dnlc_looks); printf("Dnlc purges : %u\n", cmd.inode_cache_values.dnlc_purges); #else printf("Queues to free : %u\n", cmd.inode_cache_values.queues_to_free); printf("Scans : %u\n", cmd.inode_cache_values.scans); #endif total = (cmd.inode_cache_values.hits + cmd.inode_cache_values.misses); if (total > 0) { rate = (cmd.inode_cache_values.hits * 100.0) / total; } else { rate = 0; } printf("Hit rate : %4.2f %%\n", rate); banner(""); } if ((options & NFS_SERVER_INFO) != 0) { banner(" NFS Version 2 Server Calls Info Summary "); total = cmd.nfs_server_values.calls + cmd.nfs_server_values.badcalls; printf("Calls : %u\n", cmd.nfs_server_values.calls); printf("Badcalls : %u\n", cmd.nfs_server_values.badcalls); rate_print("Null : %-5u (%5.2f %%)\n", cmd.rfs_server_values.null, total); rate_print("Getattr : %-5u (%5.2f %%)\n", cmd.rfs_server_values.getattr, total); rate_print("Setattr : %-5u (%5.2f %%)\n", cmd.rfs_server_values.setattr, total); rate_print("Root : %-5u (%5.2f %%)\n", cmd.rfs_server_values.root, total); rate_print("Lookup : %-5u (%5.2f %%)\n", cmd.rfs_server_values.lookup, total); rate_print("Readlink : %-5u (%5.2f %%)\n", cmd.rfs_server_values.readlink, total); rate_print("Read : %-5u (%5.2f %%)\n", cmd.rfs_server_values.read, total); rate_print("Wrcache : %-5u (%5.2f %%)\n", cmd.rfs_server_values.wrcache, total); rate_print("Write : %-5u (%5.2f %%)\n", cmd.rfs_server_values.write, total); rate_print("Create : %-5u (%5.2f %%)\n", cmd.rfs_server_values.create, total); rate_print("Remove : %-5u (%5.2f %%)\n", cmd.rfs_server_values.remove, total); rate_print("Rename : %-5u (%5.2f %%)\n", cmd.rfs_server_values.rename, total); rate_print("Link : %-5u (%5.2f %%)\n", cmd.rfs_server_values.link, total); rate_print("Symlink : %-5u (%5.2f %%)\n", cmd.rfs_server_values.symlink, total); rate_print("Mkdir : %-5u (%5.2f %%)\n", cmd.rfs_server_values.mkdir, total); rate_print("Rmdir : %-5u (%5.2f %%)\n", cmd.rfs_server_values.rmdir, total); rate_print("Readdir : %-5u (%5.2f %%)\n", cmd.rfs_server_values.readdir, total); rate_print("Statfs : %-5u (%5.2f %%)\n", cmd.rfs_server_values.statfs, total); #if MINOR_VERSION >= 50 banner(" NFS Version 3 Server Calls Info Summary "); rate_print("Null : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.null, total); rate_print("Getattr : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.getattr, total); rate_print("Setattr : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.setattr, total); rate_print("Lookup : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.lookup, total); rate_print("Access : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.access, total); rate_print("Readlink : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.readlink, total); rate_print("Read : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.read, total); rate_print("Write : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.write, total); rate_print("Create : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.create, total); rate_print("Mkdir : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.mkdir, total); rate_print("Symlink : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.symlink, total); rate_print("Mknod : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.mknod, total); rate_print("Remove : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.remove, total); rate_print("Rmdir : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.rmdir, total); rate_print("Rename : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.rename, total); rate_print("Link : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.link, total); rate_print("Readdir : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.readdir, total); rate_print("Readdirplus : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.readdirplus, total); rate_print("Fsstat : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.fsstat, total); rate_print("Fsinfo : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.fsinfo, total); rate_print("Pathconf : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.pathconf, total); rate_print("Commit : %-5u (%5.2f %%)\n", cmd.rfs3_server_values.commit, total); #endif banner(""); } if ((options & NFS_CLIENT_INFO) != 0) { banner(" NFS Version 2 Client Calls Info Summary "); total = cmd.nfs_client_values.calls + cmd.nfs_client_values.badcalls; #if MINOR_VERSION < 40 printf("Calls : %u\n", cmd.nfs_client_values.calls); printf("Badcalls : %u\n", cmd.nfs_client_values.badcalls); printf("Cltoomany : %u\n", cmd.nfs_client_values.cltoomany); printf("Clgets : %u\n", cmd.nfs_client_values.clgets); rate_print("Null : %-5u (%5.2f %%)\n", cmd.nfs_client_values.null, total); rate_print("Getattr : %-5u (%5.2f %%)\n", cmd.nfs_client_values.getattr, total); rate_print("Setattr : %-5u (%5.2f %%)\n", cmd.nfs_client_values.setattr, total); rate_print("Root : %-5u (%5.2f %%)\n", cmd.nfs_client_values.root, total); rate_print("Lookup : %-5u (%5.2f %%)\n", cmd.nfs_client_values.lookup, total); rate_print("Readlink : %-5u (%5.2f %%)\n", cmd.nfs_client_values.readlink, total); rate_print("Read : %-5u (%5.2f %%)\n", cmd.nfs_client_values.read, total); rate_print("Wrcache : %-5u (%5.2f %%)\n", cmd.nfs_client_values.wrcache, total); rate_print("Write : %-5u (%5.2f %%)\n", cmd.nfs_client_values.write, total); rate_print("Create : %-5u (%5.2f %%)\n", cmd.nfs_client_values.create, total); rate_print("Remove : %-5u (%5.2f %%)\n", cmd.nfs_client_values.remove, total); rate_print("Rename : %-5u (%5.2f %%)\n", cmd.nfs_client_values.rename, total); rate_print("Link : %-5u (%5.2f %%)\n", cmd.nfs_client_values.link, total); rate_print("Symlink : %-5u (%5.2f %%)\n", cmd.nfs_client_values.symlink, total); rate_print("Mkdir : %-5u (%5.2f %%)\n", cmd.nfs_client_values.mkdir, total); rate_print("Rmdir : %-5u (%5.2f %%)\n", cmd.nfs_client_values.rmdir, total); rate_print("Readdir : %-5u (%5.2f %%)\n", cmd.nfs_client_values.readdir, total); rate_print("Statfs : %-5u (%5.2f %%)\n", cmd.nfs_client_values.statfs, total); #else printf("Calls : %u\n", cmd.nfs_client_values.calls); printf("Badcalls : %u\n", cmd.nfs_client_values.badcalls); printf("Clgets : %u\n", cmd.nfs_client_values.clgets); printf("Cltoomany : %u\n", cmd.nfs_client_values.cltoomany); rate_print("Null : %-5u (%5.2f %%)\n", cmd.rfs_client_values.null, total); rate_print("Getattr : %-5u (%5.2f %%)\n", cmd.rfs_client_values.getattr, total); rate_print("Setattr : %-5u (%5.2f %%)\n", cmd.rfs_client_values.setattr, total); rate_print("Root : %-5u (%5.2f %%)\n", cmd.rfs_client_values.root, total); rate_print("Lookup : %-5u (%5.2f %%)\n", cmd.rfs_client_values.lookup, total); rate_print("Readlink : %-5u (%5.2f %%)\n", cmd.rfs_client_values.readlink, total); rate_print("Read : %-5u (%5.2f %%)\n", cmd.rfs_client_values.read, total); rate_print("Wrcache : %-5u (%5.2f %%)\n", cmd.rfs_client_values.wrcache, total); rate_print("Write : %-5u (%5.2f %%)\n", cmd.rfs_client_values.write, total); rate_print("Create : %-5u (%5.2f %%)\n", cmd.rfs_client_values.create, total); rate_print("Remove : %-5u (%5.2f %%)\n", cmd.rfs_client_values.remove, total); rate_print("Rename : %-5u (%5.2f %%)\n", cmd.rfs_client_values.rename, total); rate_print("Link : %-5u (%5.2f %%)\n", cmd.rfs_client_values.link, total); rate_print("Symlink : %-5u (%5.2f %%)\n", cmd.rfs_client_values.symlink, total); rate_print("Mkdir : %-5u (%5.2f %%)\n", cmd.rfs_client_values.mkdir, total); rate_print("Rmdir : %-5u (%5.2f %%)\n", cmd.rfs_client_values.rmdir, total); rate_print("Readdir : %-5u (%5.2f %%)\n", cmd.rfs_client_values.readdir, total); rate_print("Statfs : %-5u (%5.2f %%)\n", cmd.rfs_client_values.statfs, total); #endif #if MINOR_VERSION >= 50 banner(" NFS Version 3 Client Calls Info Summary "); rate_print("Null : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.null, total); rate_print("Getattr : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.getattr, total); rate_print("Setattr : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.setattr, total); rate_print("Lookup : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.lookup, total); rate_print("Access : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.access, total); rate_print("Readlink : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.readlink, total); rate_print("Read : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.read, total); rate_print("Write : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.write, total); rate_print("Create : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.create, total); rate_print("Mkdir : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.mkdir, total); rate_print("Symlink : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.symlink, total); rate_print("Mknod : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.mknod, total); rate_print("Remove : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.remove, total); rate_print("Rmdir : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.rmdir, total); rate_print("Rename : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.rename, total); rate_print("Link : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.link, total); rate_print("Readdir : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.readdir, total); rate_print("Readdirplus : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.readdirplus, total); rate_print("Fsstat : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.fsstat, total); rate_print("Fsinfo : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.fsinfo, total); rate_print("Pathconf : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.pathconf, total); rate_print("Commit : %-5u (%5.2f %%)\n", cmd.rfs3_client_values.commit, total); #endif banner(""); } if ((options & INT_INFO) != 0) { banner(" Interrupt Info Summary "); for(i=0; i 0) { rate = (cmd.dnlc_values.hits * 100.0) / total; } else { rate = 0; } printf("Hit rate : %4.2f %%\n", rate); banner(""); } if ((options & FLUSH_INFO) != 0) { banner(" VAC Flush Summary "); printf("Context flushes : %u\n", cmd.flush_values.f_ctx); printf("Segment flushes : %u\n", cmd.flush_values.f_segment); printf("Complete page flushes : %u\n", cmd.flush_values.f_page); printf("Partial page flushes : %u\n", cmd.flush_values.f_partial); printf("Non-supervisor flushes : %u\n", cmd.flush_values.f_usr); printf("Region flushes : %u\n", cmd.flush_values.f_region); banner(""); } if ((options & VAR_INFO) != 0) { banner(" System Variables Summary "); printf("Number of I/O buffers : %u\n", cmd.var_values.v_buf); printf("Number of callout entries : %u\n", cmd.var_values.v_call); printf("Maximum number of processes system-wide : %u\n", cmd.var_values.v_proc); printf("Number of global scheduler priorities : %u\n", cmd.var_values.v_nglobpris); printf("Maximum global priority (system class) : %u\n", cmd.var_values.v_maxsyspri); printf("Number of clists allocated : %u\n", cmd.var_values.v_clist); printf("Maximum number of processes per user : %u\n", cmd.var_values.v_maxup); printf("Number of hash buffers to allocate : %u\n", cmd.var_values.v_hbuf); printf("Hash mask for buffers : %u\n", cmd.var_values.v_hmask); printf("Number of physical I/O buffers : %u\n", cmd.var_values.v_pbuf); printf("Size of the page table map : %u\n", cmd.var_values.v_sptmap); printf("Maximum physical memory to use : %u\n", cmd.var_values.v_maxpmem); printf("Delayed write buffer maximum age : %u\n", cmd.var_values.v_autoup); printf("Buffer cache high-water-mark : %u\n", cmd.var_values.v_bufhwm); #if MINOR_VERSION < 70 printf("Number of XENIX shared data segments : %u\n", cmd.var_values.v_xsdsegs); printf("Number of xsdtab[] slots per segment : %u\n", cmd.var_values.v_xsdslots); #endif banner(""); } } while(interval == APP_RUNNING); } 07070100371455000081a400000000000000010000000141dc5ea300001a7d000000880000000400000000000000000000002500000005reloc/RICHPse/examples/bigbrother.se/* * Copyright (c) 1994 by Sun Microsystems, Inc. */ /* This program runs the live_rules and logs state changes to big brother Written by Adrian.Cockcroft@sun.com Copyright (c) 1995-2001, by Sun Microsystems, Inc. All Rights Reserved */ #define VERSION "1.2" /* must match latest version below. Version 1.2 08 Feb 02 Remapped colors Version 1.1 19 Dec 01 Added Util Data Version 1.0 19 Dec 01 New based on monlog.se Version 1.0 18 Sep 01 Use refresh$(), clean up. Version 0.9 26 Nov 97 Added TCP rule Version 0.8 14 May 95 Added new rules Version 0.7 21 Feb 95 Created from live_test.se 0.7 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define SAMPLE_INTERVAL 120 /* 120 seconds to reduce entries in log */ #define IDENT "adrian" /* default syslog identifier string */ /* state as a string */ string state_bbstring(int state) { switch(state) { case ST_WHITE: return "green"; case ST_BLUE: return "green"; case ST_GREEN: return "green"; case ST_AMBER: return "green"; case ST_RED: return "yellow"; /* attention */ case ST_BLACK: return "red"; /* trouble */ default: return "clear"; /* unavailable */ } } main(int argc, string argv[3]) { lr_disk_t disk_rule; double busydisk; lr_net_t net_rule; lr_rpcclient_t rpcc_rule; lr_swapspace_t swap_rule; lr_ram_t ram_rule; lr_kmem_t kmem_rule; lr_cpu_t cpu_rule; lr_mutex_t mutex_rule; lr_dnlc_t dnlc_rule; lr_inode_t inode_rule; lr_tcp_t tcp_rule; int interval = SAMPLE_INTERVAL; string ident = IDENT; string bbhost; ulong ts; ulong lasttime; pointer_t alias_fp; string explanation; int current_state = -1; int old_current_state = -1; int i; #define HOSTNAMELEN 256 char hostname[HOSTNAMELEN]; // Before chewing up too much cpu time, let's see if we can quit. bbhost = getenv("BBHOST"); if (bbhost == nil) { printf("BBHOST environment variable must be set\n"); exit(1); } // initializing calls refresh$(disk_rule); refresh$(net_rule); refresh$(rpcc_rule); refresh$(swap_rule); refresh$(ram_rule); refresh$(kmem_rule); refresh$(cpu_rule); refresh$(mutex_rule); refresh$(dnlc_rule); refresh$(inode_rule); refresh$(tcp_rule); alias_fp=fopen("/opt/bb/etc/bbaliasname", "r"); if (alias_fp > 0 ) { fscanf(alias_fp,"%s",hostname); }; fclose(alias_fp); switch(argc) { case 1: break; case 2: interval = atoi(argv[1]); break; case 3: interval = atoi(argv[1]); ident = argv[2]; break; default: printf("use: %s [interval] [identifier]\n", argv[0]); exit(1); } ts = time(0); printf("\n%s version %s: Monitoring %s to %s as %s starting at %s", argv[0], VERSION, hostname, bbhost, ident, ctime(&ts)); fflush(stdout); for(;;) { sleep(interval); lasttime = ts; ts = time(0); explanation = ""; current_state = -1; refresh$(disk_rule); current_state = disk_rule.state; busydisk = 0.0; /* report the busiest disk */ for(i=0; i main() { int i; netif interface; for(refresh$(interface), i=0; i #include #include #include #include /* default sample count */ #define SAMPLE_COUNT 5 #define DO_UPDATE 1 #define DO_COMPUTE 2 #define CHECK_NONE 0 #define CHECK_CPU 1 #define CHECK_PS 2 /* how many processes is too many processes? */ #define PROC_HWM 100 int samples = SAMPLE_COUNT; do_cpu(int type, int action) { vmstat vm; ks_system_misc kstat$misc; int avg_user; int avg_system; int avg_idle; int avg_syscalls; int avg_interrupts; int avg_cswitches; int avg_page; int avg_swap; refresh$(vm); switch(type) { case DO_UPDATE: avg_user += vm.user_time; avg_system += vm.system_time; avg_idle += vm.idle_time; avg_syscalls += vm.system_calls; avg_interrupts += vm.interrupts; avg_cswitches += vm.context_switches; avg_page += vm.pages_out; avg_swap += vm.swapouts; break; case DO_COMPUTE: switch(action) { case CHECK_CPU: puts("Checking CPU times..."); avg_user /= samples; avg_system /= samples; avg_idle /= samples; avg_syscalls /= samples; avg_interrupts /= samples; avg_cswitches /= samples; /* if idle is low, see what's going on */ if (avg_idle < 15) { if (avg_system > 30) { if (avg_syscalls > 12300) { printf("\tHigh system call count: %d/second\n\n", avg_syscalls); } if (avg_cswitches > 1140) { printf("\tHigh context switch rate: %d/second\n\n", avg_cswitches); } if (avg_interrupts > 30) { printf("\tHigh interrupt rate: %d/second\n\n", avg_interrupts); } } if (avg_user > 70) { if (kstat$misc.nproc > (kstat$misc.ncpus * PROC_HWM)) { printf("\tHigh user time: %d %% with many processes.\n", avg_user); puts("\tMigrate to MP or use cron or priocntl.\n"); } else { printf("\tHigh user time: %d %% with few processes.\n", avg_user); puts("\tDivide processes into subprocesses,"); puts("\t\tprofile and optimize code.\n"); } } } /* reset */ avg_user = 0; avg_system = 0; avg_idle = 0; avg_syscalls = 0; avg_interrupts = 0; avg_cswitches = 0; break; case CHECK_PS: puts("Checking paging/swapping..."); avg_page /= samples; avg_swap /= samples; if (avg_page > 10) { printf("\tPage-outs occurring at: %d/second\n\n", avg_page); } if (avg_swap > 0) { printf("\tSwap-outs occurring at: %d/second\n\n", avg_swap); } /* reset */ avg_page = 0; avg_swap = 0; break; } break; } } int do_rps(p_iostat value, int type) { int rps[MAX_DISK]; int count; int i; switch(type) { case DO_UPDATE: if (count == samples) { for(i=0; i 30) { printf("\tDisk %s has %d more r-w/second than disk %s\n", disk_names[i], n, disk_names[j]); unbalanced = 1; } } } total_rps += avg_rps[i]; total_wps += avg_wps[i]; } if (unbalanced != 0) { puts("\tUnbalanced disk load. Try moving data or striping.\n"); } unbalanced = 0; for(i=0; i= 15) && (avg_wps[i] >= (5 * avg_rps[i]))) { printf("\tWrites/sec are %4.2f %% the reads/sec on disk %s\n", ((avg_wps[i] * 100.0) / avg_rps[i]), disk_names[i]); unbalanced = 1; } } if (unbalanced != 0) { puts("\tUnbalanced read/write load. Try adding PrestoServe.\n"); } if ((total_rps > 0) && (total_wps > (total_rps * 10))) { printf("\tTotal reads/second = %d total writes/second = %d\n\n", total_rps, total_wps); } break; } } do_dnlc() { ks_ncstats kstat$dnlc; ks_ncstats tmp_dnlc; double total; double hit_rate; puts("Checking DNLC hit rate..."); tmp_dnlc = kstat$dnlc; total = tmp_dnlc.hits + tmp_dnlc.misses + tmp_dnlc.long_look; hit_rate = (tmp_dnlc.hits * 100.0) / total; if (hit_rate < 80.0) { printf("\tDNLC hit rate is only %4.2f %%. Should be at least 80 %%.\n", hit_rate); puts("\tTry increasing ncsize in /etc/system. (See Appendix A of"); puts("\t\t\"Administering Security, Performance and Accounting).\"\n"); } hit_rate = (tmp_dnlc.long_look * 100.0) / total; if (hit_rate > 10.0) { printf("\tToo-long pathnames are %5.2f %% of total lookups.\n", hit_rate); printf("\tShould be no more than 10 %%.\n\n"); } } #define MAX_TOKS 128 string tokens[MAX_TOKS]; int string_break(string s) { string p; int n; n = 0; for(p=strtok(s, " "); p != nil; p=strtok(nil, " ")) { tokens[n++] = p; } tokens[n] = nil; return n; } string get_my_ip() { int fp = popen("netstat -in", "r"); string ip = nil; char buf[BUFSIZ]; if (fp == 0) { perror("popen"); exit(1); } while(fgets(buf, sizeof(buf), fp) != nil) { strcpy(strchr(buf, '\n'), ""); string_break(buf); if ((tokens[0] == "Name") || (tokens[0] == "lo0")) { continue; } if (ip != nil) { ip = nil; break; } ip = tokens[3]; } pclose(fp); return ip; } do_network() { ks_rpc_client kstat$client; ks_rpc_client tmp_client; ks_nfs_server kstat$nfs; ks_nfs_server tmp_nfs; ks_rfs_proc_v2 kstat$rfs; ks_rfs_proc_v2 tmp_rfs; mib2_ip_t mib$ip; netif interface; double ret_rate; double badx_rate; double getattr_rate; double readlink_rate; double read_rate; double write_rate; int i; int n; puts("Checking network condition..."); for(refresh$(interface), i=0; i 5.0) { printf("\tHigh collision rate on interface: %s ( %4.2f %% )\n", interface.name$, interface.collision_rate); puts("\tSubnet or check cabling.\n"); } if ((interface.ierrors > 0) || (interface.oerrors > 0)) { printf("\tErrors on interface: %s ", interface.name$); printf("(ierrors = %d oerrors = %d)\n\n", interface.ierrors, interface.oerrors); } } tmp_client = kstat$client; if (tmp_client.calls != 0) { ret_rate = (tmp_client.retrans * 100.0) / tmp_client.calls; badx_rate = (tmp_client.badxids * 100.0) / tmp_client.calls; if (ret_rate > 5.0) { printf("\tHigh rpc retransmission rate: %4.2f %%\n", ret_rate); puts("\tCheck routers and bridges for dropped packets."); puts( "\tTry decreasing rsize and wsize in vfstab to improve NFS client I/O.\n"); if (badx_rate > 5.0) { printf("\tBad server response time. (badxid is %4.2f %% of calls).\n", badx_rate); puts("\tTry increasing timeo in vfstab to improve NFS client I/O.\n"); } } } tmp_nfs = kstat$nfs; tmp_rfs = kstat$rfs; if (tmp_nfs.calls > 0) { getattr_rate = (tmp_rfs.getattr * 100.0) / tmp_nfs.calls; readlink_rate = (tmp_rfs.readlink * 100.0) / tmp_nfs.calls; read_rate = (tmp_rfs.read * 100.0) / tmp_nfs.calls; write_rate = (tmp_rfs.write * 100.0) / tmp_nfs.calls; if (getattr_rate > 35.0) { printf("\tHigh getattr rate: %4.2f %%\n", getattr_rate); puts("\tCheck actimeo in vfstab for client NFS I/O"); puts("\t\tand increase for read-only clients.\n"); } if (readlink_rate > 5.0) { printf("\tHigh readlink rate: %4.2f %%\n", readlink_rate); puts("\tCut down on number of symbolic links on client NFS mounts.\n"); } if (write_rate > 5.0) { printf("\tHigh percentage of NFS writes ( %4.2f %% ).\n", write_rate); puts("\tDo you have PrestoServe installed?\n"); } if (read_rate > 30.0) { printf("\tHigh percentage of NFS reads ( %4.2f %% ).\n", read_rate); puts("\tDo you have NC400 installed?\n"); } } n = mib$ip.udpInOverflows; if (n > 100) { printf("\tThere have been %d UDP input overruns.\n", n); puts("\tRe-evaluate the number of nfsd threads."); puts("\tDo you have NC400 and/or PrestoServe installed?\n"); } } usage(string program) { printf("Use: %s [-c] [-s count] [-i interval]\n", program); puts (" -c Continuous mode"); puts (" -s count Sample count"); puts (" -i interval Sleep time between samples"); exit(1); } main(int argc, string argv[]) { char time_buf[32]; int c; int i; int once = 1; int interval = 1; long n; opterr = 1; for(;;) { c = getopt(argc, argv, "cs:i:"); if (c == -1) { break; } switch(c) { case 'c': once = 0; break; case 's': samples = atoi(optarg); break; case 'i': interval = atoi(optarg); break; default: usage(argv[0]); break; } } for(;;) { n = time(0); strftime(time_buf, sizeof(time_buf), "%C", localtime(&n)); printf("\n-----------------------------------\n%s\n", time_buf); puts("-----------------------------------"); printf("Gathering information..."); fflush(stdout); for(i=0; i #include #include #include #include #define INITIAL_INTERVAL 2 #define BAR_WIDTH 100 #define BAR_HEIGHT 8 #define BAR_MIN 0 #define BAR_MAX 100 #define BAR_INDEX 1 #define LABEL_INDEX 2 #define SCALE_MIN 1 #define SCALE_MAX 30 #define SAMPLE_INTERVAL 2 #define CPU_METER_ICON "%s/examples/data/cpu_meter_icon" #define RICHP "%s/examples/data/richp" #define ST_MNBLUE ST_MIDNIGHTBLUE resource_t gui[9] = { // type fg bg label data cb cbd container { R_VFRAME }, { R_ROW, ST_WHITE, ST_WHITE, nil, "usr", nil, nil, "usr_row" }, { R_SEPARATOR, ST_WHITE, ST_WHITE }, { R_ROW, ST_WHITE, ST_WHITE, nil, "sys", nil, nil, "sys_row" }, { R_SEPARATOR, ST_WHITE, ST_WHITE }, { R_ROW, ST_WHITE, ST_WHITE, nil, "wait", nil, nil, "wait_row" }, { R_SEPARATOR, ST_WHITE, ST_WHITE }, { R_ROW, ST_WHITE, ST_WHITE, nil, "idle", nil, nil, "idle_row" }, { R_END } }; #define GUI gui[0] #define USR_ROW gui[1] #define SYS_ROW gui[3] #define WAIT_ROW gui[5] #define IDLE_ROW gui[7] resource_t usr[4] = { // type fg bg label data cb { R_BUTTON, ST_MNBLUE, ST_LIGHTGREY, "U", nil, "exit_cb" }, { R_HBAR, ST_AMBER, ST_WHITE }, { R_LABEL, ST_MNBLUE, ST_LIGHTGREY, "0000" }, { R_END } }; #define USR_BAR usr[1] resource_t sys[4] = { // type fg bg label data cb { R_BUTTON, ST_MNBLUE, ST_LIGHTGREY, "S", nil, "interval_cb" }, { R_HBAR, ST_RED, ST_WHITE }, { R_LABEL, ST_MNBLUE, ST_LIGHTGREY, "0000" }, { R_END } }; #define SYS_BAR sys[1] resource_t wait[4] = { // type fg bg label data cb { R_BUTTON, ST_MNBLUE, ST_LIGHTGREY, "W", nil, "richp_cb" }, { R_HBAR, ST_BLUE, ST_WHITE }, { R_LABEL, ST_MNBLUE, ST_LIGHTGREY, "0000" }, { R_END } }; #define WAIT_BAR wait[1] resource_t idle[4] = { // type fg bg label data cb { R_BUTTON, ST_MNBLUE, ST_LIGHTGREY, "I", nil, "richp_cb" }, { R_HBAR, ST_GREEN, ST_WHITE }, { R_LABEL, ST_MNBLUE, ST_LIGHTGREY, "0000" }, { R_END } }; #define IDLE_BAR idle[1] pointer_t cm_frame; pointer_t usr_row; pointer_t sys_row; pointer_t wait_row; pointer_t idle_row; int bar_width = BAR_WIDTH; int bar_height = BAR_HEIGHT; int main(int argc, string argv[]) { pointer_t icon; utsname_t u[1]; int c; while((c = getopt(argc, argv, "v")) != -1) { if (c == 'v') { GUI.r_type = R_HFRAME; USR_ROW.r_type = R_COLUMN; SYS_ROW.r_type = R_COLUMN; WAIT_ROW.r_type = R_COLUMN; IDLE_ROW.r_type = R_COLUMN; bar_width = BAR_HEIGHT; bar_height = BAR_WIDTH; USR_BAR.r_type = R_VBAR; SYS_BAR.r_type = R_VBAR; WAIT_BAR.r_type = R_VBAR; IDLE_BAR.r_type = R_VBAR; } else { fprintf(stderr, "Use: %s [-v]\n", argv[0]); return 1; } } usr[BAR_INDEX].r_data = gui_bar_data(bar_width, bar_height, BAR_MIN, BAR_MAX, 0); sys[BAR_INDEX].r_data = gui_bar_data(bar_width, bar_height, BAR_MIN, BAR_MAX, 0); wait[BAR_INDEX].r_data = gui_bar_data(bar_width, bar_height, BAR_MIN, BAR_MAX, 0); idle[BAR_INDEX].r_data = gui_bar_data(bar_width, bar_height, BAR_MIN, BAR_MAX, 0); // build the gui uname(u); argv[0] = sprintf("CPU: %s", u[0].nodename); cm_frame = gui_create_frame(argc, argv, gui); // load the bitmap icon = gui_load_bitmap( sprintf(CPU_METER_ICON, Se_basedir), ST_BLACK, ST_WHITE); gui_set_icon(icon, 0); // call "loop" every "interval" seconds gui_main_loop("loop", nil, INITIAL_INTERVAL); } loop(pointer_t handle, string client_data, string call_data) { vmstat vm; // new sample refresh$(vm); // update the gui usr[BAR_INDEX].r_data = gui_bar_data(bar_width, bar_height, BAR_MIN, BAR_MAX, vm.user_time); usr[LABEL_INDEX].r_label = sprintf("%3d%%", vm.user_time); sys[BAR_INDEX].r_data = gui_bar_data(bar_width, bar_height, BAR_MIN, BAR_MAX, vm.system_time); sys[LABEL_INDEX].r_label = sprintf("%3d%%", vm.system_time); wait[BAR_INDEX].r_data = gui_bar_data(bar_width, bar_height, BAR_MIN, BAR_MAX, vm.wait_time); wait[LABEL_INDEX].r_label = sprintf("%3d%%", vm.system_time); idle[BAR_INDEX].r_data = gui_bar_data(bar_width, bar_height, BAR_MIN, BAR_MAX, vm.idle_time); idle[LABEL_INDEX].r_label = sprintf("%3d%%", vm.idle_time); gui_update_group(usr_row, usr); gui_update_group(sys_row, sys); gui_update_group(wait_row, wait); gui_update_group(idle_row, idle); } // atta here exit_cb(pointer_t handle, string client_data, string call_data) { exit(0); } // popdown a popup cancel_cb(pointer_t handle, string client_data, string call_data) { pointer_t frame; frame = gui_get_frame(handle); gui_popdown_subframe(frame); } // scale slider callback int_cb(pointer_t handle, string client_data, string call_data) { gui_set_loop_interval("loop", call_data, atoi(call_data)); } // slider popup interval_cb(pointer_t handle, string client_data, string call_data) { resource_t menu[4] = { // type fg bg label data cb // { R_VFRAME }, { R_HSCALE, ST_MNBLUE, ST_LIGHTGREY, "Interval in Seconds", nil, "int_cb" }, { R_BUTTON, ST_MNBLUE, ST_LIGHTGREY, "Dismiss", nil, "cancel_cb" }, { R_END } }; #define SCALE_O menu[1] pointer_t frame; if (frame == 0) { SCALE_O.r_data = gui_scale_data(SCALE_MIN, SCALE_MAX, SAMPLE_INTERVAL); frame = gui_create_subframe("Set Interval", menu); } gui_popup_subframe(frame); } // slider popup richp_cb(pointer_t handle, string client_data, string call_data) { resource_t menu[4] = { // type fg bg label data cb // { R_HFRAME }, { R_BUTTON, ST_MNBLUE, ST_LIGHTGREY, nil, nil, "cancel_cb" }, { R_LABEL, ST_MNBLUE, ST_LIGHTGREY, "CPU Meter" }, { R_END } }; #define RICHP_O menu[1] pointer_t frame; RICHP_O.r_data = sprintf(RICHP, Se_basedir); if (frame == 0) { frame = gui_create_subframe("Richp Software", menu); } gui_popup_subframe(frame); } 07070100371459000081a400000000000000010000000141dc5ea30000094a000000880000000400000000000000000000002100000005reloc/RICHPse/examples/cpuchk.se /* test program for process_class.se - 10 Feb 98 Adrian */ /* sampled vs. measured CPU 12/5/98 */ #include #include #include #include #include #include #include /* need to use ioctl version of psinfo structure defined in proc.se */ #define PSINFO_IOCTL #include #include main(int argc, string argv[2]) { int interval; proc_class_t pp; char tm_buf[16]; int header; tm_t tmp_tm; double tmpd; double tmps; ulong tmp; int msac; double tot; double meas; double samp; double err; double tmperr; double maxerr; switch(argc) { case 1: interval = 10; break; case 2: interval = atoi(argv[1]); break; default: printf("usage: se cpuchk.se [interval]\n"); exit(1); } refresh$(pp); pp.action$ = PROC_ACTION_NEXT_INDEX; header = 1; for(;;) { refresh$(pp); /* first time ever or just after sleeping show time and header */ if (header == 1) { tmp = pp.lasttime; /* double to ulong */ tmp_tm = localtime(&tmp); /* time zone */ strftime(tm_buf, sizeof(tm_buf), "%T", tmp_tm); printf("\f%8s cpu time accuracy check proc %d new %d\n", tm_buf, pp.nproc, pp.newproc); header = 0; } if (pp.index$ == -1) { if (meas != 0.0) { err = err/meas; /* average absolute error */ tot = (samp-meas)/meas; /* error allowing for cancellation */ } printf("msac %4d meas %6.3f samp %6.3f err %6.2f%% abs %6.2f%% max %6.2f%%\n", msac, meas*100.0, samp*100.0, tot*100.0, err*100.0, maxerr*100.0); msac = 0; tot = 0.0; meas = 0.0; samp = 0.0; err = 0.0; maxerr = 0.0; fflush(stdout); sleep(interval); header = 1; } else { tmpd = (pp.user_time+pp.system_time+pp.trap_time)/pp.interval; /* only compare msacct enabled data */ if (pp.pid$ > 3) { msac++; tmps = pp.sampled_cpu/pp.interval; samp += tmps; meas += tmpd; if (tmps >= tmpd) { tmperr = tmps - tmpd; } else { tmperr = tmpd - tmps; } err += tmperr; if (tmpd > 0.0) { tmperr = tmperr/tmpd; } if (tmperr > maxerr) { maxerr = tmperr; } if (tmperr > 0.0) { printf("pid %5d meas %6.3f samp %6.3f err %6.2f%%\n", pp.pid$, tmpd*100.0, tmps*100.0, tmperr*100.0); } } } } } 0707010037145a000081a400000000000000010000000141dc5ea300000142000000880000000400000000000000000000001f00000005reloc/RICHPse/examples/cpus.se// // Copyright (c) 1993-2001 by Richard Pettit. All rights reserved. // #include main() { ks_cpu_info cpu; for(cpu.number$=0, refresh$(cpu); cpu.number$ != -1; cpu.number$++, refresh$(cpu)) { printf("cpu: %2d arch: %s clock: %d MHz\n", cpu.instance$, cpu.cpu_type, cpu.clock_MHz); } } 0707010037145b000081a400000000000000010000000141dc5ea3000006e5000000880000000400000000000000000000002200000005reloc/RICHPse/examples/cpustat.se/* * Copyright (c) 1994 by Sun Microsystems, Inc. * * Mangled further by Adrian 16 Dec 97 */ #include #include #include #include "p_vmstat_class.se" #define SAMPLE_INTERVAL 1 #define LOTS 10000 string hms_time() { ulong now; tm_t tm_now; char tm_buf[16]; now = time(0); tm_now = localtime(&now); strftime(tm_buf, sizeof(tm_buf), "%T", tm_now); return tm_buf; } main(int argc, string argv[3]) { p_vmstat vm; int interval = SAMPLE_INTERVAL; int iterations = LOTS; int i; long n; switch(argc) { case 1: break; case 2: interval = atoi(argv[1]); break; case 3: interval = atoi(argv[1]); iterations = atoi(argv[2]); break; default: printf("use: %s [interval] [count]\n", argv[0]); exit(1); } n = time(0); printf("%s %d second intervals starting at %s", argv[0],interval,ctime(&n)); for(; iterations > 0; iterations--) { sleep(interval); vm.number$ = 0; refresh$(vm); printf("\n%s swap %6dk freemem %6dk runq %3.1f biowaitq %3.1f\n", hms_time(), vm.swap_avail, vm.freemem, vm.runque, vm.waiting); puts("cpu pi po sr pr smtx in sy cs ics us sy id"); for(i=0; i 0) { /* already done for the first CPU */ vm.number$ = i; refresh$(vm); } if (vm.number$ == -1) { break; /* ran out of CPUs */ } printf( "%2d %5.0f %5.0f %4.0f %4.1f %4.0f %5.0f %5.0f %5.0f %5.0f %4.1f %4.1f %4.1f\n", i, vm.pages_in, vm.pages_out, vm.scan, vm.pgrrun, vm.smtx, vm.interrupts, vm.system_calls, vm.context_switches, vm.invol_switches, vm.user_time, vm.system_time, vm.idle_time + vm.wait_time); } } } 0707010037145c000081a400000000000000010000000141dc5ea30000049b000000880000000400000000000000000000001f00000005reloc/RICHPse/examples/ctlr.se// // Copyright (c) 1993-2001 by Richard Pettit. All rights reserved. // #include #include main() { ctlr_info_t c; for(;;) { for(c.number$=0, refresh$(c); c.number$ != -1; c.number$++, refresh$(c)) { printf("%s has %d disks\n", c.name$, c.data.disk_count); printf(" %5.0f reads\n", c.data.reads); printf(" %5.0f writes\n", c.data.writes); printf(" %5.0f Kbytes read\n", c.data.kreads); printf(" %5.0f Kbytes written\n", c.data.kwrites); printf(" %5.0f wait queue length\n", c.data.waitq_len); printf(" %5.0f run queue length\n", c.data.runq_len); printf(" %5.0f low svc\n", c.data.low_serv_time); printf(" %5.0f hi svc\n", c.data.hi_serv_time); printf(" %5.0f avg svc\n", c.data.avg_serv_time); printf(" %5.0f low wait\n", c.data.low_wait_time); printf(" %5.0f hi wait\n", c.data.hi_wait_time); printf(" %5.0f avg wait\n", c.data.avg_wait_time); printf(" %5.0f low util\n", c.data.low_utilization); printf(" %5.0f hi util\n", c.data.hi_utilization); printf(" %5.0f avg util\n", c.data.avg_utilization); } sleep(5); } } 0707010037145d000081a400000000000000010000000141dc5ea300003a45000000880000000400000000000000000000002000000005reloc/RICHPse/examples/darth.se// // Copyright (c) 1993-2001 by Richard Pettit. All rights reserved. // // darth - client side of vader #include #include #include #include #include #include #include #include // 30 seconds to avoid false alarms #define SAMPLE_INTERVAL 30 // maximum size of argv that will be sent to the toolkit #define MAX_ARGV 32 // interval values #define SCALE_MIN 2 #define SCALE_MAX 300 #define ST_MBLUE ST_MIDNIGHTBLUE #define ST_LGREY ST_LIGHTGREY resource_t gui[5] = { // type fg bg lab dta cb cbdta container { R_VFRAME }, { R_BUTTON, ST_MBLUE, ST_WHITE, "Wait...", nil, "plop_cb", "time_cb", "time_b" }, { R_ROW, ST_MBLUE, ST_WHITE, nil, "col_row" }, { R_HSCALE, ST_MBLUE, ST_WHITE, "Interval", nil, "interval_cb" }, { R_END } }; resource_t col_row[3] = { { R_COLUMN, ST_MBLUE, ST_WHITE, nil, "col1" }, { R_COLUMN, ST_MBLUE, ST_WHITE, nil, "col2" }, { R_END } }; pragma referenced col_row; resource_t col1[7] = { // type fg bg lab dta cb cbdta container { R_BUTTON, ST_MBLUE, ST_WHITE, "Disk", nil, "md_cb", nil, "disk_b" }, { R_BUTTON, ST_MBLUE, ST_WHITE, "NFS", nil, "plop_cb", "nfsc_cb", "nfs_b" }, { R_BUTTON, ST_MBLUE, ST_WHITE, "RAM", nil, "plop_cb", "ram_cb", "ram_b" }, { R_BUTTON, ST_MBLUE, ST_WHITE, "Kmem", nil, "plop_cb", "kern_cb", "kmem_b" }, { R_BUTTON, ST_MBLUE, ST_WHITE, "DNLC", nil, "plop_cb", "dnlc_cb", "dnlc_b" }, { R_BUTTON, ST_MBLUE, ST_WHITE, "CPU", nil, "plop_cb", "cpu_cb", "cpu_b" }, { R_END } }; resource_t col2[7] = { // type fg bg lab dta cb cbdta container { R_BUTTON, ST_MBLUE, ST_WHITE, "NIC", nil, "mn_cb", nil, "net_b" }, { R_BUTTON, ST_MBLUE, ST_WHITE, "TCP", nil, "plop_cb", "tcp_cb", "tcp_b" }, { R_BUTTON, ST_MBLUE, ST_WHITE, "Swap", nil, "plop_cb", "swap_cb", "swap_b" }, { R_BUTTON, ST_MBLUE, ST_WHITE, "Mutex", nil, "plop_cb", "mutx_cb", "mtx_b" }, { R_BUTTON, ST_MBLUE, ST_WHITE, "Inode", nil, "plop_cb", "inod_cb", "inode_b" }, { R_BUTTON, ST_WHITE, ST_NAVY, "Exit", nil, "exit_cb" }, { R_END } }; #define TIME_O gui[1] #define DISK_O col1[0] #define NETWORK_O col2[0] #define NFS_CLIENT_O col1[1] #define SWAP_SPACE_O col2[2] #define RAM_DEMAND_O col1[2] #define KMEM_O col1[3] #define CPU_POWER_O col1[5] #define MUTEX_O col2[3] #define DNLC_O col1[4] #define INODE_O col2[4] #define TCP_O col2[1] #define INTERVAL_O gui[3] resource_t disks[]; resource_t nets[]; int disks_size = 0; int nets_size = 0; int disk_count; int net_count; #define THING_INCREMENT 8 #define MD_WINDOW 1 #define MN_WINDOW 2 int vader = -1; int interval = SAMPLE_INTERVAL; int new_argc; int windows_up; string cb_name; string view_name; string new_argv[]; string monitored_host; string tmp_file; ulong_t time_b; ulong_t disk_b; ulong_t net_b; ulong_t nfs_b; ulong_t swap_b; ulong_t ram_b; ulong_t kmem_b; ulong_t cpu_b; ulong_t mtx_b; ulong_t dnlc_b; ulong_t inode_b; ulong_t tcp_b; ulong_t dark_helmet; int next_color(int current) { switch(current) { case ST_WHITE: return ST_NAVY; case ST_BLUE: return ST_WHITE; case ST_GREEN: return ST_NAVY; case ST_AMBER: return ST_NAVY; case ST_RED: return ST_WHITE; case ST_BLACK: return ST_WHITE; } } main(int argc, string argv[]) { int i; int j; new_argv = new string[argc]; for(i=0, j=0; i +: 0/#C( -Ť3"'PD&&>W)';[*(>K*+L<*/٭2,>F-2߯3/M;/@B1>ƲH3>ʴH5AǶD7J¸>:]z