]> sourceware.org Git - systemtap.git/blob - session.cxx
PR12172: make implied --unprivileged --use-server emit messages only if verbose
[systemtap.git] / session.cxx
1 // session functions
2 // Copyright (C) 2010 Red Hat Inc.
3 //
4 // This file is part of systemtap, and is free software. You can
5 // redistribute it and/or modify it under the terms of the GNU General
6 // Public License (GPL); either version 2, or (at your option) any
7 // later version.
8
9 #include "config.h"
10 #include "session.h"
11 #include "cache.h"
12 #include "elaborate.h"
13 #include "translate.h"
14 #include "buildrun.h"
15 #include "coveragedb.h"
16 #include "hash.h"
17 #include "task_finder.h"
18 #include "csclient.h"
19 #include "rpm_finder.h"
20 #include "util.h"
21 #include "git_version.h"
22
23 #include <cerrno>
24 #include <cstdlib>
25
26 extern "C" {
27 #include <getopt.h>
28 #include <limits.h>
29 #include <grp.h>
30 #include <sys/stat.h>
31 #include <sys/utsname.h>
32 #include <elfutils/libdwfl.h>
33 }
34
35 #if HAVE_NSS
36 extern "C" {
37 #include <nspr.h>
38 }
39 #endif
40
41 #include <string>
42
43 using namespace std;
44
45 /* getopt variables */
46 extern int optind;
47
48 #define PATH_TBD string("__TBD__")
49
50 systemtap_session::systemtap_session ():
51 // NB: pointer members must be manually initialized!
52 base_hash(0),
53 pattern_root(new match_node),
54 user_file (0),
55 be_derived_probes(0),
56 dwarf_derived_probes(0),
57 kprobe_derived_probes(0),
58 hwbkpt_derived_probes(0),
59 perf_derived_probes(0),
60 uprobe_derived_probes(0),
61 utrace_derived_probes(0),
62 itrace_derived_probes(0),
63 task_finder_derived_probes(0),
64 timer_derived_probes(0),
65 profile_derived_probes(0),
66 mark_derived_probes(0),
67 tracepoint_derived_probes(0),
68 hrtimer_derived_probes(0),
69 procfs_derived_probes(0),
70 op (0), up (0),
71 sym_kprobes_text_start (0),
72 sym_kprobes_text_end (0),
73 sym_stext (0),
74 module_cache (0),
75 last_token (0)
76 {
77 struct utsname buf;
78 (void) uname (& buf);
79 kernel_release = string (buf.release);
80 release = kernel_release;
81 kernel_build_tree = "/lib/modules/" + kernel_release + "/build";
82
83 // PR4186: Copy logic from coreutils uname (uname -i) to squash
84 // i?86->i386. Actually, copy logic from linux top-level Makefile
85 // to squash uname -m -> $(SUBARCH).
86 //
87 // This logic needs to match the logic in the stap_get_arch shell
88 // function in stap-env.
89
90 machine = buf.machine;
91 if (machine == "i486") machine = "i386";
92 else if (machine == "i586") machine = "i386";
93 else if (machine == "i686") machine = "i386";
94 else if (machine == "sun4u") machine = "sparc64";
95 else if (machine.substr(0,3) == "arm") machine = "arm";
96 else if (machine == "sa110") machine = "arm";
97 else if (machine == "s390x") machine = "s390";
98 else if (machine.substr(0,3) == "ppc") machine = "powerpc";
99 else if (machine.substr(0,4) == "mips") machine = "mips";
100 else if (machine.substr(0,3) == "sh2") machine = "sh";
101 else if (machine.substr(0,3) == "sh3") machine = "sh";
102 else if (machine.substr(0,3) == "sh4") machine = "sh";
103 architecture = machine;
104
105 for (unsigned i=0; i<5; i++) perpass_verbose[i]=0;
106 verbose = 0;
107
108 have_script = false;
109 runtime_specified = false;
110 include_arg_start = -1;
111 timing = false;
112 guru_mode = false;
113 bulk_mode = false;
114 unoptimized = false;
115 suppress_warnings = false;
116 panic_warnings = false;
117 listing_mode = false;
118 listing_mode_vars = false;
119
120 #ifdef ENABLE_PROLOGUES
121 prologue_searching = true;
122 #else
123 prologue_searching = false;
124 #endif
125
126 buffer_size = 0;
127 last_pass = 5;
128 module_name = "stap_" + lex_cast(getpid());
129 stapconf_name = "stapconf_" + lex_cast(getpid()) + ".h";
130 output_file = ""; // -o FILE
131 save_module = false;
132 keep_tmpdir = false;
133 cmd = "";
134 target_pid = 0;
135 use_cache = true;
136 use_script_cache = true;
137 poison_cache = false;
138 tapset_compile_coverage = false;
139 need_uprobes = false;
140 uprobes_path = "";
141 consult_symtab = false;
142 ignore_vmlinux = false;
143 ignore_dwarf = false;
144 load_only = false;
145 skip_badvars = false;
146 unprivileged = false;
147 omit_werror = false;
148 compatible = VERSION; // XXX: perhaps also process GIT_SHAID if available?
149 unwindsym_ldd = false;
150 client_options = false;
151 NSPR_Initialized = false;
152
153 /* adding in the XDG_DATA_DIRS variable path,
154 * this searches in conjunction with SYSTEMTAP_TAPSET
155 * to locate stap scripts, either can be disabled if
156 * needed using env $PATH=/dev/null where $PATH is the
157 * path you want disabled
158 */
159 const char* s_p1 = getenv ("XDG_DATA_DIRS");
160 if ( s_p1 != NULL )
161 {
162 vector<string> dirs;
163 tokenize(s_p1, dirs, ":");
164 for(vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i)
165 {
166 include_path.push_back(*i + "/systemtap/tapset");
167 }
168 }
169
170 const char* s_p = getenv ("SYSTEMTAP_TAPSET");
171 if (s_p != NULL)
172 {
173 include_path.push_back (s_p);
174 }
175 else
176 {
177 include_path.push_back (string(PKGDATADIR) + "/tapset");
178 }
179
180 const char* s_r = getenv ("SYSTEMTAP_RUNTIME");
181 if (s_r != NULL)
182 runtime_path = s_r;
183 else
184 runtime_path = string(PKGDATADIR) + "/runtime";
185
186 const char* s_d = getenv ("SYSTEMTAP_DIR");
187 if (s_d != NULL)
188 data_path = s_d;
189 else
190 data_path = get_home_directory() + string("/.systemtap");
191 if (create_dir(data_path.c_str()) == 1)
192 {
193 const char* e = strerror (errno);
194 if (! suppress_warnings)
195 cerr << "Warning: failed to create systemtap data directory (\""
196 << data_path << "\"): " << e
197 << ", disabling cache support." << endl;
198 use_cache = use_script_cache = false;
199 }
200
201 if (use_cache)
202 {
203 cache_path = data_path + "/cache";
204 if (create_dir(cache_path.c_str()) == 1)
205 {
206 const char* e = strerror (errno);
207 if (! suppress_warnings)
208 cerr << "Warning: failed to create cache directory (\""
209 << cache_path << "\"): " << e
210 << ", disabling cache support." << endl;
211 use_cache = use_script_cache = false;
212 }
213 }
214
215 const char* s_tc = getenv ("SYSTEMTAP_COVERAGE");
216 if (s_tc != NULL)
217 tapset_compile_coverage = true;
218
219 const char* s_kr = getenv ("SYSTEMTAP_RELEASE");
220 if (s_kr != NULL) {
221 setup_kernel_release(s_kr);
222 }
223 }
224
225 systemtap_session::~systemtap_session ()
226 {
227 #if HAVE_NSS
228 if (NSPR_Initialized)
229 PR_Cleanup ();
230 #endif // HAVE_NSS
231 }
232
233 void
234 systemtap_session::NSPR_init ()
235 {
236 #if HAVE_NSS
237 if (! NSPR_Initialized)
238 {
239 PR_Init (PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1);
240 NSPR_Initialized = true;
241 }
242 #endif // HAVE_NSS
243 }
244
245 void
246 systemtap_session::version ()
247 {
248 clog
249 << "SystemTap translator/driver "
250 << "(version " << VERSION << "/" << dwfl_version (NULL)
251 << " " << GIT_MESSAGE << ")" << endl
252 << "Copyright (C) 2005-2010 Red Hat, Inc. and others" << endl
253 << "This is free software; see the source for copying conditions." << endl;
254 clog << "enabled features:"
255 #ifdef HAVE_AVAHI
256 << " AVAHI"
257 #endif
258 #ifdef HAVE_LIBRPM
259 << " LIBRPM"
260 #endif
261 #ifdef HAVE_LIBSQLITE3
262 << " LIBSQLITE3"
263 #endif
264 #ifdef HAVE_NSS
265 << " NSS"
266 #endif
267 #ifdef HAVE_BOOST_SHARED_PTR_HPP
268 << " BOOST_SHARED_PTR"
269 #endif
270 #ifdef HAVE_TR1_UNORDERED_MAP
271 << " TR1_UNORDERED_MAP"
272 #endif
273 #ifdef ENABLE_PROLOGUES
274 << " PROLOGUES"
275 #endif
276 << endl;
277 }
278
279 void
280 systemtap_session::usage (int exitcode)
281 {
282 version ();
283 clog
284 << endl
285 << "Usage: stap [options] FILE Run script in file."
286 << endl
287 << " or: stap [options] - Run script on stdin."
288 << endl
289 << " or: stap [options] -e SCRIPT Run given script."
290 << endl
291 << " or: stap [options] -l PROBE List matching probes."
292 << endl
293 << " or: stap [options] -L PROBE List matching probes and local variables."
294 << endl
295 << endl
296 << "Options:" << endl
297 << " -- end of translator options, script options follow" << endl
298 << " -h --help show help" << endl
299 << " -V show version" << endl
300 << " -p NUM stop after pass NUM 1-5, instead of " << last_pass << endl
301 << " (parse, elaborate, translate, compile, run)" << endl
302 << " -v add verbosity to all passes" << endl
303 << " --vp {N}+ add per-pass verbosity [";
304 for (unsigned i=0; i<5; i++)
305 clog << (perpass_verbose[i] <= 9 ? perpass_verbose[i] : 9);
306 clog
307 << "]" << endl
308 << " -k keep temporary directory" << endl
309 << " -u unoptimized translation" << (unoptimized ? " [set]" : "") << endl
310 << " -w suppress warnings" << (suppress_warnings ? " [set]" : "") << endl
311 << " -W turn warnings into errors" << (panic_warnings ? " [set]" : "") << endl
312 << " -g guru mode" << (guru_mode ? " [set]" : "") << endl
313 << " -P prologue-searching for function probes"
314 << (prologue_searching ? " [set]" : "") << endl
315 << " -b bulk (percpu file) mode" << (bulk_mode ? " [set]" : "") << endl
316 << " -s NUM buffer size in megabytes, instead of " << buffer_size << endl
317 << " -I DIR look in DIR for additional .stp script files";
318 if (include_path.size() == 0)
319 clog << endl;
320 else
321 clog << ", in addition to" << endl;
322 for (unsigned i=0; i<include_path.size(); i++)
323 clog << " " << include_path[i] << endl;
324 clog
325 << " -D NM=VAL emit macro definition into generated C code" << endl
326 << " -B NM=VAL pass option to kbuild make" << endl
327 << " -G VAR=VAL set global variable to value" << endl
328 << " -R DIR look in DIR for runtime, instead of" << endl
329 << " " << runtime_path << endl
330 << " -r DIR cross-compile to kernel with given build tree; or else" << endl
331 << " -r RELEASE cross-compile to kernel /lib/modules/RELEASE/build, instead of" << endl
332 << " " << kernel_build_tree << endl
333 << " -a ARCH cross-compile to given architecture, instead of " << architecture << endl
334 << " -m MODULE set probe module name, instead of " << endl
335 << " " << module_name << endl
336 << " -o FILE send script output to file, instead of stdout. This supports" << endl
337 << " strftime(3) formats for FILE" << endl
338 << " -c CMD start the probes, run CMD, and exit when it finishes" << endl
339 << " -x PID sets target() to PID" << endl
340 << " -F run as on-file flight recorder with -o." << endl
341 << " run as on-memory flight recorder without -o." << endl
342 << " -S size[,n] set maximum of the size and the number of files." << endl
343 << " -d OBJECT add unwind/symbol data for OBJECT file";
344 if (unwindsym_modules.size() == 0)
345 clog << endl;
346 else
347 clog << ", in addition to" << endl;
348 {
349 vector<string> syms (unwindsym_modules.begin(), unwindsym_modules.end());
350 for (unsigned i=0; i<syms.size(); i++)
351 clog << " " << syms[i] << endl;
352 }
353 clog
354 << " --ldd add unwind/symbol data for all referenced OBJECT files." << endl
355 << " --all-modules" << endl
356 << " add unwind/symbol data for all loaded kernel objects." << endl
357 << " -t collect probe timing information" << endl
358 #ifdef HAVE_LIBSQLITE3
359 << " -q generate information on tapset coverage" << endl
360 #endif /* HAVE_LIBSQLITE3 */
361 << " --unprivileged" << endl
362 << " restrict usage to features available to unprivileged users" << endl
363 #if 0 /* PR6864: disable temporarily; should merge with -d somehow */
364 << " --kelf make do with symbol table from vmlinux" << endl
365 << " --kmap[=FILE]" << endl
366 << " make do with symbol table from nm listing" << endl
367 #endif
368 // Formerly present --ignore-{vmlinux,dwarf} options are for testsuite use
369 // only, and don't belong in the eyesight of a plain user.
370 << " --compatible=VERSION" << endl
371 << " suppress incompatible language/tapset changes beyond VERSION," << endl
372 << " instead of " << compatible << endl
373 << " --skip-badvars" << endl
374 << " substitute zero for bad context $variables" << endl
375 << " --use-server[=SERVER-SPEC]" << endl
376 << " specify systemtap compile-servers" << endl
377 << " --list-servers[=PROPERTIES]" << endl
378 << " report on the status of the specified compile-servers" << endl
379 #if HAVE_NSS
380 << " --trust-servers[=TRUST-SPEC]" << endl
381 << " add/revoke trust of specified compile-servers" << endl
382 #endif
383 ;
384
385 time_t now;
386 time (& now);
387 struct tm* t = localtime (& now);
388 if (t && t->tm_mon*3 + t->tm_mday*173 == 0xb6)
389 clog << morehelp << endl;
390
391 exit (exitcode);
392 }
393
394 int
395 systemtap_session::parse_cmdline (int argc, char * const argv [])
396 {
397 client_options_disallowed = "";
398 while (true)
399 {
400 int long_opt;
401 char * num_endptr;
402
403 // NB: when adding new options, consider very carefully whether they
404 // should be restricted from stap clients (after --client-options)!
405 #define LONG_OPT_KELF 1
406 #define LONG_OPT_KMAP 2
407 #define LONG_OPT_IGNORE_VMLINUX 3
408 #define LONG_OPT_IGNORE_DWARF 4
409 #define LONG_OPT_VERBOSE_PASS 5
410 #define LONG_OPT_SKIP_BADVARS 6
411 #define LONG_OPT_UNPRIVILEGED 7
412 #define LONG_OPT_OMIT_WERROR 8
413 #define LONG_OPT_CLIENT_OPTIONS 9
414 #define LONG_OPT_HELP 10
415 #define LONG_OPT_DISABLE_CACHE 11
416 #define LONG_OPT_POISON_CACHE 12
417 #define LONG_OPT_CLEAN_CACHE 13
418 #define LONG_OPT_COMPATIBLE 14
419 #define LONG_OPT_LDD 15
420 #define LONG_OPT_USE_SERVER 16
421 #define LONG_OPT_LIST_SERVERS 17
422 #define LONG_OPT_TRUST_SERVERS 18
423 #define LONG_OPT_ALL_MODULES 19
424 // NB: also see find_hash(), usage(), switch stmt below, stap.1 man page
425 static struct option long_options[] = {
426 { "kelf", 0, &long_opt, LONG_OPT_KELF },
427 { "kmap", 2, &long_opt, LONG_OPT_KMAP },
428 { "ignore-vmlinux", 0, &long_opt, LONG_OPT_IGNORE_VMLINUX },
429 { "ignore-dwarf", 0, &long_opt, LONG_OPT_IGNORE_DWARF },
430 { "skip-badvars", 0, &long_opt, LONG_OPT_SKIP_BADVARS },
431 { "vp", 1, &long_opt, LONG_OPT_VERBOSE_PASS },
432 { "unprivileged", 0, &long_opt, LONG_OPT_UNPRIVILEGED },
433 #define OWE5 "tter"
434 #define OWE1 "uild-"
435 #define OWE6 "fu-kb"
436 #define OWE2 "i-kno"
437 #define OWE4 "st"
438 #define OWE3 "w-be"
439 { OWE4 OWE6 OWE1 OWE2 OWE3 OWE5, 0, &long_opt, LONG_OPT_OMIT_WERROR },
440 { "client-options", 0, &long_opt, LONG_OPT_CLIENT_OPTIONS },
441 { "help", 0, &long_opt, LONG_OPT_HELP },
442 { "disable-cache", 0, &long_opt, LONG_OPT_DISABLE_CACHE },
443 { "poison-cache", 0, &long_opt, LONG_OPT_POISON_CACHE },
444 { "clean-cache", 0, &long_opt, LONG_OPT_CLEAN_CACHE },
445 { "compatible", 1, &long_opt, LONG_OPT_COMPATIBLE },
446 { "ldd", 0, &long_opt, LONG_OPT_LDD },
447 { "use-server", 2, &long_opt, LONG_OPT_USE_SERVER },
448 { "list-servers", 2, &long_opt, LONG_OPT_LIST_SERVERS },
449 { "trust-servers", 2, &long_opt, LONG_OPT_TRUST_SERVERS },
450 { "all-modules", 0, &long_opt, LONG_OPT_ALL_MODULES },
451 { NULL, 0, NULL, 0 }
452 };
453 int grc = getopt_long (argc, argv, "hVvtp:I:e:o:R:r:a:m:kgPc:x:D:bs:uqwl:d:L:FS:B:WG:",
454 long_options, NULL);
455 // NB: when adding new options, consider very carefully whether they
456 // should be restricted from stap clients (after --client-options)!
457
458 if (grc < 0)
459 break;
460 bool push_server_opt = false;
461 switch (grc)
462 {
463 case 'V':
464 push_server_opt = true;
465 version ();
466 exit (0);
467
468 case 'v':
469 push_server_opt = true;
470 for (unsigned i=0; i<5; i++)
471 perpass_verbose[i] ++;
472 verbose ++;
473 break;
474
475 case 'G':
476 // Make sure the global option is only composed of the
477 // following chars: [_=a-zA-Z0-9]
478 assert_regexp_match("-G parameter", optarg, "^[a-z_][a-z0-9_]+=[a-z0-9_-]+$");
479
480 globalopts.push_back (string(optarg));
481 break;
482
483 case 't':
484 push_server_opt = true;
485 timing = true;
486 break;
487
488 case 'w':
489 push_server_opt = true;
490 suppress_warnings = true;
491 break;
492
493 case 'W':
494 push_server_opt = true;
495 panic_warnings = true;
496 break;
497
498 case 'p':
499 last_pass = (int)strtoul(optarg, &num_endptr, 10);
500 if (*num_endptr != '\0' || last_pass < 1 || last_pass > 5)
501 {
502 cerr << "Invalid pass number (should be 1-5)." << endl;
503 return 1;
504 }
505 if (listing_mode && last_pass != 2)
506 {
507 cerr << "Listing (-l) mode implies pass 2." << endl;
508 return 1;
509 }
510 push_server_opt = true;
511 break;
512
513 case 'I':
514 if (client_options)
515 client_options_disallowed += client_options_disallowed.empty () ? "-I" : ", -I";
516 if (include_arg_start == -1)
517 include_arg_start = include_path.size ();
518 include_path.push_back (string (optarg));
519 break;
520
521 case 'd':
522 push_server_opt = true;
523 {
524 // At runtime user module names are resolved through their
525 // canonical (absolute) path.
526 const char *mpath = canonicalize_file_name (optarg);
527 if (mpath == NULL) // Must be a kernel module name
528 mpath = optarg;
529 unwindsym_modules.insert (string (mpath));
530 // PR10228: trigger vma tracker logic early if -d /USER-MODULE/
531 // given. XXX This is actually too early. Having a user module
532 // is a good indicator that something will need vma tracking.
533 // But it is not 100%, this really should only trigger through
534 // a user mode tapset /* pragma:vma */ or a probe doing a
535 // variable lookup through a dynamic module.
536 if (mpath[0] == '/')
537 enable_vma_tracker (*this);
538 break;
539 }
540
541 case 'e':
542 if (have_script)
543 {
544 cerr << "Only one script can be given on the command line."
545 << endl;
546 return 1;
547 }
548 push_server_opt = true;
549 cmdline_script = string (optarg);
550 have_script = true;
551 break;
552
553 case 'o':
554 // NB: client_options not a problem, since pass 1-4 does not use output_file.
555 push_server_opt = true;
556 output_file = string (optarg);
557 break;
558
559 case 'R':
560 if (client_options) { cerr << "ERROR: -R invalid with --client-options" << endl; return 1; }
561 runtime_specified = true;
562 runtime_path = string (optarg);
563 break;
564
565 case 'm':
566 if (client_options)
567 client_options_disallowed += client_options_disallowed.empty () ? "-m" : ", -m";
568 module_name = string (optarg);
569 save_module = true;
570 {
571 // If the module name ends with '.ko', chop it off since
572 // modutils doesn't like modules named 'foo.ko.ko'.
573 if (endswith(module_name, ".ko"))
574 {
575 module_name.erase(module_name.size() - 3);
576 cerr << "Truncating module name to '" << module_name
577 << "'" << endl;
578 }
579
580 // Make sure an empty module name wasn't specified (-m "")
581 if (module_name.empty())
582 {
583 cerr << "Module name cannot be empty." << endl;
584 return 1;
585 }
586
587 // Make sure the module name is only composed of the
588 // following chars: [a-z0-9_]
589 assert_regexp_match("-m parameter", module_name, "^[a-z0-9_]+$");
590
591 // Make sure module name isn't too long.
592 if (module_name.size() >= (MODULE_NAME_LEN - 1))
593 {
594 module_name.resize(MODULE_NAME_LEN - 1);
595 cerr << "Truncating module name to '" << module_name
596 << "'" << endl;
597 }
598 }
599
600 push_server_opt = true;
601 use_script_cache = false;
602 break;
603
604 case 'r':
605 if (client_options) // NB: no paths!
606 assert_regexp_match("-r parameter from client", optarg, "^[a-z0-9_.-]+$");
607 push_server_opt = true;
608 setup_kernel_release(optarg);
609 break;
610
611 case 'a':
612 assert_regexp_match("-a parameter", optarg, "^[a-z0-9_-]+$");
613 push_server_opt = true;
614 architecture = string(optarg);
615 break;
616
617 case 'k':
618 push_server_opt = true;
619 keep_tmpdir = true;
620 use_script_cache = false; /* User wants to keep a usable build tree. */
621 break;
622
623 case 'g':
624 push_server_opt = true;
625 guru_mode = true;
626 break;
627
628 case 'P':
629 push_server_opt = true;
630 prologue_searching = true;
631 break;
632
633 case 'b':
634 push_server_opt = true;
635 bulk_mode = true;
636 break;
637
638 case 'u':
639 push_server_opt = true;
640 unoptimized = true;
641 break;
642
643 case 's':
644 buffer_size = (int) strtoul (optarg, &num_endptr, 10);
645 if (*num_endptr != '\0' || buffer_size < 1 || buffer_size > 4095)
646 {
647 cerr << "Invalid buffer size (should be 1-4095)." << endl;
648 return 1;
649 }
650 push_server_opt = true;
651 break;
652
653 case 'c':
654 push_server_opt = true;
655 cmd = string (optarg);
656 if (cmd == "")
657 {
658 // This would mess with later code deciding to pass -c
659 // through to staprun
660 cerr << "Empty CMD string invalid." << endl;
661 return 1;
662 }
663 break;
664
665 case 'x':
666 target_pid = (int) strtoul(optarg, &num_endptr, 10);
667 if (*num_endptr != '\0')
668 {
669 cerr << "Invalid target process ID number." << endl;
670 return 1;
671 }
672 push_server_opt = true;
673 break;
674
675 case 'D':
676 assert_regexp_match ("-D parameter", optarg, "^[a-z_][a-z_0-9]*(=-?[a-z_0-9]+)?$");
677 if (client_options)
678 client_options_disallowed += client_options_disallowed.empty () ? "-D" : ", -D";
679 push_server_opt = true;
680 macros.push_back (string (optarg));
681 break;
682
683 case 'S':
684 assert_regexp_match ("-S parameter", optarg, "^[0-9]+(,[0-9]+)?$");
685 push_server_opt = true;
686 size_option = string (optarg);
687 break;
688
689 case 'q':
690 if (client_options) { cerr << "ERROR: -q invalid with --client-options" << endl; return 1; }
691 push_server_opt = true;
692 tapset_compile_coverage = true;
693 break;
694
695 case 'h':
696 usage (0);
697 break;
698
699 case 'L':
700 listing_mode_vars = true;
701 unoptimized = true; // This causes retention of variables for listing_mode
702 // fallthrough
703 case 'l':
704 suppress_warnings = true;
705 listing_mode = true;
706 last_pass = 2;
707 if (have_script)
708 {
709 cerr << "Only one script can be given on the command line."
710 << endl;
711 return 1;
712 }
713 push_server_opt = true;
714 cmdline_script = string("probe ") + string(optarg) + " {}";
715 have_script = true;
716 break;
717
718 case 'F':
719 push_server_opt = true;
720 load_only = true;
721 break;
722
723 case 'B':
724 if (client_options) { cerr << "ERROR: -B invalid with --client-options" << endl; return 1; }
725 push_server_opt = true;
726 kbuildflags.push_back (string (optarg));
727 break;
728
729 case 0:
730 switch (long_opt)
731 {
732 case LONG_OPT_KELF:
733 push_server_opt = true;
734 consult_symtab = true;
735 break;
736 case LONG_OPT_KMAP:
737 // Leave consult_symtab unset for now, to ease error checking.
738 if (!kernel_symtab_path.empty())
739 {
740 cerr << "You can't specify multiple --kmap options." << endl;
741 return 1;
742 }
743 push_server_opt = true;
744 if (optarg)
745 kernel_symtab_path = optarg;
746 else
747 kernel_symtab_path = PATH_TBD;
748 break;
749 case LONG_OPT_IGNORE_VMLINUX:
750 push_server_opt = true;
751 ignore_vmlinux = true;
752 break;
753 case LONG_OPT_IGNORE_DWARF:
754 push_server_opt = true;
755 ignore_dwarf = true;
756 break;
757 case LONG_OPT_VERBOSE_PASS:
758 {
759 bool ok = true;
760 if (strlen(optarg) < 1 || strlen(optarg) > 5)
761 ok = false;
762 if (ok)
763 for (unsigned i=0; i<strlen(optarg); i++)
764 if (isdigit (optarg[i]))
765 perpass_verbose[i] += optarg[i]-'0';
766 else
767 ok = false;
768
769 if (! ok)
770 {
771 cerr << "Invalid --vp argument: it takes 1 to 5 digits." << endl;
772 return 1;
773 }
774 // NB: we don't do this: last_pass = strlen(optarg);
775 push_server_opt = true;
776 break;
777 }
778 case LONG_OPT_SKIP_BADVARS:
779 push_server_opt = true;
780 skip_badvars = true;
781 break;
782 case LONG_OPT_UNPRIVILEGED:
783 push_server_opt = true;
784 unprivileged = true;
785 /* NB: for server security, it is essential that once this flag is
786 set, no future flag be able to unset it. */
787 break;
788 case LONG_OPT_OMIT_WERROR:
789 push_server_opt = true;
790 omit_werror = true;
791 break;
792 case LONG_OPT_CLIENT_OPTIONS:
793 client_options = true;
794 break;
795 case LONG_OPT_USE_SERVER:
796 if (client_options)
797 client_options_disallowed += client_options_disallowed.empty () ? "--use-server" : ", --use-server";
798 if (optarg)
799 specified_servers.push_back (optarg);
800 else
801 specified_servers.push_back ("");
802 break;
803 case LONG_OPT_LIST_SERVERS:
804 if (client_options)
805 client_options_disallowed += client_options_disallowed.empty () ? "--list-servers" : ", --list-servers";
806 if (optarg)
807 server_status_strings.push_back (optarg);
808 else
809 server_status_strings.push_back ("");
810 break;
811 case LONG_OPT_TRUST_SERVERS:
812 if (client_options)
813 client_options_disallowed += client_options_disallowed.empty () ? "--trust-servers" : ", --trust-servers";
814 if (optarg)
815 server_trust_spec = optarg;
816 else
817 server_trust_spec = "ssl";
818 break;
819 case LONG_OPT_HELP:
820 usage (0);
821 break;
822
823 // The caching options should not be available to server clients
824 case LONG_OPT_DISABLE_CACHE:
825 if (client_options) {
826 cerr << "ERROR: --disable-cache is invalid with --client-options" << endl;
827 return 1;
828 }
829 use_cache = use_script_cache = false;
830 break;
831 case LONG_OPT_POISON_CACHE:
832 if (client_options) {
833 cerr << "ERROR: --poison-cache is invalid with --client-options" << endl;
834 return 1;
835 }
836 poison_cache = true;
837 break;
838 case LONG_OPT_CLEAN_CACHE:
839 if (client_options) {
840 cerr << "ERROR: --clean-cache is invalid with --client-options" << endl;
841 return 1;
842 }
843 clean_cache(*this);
844 exit(0);
845
846 case LONG_OPT_COMPATIBLE:
847 push_server_opt = true;
848 compatible = optarg;
849 break;
850
851 case LONG_OPT_LDD:
852 if (client_options) {
853 cerr << "ERROR: --ldd is invalid with --client-options" << endl;
854 return 1;
855 }
856 push_server_opt = true;
857 unwindsym_ldd = true;
858 break;
859
860 case LONG_OPT_ALL_MODULES:
861 if (client_options) {
862 cerr << "ERROR: --all-modules is invalid with --client-options" << endl;
863 return 1;
864 }
865 insert_loaded_modules();
866 break;
867
868 default:
869 // NOTREACHED unless one added a getopt option but not a corresponding switch/case:
870 cerr << "Unhandled long argument id " << long_opt << endl;
871 return 1;
872 }
873 break;
874
875 case '?':
876 // Invalid/unrecognized option given or argument required, but
877 // not given. In both cases getopt_long() will have printed the
878 // appropriate error message to stderr already.
879 return 1;
880 break;
881
882 default:
883 // NOTREACHED unless one added a getopt option but not a corresponding switch/case:
884 cerr << "Unhandled argument code " << (char)grc << endl;
885 return 1;
886 break;
887 }
888
889 // Pass selected options on to the server, if any.
890 if (push_server_opt)
891 {
892 if (grc == 0)
893 server_args.push_back (string ("--") +
894 long_options[long_opt - 1].name);
895 else
896 server_args.push_back (string ("-") + (char)grc);
897 if (optarg)
898 server_args.push_back (optarg);
899 }
900 }
901
902 return 0;
903 }
904
905 void
906 systemtap_session::check_options (int argc, char * const argv [])
907 {
908 for (int i = optind; i < argc; i++)
909 {
910 if (! have_script)
911 {
912 script_file = string (argv[i]);
913 have_script = true;
914 }
915 else
916 args.push_back (string (argv[i]));
917 }
918
919 // need a user file
920 // NB: this is also triggered if stap is invoked with no arguments at all
921 if (! have_script)
922 {
923 // We don't need a script if --list-servers or --trust-servers was specified
924 if (server_status_strings.empty () && server_trust_spec.empty ())
925 {
926 cerr << "A script must be specified." << endl;
927 usage(1);
928 }
929 }
930
931 #if ! HAVE_NSS
932 if (client_options)
933 cerr << "WARNING: --client-options is not supported by this version of systemtap" << endl;
934 #endif
935
936 #if ! HAVE_NSS
937 if (! server_trust_spec.empty ())
938 {
939 cerr << "WARNING: --trust-servers is not supported by this version of systemtap" << endl;
940 server_trust_spec.clear ();
941 }
942 #endif
943
944 if (runtime_specified && ! specified_servers.empty ())
945 {
946 cerr << "Warning: Ignoring --use-server due to the use of -R" << endl;
947 specified_servers.clear ();
948 }
949
950 if (client_options && last_pass > 4)
951 {
952 last_pass = 4; /* Quietly downgrade. Server passed through -p5 naively. */
953 }
954
955 // If phase 5 has been requested and the user is a member of stapusr but not
956 // stapdev, then add --unprivileged and --use-server to the invocation,
957 // if not already specified.
958 if (last_pass > 4 && have_script)
959 {
960 struct group *stgr = getgrnam ("stapusr");
961 if (stgr && in_group_id (stgr->gr_gid))
962 {
963 stgr = getgrnam ("stapdev");
964 if (! stgr || ! in_group_id (stgr->gr_gid))
965 {
966 if (! unprivileged)
967 {
968 if (perpass_verbose[0] > 1)
969 cerr << "Using --unprivileged for member of the group stapusr" << endl;
970 unprivileged = true;
971 server_args.push_back ("--unprivileged");
972 }
973 if (specified_servers.empty ())
974 {
975 if (perpass_verbose[0] > 1)
976 cerr << "Using --use-server for member of the group stapusr" << endl;
977 specified_servers.push_back ("");
978 }
979 }
980 }
981 }
982
983 if (client_options && unprivileged && ! client_options_disallowed.empty ())
984 {
985 cerr << "You can't specify " << client_options_disallowed << " when --unprivileged is specified." << endl;
986 usage (1);
987 }
988 if ((cmd != "") && (target_pid))
989 {
990 cerr << "You can't specify -c and -x options together." << endl;
991 usage (1);
992 }
993 if (unprivileged && guru_mode)
994 {
995 cerr << "You can't specify -g and --unprivileged together." << endl;
996 usage (1);
997 }
998 if (!kernel_symtab_path.empty())
999 {
1000 if (consult_symtab)
1001 {
1002 cerr << "You can't specify --kelf and --kmap together." << endl;
1003 usage (1);
1004 }
1005 consult_symtab = true;
1006 if (kernel_symtab_path == PATH_TBD)
1007 kernel_symtab_path = string("/boot/System.map-") + kernel_release;
1008 }
1009 // Warn in case the target kernel release doesn't match the running one.
1010 if (last_pass > 4 &&
1011 (release != kernel_release ||
1012 machine != architecture)) // NB: squashed ARCH by PR4186 logic
1013 {
1014 if(! suppress_warnings)
1015 cerr << "WARNING: kernel release/architecture mismatch with host forces last-pass 4." << endl;
1016 last_pass = 4;
1017 }
1018
1019 // translate path of runtime to absolute path
1020 if (runtime_path[0] != '/')
1021 {
1022 char cwd[PATH_MAX];
1023 if (getcwd(cwd, sizeof(cwd)))
1024 {
1025 runtime_path = string(cwd) + "/" + runtime_path;
1026 }
1027 }
1028 }
1029
1030 void systemtap_session::insert_loaded_modules()
1031 {
1032 char line[1024];
1033 ifstream procmods ("/proc/modules");
1034 while (procmods.good()) {
1035 procmods.getline (line, sizeof(line));
1036 strtok(line, " \t");
1037 if (line[0] == '\0')
1038 break; // maybe print a warning?
1039 unwindsym_modules.insert (string (line));
1040 }
1041 procmods.close();
1042 unwindsym_modules.insert ("kernel");
1043 }
1044
1045 void
1046 systemtap_session::setup_kernel_release (const char* kstr)
1047 {
1048 if (kstr[0] == '/') // fully specified path
1049 {
1050 kernel_build_tree = kstr;
1051 string version_file_name = kernel_build_tree + "/include/config/kernel.release";
1052 // The file include/config/kernel.release within the
1053 // build tree is used to pull out the version information
1054 ifstream version_file (version_file_name.c_str());
1055 if (version_file.fail ())
1056 {
1057 cerr << "Missing " << version_file_name << endl;
1058 exit(1);
1059 }
1060 else
1061 {
1062 char c;
1063 kernel_release = "";
1064 while (version_file.get(c) && c != '\n')
1065 kernel_release.push_back(c);
1066 }
1067
1068 // PR10745
1069 // Maybe it's a full kernel source tree, for purposes of PR10745.
1070 // In case CONFIG_DEBUG_INFO was set, we'd find it anyway with the
1071 // normal search in tapsets.cxx. Without CONFIG_DEBUG_INFO, we'd
1072 // need heuristics such as this one:
1073
1074 string some_random_source_only_file = kernel_build_tree + "/COPYING";
1075 ifstream epic (some_random_source_only_file.c_str());
1076 if (! epic.fail())
1077 {
1078 kernel_source_tree = kernel_build_tree;
1079 if (verbose > 2)
1080 clog << "Located kernel source tree (COPYING) at '"
1081 << kernel_source_tree << "'" << endl;
1082 }
1083 }
1084 else
1085 {
1086 kernel_release = string (kstr);
1087 kernel_build_tree = "/lib/modules/" + kernel_release + "/build";
1088
1089 // PR10745
1090 // Let's not look for the kernel_source_tree; it's definitely
1091 // not THERE. tapsets.cxx might try to find it later if tracepoints
1092 // need it.
1093 }
1094 }
1095
1096
1097 // Register all the aliases we've seen in library files, and the user
1098 // file, as patterns.
1099 void
1100 systemtap_session::register_library_aliases()
1101 {
1102 vector<stapfile*> files(library_files);
1103 files.push_back(user_file);
1104
1105 for (unsigned f = 0; f < files.size(); ++f)
1106 {
1107 stapfile * file = files[f];
1108 for (unsigned a = 0; a < file->aliases.size(); ++a)
1109 {
1110 probe_alias * alias = file->aliases[a];
1111 try
1112 {
1113 for (unsigned n = 0; n < alias->alias_names.size(); ++n)
1114 {
1115 probe_point * name = alias->alias_names[n];
1116 match_node * n = pattern_root;
1117 for (unsigned c = 0; c < name->components.size(); ++c)
1118 {
1119 probe_point::component * comp = name->components[c];
1120 // XXX: alias parameters
1121 if (comp->arg)
1122 throw semantic_error("alias component "
1123 + comp->functor
1124 + " contains illegal parameter");
1125 n = n->bind(comp->functor);
1126 }
1127 n->bind(new alias_expansion_builder(alias));
1128 }
1129 }
1130 catch (const semantic_error& e)
1131 {
1132 semantic_error* er = new semantic_error (e); // copy it
1133 stringstream msg;
1134 msg << e.msg2;
1135 msg << " while registering probe alias ";
1136 alias->printsig(msg);
1137 er->msg2 = msg.str();
1138 print_error (* er);
1139 delete er;
1140 }
1141 }
1142 }
1143 }
1144
1145
1146 // Print this given token, but abbreviate it if the last one had the
1147 // same file name.
1148 void
1149 systemtap_session::print_token (ostream& o, const token* tok)
1150 {
1151 assert (tok);
1152
1153 if (last_token && last_token->location.file == tok->location.file)
1154 {
1155 stringstream tmpo;
1156 tmpo << *tok;
1157 string ts = tmpo.str();
1158 // search & replace the file name with nothing
1159 size_t idx = ts.find (tok->location.file->name);
1160 if (idx != string::npos)
1161 ts.replace (idx, tok->location.file->name.size(), "");
1162
1163 o << ts;
1164 }
1165 else
1166 o << *tok;
1167
1168 last_token = tok;
1169 }
1170
1171
1172
1173 void
1174 systemtap_session::print_error (const semantic_error& e)
1175 {
1176 string message_str[2];
1177 string align_semantic_error (" ");
1178
1179 // We generate two messages. The second one ([1]) is printed
1180 // without token compression, for purposes of duplicate elimination.
1181 // This way, the same message that may be generated once with a
1182 // compressed and once with an uncompressed token still only gets
1183 // printed once.
1184 for (int i=0; i<2; i++)
1185 {
1186 stringstream message;
1187
1188 message << "semantic error: " << e.what ();
1189 if (e.tok1 || e.tok2)
1190 message << ": ";
1191 if (e.tok1)
1192 {
1193 if (i == 0) print_token (message, e.tok1);
1194 else message << *e.tok1;
1195 }
1196 message << e.msg2;
1197 if (e.tok2)
1198 {
1199 if (i == 0) print_token (message, e.tok2);
1200 else message << *e.tok2;
1201 }
1202 message << endl;
1203 message_str[i] = message.str();
1204 }
1205
1206 // Duplicate elimination
1207 if (seen_errors.find (message_str[1]) == seen_errors.end())
1208 {
1209 seen_errors.insert (message_str[1]);
1210 cerr << message_str[0];
1211
1212 if (e.tok1)
1213 print_error_source (cerr, align_semantic_error, e.tok1);
1214
1215 if (e.tok2)
1216 print_error_source (cerr, align_semantic_error, e.tok2);
1217 }
1218
1219 if (e.chain)
1220 print_error (* e.chain);
1221 }
1222
1223 void
1224 systemtap_session::print_error_source (std::ostream& message,
1225 std::string& align, const token* tok)
1226 {
1227 unsigned i = 0;
1228
1229 assert (tok);
1230 if (!tok->location.file)
1231 //No source to print, silently exit
1232 return;
1233
1234 unsigned line = tok->location.line;
1235 unsigned col = tok->location.column;
1236 const string &file_contents = tok->location.file->file_contents;
1237
1238 size_t start_pos = 0, end_pos = 0;
1239 //Navigate to the appropriate line
1240 while (i != line && end_pos != std::string::npos)
1241 {
1242 start_pos = end_pos;
1243 end_pos = file_contents.find ('\n', start_pos) + 1;
1244 i++;
1245 }
1246 message << align << "source: " << file_contents.substr (start_pos, end_pos-start_pos-1) << endl;
1247 message << align << " ";
1248 //Navigate to the appropriate column
1249 for (i=start_pos; i<start_pos+col-1; i++)
1250 {
1251 if(isspace(file_contents[i]))
1252 message << file_contents[i];
1253 else
1254 message << ' ';
1255 }
1256 message << "^" << endl;
1257 }
1258
1259 void
1260 systemtap_session::print_warning (const string& message_str, const token* tok)
1261 {
1262 // Duplicate elimination
1263 string align_warning (" ");
1264 if (seen_warnings.find (message_str) == seen_warnings.end())
1265 {
1266 seen_warnings.insert (message_str);
1267 clog << "WARNING: " << message_str;
1268 if (tok) { clog << ": "; print_token (clog, tok); }
1269 clog << endl;
1270 if (tok) { print_error_source (clog, align_warning, tok); }
1271 }
1272 }
1273
1274 // --------------------------------------------------------------------------
1275
1276 /*
1277 Perngrq sebz fzvyrlgnc.fit, rkcbegrq gb n 1484k1110 fzvyrlgnc.cat,
1278 gurapr catgbcnz | cazfpnyr -jvqgu 160 |
1279 cczqvgure -qvz 4 -erq 2 -terra 2 -oyhr 2 | cczgbnafv -2k4 | bq -i -j19 -g k1 |
1280 phg -s2- -q' ' | frq -r 'f,^,\\k,' -r 'f, ,\\k,t' -r 'f,^,",' -r 'f,$,",'
1281 */
1282 const char*
1283 systemtap_session::morehelp =
1284 "\x1b\x5b\x30\x6d\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1285 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1286 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1287 "\x20\x20\x20\x60\x20\x20\x2e\x60\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1288 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20"
1289 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1290 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1291 "\x20\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x1b\x5b"
1292 "\x33\x33\x6d\x20\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1293 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1294 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1295 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x1b\x5b\x33\x33\x6d\x20\x60"
1296 "\x2e\x60\x1b\x5b\x33\x37\x6d\x20\x3a\x2c\x3a\x2e\x60\x20\x60\x20\x60\x20\x60"
1297 "\x2c\x3b\x2c\x3a\x20\x1b\x5b\x33\x33\x6d\x60\x2e\x60\x20\x1b\x5b\x33\x37\x6d"
1298 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20"
1299 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1300 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x1b\x5b\x33"
1301 "\x33\x6d\x20\x60\x20\x60\x20\x3a\x27\x60\x1b\x5b\x33\x37\x6d\x20\x60\x60\x60"
1302 "\x20\x20\x20\x60\x20\x60\x60\x60\x20\x1b\x5b\x33\x33\x6d\x60\x3a\x60\x20\x60"
1303 "\x20\x60\x20\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1304 "\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1305 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1306 "\x20\x2e\x1b\x5b\x33\x33\x6d\x60\x2e\x60\x20\x60\x20\x60\x20\x20\x1b\x5b\x33"
1307 "\x37\x6d\x20\x3a\x20\x20\x20\x60\x20\x20\x20\x60\x20\x20\x2e\x1b\x5b\x33\x33"
1308 "\x6d\x60\x20\x60\x2e\x60\x20\x60\x2e\x60\x20\x1b\x5b\x33\x37\x6d\x20\x20\x20"
1309 "\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x2e\x3a\x20\x20"
1310 "\x20\x20\x20\x20\x20\x20\x2e\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1311 "\x20\x20\x2e\x76\x53\x1b\x5b\x33\x34\x6d\x53\x1b\x5b\x33\x37\x6d\x53\x1b\x5b"
1312 "\x33\x31\x6d\x2b\x1b\x5b\x33\x33\x6d\x60\x20\x60\x20\x60\x20\x20\x20\x20\x1b"
1313 "\x5b\x33\x31\x6d\x3f\x1b\x5b\x33\x30\x6d\x53\x1b\x5b\x33\x33\x6d\x2b\x1b\x5b"
1314 "\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x2e\x1b\x5b\x33\x30\x6d\x24\x1b\x5b"
1315 "\x33\x37\x6d\x3b\x1b\x5b\x33\x31\x6d\x7c\x1b\x5b\x33\x33\x6d\x20\x60\x20\x60"
1316 "\x20\x60\x20\x60\x1b\x5b\x33\x31\x6d\x2c\x1b\x5b\x33\x32\x6d\x53\x1b\x5b\x33"
1317 "\x37\x6d\x53\x53\x3e\x2c\x2e\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x2e"
1318 "\x3b\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x3c\x20\x20\x20\x20\x20\x20"
1319 "\x20\x20\x20\x2e\x2e\x3a\x1b\x5b\x33\x30\x6d\x26\x46\x46\x46\x48\x46\x1b\x5b"
1320 "\x33\x33\x6d\x60\x2e\x60\x20\x60\x20\x60\x20\x60\x1b\x5b\x33\x30\x6d\x4d\x4d"
1321 "\x46\x1b\x5b\x33\x33\x6d\x20\x20\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x1b\x5b"
1322 "\x33\x33\x6d\x20\x3a\x1b\x5b\x33\x30\x6d\x4d\x4d\x46\x1b\x5b\x33\x33\x6d\x20"
1323 "\x20\x20\x60\x20\x60\x2e\x60\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x30\x6d\x46"
1324 "\x46\x46\x24\x53\x46\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x0a\x20\x20\x20"
1325 "\x20\x2e\x3c\x3a\x60\x20\x20\x20\x20\x2e\x3a\x2e\x3a\x2e\x2e\x3b\x27\x20\x20"
1326 "\x20\x20\x20\x20\x2e\x60\x2e\x3a\x60\x60\x3c\x27\x1b\x5b\x33\x31\x6d\x3c\x27"
1327 "\x1b\x5b\x33\x33\x6d\x20\x60\x20\x60\x20\x60\x20\x20\x20\x60\x3c\x1b\x5b\x33"
1328 "\x30\x6d\x26\x1b\x5b\x33\x31\x6d\x3f\x1b\x5b\x33\x33\x6d\x20\x1b\x5b\x33\x37"
1329 "\x6d\x20\x1b\x5b\x33\x33\x6d\x20\x20\x20\x20\x20\x1b\x5b\x33\x37\x6d\x60\x1b"
1330 "\x5b\x33\x30\x6d\x2a\x46\x1b\x5b\x33\x37\x6d\x27\x1b\x5b\x33\x33\x6d\x20\x60"
1331 "\x20\x60\x20\x60\x20\x60\x20\x1b\x5b\x33\x31\x6d\x60\x3a\x1b\x5b\x33\x37\x6d"
1332 "\x27\x3c\x1b\x5b\x33\x30\x6d\x23\x1b\x5b\x33\x37\x6d\x3c\x60\x3a\x20\x20\x20"
1333 "\x0a\x20\x20\x20\x20\x3a\x60\x3a\x60\x20\x20\x20\x60\x3a\x2e\x2e\x2e\x2e\x3c"
1334 "\x3c\x20\x20\x20\x20\x20\x20\x3a\x2e\x60\x3a\x60\x20\x20\x20\x60\x1b\x5b\x33"
1335 "\x33\x6d\x3a\x1b\x5b\x33\x31\x6d\x60\x1b\x5b\x33\x33\x6d\x20\x60\x2e\x60\x20"
1336 "\x60\x20\x60\x20\x60\x20\x60\x1b\x5b\x33\x37\x6d\x20\x20\x1b\x5b\x33\x33\x6d"
1337 "\x20\x60\x20\x20\x20\x60\x1b\x5b\x33\x37\x6d\x20\x60\x20\x60\x1b\x5b\x33\x33"
1338 "\x6d\x20\x60\x2e\x60\x20\x60\x2e\x60\x20\x60\x3a\x1b\x5b\x33\x37\x6d\x20\x20"
1339 "\x20\x60\x3a\x2e\x60\x2e\x20\x0a\x20\x20\x20\x60\x3a\x60\x3a\x60\x20\x20\x20"
1340 "\x20\x20\x60\x60\x60\x60\x20\x3a\x2d\x20\x20\x20\x20\x20\x60\x20\x60\x20\x20"
1341 "\x20\x20\x20\x60\x1b\x5b\x33\x33\x6d\x3a\x60\x2e\x60\x20\x60\x20\x60\x20\x60"
1342 "\x20\x60\x20\x20\x2e\x3b\x1b\x5b\x33\x31\x6d\x76\x1b\x5b\x33\x30\x6d\x24\x24"
1343 "\x24\x1b\x5b\x33\x31\x6d\x2b\x53\x1b\x5b\x33\x33\x6d\x2c\x60\x20\x60\x20\x60"
1344 "\x20\x60\x20\x60\x20\x60\x2e\x1b\x5b\x33\x31\x6d\x60\x1b\x5b\x33\x33\x6d\x3a"
1345 "\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x60\x2e\x60\x20\x20\x0a\x20\x20\x20\x60"
1346 "\x3a\x3a\x3a\x3a\x20\x20\x20\x20\x3a\x60\x60\x60\x60\x3a\x53\x20\x20\x20\x20"
1347 "\x20\x20\x3a\x2e\x60\x2e\x20\x20\x20\x20\x20\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b"
1348 "\x33\x31\x6d\x3a\x1b\x5b\x33\x33\x6d\x2e\x60\x2e\x60\x20\x60\x2e\x60\x20\x60"
1349 "\x20\x3a\x1b\x5b\x33\x30\x6d\x24\x46\x46\x48\x46\x46\x46\x46\x46\x1b\x5b\x33"
1350 "\x31\x6d\x53\x1b\x5b\x33\x33\x6d\x2e\x60\x20\x60\x2e\x60\x20\x60\x2e\x60\x2e"
1351 "\x1b\x5b\x33\x31\x6d\x3a\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b\x33\x37\x6d\x20\x20"
1352 "\x20\x2e\x60\x2e\x3a\x20\x20\x0a\x20\x20\x20\x60\x3a\x3a\x3a\x60\x20\x20\x20"
1353 "\x60\x3a\x20\x2e\x20\x3b\x27\x3a\x20\x20\x20\x20\x20\x20\x3a\x2e\x60\x3a\x20"
1354 "\x20\x20\x20\x20\x3a\x1b\x5b\x33\x33\x6d\x3c\x3a\x1b\x5b\x33\x31\x6d\x60\x1b"
1355 "\x5b\x33\x33\x6d\x2e\x60\x20\x60\x20\x60\x20\x60\x2e\x1b\x5b\x33\x30\x6d\x53"
1356 "\x46\x46\x46\x53\x46\x46\x46\x53\x46\x46\x1b\x5b\x33\x33\x6d\x20\x60\x20\x60"
1357 "\x20\x60\x2e\x60\x2e\x60\x3a\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x37\x6d\x20"
1358 "\x20\x20\x20\x3a\x60\x3a\x60\x20\x20\x0a\x20\x20\x20\x20\x60\x3c\x3b\x3c\x20"
1359 "\x20\x20\x20\x20\x60\x60\x60\x20\x3a\x3a\x20\x20\x20\x20\x20\x20\x20\x3a\x3a"
1360 "\x2e\x60\x20\x20\x20\x20\x20\x3a\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d"
1361 "\x3c\x3a\x60\x1b\x5b\x33\x33\x6d\x2e\x60\x2e\x60\x20\x60\x3a\x1b\x5b\x33\x30"
1362 "\x6d\x53\x46\x53\x46\x46\x46\x53\x46\x46\x46\x53\x1b\x5b\x33\x33\x6d\x2e\x60"
1363 "\x20\x60\x2e\x60\x2e\x60\x3a\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x3b"
1364 "\x1b\x5b\x33\x37\x6d\x27\x20\x20\x20\x60\x3a\x3a\x60\x20\x20\x20\x0a\x20\x20"
1365 "\x20\x20\x20\x60\x3b\x3c\x20\x20\x20\x20\x20\x20\x20\x3a\x3b\x60\x20\x20\x20"
1366 "\x20\x20\x20\x20\x20\x20\x60\x3a\x60\x2e\x20\x20\x20\x20\x20\x3a\x1b\x5b\x33"
1367 "\x33\x6d\x3c\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b\x33"
1368 "\x31\x6d\x3a\x1b\x5b\x33\x33\x6d\x2e\x60\x2e\x60\x20\x1b\x5b\x33\x31\x6d\x3a"
1369 "\x1b\x5b\x33\x30\x6d\x46\x53\x46\x53\x46\x53\x46\x53\x46\x1b\x5b\x33\x31\x6d"
1370 "\x3f\x1b\x5b\x33\x33\x6d\x20\x60\x2e\x60\x2e\x3a\x3a\x1b\x5b\x33\x31\x6d\x3c"
1371 "\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x37\x6d\x60\x20"
1372 "\x20\x20\x3a\x3a\x3a\x60\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x53\x3c"
1373 "\x20\x20\x20\x20\x20\x20\x3a\x53\x3a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1374 "\x20\x60\x3a\x3a\x60\x2e\x20\x20\x20\x20\x60\x3a\x1b\x5b\x33\x31\x6d\x3c\x1b"
1375 "\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x3b\x3c\x1b\x5b\x33\x33\x6d\x3a"
1376 "\x60\x2e\x60\x3c\x1b\x5b\x33\x30\x6d\x53\x46\x53\x24\x53\x46\x53\x24\x1b\x5b"
1377 "\x33\x33\x6d\x60\x3a\x1b\x5b\x33\x31\x6d\x3a\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b"
1378 "\x33\x31\x6d\x3a\x3b\x3c\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b"
1379 "\x5b\x33\x33\x6d\x3a\x1b\x5b\x33\x37\x6d\x60\x20\x20\x2e\x60\x3a\x3a\x60\x20"
1380 "\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x3b\x3c\x2e\x2e\x2c\x2e\x2e\x20"
1381 "\x3a\x3c\x3b\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x3a\x3a\x3a"
1382 "\x60\x20\x20\x20\x20\x20\x60\x3a\x1b\x5b\x33\x33\x6d\x3c\x3b\x1b\x5b\x33\x31"
1383 "\x6d\x3c\x3b\x3c\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33"
1384 "\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x3c\x1b\x5b\x33\x30\x6d\x53\x24\x53\x1b"
1385 "\x5b\x33\x31\x6d\x53\x1b\x5b\x33\x37\x6d\x27\x1b\x5b\x33\x33\x6d\x2e\x3a\x3b"
1386 "\x1b\x5b\x33\x31\x6d\x3c\x3b\x3c\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b\x33\x31\x6d"
1387 "\x3c\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b\x33\x37\x6d\x60\x20\x20\x20\x60\x2e\x3a"
1388 "\x3a\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x2e\x3a\x3a\x3c\x53\x3c\x3a\x60"
1389 "\x3a\x3a\x3a\x3a\x53\x1b\x5b\x33\x32\x6d\x53\x1b\x5b\x33\x37\x6d\x3b\x27\x3a"
1390 "\x3c\x2c\x2e\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x3a\x3a\x3a\x3a\x2e\x60"
1391 "\x2e\x60\x2e\x60\x3a\x1b\x5b\x33\x33\x6d\x3c\x3a\x1b\x5b\x33\x31\x6d\x3c\x1b"
1392 "\x5b\x33\x33\x6d\x53\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b"
1393 "\x33\x31\x6d\x3c\x2c\x1b\x5b\x33\x33\x6d\x3c\x3b\x3a\x1b\x5b\x33\x31\x6d\x2c"
1394 "\x1b\x5b\x33\x33\x6d\x3c\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x53"
1395 "\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x3b\x3c\x1b\x5b\x33\x37\x6d\x3a"
1396 "\x60\x2e\x60\x2e\x3b\x1b\x5b\x33\x34\x6d\x53\x1b\x5b\x33\x37\x6d\x53\x3f\x27"
1397 "\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x2e\x60\x3a\x60\x3a\x3c\x53\x53\x3b\x3c"
1398 "\x3a\x60\x3a\x3a\x53\x53\x53\x3c\x3a\x60\x3a\x1b\x5b\x33\x30\x6d\x53\x1b\x5b"
1399 "\x33\x37\x6d\x2b\x20\x20\x20\x20\x20\x20\x60\x20\x20\x20\x3a\x1b\x5b\x33\x34"
1400 "\x6d\x53\x1b\x5b\x33\x30\x6d\x53\x46\x24\x1b\x5b\x33\x37\x6d\x2c\x60\x3a\x3a"
1401 "\x3a\x3c\x3a\x3c\x1b\x5b\x33\x33\x6d\x53\x1b\x5b\x33\x37\x6d\x3c\x1b\x5b\x33"
1402 "\x33\x6d\x53\x1b\x5b\x33\x31\x6d\x53\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31"
1403 "\x6d\x53\x3b\x53\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x53\x1b\x5b\x33"
1404 "\x33\x6d\x53\x1b\x5b\x33\x37\x6d\x3c\x1b\x5b\x33\x33\x6d\x53\x1b\x5b\x33\x37"
1405 "\x6d\x3c\x53\x3c\x3a\x3a\x3a\x3a\x3f\x1b\x5b\x33\x30\x6d\x53\x24\x48\x1b\x5b"
1406 "\x33\x37\x6d\x27\x60\x20\x60\x20\x20\x20\x20\x20\x20\x0a\x2e\x60\x3a\x60\x2e"
1407 "\x60\x3a\x60\x2e\x60\x3a\x60\x2e\x60\x3a\x60\x2e\x60\x3a\x60\x2e\x1b\x5b\x33"
1408 "\x30\x6d\x53\x46\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x60\x20\x20\x20\x60\x20"
1409 "\x60\x3a\x1b\x5b\x33\x30\x6d\x3c\x46\x46\x46\x1b\x5b\x33\x37\x6d\x3f\x2e\x60"
1410 "\x3a\x60\x3a\x60\x3a\x60\x3a\x60\x3a\x3c\x3a\x60\x3a\x27\x3a\x60\x3a\x60\x3a"
1411 "\x60\x3a\x60\x3b\x1b\x5b\x33\x30\x6d\x53\x46\x48\x46\x1b\x5b\x33\x37\x6d\x27"
1412 "\x20\x60\x20\x60\x20\x60\x20\x20\x20\x20\x0a\x20\x3c\x3b\x3a\x2e\x60\x20\x60"
1413 "\x2e\x60\x20\x60\x2e\x60\x20\x60\x2e\x60\x2c\x53\x1b\x5b\x33\x32\x6d\x53\x1b"
1414 "\x5b\x33\x30\x6d\x53\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1415 "\x20\x20\x60\x20\x60\x3c\x1b\x5b\x33\x30\x6d\x46\x46\x46\x1b\x5b\x33\x34\x6d"
1416 "\x2b\x1b\x5b\x33\x37\x6d\x3a\x20\x60\x20\x60\x20\x60\x2e\x60\x20\x60\x2e\x60"
1417 "\x20\x60\x2e\x60\x20\x60\x20\x60\x2c\x1b\x5b\x33\x30\x6d\x24\x46\x48\x46\x1b"
1418 "\x5b\x33\x37\x6d\x27\x20\x60\x20\x20\x20\x60\x20\x20\x20\x20\x20\x20\x0a\x20"
1419 "\x60\x3a\x1b\x5b\x33\x30\x6d\x53\x24\x1b\x5b\x33\x37\x6d\x53\x53\x53\x3b\x3c"
1420 "\x2c\x60\x2c\x3b\x3b\x53\x3f\x53\x1b\x5b\x33\x30\x6d\x24\x46\x3c\x1b\x5b\x33"
1421 "\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x20\x60"
1422 "\x3c\x1b\x5b\x33\x30\x6d\x48\x46\x46\x46\x1b\x5b\x33\x37\x6d\x3f\x2e\x60\x20"
1423 "\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x3b\x76\x1b\x5b\x33\x30\x6d"
1424 "\x48\x46\x48\x46\x1b\x5b\x33\x37\x6d\x27\x20\x60\x20\x20\x20\x60\x20\x20\x20"
1425 "\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x60\x3c\x1b\x5b\x33\x30\x6d\x46\x24\x1b"
1426 "\x5b\x33\x37\x6d\x53\x53\x53\x53\x53\x53\x1b\x5b\x33\x30\x6d\x53\x24\x53\x46"
1427 "\x46\x46\x1b\x5b\x33\x37\x6d\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1428 "\x20\x20\x20\x20\x20\x20\x20\x20\x60\x3c\x1b\x5b\x33\x30\x6d\x23\x46\x46\x46"
1429 "\x24\x1b\x5b\x33\x37\x6d\x76\x2c\x2c\x20\x2e\x20\x2e\x20\x2c\x2c\x76\x1b\x5b"
1430 "\x33\x30\x6d\x26\x24\x46\x46\x48\x3c\x1b\x5b\x33\x37\x6d\x27\x20\x20\x20\x20"
1431 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x60"
1432 "\x3c\x1b\x5b\x33\x30\x6d\x53\x46\x46\x24\x46\x24\x46\x46\x48\x46\x53\x1b\x5b"
1433 "\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x2e\x60\x20\x60\x2e\x60\x2e\x60"
1434 "\x2e\x60\x2e\x60\x3a\x3a\x3a\x3a\x3a\x1b\x5b\x33\x30\x6d\x2a\x46\x46\x46\x48"
1435 "\x46\x48\x46\x48\x46\x46\x46\x48\x46\x48\x46\x48\x1b\x5b\x33\x37\x6d\x3c\x22"
1436 "\x2e\x60\x2e\x60\x2e\x60\x2e\x60\x2e\x60\x20\x20\x20\x20\x20\x20\x20\x20\x0a"
1437 "\x20\x20\x20\x20\x20\x20\x20\x60\x3a\x1b\x5b\x33\x30\x6d\x48\x46\x46\x46\x48"
1438 "\x46\x46\x46\x1b\x5b\x33\x37\x6d\x27\x20\x20\x20\x60\x20\x60\x2e\x60\x20\x60"
1439 "\x2e\x60\x2e\x60\x3a\x60\x3a\x60\x3a\x60\x3a\x60\x3a\x3a\x3a\x60\x3a\x3c\x3c"
1440 "\x1b\x5b\x33\x30\x6d\x3c\x46\x48\x46\x46\x46\x48\x46\x46\x46\x1b\x5b\x33\x37"
1441 "\x6d\x27\x3a\x60\x3a\x60\x3a\x60\x3a\x60\x2e\x60\x2e\x60\x20\x60\x2e\x60\x20"
1442 "\x60\x20\x60\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x22\x1b\x5b"
1443 "\x33\x30\x6d\x2a\x46\x48\x46\x1b\x5b\x33\x37\x6d\x3f\x20\x20\x20\x60\x20\x60"
1444 "\x2e\x60\x20\x60\x2e\x60\x2e\x60\x3a\x60\x2e\x60\x3a\x60\x3a\x60\x3a\x60\x3a"
1445 "\x60\x3a\x60\x3a\x60\x3a\x60\x3a\x1b\x5b\x33\x30\x6d\x46\x46\x48\x46\x48\x46"
1446 "\x1b\x5b\x33\x37\x6d\x27\x3a\x60\x3a\x60\x3a\x60\x3a\x60\x2e\x60\x3a\x60\x2e"
1447 "\x60\x2e\x60\x20\x60\x2e\x60\x20\x60\x20\x60\x0a\x20\x20\x20\x20\x20\x20\x20"
1448 "\x20\x20\x20\x20\x60\x3c\x1b\x5b\x33\x30\x6d\x48\x46\x46\x1b\x5b\x33\x37\x6d"
1449 "\x2b\x60\x20\x20\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x2e\x60\x20"
1450 "\x60\x2e\x60\x20\x60\x2e\x60\x20\x60\x3a\x60\x2e\x60\x3b\x1b\x5b\x33\x30\x6d"
1451 "\x48\x46\x46\x46\x1b\x5b\x33\x37\x6d\x27\x2e\x60\x2e\x60\x20\x60\x2e\x60\x20"
1452 "\x60\x2e\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x20\x20\x60\x20\x20\x0a\x20"
1453 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x22\x1b\x5b\x33\x30\x6d\x3c"
1454 "\x48\x46\x53\x1b\x5b\x33\x37\x6d\x2b\x3a\x20\x20\x20\x60\x20\x60\x20\x60\x20"
1455 "\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x2c\x1b"
1456 "\x5b\x33\x30\x6d\x24\x46\x48\x46\x1b\x5b\x33\x37\x6d\x3f\x20\x60\x20\x60\x20"
1457 "\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x20\x20\x60"
1458 "\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1459 "\x60\x22\x3c\x1b\x5b\x33\x30\x6d\x48\x24\x46\x46\x1b\x5b\x33\x37\x6d\x3e\x2c"
1460 "\x2e\x2e\x20\x20\x20\x20\x20\x20\x20\x20\x60\x20\x20\x20\x60\x20\x20\x20\x3b"
1461 "\x2c\x2c\x1b\x5b\x33\x30\x6d\x24\x53\x46\x46\x46\x1b\x5b\x33\x37\x6d\x27\x22"
1462 "\x20\x20\x60\x20\x20\x20\x60\x20\x20\x20\x60\x20\x20\x20\x20\x20\x20\x20\x20"
1463 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20"
1464 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x22\x1b\x5b\x33\x30\x6d\x2a\x3c\x48"
1465 "\x46\x46\x24\x53\x24\x1b\x5b\x33\x37\x6d\x53\x53\x53\x3e\x3e\x3e\x3e\x3e\x53"
1466 "\x3e\x53\x1b\x5b\x33\x30\x6d\x24\x53\x24\x46\x24\x48\x46\x23\x1b\x5b\x33\x37"
1467 "\x6d\x27\x22\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1468 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20"
1469 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1470 "\x60\x60\x22\x3c\x1b\x5b\x33\x30\x6d\x2a\x3c\x3c\x3c\x48\x46\x46\x46\x48\x46"
1471 "\x46\x46\x23\x3c\x1b\x5b\x33\x36\x6d\x3c\x1b\x5b\x33\x37\x6d\x3c\x27\x22\x22"
1472 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1473 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x1b"
1474 "\x5b\x30\x6d";
This page took 0.118988 seconds and 6 git commands to generate.