picnet-1.2/0040755000000000000000000000000007247312367011353 5ustar rootrootpicnet-1.2/COPYING0100644000000000000000000004307007201412653012374 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. picnet-1.2/TODO0100644000000000000000000000005007245124376012032 0ustar rootrootTODO : - Make a CGI version of PicNet. picnet-1.2/patch.pm0100755000000000000000000000243607204374073013010 0ustar rootroot#! /usr/bin/perl # -*- mode: Perl -*- # # PATCH TO APPLY TO MRTG FOR PICNET # # INSTALLATION : # 1- Copy picnet (or picnet.exe) and patch.pm in the same directory as mrtg. # 2- cp mrtg mrtg.bak # 3- perl patch.pm mrtg.bak > mrtg # 4- Now, you can use the following syntax in the call to mrtg : # /mrtg /mrtg.cfg /picnet.cfg # and PicNet will run when mrtg updates the data. # while (<>) { if (!$ishere && / #In daemon mode run forever/) { # Insert the patch for PicNet at the end of the main loop... print "\n# PICNET PATCH...\n\n"; print "\tmy \$cfgpicnet = shift \@ARGV;\n"; print "\tmy \@picnetexec;\n"; print "\t(\$cfgpicnet=\$cfgfile) unless defined \$cfgpicnet;\n"; print "\t\@picnetexec = (\"\$\{FindBin::Bin\}\$\{MRTG_lib::SL\}"; print "picnet\",\"\$cfgpicnet\");\n"; print "\tif (\$MRTG_lib::OS eq 'VMS' || \$MRTG_lib::OS eq 'NT') \{\n"; print "\t open (PICNET, join (\" \", \@picnetexec).\"|\");\n"; print "\t\} else \{\n"; print "\t open (PICNET, \"-|\") || exec \@picnetexec;\n"; print "\t} close (PICNET);\n"; print "\n# END OF PICNET PATCH \n\n"; } if ($. == 6 && !($ishere = /^# \* PICNET PATCH INSTALLED \*/)) { print "# * PICNET PATCH INSTALLED *\n"; } print "$_"; } picnet-1.2/src/0040755000000000000000000000000007247312367012142 5ustar rootrootpicnet-1.2/src/loadcfg.c0100644000000000000000000002325207242423075013700 0ustar rootroot/* Creation of a PNG Image from a reference PNG Image replacing many colors by other colors depending on the traffic rate on interfaces. Parameters are read from the config file in the same format as mrtg.cfg. L. Derrien 19/8/99 Update. LD 13/10/00 */ #include #include /* BSDI 2.0.1 does not have malloc.h */ #if !defined(bsdi) && !defined(__FreeBSD__) && !defined(__OpenBSD__) #include #endif /* WATCOM C/C++ 10.6 under Win95/NT */ /* VC++ 6.0 under Win95/NT */ #if defined(__WATCOMC__) || defined(WIN32) #include #include #include #endif #include "def.h" /* Add a new htmlarea on the top of LAreas for netmap NetM */ int NewHtmlArea(netmap *NetM) { htmlarea *ptr; if ((ptr=(htmlarea *)malloc(sizeof(htmlarea))) == NULL) { fprintf(stderr, "Not enough memory.\n"); exit(1); } ptr->nextarea = NetM->LAreas; NetM->LAreas = ptr; return(1); } /* Add a new entry on the top of LCfgEntry for netmap NetM */ int NewCfgEntry(netmap *NetM) { cfgentry *ptr; if ((ptr=(cfgentry *)malloc(sizeof(cfgentry))) == NULL) { fprintf(stderr, "Not enough memory.\n"); exit(1); } ptr->nextcfg = NetM->LCfgEntry; NetM->LCfgEntry = ptr; ptr->submap = NULL; ptr->ColorIdx = ptr->ColorIdxIn = ptr->ColorIdxOut = -1; ptr->MaxRate = ptr->MaxRateIn = ptr->MaxRateOut = -1; ptr->rounds = 1; return(1); } /* Add a new entry on the top of LMap */ int NewNetMap() { netmap *ptr; if ((ptr=(netmap *)malloc(sizeof(netmap))) == NULL) { fprintf(stderr, "Not enough memory for netmap structure.\n"); exit(1); } ptr->nextmap = LMap; LMap = ptr; /* default values */ strncpy(ptr->WDir, DefWDir, 80); strncpy(ptr->grapher, DefGrapher, 80); ptr->HtmlTitle[0] = ptr->HtmlPageHeader[0] = ptr->pngin[0] = '\0'; ptr->refresh = Defrefresh; ptr->globval = -1; ptr->LAreas = NULL; ptr->LCfgEntry = NULL; return(1); } /* Free LAreas for the netmap NetM */ void FreeLAreas(netmap *NetM) { htmlarea *ptr; while (ptr = NetM->LAreas) { NetM->LAreas = ptr->nextarea; free(ptr); } } /* Free LCfgEntry for the netmap NetM */ void FreeLCfg(netmap *NetM) { cfgentry *ptr; while (ptr = NetM->LCfgEntry) { NetM->LCfgEntry = ptr->nextcfg; free(ptr); } } /* Free LMap */ void FreeLMap() { netmap *ptr; while (ptr = LMap) { LMap = ptr->nextmap; FreeLCfg(ptr); FreeLAreas(ptr); free(ptr); } } /* Looking for a LCfgEntry element of netmap NetM */ /* which interface name is str */ /* If not found, we create a new one... */ cfgentry *getCfgIF(netmap *NetM, char *str) { cfgentry *ptr; ptr = NetM->LCfgEntry; while (ptr && strcmp(ptr->ifname, str)!=0) ptr = ptr->nextcfg; if (!ptr) { NewCfgEntry(NetM); strncpy(NetM->LCfgEntry->ifname, str, 80); return(NetM->LCfgEntry); } return(ptr); } /* Looking for a netmap element which name is str */ /* If not found, we create a new one... */ netmap *getNetMap(char *str) { netmap *ptr = LMap; while (ptr && strcmp(ptr->name, str)!=0) ptr = ptr->nextmap; if (!ptr) { NewNetMap(); strncpy(LMap->name, str, 40); /* Default file names */ strncpy(LMap->HtmlFile, str, 40); strcat(LMap->HtmlFile, ".html"); strncpy(LMap->pngout, str, 40); strcat(LMap->pngout, ".png"); return(LMap); } return(ptr); } /* Create a structure with all the interesting infos in the config file */ /* The config file use the same format as mrtg.cfg (it could be mrtg.cfg) */ int loadcfg(char *file) { int iav, lev, precdefmap=0; char cfgline[90], ifn[40], cfglold[40]=""; char *str, *strprm; FILE *fp; cfgentry *ptr; netmap *CurNetMap; if ((fp = fopen(file, "r")) == NULL) { fprintf(stderr, "Error opening the config file %s\n", file); return(0); } while (fgets(cfgline, 80, fp)) { /* skip comments */ if (cfgline[0]=='#' || cfgline[0]==' ') continue; /* creating or looking for the right netmap */ if (strprm=strchr(cfgline, '*')) { strprm[0]='\0'; strprm++; if (precdefmap || strcmp(cfglold, cfgline) != 0) { CurNetMap = getNetMap(cfgline); precdefmap = 0; strcpy(cfglold, cfgline); } } else { /* one default netmap... */ strprm = cfgline; if (!precdefmap) { CurNetMap = getNetMap(DefMapName); precdefmap = 1; } } /* printf("CurNetmap : %s\n", CurNetMap->name); */ /* Analyze of config parameters... */ if (str=strtok(strprm, "[]: \n")) { if (strcmp(str, "ColorIdx")==0) { if (str=strtok(NULL, "[]: \n")) { ptr = getCfgIF(CurNetMap,str); if (str=strtok(NULL, "[]: \n")) ptr->ColorIdx = atoi(str); } } else if (strcmp(str, "ColorIdxIn")==0) { if (str=strtok(NULL, "[]: \n")) { ptr = getCfgIF(CurNetMap,str); if (str=strtok(NULL, "[]: \n")) ptr->ColorIdxIn = atoi(str); } } else if (strcmp(str, "ColorIdxOut")==0) { if (str=strtok(NULL, "[]: \n")) { ptr = getCfgIF(CurNetMap,str); if (str=strtok(NULL, "[]: \n")) ptr->ColorIdxOut = atoi(str); } } else if (strcmp(str, "MaxRate")==0) { if (str=strtok(NULL, "[]: \n")) { ptr = getCfgIF(CurNetMap,str); if (str=strtok(NULL, "[]: \n")) { ptr->MaxRate = atoi(str); if ((str=strtok(NULL, "[]: \n")) && strcmp(str, "bps")==0) ptr->MaxRate /= 8; } } } else if (strcmp(str, "MaxRateIn")==0) { if (str=strtok(NULL, "[]: \n")) { ptr = getCfgIF(CurNetMap,str); if (str=strtok(NULL, "[]: \n")) { ptr->MaxRateIn = atoi(str); if ((str=strtok(NULL, "[]: \n")) && strcmp(str, "bps")==0) ptr->MaxRateIn /= 8; } } } else if (strcmp(str, "MaxRateOut")==0) { if (str=strtok(NULL, "[]: \n")) { ptr = getCfgIF(CurNetMap,str); if (str=strtok(NULL, "[]: \n")) { ptr->MaxRateOut = atoi(str); if ((str=strtok(NULL, "[]: \n")) && strcmp(str, "bps")==0) ptr->MaxRateOut /= 8; } } } else if (strcmp(str, "Rounds")==0) { if (str=strtok(NULL, "[]: \n")) { ptr = getCfgIF(CurNetMap,str); if (str=strtok(NULL, "[]: \n")) ptr->rounds = atoi(str); } } else if (strcmp(str, "MapRect")==0) { if (str=strtok(NULL, "[]: \n")) { strncpy(ifn, str, 40); if ((str=strtok(NULL, ":\n"))) { NewHtmlArea(CurNetMap); CurNetMap->LAreas->areatyp = 1; strncpy(CurNetMap->LAreas->nameref, ifn, 40); strncpy(CurNetMap->LAreas->areastr, str, 70); } } } else if (strcmp(str, "MapPoly")==0) { if (str=strtok(NULL, "[]: \n")) { strncpy(ifn, str, 40); if ((str=strtok(NULL, ":\n"))) { NewHtmlArea(CurNetMap); CurNetMap->LAreas->areatyp = 0; strncpy(CurNetMap->LAreas->nameref, ifn, 40); strncpy(CurNetMap->LAreas->areastr, str, 70); } } } else if (strcmp(str, "MapColorIdx")==0) { if (str=strtok(NULL, "[]: \n")) { ptr = getCfgIF(CurNetMap,str); ptr->submap = getNetMap(str); if (str=strtok(NULL, "[]: \n")) ptr->ColorIdx = atoi(str); } } else if (strcmp(str, "WorkDir")==0) { if (str=strtok(NULL, ": \n")) { strncpy(CurNetMap->WDir, str, 80); /* for Win32 */ if (str=strtok(NULL, ":\n")) { strcat(CurNetMap->WDir, ":"); strcat(CurNetMap->WDir, str); } if (strcmp(CurNetMap->name, DefMapName)==0) strncpy(DefWDir, CurNetMap->WDir, 80); } } else if (strcmp(str, "Grapher")==0) { if (str=strtok(NULL, ": \n")) { strncpy(CurNetMap->grapher, str, 80); /* for Win32 */ if (str=strtok(NULL, ":\n")) { strcat(CurNetMap->grapher, ":"); strcat(CurNetMap->grapher, str); } if (strcmp(CurNetMap->name, DefMapName)==0) strncpy(DefGrapher, CurNetMap->grapher, 80); } } else if (strcmp(str, "Refresh")==0) { if (str=strtok(NULL, ": \n")) { CurNetMap->refresh=atoi(str); if (strcmp(CurNetMap->name, DefMapName)==0) Defrefresh=CurNetMap->refresh; } } else if (strcmp(str, "ImageRef")==0) { if (str=strtok(NULL, ": \n")) strncpy(CurNetMap->pngin, str, 50); } else if (strcmp(str, "ImageNet")==0) { if (str=strtok(NULL, ": \n")) strncpy(CurNetMap->pngout, str, 50); } else if (strcmp(str, "HtmlTitle")==0) { if (str=strtok(NULL, ":\n")) strncpy(CurNetMap->HtmlTitle, str, 100); } else if (strcmp(str, "HtmlPageHeader")==0) { if (str=strtok(NULL, ":\n")) strncpy(CurNetMap->HtmlPageHeader, str, 100); } else if (strcmp(str, "HtmlAreasDef")==0) { if (str=strtok(NULL, ": \n")) strncpy(CurNetMap->areasdef, str, 50); } } } fclose(fp); return(1); } picnet-1.2/src/mkhtml.c0100644000000000000000000001527507245411666013611 0ustar rootroot/* Creation of an HTML file with the image generated previously (mkpic.c) and a map from information in config file. Parameters are read from the config file in the same format as mrtg.cfg. L. Derrien 19/8/99 Update LD 20/10/00 : processing of multiple netmaps. Update LD 14/02/01 : "grapher" for links to CGI or different directory... */ #include #include /* WATCOM C/C++ 10.6 under Win95/NT */ /* VC++ 6.0 under Win95/NT */ #if defined(__WATCOMC__) || defined(WIN32) #include #include #include #include #endif #include "cfg.h" /* JavaScript functions to display the countdown before next update... */ #ifndef NOJS #define COUNTDOWN "\n\n" #endif /* Process the current date to get the string displayed at the end of the HTML page and the Expires META date */ void comp_date(int refresh, char *strnow, char *strnext, int lg) { #if HAVE_STRFTIME time_t NOW; struct tm *nowtm; tzset(); time(&NOW); nowtm=localtime(&NOW); #ifdef FR strftime(strnow, lg, "Mis à jour le :

%d/%m/%y %X", nowtm); #else strftime(strnow, lg, "Last update :

%x %X", nowtm); #endif /* Next refresh time used in the Expires META */ NOW += refresh; nowtm=gmtime(&NOW); strftime(strnext, lg, "%a, %d %b %Y %X GMT", nowtm); #else lg=0; strnow[0]=strnext[0]='\0'; #endif } /* Make the HTML page for netmap NMap */ void mk_html(netmap *NMap) { FILE *fhtml, *fareas; char str[120], sufx[6]=""; char lastch; int i; char nowtime[50], expirtime[50]; htmlarea *ptrarea; /* printf("Indexmap : %s title : %s pagehead : %s\n", NMap->HtmlFile, NMap->HtmlTitle, NMap->HtmlPageHeader); */ if (strlen(NMap->HtmlTitle)==0 && strlen(NMap->HtmlPageHeader)==0) return; sprintf(str, "%s/%s", NMap->WDir, NMap->HtmlFile); if ((fhtml=fopen(str, "w")) == NULL) { fprintf(stderr, "Error creating the HTML file %s\n", str); return; } comp_date(NMap->refresh, nowtime, expirtime, 50); fprintf(fhtml, "\n\n%s\n", NMap->HtmlTitle); fprintf(fhtml, "\n", NMap->refresh); fprintf(fhtml, "\n"); if (strlen(expirtime)>0) fprintf(fhtml, "\n", expirtime); fprintf(fhtml, "\n"); #ifndef NOJS fprintf(fhtml, COUNTDOWN, (NMap->refresh)); #endif /* Definition of the areas for the image map */ fprintf(fhtml, "\n"); ptrarea = NMap->LAreas; while (ptrarea) { if (strcmp(NMap->grapher, "")==0) strcpy(sufx, ".html"); else { lastch=(char)(NMap->grapher[strlen(NMap->grapher)-1]); if (lastch == '/' || lastch == '\\') strcpy(sufx, ".html"); } fprintf(fhtml, "\"%s\"\n", NMap->grapher, ptrarea->nameref, sufx, ptrarea->nameref, (ptrarea->areatyp)?"rect":"poly", ptrarea->areastr); ptrarea = ptrarea->nextarea; } /* Read the areas defined in the file areasdef... */ if (strlen(NMap->areasdef)>0) { sprintf(str, "%s/%s", NMap->WDir, NMap->areasdef); if ((fareas=fopen(str, "r")) != NULL) { while (fgets(str, 120, fareas)) fprintf(fhtml, str); fclose(fareas); } } /* Body of the HTML page */ fprintf(fhtml, "\n\n\n", NMap->refresh); #else fprintf(fhtml, ">\n"); #endif fprintf(fhtml, NMap->HtmlPageHeader); fprintf(fhtml, "

\n"); fprintf(fhtml, "
\n", NMap->pngout); #ifdef FR fprintf(fhtml, "\nCliquez sur des zones de la carte du réseau pour obtenir des stats détaillées.
\n"); #else fprintf(fhtml, "\nClick upon network map areas to get MRTG detailed stats.
\n"); #endif fprintf(fhtml, "

\n\n"); fprintf(fhtml, "\n", nowtime); fprintf(fhtml, "\n"); #ifdef FR fprintf(fhtml, "\n", (float)(NMap->refresh)/60.0); #endif fprintf(fhtml, "
%s\n"); #ifdef FR fprintf(fhtml, "Utilisation :
\n"); #else fprintf(fhtml, "Usage :
\n"); #endif for (i=0; i", levcolor[i].r, levcolor[i].g, levcolor[i].b); #ifdef FR fprintf(fhtml, "De %3d à %3d %%", i*100/NLEVEL, (i+1)*100/NLEVEL); #else fprintf(fhtml, "From %3d to %3d %%", i*100/NLEVEL, (i+1)*100/NLEVEL); #endif fprintf(fhtml, "
\n"); } fprintf(fhtml, "
Actualisation dans"); #else fprintf(fhtml, "Next update in"); #endif #ifndef NOJS fprintf(fhtml, "
\n"); #else fprintf(fhtml, "

%.1f minutes
\n"); #ifndef NOSIGN fprintf(fhtml, "
\n"); fprintf(fhtml, "\n"); fprintf(fhtml, "\n"); fprintf(fhtml, "\n", VERSION); fprintf(fhtml, "\n\n
PICNET v%s\n"); fprintf(fhtml, "Laurent Derrien derrien@canl.nc\n"); fprintf(fhtml, "
\n"); #endif fprintf(fhtml, "\n\n"); fclose(fhtml); return; } /* Make all the HTML pages */ void mk_htmlpages() { netmap *ptr = LMap; while (ptr) { mk_html(ptr); ptr = ptr->nextmap; } }picnet-1.2/src/mkpic.c0100644000000000000000000002157007247312100013374 0ustar rootroot/* Creation of a PNG Image from a reference PNG Image replacing many colors by other colors depending on the traffic rate on interfaces. L. Derrien 19/8/99 Update LD 17/10/00 : Process many netmaps hierarchicaly. Update LD 9/01/01 : bug : gdImageSY(im) Update LD 10/02/01 : Function to get data from RRD file. */ #include #include #include /* WATCOM C/C++ 10.6 under Win95/NT */ /* VC++ 6.0 under Win95/NT */ #if defined(__WATCOMC__) || defined(WIN32) #include #include #include #endif #include "cfg.h" /* Function comp_log with log file or RRD file is selected */ /* in the Makefile : -DRRD */ #if defined(RRD) #include #include extern int optind; /* computes a traffic in % by reading 'rounds' lines in a RRD file */ /* For mixed I/O traffic, it takes the maximum of the In or OUT traffic.*/ /* It returns this maximum rate. */ int comp_log (netmap *NMap, cfgentry *ce) { int i, rateIn=0, rateOut=0, rate=0, In, Out, IO, dfirst, ntot; double d1, d2, drateIn=0.0, drateOut=0.0, drate=0.0; time_t start,end; unsigned long step, ds_cnt; rrd_value_t *data,*datai; char **ds_namv; char rrdfile[100], tsec[15]; char *fargv[4] = {"fetch", NULL, NULL, "AVERAGE"}; sprintf(rrdfile, "%s/%s.rrd", NMap->WDir, ce->ifname); sprintf(tsec, "-s-%d", NMap->refresh * ce->rounds); fargv[2]=rrdfile; fargv[1]=tsec; /* printf("Exec : %s %s %s %s\n", fargv[0], fargv[1], fargv[2], fargv[3]); */ /* For a small bug in rrd_fetch... */ optind=0; /* Try to read the right number of lines in the Round Robin Database */ if (rrd_fetch(4, fargv, &start,&end,&step,&ds_cnt,&ds_namv,&data) == -1) { fprintf(stderr, "Error opening the rrd file %s\n", rrdfile); return(0); } if (step > NMap->refresh) { /* There are not enough lines, let's try again */ for (i=0;irounds); optind=0; rrd_fetch(4, fargv, &start,&end,&step,&ds_cnt,&ds_namv,&data); } dfirst=((int)((end - start)/step) -ce->rounds) * ds_cnt; datai = data + dfirst; ntot = ce->rounds; In = (ce->ColorIdxIn>=0 && ce->ColorIdxIn<256 && ce->MaxRateIn>0); Out = (ce->ColorIdxOut>=0 && ce->ColorIdxOut<256 && ce->MaxRateOut>0); IO = (ce->ColorIdx>=0 && ce->ColorIdx<256 && ce->MaxRate>0); for (i = 0; i < ce->rounds; i++) { if (isnan(*datai)) { ntot--; datai += ds_cnt; } else { d1 = (double) *(datai++); if (ds_cnt==1) d2=d1; else { d2 = (double) *(datai++); datai += (ds_cnt - 2); } if (In) drateIn += d1; if (Out) drateOut += d2; /* Max (In, Out) */ if ( d1 > d2 ) drate += d1; else drate += d2; } } for (i=0;i1) drateIn /= ntot; rateIn = (int)(0.5 + (drateIn * NLEVEL) / ce->MaxRateIn); if ( rateIn >= NLEVEL ) rateIn = NLEVEL-1; if ( rateIn < 0 ) rateIn = 0; NMap->level[ce->ColorIdxIn] = rateIn; /* printf("Idx: %d rate: %d\n", ce->ColorIdxIn, rateIn); */ } if (Out) { if (ntot>1) drateOut /= ntot; rateOut = (int)(0.5 + (drateOut * NLEVEL) / ce->MaxRateOut); if ( rateOut >= NLEVEL ) rateOut = NLEVEL-1; if ( rateOut < 0 ) rateOut = 0; NMap->level[ce->ColorIdxOut] = rateOut; /* printf("Idx: %d rate: %d\n", ce->ColorIdxOut, rateOut); */ } if (ntot>1) drate /= ntot; rate = (int)(0.5 + (drate * NLEVEL) / ce->MaxRate); if ( rate >= NLEVEL ) rate = NLEVEL-1; if ( rate < 0 ) rate = 0; if (IO) NMap->level[ce->ColorIdx] = rate; /* printf("Idx: %d rate: %d\n", ce->ColorIdx, rate); */ return(rate); } #else /* computes a traffic in % by reading 'rounds' lines in a MRTG log file */ /* For mixed I/O traffic, it takes the maximum of the In or OUT traffic.*/ /* It returns this maximum rate. */ int comp_log (netmap *NMap, cfgentry *ce) { FILE *logf; int i, j=0, k=0, rateIn=0, rateOut=0, rate=0, In, Out, IO; char fic[100]; sprintf(fic, "%s/%s.log", NMap->WDir, ce->ifname); if ((logf = fopen ( fic, "r" ))==NULL) { fprintf(stderr, "Error opening the log file %s\n", fic); return(0); } fscanf(logf, "%*d %d %d", &j, &k); /* get first line */ In = (ce->ColorIdxIn>=0 && ce->ColorIdxIn<256 && ce->MaxRateIn>0); Out = (ce->ColorIdxOut>=0 && ce->ColorIdxOut<256 && ce->MaxRateOut>0); IO = (ce->ColorIdx>=0 && ce->ColorIdx<256 && ce->MaxRate>0); for ( i = 0; i < ce->rounds; i++ ) { /* computes mean */ fscanf(logf, "%*d %d %d %*d %*d", &j, &k); /* get line */ /* printf(" - [%d %d]\n", j, k); */ if (In) rateIn += j; if (Out) rateOut += k; /* Max (In, Out) */ if ( j > k ) rate += j; else rate += k; } fclose (logf); /* computes the rate 0-9 */ if (In) { if (ce->rounds>1) rateIn /= ce->rounds; rateIn = (rateIn * NLEVEL) / ce->MaxRateIn; if ( rateIn >= NLEVEL ) rateIn = NLEVEL-1; if ( rateIn < 0 ) rateIn = 0; NMap->level[ce->ColorIdxIn] = rateIn; /* printf("Idx: %d rate: %d\n", ce->ColorIdxIn, rateIn); */ } if (Out) { if (ce->rounds>1) rateOut /= ce->rounds; rateOut = (rateOut * NLEVEL) / ce->MaxRateOut; if ( rateOut >= NLEVEL ) rateOut = NLEVEL-1; if ( rateOut < 0 ) rateOut = 0; NMap->level[ce->ColorIdxOut] = rateOut; /* printf("Idx: %d rate: %d\n", ce->ColorIdxOut, rateOut); */ } if (ce->rounds>1) rate /= ce->rounds; rate = (rate * NLEVEL) / ce->MaxRate; if ( rate >= NLEVEL ) rate = NLEVEL-1; if ( rate < 0 ) rate = 0; if (IO) NMap->level[ce->ColorIdx] = rate; /* printf("Idx: %d rate: %d\n", ce->ColorIdx, rate); */ return(rate); } #endif /* Compute the rate levels for all the color indexes in the config file */ /* for the netmap NMap. It returns the max rate in this netmap. */ /* This function is recursive, so all submaps of NMap are also processed. */ int comp_levels(netmap *NMap) { cfgentry *ptr; int i, tmpv, globrate=0; ptr = NMap->LCfgEntry; for (i=0; i<256; i++) NMap->level[i] = -1; /* Init */ while (ptr) { if (ptr->submap) { if (ptr->submap->globval == -1) { if ((tmpv=comp_levels(ptr->submap))>globrate) globrate = tmpv; } else { if ((tmpv=ptr->submap->globval)>globrate) globrate = tmpv; } NMap->level[ptr->ColorIdx] = tmpv; } else { if ((tmpv=comp_log(NMap, ptr))>globrate) globrate = tmpv; } ptr = ptr->nextcfg; } FreeLCfg(NMap); /* we don't need this LCfgEntry anymore */ return (NMap->globval = globrate); } /* Create a new PNG image from the reference PNG image changing the color */ /* of the links depending on the rates... */ int comp_pic(netmap *NMap) { char fic[100]; gdImagePtr im; FILE *in, *out; int c, y, x; int TLC[256]; for (c=0; c<256; c++) TLC[c] = -1; /* init */ /* No image => no pocessing */ if (!strlen(NMap->pngin)) return(0); sprintf(fic, "%s/%s", NMap->WDir, NMap->pngin); if ((in = fopen(fic, "rb")) == NULL) { fprintf(stderr, "Error opening the image file %s\n", NMap->pngin); return(0); } im = gdImageCreateFromPng(in); fclose(in); /* printf("SX : %d, SY: %d\n", gdImageSX(im), gdImageSY(im)); */ for (y=0; ylevel[c] >=0) { if (NMap->level[c]>=NLEVEL) NMap->level[c]=NLEVEL-1; if (TLC[c]==-1) TLC[c] = gdImageColorResolve(im, levcolor[NMap->level[c]].r, levcolor[NMap->level[c]].g , levcolor[NMap->level[c]].b); gdImageSetPixel(im, x, y, TLC[c]); } } /* for (c=0; c<256; c++) printf("c=%d -> TLC=%d\n", c, TLC[c]); */ /* Open output file in binary mode */ sprintf(fic, "%s/%s", NMap->WDir, NMap->pngout); if ((out = fopen(fic, "wb")) == NULL) { fprintf(stderr, "Error opening the image file %s\n", NMap->pngout); return(0); } gdImageInterlace(im, 1); /* Write PNG */ gdImagePng(im, out); /* Close file */ fclose(out); gdImageDestroy(im); return(1); } /* comp_levels deals with a branch of one tree of netmaps. */ /* Here, we process all the trees. */ /* Besides, when a netmap is prepared, we process its image. */ void comp_netmaps() { netmap *ptr = LMap; while (ptr) { if (ptr->globval == -1) comp_levels(ptr); comp_pic(ptr); ptr = ptr->nextmap; } } picnet-1.2/src/picnet.c0100644000000000000000000000222207175455634013570 0ustar rootroot/* MAIN : Create a PNG image from a reference PNG image replacing colors of links by colors depending on the current traffic rate. Then, create an HTML page with the image just created. This image is an image map indexing stats pages generated by MRTG. The config file format is the same as MRTG one. L. Derrien 20/8/99 Update LD 20/10/00 : Add the processing of many images hierarchicaly. */ #include /* WATCOM C/C++ 10.6 under Win95/NT */ /* VC++ 6.0 under Win95/NT */ #if defined(__WATCOMC__) || defined(WIN32) #include #include #include #endif #include "mkpic.h" #include "mkhtml.h" int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "\nUsage: %s \n", argv[0]); fprintf(stderr, "\nDisplay your network traffic on an image.\n"); fprintf(stderr, "It must be used with MRTG...\n"); fprintf(stderr, "\nPlease read the docs for more information !\n"); exit(1); } if (!loadcfg(argv[1])) exit(1); /* printf("Cfg OK\n"); */ comp_netmaps(); /* printf("NetMaps OK\n"); */ mk_htmlpages(); /* printf("HTML OK\n"); */ FreeLMap(); exit(0); }picnet-1.2/src/cfg.h0100644000000000000000000000267407242424376013057 0ustar rootroot/* Declaration of types and global variables... Parameters are read from the config file in the same format as mrtg.cfg. L. Derrien 19/08/99 Update LD 17/10/00 New structure netmap Update LD 14/02/01 Add grapher in netmap struct... */ #ifndef _CFG_H_ #define _CFG_H_ /* You should be able to change the number of levels... */ #define NLEVEL 10 #define VERSION "1.2" typedef unsigned char byte; typedef struct { byte r, g, b; } color; typedef struct cfgentry { char ifname[80]; struct netmap *submap; int rounds; int ColorIdx, ColorIdxIn, ColorIdxOut; int MaxRate, MaxRateIn, MaxRateOut; struct cfgentry *nextcfg; } cfgentry; typedef struct htmlarea { int areatyp; char nameref[40]; char areastr[70]; struct htmlarea* nextarea; } htmlarea; typedef struct netmap { char name[40]; char WDir[80]; int refresh; char pngin[50]; char pngout[50]; char grapher[80]; char HtmlFile[50]; char HtmlTitle[100]; char HtmlPageHeader[100]; char areasdef[50]; htmlarea *LAreas; int level[256]; cfgentry *LCfgEntry; int globval; struct netmap *nextmap; } netmap; netmap *LMap; color levcolor[NLEVEL]; /* Free the LCfgEntry of a netmap */ void FreeLCfg(netmap *); /* Free LMap */ void FreeLMap(); /* Create a structure with all the interesting infos in the config file */ /* The config file use the same format as mrtg.cfg (it could be mrtg.cfg) */ int loadcfg(char *); #endifpicnet-1.2/src/def.h0100644000000000000000000000112007242417346013036 0ustar rootroot/* Definition of variables */ /* LD 20/8/99 */ #ifndef _DEF_H_ #define _DEF_H_ #include "cfg.h" /* You can change these colors as you want */ color levcolor[NLEVEL] = { { 0, 10, 255}, /* low traffic */ { 0, 85, 255}, { 0, 200, 255}, { 10, 255, 194}, {170, 255, 50}, {250, 241, 10}, {255, 190, 0}, {255, 120, 0}, {255, 60, 0}, {255, 0, 0} /* high traffic */ }; char DefWDir[80] = "."; char DefGrapher[80] = ""; int Defrefresh = 300; char DefMapName[40] = "indexmap"; #endif picnet-1.2/src/mkhtml.h0100644000000000000000000000071007173227614013600 0ustar rootroot/* Creation of an HTML file with the image generated previously (mkpic.c) and a map from information in config file. Parameters are read from the config file in the same format as mrtg.cfg. L. Derrien 20/8/99 Update LD 18/10/00 : Process of many pages with links between pages. */ #ifndef _MKHTML_H_ #define _MKHTML_H_ /* Create the new HTML pages with image maps indexing MRTG pages and other information */ int mk_htmlpages(); #endif picnet-1.2/src/mkpic.h0100644000000000000000000000103607172765405013415 0ustar rootroot/* Creation of a PNG Image from a reference PNG Image replacing many colors by other colors depending on the traffic rate on interfaces Parameters are read from the config file in the same format as mrtg.cfg. L. Derrien 19/8/99 Update LD 17/10/00 : Now, many images can be processed hierarchicaly. */ #ifndef _MKPIC_H_ #define _MKPIC_H_ /* Create the new images from corresponding reference images */ /* using the level table. */ /* Note that one image can display the max rate of another one. */ int comp_netmaps(); #endif picnet-1.2/Makefile.in0100644000000000000000000000331707245412340013407 0ustar rootroot# PicNet Makefile # You can change these parameters... VER = 1.2 .SUFFIXES: .c .o .pod .html .man .1 .txt PERL = @PERL@ CC = @CC@ CFLAGS = @CFLAGS@ @DEFNS@ @DEFS@ CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ GDFORM_EXT = @GDFORM_EXT@ RRDFORM_EXT = @RRDFORM_EXT@ MRTG = @MRTG@ LD_RUN_PATH = @LD_RUN_PATH@ OBJS = src/loadcfg.o src/mkpic.o src/mkhtml.o src/picnet.o default all : picnet picnet : $(OBJS) LD_RUN_PATH=$(LD_RUN_PATH) $(CC) $(CFLAGS) $(CPPFLAGS) $(OBJS) $(LDFLAGS) -o $@ @echo $@ ready install : picnet cp -f picnet $(MRTG)/picnet cp -f $(MRTG)/mrtg $(MRTG)/mrtg.bak $(PERL) patch.pm $(MRTG)/mrtg.bak > $(MRTG)/mrtg uninstall : cp -f $(MRTG)/mrtg.bak $(MRTG)/mrtg rm -f $(MRTG)/picnet clean : rm -f src/*.o rm -f picnet distclean: clean /bin/rm -f Makefile config.status config.cache config.log ########### POD DOCUMENTATION ### Things you might NOT want to play with ... POD = doc/picnet.pod doc/config.pod doc/image.pod MAN = $(POD:.pod=.1) HTML = $(POD:.pod=.html) TXT = $(POD:.pod=.txt) getpod: -rm doc/*.html doc/*.txt doc/*.1 .pod.1: pod2man --release=$(VER) --center=picnet $< > $@ .pod.html: ( cd doc ; pod2html --infile=../$< --outfile=../$@ --noindex --htmlroot=. --podroot=. --podpath=. --title=$* ) .1.txt: /usr/bin/groff -man -Tascii $< > $@ man: $(MAN) html: $(HTML) txt: $(TXT) doc: getpod man html txt (cd doc; perl -i -p -e 's||

|' *.html) ############ # automatic re-running of configure if the configure.in file has changed configure: configure.in autoconf Makefile: Makefile.in config.status ./config.status config.status: configure ./config.status --recheckpicnet-1.2/configure.in0100644000000000000000000001176107245130057013657 0ustar rootrootdnl Configure.in for PicNet AC_INIT(src/loadcfg.c) dnl Check for programs. AC_PROG_CC AC_PROG_MAKE_SET AC_PATH_PROG(PERL, perl, no, $PATH:/usr/bin:/usr/local/bin) if test $PERL = no; then echo echo "** No Perl found in the PATH. A recent copy of Perl" echo " is required for patching mrtg. Check www.perl.com" echo fi AC_PATH_PROGS(NROFF, groff nroff) dnl Checks for libraries. AC_CHECK_LIB(m, main, [ LDFLAGS="${LDFLAGS} -lm" ]) AC_ARG_WITH(gd,[ --with-gd=DIR location of the gd (with lib and inc)], [ LDFLAGS="${LDFLAGS} -L${withval}/lib" CPPFLAGS="${CPPFLAGS} -I${withval}/include" LD_RUN_PATH="${withval}/lib${LD_RUN_PATH:+:}${LD_RUN_PATH}"]) AC_ARG_WITH(gd-lib,[ --with-gd-lib=DIR location of the gd library], [ LDFLAGS="${LDFLAGS} -L${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}"]) AC_ARG_WITH(gd-inc,[ --with-gd-inc=DIR location of the gd include files], [ CPPFLAGS="${CPPFLAGS} -I${withval}"]) AC_ARG_WITH(z,[ --with-z=DIR location of zlib lib/inc], [LDFLAGS="${LDFLAGS} -L${withval}" CPPFLAGS="${CPPFLAGS} -I${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}"]) AC_ARG_WITH(z-lib,[ --with-z-lib=DIR location of zlib library], [LDFLAGS="${LDFLAGS} -L${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}"]) AC_ARG_WITH(z-inc,[ --with-z-inc=DIR location of the zlib include files], [CPPFLAGS="${CPPFLAGS} -I${withval}"]) AC_CHECK_LIB(z, main, [ LDFLAGS="${LDFLAGS} -lz" ]) AC_ARG_WITH(png,[ --with-png=DIR location of png lib/inc], [LDFLAGS="${LDFLAGS} -L${withval}" CPPFLAGS="${CPPFLAGS} -I${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}"]) AC_ARG_WITH(png-lib,[ --with-png-lib=DIR location of png library], [LDFLAGS="${LDFLAGS} -L${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}"]) AC_ARG_WITH(png-inc,[ --with-png-inc=DIR location of the libpng include files], [CPPFLAGS="${CPPFLAGS} -I${withval}"]) AC_CHECK_LIB(png, main, [ LDFLAGS="${LDFLAGS} -lpng" ]) AC_CHECK_LIB(gd,gdImagePng,[ LDFLAGS="${LDFLAGS} -lgd" GDFORM_EXT="png" ], [ GDFORM_EXT="" ], [-lpng -lz -lm]) dnl Do you have RRDTool ? AC_ARG_WITH(rrd,[ --with-rrd=DIR location of rrd (with lib and inc)], [ LDFLAGS="${LDFLAGS} -L${withval}/lib" CPPFLAGS="${CPPFLAGS} -I${withval}/include" LD_RUN_PATH="${withval}/lib${LD_RUN_PATH:+:}${LD_RUN_PATH}"]) AC_ARG_WITH(rrd-lib,[ --with-rrd-lib=DIR location of rrd library], [ LDFLAGS="${LDFLAGS} -L${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}"]) AC_ARG_WITH(rrd-inc,[ --with-rrd-inc=DIR location of the rrd include files], [ CPPFLAGS="${CPPFLAGS} -I${withval}"]) AC_CHECK_LIB(rrd, rrd_fetch, [ LDFLAGS="${LDFLAGS} -lrrd" RRDFORM_EXT="found" ], [RRDFORM_EXT="" ]) dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(malloc.h) AC_CHECK_HEADER( gd.h,:,[ GDFORM_EXT="" ]) if test x$GDFORM_EXT = x; then echo echo "** The GD library is required for picnet to compile." echo " Get it from http://www.boutell.com, compile it and" echo " use either --with-gd-lib=DIR and --with-gd-inc=DIR to specify" echo " its location. You might also have to use --with-z-inc, --with-z-lib" echo " and --with-png-inc, --with-png-lib for gd versions 1.6 and higher." echo " Check config.log for more information on the problem. If your system" echo " has libgd installed, you probably mis the gd.h header file." exit 1 fi dnl Check for RRD include file AC_CHECK_HEADER( rrd.h,[ DEFNS="${DEFNS} -DRRD" ], [ RRDFORM_EXT="" ]) dnl Checks for typedefs, structures, and compiler characteristics. AC_STRUCT_TM dnl Checks for library functions. AC_FUNC_STRFTIME dnl Language... echo AC_ARG_ENABLE(js,[ --disable-js Disable JavaScript], [ if test x$enableval = "xno" ;then DEFNS="${DEFNS} -DNOJS" echo "No JavaScript for your browser !"; fi ]) AC_ARG_ENABLE(fr,[ --enable-fr French version/version francaise], [ DEFNS="${DEFNS} -DFR" echo "Version francaise !" ]) if test x$RRDFORM_EXT = "xfound" ;then echo "PicNet is going to work with RRD files !" else echo "PicNet is going to work with MRTG log files !" fi dnl MRTG directory... if test x${exec_prefix} != "xNONE"; then MRTG=${exec_prefix} else if test x${prefix} = "xNONE" ;then MRTG="/usr/local/mrtg-2/bin" else MRTG=${prefix}/bin fi fi if test -x $MRTG/mrtg -a x$PERL != "xno" ;then echo "MRTG found! Ready to be patched for PicNet." Ppatch=1 else echo "Not ready to patch MRTG..." fi echo AC_SUBST(PERL) AC_SUBST(GDFORM_EXT) AC_SUBST(RRDFORM_EXT) AC_SUBST(LD_RUN_PATH) AC_SUBST(DEFNS) AC_SUBST(MRTG) AC_OUTPUT(Makefile) echo echo "----------------------------------------------------------------" echo "Config is DONE!" echo echo "Type 'make' to compile the software" if test $Ppatch ;then echo "or type 'make install' to install PicNet (patching MRTG)." fi echo echo "----------------------------------------------------------------" picnet-1.2/COPYRIGHT0100644000000000000000000000147207201413601012626 0ustar rootroot PicNet for MRTG. A tool to visualise network information collected by MRTG on graphic maps. Copyright (c) 2000 Laurent Derrien All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. picnet-1.2/configure0100755000000000000000000016146507245130064013262 0ustar rootroot#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: ac_help="$ac_help --with-gd=DIR location of the gd (with lib and inc)" ac_help="$ac_help --with-gd-lib=DIR location of the gd library" ac_help="$ac_help --with-gd-inc=DIR location of the gd include files" ac_help="$ac_help --with-z=DIR location of zlib lib/inc" ac_help="$ac_help --with-z-lib=DIR location of zlib library" ac_help="$ac_help --with-z-inc=DIR location of the zlib include files" ac_help="$ac_help --with-png=DIR location of png lib/inc" ac_help="$ac_help --with-png-lib=DIR location of png library" ac_help="$ac_help --with-png-inc=DIR location of the libpng include files" ac_help="$ac_help --with-rrd=DIR location of rrd (with lib and inc)" ac_help="$ac_help --with-rrd-lib=DIR location of rrd library" ac_help="$ac_help --with-rrd-inc=DIR location of the rrd include files" ac_help="$ac_help --disable-js Disable JavaScript" ac_help="$ac_help --enable-fr French version/version francaise" # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir="$ac_optarg" ;; -build | --build | --buil | --bui | --bu) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir="$ac_optarg" ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir="$ac_optarg" ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir="$ac_optarg" ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir="$ac_optarg" ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir="$ac_optarg" ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir="$ac_optarg" ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir="$ac_optarg" ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir="$ac_optarg" ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.13" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set these to C if already set. These must not be set unconditionally # because not all systems understand e.g. LANG=C (notably SCO). # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=src/loadcfg.c # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross ac_exeext= ac_objext=o if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:558: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:588: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_prog_rejected=no ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" break fi done IFS="$ac_save_ifs" if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# -gt 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift set dummy "$ac_dir/$ac_word" "$@" shift ac_cv_prog_CC="$@" fi fi fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then case "`uname -s`" in *win32* | *WIN32*) # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:639: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="cl" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi ;; esac fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo "configure:671: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF #line 682 "configure" #include "confdefs.h" main(){return(0);} EOF if { (eval echo configure:687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then ac_cv_prog_cc_cross=no else ac_cv_prog_cc_cross=yes fi else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cc_works=no fi rm -fr conftest* ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo "configure:713: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo "configure:718: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes else GCC= fi ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo "configure:746: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_cc_g=yes else ac_cv_prog_cc_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 echo "configure:778: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftestmake <<\EOF all: @echo 'ac_maketemp="${MAKE}"' EOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftestmake fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$ac_t""yes" 1>&6 SET_MAKE= else echo "$ac_t""no" 1>&6 SET_MAKE="MAKE=${MAKE-make}" fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:807: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$PERL" in /*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; ?:/*) ac_cv_path_PERL="$PERL" # Let the user override the test with a dos path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH:/usr/bin:/usr/local/bin" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_path_PERL="$ac_dir/$ac_word" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no" ;; esac fi PERL="$ac_cv_path_PERL" if test -n "$PERL"; then echo "$ac_t""$PERL" 1>&6 else echo "$ac_t""no" 1>&6 fi if test $PERL = no; then echo echo "** No Perl found in the PATH. A recent copy of Perl" echo " is required for patching mrtg. Check www.perl.com" echo fi for ac_prog in groff nroff do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:852: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_NROFF'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$NROFF" in /*) ac_cv_path_NROFF="$NROFF" # Let the user override the test with a path. ;; ?:/*) ac_cv_path_NROFF="$NROFF" # Let the user override the test with a dos path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_path_NROFF="$ac_dir/$ac_word" break fi done IFS="$ac_save_ifs" ;; esac fi NROFF="$ac_cv_path_NROFF" if test -n "$NROFF"; then echo "$ac_t""$NROFF" 1>&6 else echo "$ac_t""no" 1>&6 fi test -n "$NROFF" && break done echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 echo "configure:891: checking for main in -lm" >&5 ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 LDFLAGS="${LDFLAGS} -lm" else echo "$ac_t""no" 1>&6 fi # Check whether --with-gd or --without-gd was given. if test "${with_gd+set}" = set; then withval="$with_gd" LDFLAGS="${LDFLAGS} -L${withval}/lib" CPPFLAGS="${CPPFLAGS} -I${withval}/include" LD_RUN_PATH="${withval}/lib${LD_RUN_PATH:+:}${LD_RUN_PATH}" fi # Check whether --with-gd-lib or --without-gd-lib was given. if test "${with_gd_lib+set}" = set; then withval="$with_gd_lib" LDFLAGS="${LDFLAGS} -L${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}" fi # Check whether --with-gd-inc or --without-gd-inc was given. if test "${with_gd_inc+set}" = set; then withval="$with_gd_inc" CPPFLAGS="${CPPFLAGS} -I${withval}" fi # Check whether --with-z or --without-z was given. if test "${with_z+set}" = set; then withval="$with_z" LDFLAGS="${LDFLAGS} -L${withval}" CPPFLAGS="${CPPFLAGS} -I${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}" fi # Check whether --with-z-lib or --without-z-lib was given. if test "${with_z_lib+set}" = set; then withval="$with_z_lib" LDFLAGS="${LDFLAGS} -L${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}" fi # Check whether --with-z-inc or --without-z-inc was given. if test "${with_z_inc+set}" = set; then withval="$with_z_inc" CPPFLAGS="${CPPFLAGS} -I${withval}" fi echo $ac_n "checking for main in -lz""... $ac_c" 1>&6 echo "configure:980: checking for main in -lz" >&5 ac_lib_var=`echo z'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lz $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 LDFLAGS="${LDFLAGS} -lz" else echo "$ac_t""no" 1>&6 fi # Check whether --with-png or --without-png was given. if test "${with_png+set}" = set; then withval="$with_png" LDFLAGS="${LDFLAGS} -L${withval}" CPPFLAGS="${CPPFLAGS} -I${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}" fi # Check whether --with-png-lib or --without-png-lib was given. if test "${with_png_lib+set}" = set; then withval="$with_png_lib" LDFLAGS="${LDFLAGS} -L${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}" fi # Check whether --with-png-inc or --without-png-inc was given. if test "${with_png_inc+set}" = set; then withval="$with_png_inc" CPPFLAGS="${CPPFLAGS} -I${withval}" fi echo $ac_n "checking for main in -lpng""... $ac_c" 1>&6 echo "configure:1041: checking for main in -lpng" >&5 ac_lib_var=`echo png'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lpng $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 LDFLAGS="${LDFLAGS} -lpng" else echo "$ac_t""no" 1>&6 fi echo $ac_n "checking for gdImagePng in -lgd""... $ac_c" 1>&6 echo "configure:1078: checking for gdImagePng in -lgd" >&5 ac_lib_var=`echo gd'_'gdImagePng | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lgd -lpng -lz -lm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 LDFLAGS="${LDFLAGS} -lgd" GDFORM_EXT="png" else echo "$ac_t""no" 1>&6 GDFORM_EXT="" fi # Check whether --with-rrd or --without-rrd was given. if test "${with_rrd+set}" = set; then withval="$with_rrd" LDFLAGS="${LDFLAGS} -L${withval}/lib" CPPFLAGS="${CPPFLAGS} -I${withval}/include" LD_RUN_PATH="${withval}/lib${LD_RUN_PATH:+:}${LD_RUN_PATH}" fi # Check whether --with-rrd-lib or --without-rrd-lib was given. if test "${with_rrd_lib+set}" = set; then withval="$with_rrd_lib" LDFLAGS="${LDFLAGS} -L${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}" fi # Check whether --with-rrd-inc or --without-rrd-inc was given. if test "${with_rrd_inc+set}" = set; then withval="$with_rrd_inc" CPPFLAGS="${CPPFLAGS} -I${withval}" fi echo $ac_n "checking for rrd_fetch in -lrrd""... $ac_c" 1>&6 echo "configure:1150: checking for rrd_fetch in -lrrd" >&5 ac_lib_var=`echo rrd'_'rrd_fetch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lrrd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 LDFLAGS="${LDFLAGS} -lrrd" RRDFORM_EXT="found" else echo "$ac_t""no" 1>&6 RRDFORM_EXT="" fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo "configure:1193: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # This must be in double quotes, not single quotes, because CPP may get # substituted into the Makefile and "${CC-cc}" will confuse make. CPP="${CC-cc} -E" # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1214: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1231: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1248: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP=/lib/cpp fi rm -f conftest* fi rm -f conftest* fi rm -f conftest* ac_cv_prog_CPP="$CPP" fi CPP="$ac_cv_prog_CPP" else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 echo "configure:1273: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1286: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "memchr" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "free" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF if { (eval echo configure:1353: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_header_stdc=no fi rm -fr conftest* fi fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&6 if test $ac_cv_header_stdc = yes; then cat >> confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi for ac_hdr in malloc.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:1380: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1390: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done ac_safe=`echo "gd.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for gd.h""... $ac_c" 1>&6 echo "configure:1419: checking for gd.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1429: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 : else echo "$ac_t""no" 1>&6 GDFORM_EXT="" fi if test x$GDFORM_EXT = x; then echo echo "** The GD library is required for picnet to compile." echo " Get it from http://www.boutell.com, compile it and" echo " use either --with-gd-lib=DIR and --with-gd-inc=DIR to specify" echo " its location. You might also have to use --with-z-inc, --with-z-lib" echo " and --with-png-inc, --with-png-lib for gd versions 1.6 and higher." echo " Check config.log for more information on the problem. If your system" echo " has libgd installed, you probably mis the gd.h header file." exit 1 fi ac_safe=`echo "rrd.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for rrd.h""... $ac_c" 1>&6 echo "configure:1466: checking for rrd.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1476: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 DEFNS="${DEFNS} -DRRD" else echo "$ac_t""no" 1>&6 RRDFORM_EXT="" fi echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 echo "configure:1501: checking whether struct tm is in sys/time.h or time.h" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include int main() { struct tm *tp; tp->tm_sec; ; return 0; } EOF if { (eval echo configure:1514: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm=time.h else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_struct_tm=sys/time.h fi rm -f conftest* fi echo "$ac_t""$ac_cv_struct_tm" 1>&6 if test $ac_cv_struct_tm = sys/time.h; then cat >> confdefs.h <<\EOF #define TM_IN_SYS_TIME 1 EOF fi echo $ac_n "checking for strftime""... $ac_c" 1>&6 echo "configure:1536: checking for strftime" >&5 if eval "test \"`echo '$''{'ac_cv_func_strftime'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char strftime(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_strftime) || defined (__stub___strftime) choke me #else strftime(); #endif ; return 0; } EOF if { (eval echo configure:1564: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_strftime=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_strftime=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'strftime`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_STRFTIME 1 EOF else echo "$ac_t""no" 1>&6 # strftime is in -lintl on SCO UNIX. echo $ac_n "checking for strftime in -lintl""... $ac_c" 1>&6 echo "configure:1586: checking for strftime in -lintl" >&5 ac_lib_var=`echo intl'_'strftime | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lintl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_STRFTIME 1 EOF LIBS="-lintl $LIBS" else echo "$ac_t""no" 1>&6 fi fi echo # Check whether --enable-js or --disable-js was given. if test "${enable_js+set}" = set; then enableval="$enable_js" if test x$enableval = "xno" ;then DEFNS="${DEFNS} -DNOJS" echo "No JavaScript for your browser !"; fi fi # Check whether --enable-fr or --disable-fr was given. if test "${enable_fr+set}" = set; then enableval="$enable_fr" DEFNS="${DEFNS} -DFR" echo "Version francaise !" fi if test x$RRDFORM_EXT = "xfound" ;then echo "PicNet is going to work with RRD files !" else echo "PicNet is going to work with MRTG log files !" fi if test x${exec_prefix} != "xNONE"; then MRTG=${exec_prefix} else if test x${prefix} = "xNONE" ;then MRTG="/usr/local/mrtg-2/bin" else MRTG=${prefix}/bin fi fi if test -x $MRTG/mrtg -a x$PERL != "xno" ;then echo "MRTG found! Ready to be patched for PicNet." Ppatch=1 else echo "Not ready to patch MRTG..." fi echo trap '' 1 2 15 cat > confcache <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote substitution # turns \\\\ into \\, and sed turns \\ into \). sed -n \ -e "s/'/'\\\\''/g" \ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ;; esac >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. cat > conftest.defs <<\EOF s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g s%\[%\\&%g s%\]%\\&%g s%\$%$$%g EOF DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` rm -f conftest.defs # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.13" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@SHELL@%$SHELL%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@FFLAGS@%$FFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@bindir@%$bindir%g s%@sbindir@%$sbindir%g s%@libexecdir@%$libexecdir%g s%@datadir@%$datadir%g s%@sysconfdir@%$sysconfdir%g s%@sharedstatedir@%$sharedstatedir%g s%@localstatedir@%$localstatedir%g s%@libdir@%$libdir%g s%@includedir@%$includedir%g s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g s%@CC@%$CC%g s%@SET_MAKE@%$SET_MAKE%g s%@PERL@%$PERL%g s%@NROFF@%$NROFF%g s%@CPP@%$CPP%g s%@GDFORM_EXT@%$GDFORM_EXT%g s%@RRDFORM_EXT@%$RRDFORM_EXT%g s%@LD_RUN_PATH@%$LD_RUN_PATH%g s%@DEFNS@%$DEFNS%g s%@MRTG@%$MRTG%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_cmds # Line after last line for current file. ac_more_lines=: ac_sed_cmds="" while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file else sed "${ac_end}q" conftest.subs > conftest.s$ac_file fi if test ! -s conftest.s$ac_file; then ac_more_lines=false rm -f conftest.s$ac_file else if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f conftest.s$ac_file" else ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 echo echo "----------------------------------------------------------------" echo "Config is DONE!" echo echo "Type 'make' to compile the software" if test $Ppatch ;then echo "or type 'make install' to install PicNet (patching MRTG)." fi echo echo "----------------------------------------------------------------" picnet-1.2/doc/0040755000000000000000000000000007245304443012112 5ustar rootrootpicnet-1.2/doc/picnet.10100644000000000000000000003267207245304425013465 0ustar rootroot.\" Automatically generated by Pod::Man version 1.02 .\" Fri Feb 23 08:48:05 2001 .\" .\" Standard preamble: .\" ====================================================================== .de Sh \" Subsection heading .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. | will give a .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used .\" to do unbreakable dashes and therefore won't be available. \*(C` and .\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> .tr \(*W-|\(bv\*(Tr .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` ` . ds C' ' 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" If the F register is turned on, we'll generate index entries on stderr .\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and .\" index entries marked with X<> in POD. Of course, you'll have to process .\" the output yourself in some meaningful fashion. .if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" . . . nr % 0 . rr F .\} .\" .\" For nroff, turn off justification. Always turn off hyphenation; it .\" makes way too many mistakes in technical documents. .hy 0 .if n .na .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. .bd B 3 . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ====================================================================== .\" .IX Title "PICNET 1" .TH PICNET 1 "1.2" "2001-02-23" "picnet" .UC .SH "NAME" picnet \- Instructions for using \s-1PICNET\s0 for \s-1MRTG\s0 .SH "SYNOPSIS" .IX Header "SYNOPSIS" PicNet is a small tool that gives indication on network traffic on a graphic map. It takes information from \fB\s-1MRTG\s0 log\fR or \fB\s-1RRD\s0\fR files, and modifies the \s-1PNG\s0 image of your network so that links have colors based on the current traffic. .PP Then, it can generate an \s-1HTML\s0 page with this image used as an image map indexing \s-1MRTG\s0 stat pages. .PP PicNet can handle just one map or several maps with tree hierarchies (submaps). .PP The idea of PicNet was completely inspired on Rdlog2 by Philippe Simonet, . Anyway, it is quite different as PicNet works on raster images while Rdlog2 uses vector images. .SH "HISTORY LIST" .IX Header "HISTORY LIST" .Ip "v 1.2, (02/22/01) :" 4 .IX Item "v 1.2, (02/22/01) :" .Vb 5 \& - New installation with configure (autoconf). \& - New parameter 'Grapher' to specify the MRTG images directory \&or the CGI program (14all.cgi) for displaying the MRTG graphs. \& - Support for RRD files (Round Robin Database Tool). \& - Small bug corrected. .Ve .Ip "v 1.1, (10/27/00) :" 4 .IX Item "v 1.1, (10/27/00) :" .Vb 12 \& - You can create several maps by using prefixes '*' \&before parameters. \& - You can use the new parameter 'MapColorIdx' to get the max \&color of a submap in another map. So, you can create tree \&hierarchies of maps. \& - You can make HTTP links between maps with MapRect and MapPoly. \& - The few parameters that previously used '[indexmap]' \&pseudo-target have been changed. Now, they are normal parameters \&which names begin with 'Html'. \& - The doc is now written in the POD format. So, HTML, TXT and \&MAN pages are available. \& - Added a precompiled version for Win32 in a ZIP file. .Ve .Ip "v 1.0, (08/23/99) :" 4 .IX Item "v 1.0, (08/23/99) :" First version. .SH "REFERENCE PNG IMAGE" .IX Header "REFERENCE PNG IMAGE" PicNet needs a reference \s-1PNG\s0 image of your network (one per submap). .Sh "Why \s-1PNG\s0 image ?" .IX Subsection "Why PNG image ?" \&\fB\s-1PNG\s0\fR (Portable Network Graphics) is an extensible file format for the lossless, portable, well-compressed storage of raster images. \s-1PNG\s0 provides a patent-free replacement for \s-1GIF\s0 and can also replace many common uses of \s-1TIFF\s0. .PP \&\s-1PNG\s0 is designed to work well in online viewing applications, such as the World Wide Web. Current browsers can display \s-1PNG\s0 images. .PP The \fB\s-1GD\s0 library\fR now deals with 8\-bits \s-1PNG\s0 images. So this tool and \s-1MRTG\s0 generate \s-1PNG\s0 images. .Sh "How to create a reference image ?" .IX Subsection "How to create a reference image ?" You can use PaintShop Pro (on Windows) or any other tool to create it. You can draw your image as you want but you must respect the following rules : .PP \&\- The final image must be an \fB8\-bits \s-1PNG\s0\fR (256 colors). .PP \&\- You must use \fBone color\fR (not used anywhere else in the image) \&\fBper \s-1MRTG\s0 target or PicNet submap\fR and note its \fBindex value\fR (0* If you don't use such prefix, the default map name is \fIindexmap\fR. .PP \&\fBHere are the different tags\fR \&\fByou have to use to configure PicNet :\fR .PP the config manpage .SH "BEFORE BUILDING PICNET" .IX Header "BEFORE BUILDING PICNET" If you have a precompiled copy for Windows (\s-1ZIP\s0 file), go to the section : \&\s-1INSTALLING\s0 \s-1PICNET\s0 \s-1ON\s0 \s-1WINDOWS\s0. .PP If you don't have time and you want to install PicNet for Unix, go to the next section to install PicNet. .PP Well, you have the \s-1GZIP\s0 \s-1TAR\s0 file with PicNet sources. .PP First, you must obviously use \fB\s-1MRTG\s0\fR : http://www.ee.ethz.ch/~oetiker/webtools/mrtg/ .PP PicNet uses the \fB\s-1GD\s0 library\fR. You should have installed it as \s-1MRTG\s0 needs it. http://www.boutell.com/gd/ .PP You can optionaly use \fB\s-1RRDTOOL\s0\fR. So, PicNet will work with \s-1RRD\s0 files. http://www.ee.ethz.ch/~oetiker/webtools/rrdtool/ .PP In order to build PicNet, you must have the following files : .PP .Vb 8 \& def.h \& cfg.h \& loadcfg.c \& mkhtml.h \& mkpic.h \& mkhtml.c \& mkpic.c \& picnet.c .Ve If you don't like the current colors for the traffic rate, you can modify it in def.h. You can also add other levels of colors (in cfg.h and def.h). .SH "INSTALLING PICNET ON UNIX" .IX Header "INSTALLING PICNET ON UNIX" \&\s-1NB\s0 : Before executing picnet, you must create a \fB\s-1PNG\s0 image of your \&\f(BInetwork\fB\|(s)\fR (the image manpage) and a \fBconfig file\fR (the config manpage). .PP If everything is okay (no pb with paths), you should be able to install PicNet this way : .PP .Vb 2 \& ./configure \& make install .Ve Then, you must use the following syntax in the call to mrtg : .PP .Vb 1 \& /mrtg /mrtg.cfg /picnet.cfg .Ve \&\fBThat's all !\fR .PP But if you have to specify paths or select options, here it is... .PP You can specify many arguments to ./configure. Check \fB./configure \-\-help\fR. .PP Here are the main arguments : .PP .Vb 5 \& --prefix= \& --with-gd= \& --with-rrd= \& --enable-fr \& --disable-js .Ve If \fIconfigure\fR fails to find \s-1MRTG\s0, you won't be able to use \&'\fBmake install\fR' to patch \s-1MRTG\s0 for PicNet. However, you can use '\fBmake\fR' to create \fIpicnet\fR file and patch \fImrtg\fR later (see the chapter \&\*(L"\s-1CALLING\s0 \s-1PICNET\s0\*(R"). .PP If \fIconfigure\fR finds RRDTool, PicNet will use \s-1RRD\s0 files, else it will use log files. .PP \&\fI\*(--enable-fr\fR configures PicNet for \s-1HTML\s0 pages in french (I'm french ;\-) ) .PP \&\fI\*(--disable-js\fR for those who don't like JavaScript in the \s-1HTML\s0 pages... .SH "INSTALLING PICNET ON WINDOWS" .IX Header "INSTALLING PICNET ON WINDOWS" Get the latest release of PicNet for Win32 in \s-1ZIP\s0 format. It contains a precompiled copy (with CygWin and \s-1GCC\s0). Unzip the \s-1ZIP\s0 archive and install the mandatory files where you want : picnet.exe cygwin1.dll libpng.dll libz.dll .PP You must set the \s-1TZ\s0 variable to your timezone (for Windows 9X, add \&\fIset TZ=GMT+11\fR (your timezone !) to \fIautoexec.bat\fR). .PP Obviously, you must create \fBreference \f(BIimage\fB\|(s)\fR and a \&\fBconfiguration file\fR (see above). .PP In the configuration file, you must set \fBWorkDir\fR as a Windows directory : \fID:\eInetPub\ewwwroot\eMRTG\fR (no problem with long names and spaces). .SH "CALLING PICNET" .IX Header "CALLING PICNET" \&\s-1NB:\s0 If you have succeeded in installing PicNet on Unix with 'make install', \&\s-1MRTG\s0 is already patched for PicNet ! .PP The command-line parameters are : .PP .Vb 1 \& picnet .Ve But this command executes picnet just once. Then, you have 2 ways to run picnet regularly... .Ip "Patch \s-1MRTG\s0 for PicNet" 4 .IX Item "Patch MRTG for PicNet" 1\- Copy \fIpicnet\fR (or \fIpicnet.exe\fR) and \fIpatch.pm\fR in the same directory as the \&\fImrtg\fR file. .Sp 2\- Backup \fImrtg\fR (\fIcp mrtg mrtg.bak\fR). .Sp 3\- Apply the Perl module \fIpatch.pm\fR to mrtg on standard input (or first argument) and get patched mrtg on standard output : .Sp .Vb 1 \& perl patch.pm mrtg.bak >mrtg .Ve 4\- Now, you can use the following syntax in the call to mrtg : .Sp .Vb 1 \& /mrtg /mrtg.cfg /picnet.cfg .Ve and PicNet will run when mrtg updates the data. .Sp Note that if you don't add a second parameter to the mrtg command-line, picnet will use the first one (\fImrtg.cfg\fR) as its configuration file. .Ip "Use a Scheduler" 4 .IX Item "Use a Scheduler" You may use a \fBscheduler\fR to execute the \fIpicnet\fR command whenever \s-1MRTG\s0 data is updated (usually, every 5 minutes). .Sp You should add picnet in your crontab on Unix. I advise you to launch it after mrtg... .Sp Example: .Sp .Vb 3 \& 0,5,10,15,20,25,30,35,40,45,50,55 * * * * \e \& /mrtg /mrtg.cfg; \e \& /picnet /picnet.cfg .Ve or in Linux : .Sp .Vb 2 \& */5 * * * * /mrtg /mrtg.cfg; \e \& /picnet /picnet.cfg .Ve .SH "AUTHOR" .IX Header "AUTHOR" Laurent Derrien, .PP 9.9.99 (last update 02.22.01) picnet-1.2/doc/config.10100644000000000000000000003744407245304426013453 0ustar rootroot.\" Automatically generated by Pod::Man version 1.02 .\" Fri Feb 23 08:48:05 2001 .\" .\" Standard preamble: .\" ====================================================================== .de Sh \" Subsection heading .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. | will give a .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used .\" to do unbreakable dashes and therefore won't be available. \*(C` and .\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> .tr \(*W-|\(bv\*(Tr .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` ` . ds C' ' 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" If the F register is turned on, we'll generate index entries on stderr .\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and .\" index entries marked with X<> in POD. Of course, you'll have to process .\" the output yourself in some meaningful fashion. .if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" . . . nr % 0 . rr F .\} .\" .\" For nroff, turn off justification. Always turn off hyphenation; it .\" makes way too many mistakes in technical documents. .hy 0 .if n .na .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. .bd B 3 . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ====================================================================== .\" .IX Title "CONFIG 1" .TH CONFIG 1 "1.2" "2001-02-16" "picnet" .UC .SH "NAME" config \- \s-1PICNET\s0 configuration reference .SH "OVERVIEW" .IX Header "OVERVIEW" PicNet needs a \fBreference \s-1PNG\s0 image\fR (actually 1 per map) and a \&\fBconfiguration file\fR (check the picnet manpage)... .PP This document describes all the configuration options understood by the picnet software. .SH "SYNTAX" .IX Header "SYNTAX" PicNet configuration file looks like \s-1MRTG\s0 one. So it is very easy if you are familiar to mrtg.cfg... .PP If you used automatic generation of your \s-1MRTG\s0 config file, you should have a look at this file to get the name of targets. Then, you can edit the \fBPicNet config file example\fR (\fIex.cfg\fR) to meet your needs. .PP PicNet configuration file syntax follows some simple rules : .Ip "\(bu" 4 Keywords must start at the beginning of a line or after the symbol '*' (so the leading string is supposed to be a map name). .Ip "\(bu" 4 Lines which first character is '#' or a space are ignored (comments). .Ip "\(bu" 4 Other lines are analysed but without effect if no valid mandatory keyword is found. .SH "MAPS NAMING" .IX Header "MAPS NAMING" Note than you can use PicNet with one map or with \fBseveral maps\fR (tree hierarchies are possible with \fIMapColorIdx\fR). For using several maps, you must specify the name of each map as a prefix to its parameters ('*' is the separator). .PP All the parameters (even global parameters if used with a prefix) can apply to one specified map. .PP Example : .PP .Vb 1 \& net1*ImageRef: ex.png .Ve The default map (no '*' prefix) is named \fIindexmap\fR. .PP All the non-global parameters without prefix apply to this default map (\fIindexmap\fR). Global parameters without prefix obviously apply to all the maps defined. .SH "GLOBAL PARAMETERS" .IX Header "GLOBAL PARAMETERS" .Sh "Workdir" .IX Subsection "Workdir" Workdir specifies where the logfiles (or rrdfiles) and reference image are and where the resulting image and webpage should be created. .PP Example: .PP .Vb 1 \& WorkDir: /www/html/mrtg .Ve Note that you can specify a WorkDir per map. .Sh "Grapher" .IX Subsection "Grapher" Grapher specifies the command (\s-1CGI\s0 script) or Web path to access the graph \s-1MRTG\s0 pages. .PP If the Grapher string ends with a \fB/\fR or \fB\e\fR, PicNet assumes it is a Web path and adds \fB.html\fR to the \s-1MRTG\s0 target name. .PP If omited, PicNet will look for \s-1HTML\s0 graph pages in the same directory as the resulting webpage (ie. WorkDir). .PP Examples: .PP .Vb 1 \& Grapher: /cgi-bin/14all.cgi?log= .Ve .Vb 1 \& net1*Grapher: /mrtg/net1/ .Ve Note that you can specify a Grapher per map. .Sh "Refresh" .IX Subsection "Refresh" How many seconds apart should the browser (Netscape, \s-1IE\s0) be instructed to reload the page? If this is not defined, the default is 300 seconds (5 minutes). .PP Example: .PP .Vb 1 \& Refresh: 600 .Ve Note that you can specify a Refresh per map. .SH "PER MAP CONFIGURATION" .IX Header "PER MAP CONFIGURATION" .Sh "ImageRef" .IX Subsection "ImageRef" The name of the reference image. To create such a file, read the instructions in the picnet manpage. .PP This parameter is mandatory. You must not use the map name as the ImageRef name if you use the default ImageNet name : your reference image will be replaced ! .PP Examples: .PP .Vb 2 \& ImageRef: mynet.png \& net1*ImageRef: imref1.png .Ve .Sh "ImageNet" .IX Subsection "ImageNet" The name of the image resulting of the PicNet process. .PP This parameter is optional. If not specified, the name of this image is the name of the map followed by '.png'. .PP Examples: .PP .Vb 2 \& ImageNet: traffic.png \& mynet*ImageNet: imnet2.png .Ve .Sh "HtmlTitle" .IX Subsection "HtmlTitle" This is the title of the \s-1HTML\s0 page displaying the processed image. .PP You must specify \fIHtmlTitle\fR or \fIHtmlPageHeader\fR in order to generate the \&\s-1HTML\s0 page for a map. .PP \&\fBThe name of an \s-1HTML\s0 page for a map is the name of this map followed by \&'.html'.\fR .PP Example: .PP .Vb 2 \& HtmlTitle: Current traffic on my network (indexmap.html) \& net3*HtmlTitle: Current traffic on a distant network .Ve .Sh "HtmlPageHeader" .IX Subsection "HtmlPageHeader" This is the first \s-1HTML\s0 code line in the \s-1HTML\s0 page. Sorry, the header is limited to the line and about 100 characters. .PP You must specify \fIHtmltitle\fR or \fIHtmlPageHeader\fR in order to generate the \&\s-1HTML\s0 page for a map. .PP Examples: .PP .Vb 2 \& HtmlPageHeader:

Our Company Network
Current Traffic

\& Net1*HtmlPageHeader:

NET1 Current Traffic

.Ve .Sh "HtmlAreasDef" .IX Subsection "HtmlAreasDef" So, you can specify a file with definitions of other clickable areas on your network image. These areas are defined using the \&\s-1HTML\s0 \s-1AREA\s0 tag. The file must be in the WorkDir directory. .PP HtmlAreasDef is useful only if you specify HtmlTitle or HtmlPageHeader in order to generate the \s-1HTML\s0 page for the map. .PP Examples: .PP .Vb 2 \& HtmlAreasDef: other.areas \& net*HtmlAreasDef: webmin.areas .Ve And the content of other.areas is : .PP .Vb 3 \& info \& mypage \& ... .Ve .SH "PER MAP AND TARGET CONFIGURATION" .IX Header "PER MAP AND TARGET CONFIGURATION" .Sh "ColorIdx" .IX Subsection "ColorIdx" ColorIdx is the color index value of the graphical object (line...) which color will change depending on values in the corresponding mrtg log file (traffic present on a link). .PP The new color depends on the \fBmaximum of the 2 values\fR extracted from the mrtg log file (incoming and outgoing traffic for a router interface). Nowadays, there are 10 different colors (0\-10 %, 10\-20%, ...) but they can be modified before compiling in cfg.h and def.h. .PP Examples: .PP .Vb 2 \& ColorIdx[ezwf]: 250 \& net2*ColorIdx[r1.1]: 245 .Ve .Sh "ColorIdxIn" .IX Subsection "ColorIdxIn" ColorIdxIn is the color index value of the graphical object (line...) which color will change depending on the first value in the corresponding mrtg log file (\fBincoming traffic\fR on a link). .PP Examples: .PP .Vb 2 \& ColorIdxIn[ezwf]: 251 \& net2*ColorIdxIn[r1.1]: 246 .Ve .Sh "ColorIdxOut" .IX Subsection "ColorIdxOut" ColorIdxOut is the color index value of the graphical object (line...) which color will change depending on the second value in the corresponding mrtg log file (\fBoutgoing traffic\fR on a link). .PP Examples: .PP .Vb 2 \& ColorIdxOut[ezwf]: 252 \& net2*ColorIdxOut[r1.1]: 247 .Ve .Sh "MaxRate" .IX Subsection "MaxRate" MaxRate is the maximum possible value processed from the corresponding \s-1MRTG\s0 log file. Actually, it is the \fBmaximum of the two values\fR. .PP It is essential for computing the percentage which final color of ColorIdx depends on. Nowadays, there are 10 different colors (0\-10 %, 10\-20%, ...) but they can be modified before compiling in cfg.h and def.h. .PP For a router interface, it is the maximum traffic rate on the link. By default, the value is in bytes per second. But you can specify it in bits per second by adding \*(L"bps\*(R" after the value. .PP Examples: .PP .Vb 2 \& MaxRate[ezwf]: 64000 bps \& net1*MaxRate[r1.1]: 128000 bps .Ve .Sh "MaxRateIn" .IX Subsection "MaxRateIn" MaxRateIn is the maximum possible value processed from the corresponding \s-1MRTG\s0 log file. Actually, it is the \fBmaximum of the first value\fR. .PP It is essential for computing the percentage which final color of ColorIdxIn depends on. .PP For a router interface, it is the maximum incoming traffic rate on the link. By default, the value is in bytes per second. But you can specify it in bits per second by adding \*(L"bps\*(R" after the value. .PP Examples: .PP .Vb 2 \& MaxRateIn[ezwf]: 128000 bps \& net1*MaxRateIn[temp]: 80 .Ve .Sh "MaxRateOut" .IX Subsection "MaxRateOut" MaxRateOut is the maximum possible value processed from the corresponding \s-1MRTG\s0 log file. Actually, it is the \fBmaximum of the second value\fR. .PP It is essential for computing the percentage which final color of ColorIdxOut depends on. .PP For a router interface, it is the maximum outgoing traffic rate on the link. By default, the value is in bytes per second. But you can specify it in bits per second by adding \*(L"bps\*(R" after the value. .PP Examples: .PP .Vb 2 \& MaxRateOut[ezwf]: 8000 \& net2*MaxRateOut[r1.1]: 64000 bps .Ve .Sh "Rounds" .IX Subsection "Rounds" With Rounds, you specify the number of \s-1MRTG\s0 intervals you want PicNet to average values on. .PP Examples: .PP Here, if \s-1MRTG\s0 is executed every 5 minutes for ezwf, you will display the average traffic on the last hour. .PP .Vb 2 \& Rounds[ezwf]: 12 \& net2*Rounds[r1.1]: 12 .Ve .Sh "MapRect" .IX Subsection "MapRect" With MapRect, you can define a clickable rectangle on the image of your network to access an \s-1HTML\s0 \s-1MRTG\s0 stats page or a PicNet submap (see the next chapter). .PP You must specify the X1,Y1,X2,Y2 where (X1,Y1) is the upper left corner of the clickable rectangle and (X2,Y2) is the lower right corner. .PP For an object, you can define many MapRects (no limit other than memory). But these instructions will apply only if you specify HtmlTitle or HtmlPageHeader so that the \s-1HTML\s0 page will be created. .PP Note that the linked \s-1HTML\s0 pages must be in the same directory as the PicNet map \s-1HTML\s0 page. .PP Example: .PP In this example, when you click into the rectangle defined by the corners (126,76) and (234,85) on the image, you will access the \s-1MRTG\s0 stats page for ezwf. .PP .Vb 1 \& MapRect[ezwf]: 126,76,234,85 .Ve .Sh "MapPoly" .IX Subsection "MapPoly" With MapPoly, you can define a clickable polygon on the image of your network to access an \s-1HTML\s0 \s-1MRTG\s0 stats page or a PicNet submap (see the next chapter). .PP You must specify the X1,Y1,X2,Y2,X3,Y3,...Xi,Yi where (Xi,Yi) are points of the polygon. .PP Please, refer to the MapRect comments above. .PP Example: .PP In this example, when you click into the polygon defined by the points (126,76), (234,85), (220,87) and (120,77) on the image, you will access the \s-1MRTG\s0 stats page for ezwf. .PP .Vb 1 \& net1*MapPoly[ezwf]: 126,76,234,85,220,87,120,77 .Ve .SH "LINKS BETWEEN MAPS" .IX Header "LINKS BETWEEN MAPS" .Sh "MapColorIdx" .IX Subsection "MapColorIdx" MapColorIdx is the color index value of the specified submap which color will change depending on the \fBmaximum color value of all the objects\fR included in this submap. Obviously, the objects included in the submap can be \s-1MRTG\s0 targets or other submaps. So, you can define a tree hierarchy (as large as you want). .PP \&\fBTake care not to create loops which is non-sense !\fR PicNet does not check it. .PP Examples: .PP .Vb 3 \& MapColorIdx[net2]: 250 \& net2*MapColorIdx[net3]: 235 \& net3*ColorIdx[ezwf]: 240 .Ve .Sh "MapRect" .IX Subsection "MapRect" With MapRect, you can define a clickable rectangle on the image of your network to access another PicNet map (or an \s-1HTML\s0 \s-1MRTG\s0 stats page). .PP Please, refer to the description of MapRect above. .PP You can create all the links you want between maps provided the \&\s-1HTML\s0 pages are in the same directory... There is no loop problem. .PP Example: .PP In this example, when you click into the rectangle defined by the corners (126,76) and (234,85) on the image of net1, you will access the map net2 and the reverse. .PP .Vb 2 \& net1*MapRect[net2]: 126,76,234,85 \& net2*MapRect[net1]: 126,76,234,85 .Ve .Sh "MapPoly" .IX Subsection "MapPoly" With MapPoly, you can define a clickable polygon on the image of your network to access an other PicNet map (or an \s-1HTML\s0 \s-1MRTG\s0 stats page). .PP Please, refer to the description of MapPoly above. .PP You can create all the links you want between maps provided the \&\s-1HTML\s0 pages are in the same directory... There is no loop problem. .PP Example: .PP In this example, when you click into the polygon defined by the points (126,76), (234,85), (220,87) and (120,77) on the image, you will access the map net1. .PP .Vb 1 \& MapPoly[net1]: 126,76,234,85,220,87,120,77 .Ve .SH "AUTHOR" .IX Header "AUTHOR" Laurent Derrien, .PP 9.9.99 (last update 10.24.00) picnet-1.2/doc/image.10100644000000000000000000001433507245304426013262 0ustar rootroot.\" Automatically generated by Pod::Man version 1.02 .\" Fri Feb 23 08:48:06 2001 .\" .\" Standard preamble: .\" ====================================================================== .de Sh \" Subsection heading .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Ip \" List item .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. | will give a .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used .\" to do unbreakable dashes and therefore won't be available. \*(C` and .\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> .tr \(*W-|\(bv\*(Tr .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` ` . ds C' ' 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" If the F register is turned on, we'll generate index entries on stderr .\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and .\" index entries marked with X<> in POD. Of course, you'll have to process .\" the output yourself in some meaningful fashion. .if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" . . . nr % 0 . rr F .\} .\" .\" For nroff, turn off justification. Always turn off hyphenation; it .\" makes way too many mistakes in technical documents. .hy 0 .if n .na .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. .bd B 3 . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ====================================================================== .\" .IX Title "IMAGE 1" .TH IMAGE 1 "1.2" "2001-01-10" "picnet" .UC .SH "NAME" image \- Tutorial for creating a reference image .SH "OVERVIEW" .IX Header "OVERVIEW" This is just one way to create a reference image. You can use another way. .PP Anyway, you must respect the following rules : .Ip "\(bu" 4 The final image must be an \fB8\-bits \s-1PNG\s0\fR (256 colors). .Ip "\(bu" 4 You must use \fBone color\fR (not used anywhere else in the image) \&\fBper \s-1MRTG\s0 target or PicNet submap\fR and note its \fBindex value\fR (0 .PP 9.9.99 (last update 10.20.00) picnet-1.2/doc/picnet.pod0100644000000000000000000002042507245303323014074 0ustar rootroot=head1 NAME picnet - Instructions for using PICNET for MRTG =head1 SYNOPSIS PicNet is a small tool that gives indication on network traffic on a graphic map. It takes information from B or B files, and modifies the PNG image of your network so that links have colors based on the current traffic. Then, it can generate an HTML page with this image used as an image map indexing MRTG stat pages. PicNet can handle just one map or several maps with tree hierarchies (submaps). The idea of PicNet was completely inspired on Rdlog2 by Philippe Simonet, Ephilippe.simonet@swisstelecom.comE. Anyway, it is quite different as PicNet works on raster images while Rdlog2 uses vector images. =head1 HISTORY LIST =over =item v 1.2, (02/22/01) : - New installation with configure (autoconf). - New parameter 'Grapher' to specify the MRTG images directory or the CGI program (14all.cgi) for displaying the MRTG graphs. - Support for RRD files (Round Robin Database Tool). - Small bug corrected. =item v 1.1, (10/27/00) : - You can create several maps by using prefixes '*' before parameters. - You can use the new parameter 'MapColorIdx' to get the max color of a submap in another map. So, you can create tree hierarchies of maps. - You can make HTTP links between maps with MapRect and MapPoly. - The few parameters that previously used '[indexmap]' pseudo-target have been changed. Now, they are normal parameters which names begin with 'Html'. - The doc is now written in the POD format. So, HTML, TXT and MAN pages are available. - Added a precompiled version for Win32 in a ZIP file. =item v 1.0, (08/23/99) : First version. =back =head1 REFERENCE PNG IMAGE PicNet needs a reference PNG image of your network (one per submap). =head2 Why PNG image ? B (Portable Network Graphics) is an extensible file format for the lossless, portable, well-compressed storage of raster images. PNG provides a patent-free replacement for GIF and can also replace many common uses of TIFF. PNG is designed to work well in online viewing applications, such as the World Wide Web. Current browsers can display PNG images. The B now deals with 8-bits PNG images. So this tool and MRTG generate PNG images. =head2 How to create a reference image ? You can use PaintShop Pro (on Windows) or any other tool to create it. You can draw your image as you want but you must respect the following rules : - The final image must be an B<8-bits PNG> (256 colors). - You must use B (not used anywhere else in the image) B and note its B (0EiE256). An MRTG target is any object your MRTG monitors (data stored in log files). Usually, the MRTG targets are links (but it can be a Squid server, a mail server or a disk...). Then you will "tell" PicNet (in the config file) to change these colors with the traffic rate color of these links or objects. Note that these objects can also be PicNet maps (submaps). The color of a submap will be the max color of its objects. So, you can make a tree hierarchy of PicNet maps. Besides, you can use your network image(s) B, PicNet maps and other HTML pages. If you want to do it, you should note the X, Y values of the upper left and lower right corners for clickable squares or X, Y values of all the corners for clickable polygons. B L =head1 PICNET CONFIGURATION FILE PicNet needs a F and a F... PicNet configuration file looks like MRTG one. So it is very easy if you are familiar to mrtg.cfg... If you used automatic generation of your MRTG config file, you should have a look at this file to get the name of targets. Then, you can edit the PicNet config file example, F, to meet your needs. If you want several PicNet maps, you just have to prefix config instructions with : * If you don't use such prefix, the default map name is F. B B L =head1 BEFORE BUILDING PICNET If you have a precompiled copy for Windows (ZIP file), go to the section : INSTALLING PICNET ON WINDOWS. If you don't have time and you want to install PicNet for Unix, go to the next section to install PicNet. Well, you have the GZIP TAR file with PicNet sources. First, you must obviously use B : http://www.ee.ethz.ch/~oetiker/webtools/mrtg/ PicNet uses the B. You should have installed it as MRTG needs it. http://www.boutell.com/gd/ You can optionaly use B. So, PicNet will work with RRD files. http://www.ee.ethz.ch/~oetiker/webtools/rrdtool/ In order to build PicNet, you must have the following files : def.h cfg.h loadcfg.c mkhtml.h mkpic.h mkhtml.c mkpic.c picnet.c If you don't like the current colors for the traffic rate, you can modify it in def.h. You can also add other levels of colors (in cfg.h and def.h). =head1 INSTALLING PICNET ON UNIX NB : Before executing picnet, you must create a B (L) and a B (L). If everything is okay (no pb with paths), you should be able to install PicNet this way : ./configure make install Then, you must use the following syntax in the call to mrtg : /mrtg /mrtg.cfg /picnet.cfg B But if you have to specify paths or select options, here it is... You can specify many arguments to ./configure. Check B<./configure --help>. Here are the main arguments : --prefix= --with-gd= --with-rrd= --enable-fr --disable-js If F fails to find MRTG, you won't be able to use 'B' to patch MRTG for PicNet. However, you can use 'B' to create F file and patch F later (see the chapter "CALLING PICNET"). If F finds RRDTool, PicNet will use RRD files, else it will use log files. F<--enable-fr> configures PicNet for HTML pages in french (I'm french ;-) ) F<--disable-js> for those who don't like JavaScript in the HTML pages... =head1 INSTALLING PICNET ON WINDOWS Get the latest release of PicNet for Win32 in ZIP format. It contains a precompiled copy (with CygWin and GCC). Unzip the ZIP archive and install the mandatory files where you want : picnet.exe cygwin1.dll libpng.dll libz.dll You must set the TZ variable to your timezone (for Windows 9X, add F (your timezone !) to F). Obviously, you must create B and a B (see above). In the configuration file, you must set B as a Windows directory : F (no problem with long names and spaces). =head1 CALLING PICNET NB: If you have succeeded in installing PicNet on Unix with 'make install', MRTG is already patched for PicNet ! The command-line parameters are : picnet But this command executes picnet just once. Then, you have 2 ways to run picnet regularly... =over =item Patch MRTG for PicNet 1- Copy F (or F) and F in the same directory as the F file. 2- Backup F (F). 3- Apply the Perl module F to mrtg on standard input (or first argument) and get patched mrtg on standard output : perl patch.pm mrtg.bak >mrtg 4- Now, you can use the following syntax in the call to mrtg : /mrtg /mrtg.cfg /picnet.cfg and PicNet will run when mrtg updates the data. Note that if you don't add a second parameter to the mrtg command-line, picnet will use the first one (F) as its configuration file. =item Use a Scheduler You may use a B to execute the F command whenever MRTG data is updated (usually, every 5 minutes). You should add picnet in your crontab on Unix. I advise you to launch it after mrtg... Example: 0,5,10,15,20,25,30,35,40,45,50,55 * * * * \ /mrtg /mrtg.cfg; \ /picnet /picnet.cfg or in Linux : */5 * * * * /mrtg /mrtg.cfg; \ /picnet /picnet.cfg =back =head1 AUTHOR Laurent Derrien, Ederrien@canl.ncE 9.9.99 (last update 02.22.01) picnet-1.2/doc/picnet.html0100644000000000000000000002720707245304430014263 0ustar rootroot doc/picnet

NAME

picnet - Instructions for using PICNET for MRTG


SYNOPSIS

PicNet is a small tool that gives indication on network traffic on a graphic map. It takes information from MRTG log or RRD files, and modifies the PNG image of your network so that links have colors based on the current traffic.

Then, it can generate an HTML page with this image used as an image map indexing MRTG stat pages.

PicNet can handle just one map or several maps with tree hierarchies (submaps).

The idea of PicNet was completely inspired on Rdlog2 by Philippe Simonet, <philippe.simonet@swisstelecom.com>. Anyway, it is quite different as PicNet works on raster images while Rdlog2 uses vector images.


HISTORY LIST

v 1.2, (02/22/01) :
 - New installation with configure (autoconf).
 - New parameter 'Grapher' to specify the MRTG images directory 
or the CGI program (14all.cgi) for displaying the MRTG graphs. 
 - Support for RRD files (Round Robin Database Tool).
 - Small bug corrected.
v 1.1, (10/27/00) :
 - You can create several maps by using prefixes '<your_map_n>*' 
before parameters.
 - You can use the new parameter 'MapColorIdx' to get the max 
color of a submap in another map. So, you can create tree 
hierarchies of maps.
 - You can make HTTP links between maps with MapRect and MapPoly.
 - The few parameters that previously used '[indexmap]'
pseudo-target have been changed. Now, they are normal parameters 
which names begin with 'Html'.
 - The doc is now written in the POD format. So, HTML, TXT and 
MAN pages are available.
 - Added a precompiled version for Win32 in a ZIP file.
v 1.0, (08/23/99) :
First version.


REFERENCE PNG IMAGE

PicNet needs a reference PNG image of your network (one per submap).

Why PNG image ?

PNG (Portable Network Graphics) is an extensible file format for the lossless, portable, well-compressed storage of raster images. PNG provides a patent-free replacement for GIF and can also replace many common uses of TIFF.

PNG is designed to work well in online viewing applications, such as the World Wide Web. Current browsers can display PNG images.

The GD library now deals with 8-bits PNG images. So this tool and MRTG generate PNG images.

How to create a reference image ?

You can use PaintShop Pro (on Windows) or any other tool to create it. You can draw your image as you want but you must respect the following rules :

- The final image must be an 8-bits PNG (256 colors).

- You must use one color (not used anywhere else in the image) per MRTG target or PicNet submap and note its index value (0<i<256).

An MRTG target is any object your MRTG monitors (data stored in log files). Usually, the MRTG targets are links (but it can be a Squid server, a mail server or a disk...).

Then you will ``tell'' PicNet (in the config file) to change these colors with the traffic rate color of these links or objects.

Note that these objects can also be PicNet maps (submaps). The color of a submap will be the max color of its objects. So, you can make a tree hierarchy of PicNet maps.

Besides, you can use your network image(s) to index MRTG stats pages, PicNet maps and other HTML pages. If you want to do it, you should note the X, Y values of the upper left and lower right corners for clickable squares or X, Y values of all the corners for clickable polygons.

Here is a tutorial for making a reference image using PaintShop Pro 5 :

the image manpage


PICNET CONFIGURATION FILE

PicNet needs a reference PNG image and a configuration file...

PicNet configuration file looks like MRTG one. So it is very easy if you are familiar to mrtg.cfg...

If you used automatic generation of your MRTG config file, you should have a look at this file to get the name of targets. Then, you can edit the PicNet config file example, ex.cfg, to meet your needs.

If you want several PicNet maps, you just have to prefix config instructions with : <name_of_map>* If you don't use such prefix, the default map name is indexmap.

Here are the different tags you have to use to configure PicNet :

the config manpage


BEFORE BUILDING PICNET

If you have a precompiled copy for Windows (ZIP file), go to the section : INSTALLING PICNET ON WINDOWS.

If you don't have time and you want to install PicNet for Unix, go to the next section to install PicNet.

Well, you have the GZIP TAR file with PicNet sources.

First, you must obviously use MRTG : http://www.ee.ethz.ch/~oetiker/webtools/mrtg/

PicNet uses the GD library. You should have installed it as MRTG needs it. http://www.boutell.com/gd/

You can optionaly use RRDTOOL. So, PicNet will work with RRD files. http://www.ee.ethz.ch/~oetiker/webtools/rrdtool/

In order to build PicNet, you must have the following files :

 def.h
 cfg.h
 loadcfg.c
 mkhtml.h
 mkpic.h
 mkhtml.c
 mkpic.c
 picnet.c

If you don't like the current colors for the traffic rate, you can modify it in def.h. You can also add other levels of colors (in cfg.h and def.h).


INSTALLING PICNET ON UNIX

NB : Before executing picnet, you must create a PNG image of your network(s) (the image manpage) and a config file (the config manpage).

If everything is okay (no pb with paths), you should be able to install PicNet this way :

 ./configure
 make install

Then, you must use the following syntax in the call to mrtg :

 <mrtg-bin>/mrtg <mrtg-cfg>/mrtg.cfg <picnet-cfg>/picnet.cfg

That's all !

But if you have to specify paths or select options, here it is...

You can specify many arguments to ./configure. Check ./configure --help.

Here are the main arguments :

 --prefix=<path to MRTG>
 --with-gd=<path to GD>
 --with-rrd=<path to RRDTool>
 --enable-fr
 --disable-js

If configure fails to find MRTG, you won't be able to use 'make install' to patch MRTG for PicNet. However, you can use 'make' to create picnet file and patch mrtg later (see the chapter ``CALLING PICNET'').

If configure finds RRDTool, PicNet will use RRD files, else it will use log files.

--enable-fr configures PicNet for HTML pages in french (I'm french ;-) )

--disable-js for those who don't like JavaScript in the HTML pages...


INSTALLING PICNET ON WINDOWS

Get the latest release of PicNet for Win32 in ZIP format. It contains a precompiled copy (with CygWin and GCC). Unzip the ZIP archive and install the mandatory files where you want : picnet.exe cygwin1.dll libpng.dll libz.dll

You must set the TZ variable to your timezone (for Windows 9X, add set TZ=GMT+11 (your timezone !) to autoexec.bat).

Obviously, you must create reference image(s) and a configuration file (see above).

In the configuration file, you must set WorkDir as a Windows directory : D:\InetPub\wwwroot\MRTG (no problem with long names and spaces).


CALLING PICNET

NB: If you have succeeded in installing PicNet on Unix with 'make install', MRTG is already patched for PicNet !

The command-line parameters are :

 picnet <config-file>

But this command executes picnet just once. Then, you have 2 ways to run picnet regularly...

Patch MRTG for PicNet
1- Copy picnet (or picnet.exe) and patch.pm in the same directory as the mrtg file.

2- Backup mrtg (cp mrtg mrtg.bak).

3- Apply the Perl module patch.pm to mrtg on standard input (or first argument) and get patched mrtg on standard output :

 perl patch.pm mrtg.bak >mrtg

4- Now, you can use the following syntax in the call to mrtg :

 <mrtg-bin>/mrtg <mrtg-cfg>/mrtg.cfg <picnet-cfg>/picnet.cfg

and PicNet will run when mrtg updates the data.

Note that if you don't add a second parameter to the mrtg command-line, picnet will use the first one (mrtg.cfg) as its configuration file.

Use a Scheduler
You may use a scheduler to execute the picnet command whenever MRTG data is updated (usually, every 5 minutes).

You should add picnet in your crontab on Unix. I advise you to launch it after mrtg...

Example:

 0,5,10,15,20,25,30,35,40,45,50,55 * * * * \
       <mrtg-bin>/mrtg <path to mrtg-cfg>/mrtg.cfg; \
       <picnet-bin>/picnet <path to picnet-cfg>/picnet.cfg

or in Linux :

 */5 * * * *  <mrtg-bin>/mrtg <path to mrtg-cfg>/mrtg.cfg; \
       <picnet-bin>/picnet <path to picnet-cfg>/picnet.cfg


AUTHOR

Laurent Derrien, <derrien@canl.nc>

9.9.99 (last update 02.22.01)

picnet-1.2/doc/config.html0100644000000000000000000003462007245304430014243 0ustar rootroot doc/config

NAME

config - PICNET configuration reference


OVERVIEW

PicNet needs a reference PNG image (actually 1 per map) and a configuration file (check the picnet manpage)...

This document describes all the configuration options understood by the picnet software.


SYNTAX

PicNet configuration file looks like MRTG one. So it is very easy if you are familiar to mrtg.cfg...

If you used automatic generation of your MRTG config file, you should have a look at this file to get the name of targets. Then, you can edit the PicNet config file example (ex.cfg) to meet your needs.

ex.cfg

PicNet configuration file syntax follows some simple rules :

  • Keywords must start at the beginning of a line or after the symbol '*' (so the leading string is supposed to be a map name).

  • Lines which first character is '#' or a space are ignored (comments).

  • Other lines are analysed but without effect if no valid mandatory keyword is found.


MAPS NAMING

Note than you can use PicNet with one map or with several maps (tree hierarchies are possible with MapColorIdx). For using several maps, you must specify the name of each map as a prefix to its parameters ('*' is the separator).

All the parameters (even global parameters if used with a prefix) can apply to one specified map.

Example :

 net1*ImageRef: ex.png

The default map (no '*' prefix) is named indexmap.

All the non-global parameters without prefix apply to this default map (indexmap). Global parameters without prefix obviously apply to all the maps defined.


GLOBAL PARAMETERS

Workdir

Workdir specifies where the logfiles (or rrdfiles) and reference image are and where the resulting image and webpage should be created.

Example:

 WorkDir: /www/html/mrtg

Note that you can specify a WorkDir per map.

Grapher

Grapher specifies the command (CGI script) or Web path to access the graph MRTG pages.

If the Grapher string ends with a / or \, PicNet assumes it is a Web path and adds .html to the MRTG target name.

If omited, PicNet will look for HTML graph pages in the same directory as the resulting webpage (ie. WorkDir).

Examples:

 Grapher: /cgi-bin/14all.cgi?log=
 net1*Grapher: /mrtg/net1/

Note that you can specify a Grapher per map.

Refresh

How many seconds apart should the browser (Netscape, IE) be instructed to reload the page? If this is not defined, the default is 300 seconds (5 minutes).

Example:

 Refresh: 600

Note that you can specify a Refresh per map.


PER MAP CONFIGURATION

ImageRef

The name of the reference image. To create such a file, read the instructions in the picnet manpage.

This parameter is mandatory. You must not use the map name as the ImageRef name if you use the default ImageNet name : your reference image will be replaced !

Examples:

 ImageRef: mynet.png
 net1*ImageRef: imref1.png

ImageNet

The name of the image resulting of the PicNet process.

This parameter is optional. If not specified, the name of this image is the name of the map followed by '.png'.

Examples:

 ImageNet: traffic.png
 mynet*ImageNet: imnet2.png

HtmlTitle

This is the title of the HTML page displaying the processed image.

You must specify HtmlTitle or HtmlPageHeader in order to generate the HTML page for a map.

The name of an HTML page for a map is the name of this map followed by '.html'.

Example:

 HtmlTitle: Current traffic on my network (indexmap.html)
 net3*HtmlTitle: Current traffic on a distant network

HtmlPageHeader

This is the first HTML code line in the HTML page. Sorry, the header is limited to the line and about 100 characters.

You must specify Htmltitle or HtmlPageHeader in order to generate the HTML page for a map.

Examples:

 HtmlPageHeader: <H2 ALIGN=CENTER>Our Company Network<BR>Current Traffic</H2>
 Net1*HtmlPageHeader: <H2 ALIGN=CENTER>NET1 Current Traffic</H2>

HtmlAreasDef

So, you can specify a file with definitions of other clickable areas on your network image. These areas are defined using the HTML AREA tag. The file must be in the WorkDir directory.

HtmlAreasDef is useful only if you specify HtmlTitle or HtmlPageHeader in order to generate the HTML page for the map.

Examples:

 HtmlAreasDef: other.areas
 net*HtmlAreasDef: webmin.areas

And the content of other.areas is :

 <area href="info.html" alt="info" shape="poly" coords="126,76,234,75,250,74,248,80,129,84">
 <area href="mypage.html" alt="mypage" shape="rect" coords="110,66,126,97">
 ...


PER MAP AND TARGET CONFIGURATION

ColorIdx

ColorIdx is the color index value of the graphical object (line...) which color will change depending on values in the corresponding mrtg log file (traffic present on a link).

The new color depends on the maximum of the 2 values extracted from the mrtg log file (incoming and outgoing traffic for a router interface). Nowadays, there are 10 different colors (0-10 %, 10-20%, ...) but they can be modified before compiling in cfg.h and def.h.

Examples:

 ColorIdx[ezwf]: 250
 net2*ColorIdx[r1.1]: 245

ColorIdxIn

ColorIdxIn is the color index value of the graphical object (line...) which color will change depending on the first value in the corresponding mrtg log file (incoming traffic on a link).

Examples:

 ColorIdxIn[ezwf]: 251
 net2*ColorIdxIn[r1.1]: 246

ColorIdxOut

ColorIdxOut is the color index value of the graphical object (line...) which color will change depending on the second value in the corresponding mrtg log file (outgoing traffic on a link).

Examples:

 ColorIdxOut[ezwf]: 252
 net2*ColorIdxOut[r1.1]: 247

MaxRate

MaxRate is the maximum possible value processed from the corresponding MRTG log file. Actually, it is the maximum of the two values.

It is essential for computing the percentage which final color of ColorIdx depends on. Nowadays, there are 10 different colors (0-10 %, 10-20%, ...) but they can be modified before compiling in cfg.h and def.h.

For a router interface, it is the maximum traffic rate on the link. By default, the value is in bytes per second. But you can specify it in bits per second by adding ``bps'' after the value.

Examples:

 MaxRate[ezwf]: 64000 bps
 net1*MaxRate[r1.1]: 128000 bps

MaxRateIn

MaxRateIn is the maximum possible value processed from the corresponding MRTG log file. Actually, it is the maximum of the first value.

It is essential for computing the percentage which final color of ColorIdxIn depends on.

For a router interface, it is the maximum incoming traffic rate on the link. By default, the value is in bytes per second. But you can specify it in bits per second by adding ``bps'' after the value.

Examples:

 MaxRateIn[ezwf]: 128000 bps
 net1*MaxRateIn[temp]: 80

MaxRateOut

MaxRateOut is the maximum possible value processed from the corresponding MRTG log file. Actually, it is the maximum of the second value.

It is essential for computing the percentage which final color of ColorIdxOut depends on.

For a router interface, it is the maximum outgoing traffic rate on the link. By default, the value is in bytes per second. But you can specify it in bits per second by adding ``bps'' after the value.

Examples:

 MaxRateOut[ezwf]: 8000
 net2*MaxRateOut[r1.1]: 64000 bps

Rounds

With Rounds, you specify the number of MRTG intervals you want PicNet to average values on.

Examples:

Here, if MRTG is executed every 5 minutes for ezwf, you will display the average traffic on the last hour.

 Rounds[ezwf]: 12
 net2*Rounds[r1.1]: 12

MapRect

With MapRect, you can define a clickable rectangle on the image of your network to access an HTML MRTG stats page or a PicNet submap (see the next chapter).

You must specify the X1,Y1,X2,Y2 where (X1,Y1) is the upper left corner of the clickable rectangle and (X2,Y2) is the lower right corner.

For an object, you can define many MapRects (no limit other than memory). But these instructions will apply only if you specify HtmlTitle or HtmlPageHeader so that the HTML page will be created.

Note that the linked HTML pages must be in the same directory as the PicNet map HTML page.

Example:

In this example, when you click into the rectangle defined by the corners (126,76) and (234,85) on the image, you will access the MRTG stats page for ezwf.

 MapRect[ezwf]: 126,76,234,85

MapPoly

With MapPoly, you can define a clickable polygon on the image of your network to access an HTML MRTG stats page or a PicNet submap (see the next chapter).

You must specify the X1,Y1,X2,Y2,X3,Y3,...Xi,Yi where (Xi,Yi) are points of the polygon.

Please, refer to the MapRect comments above.

Example:

In this example, when you click into the polygon defined by the points (126,76), (234,85), (220,87) and (120,77) on the image, you will access the MRTG stats page for ezwf.

 net1*MapPoly[ezwf]: 126,76,234,85,220,87,120,77


LINKS BETWEEN MAPS

MapColorIdx

MapColorIdx is the color index value of the specified submap which color will change depending on the maximum color value of all the objects included in this submap. Obviously, the objects included in the submap can be MRTG targets or other submaps. So, you can define a tree hierarchy (as large as you want).

Take care not to create loops which is non-sense ! PicNet does not check it.

Examples:

 MapColorIdx[net2]: 250
 net2*MapColorIdx[net3]: 235
 net3*ColorIdx[ezwf]: 240

MapRect

With MapRect, you can define a clickable rectangle on the image of your network to access another PicNet map (or an HTML MRTG stats page).

Please, refer to the description of MapRect above.

You can create all the links you want between maps provided the HTML pages are in the same directory... There is no loop problem.

Example:

In this example, when you click into the rectangle defined by the corners (126,76) and (234,85) on the image of net1, you will access the map net2 and the reverse.

 net1*MapRect[net2]: 126,76,234,85
 net2*MapRect[net1]: 126,76,234,85

MapPoly

With MapPoly, you can define a clickable polygon on the image of your network to access an other PicNet map (or an HTML MRTG stats page).

Please, refer to the description of MapPoly above.

You can create all the links you want between maps provided the HTML pages are in the same directory... There is no loop problem.

Example:

In this example, when you click into the polygon defined by the points (126,76), (234,85), (220,87) and (120,77) on the image, you will access the map net1.

 MapPoly[net1]: 126,76,234,85,220,87,120,77


AUTHOR

Laurent Derrien, <derrien@canl.nc>

9.9.99 (last update 10.24.00)

picnet-1.2/doc/ex.cfg0100644000000000000000000000567507245303721013217 0ustar rootroot# Configuration File Example for PicNet... # If you need only one map, you can suppress the prefix 'isp*' . WorkDir: /www/html/mrtg # Grapher: /cgi-bin/14all.cgi?log= # Don't use isp.png as ImageRef because # it will be the name of the processed image isp*ImageRef: ex.png isp*HtmlTitle: ISP network isp*HtmlPageHeader:

Traffic on an ISP network

isp*HtmlAreasDef: other.areas isp*ColorIdxIn[router1.6]: 220 isp*MaxRateIn[router1.6]: 4000000 bps isp*MapPoly[router1.6]: 268,19,274,25,235,72,231,66 isp*MapPoly[router1.6]: 203,91,205,99,173,109,171,102 isp*ColorIdxIn[router1.5]: 222 isp*ColorIdxOut[router1.5]: 221 isp*MaxRateIn[router1.5]: 512000 bps isp*MaxRateOut[router1.5]: 512000 bps isp*MapPoly[router1.5]: 29,17,35,15,47,33,44,40 isp*MapPoly[router1.5]: 77,84,145,100,144,112,77,94 isp*ColorIdx[router2.3]: 224 isp*MaxRate[router2.3]: 64000 bps isp*MapPoly[router2.3]: 148,280,151,281,57,340,55,336 isp*ColorIdx[router2.4]: 225 isp*MaxRate[router2.4]: 64000 bps isp*MapPoly[router2.4]: 152,280,157,280,96,343,92,341 isp*ColorIdx[router2.5]: 226 isp*MaxRate[router2.5]: 64000 bps isp*MapPoly[router2.5]: 157,281,160,282,142,342,138,342 isp*ColorIdx[router2.6]: 227 isp*MaxRate[router2.6]: 128000 bps isp*MapPoly[router2.6]: 161,281,164,280,180,342,176,341 isp*ColorIdx[router2.7]: 228 isp*MaxRate[router2.7]: 64000 bps isp*MapPoly[router2.7]: 165,280,169,280,226,341,220,342 isp*ColorIdx[router2.8]: 229 isp*MaxRate[router2.8]: 256000 bps isp*MapPoly[router2.8]: 172,281,176,281,265,339,260,341 isp*ColorIdx[router3.3]: 223 isp*MaxRate[router3.3]: 64000 bps isp*Rounds[router3.3]: 4 isp*MapRect[router3.3]: 522,183,540,186 isp*MapRect[router3.3]: 539,110,542,183 isp*ColorIdx[httpdcpuusage]: 233 isp*MaxRate[httpdcpuusage]: 500 isp*Rounds[httpdcpuusage]: 2 isp*MapRect[httpdcpuusage]: 341,212,372,243 isp*ColorIdx[tc2]: 234 isp*MaxRate[tc2]: 60 isp*MapRect[tc2]: 86,217,117,248 isp*ColorIdx[tc1]: 235 isp*MaxRate[tc1]: 60 isp*MapRect[tc1]: 205,217,235,248 isp*ColorIdx[cachecpuusage]: 236 isp*MaxRate[cachecpuusage]: 500 isp*MapRect[cachecpuusage]: 204,133,234,164 isp*ColorIdx[diskusage]: 237 isp*MaxRate[diskusage]: 9000000 isp*MapRect[diskusage]: 491,131,522,162 isp*ColorIdx[messages]: 238 isp*MaxRate[messages]: 4000 isp*MapRect[messages]: 341,131,372,162 isp*MapColorIdx[cust1]: 239 isp*MapRect[cust1]: 465,276,554,295 cust1*MapRect[isp]: 400,10,420,15 cust1*ImageRef: c1ref.png cust1*ImageNet: ispcust1.png cust1*HtmlTitle: Customer1's network cust1*HtmlPageHeader:

Traffic on the network of customer 1

cust1*ColorIdx[router5.6]: 220 cust1*MaxRate[router5.6]: 4000000 bps cust1*MapPoly[router5.6]: 268,19,274,25,235,72,231,66 cust1*MapPoly[router5.6]: 203,91,205,99,173,109,171,102 cust1*ColorIdxIn[router5.5]: 222 cust1*ColorIdxOut[router5.5]: 221 cust1*MaxRateIn[router5.5]: 512000 bps cust1*MaxRateOut[router5.5]: 512000 bps cust1*MapPoly[router5.5]: 29,17,35,15,47,33,44,40 cust1*MapPoly[router5.5]: 77,84,145,100,144,112,77,94 picnet-1.2/doc/image.html0100644000000000000000000000763107245304430014062 0ustar rootroot doc/image

NAME

image - Tutorial for creating a reference image


OVERVIEW

This is just one way to create a reference image. You can use another way.

Anyway, you must respect the following rules :

  • The final image must be an 8-bits PNG (256 colors).

  • You must use one color (not used anywhere else in the image) per MRTG target or PicNet submap and note its index value (0<i<256).


1- CREATE A 16 MILLION COLORS IMAGE

A 16 Million colors image is a 24-bits image.

You can draw what you want... add a photo, use the reference image example... You can write text labels...


2- REDUCE THE NUMBER OF COLORS IN THE IMAGE

The purpose is to get an image with 256 different colors available (8 bits) but less really used.

I advise you to reduce to 256 colors, then to increase the number of colors to 16 Million and finally to reduce it again to 256. So, you will free many color cells in your 256 colors palette without degrading your image.


3- EDIT THE PALETTE

Add colors not used in your image in the free color cells.


4- DRAW THE OBJECTS THAT WILL BE LINKED

Use one color you've just added per object (link, submap...) and keep the corresponding palette index value (between 220 and 240 in the example) in mind.

Then, you will associate these index values with the MRTG targets (and PicNet submaps) in your PicNet config file : the config manpage.


5- SAVE AS PNG FILE

Warning : Do not optimize the palette of the image !

Here is an example of reference image :

doc/images/ex.png

You can use your network image to index MRTG stats pages and other PicNet maps (and other HTML pages). If you want to do it, you should note the X, Y values of the upper left and lower right corners for clickable squares or X, Y values of all the corners for clickable polygons.

When you move the cursor on the image, the X,Y coordinates are displayed in the lower left corner of the PaintShop Pro window. Remember the coordinates of the points you choose. You will use them in the PicNet config file : the config manpage.


AUTHOR

Laurent Derrien, <derrien@canl.nc>

9.9.99 (last update 10.20.00)

picnet-1.2/doc/picnet.txt0100644000000000000000000003366507245304427014151 0ustar rootroot PICNET(1) picnet PICNET(1) NNNNAAAAMMMMEEEE picnet - Instructions for using PICNET for MRTG SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS PicNet is a small tool that gives indication on network traffic on a graphic map. It takes information from MMMMRRRRTTTTGGGG lllloooogggg or RRRRRRRRDDDD files, and modifies the PNG image of your network so that links have colors based on the current traffic. Then, it can generate an HTML page with this image used as an image map indexing MRTG stat pages. PicNet can handle just one map or several maps with tree hierarchies (submaps). The idea of PicNet was completely inspired on Rdlog2 by Philippe Simonet, . Anyway, it is quite different as PicNet works on raster images while Rdlog2 uses vector images. HHHHIIIISSSSTTTTOOOORRRRYYYY LLLLIIIISSSSTTTT v 1.2, (02/22/01) : - New installation with configure (autoconf). - New parameter 'Grapher' to specify the MRTG images directory or the CGI program (14all.cgi) for displaying the MRTG graphs. - Support for RRD files (Round Robin Database Tool). - Small bug corrected. v 1.1, (10/27/00) : - You can create several maps by using prefixes '*' before parameters. - You can use the new parameter 'MapColorIdx' to get the max color of a submap in another map. So, you can create tree hierarchies of maps. - You can make HTTP links between maps with MapRect and MapPoly. - The few parameters that previously used '[indexmap]' pseudo-target have been changed. Now, they are normal parameters which names begin with 'Html'. - The doc is now written in the POD format. So, HTML, TXT and MAN pages are available. - Added a precompiled version for Win32 in a ZIP file. v 1.0, (08/23/99) : First version. RRRREEEEFFFFEEEERRRREEEENNNNCCCCEEEE PPPPNNNNGGGG IIIIMMMMAAAAGGGGEEEE PicNet needs a reference PNG image of your network (one per submap). 2001-02-23 1.2 1 PICNET(1) picnet PICNET(1) WWWWhhhhyyyy PPPPNNNNGGGG iiiimmmmaaaaggggeeee ???? PPPPNNNNGGGG (Portable Network Graphics) is an extensible file format for the lossless, portable, well-compressed storage of raster images. PNG provides a patent-free replacement for GIF and can also replace many common uses of TIFF. PNG is designed to work well in online viewing applications, such as the World Wide Web. Current browsers can display PNG images. The GGGGDDDD lllliiiibbbbrrrraaaarrrryyyy now deals with 8-bits PNG images. So this tool and MRTG generate PNG images. HHHHoooowwww ttttoooo ccccrrrreeeeaaaatttteeee aaaa rrrreeeeffffeeeerrrreeeennnncccceeee iiiimmmmaaaaggggeeee ???? You can use PaintShop Pro (on Windows) or any other tool to create it. You can draw your image as you want but you must respect the following rules : - The final image must be an 8888----bbbbiiiittttssss PPPPNNNNGGGG (256 colors). - You must use oooonnnneeee ccccoooolllloooorrrr (not used anywhere else in the image) ppppeeeerrrr MMMMRRRRTTTTGGGG ttttaaaarrrrggggeeeetttt oooorrrr PPPPiiiiccccNNNNeeeetttt ssssuuuubbbbmmmmaaaapppp and note its iiiinnnnddddeeeexxxx vvvvaaaalllluuuueeee (0* If you don't use such prefix, the default map name is _i_n_d_e_x_m_a_p. HHHHeeeerrrreeee aaaarrrreeee tttthhhheeee ddddiiiiffffffffeeeerrrreeeennnntttt ttttaaaaggggssss yyyyoooouuuu hhhhaaaavvvveeee ttttoooo uuuusssseeee ttttoooo ccccoooonnnnffffiiiigggguuuurrrreeee PPPPiiiiccccNNNNeeeetttt :::: the config manpage BBBBEEEEFFFFOOOORRRREEEE BBBBUUUUIIIILLLLDDDDIIIINNNNGGGG PPPPIIIICCCCNNNNEEEETTTT If you have a precompiled copy for Windows (ZIP file), go to the section : INSTALLING PICNET ON WINDOWS. If you don't have time and you want to install PicNet for Unix, go to the next section to install PicNet. Well, you have the GZIP TAR file with PicNet sources. First, you must obviously use MMMMRRRRTTTTGGGG : http://www.ee.ethz.ch/~oetiker/webtools/mrtg/ PicNet uses the GGGGDDDD lllliiiibbbbrrrraaaarrrryyyy. You should have installed it as MRTG needs it. http://www.boutell.com/gd/ You can optionaly use RRRRRRRRDDDDTTTTOOOOOOOOLLLL. So, PicNet will work with RRD files. http://www.ee.ethz.ch/~oetiker/webtools/rrdtool/ In order to build PicNet, you must have the following files : def.h cfg.h loadcfg.c mkhtml.h mkpic.h mkhtml.c mkpic.c picnet.c If you don't like the current colors for the traffic rate, you can modify it in def.h. You can also add other levels of colors (in cfg.h and def.h). 2001-02-23 1.2 3 PICNET(1) picnet PICNET(1) IIIINNNNSSSSTTTTAAAALLLLLLLLIIIINNNNGGGG PPPPIIIICCCCNNNNEEEETTTT OOOONNNN UUUUNNNNIIIIXXXX NB : Before executing picnet, you must create a PPPPNNNNGGGG iiiimmmmaaaaggggeeee ooooffff yyyyoooouuuurrrr _nn_ee_tt_ww_oo_rr_kk((((ssss)))) (the image manpage) and a ccccoooonnnnffffiiiigggg ffffiiiilllleeee (the config manpage). If everything is okay (no pb with paths), you should be able to install PicNet this way : ./configure make install Then, you must use the following syntax in the call to mrtg : /mrtg /mrtg.cfg /picnet.cfg TTTThhhhaaaatttt''''ssss aaaallllllll !!!! But if you have to specify paths or select options, here it is... You can specify many arguments to ./configure. Check ....////ccccoooonnnnffffiiiigggguuuurrrreeee --------hhhheeeellllpppp. Here are the main arguments : --prefix= --with-gd= --with-rrd= --enable-fr --disable-js If _c_o_n_f_i_g_u_r_e fails to find MRTG, you won't be able to use 'mmmmaaaakkkkeeee iiiinnnnssssttttaaaallllllll' to patch MRTG for PicNet. However, you can use 'mmmmaaaakkkkeeee' to create _p_i_c_n_e_t file and patch _m_r_t_g later (see the chapter "CALLING PICNET"). If _c_o_n_f_i_g_u_r_e finds RRDTool, PicNet will use RRD files, else it will use log files. _-_-_e_n_a_b_l_e_-_f_r configures PicNet for HTML pages in french (I'm french ;-) ) _-_-_d_i_s_a_b_l_e_-_j_s for those who don't like JavaScript in the HTML pages... IIIINNNNSSSSTTTTAAAALLLLLLLLIIIINNNNGGGG PPPPIIIICCCCNNNNEEEETTTT OOOONNNN WWWWIIIINNNNDDDDOOOOWWWWSSSS Get the latest release of PicNet for Win32 in ZIP format. It contains a precompiled copy (with CygWin and GCC). Unzip the ZIP archive and install the mandatory files where you want : picnet.exe cygwin1.dll libpng.dll 2001-02-23 1.2 4 PICNET(1) picnet PICNET(1) libz.dll You must set the TZ variable to your timezone (for Windows 9X, add _s_e_t _T_Z_=_G_M_T_+_1_1 (your timezone !) to _a_u_t_o_e_x_e_c_._b_a_t). Obviously, you must create rrrreeeeffffeeeerrrreeeennnncccceeee _ii_mm_aa_gg_ee((((ssss)))) and a ccccoooonnnnffffiiiigggguuuurrrraaaattttiiiioooonnnn ffffiiiilllleeee (see above). In the configuration file, you must set WWWWoooorrrrkkkkDDDDiiiirrrr as a Windows directory : _D_:_\_I_n_e_t_P_u_b_\_w_w_w_r_o_o_t_\_M_R_T_G (no problem with long names and spaces). CCCCAAAALLLLLLLLIIIINNNNGGGG PPPPIIIICCCCNNNNEEEETTTT NB: If you have succeeded in installing PicNet on Unix with 'make install', MRTG is already patched for PicNet ! The command-line parameters are : picnet But this command executes picnet just once. Then, you have 2 ways to run picnet regularly... Patch MRTG for PicNet 1- Copy _p_i_c_n_e_t (or _p_i_c_n_e_t_._e_x_e) and _p_a_t_c_h_._p_m in the same directory as the _m_r_t_g file. 2- Backup _m_r_t_g (_c_p _m_r_t_g _m_r_t_g_._b_a_k). 3- Apply the Perl module _p_a_t_c_h_._p_m to mrtg on standard input (or first argument) and get patched mrtg on standard output : perl patch.pm mrtg.bak >mrtg 4- Now, you can use the following syntax in the call to mrtg : /mrtg /mrtg.cfg /picnet.cfg and PicNet will run when mrtg updates the data. Note that if you don't add a second parameter to the mrtg command-line, picnet will use the first one (_m_r_t_g_._c_f_g) as its configuration file. Use a Scheduler You may use a sssscccchhhheeeedddduuuulllleeeerrrr to execute the _p_i_c_n_e_t command whenever MRTG data is updated (usually, every 5 minutes). You should add picnet in your crontab on Unix. I advise you to launch it after mrtg... 2001-02-23 1.2 5 PICNET(1) picnet PICNET(1) Example: 0,5,10,15,20,25,30,35,40,45,50,55 * * * * \ /mrtg /mrtg.cfg; \ /picnet /picnet.cfg or in Linux : */5 * * * * /mrtg /mrtg.cfg; \ /picnet /picnet.cfg AAAAUUUUTTTTHHHHOOOORRRR Laurent Derrien, 9.9.99 (last update 02.22.01) 2001-02-23 1.2 6 picnet-1.2/doc/config.pod0100644000000000000000000002501307243060003014046 0ustar rootroot=head1 NAME config - PICNET configuration reference =head1 OVERVIEW PicNet needs a B (actually 1 per map) and a B (check L)... This document describes all the configuration options understood by the picnet software. =head1 SYNTAX PicNet configuration file looks like MRTG one. So it is very easy if you are familiar to mrtg.cfg... If you used automatic generation of your MRTG config file, you should have a look at this file to get the name of targets. Then, you can edit the B (F) to meet your needs. =for html

ex.cfg

PicNet configuration file syntax follows some simple rules : =over =item * Keywords must start at the beginning of a line or after the symbol '*' (so the leading string is supposed to be a map name). =item * Lines which first character is '#' or a space are ignored (comments). =item * Other lines are analysed but without effect if no valid mandatory keyword is found. =back =head1 MAPS NAMING Note than you can use PicNet with one map or with B (tree hierarchies are possible with F). For using several maps, you must specify the name of each map as a prefix to its parameters ('*' is the separator). All the parameters (even global parameters if used with a prefix) can apply to one specified map. Example : net1*ImageRef: ex.png The default map (no '*' prefix) is named F. All the non-global parameters without prefix apply to this default map (F). Global parameters without prefix obviously apply to all the maps defined. =head1 GLOBAL PARAMETERS =head2 Workdir Workdir specifies where the logfiles (or rrdfiles) and reference image are and where the resulting image and webpage should be created. Example: WorkDir: /www/html/mrtg Note that you can specify a WorkDir per map. =head2 Grapher Grapher specifies the command (CGI script) or Web path to access the graph MRTG pages. If the Grapher string ends with a B or B<\>, PicNet assumes it is a Web path and adds B<.html> to the MRTG target name. If omited, PicNet will look for HTML graph pages in the same directory as the resulting webpage (ie. WorkDir). Examples: Grapher: /cgi-bin/14all.cgi?log= net1*Grapher: /mrtg/net1/ Note that you can specify a Grapher per map. =head2 Refresh How many seconds apart should the browser (Netscape, IE) be instructed to reload the page? If this is not defined, the default is 300 seconds (5 minutes). Example: Refresh: 600 Note that you can specify a Refresh per map. =head1 PER MAP CONFIGURATION =head2 ImageRef The name of the reference image. To create such a file, read the instructions in L. This parameter is mandatory. You must not use the map name as the ImageRef name if you use the default ImageNet name : your reference image will be replaced ! Examples: ImageRef: mynet.png net1*ImageRef: imref1.png =head2 ImageNet The name of the image resulting of the PicNet process. This parameter is optional. If not specified, the name of this image is the name of the map followed by '.png'. Examples: ImageNet: traffic.png mynet*ImageNet: imnet2.png =head2 HtmlTitle This is the title of the HTML page displaying the processed image. You must specify F or F in order to generate the HTML page for a map. B Example: HtmlTitle: Current traffic on my network (indexmap.html) net3*HtmlTitle: Current traffic on a distant network =head2 HtmlPageHeader This is the first HTML code line in the HTML page. Sorry, the header is limited to the line and about 100 characters. You must specify F or F in order to generate the HTML page for a map. Examples: HtmlPageHeader:

Our Company Network
Current Traffic

Net1*HtmlPageHeader:

NET1 Current Traffic

=head2 HtmlAreasDef So, you can specify a file with definitions of other clickable areas on your network image. These areas are defined using the HTML AREA tag. The file must be in the WorkDir directory. HtmlAreasDef is useful only if you specify HtmlTitle or HtmlPageHeader in order to generate the HTML page for the map. Examples: HtmlAreasDef: other.areas net*HtmlAreasDef: webmin.areas And the content of other.areas is : info mypage ... =head1 PER MAP AND TARGET CONFIGURATION =head2 ColorIdx ColorIdx is the color index value of the graphical object (line...) which color will change depending on values in the corresponding mrtg log file (traffic present on a link). The new color depends on the B extracted from the mrtg log file (incoming and outgoing traffic for a router interface). Nowadays, there are 10 different colors (0-10 %, 10-20%, ...) but they can be modified before compiling in cfg.h and def.h. Examples: ColorIdx[ezwf]: 250 net2*ColorIdx[r1.1]: 245 =head2 ColorIdxIn ColorIdxIn is the color index value of the graphical object (line...) which color will change depending on the first value in the corresponding mrtg log file (B on a link). Examples: ColorIdxIn[ezwf]: 251 net2*ColorIdxIn[r1.1]: 246 =head2 ColorIdxOut ColorIdxOut is the color index value of the graphical object (line...) which color will change depending on the second value in the corresponding mrtg log file (B on a link). Examples: ColorIdxOut[ezwf]: 252 net2*ColorIdxOut[r1.1]: 247 =head2 MaxRate MaxRate is the maximum possible value processed from the corresponding MRTG log file. Actually, it is the B. It is essential for computing the percentage which final color of ColorIdx depends on. Nowadays, there are 10 different colors (0-10 %, 10-20%, ...) but they can be modified before compiling in cfg.h and def.h. For a router interface, it is the maximum traffic rate on the link. By default, the value is in bytes per second. But you can specify it in bits per second by adding "bps" after the value. Examples: MaxRate[ezwf]: 64000 bps net1*MaxRate[r1.1]: 128000 bps =head2 MaxRateIn MaxRateIn is the maximum possible value processed from the corresponding MRTG log file. Actually, it is the B. It is essential for computing the percentage which final color of ColorIdxIn depends on. For a router interface, it is the maximum incoming traffic rate on the link. By default, the value is in bytes per second. But you can specify it in bits per second by adding "bps" after the value. Examples: MaxRateIn[ezwf]: 128000 bps net1*MaxRateIn[temp]: 80 =head2 MaxRateOut MaxRateOut is the maximum possible value processed from the corresponding MRTG log file. Actually, it is the B. It is essential for computing the percentage which final color of ColorIdxOut depends on. For a router interface, it is the maximum outgoing traffic rate on the link. By default, the value is in bytes per second. But you can specify it in bits per second by adding "bps" after the value. Examples: MaxRateOut[ezwf]: 8000 net2*MaxRateOut[r1.1]: 64000 bps =head2 Rounds With Rounds, you specify the number of MRTG intervals you want PicNet to average values on. Examples: Here, if MRTG is executed every 5 minutes for ezwf, you will display the average traffic on the last hour. Rounds[ezwf]: 12 net2*Rounds[r1.1]: 12 =head2 MapRect With MapRect, you can define a clickable rectangle on the image of your network to access an HTML MRTG stats page or a PicNet submap (see the next chapter). You must specify the X1,Y1,X2,Y2 where (X1,Y1) is the upper left corner of the clickable rectangle and (X2,Y2) is the lower right corner. For an object, you can define many MapRects (no limit other than memory). But these instructions will apply only if you specify HtmlTitle or HtmlPageHeader so that the HTML page will be created. Note that the linked HTML pages must be in the same directory as the PicNet map HTML page. Example: In this example, when you click into the rectangle defined by the corners (126,76) and (234,85) on the image, you will access the MRTG stats page for ezwf. MapRect[ezwf]: 126,76,234,85 =head2 MapPoly With MapPoly, you can define a clickable polygon on the image of your network to access an HTML MRTG stats page or a PicNet submap (see the next chapter). You must specify the X1,Y1,X2,Y2,X3,Y3,...Xi,Yi where (Xi,Yi) are points of the polygon. Please, refer to the MapRect comments above. Example: In this example, when you click into the polygon defined by the points (126,76), (234,85), (220,87) and (120,77) on the image, you will access the MRTG stats page for ezwf. net1*MapPoly[ezwf]: 126,76,234,85,220,87,120,77 =head1 LINKS BETWEEN MAPS =head2 MapColorIdx MapColorIdx is the color index value of the specified submap which color will change depending on the B included in this submap. Obviously, the objects included in the submap can be MRTG targets or other submaps. So, you can define a tree hierarchy (as large as you want). B PicNet does not check it. Examples: MapColorIdx[net2]: 250 net2*MapColorIdx[net3]: 235 net3*ColorIdx[ezwf]: 240 =head2 MapRect With MapRect, you can define a clickable rectangle on the image of your network to access another PicNet map (or an HTML MRTG stats page). Please, refer to the description of MapRect above. You can create all the links you want between maps provided the HTML pages are in the same directory... There is no loop problem. Example: In this example, when you click into the rectangle defined by the corners (126,76) and (234,85) on the image of net1, you will access the map net2 and the reverse. net1*MapRect[net2]: 126,76,234,85 net2*MapRect[net1]: 126,76,234,85 =head2 MapPoly With MapPoly, you can define a clickable polygon on the image of your network to access an other PicNet map (or an HTML MRTG stats page). Please, refer to the description of MapPoly above. You can create all the links you want between maps provided the HTML pages are in the same directory... There is no loop problem. Example: In this example, when you click into the polygon defined by the points (126,76), (234,85), (220,87) and (120,77) on the image, you will access the map net1. MapPoly[net1]: 126,76,234,85,220,87,120,77 =head1 AUTHOR Laurent Derrien, Ederrien@canl.ncE 9.9.99 (last update 10.24.00) picnet-1.2/doc/config.txt0100644000000000000000000004147507245304430014124 0ustar rootroot CONFIG(1) picnet CONFIG(1) NNNNAAAAMMMMEEEE config - PICNET configuration reference OOOOVVVVEEEERRRRVVVVIIIIEEEEWWWW PicNet needs a rrrreeeeffffeeeerrrreeeennnncccceeee PPPPNNNNGGGG iiiimmmmaaaaggggeeee (actually 1 per map) and a ccccoooonnnnffffiiiigggguuuurrrraaaattttiiiioooonnnn ffffiiiilllleeee (check the picnet manpage)... This document describes all the configuration options understood by the picnet software. SSSSYYYYNNNNTTTTAAAAXXXX PicNet configuration file looks like MRTG one. So it is very easy if you are familiar to mrtg.cfg... If you used automatic generation of your MRTG config file, you should have a look at this file to get the name of targets. Then, you can edit the PPPPiiiiccccNNNNeeeetttt ccccoooonnnnffffiiiigggg ffffiiiilllleeee eeeexxxxaaaammmmpppplllleeee (_e_x_._c_f_g) to meet your needs. PicNet configuration file syntax follows some simple rules : +o Keywords must start at the beginning of a line or after the symbol '*' (so the leading string is supposed to be a map name). +o Lines which first character is '#' or a space are ignored (comments). +o Other lines are analysed but without effect if no valid mandatory keyword is found. MMMMAAAAPPPPSSSS NNNNAAAAMMMMIIIINNNNGGGG Note than you can use PicNet with one map or with sssseeeevvvveeeerrrraaaallll mmmmaaaappppssss (tree hierarchies are possible with _M_a_p_C_o_l_o_r_I_d_x). For using several maps, you must specify the name of each map as a prefix to its parameters ('*' is the separator). All the parameters (even global parameters if used with a prefix) can apply to one specified map. Example : net1*ImageRef: ex.png The default map (no '*' prefix) is named _i_n_d_e_x_m_a_p. All the non-global parameters without prefix apply to this default map (_i_n_d_e_x_m_a_p). Global parameters without prefix obviously apply to all the maps defined. GGGGLLLLOOOOBBBBAAAALLLL PPPPAAAARRRRAAAAMMMMEEEETTTTEEEERRRRSSSS 2001-02-16 1.2 1 CONFIG(1) picnet CONFIG(1) WWWWoooorrrrkkkkddddiiiirrrr Workdir specifies where the logfiles (or rrdfiles) and reference image are and where the resulting image and webpage should be created. Example: WorkDir: /www/html/mrtg Note that you can specify a WorkDir per map. GGGGrrrraaaapppphhhheeeerrrr Grapher specifies the command (CGI script) or Web path to access the graph MRTG pages. If the Grapher string ends with a //// or \\\\, PicNet assumes it is a Web path and adds ....hhhhttttmmmmllll to the MRTG target name. If omited, PicNet will look for HTML graph pages in the same directory as the resulting webpage (ie. WorkDir). Examples: Grapher: /cgi-bin/14all.cgi?log= net1*Grapher: /mrtg/net1/ Note that you can specify a Grapher per map. RRRReeeeffffrrrreeeesssshhhh How many seconds apart should the browser (Netscape, IE) be instructed to reload the page? If this is not defined, the default is 300 seconds (5 minutes). Example: Refresh: 600 Note that you can specify a Refresh per map. PPPPEEEERRRR MMMMAAAAPPPP CCCCOOOONNNNFFFFIIIIGGGGUUUURRRRAAAATTTTIIIIOOOONNNN IIIImmmmaaaaggggeeeeRRRReeeeffff The name of the reference image. To create such a file, read the instructions in the picnet manpage. This parameter is mandatory. You must not use the map name as the ImageRef name if you use the default ImageNet name : your reference image will be replaced ! Examples: 2001-02-16 1.2 2 CONFIG(1) picnet CONFIG(1) ImageRef: mynet.png net1*ImageRef: imref1.png IIIImmmmaaaaggggeeeeNNNNeeeetttt The name of the image resulting of the PicNet process. This parameter is optional. If not specified, the name of this image is the name of the map followed by '.png'. Examples: ImageNet: traffic.png mynet*ImageNet: imnet2.png HHHHttttmmmmllllTTTTiiiittttlllleeee This is the title of the HTML page displaying the processed image. You must specify _H_t_m_l_T_i_t_l_e or _H_t_m_l_P_a_g_e_H_e_a_d_e_r in order to generate the HTML page for a map. TTTThhhheeee nnnnaaaammmmeeee ooooffff aaaannnn HHHHTTTTMMMMLLLL ppppaaaaggggeeee ffffoooorrrr aaaa mmmmaaaapppp iiiissss tttthhhheeee nnnnaaaammmmeeee ooooffff tttthhhhiiiissss mmmmaaaapppp ffffoooolllllllloooowwwweeeedddd bbbbyyyy ''''....hhhhttttmmmmllll''''.... Example: HtmlTitle: Current traffic on my network (indexmap.html) net3*HtmlTitle: Current traffic on a distant network HHHHttttmmmmllllPPPPaaaaggggeeeeHHHHeeeeaaaaddddeeeerrrr This is the first HTML code line in the HTML page. Sorry, the header is limited to the line and about 100 characters. You must specify _H_t_m_l_t_i_t_l_e or _H_t_m_l_P_a_g_e_H_e_a_d_e_r in order to generate the HTML page for a map. Examples: HtmlPageHeader:

Our Company Network
Current Traffic

Net1*HtmlPageHeader:

NET1 Current Traffic

HHHHttttmmmmllllAAAArrrreeeeaaaassssDDDDeeeeffff So, you can specify a file with definitions of other clickable areas on your network image. These areas are defined using the HTML AREA tag. The file must be in the 2001-02-16 1.2 3 CONFIG(1) picnet CONFIG(1) WorkDir directory. HtmlAreasDef is useful only if you specify HtmlTitle or HtmlPageHeader in order to generate the HTML page for the map. Examples: HtmlAreasDef: other.areas net*HtmlAreasDef: webmin.areas And the content of other.areas is : info mypage ... PPPPEEEERRRR MMMMAAAAPPPP AAAANNNNDDDD TTTTAAAARRRRGGGGEEEETTTT CCCCOOOONNNNFFFFIIIIGGGGUUUURRRRAAAATTTTIIIIOOOONNNN CCCCoooolllloooorrrrIIIIddddxxxx ColorIdx is the color index value of the graphical object (line...) which color will change depending on values in the corresponding mrtg log file (traffic present on a link). The new color depends on the mmmmaaaaxxxxiiiimmmmuuuummmm ooooffff tttthhhheeee 2222 vvvvaaaalllluuuueeeessss extracted from the mrtg log file (incoming and outgoing traffic for a router interface). Nowadays, there are 10 different colors (0-10 %, 10-20%, ...) but they can be modified before compiling in cfg.h and def.h. Examples: ColorIdx[ezwf]: 250 net2*ColorIdx[r1.1]: 245 CCCCoooolllloooorrrrIIIIddddxxxxIIIInnnn ColorIdxIn is the color index value of the graphical object (line...) which color will change depending on the first value in the corresponding mrtg log file (iiiinnnnccccoooommmmiiiinnnngggg ttttrrrraaaaffffffffiiiicccc on a link). Examples: ColorIdxIn[ezwf]: 251 net2*ColorIdxIn[r1.1]: 246 2001-02-16 1.2 4 CONFIG(1) picnet CONFIG(1) CCCCoooolllloooorrrrIIIIddddxxxxOOOOuuuutttt ColorIdxOut is the color index value of the graphical object (line...) which color will change depending on the second value in the corresponding mrtg log file (oooouuuuttttggggooooiiiinnnngggg ttttrrrraaaaffffffffiiiicccc on a link). Examples: ColorIdxOut[ezwf]: 252 net2*ColorIdxOut[r1.1]: 247 MMMMaaaaxxxxRRRRaaaatttteeee MaxRate is the maximum possible value processed from the corresponding MRTG log file. Actually, it is the mmmmaaaaxxxxiiiimmmmuuuummmm ooooffff tttthhhheeee ttttwwwwoooo vvvvaaaalllluuuueeeessss. It is essential for computing the percentage which final color of ColorIdx depends on. Nowadays, there are 10 different colors (0-10 %, 10-20%, ...) but they can be modified before compiling in cfg.h and def.h. For a router interface, it is the maximum traffic rate on the link. By default, the value is in bytes per second. But you can specify it in bits per second by adding "bps" after the value. Examples: MaxRate[ezwf]: 64000 bps net1*MaxRate[r1.1]: 128000 bps MMMMaaaaxxxxRRRRaaaatttteeeeIIIInnnn MaxRateIn is the maximum possible value processed from the corresponding MRTG log file. Actually, it is the mmmmaaaaxxxxiiiimmmmuuuummmm ooooffff tttthhhheeee ffffiiiirrrrsssstttt vvvvaaaalllluuuueeee. It is essential for computing the percentage which final color of ColorIdxIn depends on. For a router interface, it is the maximum incoming traffic rate on the link. By default, the value is in bytes per second. But you can specify it in bits per second by adding "bps" after the value. Examples: MaxRateIn[ezwf]: 128000 bps net1*MaxRateIn[temp]: 80 2001-02-16 1.2 5 CONFIG(1) picnet CONFIG(1) MMMMaaaaxxxxRRRRaaaatttteeeeOOOOuuuutttt MaxRateOut is the maximum possible value processed from the corresponding MRTG log file. Actually, it is the mmmmaaaaxxxxiiiimmmmuuuummmm ooooffff tttthhhheeee sssseeeeccccoooonnnndddd vvvvaaaalllluuuueeee. It is essential for computing the percentage which final color of ColorIdxOut depends on. For a router interface, it is the maximum outgoing traffic rate on the link. By default, the value is in bytes per second. But you can specify it in bits per second by adding "bps" after the value. Examples: MaxRateOut[ezwf]: 8000 net2*MaxRateOut[r1.1]: 64000 bps RRRRoooouuuunnnnddddssss With Rounds, you specify the number of MRTG intervals you want PicNet to average values on. Examples: Here, if MRTG is executed every 5 minutes for ezwf, you will display the average traffic on the last hour. Rounds[ezwf]: 12 net2*Rounds[r1.1]: 12 MMMMaaaappppRRRReeeecccctttt With MapRect, you can define a clickable rectangle on the image of your network to access an HTML MRTG stats page or a PicNet submap (see the next chapter). You must specify the X1,Y1,X2,Y2 where (X1,Y1) is the upper left corner of the clickable rectangle and (X2,Y2) is the lower right corner. For an object, you can define many MapRects (no limit other than memory). But these instructions will apply only if you specify HtmlTitle or HtmlPageHeader so that the HTML page will be created. Note that the linked HTML pages must be in the same directory as the PicNet map HTML page. Example: 2001-02-16 1.2 6 CONFIG(1) picnet CONFIG(1) In this example, when you click into the rectangle defined by the corners (126,76) and (234,85) on the image, you will access the MRTG stats page for ezwf. MapRect[ezwf]: 126,76,234,85 MMMMaaaappppPPPPoooollllyyyy With MapPoly, you can define a clickable polygon on the image of your network to access an HTML MRTG stats page or a PicNet submap (see the next chapter). You must specify the X1,Y1,X2,Y2,X3,Y3,...Xi,Yi where (Xi,Yi) are points of the polygon. Please, refer to the MapRect comments above. Example: In this example, when you click into the polygon defined by the points (126,76), (234,85), (220,87) and (120,77) on the image, you will access the MRTG stats page for ezwf. net1*MapPoly[ezwf]: 126,76,234,85,220,87,120,77 LLLLIIIINNNNKKKKSSSS BBBBEEEETTTTWWWWEEEEEEEENNNN MMMMAAAAPPPPSSSS MMMMaaaappppCCCCoooolllloooorrrrIIIIddddxxxx MapColorIdx is the color index value of the specified submap which color will change depending on the mmmmaaaaxxxxiiiimmmmuuuummmm ccccoooolllloooorrrr vvvvaaaalllluuuueeee ooooffff aaaallllllll tttthhhheeee oooobbbbjjjjeeeeccccttttssss included in this submap. Obviously, the objects included in the submap can be MRTG targets or other submaps. So, you can define a tree hierarchy (as large as you want). TTTTaaaakkkkeeee ccccaaaarrrreeee nnnnooootttt ttttoooo ccccrrrreeeeaaaatttteeee llllooooooooppppssss wwwwhhhhiiiicccchhhh iiiissss nnnnoooonnnn----sssseeeennnnsssseeee !!!! PicNet does not check it. Examples: MapColorIdx[net2]: 250 net2*MapColorIdx[net3]: 235 net3*ColorIdx[ezwf]: 240 MMMMaaaappppRRRReeeecccctttt With MapRect, you can define a clickable rectangle on the image of your network to access another PicNet map (or an HTML MRTG stats page). Please, refer to the description of MapRect above. 2001-02-16 1.2 7 CONFIG(1) picnet CONFIG(1) You can create all the links you want between maps provided the HTML pages are in the same directory... There is no loop problem. Example: In this example, when you click into the rectangle defined by the corners (126,76) and (234,85) on the image of net1, you will access the map net2 and the reverse. net1*MapRect[net2]: 126,76,234,85 net2*MapRect[net1]: 126,76,234,85 MMMMaaaappppPPPPoooollllyyyy With MapPoly, you can define a clickable polygon on the image of your network to access an other PicNet map (or an HTML MRTG stats page). Please, refer to the description of MapPoly above. You can create all the links you want between maps provided the HTML pages are in the same directory... There is no loop problem. Example: In this example, when you click into the polygon defined by the points (126,76), (234,85), (220,87) and (120,77) on the image, you will access the map net1. MapPoly[net1]: 126,76,234,85,220,87,120,77 AAAAUUUUTTTTHHHHOOOORRRR Laurent Derrien, 9.9.99 (last update 10.24.00) 2001-02-16 1.2 8 picnet-1.2/doc/image.txt0100644000000000000000000001025307245304430013727 0ustar rootroot IMAGE(1) picnet IMAGE(1) NNNNAAAAMMMMEEEE image - Tutorial for creating a reference image OOOOVVVVEEEERRRRVVVVIIIIEEEEWWWW This is just one way to create a reference image. You can use another way. Anyway, you must respect the following rules : +o The final image must be an 8888----bbbbiiiittttssss PPPPNNNNGGGG (256 colors). +o You must use oooonnnneeee ccccoooolllloooorrrr (not used anywhere else in the image) ppppeeeerrrr MMMMRRRRTTTTGGGG ttttaaaarrrrggggeeeetttt oooorrrr PPPPiiiiccccNNNNeeeetttt ssssuuuubbbbmmmmaaaapppp and note its iiiinnnnddddeeeexxxx vvvvaaaalllluuuueeee (0 9.9.99 (last update 10.20.00) 2001-01-10 1.2 2 picnet-1.2/doc/images/0040755000000000000000000000000007175422636013366 5ustar rootrootpicnet-1.2/doc/images/ex1.jpg0100644000000000000000000013306007175210473014557 0ustar rootrootJFIF``C  !"$"$Ct"c  !1A"QSa#2RTUqt347BV$5rbcdsu6e&CDE%vB !1AQaq23RS"B#$4brCT ?OwhX 3.ih/MK,IQ{E&vBDFm*ӋS%I P\u=PuQ"eT3w n㘈.)ŴUQWO&y3$f Be "6кk[S I"#NciVf1*VGøfb^raYPmɇJT6 ZRtH7ޱЗjG d(In r@+iS=N#T3Y u Xȫ9N^m9?U}FBJ^ (L0CpB&"6$pv{ީ7RjNQĻ.'Pi̵/DI! OkBAnJeXIuIRw':P8BPJ>eKwi]Y,2/`s\U(xuLI-=Si)]yPlI:v T,thNawGHgjVϴ+tJ $oY+Z.tccBco!ރ?)h4ZR)-7(m3\W6S> &sSUdNILQyr3t772/ݸgGFl={w>e[Yږ"RXSڧZ%d8y#Ui";lNk4JBMUdC $ҔZ92؅uIVf%pHq%$8D9w)ƫ«1TDYu4)֦&fZu !&](p[߰퐓~?zHrkmKw E/6ܓOEKJrs 7q$;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$&6* 5;Lm~W=$Z*DJ\2}8X݀$(릳mIs"JBkE@fnN՟iadiswowގgD*<vJᚊ) kʴEa'M-*Q11 H-wR{pD)Fr^EBVE-#@,A)nO3bw ɚlLoJlr)аtY!uQ!Na[R虥R{)Ă-R+z Sjrӣ~Vm_0kĢ`-.Z1x%%! lSC ki@(] JQC5),TΡL;LR!`"H*ͼ9TrM-J=leIɺABbX8uom`?D%OӲɘӜiWF؂=oNM ] FD]6S6HjNNjI[8ߏzC^,J&QM>ޅqI*S(r{,!!REIn  /LʀAۈO;2ۯg`?DΑ9'24\e7JI\˕bn:FO O#<1JtpPOcXhgЛOUI%h!) UГTiM'{ &.oEY `"kAb-IafKdJnI$ $ ^Sp:eq恰|=+T HIS f5$e@pP<EN8֋TSU) a&KR@p(:-}5%ܗ1p@kl~GѬᖑ"~ !ݧjNzyI . t|]rvV"c3ʭwJCWtkA*6ɖ ջ(;yp/HP-`9Cȩ=S=-0o)I y92JaҺ륄iTڔ\UÊO@,"W%V>ZeǕn aK_K 1OÉ^TzRZRވn\ur(yKHR\(KVLm&RP *,\ק!6cq&)(HR@?߆jr])qԦ8@U : GQK8̂T 饌7*n͠˺e%S4 p 5Bi iZEHBoefHBA1u>&m x$S"O7Sbd R[x)I` 6'6y|ij ZHK9Ra̳iZ^pbirNӟnEKͺ.K]#R:'u"X W*,HNTd}IK{䂒T.Hr >h*}zOE=+IJbbR1'WtnqJ[׉t~T jZP̢AؐLj&.FUfa[i jRSr&)W9]S7T2]yD 1,3؆red\iݙݐN*79s`_*RMj4jL0m/5u*V! DŹ,Ǎ w$?[OM)y LQ!֐MT z_~5fm[P2&**IJmKus˲rŵd>WA MVi%6sxȲֹ{D Wc֍ֽk򓽯wK؉Bҳ )[hJJocyzQcN(IԒI8G_\,>k򛽯wK}~vꫜ,N5G_\,>k򓽯wK}~*UQI8oӥʣWT~5I׻%Y M -rZS%`PQ"vTl?y`G_\,{^oF~Tj9'}>k僶U}r~Rw_{ U*ʽU$&XIpt~I1txU}rvʣWNtk/b d %8:5$͔ԟ;k[Qx䟦ʣWT~5I׻%Uqj$~Y)UkqJB~k僶U}r~Rw_{Ih;k[Qx䟦ʣWT~5I׻%NTj9'oF~k勿@b,/Pʻ>s-so'*r$̘۠{xY5R@>ͫ oF~Tj9'=0f8t ْ@SIQ0S®r# !$OeTeH&+#aGR~=oF~Tj9'颵tSk*l43mJɀu_y8۽4LSNQ(jv C$_&K9w3|cHyO?%M]QhNԜR[0 'vaއܯKibأξp38)u(G\(>:aJ1,-k)kU8Q^1Ea9[_>lQtЛ'R6N26[Ƹ6[·Mg_>l,tN,xbL/Iѥ'[}/aM4ˋIUJ#A"ݽ+,Yw2#WQ@j`7{t H~pZypEQȣ!SeHXI,:tQ{xcndRgq% RRJU$lH )d')#EVUyԧ-9`ˊ˝i. 1 ƕ2l B8\E5@s7c7alfqYLhtbsvu ҜVwbK۳4EN?(Tەj>x ʟz<yſ$td>jzϫzGڲ|8x#% ?<{xFtd>jzϫzGڲ|H)TKBǝՔkMH:mv1PY~HV_σ}_>՗BSrSFoOoHoUw}/>j;[JޅSs=(/9EWJ4' G2o>jzϫzGڲ|Yt5, 4J s{8B9baeRBuA J՗ oŧAVȍT\[OS ;>jzϫzGڲ|;̶՗We'-$kPB͑՗*}FJ=Cwxo?G[ww}/>j>x#!)܏0_^qo?%7zϫzGڲ|ޑG o[w}/>j>x ʟz<t-%-{ɿ}_>՗Wepʟz<eO:}[w}/>j>x ʟz<t-#&Y~HV_σ}_>՗*=|eO:}w}/,;R)y׷mc`P##SG j]S4 ?+nLS9垅#^PiJ͆$jz;#^^H~pZypA@ &&%) BCKfBo mb-_jM 5Rm r]ͲOL8HNt6 57&i, )'8!W 6aϘ?£x~A]ZBbbf<>` 7KU{DS|rjYatPA!@Rǿ '2*`,FrW_~GNd:عۼ˚-dBFI&ae ay@&kҲqS`椧mJ6 9@lY $| o`ȐDb6mE+2-)Dj ڝI&FH`/#$G* )Ia:!JR!kDiBKeryХ(Å=[QQ_((Tq3)sEG7IHkLNIqI#8rt9EwZRIP)+('@M`]uHއI4 Tur*iEDX}G=uVbyuB-n.9na2uK+b+H(Y !*G I驰ny@$~!8hW TJ<@kg3;y`Ԙ aSb gRl%a!@Dn~a  L]k+.]$-{Fd B^ pKnF&52M]BZ%Zi Ccq;~S,ԺBFg#.AC%\iNAHȉg"(1j #E8hyEh('+BfW7RV1"@PHxƙ*~2P ]AΛ$%Ē2Jl \}`FKQY̔/(7p>^o%$d _K WG0cmM\Ԥ {.:1~drhYT趂ׁ(I5α^նVzG +K-)덖|pR#%6֘G~/l51H4ފ;-1~`oiI1n,xoVT[T8m,&w(U1l-%,m&~A%x!k C˂5b8%ʳ\>Hɼ]>'JLu4=+ۣ._[.4n/3KӪvUy.mep"6#hB0阡'~C'*b,8Z8(L{9Tz(e'W:ũ(*̲Y:i{}y9T^ѹܵWEFA1%% vCKYu^IVHDN ax6\ȢIK7}0 vjj$ԻBQm_@MKI=/'Gᵆ(7B\QXJRZBJaڕBMc,KSԹ86j_͗*N$j|i.RnZ~}24I[zqATږBM .Kn9!}U[-\m1Yat8w ?S uI$ A(J.p[RiA;̮6JE)H3sEK$*lh.π⮚OʎsLllhUCsK'@uLS`6CbS8Y7ל5TʜFP-  IZ`n\h^d2&.2A%@ NVl5aĎt4,Aj|6" JBUG Yң`#xH* /h:'T_џZEFd&g^ J]pH"15*řdX. GeZ᧐a6$ȄVAPu$hp=qus^k1ͳuo\Zԝ-n!(ÅPk\Db|*pchG9ڤ[>h+z)ZǏ\aNj{h8Uyق $̶7N6ێ!)Pʬ]깵e 4Bt)4" RAoTœЛw8*#1g+햰!Fw5k[A̘,!,vXxم7{Z9N*6s%? ~*%)xgU4Aܡy A!A(B-@F Fl0B%J B:eDF@DHx%5 A^ġ =f`Jy F$V7n^BҫfZ]II>?j5#bR21ᖗCY@|1wʜן&oYp\'/0sG1,wEl Cd\Cv|3p%PaXMx pMpH .s Kj[$RZܔDn9@MO$Z)9uxԲ{ 8DIi  r8mXLlBi(iiBmaog4Rv<;"{ )rW\>][*Vn)XN@mI̥jC`![Ch$3mݡI+:%"2trB#P4ءtn3)>?d@r`>jژg1F LsbrI8۪ADbq[?E&Ϣ)"6%!oCRa٥e(6MƘ/nH)unR~MIK!`r IDIHzٖcK" 6+ͳX'ž$o/Ǜ9~ !:S) f: ,-6&9miSt5JʹYy(iJAur< ՖÏziB) qFW l5"7,x([^04~$6U$-ILeۑy5OS !NT8pk&]@w"Sa{h9E+D|*H ( ⍮/cd ]s,tm.ZKep:>I=tolYZڄ6Qv6;H)2; JZR↤6mV'e¬l7]>Mfpٔ6ÍD)`(ꈸmvӔeyfҙ72[D(CDʒJͭʇd-7߄3HO9OX~qJ3pXΪHv}Ȭ'[e8P[YF+vg$U{߶_e)H yDa{K:Jq-M'#>G<>;_I@Od|'*3䊛ЃWa^2s.8*Ro$nOa@`"ZzƒJTpޥcZ:%8ΰUmy,˚uƷ5 Wkp@ހisJ&ѫ )q$pN0bT6c`J\ۻJǪ%7$s)W;K^$%ZL偰c$r*:B_(@ B~pet[ kt q)ZZaKWpqKp\1X@0)F/߆Ds-$"#"P1ê%݉DDIK2;&;xr%-T6JMVL%VzMaż(fĩ'cesC?|!$^- =0󫧄+6he1ch, H Bx Fc-Ipճ%I-"IE/LB\in WmVTXp@,1&BGb㌺co/vֺ8zTl]r&qO.$6Y!cnJ3Kw8Rܩ)^ n3 4 :.2Z;/WδAKR`\z?8-|"⺽)Sq]qsCaJȒ4q=c3t{rϡKe/N@n/uFuմ) JF#BTe#R[+ .9R|˪uUG-2&r#=Bwfq.-,':T*$~T9Gq{i| D66%HJEGjpc.)q jF#TʷD3VT-YPUzP0’溹ZOMj#eXfz L!!3i Ӏ:E&\o~Q:0<QRBd@PHy86`l+6udd|PI*vUWS3W ZTǥ}olcc/gLi˓u [ĒImg$`H+32ڷk `^0 Ϩ{}?X/=L{za9$50πQ N(z~a(q)$L'Oz +oJ$~iM,3 X}3Xa"3.my"]50炰,&)3/*inoRE>Nq BYch&r;ض?nJS *q$k{׻̆mjîW&S,0Pp* &&eJhTHUJ E:98ڱmo c2r  "豶$TAJRZܗ?zT~)}3K8)qĤ}/c'Kisw3Wahi^gR[ZO!nӥ^jeuT7Nmo#}cЧatyʙi1A bJVUٝdd0-*)nqFړ\L 3IOGVKғhUKevR҅ ïXCp4]?Nϱ>}%*{idFFtenT)R$BTј )*u$֢G)/SdCkˡ9M[)"É"ʐVL(S*j-d6HjCMu?GsS/$pnq_y*!JGQ/l{;`]*vBjm>kC%`%B*$IF+3XÒ mNT]@{s[7qܹSn:\çceC~\RT IJH_[|<2͚lb1)u/HB,IRg5/d8&]@fƪ2Kɵ|wRUp3]jqTJRK!ōf*n'Iׄ5UjuIZTāq~𺟎#EQ')1>v+/yAJi^ ,*1`U.|nJ $(^%LIRge& m$̌BUq箚Z#L%$qxOHAҴU&Yd6QHS_'3k0:`3ZJ/GUHfJB2*xB9JŶ_'rO_kh$%e˺ͺAc͈ [34f*nE"35FBz^tvqZPگra{h /mcWݾiYH?!np-T^iy=ܭ(%[X{a<9FrImRnrL>!`n>MJV%ywI-lBs\{>7>ilmUi't^ ٸJ`s&/裞bٗ">i՛T^Uy7 J͡I02`ER̸+y.&I!  9ttVYZ e*cIԡں ɎA΍=+xf:ZdRb^ġ R( TN|B݁ us>d?LLeU?}4&9=S|M.mTʩaATMƼ:n,U۰σ J\ɿ:ؖy4\)Ok[C)*ECu8P k#r*mJVAF;:;6m9>  ZB8w|u_\Z3;v/8?8-| H~pZypC-?I~.P(.RPŀlJnx߀WY[al7َQa~QZpdg[i=[E qhV$.l^ &CkI J!Q+QdIX@d4twVq,6sVkeY PK8GB'6\Q̝-pDiVim(QV"kkyk@3Jʵ^s q׋G^0)\r]ʲ,o>QnCXSbLu:MqZ){CTLf:%$4]_=+3/?,b N+a.zu)Eԇ; ,܋j"Ǥ"$d瞙xɾ͘MFd6[Il͸w6g>ܖu4 E2JZf˔$) #.e.x)HU4MT&fQ \֥#>̬I{1U-ũJQ'FPVөuO˞Lߡ 'ʝ^]3*mo$RJ𒯙CH I Zne$c!D6-j ԩ'wGzBA{o(+RɰRR9) "+dź#D#ؒxifRUb8C45aS'K<~],+I+x)bl.%ZTY2q!ڭ-ު3^+sf( I݋󞕴t0'f&[Ҙṹv%am$rݡʤEԱ4& E&gk28J ͺq@)$=pri4EX4*[l!n!J/Bl#{NN9,!h2fIEV{XR0s7)@ eM4O( MA .q:U* }fP})W9BIބF7:Ca¤k^׵1Q~Z `x{RǍ]eЛk vKBPRR_G;sldeOH׵H_?MM7[ ޓQmK! 8˿9[3'"TC\v^DH71,%VY )eԐ9j2x- L'eE*$Bq%l֒T\yIaf$N6*%7Jfp]9MriA c6iNU}o$*]Hg%&h*K_QUZa2tjV33-,~a4[z1ά/\7T[~\`6*&٘demntpd^8+q糏rWJ۸fRa'P!DțKxEǶ4f8NPO8Ҋ3*/Ǫ)4;fվż\8q1bWqme) I@dc;3R&y<ˠa꒔K<@ ,pf;7ɥZrJԆR'0u\Ih'pJ1.RS>}6,_! cNkHҞy+p5m< ihsZ 7'd RJnpLT~Mm1\]Mږ%\f)lTPӳ PWA4ڙ+hsL4:B-x_K8!2ʬ !9kA,NQ.)d3FĄ.SE sQʜȿ3k5iL&]tse ۝n `*M)`LG7p LjPQ@㭤Iz_KUqU()A8ә7iAe뀃_Ӯ*qpy!4o/cꑡyQ10VTf)lVyҐQ7<Ź9sZ>Rijxlb1i&ݿW^b)&wEcaOUv5H:ӴڧdRQIzv:[zK7o\y#?S~iʊUս^pZIAگq42ٛS s3IRʁ ^CUs1.Y&]6TA˼!#}|rQxLlX-⩔ehuM셶rU# mN%d!hQMtu,4uy+pc7q'lcveֲ Ihةjġ {&̼׫""R-seꔷ kw W>gWb)Gfe*Dm7JUCUMRS$seA Lw-3~î#X;V}I%vw`p.=$S2q7"u9)wcx~_)v!y!k C˂iOSD4b F}-$HyLާMYޯS̭1G+l<f$&ߠ cđ`rqi!0\QY00}p?lD]Ru8-$l~A'#i2 -Km-BP1 UtP",9&p4 utXN\jXUcv-c4XJx(rIDO!hfCEXW w@e.mkq Ӛ%$%]?Y NZ=/)+3M,>l+%9*ᮑV!YkWV*~VJbV]LZϗ.t""TI̴Rpqwhگ7([4q9ƫZ2^!}I-ab[AzbU:WdayUZBH7Y"EƔؚlkcT5#V~_jI;:Fn9fM࢔yy1CDlεmTf%p(+.mCKW'mR) [RS} E !x#5uWK}mlJJZ+v'CAQIBNQ4E1RDUd-/`O&j@iRv)n ˾|!;o B3aŴ3Ʀ24m1W5NR Jq&rjfFJNl̡)) !6GY8bJm0H?]}䖒IWY0kUxvUR2 TI!B1kI\I[/2?6i2TlE0:*/.Ncp_zK j/{6qQV6@\ wfx֪2쿺CY  \lFNctOK34,dypz`4"CĘ#:kK Ze:ۛ^Iu'[R;r"Y(E@ʒxŴ ǙʹJ 'gNrLj] $ˎG=Q{i痽8ЫI4vCE7K eђD!ˏKN9t=pA-IEmg*d<(uxc՜JKKMw*m6΅ߢAR59ASԼ4vqV&e.46$_b[Rqp@%>n-^Z״[w7h(JJv] C%! G]5Zm,JBh,'T'JJ; L e7ARSVQ$#tΨ;{vH\uU;A1-*TQJ҃ % JKrPO| fNK6!Jr(j ɤvnBe2o)6?1n g-l'(ZEx=hW#;R)!b%/&٪K9(gXSWn^gy{ QOq(QAxJcÒ(=B%; *\,-zQt9Jz6O "m-@$Mr;6e0Uk}m BG(3V=[IٔMȎu.OJTSqplmߌK4, Bs/[?4 D*glĩr?ʈ8KLJA(L Murc_o =$%֦&[IӼGXn5Q0iiBn hWSחS٬Lvrm̳,R}z('e,$-y>nU߽(NYC.39KH'ޤr>wܿ)UsnS4=3:Ix\LXWBC˂T79 WUYynTӼZG2R5kary4Z;,pװ:_8q*yt%}>P9%i)RRR3)=]J)ZhLӒP%[Թɦ`0$ qY H\E 5lH?g^ڶ|]u'[[e# ߵ# e!OEoq- W|>TӶP1R%* JJ@#!M늆,+UZzw}5$ͺ%Y]p+X‣ Q//{WFy "*=$6킂{_\-J $y cP/anpvTY%*8Wێ p 5yeo΍g6لV3.i[*AM~<,%ī"!iVtSڥ!*HRTU$1*FS&:M@#Xd ]wǮ-[Z2IZӁԛǬQTeݚS qzJ#ASR.,FQas6h dM[ǜs{nLGJ]mI$HJH U**%SIUژ;H,2Xh--, -t}Tө@߸{nL}r疸{$юZLnXꌈ"/jtʹPn<^Gj0cU8N9\Ei4dJ8TRaljN=qc'x۾tb+v9xRdII4)_KT,=Zũj irIz);ezb]RUjR? rͶf8ebn$ţIMC2قo)F*O}y|]M@xKUtX$}cucKj-K:BQL.u'2Bq>ɾ*)CcwΊcfEETrI70kwuO3'TLJ>b,sOm'ؕ&%FZiK< ;?$z⧰R^E3TꊓLTihʗ@η<{p ࢤW^w8g}oUI$jp# *8~ԓ&柺=EAOx&]f(7d H8uĢS uI-ne$WN^7A?4RZvc)$JJ^]/u=kULYܞ*y`~{7+uB&MʦcԽ䃵E/y#u~ P;!ܴ:\6N`ej%3L'8ZNP\,nM|. RwBI)!9r鿞>9*3HziN!H>Ay!k C˂ܴo:eh-ūR.b&-,;6eiC%G_r9m\넛")fi)[xNR,rQH M~ZRRe GT&f.ԚDRs[&eBW"#e!v~1t 6'D:-fy^X;0q@*ֶNH$.6nVG06/tܼTjRnMɋOoܴAOSQzF0%TƫQyݔJ|$]^־<1HFk+UTV6N",is|D 5//#,2ZiOP\pG9 -;* 2 -СAMpuUElBAӈBIyn)JI}gUuF0dylJVcH$>I/|ePr)`,:Dܲ2LsذV28BjX 69ǽhTT#jdp $9b[6#y幧F7Uh+e*_0/-8A(-˼QYKj&ZB.)435Ky>E*(T)@_ۛ>ϝmQgΎ#- TfXx;WB>wl$3 L]ި:kHKԤfy:Bwd\keЋoz~X9 ee] uCVEc`uXz ѫ%U.ʻd[qo&&1?LKロ瞳[B 9A^pH~pZypAzN;FfN\G.$%z(-%򂇒f&Kl')!Za'y}eS 90R]ZJ@̄1 RM2{)G h?20&TLvC݌.bEi]9KM{Eb7(n=LwU6,0vPu0-7*ؗ1%!)< pq;gV7G- p堹#ڑෞyAIGXASxU0ZY\a*Ml 2 11ٖ,^ Ϧ)-opc [ɹB|7*ИeV ,pȧ5ŦB />J]gdž\BPmߺ), "3j6T.qZ+bc~YQkkY렧|/>m'[ܞzF@$qL AfZ*Զ)*PH-͜즇0>2G&[[gl J<)屭KljRT>[y>~4|"[fN.YRcI=w`;h7~v\GRyRINT)|3 BWMGgM\.Zu-ÍN+SUy=-F&α* ǨCӮݜZJ$)]g˽1emK7 $DTԋYcG:>3TP6n !TE+Õ&"412”lԕ%$+['Y^اԯϊT-QSEM[-jp54e\ZnXm/G[8g8$ei6+7|OC׋6ɈөLͤ%2ڂ,J0"%ni sT%pY#<ԍ"=/waSh%¥f@m@Ím-PGj;KjaK )em27.uvlZuNU-dpQCfe R9[gm(S lDLH6a1E. ;Rf5,&Ф|tkh:^+SmdRӌZR(I̔)C#XmXJ+hqux*7. o+;y*3,;J!KR[Ucv[/!UAI=DC#?NԬKT$otoyѱ76LO]fѥ:tX\/)Hʔk)#/!Jj#PzV;:خح攬 QmA70 npzmɍH-8\ExXf,#&& D[(&ߍgu>rJ]U~XJRKlepʽ-ҐTmBttq7ZuS Uv+It[߅hȐ ߥV@%Z%:eocRQFbaKs4JI'|6mğ L˶ G#il YY*Q$ܞq = 1蝛aJ^)uxvSeMHPP '#αc`ͮp)o,8VAZcejV֥{gUm7˸+KdnFeRO"d2 hH^vU&wzMDA7#]uKD<=?ĴOsώ{ȷ|j鴸ML_k%$>mD%iD@&38K.)KZl)j)%\x# S&2ihdHg#Isv .(ҫPSq Ŗ *WШ[VRud[+@Xm@)]aFd'فq# %TuhM$m [IZp/S{-*xʊHPA APrJZiJYA_Uʭ#.#5k ҝ[~IKhq-<ߤ6M%K[w޵ N$oʋR6upFyF"ڝ Fc!Z3)QA(@`pAG8 M1ʊ^ oRP$QRyDUk2 S *6q8M,-. !duqv61#{)o7ڒe Y]$;*'fdk^>~ ܘ2M*ʡͨp R }oy/[ccQ1UIJAH J9qbCZI' .  |Lϭi!`jxp(w"uentАt&SOWKn-(N`e9z%j沦0č=iyAkdgC(snLn8loku rigZmNe$Y}nmx$Nm'85̫Ge3PD6Ge2PG[]K<Ј "NDA=R`\z?8-|!^noc>n/~2apC9z;,Vy z-ƍ;H5$ڜ\T!!7Q)6"V\LѦejmt ŲZz>gq۩`. 5Τe*5ӸI VlyNxUimCⒼ=vO0=Vw,bpSFPVUmF6B8H _R#Cr}4692^Sj`VUߨk1ɪM,vaSj7II7%ڈ<8s4mܺ E eCY %Aq*Y9t6UD˳-vqk(I&0Pʂ[[Cqpmn "z>LAEzTfYR/:#efU#Bxȹl[X2V8ԋdK]4NP\7@Зލ9 h2IZBpQzUHE\[jknQ)8}eX0SD U[Ka+Si˗T&Ѱ$xDSzQ-6NZ ׂon-Z =yiROZ/"•-B B b" kZBf @ B8#0@@qN2+/T?xәa ^HNDsSQM W247DB#Fq-$tI#RI# ,K#1SɶC32-.~J$?G\'NQf|*R:tTn Q`68={P,tQNKZfT rI?Ib:q0*Jkk\DbR{=oz%ϞSie$ !J J{W,#Wsk׺II5(ryZ┯@H\&&Q gLLYhDA'"  _0o.=R`\/KOR!T "M9?yWr6N=q%% BJMF T\K5??U;AvKM;`P轖h9뒃jK6+Vڝ-w*Iz"Q]e-ISRMU&Z&u'n+G<*6\^ǏQfvʳPЖKdA_sa- |C'xcC\͂ua+4ft;hIHWUffI%O:$ä́S]$ ĔʂXAQQ6ZSuMΧPi6Zrʻj*b>X"a!9Rs\Y"aѹ:- i ɰaof(E=~ó. u6~:w!qO$mgZLMmIin(aje[nqմ%@2d0d2{JW7,1e. +tfl+HwʰltVcNǫ5,4EhmIH\X2.>Zi%jW+0m .'!8$䴎ossew7o'*sv98]a(͐fq)ΦcN˵4`n2DqMM@ *7::-{b5ƗD-vœ;Xi̬3ۥv>6\<3M'*ab4n{MF؄7ii5rRq)y : (!@B#Hഔ)IWlm#*1J׵Zej !d\,!Zjp $J@D+^8H8BTju֒*( n>HKl 5# ezUDp#HʬxVF0en,JGcyW > (X<#B 0?7cn,389 ʀ!pJsۜ$J!fыFRo.p!Z Dih ` WPΨ\&˳$` (2) 8(Y5c#d,áD@vx/v*NZAۿ I1ٵ9yt6<"lvWOM[YnZmk~XVbb|[U12|>#K\&n]Pu(st<0+Pb`-PbbsO8Y/L@$" ,PKGרj:dِ=`(ݢ\9G߭G+L\)LP H9nR4VJbQ>2fTkw׭āya_ru7XAMlÂO\;2K mfp 䠰q*929[jxz^1YMiŘb^F1>"5aGl} u`i:SNZe_vQndT nb-wd0 pyX1zҐLڎGA>ܻWR1mze-x4Q:ѝC҄%I @$k/Y2ra3%\l($e[q#KO#OU3ǛĠPm;od M,EE4˟HڎV|Ң*t `%JIJꉓ;"9NSɱv`M0 kr5}l2j:=_T(ɽHP&-W'b,a~o ׎ԽT5!Zt8 Dl )f4*ŀS.G/GoW*-2z4uT,ײ|VBj٭GItLz_(jQoT4-Is:t0҂ғg0$SNC"5? 9βӭwB,(Ȕ&$0[iSPR0Uxg^#a-z꒡pEyg IW\~m)צ J”.X0AIgPpp-qD aI<!.&BMϺ8$)8IJ'VD/)b'Bc_/h;d/SYGN9=nvczMNu mx-t #0({k']11.ZuɩuT i߄ZВJ_КbeKZmNR'R # %upt85YmɒJSj&ʳwlr饜&4 =,^J d)u%}NpJh-h4Si X5؟nhui<82@R}q{]#Ƣ9bl?Wt17r9`yKJEVZX,t0 ,,&]D}ʒWsh% Mf5{4WC;2tAMjRU2.̈́A٢X\Zc/}ǥBB JAxGs}0JhH TKk{pJc ̼2waY^Cx)Ԡp|4S]T)jw--PN9 ]A:%;2kϴu!Kg!̵,%!Uؔ%T9<)/9-]S&s+%j9l3:ܒ^uL*)i9, ؂ 4S Ͷ9|쫎։SyVdgyd~> {:"}1#ο}CȟLV> g_վ!O}CȟLDHq'_վ!O"pC$xYoy郯q'8!<,d:"}1#ο}CȟLV> g_վ!O}CȟLDHq'_վ!O"pC$xYoy郯q'8!<,d:"}1#ο}CȟLV> g_վ!O}CȟLDHq'zDv~->fҥER71VC543MJ|LL`nSgYʝj^M.}IjqO+|'M6nr^QA,&C-AJ%#1N[F7aɹ2ras|%R e̋TqzSB fIras niJRXqݛKZ$QEF~P?=Ku쩵QIQh4fT٤i3N0R1J͒{m< ؚF,-ٙieʩ8R$^~Jjb0mm%,;9p$ dɵA@NcWeJad#@ +:MçMLóeNT (M?LS%j.HR3Ohfp8KH!cfTJoӮͪ!6%̉) U"U:V~Yi,e)͝|n;I2*́nq;"tYiW >C #Km[v#8bHҮKȾJȿ%h%7M1+~̙K.)"΅ AƱ[RڗD̼q !J$'k`mҎ6NjzZU/`"ăA99/U)VmǛ4wZ(uA6rAʮk C-TI46938 m^sM ՙ3HPH N-ן74Um\mR 8q fJ2qx 9IggdQ(u;iV @InTmëzq[qɂ *,m o]&e2e\q9$ \eQAP#jʓʡHT,X :ﻛ5HKD(vTMfM;Wҙ&ab̲Qn%#N!9JUYސ.H]5xFW)f~M!Ԗr:5 ”5J5-%'j|ŬEZQ/SmTs;gPE@SqA/.PeOI.w؂.4 ²rjbV+134mCh Y%A*#Dck)Ժ&ʷ6!-7s`76p33:%Kaw]S%@Pn^$“1).%%rI rsbls[}uM_ ?'{$wk`Nmo8rJm ]BqN%[CR 1HU [DS ReC԰k3[!*JP,rVRaMD̳R4AlF7Y"n/ϐ[kZ7RB̚'Ci9Bq%GᵇCEjV}A/PCAF9bڿa%3m򔄂I:ƽVYQ, ʥ^d(ݡ*AgP&s ZАt$fY*9FpvVh6R hRR Q7B;,ViW`j :~JM475h9Mu椛%@SM,5yژLeC\MVB-:a;O(2r-iy- BB\۷GDUpd;*6j;`EӼjmtK7̹6 -O%M֬B ?M irMR%STvtڍRPtWGPҴrRRXlj5;ʞDԁm* * vokoNmLe:BZ7M해 Vô "[i*CR9kCP?INcɈLbJ#/K*I0M~f.:ke}ܒ/xqnk爇QzQI$ͦa.qAvKZA;6̰p u/(ҚXmam 5q2uj }֒JNe4쒫s N{xFUWq!JRUR.Mj9$e!9CvK[㡴mXT:Y[m,2+vsЊESkSUYgL]- XHZ{)D *o!{07Pt ~hjR&䕖ZshACE@n|lSKun%* 9I@ok0ӰLu5 IM[*v˾w-G)<ܑKԴMzɧ+On A$8""U&Ye͒R\M֑L9H7OnK4CHSr'[4ON0uCh,  $Pk["gZeuҔ%Z$K|t8[ Z]SH(,%jH9 ) \z+\x2Kko*WFC+XJ3=.%[%6qn&Z3&q]75C SMPA$kc\RSXbpZc22 %{h@d\u̷|558zRSXb3eᯞ 2⒝ǓqINcɈxw_&92a/N\8#$[(N>gKL0RBNEL"Xr:a6 y6p⓿U 䴊Ї}KXC B xL)c+2rb%SٯLaiW Ry)XoDto6l {vP3Ɩ-*P;0WnM:0T Y'OBlѦ2ԱC(YN1jn}6C7뢏iJ}0Vf٫u!K턩%)˸Sl6z6a q* sqfBN i-O akF/EZkDM4$,6Wvif,( kWfhtjB6BBnR[CpjbE2FkUmo}>HxRClDhZ\JRԢe]iQՕ%R7ytk*f-kC_sݬ쿯IWr]Gvn'l(Q"+cz9Nv#tx2m/+RͩA^Qs+#}-:JR~^mS*/T(_xg6NQf9!2%U*$ (VĻq,1.G!PTUH˃ t&܃IM4aVZ̫M5D Mɾ}\v]S60aI/=vIi풷UԖ4l5H3ҳ>U$mCDMMɵIJJE-x:fz]),-%*9lu˝foТbi2YbS :EҢA$'p</|'KV ;(emNM+qH7R4Q1%z8ūSj ^86ExH# &W{pm]Ɛ@]w+Aow+iW{qW{pm]Ɛ@]w+Aow+iW{qW{pm]Ɛ@]w+Ay"I u&A# _o.='SjqK8mf[7x-%8ijL%Jsaosp8ڒIRHGRl"HP̗Z ># VeF땨v#EP"rG p T )FbeqeJҳgUoN" P:6b< ji`V#P?It!b@ 70'0K!DI() (^bMee\/RV咔j,eS7i+2WZC$$jy'{WnMyT9$.7X'P}6sg2d\J\uV#P?ItG% Nba*]Zٛ%DITkCmSeZ'h&ɸւSƥDMIAZC$#Ԇ~' y ˾KNu Tf\{k+(f7JS7kuXdB俪ItUH0m|H\UgTS|Дj-lP%D?-$6g>qnvsrbպ,ߟK}|cU\}b܀Z|0/uoY>«UUf t="ۿݜ Ϝa P&-9\)0T`(;*N Vw899!roF]Uk5qnvsrB優e]Ug$&XIpt~ 14Ww899!rZ@Jpu@jIqnvsrbZC$$jy']|0ItUHq$.XUH/UF;"O1!b'(#t锣O`..MJ엛)II)W: Iؐ@RO舎XVffR`.+.un#07@8ҦU9M[a:YHPVRF눁`ԞajnRܙCJXKh3!͚q2JqY ,UwZy&<ُ@-aˀ~F-USc>N.E6* LsÌ7  ʽ@+R] 1\ GdhyM㲯:!+CsԞkejIJvefJHۣvXL- 8JMq]Yʞۣ 8F0uEN BrRr  f85ZZ>w6(#G*j~}m,@skst2]ւJJѝ l*#)hUHVM6,u}q حQEa"˸V1ćԯ>k֊:G0^~L.#bnvne%8Yy}sj!#5vXS;fK_M]QeO(R?>(sĺU&eBUMm@UARP1.*d!K4[WY^r%!]\]Z2Oo29DuB99fRBYZ<ծMUSG #~G?|KOH{Jh8ćԯ>k֊*}A>x~G>|KOH{Jh8ćԯ>k֊%7G2P[Mz9Z\bCjW5A$=y^Wy*%chue(/'o.%bCjW5A$=y^GܴFxU%xح+|KKH{Jh8ćԯ>k֊"}FBRj%$=y^bCjW5EY>xʟrxʟrUO/2TqD@vn=0ӦAhM,5Zu$Ht +O #2?#>%ER Tpap<{UC `L\C*D @_ocy>VݨF)j%$x;yH^U=(@P# >$c 8t"А_ć@R?zʤ:a_1oXG4VZY[oJŤss#+b#Y8 ?e(Q8@k;{<3$~+g|HךbLƫg~IQY7;8F#fZX³*ҔFe}"AFI Э|bl0BMG .KV5#D[(u<BkmEGA}*Ee|aAM- P'K"-$c"pvr.}L'(SVPO<+kuHI4 Tur*iEDX}G>Teru<j-ƾ#NrZvRulKVV :PBT/Ɠ3Sa9BIѲBqkeЮA4;[a<ק waH(f͗_ȅNBHC<캐3f- (($|;2V]$-{Fd B^ nKlF3:Έ!-Mz[N605.P""\AC%LiNAHȌwјƵF6q#5hyEh('y1F[7ʽFEhRu豌%Y@%qi7xc %`y!X3>t q$/o X eEg2S|gT|,w@CY1rs/6)J@7 1K 91m@bFt[Ask$sX^TzoVȏ&*d]H܋JCLU?7?;Oٚ`w\HAd nӟvo2[brғnq7i~:y>+Rt.âYlHX)/NB8vKo, j,Ma:nEPj}!j yimۇ&=V*= F~FA2whДfYU4Hi$8q jmK!&䄗WLb=ZO d,XSJ4֝!øIZ0TEۨM'xNETP69#׼4%[RiA;̮@6JE̔\㙹s;&n.&:1P,]lvܒnhUCtsK'@uLS[ES8Y7מ*zeN#(b`;t/u 6s@E; HN<(vd$"(hY'/sxbckZ%qcPN :w $tlXQ$29/by]%jH#^y`Q -lH 6JFTWRse'KY%.ܐL8-)mEGzN;4AMI\9][?02]DXfA牊-a@/ nfp۴ξ5↧ W$o@ SV 8[6K.eTˌIP;Beot:՛ r>Xj&Ru)#Ac*b>[[| x$ VrfJ (@ka2<8u#) @kc1!A7;hARtH逎ȔHH:+Ԕ$H3 XypIHUscb$hb e&jE1ʶsZQ7=7_ćgYyq}lZr~8,bObGx+}JDEfhBybJInē m]菩~1Rn{w=Ǵpe3%0:tgVOiUu3|۹ZexNL?˿; a4z}5.H~ZIpA 4zM2AYmՔ!J, 6d4Ҫ}A Uf[pqga!gmI OD]tOX 'jR ˨3&]n)!:{iP{/S֬UO2G2F7$<Tz[HFj++N)5@IU31>ɑ)I׃\;MJ*fa7o:QnV-4hY|s dBTZ:475MLX9RK]񿨱QUrLsgGQ'} \{$?-|A#̞xje0e[ qś%) bk('Jh/}Ɩs[V^2 mĥhR 2 EUD髒cTJ{_bBvJNk[cm"RS%tٔLL#;N G[ M?0R@CmY)H?b7LLM|WcZLhMs|eH7ߤs1-}!F/dÿMxJ/iXD!Bsro?pnSWLRKNc"ĸƫCRgdf,JuKJQ.͹>/%)s;/2IkAa9Qi̭gy6ֵY $f`JXgxT+xO̷/BrU-N.?j5#bR21͡CY@|qwʜןINn;G |%ȸM|Hl n/vcmJ憆Ne׎ϼhxOt`mx , =0~XE*I+lEmHMcԺJ H“]MK'-5֙@6"[&G`6HP!4ڔ44e !PT}6wԖՉ)wwx:9/p܆ U3Op4[E.S,hRs)nZd+6Gj7#<;pˋxBVuɺKn)ўEW e)PZJ)vtQej@Y lE6;"T&QNmH׶pOV4N-۞Bm@70@rH/*,Дw)mLוˉGWk^~cl=^.ʅ> t)H=QV=I&RamjE oo1v|4OB쏄%C9QڑS|Zb)|)Z3/M72M¥ ( " ,(,e&RIuRI@c:V-YU5ou݂m]m5 WgT 6XQK s8E=[r% r{n*V^PܒFFҜ̦㶿Dn^h2I6&+.9`l* )\%V'HV(R֖Ba-bN +K[|)vj[G Uφ!'mCs+|$hw<uSF/1Z1@ 2""7Lkn茪A1B$%SWhJ[ԩCQs{Dm(7BJx^s%,QStkN/Gy6K).q9 '0;hPi針]<%Ĝ]H)C/ #d0T -Zktvn4{y_bN(ze,5"M;pZ$n@|1eE?$Q Zso O;so .97mW=*sW8.WLL8$lgćXzzW }(ν/Q CFd[vvhVg$y8Yc050vs]ĢTHTV\StYK)RJ2GAaޕ׳[7q_폏_ gI#*5yYf_g %emħk0' pBq&d&uߘIAceV\%NzB.,>wm2S)MʜRڡ"׶VN?ՓF>jtd4:T$ǹ$y!Ak %CK7 ҕ7ew>D6*Q#@39Zٿ'O,R˙@Nq\9{6ۮPHHRT.41o RUunҥ)U%P1TJr=*7}ZVK`! Ε!G('*9Ih/u-#=y£ (m B,`y Rxק;CW9 ̭nsclU541tm4G)2*َ6D(yD<`r.t7{K]_4jӠzBR @ –I**]Q6jd!$e;&i$WЮJV&U+HJ jU:@*! \J16LS ht<ӐUƾ0.7CV7B2#>M{Ռ25qKR4u5U& 0Oijʅʭ Gf_5RjY@b#}fy L!!3i Ӏ:7E&\o~h/FekԲ$.j/8$olB-؍i5_T'giRr rUV&,_[ p?;6qˉ|?QȇPEI$ W $^?Wim[5ۈ^8\>#S5+=0 u|K( N(z~a(q)$L'N?^7lp6)~/kl7Fq%ޗ-<$^vVŕ%&e\--ͣي@H ''Vz  p18VJs}N3dz"oZ4zvoՍ6:rn%2C ) [c41iٴTJJ E_ ڜcn`{[[:n`y)9I7 6d]6dʝ)JR[ ^[%G䎘Bom3?>ijnْJI1m_$T?t6s5vPIlG?J<u Kʼ (nu:,F'9ǡOtyʙicQ j%+ *C2k@\B6I^cԥG&]oE=Zrn_ܣ[JOlB[,L˰ꖔ-vY:Oxte;>Mt q(VkܔK':7+i\CF!Hy SF`(ԤԒBZ~Ofq hC.)6l *C?8IP&T KLZ^4><8曮g8ɹnh\YQ%F=%RC=H8<9RڑvYorN[}s^*\8’fJR@pi81uFbSg0_C-!%HW:85/V.V vxm2Kɵ|Qԣʵ*\V0Ke֪;>zRZ_mi,k0W o<']Vj]&UhSYRFS{&/>* $Y3 P+MȸdTUrl?DE @/$R LJJfF\zs릖* I:\~^4 zH:VIv RmqYC,T8'}=T [UHfJB2*wB9JŶ_'bOOkh$ӲTfeNffбfBxMFٸo "1ZW=}tvqZPگra{h lq܄,ķ\)!krj^On6+J V٦$VNhj4쭼ʧsnBamf v?5)Z{]$ β-soDpo>ilmUi't^ c 09ɮKTy<:jvM%#F֛ Z*ܼmfФjilE{Vry`o%)7!:xb.E SNgJT: ɎAM$?-iiܫR~Von< _]zh8nfM4S*vuQ7腻?(WabJU~u/,iISac$RUqno{Dca.ŏ,UJVAF8Zvm-Fr}O+0΄nC꿜cqj Z> _o.= \`zZ"Tj]BhIKhYBFg!)}H]enqvΥPkf9E3ⷌl>z( ЭG'uI1prgfL6k B>y2SέY[N-FzFSUi^*ܜ̩BG4e¤]6h*z!L zX 3*a-Y@ ףHV%6N`N﨎ҵfXa,d*1 3 %j,+ S$,c)7 _QM:")R qE'6\Q̝-pDiVOBPs57Fl6&:V\oU9ZPqaT @R 0?eEw*K@nCXSbLu_ >wV#/:ڟK~OLfj㪒R@CEY9ή`~01;'_ꋡԥRf[U='a#'Hi) k] ṃd({c MRk_4Qscr(ܛ % ~37mm91$̥ЫnR~AN(TJS.TޚHM;Jm7eɦ{>/wWZ)h=sʽ^\0ۗBS${ }HOIWpESSj<66I9AX[^qKJrrI2%ԉq~Rf.4E_1'NaJ32ʗJ/[v3.ruOoˌ8ԗeD3 nl Nj8Ȩ׻J۸|)T}0ӨZStdMmx;ᢍ9A j#2QRFrXE=cXYpgʼn^eŶ|iHZM$Fλ=Kx:7.KJQ/0'@;g;j-NT^fat%jCVhYJrBmqt\Ih'pJ1.RS>}6,_! cO5S}gK'Oq ƘF;UrvKk`$)VajG쑴 w *݊o XsjQ@KN6QBHA^T^@7nG/d{jgV)Ri$tm{sv\7+BA$xjf̠pU|Js4lHBe:tP15|],8fPfeݑ)n0q FPݹk^ \S̘=S=B:3Ա3gP.,-Diry9DKx=a%('s3f(,pvkAtTN;N³4D0S{MsR471!g*1Kdʶ ߶hꉹ9Ο ]m#<,5Z%\1^,_N{DZcIoqE$Nb[l3)蹏a˰PvT6J^j2/Y.ګf?}+?gomNmpü&hSDAئ,WVh3o1H9uUrIŴQb(ӭT%,ꐋ8i$c9>O{Gej]0im$X$ EG=ʣwe&O΃57d-%H')!d a:ssE9haW|s_gXa+Aܡ}ES< b\p#t3rnnmkqT]wg=Kbz^RVfY*}WJs *U]"B,*׉W^{O?+%1+.XۭO˗:a*$Zy2));'e&ܡphr9Ve ȼBZvO50U:WR&o E"E'M}Da\ b,j&<2{5 $|5Q>Yx(;23s94N1u'Kj75#1.6AYsjm:Xs^"+CKTmIN^;B5UF%6m%n%Q^-jRPMplu F\E*%k9OW*/Z]?7Ӯ&G^͵Si%%GU2w^{7h.(%"K2%`IaNćjŭ'e_i--!-g8o#2Oϭhl8G<ӹO:qOBr+ UMkՈ .P^U FJ8> ,Zu""SS&XVbeqTA7isI$vn%Jc^KV!N$Τ TBX6q[?OeBUoG}^] [Jҥ!A@s\E hJ@Ww|p/䘞K>\iT[)ZH wZ;0~m+ )eŃǛ:$6#9Nnlw8 wׄ8AY(Q,=.[Is0I躈jc*pU_z\41*0ĽٙBRS2Bm{Nxcn8Y&Q.Ztm?wׄCS>KIm$Lu/Fam>nuW6':HHʢMŭX(\or"#dF PVFD6i2TlE09*ܑ/ qkSĺܞשTEH&[-A"De^":Ted2@'t.FNctOK34,dypz`4"C̘#ZZуj׎KHԞhxr"Y(E@ʒwŴ QR!4J ''iF&D5.R%#}ldNpo]>e F:(TS~p Z=*!\mC dRo5N"TnDî S6BRZZmnSo)t. !Rca4w~svq !UʔYJR@H7'~xh晧Хۣ4= \{$?-|A"'SD'$swٖS6-*[(%)"䓠Yױ'as36ۼI2i AVê$AukԪ6۶^6%+5ZFS`JHyƶR0{̪.Z)tݩkh\*Rmt+L&fs BW"I*ϩSE߃5)NQ܄Iym.!]К6ɖ!\RQqʷ“:CgfrnlMnjFgTՔo$tw\Jw]UʄkϞ[RQ͕Be*MoFeiAP@B%̹s(]'o t%ٛu%9R5D_;7!2qRPV¡Ck{5IkYۏs*20,K>fn ~ǟ Xi煢<)H0P!B"8NK9+2^Zw$8R{wߡRʧ&%N)KxUSk%E Cx0̶-NLjtJf'oaM8TjE8ãm0P/Pٛ[KPfB$$A~pAg)n^zV/i.NnuS0u(l76 .}N G!<.9^f7 ]*:i'#J(U9#9qO{O XJF8ui6ɛ\Cvo@uمUA^WS+:1c= SE(RTvd vs'rl+63Iܟ3ٳ<߁Iuō/_*_d7 _o.=-?I*\K3/-׊TԺvH%#]'| qؗ -{Kw"WBQNd%*P Q*Ue< E:FsKEvԼBRoRS?& O%tfH')"[p7EX+Du "ʢE,ɜtL1PC2A7'Q"P6=U=,DS.@=?6[f\khNry)Zef$;$vXixkΰrߛtzY]໅ߕSj:67 nZm 6JP|q˓t%G- xeTT7w^k˗"pXz[[R2M([N T_qBTB@`7ݖpsa*^sDC F J0IN:)g"@Z7n"a aE5Q2e*J87-d| f`AFPmxpoyjI%][rңm^(RU=[jgMeYᛃM5=Ϧh\%,SS4U6}qAךl %}weR1๽؇,3XN+ L͔2{5ȡs (ay98I:P'2̴ni~Q˲Ke!HQٜڀs9D2Pra(ReYl+q:Z :^LVV^J`:'w9pI) 31/m )̂N 'Zsdʂךۓh<1൓sVQ7ytd`]w;ST3 I-ZuG8:YBo FƛKgH3.IReI'[ߛ0ZŭVW'w1Rfꪳo_ UhSA 3mv9:жo ̉wwaYBtq}ZFf9rzc:]견E:#Qeܝ)߲%+3yoGAD"Lʤ~e6oUBkEVlUVnJ3Z겳tuPθSu%;efS% _PNk|"U,<Įyw[-iUƮIe]ije! U9u+#2_ko>l++5wZ--JHjTddW)DR@6dIah߬,UalwL\Ԫ[6K M-YVFMGl<KP&D&YB~Oc'뺷NF R VRoͿ ˈ5a^!!Ǜ[d lro~{tF&fД)7 -kRoQ Xe{c1ui~tFe s􆘠uSM]hD$MF:lt1#OAG)bLzu'DXA?4dIahr!DǬ??YEt1#OAG)bLzu'DXA?4dIahr!DǬ??YEt1#OAG)b WZJaOY22V%qĢ֜ʫ^"SV*F'/L } Ts 'ehw櫪3ZE|;<QVN~cKoj Xz^NDʟ@T6:FL8ԭKs0bFQ}(dp[ao_b^\l76Z%ez3r ߘ{ Kuonzi115whz鷞$~ y#rMy#)QDJuH@e$ F1W\pH~ZIpA iߝu,˲[V$\M[dXvm V҇KQ NP¹ 6EW?S٦ҩd>n77$,[[7'EBR}#h=64v&uMpK7N-K΅Yd9Hnn]+- 5%|NE#OZR8[I7ٷu1P=4iJZ]kfٵyOzb-ETRa9S{ߦmC?4z{xDRs[x&eBW12s]a'mŔrMD:-fy]X;0q@*X@:mXN-c8¤SrQJQ7&-?cA3VЍ/'%O=J8VaS JV (/HuZ4!);OJq?Ouu Jmݛ ȝϨp[L0Լ#Čii?BRqYNYnrXMMgl'R-!h͡)y)h$]l =ж9|VId(lm:]"rq0B]]q̪S<] rE7-cS&_bA}c(i*[SljY}XӜp6jhs |FätJIzAmEm[*(JU &p$>cP^nڸUQ o1Ni|rS&go~L9ձ 䙝nRML2vr;% e"о]FvR4p j46#U#UmipeS6ƓLJ4f q byKXBF*P,H7#U#UcBd6g. ./.Tӻa|,ׯ,ׯiӲ &%[Rs$A@Xvi)U̯#Hu6$t#U SAQUxN`/ J.`uJ#Bxyaĺ˭gmi7 I )I[hCJqNJE%W%D {U%d J`)I h 4lpLӥ)Vr7qw$_iM=%,k JI(Wssm*2̳.T[JCn"_i>Uyfx3iGz5Gz5DO;^Y^;^Y^7Wk׃Wk׍4#U#Ux [*P^f Ub y+/d>~[l "*Et/ q0=D߮ n- D%p_OS׭2CAF"@pH~ZIpA u\':6c2r9J>Q[UJKq J՛D,oksO舆LUjg9alXmRGVɄ\譢Rd$"L#-J@H/翙T^Q jf8Yn\ċi]9KM{FvAɳZ5Sn"kSpRۀT31ǔTlHXe6·TdVDyZaMTh"Vr-esA.T(z%h$Xx.3>S3v[`xamn<-1l& F4ܪBb`KFZ2qwE8{(YWz!p,=/#iQ0Z(,"mzşٸztg(TKtUe4.xBVJ2Lt IJl?Lys10Nd+Yz~JLIDvZiׅ؆Zrq9@Ó2F`6hs3n6F`s!N5u{bѐ sf(Z*S[BN9m+Zbl5:%G 0EЦK\C- VJ. {X̞yv`H-K! ZEӠU&R2y=**$(wAx#7jTE:F X,6ے&] yB`8ܔje+H h]!.UvsUl}V,`ӆ PyIosbM0) 򖰄  jڄЧVjg* AVA LJ KإK-) oSc@QR>ѕae6~{`ʇVweTلIJ&6Oq!X6Е EI%][mv+ڐRV;!l.mK->3qSdRE#ڛ[MJ s\M4{D\-O,CM2)JI7Sܗ[ S`PA;{T9K%Im!D26FAnMI!F}Od C܋YDEEr7vz&G07\F)ba<|O5zLPAA= \{$?-|A"'SD7TOrQLT*w4R&Jmu )mȴ۠4T@y"*~$0YِmV!IfQ( lz%RVi䎺ˬW.@[Ji 6u"++-7^eQrj?Qӛ)iRuj<QA k̪:{24YTeu[m(RV[R}nfֶ@CSoŴ{4$}.W %)%ԶQ2Ce^iH* 6s`Н(,6\M念&xT3^3R].gx2$nzc7e`#U Vo7BU~*A #HLL)nrBFN$&< ;!Ky25Exf]Z&X'f?ż<{Hsm!tT+rɦ:F$e *cJ>JIC:ܲ$@.95Vnu9U2fe&R)Bm$F b KMNuݒ'6Hnq:UڦO8li]kUCnM)S-(42!/bI)<%0 Q8.7B@J.7*OBRc>PV TAi˭q/m@YٛvAQ.&9umٔlI[¤ORz]ĥeK2'ؒ7rMH &Xy;5Fcc`H'ญTQO^am-БoѪhFAڊ&[W(B4N{} ;"LJiLfH ywhX鸛"uNfT:Ձ04 e:4J)y %ܛ[y$+#sCt U t̋L4cWWWLԴi%kR\(Č C,mt*F-)  ZB3/l=:Ĥn-2/7=UJR,KiBBo1ʂuO#p;$їS) O';@h dU6h$ˏ҉uŅTRMͅ-捋Aqߔ4e+BU`HkFHSJlJ $^ա0ڛΡlTqM**䂫p 9ke}/>Rحyn-싨}Cȕ'5@#K ,ljI jHXO$eAB@I9G*ZϼPjQI9HQH@͠7;t)+BCx]hK5BK5A|ݏ~_9GY߻"|rS 1VRRA$Z(MFHڸ74l(a-dDz, HA)Ne Ue _ol`)<|Obe<|KbeսS,=TAb,Ad7 _o.='Te|ۭ^d%s4v"Y z-ƍ;H5$ڜ\T!!7Q)6="V\LѦejmt ŲZy>gq۩`. VR nu&]}F|UZxTI2FۯKӢś|Ī)jckӞE6M1v34RW؀'4Ú*QW£ek͌jQ$ƌڍldp,t@;Fbhl#J {OU˯)0T]+*pBo5Cb&[p0)ZkemD{G@ Άࣧ͠oZ0s:1Ym:N-4 W/?ˠra'f]m;0YEbI6Tkol8wp;jo6$_ruF̫Fr46 9y?_TA\mH:ߣ'Xc OZSh{Xsi!rP2#},XCwʐ/ HHiR-8 !X.9ӦRNՍS93"RMM;H7u8wxwtG~3g*.%uKm*Sj=Bޣxٜ1,ͪasFDq溄G#[ƿD5!`@i(  fR )Fefny~ rU*PPBݝsj\|< tG~XdKx#[ƿD, 2?%kA-_c~iќIo}mYa~e}+++5)Fg36ЋI}4{]]7AO5oKx;H"^F]-%).% Ϡ"8R^;O.e[u6̀))kIodKx腁{aǧ.n<[uuSͻv$Ca 7QKªVe hvh2Bs\IodKx腁f'qtRԖemeV |* Ìyn4̚duM2N Ml4Xr?%kA-_30 䪶eEE)y9ex,! QCAi27 3$) <:CG~2?%kB}G{#[ƿDr$7I[AYRa-r? qRjrrL3~k܋uDEEr7wP0}tߞ >'be<|O5{GHz X  _o.= \pzJt^q"ٓ/eJULT* t$u*I$U\STT5qr<1u&40&[M-o Rܷie%V-av35kS e-)kcBXQ1U~iN;PzW~>ĥÒ!+)R@כ[k9% .[h}2.|V+iDjHOJ,pVIf m%`sI02*D96*Kt[MЍDS? +3˼KBKĥ$۵GHkſ[O}5NRBT(p!.]t8^P9 T4D:@iNj$P.<]Hr&a&*.eMڥUJ3Jw'`)ܟՊvouhJSV K]֒T)%FeZ֎sNji/E*9qVVHNoloNI7AsJw'bYrT2mݗ)`-F6N`ji Sl7)-.Zrn tl;2DGf@|BGLD|S ҝ(=X3Jw'cb!{GTPz^pn5Y 5;D[{9 $M֛ӮMfqCɨ8ڔN1.K>]HRnS?iNFlBjEg}t%:^.~b?7QfYe +pX5Z+e# j>agJ%&7R*B]&g,BZ  >_U1,Z\qw $ )iSNeg3t1QA$'xMfQȤR:|0{˧fJZ@Z՘ p&NǙmqҶ F˩3J:+p5Ȳ aK(C- (\A Ĭ,N 24L4)t8^ܡ &b]Y2vX|0*]%%nu-h($5|:@LqͣVTM/{h )YmN\5Lm[ #V2٬.K.9+rO53Ngsjnemt ېqDEEr7wP0b}tߞ >'be<|O5{GXz X  _o.= \pzZ"H`+4ݣ*wq*d0RZ[ykZP$DjbNijSZiD$ӶyNaIONJxo9VcxϣIz"Q]e-ISRޣM9U&Z&u'mG>RoktJ.Ll/jcr7΢5] ui ~x8Z@ @a NB]tGMjRg5ft;hIHWUffI%O:$ä́S]$JEx4QAsWJn &NYWm@RT,G*ױ jS>nx%'&¸ }-[1B/&qsuo"f뻴ѻ[ʹo\ bp!. jkhJ7 DJ S5 .O%,fR@yȌBӻ3RcR-^64zm+ҕJ 37CQ7sQ{]cFˆϚri;3wte=xgNkz;Τ,ύywH3n]RvK?pVQ6ʼntqZ]wzgޤ!_ XEϾ@"򎋃pJT'2YAnثv) B۽{Ԅ9|i?M[8} iM)A<0|&(u'RlAt~lkC9Īu/SXT:ZUj S,F@8%٣NX*⦝Zm)1아xsdqGr|5oⲷQyf2`.Okq8>6|= ύywH@0zR*BLɍ;(`}g=XNor _Hwzgޤ7j/&ٔ%]뜱e lJܼxn]R ۽{Ԅ*'>i遳{ɻɾt 0J9nATL;N5\UjE+b]"UkP2$~x@\ea搕̄YBll<61 o끶/-grS*'M˞s ɼraq>6|= ύywHm졂s͜`졂s͜bܕOu6|=! 6sՃ 6sՇ%S}9b$wya/qU֝7Mtc&`eִT 馛Ʒ郱f)9icX5UUγ$g}MeS:WtZi3r2묨!E@9Z}hyn FpY9<g_L@$" ЯKgרJ—vcS紎VR<tsܤi !**Ģ}ei(--+%|'[%pw׭ā٨_ru7F8EN4m"զmv2Jaon%U&PܲS+`-[/K&zoo9NR3I=J~J!g΢ӽ{H$B%8&TԆTHH;C:)|ߦ3؋{g7UTΪ+_U 9ME݌}q!5̥L9XHϮ2T<[R /ũ$*Z|yLqy~$~NذjGη#WfqEN +i$s5/4%(h!n 74>Hv!`C-oOx:SLJػ7vRBNŐ@"tNW w<޿0 1TSLorsjYS k*RJUDL;AN5 v`M0 kr5G-E9_u.hɽHP&SLHcb,a}>o|y<ޯkkBBB-$np )fy~T `(%ao,~*}WEB;caFU *",uOֻSr Bx{qi#fnɞo_2vλXzzԗ3CM(-);/hv!g7鎩9S3[(yDg(Y~ĩr͖K\lbgRڞ:ߦ2x4:Wާㄠ!K vX$X&*^fY,_̋vә\oDx9U 1 CKd7\OdLJ|I!!(K} #KoD!>3hΗ8kZkZ1>n~J⏽-Y3,nIGxڪ*ʦB[2ٛ/pܓaVҥitZbirSS!P_ RI4a %,%5(D}t,CCNԪ23- Y*͙%BàaIc$ ח2%y@ J ~M촎pL:=Vw7u{ڭo#J3&bu n0_RV`,s -r.S̃/ˮj%3ok37r@^Ⓖb5ˡ(G [BjSZKg$Ro ; pk7b"\PO2(W&4y'qfm#Z8g߮:S)SUfەmfd@H83$ ou;'Z8g߮p{U]d= 3osYZ8g߮֎j빿3osYpBdG [A֎j빿!p2u{ڭo G [C:=Vw7u{ڭo!\ h~:=Vw7.Np{U]dh~{'Z8g߮p{U]d= 3osYZ8g߮֎j빿3osYpBdG [A֎j빿!p2u{ڭo G [C:=Vw7u{ڭo!\ h~70ijafJ$pTt!"Scî6WV5 nhW^#KrBi0d׵q )W"Rr.^Qtro~d apJz٠{^zBJ7SRTerip1l(c Uzӌ*)B{nAa:#E 6_$&6tW:N¥Ca ^R3  Oe m3*q*R& #2Nɿ5b0ZG*W - TA)=*Oͳ%:ITR)9l*n.(=)'"Y"|%(Sw :2I RpSJrN4^SJN_Ѫv uRj^6 Ď{*czMNu mx-d #0({k']11.ZuɩuT iۄ=ZВzڠ{^zBiVi.'Ui;JH.\k!I3nLRPi6UccM,6`U$\d2Pĸc!K )+Vst8 [ m!kғ{  3fVJ@O\nH8G,M3&G,)iH+Kb\e˹(׶oYR\]jnm MjW^̆1szQ&)*lfFlU.-cp!Kdr #yPWk`>X\#KHx5Q-1+Sol+2Uqey B{C OuS:ZA;$;uhT꜔i>e֐-2԰k|@sW#oe'%%tÒea֕0G-gT@. W10%-4g%A 7A803J0kNʸ-[Jh7jJnJwj'Rk.%=֥ +`Dog&ڀopn5+[_{U<6jc'NfaEg*%d:AҠR/):o\J<.qSq`d)pJg3ujk1 %N6NH猆PHOh!KF%JC=Bp)*e uP<T@#ŸAh]F V{{#m6ݲiZ4%ոifci^nZ"l͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^1qyh ͘ǸҼ^l ѵb7~BM^!d<>M^7=x 7=x;M^!d<>M^7=x 7=x;M^!dn卝 )#qS+69viַ[tBc_TĵTj-ʇ oڐR, ГEY'picnet-1.2/doc/images/ex3.jpg0100644000000000000000000013757407175210473014577 0ustar rootrootJFIF``C  !"$"$Ct" b  !1"AQ2TUaq#56RSVst347Bbru$C%cDE&8eFW'C !1AQa"q2BR#3S$bCT45r ?xƭH¨yds؞==ڶ^.mʵeo|yǛ2@X =Jv\ɼʤL_KLNԯwM`# [av91VDg$u]y9Ԗ ;;x+Nf߈Tzq ᳹Usx-Klle9ad^ܛI|ne,[Ę>̀[W3$$;<ћ9MVPJRqV.) F/*i\wN.%#M|hT̄*QZrHhN[ eb/6P$(ѣ=U5f?[3)InY ZJf*ˡ674MD3wZj nO{QQ6hnt#(%Tu9)L\ ;M;PS*l-HiBRVWE{N&z\d]SewhڒR\@;A^ѧU.یK6T(WIK+4쉜LJj XB ʼn4|BԱ-`e[s)rxUۨKzaKQ>;#1ƞ0=oNKgn,[A9;ɍ5G*!]+X^u SZ7Bb)zaO<kj A AЎl'0^4eřu (̹ /ox#is2uDHl ٤}13O![ȷk$r t7XgUd+Tӟ0R96"4UgSS-}_+1HKjm$Xkr\n~%,oI$ԵzI˽%*e FrTAP̕rK()$B* فJ)]VBcqTVi m ZЩe$'&m/Eo`іn":a͘%IRRolH'Sx+ :KP-M<бE=.a7"3$c9eTnrPeeЫJˀ RTYfSm ! lDFB9P8G[C/ʄw[NnJ^~xXxvi3IJ+y';hףWQxN!KSBqE YR&AModԓ2!}Jo:k)JyJ;dE$#nd JB8(B M-ME7,&%aA+I)#"UYjC A=mJRR`:@둘II)/[P]Q4DV5K+`O,(YUg .9>8X|<.2幥vn((tܷhʌ=s.;6ͥـ PM5Fm-.,shL@eٍn*TfofT<9V*W(cR;gIa~fnIҸ3 8/)m&]`E¬F#ʍjT(.](7Fm5ucya2.ԢT-V $mm,QODĒiǤemhH"]Dg߸:S4^ӼDVnRzmlhsf& ەqW;%8`wssS#kTHV5OjJ m6ڝ ̢ 7ccfRbwc8iuAKًDkeM7nuqOď<sS#9,4̤q>;Bf q!oJ!N$1.N9֩烎x~$y⻂'Ժ8ZG9֩pڗV'kTHxgjY)A Ig_;RJmKߓ>x8oϞږJPB!IeɘKߓ>xi]`ͮi.r*aGAGC1/F_qF_3H/H8H/HG8fgbO;}JT,M59?*CA))u7@P$ lmhf=QDF_qF_5XjusNe[UeBw1]fQMW&mʼnW*V3H/H8H/HfMti=,ݰB "9]f˼͒Fd((\qAz#ܿ #ܿ!f=Q/F_qF_E͠i)i) Y;d w4r4r,2wg]#ܿ #ܿ!'~ YxH/H8H/HuM4θ'F5_KiL|j#}G WcDyuDADBJ.71910M0ZR92R.rV{YREt&eMe=.$/H#qKGTꄂ_jQVK9O&ɱULB=STejܗ(e,"`eH*U$n@: 1]*`AaLf^|Q0"R)2.8R$oo6#'`+ oks~2U]H@ZZt2irA\h]mF!O1>b@+OͶ!c9fɘ WHLS\Cm_,@HvO/udz0qO<ǣMԩԅ)S˗ȴM6RScx rӱ<(2ML_"uY.%9a\5$ n'܌Ccу}?=HJQt0҂S:v6,"]lr1yF=P F"$yFc}; O k%"JQb vB^[ K쩥i`Ro?$ĵ;6sh彳_uߤoDMDrkz j DADF˫ G?DBPfqm2E_5ƭ][)Zu9SNiZ/潷 za*BLAཔ“{ZX{nmɵaD\2x11ԶFWMK3{H6 W/!BsPC(*Yp63- p(YTG0 0MnAڝD%"\%Flԫu:\P~^ Æ)T5!~i9R+UPdɌ.֗XiBAr ߪ=N-9,':!259n"pհSkՕVəi %m'{>_ fUb@i ΠD~}q|"}m~xc"Ӹ4cvPL{f&[9LRZRl\w`GeVpAl#[XN41N;s>nZ8q,ffZa7ZHbYRHTuM =SMO2畞*u7y Q Py^un\~BO<Î1xf2.IqVTPnƗ~+یBJw ~ 6ocJa\ԝE7*چ?0_4蝔Za#T,K `j%Fgp8î4HQ&mvY9 D<Ĵij)e} I;4=]|J#_GuIL6h#2? `RU(O";i b -TJ&C t\)RxI̙=cXe<&&;.UaҺZWq_=|1`,?1KIZqz)Xmse#y,u7gZl<LZԃ.ïe7٠ܳSW֧%&x]M;,'jH$xsZN@Xj {I;nO D9m/X2}(jNY 7=I5}>mΠ@ٮ n<^9VW<4\ƫ({e W.QfBRhv,$ >Cuf&}NKٵLcq8Q%V GU+x]^Z6K姱<͓UAauqDcF:Xpunj#2ReeZ 6)\d6*%%]vQY'j !!%d 496 P12qfZmǭS# E.#T?A$)= ɵ)fh`J'gu1Yo|bd!IR97'H]OӞA^h|"\9/珧^ k<j}a9Zm(!s#} y_B^xk2X/.3c8>оמ>/\*&87+-6neARo\} __kpG\+1clBf)0iJ SXӆZmnopGus}Vٽh)q=}^ѳNH|#_\YT$|5*eւyPeՙI<֑:8bZLf#p## `LW+H+\yZGJcB.-KU:^[X|c/|c˞%"˜#}CĿWSz08 \Wֵd&>5_yjZԦs) \ Rvؑp"!1Ucl:jzX)ശRXIkt#cis̀U2t5Zry- Y Iq /upZbىyJ ! Rt".=*X#>ꥦx $f)P6n{C*2ӵjZҐPxɡG~w\lR9 ЍsಯTO7;PB%*؞ő rajJ/2Z)-apor_xY aC"tNiS{lA^ge L?Cҥ>P#erQNUs WH}4{:촒 Pgas Eq9[y"oXɷ6˫A TA柟LL!΂ ᧫ NR$+#-+o.c;?0>Jr]~}U+ÐmM"}"aԤ(#30RIV莫TU)Y4RzF?NJ-2ma(lO$Xf"ڗHroV Y>W!0i~\}]9O}3J,:Q :}1牉'fk8=e((0UJ׃r,5pzZxN.yjZM.YM4<`TzcmNaO8F]a|C&q)m]J'@<&7Vjz^3Yi;KX: }1Fscߪ5f9wmu-uj..wF6TV6MPD=AWgr(1 h35b>-6m`d713'6Eѣ1F,qfӞz!6iħ'tiS_U.QAGb1x$ocoNa?OÓ&e8yT)nЅ:~jP9.}Fk/KSnj0^}aYW0 yN+u)p%/u{aOt2SeduҜ3}Bn((9 y8I}5^*ԝ3$K=RrQInPaة4yɸHTHJO$~sqgXƜ[p*\Dj>u!ət0͂-~ne CZQ {T&QcY6DvikIЅ| ~Lv ,)kmJQ@%#Xi/WatDT@%fɇQW?e!,3D2e;Bʝ*Ls%Sd3ן:ap67W|E*ԝ:YۑtI9Hǽ}w^ !u Zjv*ĺJnlIy@>fE3g<ԧHi7^N:q2Tr IvQKD"BU)HjU Ҏ6WD+m)jyDKK!ʑo .a&^ric pD|_:Qc߻4YF$)J.o )QMi6HLfsU*wS{gvY+]#Dcnk\W 'M^7f#:ͼ$#!;lP7 EU[zdMl[enyM?2*MIDX5l2qT#&SAC/S mP:cޤz@TOt`%GD_ n/eFR4@7J-+쓧ilIJlA0\AOE6\LB!Z*ME[ǫ`lšM]㮥|'/c_[!֎U$ͣO"Nji(tq*0Duz!@>o>^&f3>\U+k)xg˘11!|Hx `~/ \Wֵd&>5_y9ʭM*>L|j[3SoH]MoZA}u+l\>Xse7>?G~tlBZU4l+n[/GZuks2Ғ\ڄ1au[i]M\;Yr0nimiߔ_G$Di/gfeڥRҢV`:aRG=KOVJ!e/vebz<jx)D)gfi q( bъx&ѹVxU|(j ecFOj_b{ŚiBKFZǢ1x^u s245L}K6{')q'v6[:Y|SJkX^+?ē L˩^AdM0%Srq3*93!.HU<_Q$CyN\jr]g&î&eaK pe[\cY+M T\ZRYQI#G%XE>{[MMA6Iɘex˰Ni-.$v ˼s \_(rpԚQ$eUu$1٦*$k=y[TUӺ>)#K_MEMRo27Xi0Ӟ>:Wg5V'̩l0]/:^(ZiUFlkoj)AhEw׺ zV6:1lQj)v(/aJKM-Be#>8Tג,m^lSLߗS`e1S.}nOf:R!a@IZݦ׊ CVI*);8%̴n+*Ei "54kH؋cRIz2Ctp3Ks.ɉTĩ޴F(2zJz$Qn|W99k E:hsJ)37?daZy, >2 鎬mL: Qn"<:SE~Mh쏂0+y/9\[|Hx `q _Lǟ}iQBcU6~Jf&ӉJKH* lR/G WbT')'d,Uu$#<1':WK[ꃅ5]!L(lP(c33%KeHl "ĭ7֝4ԅeNމ e\ޗ[M%)!! C@[ͭ4plåcCMDӪ'R\8H*4LK)"bssJu(*H tjtSL;IhMk}V/*YZpvg8Mխq a\Hl$BzbvR!42 M&-pj #S挍B_VVѴǛ6mZWbfߑL4%$_2c (z~(l̻]NqC62TdjfVeM6Z s#W3SJuRN>/ ,ƮN>nֿ규8So)4i N]>UG ̦msaIdsv|Q~HXDJz|0V3:fTfJWap.|Q4_ԣ{ ͣ]{kkuXqc{Șm>U*J30Ymr1U_O5JzUQ/0 U91vJӧu=[}ͭIYs3tɦHs2] XrzTնUjUY~eKmAWI^IG5BSn~aM%.)FތMţc86&ʯh=!s;pɽOnajl+v ZǝF- MFuÏN 7G^*]F*R&s_W8{#>źX7kQޑSa&[]JIAʍF∼Bby)M4.0[bRAm>RZ̳a-">IRX `b&L N=Eu q&]-m'bfcO2iƖ)Z[$>SØ~[+IR+9We֕* %Q\([)SXj/*l]iPXXt;▛^ܺW9y.p6m@`*]FO}U$;Il΂3t.)62OS<3- 19F6enhcv~[u6-'"m]V5] \o^ 2RTV]u r;n]Ha9 }ssK,mmu=A_oqeee',;hrJT!2VԫjRkXZb;Nn8dj^U6i$;&Sp~&8krܳ)jb(&޸!sI9J\m-Q%\Ncӯӯi%;ٮ k75ϩ5kxWHRJ\mA,I7^sf+*vK, lf$ ).?0gln5_yg=wjU"_%YK̡{ƫ0EGS>[^dgl|9^רQX;a8va[7omى0\NuŦ3%#"r,-8oty:SZ?x9_/[3krl;֩2Qdk" T?˹1O 4R6:ZʵZܨ:k hR O{*z::hg|z7MF3TKU6@lq!D\y%#Nm%k3l6LiYoolƸon}B[F{_'+e qE)$qDR LK$u< ٤:{_A5T,:O/ILI0(c>+E nqdv v;Ni|+ydzQ?e+5)2@HuČ\#8y5?|?ӔUfB_CkymYvV]d&ViRTI>染zaNb:cK. y V/_o{o2.l:upjN"1A&;w_EاCCu'$g}$";cFKKY^/ RT5 ϯuZS꾠5 I^N] kdꛝFsR&™L8mRT91[pWmDߩIO,ԟxz]>T.?0˭ -\Yzb/= fBzEjAZNahIKBUtE?ʕ I!H>[CϺpU:V9 2|=()4չĄ7>h0hasci6~^> GdV>gj.^ȑM/X)hK%Fe`SMIިH˹fu!Io~^;`#U|-UԴ4K0\;L\/.`m؋ gs>8d&tn½njӛ}mR[!IapBOf1/~z[04,0e'.Mo]z3K%!)yĤ @01JۼUs1܁0),P*1Cz%KvIK0YBJГnE91_y7:Ww xSj -)*%@t_`S4ڿt:.viKQԅ(@"q/H% Iwzcfة3ːq0hKM5ϦJ4W\aR) /쑕@r.TUHJ^q)llW3ZohHc,MvkZ%C8P1/\-H]pgVЙiN%EԛT&ڋL*}$O8ਐcި~pARrn`N=GesbCuF9t &Ѥ%DNt5m+6EKR?[A>ATںfN߬Wը[UNə̐lq{tr !f[Р<߿UՁJ&@dTkO'r~TmRGX C5j 6Tӽ@ 2~qq&ֆ1t1[,.SX|ƥSF@ֆڒ\w,zۘMdž($]j|N@˧$h(@NGr!O*hxBiԯ+`纷^-IJA |WjyOST#ƽ=:5KϩI_O8V69U\eOPnGYtc~A]K*lJiIR˔7EE(tbjJJS6R8t1pLL㩷o6[jm(@:p0ܤm7̮0[k2sV Tj uueX,,N/MGJ!x%kU%H0H)).4s'Aqew&Fx|;+|m[n{INa`0}2 װ[Uffiʙrl_E Ը// #f;C>|/)*$L*-l [Z/GɥO[8˯6kIaa|5aV sx)Bb SPEaَ{s<L?@(VF].;3nX%f_GR fm(_2\aeLƔ{r"6&l,y=-Ent;԰C4 Wӯ3B}Q4҅g2tryՌR.(%JdxJJd>ऴZVr.޶lK m*aE*K* N p*m9 MVr9x߄<Ǘ5H$3-.pǃ_~Pr F9=E}zVR ZsbEWA^hwŲ3`8rs qKD:siIq{.ScRǒѠ"=s,*e˅f^agqucY 'E_M W k Щi&=-)hBg*RPg#uAkPu[QnCJ yhtS@]a{우,u5N &c:#](H81b:ĔRCY#.Cq!0Eoo'0y"]Ʊ291%2:`f[JH"5fKqYC¸ܛ[QMb9=,iqm9UmP=wE_S?&^O`TG?9ZfssTܚPqHYXAd1uH+t 9t8pڛ^- S1M[?w?:oTۼq´խqJ[$:hzFXޣR[<7 QlZ:u4G17?&x=ȴh2mL>X!$nss\Us<0YS$7.\G |؛W_761޼߲͇ =cQx;$"ͬE#p?%>Scx?ا:8OC[IU>\ܴ'D)wZr p_M$GIzw]>xk uT&=ψ֕:O(r]>xtU}CNakIGO'$?A[ #X2 '@#L$6hR'y/R씟f+3k@ܥM@-Lx!iKG<+)/.<-RTSi:Qc}ĦZYd:-_Eæ.LRG:Pn=$E0ƚOD}gx!8ԏ(Ax֙ }W WwT3/K>dظ܁ Xrkئv 9_@c|,IK ! #hc P|?Yi wڽd|] *PƘg9aGq()6vs"pZ9_J}}+h4g(ofA΢/5d;EH}@sf^\vQ/0ڂܒc2CJFnP2gJI7tG,zu9(PfVUp[,[.=man}n)ӎ8$MZ#ɈQb;&u)RTr,L>hʬmR,X uםg%>e >xV*L0(Z@@U3'"_a+A#_T̲rsF9YVjAm⦽; j)--0IA ;u)* 1M#P7ꑾ#+Ue괖}N%8lU(gSfjSKQJGtX}=KucvՑ\_ 7aʼII/з7^ʯцS*uL@3? C8/KrHM,̶Ӳ%Ҏ71=*Bfq138N.JT1_xt-ʰ[ȕ0vң$(Sq6RfyIC*PJ rw!pgWz-R2FT"RJѧΠcdihT̒/L.CJL=(vAE@'@Ŭ/DV6~QRlQOmiOTp5Badx~Mrm-. ( \xCN%zC3WatS $Bb^Uĸ̺ Umi;(I!ըST϶R HTLϔL.K)祘IKM%$sLBQRn^ڛC Q[BS-Qom2O' +^: pQlA2Hc9XwΫpWKm9xgg~GmažJODt9#bn;hf##Z.5|s%(V捝zGqzDLJf^P{__AYt`㭶.#b:z/.BP6`&qZQnBARo&11 4Ane=̟=U[e_a´DMD{cz5%y)yZSRVnrLr&I̫ٗJu(H$vaJun$\fQP'\XCCw1\z* faоs+XU5J;DSXHie\:yײc݂{{?Yүs"\I8[s GH?͗:>L|j צ?}G Wbmd'&neaYQl0H9)c׎%0vkd7*_-gk9M~ T^ ZLJ}*yM_WUyFrҎ[e[,-|t/_I/^(:S/An{Bςի}%y^'9˒|Ú9"⽕|^/˅=N9 m.|mQV0ԭ8& ;w1,NE|/n3?'V Oa0✕g+%Vq[L|j!vN5"+ mAԒ-A#<6Z6UnBN󦹿lD Q3D$oMRHMTe<QKj6D9z&#z(̚BPAq * 5O43w$A\r8Jft[&+ Eπ1R?6RK2쐠nGMas;v;/ҌA2HC(My~LU'&2yߴEBB1ߋgU[Z&vE% k5L-5~!SIب/ҍH3 ېny܇/i*8O4nÁtc"JH L5*~&dҘKrT9:#Z_ dKHPUźTzaěmZgͭ(Y]gx*# R4s<%ڙuӬc'j` L̆dѼ^xǃTS>+Ld_Cߚ2/+ IQ$ߎTA$J-^DRˇWBGZh!ןX8ߧ%\>)䤁ojLVSV+׹lűqZeLɥʋhPV$oQZ=&[bHJU@*0>H%ßsP~C|N Mˉ}~^(h;UGZʨ;xjWqvo-L- :$dj~~Q1( G옱8B|?OLI3&ϰ\t::YC%WB5/OK3eYmbtDl^JX[eXJ\ !GՈJ9W41pj AIUEz3.B QQʉl|=*LɥtuNUUn9#u~i4i[˭ UNd_W,,d 7 <ꯉ;Z6'zfUٓT%д(i}k-KPxy_~GX],bAʯϙ\)GTI"DKa BO~^m4 [srirH) 2QVJP&4>^㲎 xvϢ*]$<8J9sO` oW&gYGRJ!B}t31)t2Hdʾڂ=*0"rɼa}vUfѓ]+ #TKK;2 ֫^ǟ] ˏWҧTBl$_ IzNfD0Q J\FκS,;!%K;t@$1Q5_yP5 jxlaKVueؤX>L|j<qLd B%=(^{p5'E-Tu} U@hǘ.Yį&\ X@UzNLf+MM5fHm%+ v;JT0.hDt6T%eInQ HY8ľS:zQ:J )dL%utnLyS獊cUǓ+׺\6|՟5jpt )c4]#ius(R@^wL%^ yus[ӻvLvCPSO&wgH[欮}b_DX- tsw406'*ȹ'mL8_[iM#sV ՚N$K²sH|WٚIٺ֛cbG4po320C%.\)dQ &ӈ*)L @a1ϬTes9w=IЏ)>òxf'tגe@eso?4Ae,!10\qoEdΫ&^퍖* N{ɳlZӨLH&\F]M̺Obbpw8QDa3/+652 )[+QQJo|/pu;86ɷ֒S2't: ]Ƶ0qO'Q*Y}fzǽhx6IØFm2ꄰm\_*Ƨ'*DHP8@?˘WɇVJSswDu抠R5^]Ź8_}ğ5bZ*Y2fHg,7sxzw&<æ0FÎ!RAdƁAIp544![Johp.㺜ɷ5? PVɗU*Zk#Z|`  ˆD9n[6émuydMp7323vaէK$~LF3 뢖+XWdef(PK~M-m2lsZߣW$>ߣ [a/KJJ6|ЕP0We=#8rDGk<)ɗ%yݽmXyZbMBHZ@uN##D湙t--Ҧ8 (Azʭ{Ǣ5S5KM=#B;#_jm7;JjP15Cπuf9%Đ&DvW[[N!"ip>BvNVSi9|ÐmC4A\C$ccr]̴:Cdm,) yB|fXH_M57/`"(*MA؆T,*$̺GA.F Q4FWud&>5_y+ANLJ+ -rUFkōQBcUA*wڿLqpĵ,a6Eؘمj8P#i9v#2 H*Cr; }7aĔ*e@rN'?ER,?z=#"cxx FXOWNrVk`INKߞ1RX5҅Tبdu$'.=s ~"?bدr-/a陦rf.WjAeg0:\1SRTI3IΕFǛ*_}ET>Z>5DO,c(ϭnag5ܺ.!yX!DžΩ#|^HGs, sxnJW`kRjq$$MPs_8*RmsU&˩JMz爾  ACN#(%{S "Q~IfpI:ے P3'2bvj@n1aB/MB =GAVg2ͻߚ17 NS±ReSCU\z7^9|C&2Qzq]8J[|iL5C[\ ƤtaȞ˦bĔl vq^%!WD^m*N{R'p]ag)ڌr- r? +n>hFD.^N^,t *-5XvNPreM!I6R…ً)x:cM=TO18D6H-<<5튛{tԆwzug^t̓^Y5& )h;k |q'+zS<d7A7}_Ǽn$3 O:]9+([~ǧtx'k&<%BUm)9b 5$RKHcMH_d.Tdm.PC*V- JTpceKM6HD %zgy8fPu;aEV0ά%1a?*똰&8 PWzi] T&HD7Aϲٚ|++B(Xe$Rdrb_R&)Y%Lœ-K͞mr,:co7v ?Y,Q1?_|h%u:|9[IEl͘/nA=Dj5.OZZSEE@eBmG.q,%[&IMIXPY 7Hj5Rq,w$_QxUڃ*L\lNeeUQM4оu7=iڶYj-3:$转lC/U3U4:.` /"R4ˠʔĢ>5͵(Pܢ[lN(fJ _[ #[^'pt7 e|<Ǭ ݆~=,!5RbeRD%j!bI] rU=S6TLw@F[l 4B@Q{r}u=%qwx'/!E! {I0o/m$+PH96 $E3LF[&8suP+e_=LJhG)o{oiWe=#8_WjWa!RR%ԔA8Lڽb#zǵ YpEIzbx}m^)[WlEIzbx}m^pW0r%ՕDI_+$ D_?vR""⦹,P%ʲ">+Rz7-#eԅ5WG WbVz)Q&&Ԍ ƫ1ZbzEB#Pb/q-C:SaHt.S+sNqS1TTe=GNHŸe:)1)9p +Rpf%b(ܭlZ'q Rr{VT:ix\Zǟu褰n!]mٰWh{?ĞUnJlBN*BawѲm-&Px+S4^Sr_"[I+H,vToRKet:vx8d4#pTHtbjVRFZ+|-(ΝE{slFɭwiei ^,W;Gj<9h)+- ZEc<[[LEv̰1+؋$If~a/#NbM1UdlLHUմIG1JQu<[RNIxG k|{&L~ jXK~zs% l9*ݾ!ЎHD.Qg T$ݖI{ \FLK 1ת镒:|vs7:J& \Ejt'Q4mTz>ԼuWt:1@եkdm I)=^~&}6[k82I .M܋#:eeM!,S"Q}]yJgmnm.>s~R՘~[# ehgIlt7J N}i>(4'?F%굑/C g6ڇ%sB+5xQS~*̶ght齣$̤fR-}u%53johS)7 \GF :ƛ*LStb:k U%vO+m(lN&Ug+s2ҹ^\$^5^weRr'%3;..їf/.DzmՂrn~c0-#^Kl u(=(Rl-o]U4?|dXRRo)P 4q9-L9fftjYe  Jw\@$Zk?*߬:Pʎk[+c ^u^e,dۉJs<4h86Ͷђ#^H41n&ԞKr.sd-,*HP'N)dT C.D.VBZւU ljӧgEI˩-<x9٬_^8NL[\Yi ).Dee PI$ڛ,Ii ss>B!e DtMM. U<rf̰uԤ67!)?XB|h))UI6<1Ua{6ˮ'(ZХ$c 4샒iZSFT JqEWȞq؎"Vm2~JB7+'$^]Z̡!Ju]L͇,OG8|-rIJY9[rFbj^bꆐ)ضT|D^&S&cg2h4*M@-\'{BdIӦ qK)̧r$*@0ɨLQT&S0 }t' ӕnk |LK26R@X$;&mn%*aJSI-eQRR>I44ʮLLS9M}EM>퀝]W6 RqxLYÒYek.)ԝ?:gQ )TZ)s(.e.4%)Y^hp/}S*LqYsDأָ0N)X%ѩ6rbR#.TWJT.+h47p9h帹V*Y m* ؞Ʌ>A7 W$n>R(9Hidu@F]tD=ٷS{uN&R*6MwPK%/-c|]æ}Uh*<&XTJ*yRJ-YrÇD忽"VX$ir:*5]dC3ZKAh7tD:QEzD.mˡ*I@ M}? LO)q*W&RyWT&V]hưX f05R,)G5?DIIҨ-LbEfVeY 鶢'0P$f] ۹,t +v%i::L! ԸW_iH a{-)Do_U_k}ب}e~xk*820o:ļo5zV}S玹 g2.p!T/<45c÷#M{LO^[+Kiæ9Z;);Uq6%S !@\xuZ+f^8I(ʆRR9 :a[*eT%QS@ 7vz%]n]53lO$ebU N]1o}摥OQMWgʕ#h먹2ටR{)+#)B3L9S6a}nm=^6sTp@ZKie`&Aih7+^_,Qpƴ3w 妾[~ǧtx'k&:ܗV٩Y)eNL,-V\VvNl%Rl>KnfI6 :F?Rӆhpl!,dfwuY]}T6Ʌɸ.e+(6! byJrMSsCiZr-ZQ8Nr2] }9 K[$(dA!1~sBU]\gBZ (jXRH'C㢚ےbRBFB\ VU!?柡?Jjj\"bbad]SDzNn} nQϗݙmC66ZE5'*2YܛzJh3k/W"i2 Xk*\ٓX.e܁nZ%IZPT3 t ɿt)Z=*^mޯ3!!y|'5]u#ruFDS33W+)`Rlib,lHBtF;Xq Tڑn^M.$ RrpZemR΅ry: oh@氉#a.k܋M[o%$۳j{Đ:fPJ]:بjm{."o S&$g8?5*%˴7G-CߚrnbEs3UױjNDž>^$6Z-y==]^&=U*Iִ<x+"G{.h!.Rۃ.RێǴEv jPR/;8R/;{D_i?/b쌷#tLp%A]UNRe;{{7#FFJ_Nid{rU_~V_b3>K#zǵ YqMp]iy*;`fB٣5M<:zu7NI^oT58? J~Rp׺?quDDڥೝ0E^Ej-NƸΥUX=F\cMFeu~,34Bd !1UJE1i}}91Ʃ^S K3xmXln$[~Ԟ3$eq&aUom =EfK !\#l~Fp-IzyHKEtr iآbaDꔒ+m:#INk o}O5+8x.X I+R7JYg%TCg(6 H&Dm#SFvӐ۪Qia0.4nxa-Y?xGMq"'s %v 5 A[}U|R[BEOt$UgB~Lܗ<'cGɓ1/_"r.ʥipg%G9 'M묳^5ff͗[p8~2ޫiΞ}!2XA)~B$(ޜ_uoq#/Iv[a2|J/`5KE%C6 c7޾f?9|}u'$?'҈5̖)jeهee,'i("uPg\k*j/{7=?1je I(W62 *22IM4 T~f3JIXsP sz>ŠTWDӫ/SffnAh:k~I"Lq_XƘfq+"Oy3KN'8:*ST‰+ZT>UX~rjg2.bCu( N1'%ۈ5k )|_=(ӭ!YcU5#vi`@.V"&&G_!o*H楟#k2ٞמ0Eebjo= Gp_sUw W/c醚qkiAvpRyg~bPrrE3a )~;:ˇ};*SUMjoi֎u|QۋpbFrjwZIظbJ;E[?|[~EANJ>65V"O6[v?I~vMJ4A[{jJ&7&5A2R}lȳsjʗu(Mν \MTS$rүOTМwRN䑻"f1r]=11iduu*%!BķAbQ<6~(6\L!I W1k &\ݍo[]5{[]l#uݶ}t7MK%h.Up'ގݶ6~ڂ&(#+Vm7ԏ¥f\M~;AA`{Fq+/1DA   _u{'&͊Roʍ>!򖔜E.n;"-6Dħ) f"oT&mS+JT`NV.ƫ0*+4ڈj&͸& ,A)1e_JVNz>4\BxSMRܒ'KŘlBJH| ys>4}#'%JA36I!|*HTP`ɷ(P >gσA yn6J}8PƹHJ=Pb\6V[2mE1 ys| ys>4}q-S ӥj<+BODCc"saZ-5W7>#cσA yn6J}8O•D8?Paw8hys>4p|]G~k̕A3andUMLwp_Tp5y'"s`E y7Szxn%[غvR` [~ǧtx'k&',DAIV˵^W/.vɗ%95$3RYغΩoVCGDu{{SyB\`/ss &UqEXBPP2ARWn'1 33狋-yKogp5]߆h *bXadPR8˵ ,uTewb$ U~SK3w^t[$> %\ MW30{ʻзpun2y ܔZifRs %CAckC2VrOy*AŸ[H!JR{YGIe[TzxfmH8@Vd6N-'b$:nju.f5+]-gOcHfYMYٔ;1_jbH ;0ALy'1"[_?cDt˶˩mNN$'ގx" " "_~V_b3䈂"AAA|׈X{y%\v㾄`mꟈZA1涙PWd&>5_ywTj]oq%IJ؂eXLLT}}Unz08N0}aͤXZiS mU8!N!)) ?1R|q/EJKac0 E Iɇ]@!$%3#1*q,$쬔6FDi:*\Dꥥyf.6TZraru"|qĠ6nR$~mь2 Q}B+*/:&Է95rԐЄtHUL-Trm-LH*k\ Rĩ+О}D>l2Z[m-J6 \ROʄ* rjX-&}.yJNQbaij2ȚC493蒫^׶.TbBv y2H:v`k[|tjr5Q7$C{(\ B RkK;-,ۯM%J*P  ='Cj??4 k.KYʹԚVrdisLczI-Rҕle\ž6L %6I6HQa:m/j\}-JeP3i"#|N~F#u|SPEZ JC6JB@'@FpA&g'уd߾LD17Eɿ|`7>Q>v8% i((hQ>&g'юrFS2..s6?h[ODlɟ(F ~3BYPCKQIʫ< AY{]*=].ɿ|`7>Q>ugw|b ԜR:ڕ30Jw?=/߂)~3o&|}7Du Y *{ǢE˲o&|}6MϔOY{]*=;?Id=:6U-锡$\]&g'уd߾LD1"|c.d߾LD0lɟ(F:6[My.^6gw|at\&g'уd߾LD1H)hd!yF^*Z]4PEɿ|`7>Q>tJ!=g)R$HmL-Jd4Z76潹jMT&r,N] օ+l.byam:@Wݏ~o6{HE&Ea>mI2V!;GOGruc.Bnǿ7v=#J%V/ѡ3lrP hpC0$aNu_Snǿ7|+$K˰]pJrIja YJӔcތ/_{vR1(mWv= ۱!-JR&&0J i*p'2 ΧQZvd MѮ3D߲"$_Vmnǿ7|̋ EQ&:ܣK&eR  7čRHʳ8@:]})cߛB zam NQ6YT-̀ElWeo!8UÕ/v{HAcߛB>_s2T&)$J %W`o1a'["˛nǿ7v=#e}rL :e6xc4PܛKn˪];e2rYK:Qy-};;ݏ~o6{HGƙ0%t6mbRVt#BJ-3 Q26@18ݰ_Xmnǿ7|-i3)-(Ue }4)Ѕ6{EB+7AkzOU_a]>k}mCKᤰ\I VR2q%VR:1X'(?b}acߛB:iδ8e)Jvo;-JAQ!Ӏ%ѿD {VG'?`\gݚ7v;1=0\uŸ$R[5AoOʍXC4a3b]NyEn!PD̲-,Rl qvh:f݉EPk4Qee,o1J|ł9#pkM8f [e8.RHٝX\gݚ7v}٣/_`IW.jOSqڀRϘ KF^Ըϻ4o{!BoC @i5IjV?+2 2˩su*D -?W9#\ʦ,P8s*B&Đ'Byqvh؄LQ_םe5Ĺ5I:% `F`\gݚ7v}٣/_bQ)եl78ۥ(ZB aIq ٜ9{ l>mѿu.3zLP)A.ܨ:fݍ/QUjjؔDFdօ(.\6MAB" /*u$I,Pҩ j+;ĎB4&%-|V@m:uN}tWN^1qs&\yR%dWpnE9Kդח5$/ܰkX_uͷK#ߺUbeQƌ؜G铂:Wr◣7Օ?Kw>clr \'V: [jN*蔜U5>()*H pFENRU$m5ޤuF##kl5,5 s! \$Ftj-2bJaW0 jg0N"wrԖdHӖOaaXs\)e}|2mY@I PQV%;LVQJbx#ϙAFUiz3u~4dF9  k` ZNC%괦"F/2-4TR$Z9JݚVTZ=Ťx'$^kF2`nvW8kZˆOn8Qm*81Vfvmmmp,>ذ}GWEx|#7=֋$F[~aF'gk5WKbQ9verr:nPU?Ԅ$*~ذ=G6Enz1zc$o⃀ %fay#yz}I5,d-76BS`9]B:VUL- m7}i#TAaoQڗ:/sя}G_IF0 mc*  >5 fTKmeS)QNXK<߭4VM}Gj<؎cQڗ:/sьj I~9 S?u/=WpwT=GjGԔ_G/(9K.&U/}Wpw}E4+zT9Ǿ-?`)(?Qƨ w{\A껃K.ycv`#7=> ƨ s\A깃K.yczlt_JMF'T}깃K.y]<б=R:/sя=Gj_IF ܥ|QGu/w\Bz`Zc}'=cÿ|Q?u/w\BǨK9Ǟ/tOxςq>h\ ƨ w\@8\rQs !:'sь I N#~ӞYxqo8a20xԵ4?ԾO"o:/sьO+b:/sш4xp?|QGu/s\BvψMF=<T>G/j <T hkʩ hcY?lo̿F5=4`/1>LJQu/SUm hZn1cdэi~Ga> Ũ I<܁KkSbPݨ61LE4z<.ۨp#̠'B@lct[ww+w&"V%61LE4lc[hb@˳L`Qn![^Rd]'Q3כ+uI-M]8@ghPJκQo(slUNI*XKd/:qM)O-2u\|BQo_MS+,'y&z% O&ۍ-&*ĪN"UM e#*-ܬxXo2 ѐѲV6渎)70fj&ʣHonm tnt+셧#af&.9yP%I ]0JGW0JGW2vEZCbSL[{2Xp 6$ ^D⛙rMRĻsQiH+@ZG+)7 52Sy%zQR`*s̳7Iq6ʸ$dG?\LCM-9<ق% n&:n2N6 Hɺۻ' R I^"BGPRåJV%7 L#RFTg)76(akߺEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDEL#RAL#RDD)DeAʐT!BtGG(_#jZ:ߓʖ[D-h!bYhA6wE_ PdfDحˋ )% S 7|I(x@Ѫr%umN8,\ǠB? JV5jdf`+dm=ufK'}=ROvEy_S*hVANa>%T1Z6ʐ<}57@jtu+ TvE;fB&ĭUn++LKpn=p٣ԉw%zs(g,,`.h]>fm*VTغtʦ08.-alJTꂮ@䐛(܁d܁()[NNNwlVRnQHɘMʗV+IlMm atLK:KJcB9%)/R./2R:a))EͺJQh׹͔x5IE%1JL)L V{ XmeD! VT驺S~$_øm;i*ZH#¸mkD%w#)Y}6Ufq4:k;$%mBsX^к%$1ZHp)e ;PRoa/qlֽ6bY-0.⊜:K0y\yTU-NͺDn,#\C;J"~SZy7)@E.sܓ貢~KP\u2;Rl xfrbXMX_.ll/s. ^Re=rˊJBH\7#Cqa Mʔ,$X]eB:1{t,5S004ZHq -uq n9*p'pHT%ܙꗙDBœP9 JRl 0n&*Xen[*)LQ1*syShR[JI ܵt$ŸZ@B)P l<)<ݒ(kNSZIj5cZe`]+R?b[` A ZxB% zoяO8oтƄj@sȷHzۛF"tɼ{k-1af-0Ap ꁌ;oуwm"ߣMꁌ;oя[J~D%^[cT aݷ<~Dj/x-~[c?[`*U Ï׷<~ogՄ\{POZ`24R^Vץꁌ;oтP6G0۞EFT aݧ<~EUT aݧ<~x1"ߣC-}w2ף=P1v-0Ap(Tzc9[cpGoт=PqvoȷLJb?[`$%gb崅۷V2ףjק,Hoт@@ n~`8EZ`*BTm|~tKpp%U瀵iF en-7ꍍm~S~D p@|~xxIw7pH_]O`k|jk .qM&:oiF4765RA5w?$ h{:oу/u$ߣS`>5Yiݍ5[Abyoя#jޛ`"^qw7Ǿۻ& ]lgbR\tF5'U==ey3C#y8E.rq#+ obH#_//tss~omw"RG_W?_ssK㣫/_|1`:  Lb=qG%B`b| -L'&SсLd  LK&3x.0BׁkΤE`ƿ(0*0U`yb60Eu?Lw0|\2C`bƑA`>S*~9C_樤* 0i TR]Xau qׅY(#`"? Ѣ3m ^#!)BgOLA^xPszyڵHЎ%ջl/E ~ES !0ϋӥ=KnFFxr׀M_sQGdx:f // ,@>q ٢Z`ZS+ CI|Eh_Ʒk?]yy_b!)R,0,j&|vݮHhفi .sm+GVߍB. Pۀ+UF>7W\]T_2 EGԞwB/2 ѵVwҲ{rJrdyY UxMdH:tJ ."dC/̈́w؈66DV9*m{ ̭[;;V?xm̀ PR` I9|h )eOZG͟~'#o[}۷ 헑Ș9FXn0|gW^~/`PY PB`vAo%U^P F[~Vq·/^m6Z3n'&B$,0_6(~t-:R3Z;OGi>syMDB4plqnJ).&f9.x[qR5@nmr{w`dټ6rsgg&򲻷62 "H)顽R*/) UUjjVBK}^ ̖7| fXmUAb},WE9E/\(ʟ#0] irJ[HH"aĩԡqk잊QH4ed_yb 2f`~ݽZkM8^OKY~a`jp#&L,>\l_T +bY\u`j30 Pۭ'WwOF'N4[h<^P޸i%5S0F6#iβEI/d60z2.*z2 s > w_ܳ?~x׋g~2w;w1f`mգG` ,yὴQ}2 -ZLxV퐿M?މ}g|bc./>㝤? aD%uݠ# -"k4$X)FW]pUlVHR l`n2&Aٛw_n}moMDegcL}=2` yK cX|FrU`›mc?ZdX|{}ɺТ??POO3=g{Q95!ʈ9(_BW҃htR&2Ї u#66RL0+s1qECV^3k/6'w^LTf>]":m+C,hչbNf#CJ+|"oCV5^RDW7eLd9h|HBH;PBH-T@8n#{mC$mqd8m~^%-p#j4j8$W)ޝ9Ǩx1;MIz괔rz Je ;5DK4Y[.U"L`zrA @п>.B=zTu6^7S(+x,H3( /rJr %;6,X-*Zj(̠a-1QH{(٠ч.IO$ 5Q@WJD@2k!>yI-I7ҀNVwJ=XM`q80ޛA0޿)^@rgH=|-Q?zH ?&+U5X}!*'fÀ$泏y=#u 'q9#\<_WM72JÿZ^ ȫ,$YB.'>jHV6+n_߹s@yb>/p0xx8yҠ?x-D[ܫE1f?jDq@u5HVJS+MfI>$I'շԭq 賚Ab-8\ [.w֢%}#^!N-Cġ_ \~ʀph0Ko(1 w3/ >l`|d̀CDRz UÞZn4>,aj6j jdP}/0Q7fѲ&ZkHj1B_:58MG$($(AAE|q^ʘo3f1>x;co20w`?WZ^REPu2tY܌\8Q4S+{volksŞbβ*Lٌ;z7&c`49w0t)"표+=́D\jd:_UbĆ^ z L^!']0kjC=lq(X,aBU x~=Rkiu:d<~!i]n%'g#Y"1l { k2{qU7Whx4brKO>J_$mN %1`>w=.eS[ 7ՈFBU`kUN1!'\Ci_3 2 wuMXk)vq_D F.h=8FJSe~Wq`>o g13k/ ۓkdDؗlfj`"7yJRcvu"L%ki 5ar]yg=#dm{"a)4LCni7 D\"1[?d1迆`v>г3/{{[W{6l݁:I!qfq[CU3xh+7M 0Etg3t@.](EUv%0"b5N 09W 2֊}8 dߌjwwR%r^N0/ގOy$0z{w٠sd Ry?T@yD̮wW@B~T֡|=A7T„%Ђw<|||aQ&O,9t0A>8SƂ\$HWv)tsCB %{^2^'~҂jvɭ~]Q,a(/q}:Œ\03JiiplOgM=lEzt򒰜ٖљt Tms7*`HheQ}Pb՘"J-GPdl2s$>U``Uay^4.5N&[/^OS ά^ժ gJy6@27 _aڍTΤp|ј `hmsLVI~5WE\ M.֪8'aU19:bG H(k Le|J{qy8pf41ҡOR[Y ֬~+ط4w)0 2O ?0gH(aXJg e:naONApe'6@D 7YGTewFn f+/?B>S33eV+bIi8(P26! Z9YGy1 `Pk׉ؼgR"0,Sz|#fo03 Ԧ80-=9œG`ruӖ鉶(A›"K0{r=x ;A)taB#I! tD(/fV^XкhZP6UXRejM/V45hH/wPӂkPxd? 3B` 0YP8402f_~;4Fb0UMēg?XUDфL8=WAo]% M)$,۩e"Y `Y!H0!6wD2!N $:UjdB `d2/aw{4$A 0Sv=7vo(S{ ɜgpQR32`*`/Weڅw1+, b=>5̊vB`xݫ{< SюՖ4\i<*#c4*Z&t  BKf8++# &#Ф=_xLQmi>'DZ_i$$i8/AH(se3"cEzS@14EߴB}=E_ hmB6UTI B*Q:9EMj&U Wҋd8 ʸdxXta\?-0{ 0+ؕ/$ 7ԴC@f(/oBlnE/ K홓Jǫ ǵ\phCC:׳*ia Fa^>f\O($li$i+5@7j"v2 \m fl8$`vȂ!D ̸ Z/{3ƀ];L^mS  _rj@nh~]\OnƸӎ0mFwB@'$ 옏Y00?2 G!(8s%Yb<[m[2Q %=* N$") J|1P 2;f`_^L3g7@4 ]r*\C,Ru %LCvH K !1&53z`WnQ ~PIMYJKٻyk#e d-0;̽?@U(0$d = 0*L3)ZGJ>go&jV c74]} MV;xcHCX3U--#zAC ZLS,i[WIyhy7<' 7969R榁D݄8&Vh|1#A+`hWQ/+N=<4E;z9'j)֮ܝ tFH0E(&FUJ<`Z[j,,`fg͂0Yi6 {߽+m+ JJ1*x1Ku` +015V'V8Hq0}R|!tR;/_Lۆ'e.o<`|ti C l] k`x`L1.C&(nzV9IDX+u1h,  w5(ԇ`FCipXf[%?$  &C:η|]B<ڕ0am.4㛜t% n;lK4Qڇՠ|)͉` |9EW[tLUXi/Ȩ8 bz `<fY [AX^>E4f7>)k [n,Φ=(_2xKZllPJGWsN-3;+)44Ex`r(ۣQ]nr)]wKi$"(c d vEn7Fǃ+1X(ݚ^h/&( ,0,;0"tٚڪMV[ZV=mt@b̌ր+vUJMU51fSQ`l^$82Mw #(2UVucKhNnR@54BFln1$ȗ*/ LY;F`Rh4C1ShԼ\C42dL1B0IfyD C*<{WNcs2q kLEЀJ1ϮZP)Bne@;9T? *X)b= S]c%Fyٝ00ZMP]{wqA7isy&0:0>R܈ڈ}3ʗig[__Y^_l:9J,IwfoG'5Ϧ';`*xvvFt-^!$rdCE{{fcטV.|qC7ɊE% vu< iF0{К[ r/Qpl5CX٬C[eͲ8vUb`Ą!U{z`JIWH5E0\\fKg;Q5`_Z-"h\$3K*bFĠxٖ_ 0qؓՀpt+&Z  ,z ~rWx`%+7WYƉD099H480DSTIʚ*KcHi-܍N6ݑ D4?|  pV|v^[t(zErE2[F&dՕV.{`6W^HK_>q̿ J 7 qU, .@Nu5p 0m*ߑB_,(.lo;3 32pUFV}I`*HRbJ g,`ͼ_?뿜pfz|<JO`À8Oijv-;KVqys[p /nnAD? /^Qm4!3dl&͡EnB&sfiju L/N Uu^2j6On׽m_/aHCn_isvd3zIO2n$`}>4C/-t[Jf/[Q!N®. R8xi$Ə&qe_02jns@,ƔAEޅgV#M:QqU3=_ btT´S'Jm$%{Ǘy5$ z Y:2c`ȟĠF8IReM GbuH/J <cr,dg1m&+2!_>f5n-sd`h/ɗ}h.c$s%_WfXpmʥ_YmxO& 0]#fѲr;yL; V Q_ JɿO?{F&zòtce3~'m](ZVؒTQs?䂾i#XZKڟ&^,#xIсAZ&@HíHƒHxKOe@'C/[#@O1" yR}3(vd0vqo 'JZ,"JXHm `xLi;:Z&|6<=b.S {D`%$ $D%\i_id. NN\HD¿ v RH*h .*aï-s k(hmm2%^\76ZA/r>4v_u`rtBLݯGxɅ8C8I\6 =0!>y!fb!9~1sa-)}. S Z[ˍ$gJ:$JZmq}cN4 C>Q!~% 2lq E>a!0]F-ZI7dʞ`_f]fH50v@-ˢŦ4ⵑ{_+' \SəR|슍dFaB׋X"TS/Eh$B ?@Gp{A onCCc_ƺ0IՇ[a ֍dC`D^0aڔMccAţEZE_H%L`pվ<$  nď2Pa2|j4u yZ'4;N2N.⁒gR)a$ $E63K42#ʼ 'm!0pѪI-!6 m }XCWVɒDZRP7e!`뛹a򼩘"l{HcLig(\؝K2c*}RǨ2a25ZP`<[ݢhp} ^v/ |=m 6{㔥K^xG`JٕBE t?VFB8_H%X,4Ѱ*Q/D3'D )Òe,wPUO2/붪.ۦhL5uM ݱSKW4tDl@W8@F7C:&9 0#H 2E2R$\ta =&F1$&pH)W%hޣQG1 6eijxƖÀoߦ ('cEFM; , XDR ?I+jŵzgVb Ԥ@}Kv3+"i9D”XVqۂХN 7c)`B[TyڨwfOPJn@`pŢ1Pb̀ s~f L)"a32ե\[ʈO3gdҕս2 UOK1y#dw 86 % ɣ.ע003Q.8*!/}B6(O\#=6bېؘ,1D'(a S  >Wu*1oϷi;6p9e6~Vt6xCYTl`ZsPvll\QVĘ'weVT3; h໸*a`NlHcVACqaW'$a2P"d?r 60ұ4&ybggmh+]a,0yr0DA׷ L\ffuU|H| 7ѴvPQP; a `f/ L_YY)e 3F` /Bh711ae =N KlKa `8qxdWъ)uwL[8\Ȕ3+@8`jWZiH3-I+ksc``f,F'Cq@Mmis~F o~HhUS; z=.:Dg1`a! tJIF,1=N_WOQOzW6vh xܸ"aBxv6A1lP?i'!TlסqTRh͋7"fzn2iH ?b)1xnJv!|oP֢A?R*I :b`NT[GV~k"0j~S1D*^(vϏ,-ղyZdQ]jjy Yn~'WlfKǛߡ߶&֊0}Oެ4n{ F`pַxX*M052)|(KHxNJEb;G "0}Ҫ. lOSa=06^ne+[IJqMg$3ViGHYJk@L$]mU2m0}̖8N36u wv+O>q'wV8OoKǿ5:o"`,$CqxN\V!g`2vKIN* QB0|7べC8f}$ $etRFe,kBEȖVZai6~q,* -b2'Ll 02kdzBnUus-T9GN<ՓMǟ8y8'G dJ)ŕx+IAI1ʢY) VSUX!Oߕ&Oayu=`g 0\aa!RUdq^M9 Z ^}m &,{Ü} e^UD9ȴv1Knꬖf "L50'$CqX9|dRRi!ĺa7? 0,*DI'`F Eo% ݟ`z? J=F,J(G*IJ@np2t"!d< p M)sti)+5PDX'2WTNijI8h0DhUU# Fo6j;:7?~]i<0L\ B󑀁O8Rð`u蓹`Iqk7T,m&[ HxՊZVGI.v"mRQjB&@*bv>chM602693:&FxSr9M&gs[oV o0_]fwݷ8bHhl10EAV`#&I>TF=0>:@`vB ;f YG!MKAf8ՖAa]uLJ^O(W`$ؓ1KeT91o2BGF=sxtPK1Jw/a- @19<Ȳ;ze ԰ތs)^O0*h0S GA ,bW=Mݏ`O ǷV* 45305pș9щ!_ +O*#`5N)$`z n}$ (~!`u|b{t[V䋪J 5XPAb濷onK|Puf&F1`pkQAIY24,]eK@,b"'@ ׎>O} $X5f$.x6&f>$ty(ZmpEfɤ3/ډfocNlеc^MCQvk[8񊦁5nuPEy1؈pk! u] 0ֳ:F)2ާ[C8nx[TEJd˹H=a;1jGDvYc# %+3b8Ӊ'.a`eJ(ad I0bJM6K*q5%^v,KVs?Ӎ0s.;GAqˆ2"ku$```v S=?bwRpPvӋ yyɄMqL`Phi^20Jjr뙔todm 'ZPĻF_# vs~ұiD 2=-S00Z#YfOJrW`* ]O g#c7E-kSa:F8 &p@pv<7&XfNyGTӛ\l0\1X-t/Т/L$Ubb%WWx; Ei^b)PnJJ$* -%`H䍅ԍX zn!`@1ۧF:S:B_,܁ {8+$`D~mħ%Io 0g\JR\\^Q50X6`=2ܪW%c6d,UN!x|< Ai a]%c m2nj-{,U2>rKlqI`z@P?9l|:\0xQigY7uWct3/$i,8>ejEo._`N5s=0=dP.i10䇧1gXi)Je͆}kow& u*!i$05ㅬj3$W{QgFy Fu"z 0I(%u.C{skV_I))0jSQUd'+R3rQhn0Wܥs+ݵH[_A])8x򦁘-:C8e۝F H_ȵ8&s]WS`a`3^$,Iځ M͠$ T"&#`ݞi!a;Kx-{uH!T$ I@hMHNv  `R/₧ʕ ̥&0Os929 k 09smU `1zfJNޖf6!f!d\1l*rBf(Zj ڥo1sV4&&S5l(!@kH"Aƞ 4ŕ|/qJ)+n~G6`$8R& f;53f<~m6eoeBƀgIVxNö=/բuc'hcC\qVlllTg[XOSבT.m=K0T'<,aR~,c ZbmFj]Ұԡ9+rs6W 0v t" JQɳ ~lq 6 _5F6̼mކR}#`RWW qZ4DeG*E`j7e#ͥNJ)6 !`-swuXD:0SEwҽ?n66`p/=P|D;q3j9)h> |+i.vuTa%?2(- y_ tKʹ_>cFFRA/Ml 5dtq^4ei(P!HU3e"]Ӕ(\)($]Y+j!݇UR5~;i oPBrCNxgEa%)0h Bno!`@V!FG 3Jwm&  ce B`sl.xƋή>\^Snw.[$kk|6YxD,1*s⺤0I.Xh(0i nt3Tp6kTEpi2`Z1ԡߔ^8} m>3;eq)&)=^J0?B:$2<J*C> &!:`e7`DlՀؽY}D"꥟M 9"0WI'ܥeGW^AT)(T ZF'jg0F3Wc9nT&Tw>{H:3,ccJrmY.DHQ0/~*jUQ`@$9* 1 u i\$ys;KS y2Ќtit({ i]!`x3]FB(*բxwΞ{1K;3^k|Gǎ%ϝHYFo[4B=;&Oxh\\ZOa, *<⮋XSgf #|^>ϜyR|ⵥף_;dcgy&uq̅cq[>eik'/{~qD"䱯_xj)//\~_͟< <} 6ǁ4E@h,jS-Omt(!`EƁ=n!{<б*a)Kp&9kOhH p?Ҥ~cYg?CsORFt|by?Jq+[d.؟SƮOFmM /SD^Nxgq͝Z>qJxuEڭG6gW:)bY(^ ' U>;@70X`)̢>2~FB{6YaWitC#a 0<&׫a -mҶt=|uin&O7{+go20j`m ]ܥ3ɛYv欤Hglxj—',:*0wV.i+8?L3p2~;~+j?Hյvzg~xs8l/?oH%a@1Hß)3xIdYT&K4_:9 b#]36)z'#fhņqo M7q쀼 ~ɑb30)J xQeޙCtiiٳeoϯYQxSN><^J /7"wMoweڙD>wy4GxslLNpVoEe#|tߎ'>u%LG^Ĭc`ڳFg>7ίܐ=n)?pL3vNėNʥ $5o}m(:q極ǺG(0N~K`AG[cʫ7G9g~>qxf0SIOu5P#`ι4D/2,B(к[̐(0o+1faN /.뇄5"us;Ο\]]:Jb,a"׌Ț%Uq ztڅG/\X:woFkǎ={9v, r{+K[y҅KK_;v̝^z≥701k+_[:K7{/:J ݠ4&ۡhW0 zU`@T9RyDB3_JdC9M.# n3ynlf/306& "WG8SN=0y ,}w??wGt#i->5m;CSh%VlŇ6+b*v*RI$v-1h)fH4p@Gܴ')BVJI`rJ)^),G%fT%si "`U!O)M44Vɞs@XFg{V/T}VSR- !TaD:hC+mg!TԀ V X*}^'p g/"eҐ۲FþΠNiG?V.mV @p|3"(8YU[ޱ1%ۋ[T$;R٠n"AîGS'H„Z'ޙ*c *G}[^t[xa!ULB+T@0RWx0Pφu+%SN!g PyvthK)B]i& M/N{C!Iܲ..y >#+ 4$|SѰO ݽCg;kCV^F{z%Ebk,l꪿'Uޡu }TR'O$` X;ir NR }}zŋt˽Q0` cxn|SbDf&ae/Kx,{Y ;)? S\!Ɗ$n֒?+ i^=2bN}4hnʸOf)6I1]'j+[DM lSK``,jz4r#pUJ Lj]B򣥹XCVh.G2o` ⌼k" 10/g:o$a*Vf]i9clPE^tMգ5`$僴XB!fairum$[v hWVfTxFPH48i5@uK&n*l:zJ:19~,N/Y(LēMjQ@EW%v$J֖$%%jvb'4Sɰh>pۢ{6sn0$q3 _``݁ sI(\z( }vt{ a}M6 c \wHx^Нv|ƞ6*y!̡`:e9M|TLbjY0 #oz=BC+a$bB0 Q馀AلFEM*)p1k {GY4]W3>ng=T{)z"kд"P!&D}  G|'Gzi'9]gVzᓈLei']|kE;> 94NFl2 })fR&GHD Py`[sθ ()sY0.o)lQL8c(R\ I?r02j 4iRFF^<=^LLE;"0:[mؖr`b? $8PdF8wmZ]uB #ǔ ر 0%Ab3DfSJS`3֒EO"5Xt|O ]s^b|7*0s]U?mhux CxBA+s`AFEKL\$PCM7x.)"DgMi5^uIߨ\s UMɠ X$Vo=p^2h0ލЅWm 0zmj4/ wfdT a5ɖ#9S$bq,T|Ujkn.0ٲGN)fs030< Ο+0s>.LfZAIrocFq mfip?%)%[;TVrx`8Y18N=j튈u WC}O})i]hޠiV2c5vYB3.e'QE&n 3>a2C|l$ TI8H 8s3V;c"^q:\=%Q"p\ 0ta: %iضϫf#T{`P`8Jy*ZAՀ(f 0{ cjEOȰ 9I{@D݂jRI4;hdC;T˳l|c|xwKK٧Cˡh`J2`9& ,/ 1Cz㐛I6&r7Ө8$pǑ!1HJ݃u|sE}H4FpmN*tD 04³bC^kP(tˬLafKf ,iJTI%c(o} W z> k`!ʨEO^gJpW ^H1`0ׁ!b0ދf/C"ymR=7`64,\55~k?p??vlY:bH7pظC, &: ctL]%U>B@CZzc{| 4F~Q@F`,{=3ar*Йa= fA OOs#sqʴ4ǜH`@0 {ߞL^{ɤ 3ɭgə Me8=\(&z5ILcz{q5&ԀS/Yx`$ټ$߽ӱb ix$UM3IIad,TGfhxL{IuDs btK#zj`L՛O<07VO 7kRW &7ˮGEYQlݔ&V(/%AYrpJi5 ߧl{0[[eFq&|k+񅧒k\o&`:,a3xX$cbg%h TB1IdFkk%}{oM4-g=0pR@gjp2lA6-i4VPh#Hj.δJ2xIn~pW+1T>:8\dϙ2I1ǭ '.݃+R/K"`8 π*I]jM~Y!C0e4[w9yxwڭww8)zM(.ߧ,B,3ER5 ̿\`}9a #F^)_"0ԵD#$e q:$}õ%" RKi Å 53k``JS9*ō TաXBVa ؊'ahEP 3I(?Ao/J3qukdЊ]2SaJz;Q sA&Ӻ\%K'VFb&]ŭS̿>\V>JPdzG'Id*]xi( k$/ YM;#BqhPh(6#`VڒJ?=idDQ&!t*`Rb1 HyAsA<4X/-f T9 33!oe7N`p5 /HWH30[L2a<^dom$ʑKoy:ZN3([l4BaK8+4F]#aIK'.8JpML]4I>"Fk'gGG 蕁{5X:ï4a{bT*y4gY 7gwdoLe .%. *idb#Y `2oXJ2QbIuAdXUvjv 0\ 96z0,)i<צּK8 ;kSKـ`ps`KrJBQzovn7f10eb΋4q?avj.,2RSI6(ߥ-J$.u1m`}[fZ-"P:JX (`LY.Rh' {r f3[F0iУD0ttd"T BOk0Ki8m,`Is(0NT捼b$Q!xN^*0K0{aq7պQGp JTIr[Kd\XE:}399ܣNz4cEʡ#ќm4O>ꆆf]tRER6tAC2Ӵ.3X=aZ+h0.i~iNO0ӑ 4lސ0|aJ)=0}4UkLƮF5L뙏Azp?._wu2{AK ˙Ʀzꗲ'2 j<\-WɗTČ(8)\h;BAo~ZMfxۻqЂ٬B_0hZhU*XͰqVդ"%ydDrHpEYc_+gM^{aҀ` s}!{߶h/^_=w""+SV*|&&!"ƠhKRg0ya IK,[;&aF62&bq:M0()ToEۯ,)9d`aAhɢKH9P㦔#YbߪGe.­ ?9Ł?* m^&ַ+Dݓӛv  Fl遙c0NѠּ7i @` o( YΟH v&tZ^vof-+X(0/5SC?Ō0%IpHwY 6yđxRh>☳$| Ii`rYN}|r1r4S`(S֢OY˴a>󈁁JhlA.˵2bBSZ 4t(1À0YEVnUǐ#AqrN<-HĚX"1o^/Va}8x)țnY.ǾJc/F?0 aE;Ѵ*ez^xP7mTB[RKaC|LJU)-f-/؆\<aTK=ɸ%P%7^|5; âCf/;q"j_{Zh,0SL m&bSDƻ^R!`ԓ;Hyvnxf_TČHk-@!4U“QVzۑc/vTvzBHL2t$R6~^ H`H|D9 q-쭁naf%!$e2` )!0x20q0<0SK(\z\_/_/wʕayf{8}٫g^tJLY- I;Dys9ieADo?XL !0-m f")" 3Hop{ge5\^/OʍMgsK3WS6M$b&{йr8ߦ a!wT~`L{]6kr9fγA[jJ.ƔDψzd|nt>^ M7߹SwrK aWϔVw{6{h<^$:u!pjƅS W"ȗuw0 ʄ!4KV0ĥ 41U"`R F=_-z{_)ze1sҷ>$ةZ$AGzxLdCnзE=9S]-Z;jSWVDs(ZB`((54u.i "zC9\ gLj #;߿~N8sKeP;|k>m,lĚ /M`JvlP/^HP´|N@oSPA{N;e^lNfdgKը"-.t~R:$+sD Z`N|C L$٤ШӰ= tE.nu^qiŽw LεX/0EB.aJ\||ѷ5`; }@< r2"?(Iv'zp=X`Hw 4*ٖd ]6 ~+!imL2JXXOoohs_^!n~3j(j.6J"A 4k#{aHg@7ܗ$П*L1.5u?fd/LCW",J5VD;w1K)lL]X<-w 'sr2TVٗ:_64HfJ AjjTG~*IXv %bN\(5fDr/".=ƂxG!6OBGv|Z)䜧[ws0gB^Ɍ^rMahQrȋS腄}it $\KxZR?;׍!b"^9=Tҗ>9 A:%;u$RhtSAL)k C9cL._e9)\~+Hy}Zo(.9{J='{{׵&1iQkTR,ّĻڲ N^d \GQmR % ή293 kwaÜLnN!x#a>]cקQL)VNsNsaH5'pbqN_+E|TS[8-b%[ƒ~d8s`+BhW!%i?.R/44]!w0){LVUX_b*X3w `6X.SLwì %v8l L${˥v-omxgA'4lEm_!!`ҀTpOnȝj)؍WV9Hd)Q@h.3Ndy/Voq+ %!vG3X&܂вG,\O! dg`xئ⥜)K֟_i'5 Kt&`T /E[Qr_/%aЭnRm[<`c `N{}{껗ni,_^{ny8_mmnK]WۑfUHs%>"!uS :$ )I&բHE_[Db gg`7- DZ[Яh{3r.:qݔKl K}$v/yB;O';饷/L_Mw>|oÇ[u<S AUׯ,CdE()(hS,̗pϰdu ~"D`4"J~IhDΕjGĖ /B$p4B#0/l^7y˚w__nsiƝہtv{[R cHvI]V/ծVPPͥ0F&b u+gԉL*Y7v&=YQ6h?CG^1]oŢ/ݿ)W`>N=yξH[834[Iߩ:jE%$BL[b~JY:w{sRdgM"`YRD!kY=IqR fwW-s+͡GtTK?|}~8{qa;g--=0S{ߜ>uw4AޢH9l-N$F$Lu`Qhٜ1 es\vK^Y*ۍ.3 0.I'P;ݢeHIK%Is.6ػu_MB"t⅕ onܬlom߼=,7v^ujT>zJһ~/yfym{:lN]vjzΥKm \RZ}(0'rUQC/n,sF6Yx2ސR4Rr;LmCSWlI &|c ZyPWj/s[7K;R[/MN"49]Xd-6)ygQ6MHhl.)ugU2`dZ 9)9}z[ pwCꛀ?J30*0& 2 H5[2١ 9uKͽ:$`WЩA#P5zP@B`TfsQ"hK>{pk5\ fiC45B84LM`ZIte#,dgӑ0CŃ_r|lbw.Pty7ͽcW+$`E 0_Nm"<ׁrR%L<(-0‰3K}И[}1`X,&Mm"<"^yҔ1I>h'%IrWi#}̹7/[ޫ -0=~$ЀcPIح5ČD%2")46b%Gi(àKɏ= ̉AK+EO|!׆QV abzlҞӾ2s%㸫mLǕ$o4{˘!=LGBu`s!q |#aeʥ]xVLHA.`Ro&=r>M/\M$beFǮJ7]fsfdxehb=tLdP$BޭAǏ'V&+Y)ܘ `=CFݾYtݘH4GUM9Hƕ::ч~TN*0Mi0^?NC\ cFߟp 0U ŝ$40}D}2fR|j3FGGXVD;79$_GcgJ#Q)MC\퍠DA` Vhbv 7&Pj&qB&YyS_.<߻ !aWnUҒB`pDͲL&\J 4 +0 c0l &w۸5'et<+a(m 5a(4NB0omrJ%zcl a^ `.wJOb x_$a٢di ?Cq\#4-4aF:0`pK_PQ+MN!S]y6v>$&e|؃-YEj`KU4X1nT(=n)<]cѲ(%TuIC9O':f 3JA4dגz (\ iFpj /ZC),BjiV|~]OEѾLBȞSR#% 0ˢ ̼ŢycMX3b40$߱3,0x3-0F+9*LÞnm6.Z 7T%~ϭ͚0-".0M'-yC6D[^h>?U-wt'/` ÇvUY%W| QH̼MB%jI"yCԨ1mQ4)]U_>]IBLFҬPĆ}c-b:YƋ5BtE;I~}-mh5 q4V^LcگTVr+L&5cWW#`24N`jb`B @Q,1v3sJUg ]K&m/`koQ f'Y0<~lű IN39\IhEfr# 4x#>F +F Șhy@HJV0_h#Yi(wj,7ܬh*)ZK >얰hlraOksfc.@;`G`?wR%vstdpyk%F/KC!/`%g RaT`D,7󑟜DZ(xIVr0\Ot`涅;$p7WxF s88&zD#^ *](?xD[&0l0  gZ8[mGEEL0M)%zpMjய~ˆk{ѷ0<.Z9/")n nq YK&)ʗ~$ӪitSNs|`lQ~I|>yy̴)*Q0sVN0mBF+|"BS^IZ^Rsy|7qqnײí&#*i|QWtBO'm83;-KK68pT?}RyWR 8gY ĥbLzր1zX:K|LoeckJ XLd3s@t̉mV#傭候aJM`d Kt/*S'$Bۆ 0V4$?HN1{Q)r/;*4iWȊ69n>s=0y:eYfcKH,%5=0MҢN[- )0%k#@fB$qmE#qI"8oZ"r@u2 69p:I9бxc7/Zbj:<3~2Y-h W ĭGzY{#;3a/fXx }$B"evMudQ\Y @p ,q!iLӧ\aǸ`[Ag TYG# \ùhIkOT\#3گfjܢq&d@ 0 `9Z5\-r֭JLFrw'lȚYt0$GuK|lF) ⦨EG_ftv:0>D[scd, a@(0` i3 eys]+[;L JB疚ڙɇ99.т4$*u-~jb)Tğ}|pwHrI`R u)'c##_H:|z"nRvcnX I=hză[ k'k BH3Hdgϊ$ʅe&$bcc+e/i)Qd7TQ1!lۼT?zhXCɹrP&O]D&T0yz]ܬ>5y3G<kA4xIPK#RPl#x2DSvO4An`h0f2pՀ^Wx{ᄄJg 0@\,űz-;qN՛\2G\Mcb΄AZPf+YiI3f/DPWxNwnozw;WwdDCI4!1 =cJa&$Be^8$?I]rhO{1 [\"KIώ &!Ѕv )$tT KIH2N8 MF-x&֪hxyNh5GV^mH*L_4@ M`H%ya& &Xs&;hcW` \Sd^ `Igf$#!k_YrẪ9{7$..Z! +i%Qmr|\\}Cx TaNc :7 D$>8,`qR]ڗF{ 1icC.lxHNixA] \bNGU+#/"`QI5&K Yp`^?J-pR@∈h|~7NHI[PC4c wv#$*<~ge(T TҖ FÃ9ˮ|-Y50 Wzw)rT5A6D3vc-Vqщ ,=1ztv.ʧs&ʁ!kkFzYj&Tyv 0j06a ޿5~ c8SIg'j\“sω5Ӧsxɪ0 5X%S<~Hg1XиU$r3XB,&_ # ^ڷì}[+/ZNrOp_zN$aشm3agyٿ."MFu (_J*fdK/YUNRbA<*uUZƛB r 0}c&ZUlv^}nͽvZsN_>_oH[P 7x`Nm 77/rB^.`~*"0R_̻E <]s^ nҋW.5J>x:+7=?45AFa;=GC鱄O/QA: G/ lyԶBQWeo H ̗ (&5ۧWW^N/x4uxsx? =9})0ov <yڙW~k{ ͅjvܗm-.7)(h&hvzSA:\-qƲ:`c] [X!cF Nh*0  sGـՀ"D][|M ۴iygS;JS_{sso7Ν>+7yWwLQ 06dO:}}Q 1LX~#ɧ%UAlѨ葌EQ62Ei$\x˫̳Ym5v;֌Q[ Uecuϭq.Ëf94A֠Hx5Zd|!p襒OeSlIv@m "[/-tF SsXq\Qh I7qE J>v< qyw Ĩ LAǴ+&œF8G]<W05rN{7޵]HϿ0B7+Fv_.Vio^8 baonX뷯q2P u95/ w{y]%5QDQrU"o:3g k %LQսϭ\w6ܵS_^=5t;/m>/uƜDU;0oRs_MɈ.`x[._޵v롉ͭ-TFW2؇ CAe[/zMw''8+y<9]o\AX`65&0A3zbmt0ƕJq+vιp]][/fّDvp(8k"kltw=) LlZjGSjh9/bn&ra@p,bePˤe)3~Tx'yDӽk$BEf¥ M}io+>07@4X`sա07ׯCѭp*k.mz)|[x[ڑ sl7d(:Axarss %Rd<}B|4<{)Q9IF%w4IȖ\jѭ,0%-Pқ9>F3{i:\?}9}ޟ=ں#``WpQp.H؍96mD8L0Ħ"v"`#?FLy >8`*{ ,'dE_^BXSOx'$,ga 9:˾CC1Ea%\N=0.nv ƅ%LqpxB*n53-C3G.j#{?ho-Zi@msCE߶FdzψSHTrhxÐ l#PH^ˏ>A nRx;>aכN#4L?8͒p  ɦp\ꮟY{;gξ|jm뭾oz=\bl0$+-BYvmi6[M(#vV/=o+r$}W;&e)Zk`|o)c s z`Fqxg\M̱r&DtnW!.f!A]e mE 01/?Ab:f[QlL' ,LqTJ$"r[g!0YPBN"'+쵕ZVLҢĮuv?~-aC4˒c"LIt+8 Lk{`}XnRvJ*qd=K u3Sx!LK!M]B%vZ,T_kN7O]dLS"XD/&F@>{YzDõ-'j@@!Z׉K`~ )Oc?64L'q5kJ>*rѓV !1" m)2u[=/46JDYsR7`-uD"nu.4z;رފ7@܆j&RgLV7gJΖYin%LVyF5>Us eD!Ȝ1B ^D #!_{4~g/Y`nq7q=+Iye L' K>nPH2+kY0Û֓}gzviu7b?І /.QO5%|"0?>KŴz.3`:@2Sč#(8Ͷ,0Jh8 gk{^0vr=Iػr!=*ydoF߬ϜXyDi/?{'~z$%M!3eDJӖa&ӚZe PPZUFZ!kI5Ȳ^%eI00iQ5B1UɃjˈvc/d%A<}XJ) Xݽ{uL\RQ[8L,0ie+=lD ^ &T!~Tqi6 CED#`f Dw//axr4~TX}R؄WҤ 廒C31ܮ2Z^[Pî)ȃ`&f#S> Bl2V8b_e8c4rD1AmB}'14*W*P,Uޗ IQY̞pd=x@u2 WR/[r]M/G2֌mʆ9=H)"q ¶Pvɋ0%<`!1?NJӃQO)], > _4R(Б,| 3矗gpv~w[Q U[cdduBL ͺ  [&"7DK4{nT;WήnMG 0Pi8pH y$fBŋY/λY?q0TI8l\ oܫ*KL *$Puaq<:eȖ2/,_Ë0 "34X` !˗IO&zJPBv];j4/.?^o|K;mvw6H?:9 [ip=I-g<؀y#K]ߧ00c4mG$bRoN]&o Mp 2ů `2MĠ16r-1#I H(GtN1*Či5w3rFgE6m-l+(~lĹWt 0?-o&WNyfoekӳJ,a 'z{6^4,Koȋ }2G#w%)k1iT)j#l HQ O "L %tx} ƅ.Kta#qf[1_>?b #< b[)$G0_}ȻxK/(ӧ3gΞ l9rŠ꣍^ nSʋbyUys>^\߸u!dWL7 #bvCŋoA yd<5Sdb`xKy& +v{.1KH74+,rS4[[ɛRa0qgٹmyyuuYoyZV[O!"N_ 1tS٣H(.=x #W~~}^q[AoPMdbp2[D$3 w[0R~d y^z`ٳ=Ҟߖm*05mȃ^_9*v.TJmQ09c6>X8ӹx7GEs̥W=? cU%V0Q1a ccV,}.p֯ uݫ dQ$^ ,a M𫮱9R}>xA@=i'dZU+JN:s}♽􅵋{{= 0n.0 LԀIAO{wi&Z) `Vw ``b~Y VL0 y{3Z^Y;7]P\ z}}쑃05glpv@F4D K1}7ɋI6"w(⥃t_Δogބ9 9OgvsKN&n7#[kiѝVWWӬ4fs xIWln00ި贊K}IA {޽c2\/[[w˷n_[}PJ0 ф-7ft\HͶ \d^p&/#;-L&o@^X#`m9hԿٹK,`Z%]p`цe$C:i# ~=/IhD%6@6n?(]mK;7;*q徱I t{ATL%#^f*ПG`ȑRb g4߂/'IoWS܊Wo]_/*VK 65xA% ?t0$*b#܎I2ӺpX^˝{ Õܕ$o"M60^'Jơ {`r ݥp ʦLXs76kxvWҫ篮k&:7Í,NY"ɼѦT"\"DǗ ErWԏ %vBF C]%l&'3ݠx^f{AX]۠?"`2:1*|!ui3+wTQs/__m_zr h'q]8 2UIф#)TXL􉁉TR`j* e3[ v =#&0)7ZЕF5So#Qj6]&6 . d$&eыCbq9 1ivb9n5SD0360ǨQ"Wb^"_IiGԘ&9FhLk0]A4 (0&$4඀JAE5O(ߑ[*_{=26xtHg~،Y`҈I?Q\,c#4$Jq @p`]I- 9^a\u'xF}0yClRnހxM0$& yb 6$ "- (7]򷴉IG߅Ӵ}D1. c_^yG5) ;>csmH?TdOˣsL=~T:ˮ<0 7 FV2aLo vR!J\0)zZ`&m~MӘsW>)Ս)[0T~10OKW(LfNf\ac|O̘0Tln!0^7TI`D7URԚj0m;z0kHn&e_IΜ ^Ÿ`x>1fΙF7_z u)F1\$9Y$wC^s㕗ed<1Rz?wI0ߛ*nC. u& '${1‚4i;D:NSB*>Y2-lPGhV)R3͞MiB2q;#5{"Z֕J5Uⶻj"u)GT0h$3e{hm%݁V8E~+%KzM&drA!o"TʫP6d16l :2KAfPHB9F@D fj E}<#8|1؊w4 H>ۋm0}:-M-f0 FlGP^r'- hIH- à8CH,H7 m0Lj&=`,O+QcfK,3p@Ā> M<)3$x)h> VRs%Lj Ӄm#W TmY K-xXW0q^T0&|P.ݽ`H(\Say9k95JT 1(F gt 1Ǥm/T/5ϽsN60)_ xB^ɿp;esF<0`%$Q?#Q$9Ɔe5fpE.~TFAyMͥUKEQ΅%( %$FEn-Vbxa;*(\bNtɎ{qBJôunQd> @?jgW=d> 20{%>6v&< Ku0BDwK+Z`/`3<8bgkYdΉ+W;b,0+4{e_Є_޶ikZ_yb)hl10 UA45C@픊:I5н5zc!>1s|66×_CLfK%KvCs Ґ Ld4| `0F xEG-+F㖞vyW\iU`9̚LA=c=H Ћu 4- 8i!3IÀAwi;lX`ʈR_88Iu#D{'y3R-;ZXptHcdV-]{i+d.#(]1_{Q{"M3!L&x DT}&L J()D~~M:dz`̽('D+`K۞ZlБxʤRvL}?GC@ٹD?Bd?p'א9*iFZNfa#S[i@6s sIΦjlӶf`\Oc0wd/6R"F-dF⥑c\c]K$y_6d~v8[i$"ɛ94_M8!1"f n0xU%J9'1yFO=ʢX+ M[Jċw$~VG\RDUka l ,0x\c]+<./P DLەUP^Y8F5Xye0N5RY(cR&awb٦x?z/KȂNX@?F FO:T`"98 ÿn;MJ3np 6mh6jMAfV YdzgϾ*/k0v 2ٛpNvCE78R8k%P KC0$`R ٶvQ!J[K?=zst C!0T70זBA~A3Nm0Gb.f<AsAvGL 8{tYWP-N%t"5 *0.ƁW!]Uf¨pT/! Ja5k~%Q{BGSRZgz`Z* Le(, eeKz^jל0~J3q\j% bpVNh ^ l- L+d8&DFneYY2f@dJvהqCՔӋ*!!J$!xL;p"Ffi4DLR /"WpA-o 9I3U81]gl*6+o9mHwjȞ?IxXJ8п׮`DP\Q`'7A AAb::"%sx^-20%>5MtRFޟO(sβ')dal#e(uQ:kQPp&]B"bT4ǻq_ B\ 'LF1Ա˛vk/G b s a<OQY`H.IC L AbB`h/l'l&9QT @{e#%RU!3f˗H0j߅x`[bmVS6"SΕv+V)sGSjr+g8e=&z &C Ld{ %cR9R&g)Uխ N૔XSJ8nY}|М-r{mr]i[Yb DT|鋳Lz٬Bnd߫alusqM`#;cq% |^7N)2XY 񿕉Р txkh=ib~џ.IPpLwMat Re'Dy EWAqn(X wvȘMEtڣnِpT4MeA2ny0!Jp#7_unuw]J xLvpp㟄`?~}ž2FLF' IIr+0+jrj"3R]*ޅ(d0aAF,|;K#")Xzaˍ$30,a.ݴ4ntT1V/"a<  {۔@/~i0!/uB(RG ?3 y^iX+L0i= 2<&1&9>k NIH7&sWL,qҤ1@@dת .IG?10Xŋ D<`bDox=6dJ8?/͆5YP'Qx%5+ZԄm'F9S^N540R8S8 zmtk`P|GG,\>?s$̨A``Tִw_ K֝ror,+w %;Lۡi .`ưm`n0$T2lT8zsR(B%B-i33*+f RxسzU# 1n)q g a4BIRS +"cr2/҆Fx_&0bVA/1`Dl^L L̋՗YIlML4 t!_b @3)җ~&-{mTtt$;mZ#(BJ8Z2m#lQp;Þ&gȒdrƏm3L&q|ՔuRR `4B-f`j^>O~a~x`1 /ۺYnIN\WċQ3/&:^wGфt#_ukwLKؕ\تdACcC is&p5 [c!0u&YL ,c˘ALR` v)چ&3-8p-3(ѭk%&@j?#C`d Kpg?)BS=~bcIe!XUe@57)qCy`h20LѸ 6D5'<NG a s(g(+c*"EfqG%c?qCL:SPQNz 4?犂B7bc/c>"ouHo&d'?~/? z LehVg1t*_)MȮ$f< MC|t{v&hU8ԱJa`~Z0D*C-<(\p/ zkA'LWG5C{'g;rJҵCo6|J?/@?Z>`>`` Yf2G/ *v@1h @E ^KaXIQF;5SdӪҩlʸ_)m}p4!Cq`آ$ ~!q+Fz,QK?--n=͒e(C˫OSh_?0?4ۏ3e0pIIBiQN8~km#;0ʒ)H!elUNv7}E, Ԧ~H#LS 0O0/0xܲu#`ʺEeC8X<;>K0/ ^Qd ^|4 a ɶN9sCRWo֣Ƶvnah*❓qI\2Lx!#2#aJp~ HI ~>էT`!0:}52 %0!@1@(4?W vq|M?)kXV^x`̔;;^ WΞ]{ L{zgwvçh1=&#iÏ30Iogq O=}uć&0V}l`$PA"6J͕}fOGf{VyR1LLZh5pe`Tc#j`ͧJt1c`~/g^)ZЇ/oUVboZÞڻȇ1RZ_a[e2k%}PLt ^O6|mTȪsަX/o+dj<^ +{Y< rƊ5t,#Æ&$_+WH +O$Jiar2 }d<5UjGCId0*5)7<*' ez|=^\10ԼVM0 f3~6"L&HE퍕NZ;m/]6.7D`nQ7;9w%= Hvkzkk`yIœ.\Ob.jj :! <ƋiA7aht~{^z{z{'A6|)~H$9Ѹ/yxnmJʿ=NACΜFaV=@?,C#X|m_xV9MqISGD7w74 ɕ(|=dCTl_2礧;8yR490$3-`C/h[8 py/r t 0q紻@ |XzvxOv])iEHu Gـ=NxTfB>,>rp>OX-G<4] h\kTlˇ VtIqpme)Ȳ~KM :nVy:tt4Eh`1]LcC4a`ˣZFgOXPNw 㹥_0^@1 [BG"Kj~N/=_Ngr%'K /iOgɐ2-*NKIZGdu,<0xt6Xo=8g7daktI.ގ&^V0MK4,N0Le݋" K8LКm`hi7yL; qa;o40'%Q=Hb'i5CO?/0:oEPK',8u'5}t:`>?#rbS:''g:|6U$e~+02ŰhV/xA0haxA~>coⷛgŻV~HEM& 1_ƍ_ Ţ`4/*`PVGOf\=aZYKZl&Dêv13kIjF}˲ԁb.xu-ʑ Z8Hj)3xL7b%*ز*s9Ը2]VY2 pqKA$'!BhWxղ?_e`@pHxFK8+0 2^/ox`G4j!_g#A"r0lD/uw|f\>:)&; nr,<vB 2>`3e 'b#Q{\^\4˟irs]tdm3CCS/]D@%#yɀr[-we2P:e 0f!< c$#Jt}pM>Fٗ u9;⑼w[qؓ!(Z8^Q(pѫ7es/ww0vm _RAmL!MmEЙ-Q0`zM&zxg_W뢆:8"y# *YXg tͤA6Gz`Z=Nl8JIL~z(bҠarXB$6}'pgt'^!H2u% {c񓎠Gjɾ ߬]*nc[if~v:!l|&|u3 q\P'&A텳{"Ak]˧miv ubb3w NY#b0NB_mz0,lr0B>%pl T%#(\i SNx(ԊjVENt-o7$JcEċ;Ռ0-`n{x`}y4LR17(bJtsLj_I@J+BΏث,`ne?I{NUB{xqi5libĴM0E80q Cp'Jc//#>=.C}zgCdU=jy8_JM5;|8Qj䥳)7;{B,+0ej%(9UKȭ-?p (256 colors). =item * You must use B (not used anywhere else in the image) B and note its B (0

=head1 2- REDUCE THE NUMBER OF COLORS IN THE IMAGE The purpose is to get an image with 256 different colors available (8 bits) but less really used. I advise you to reduce to 256 colors, then to increase the number of colors to 16 Million and finally to reduce it again to 256. So, you will free many color cells in your 256 colors palette without degrading your image. =for html

=head1 3- EDIT THE PALETTE Add colors not used in your image in the free color cells. =for html

=head1 4- DRAW THE OBJECTS THAT WILL BE LINKED Use one color you've just added per object (link, submap...) and keep the corresponding palette index value (between 220 and 240 in the example) in mind. Then, you will associate these index values with the MRTG targets (and PicNet submaps) in your F : L. =head1 5- SAVE AS PNG FILE B Do not optimize the palette of the image ! Here is an example of reference image : F =for html

You can use your network image B (and other HTML pages). If you want to do it, you should note the X, Y values of the upper left and lower right corners for clickable squares or X, Y values of all the corners for clickable polygons. When you move the cursor on the image, the X,Y coordinates are displayed in the lower left corner of the PaintShop Pro window. Remember the coordinates of the points you choose. You will use them in the F : L. =head1 AUTHOR Laurent Derrien, Ederrien@canl.ncE 9.9.99 (last update 10.20.00) picnet-1.2/README0100644000000000000000000000065607201423065012223 0ustar rootrootWelcome to PICNET for MRTG ========================== All the documentation for PicNet is in the directory doc/ in the following formats : HTML, MAN, TXT and POD. Read the file doc/picnet.txt first (or .html...). Sources are available in the TGZ file. ZIP file contains a precompiled copy for Win32. Thanks to Tobi for hosting PicNet on the MRTG website. --------------------------------- Laurent Derrien