Date: Tue, 31 Aug 2004 20:16:29 +0200 (CEST) From: Martin Blapp <mb@imp.ch> To: freebsd-ports@freebsd.org Cc: kuriyama@freebsd.org Subject: MIME-Tools 5.411a fixes (will be part of MIME-Tools 5.412) Message-ID: <20040831200251.C6407@cvs.imp.ch>
next in thread | raw e-mail | index | archive | help
This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. --0-923124273-1093976058=:6407 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII Content-ID: <20040831201426.R6407@cvs.imp.ch> Hi all, If it is ok I plan to commit the following changes to MIME-Tools. These are all needed fixes to get p5-MIME-Tools working properly together with MIMEDefang/Mailscanner/Amavis. They have been reviewed and discussed by Julian Field (the mailscanner lead developer) and David F. Skoll <dfs@roaringpenguin.com> (the MIMEDefang lead developer). Gisle Aas (developer of p5-Base64) has also helped us a lot. This port is unmaintained in CPAN since almost 2 years now and we need to do something. Hopefully there will be soon MIME-Tools 5.412 (but that will be after the ports freeze. I'm running these fixes here on a heavily used server and they fix all known problems (binary corruption, memleaks etc) with MIME-Tools 5411. Unfortunatly MIME-Tools 6.002 contains some regressions and nobody uses it currently. Martin patch-7or8bit.diff ------------------ Correct "7_bit", "7-bit", and "7 bit" to "7bit"; likewise for "8bit". Taken from MIME-Tools 6.002 patch-Benchmark --------------- Parser memory leak fixed. The closure-based task/benchmark mechanisms created for 5.5 were leaking references like crazy. That's been stopped. Taken from MIME-Tools 6.002 patch-Parser-BinHex ------------------- Add BinHex support. Submitted by: Julian Field <mailscanner@ecs.soton.ac.uk> patch-Decoder-qpdecode ---------------------- Fix the problem with corrupted PDF-files with a modified patch which treats encoded PDF-Files differently and decodes these file adding a carriage return. patch-Decoder-qpencode ---------------------- Fix encoding corruption. rt.cpan.org: Bug #7457 encode_qp() since version 3.02 takes up 3 args. Third arg is a flag indicating binarymode. Since the flag meaning is inverted comparing to the MIME::Base64 patch suggested originally, the corresponding MIME-tools patch needs to be modified also. Submitted by: ak2@smr.ru patch-Filer.pm-whitespace ------------------------- Remove whitspaces from exorcise_filename() and make evil_filename() recognize path or special characters. Submitted by: Julian Field <mailscanner@ecs.soton.ac.uk> Martin Blapp <mbr@freebsd.org> patch-Parser-MaxParts --------------------- Limits the number of MIME parts we will parse. Normally, instances of this class parse a message to the bitter end. Messages with many MIME parts can cause excessive memory consumption. If you invoke this method, parsing will abort with a die() if a message contains more than NUM parts. Submitted by: David F. Skoll <dfs@roaringpenguin.com> patch-ParserUndef ----------------- Return undef or the parsed MIME::Entity in parse_data(). Submitted by: David F. Skoll <dfs@roaringpenguin.com> Index: Makefile =================================================================== RCS file: /home/pcvs/ports/mail/p5-MIME-Tools/Makefile,v retrieving revision 1.27 diff -u -r1.27 Makefile --- Makefile 19 Nov 2003 10:00:45 -0000 1.27 +++ Makefile 31 Aug 2004 18:06:53 -0000 @@ -7,8 +7,8 @@ PORTNAME= p5-MIME-Tools PORTVERSION= 5.411a -PORTREVISION= 3 -PORTEPOCH= 1 +PORTREVISION= 4 +PORTEPOCH= 2 CATEGORIES= mail perl5 MASTER_SITES= ${MASTER_SITE_PERL_CPAN} MASTER_SITE_SUBDIR= MIME @@ -18,7 +18,9 @@ COMMENT= A set of perl5 modules for MIME BUILD_DEPENDS= ${SITE_PERL}/Mail/Header.pm:${PORTSDIR}/mail/p5-Mail-Tools \ - ${SITE_PERL}/IO/Wrap.pm:${PORTSDIR}/devel/p5-IO-stringy + ${SITE_PERL}/IO/Wrap.pm:${PORTSDIR}/devel/p5-IO-stringy \ + ${SITE_PERL}/Convert/BinHex.pm:${PORTSDIR}/converters/p5-Convert-BinHex \ + ${SITE_PERL}/${PERL_ARCH}/MIME/Base64.pm:${PORTSDIR}/converters/p5-MIME-Base64 RUN_DEPENDS= ${BUILD_DEPENDS} PERL_CONFIGURE= YES @@ -48,9 +50,6 @@ .include <bsd.port.pre.mk> -.if ${PERL_LEVEL} < 500800 -BUILD_DEPENDS+= ${SITE_PERL}/${PERL_ARCH}/MIME/Base64.pm:${PORTSDIR}/converters/p5-MIME-Base64 -.endif post-patch: @${RM} -f ${WRKSRC}/lib/MIME/Field/ParamVal.pm.orig \ Index: files/patch-7or8bit.diff =================================================================== RCS file: files/patch-7or8bit.diff diff -N files/patch-7or8bit.diff --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/patch-7or8bit.diff 31 Aug 2004 18:06:53 -0000 @@ -0,0 +1,20 @@ +--- lib/MIME/Head.pm.orig Sat Nov 4 20:54:46 2000 ++++ lib/MIME/Head.pm Wed Aug 25 11:12:25 2004 +@@ -685,11 +685,16 @@ + This is the default value -- that is, "Content-Transfer-Encoding: 7BIT" + is assumed if the Content-Transfer-Encoding header field is not present. + ++I do one other form of fixup: "7_bit", "7-bit", and "7 bit" are ++corrected to "7bit"; likewise for "8bit". ++ + =cut + + sub mime_encoding { + my $self = shift; +- lc($self->mime_attr('content-transfer-encoding') || '7bit'); ++ my $enc = lc($self->mime_attr('content-transfer-encoding') || '7bit'); ++ $enc =~ s{^([78])[ _-]bit\Z}{$1bit}; ++ $enc; + } + + #------------------------------ Index: files/patch-Benchmark =================================================================== RCS file: files/patch-Benchmark diff -N files/patch-Benchmark --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/patch-Benchmark 31 Aug 2004 18:06:53 -0000 @@ -0,0 +1,88 @@ +--- lib/MIME/Parser.pm.orig Wed Aug 25 11:19:44 2004 ++++ lib/MIME/Parser.pm Wed Aug 25 11:23:39 2004 +@@ -582,10 +582,7 @@ + my ($self, $in, $rdr, $out) = @_; + + ### Parse: +- my $bm = benchmark { +- $rdr->read_chunk($in, $out); +- }; +- $self->debug("t bound: $bm"); ++ $rdr->read_chunk($in, $out); + 1; + } + +@@ -828,11 +825,8 @@ + + ### Decode and save the body (using the decoder): + my $DECODED = $body->open("w") || die "$ME: body not opened: $!\n"; +- my $bm = benchmark { +- eval { $decoder->decode($ENCODED, $DECODED); }; +- $@ and $self->error($@); +- }; +- $self->debug("t decode: $bm"); ++ eval { $decoder->decode($ENCODED, $DECODED); }; ++ $@ and $self->error($@); + $DECODED->close; + + ### Success! Remember where we put stuff: +@@ -1134,11 +1128,8 @@ + my $entity; + local $/ = "\n"; ### just to be safe + +- my $bm = benchmark { +- $self->init_parse; +- ($entity) = $self->process_part($in, undef); ### parse! +- }; +- $self->debug("t parse: $bm"); ++ $self->init_parse; ++ ($entity) = $self->process_part($in, undef); ### parse! + + $entity; + } +--- lib/MIME/Tools.pm.orig Wed Aug 25 10:47:32 2004 ++++ lib/MIME/Tools.pm Wed Aug 25 10:50:41 2004 +@@ -24,7 +24,7 @@ + 'config' => [qw(%CONFIG)], + 'msgs' => [qw(usage debug whine error)], + 'msgtypes'=> [qw($M_DEBUG $M_WARNING $M_ERROR)], +- 'utils' => [qw(benchmark catfile shellquote textual_type tmpopen )], ++ 'utils' => [qw(catfile shellquote textual_type tmpopen )], + ); + Exporter::export_ok_tags('config', 'msgs', 'msgtypes', 'utils'); + +@@ -153,26 +153,6 @@ + + #------------------------------ + # +-# benchmark CODE +-# +-# Private benchmarking utility. +-# +-sub benchmark(&) { +- my ($code) = @_; +- if (1) { +- my $t0 = new Benchmark; +- &$code; +- my $t1 = new Benchmark; +- return timestr(timediff($t1, $t0)); +- } +- else { +- &$code; +- return ""; +- } +-} +- +-#------------------------------ +-# + # catfile DIR, FILE + # + # Directory/file concatenation. +@@ -1394,7 +1374,6 @@ + Newlines in the void + + Started using Benchmark for benchmarking. +- + + =item Version 5.205 (2000/06/06) + Index: files/patch-Decoder-qpdecode =================================================================== RCS file: files/patch-Decoder-qpdecode diff -N files/patch-Decoder-qpdecode --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/patch-Decoder-qpdecode 31 Aug 2004 18:06:53 -0000 @@ -0,0 +1,30 @@ +--- lib/MIME/Decoder/QuotedPrint.pm.orig Tue Aug 31 17:02:43 2004 ++++ lib/MIME/Decoder/QuotedPrint.pm Tue Aug 31 17:02:38 2004 +@@ -85,9 +85,26 @@ + # + sub decode_it { + my ($self, $in, $out) = @_; ++ my $init = 0; ++ my $havepdf = 0; + + while (defined($_ = $in->getline)) { +- $out->print(decode_qp($_)); ++ if (!$init) { ++ if ($_ =~ /^%PDF/) { ++ $init = 1; ++ $havepdf = 1; ++ } ++ } ++ if ($havepdf) { ++ my $output = $_; ++ $output =~ s/[ \t]+?(\r?\n)/$1/g; # rule #3 (trailing space must be deleted) ++ $output =~ s/=\r?\n//g; # rule #5 (soft line breaks) ++ $output =~ s/(^|[^\r])\n\Z/$1\r\n/; # JKF rule to replace trailing \n with \r\n ++ $output =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge; ++ $out->print($output); ++ } else { ++ $out->print(decode_qp($_)); ++ } + } + 1; + } Index: files/patch-Decoder-qpencode =================================================================== RCS file: files/patch-Decoder-qpencode diff -N files/patch-Decoder-qpencode --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/patch-Decoder-qpencode 31 Aug 2004 18:06:53 -0000 @@ -0,0 +1,128 @@ +--- lib/MIME/Decoder/QuotedPrint.pm.orig Wed Aug 25 11:46:45 2004 ++++ lib/MIME/Decoder/QuotedPrint.pm Wed Aug 25 11:48:27 2004 +@@ -54,7 +54,7 @@ + + use vars qw(@ISA $VERSION); + use MIME::Decoder; +-use MIME::QuotedPrint 2.03; ++use MIME::QuotedPrint 3.03; + + @ISA = qw(MIME::Decoder); + +@@ -63,7 +63,7 @@ + + #------------------------------ + # +-# encode_qp_really STRING ++# encode_qp_really STRING TEXTUAL_TYPE_FLAG + # + # Encode QP, and then follow guideline 8 from RFC 2049 (thanks to Denis + # N. Antonioli) whereby we make things a little safer for the transport +@@ -71,7 +71,7 @@ + # grow beyond 76 characters! + # + sub encode_qp_really { +- my $enc = encode_qp($_[0]); ++ my $enc = encode_qp(shift, undef, not shift); + if (length($enc) < 74) { + $enc =~ s/^\.$/=2E/g; # force encoding of /^\.$/ + $enc =~ s/^From /=46rom /g; # force encoding of /^From / +@@ -97,10 +97,10 @@ + # encode_it IN, OUT + # + sub encode_it { +- my ($self, $in, $out) = @_; ++ my ($self, $in, $out, $textual_type) = @_; + + while (defined($_ = $in->getline)) { +- $out->print(encode_qp_really($_)); ++ $out->print(encode_qp_really($_, $textual_type)); + } + 1; + } +--- lib/MIME/Decoder.pm.orig Wed Aug 25 11:49:42 2004 ++++ lib/MIME/Decoder.pm Wed Aug 25 11:50:26 2004 +@@ -248,14 +248,14 @@ + =cut + + sub encode { +- my ($self, $in, $out) = @_; ++ my ($self, $in, $out, $textual_type) = @_; + + ### Coerce old-style filehandles to legit objects, and do it! + $in = wraphandle($in); + $out = wraphandle($out); + + ### Invoke back-end method to do the work: +- $self->encode_it($in, $out) || ++ $self->encode_it($in, $out, $self->encoding eq 'quoted-printable' ? ($textual_type) : ()) || + die "$ME: ".$self->encoding." encoding failed\n"; + } + +--- lib/MIME/Entity.pm.orig Wed Aug 25 11:50:54 2004 ++++ lib/MIME/Entity.pm Wed Aug 25 11:51:25 2004 +@@ -1853,7 +1853,7 @@ + + ### Output the body: + my $IO = $self->open("r") || die "open body: $!"; +- $decoder->encode($IO, $out) || return error "encoding failed"; ++ $decoder->encode($IO, $out, textual_type($self->head->mime_type) ? 1 : 0) || die "encoding failed\n"; + $IO->close; + 1; + } +--- lib/MIME/Decoder/QuotedPrint.pm.orig Thu Aug 26 12:28:37 2004 ++++ lib/MIME/Decoder/QuotedPrint.pm Thu Aug 26 12:28:26 2004 +@@ -73,7 +73,7 @@ + sub encode_qp_really { + my $enc = encode_qp(shift, undef, not shift); + if (length($enc) < 74) { +- $enc =~ s/^\.$/=2E/g; # force encoding of /^\.$/ ++ $enc =~ s/^\.\n/=2E\n/g; # force encoding of /^\.$/ + $enc =~ s/^From /=46rom /g; # force encoding of /^From / + } + $enc; +--- t/Misc.t.orig Sun May 21 07:15:26 2000 ++++ t/Misc.t Thu Aug 26 12:34:27 2004 +@@ -6,7 +6,7 @@ + + # Create checker: + my $T = typical ExtUtils::TBone; +-$T->begin(7); ++$T->begin(12); + + #------------------------------ + # Bug 971008 from Michael W. Normandin <michael.normandin@csfb.com>: +@@ -67,13 +67,29 @@ + # $res =~ s/\./=2E/go; + # $res =~ s/From /=46rom /go; + # at the start of encode_qp_really in MIME::Decoder::QuotedPrint? ++# ++# Textual mode. ++{ ++ use MIME::Decoder::QuotedPrint; ++ my $pair; ++ foreach $pair (["From me", "=46rom me=\n"], ++ [".", ".=\n"], # soft line-break ++ [".\n", "=2E\n"], # line-break ++ [" From you", " From you=\n"]) { ++ my $out = MIME::Decoder::QuotedPrint::encode_qp_really($pair->[0], 1); ++ $T->ok_eq($out, $pair->[1], ++ "bug 970725-DNA: QP use of RFC2049 guideline 8"); ++ } ++} ++# Binary mode + { + use MIME::Decoder::QuotedPrint; + my $pair; +- foreach $pair (["From me", "=46rom me"], +- [".", "=2E"], +- [" From you", " From you"]) { +- my $out = MIME::Decoder::QuotedPrint::encode_qp_really($pair->[0]); ++ foreach $pair (["From me", "=46rom me=\n"], ++ [".", ".=\n"], # soft line-break ++ [".\n", ".=0A=\n"], # line-break ++ [" From you", " From you=\n"]) { ++ my $out = MIME::Decoder::QuotedPrint::encode_qp_really($pair->[0], 0); + $T->ok_eq($out, $pair->[1], + "bug 970725-DNA: QP use of RFC2049 guideline 8"); + } Index: files/patch-Filer.pm-whitespace =================================================================== RCS file: files/patch-Filer.pm-whitespace diff -N files/patch-Filer.pm-whitespace --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/patch-Filer.pm-whitespace 31 Aug 2004 18:06:53 -0000 @@ -0,0 +1,23 @@ +--- lib/MIME/Parser/Filer.pm Thu Nov 23 06:04:03 2000 ++++ lib/MIME/Parser/Filer.pm Thu Aug 26 00:42:18 2004 +@@ -357,8 +357,9 @@ + $self->debug("is this evil? '$name'"); + + return 1 if (!defined($name) or ($name eq '')); ### empty ++ return 1 if ($name =~ m{(^\s)|(\s+\Z)}); ### leading/trailing whitespace + return 1 if ($name =~ m{^\.+\Z}); ### dots +- return 1 if ($name =~ tr{\\/:[]}{}); ### path characters ++ return 1 if ($name =~ /((?:[\[\]\\\/\<\>\|\?\*\:\"]|\p{IsCntrl}))/); ### path or special characters + return 1 if ($self->{MPF_MaxName} and + (length($name) > $self->{MPF_MaxName})); + +@@ -402,6 +403,9 @@ + my ($root, $ext) = (($last =~ /^(.*)\.([^\.]+)\Z/) + ? ($1, $2) + : ($last, '')); ++ ### Delete leading and trailing whitespace ++ $root =~ s/^\s+//; ++ $ext =~ s/\s+$//; + $root = substr($root, 0, ($self->{MPF_TrimRoot} || 14)); + $ext = substr($ext, 0, ($self->{MPF_TrimExt} || 3)); + $ext =~ /^\w+$/ or $ext = "dat"; Index: files/patch-Parser-BinHex =================================================================== RCS file: files/patch-Parser-BinHex diff -N files/patch-Parser-BinHex --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/patch-Parser-BinHex 31 Aug 2004 18:06:53 -0000 @@ -0,0 +1,260 @@ +--- /dev/null Sun Aug 1 22:44:02 2004 ++++ lib/MIME/Decoder/BinHex.pm Sun Aug 1 22:43:12 2004 +@@ -0,0 +1,182 @@ ++package MIME::Decoder::BinHex; ++ ++ ++=head1 NAME ++ ++MIME::Decoder::BinHex - decode a "binhex" stream ++ ++ ++=head1 SYNOPSIS ++ ++A generic decoder object; see L<MIME::Decoder> for usage. ++ ++Also supports a preamble() method to recover text before ++the binhexed portion of the stream. ++ ++ ++=head1 DESCRIPTION ++ ++A MIME::Decoder subclass for a nonstandard encoding whereby ++data are binhex-encoded. Common non-standard MIME encodings for this: ++ ++ x-uu ++ x-uuencode ++ ++ ++=head1 AUTHOR ++ ++Julian Field (F<mailscanner@ecs.soton.ac.uk>). ++ ++All rights reserved. This program is free software; you can redistribute ++it and/or modify it under the same terms as Perl itself. ++ ++=head1 VERSION ++ ++$Revision: 1.1 $ $Date: 2004/08/01 20:46:17 $ ++ ++=cut ++ ++ ++require 5.002; ++use vars qw(@ISA $VERSION); ++use MIME::Decoder; ++use MIME::Tools qw(whine); ++use Convert::BinHex; ++ ++@ISA = qw(MIME::Decoder); ++ ++# The package version, both in 1.23 style *and* usable by MakeMaker: ++$VERSION = substr q$Revision: 1.1 $, 10; ++ ++ ++#------------------------------ ++# ++# decode_it IN, OUT ++# ++sub decode_it { ++ my ($self, $in, $out) = @_; ++ my ($mode, $file); ++ my (@preamble, @data); ++ local $_; ++ my $H2B = Convert::BinHex->hex2bin; ++ #my $H2B = Convert::BinHex->open($in); ++ my $line; ++ ++ $self->{MDU_Preamble} = \@preamble; ++ $self->{MDU_Mode} = '600'; ++ $self->{MDU_File} = undef; ++ ++ ### Find beginning... ++ $MailScanner::BinHex::Inline = 1; ++ if ($MailScanner::BinHex::Inline) { ++ while (defined($_ = $in->getline)) { ++ #print STDERR "Line is \"$_\"\n"; ++ if (/^\(This file must be converted/) { ++ $_ = $in->getline; ++ last if /^:/; ++ } ++ push @preamble, $_; ++ } ++ die("binhex decoding: fell off end of file\n") if !defined($_); ++ } else { ++ while (defined($_ = $in->getline)) { ++ # Found the header? So start decoding it ++ last if /^:/; ++ push @preamble, $_; ++ } ++ ## hit eof! ++ die("binhex decoding: no This file must be... found\n") if !defined($_); ++ } ++ ++ ### Decode: ++ # Don't rely on the comment always being there ++ #$self->whine(":H2B is $H2B\n"); ++ #$self->whine("Header is " . $H2B->read_header . "\n"); ++ #@data = $H2B->read_data; ++ #$out->print(@data); ++ #print STDERR "End of binhex stream\n"; ++ #return 1; ++ #if (/^:/) { ++ my $data; ++ $data = $H2B->next($_); # or whine("Next error is $@ $!\n"); ++ #print STDERR "Data line 1 is length \"" . length($data) . "\" \"$data\"\n"; ++ my $len = unpack("C", $data); ++ while ($len > length($data)+21 && defined($line = $in->getline)) { ++ $data .= $H2B->next($line); ++ } ++ $data = substr($data, 22+$len); ++ $out->print($data); ++ #} ++ while (defined($_ = $in->getline)) { ++ $line = $_; ++ $data = $H2B->next($line); ++ #print STDERR "Data is length " . length($data) . " \"$data\"\n"; ++ $out->print($data); ++ #chomp $line; ++ #print STDERR "Line is length " . length($line) . " \"$line\"\n"; ++ #print STDERR "Line matches end\n" if $line =~ /:$/; ++ last if $line =~ /:$/; ++ } ++ #print STDERR "Broken out of loop\n"; ++ #print STDERR "file incomplete, no end found\n" if !defined($_); # eof ++ 1; ++} ++ ++#------------------------------ ++# ++# encode_it IN, OUT ++# ++sub encode_it { ++ my ($self, $in, $out) = @_; ++ my $line; ++ my $buf = ''; ++ ++ my $fname = (($self->head && ++ $self->head->mime_attr('content-disposition.filename')) || ++ ''); ++ my $B2H = Convert::BinHex->bin2hex; ++ $out->print("(This file must be converted with BinHex 4.0)\n"); ++ #while (defined($line = <$in>)) { ++ while ($in->read($buf, 1000)) { ++ $out->print($B2H->next($buf)); ++ } ++ $out->print($B2H->done); ++ 1; ++} ++ ++#------------------------------ ++# ++# last_preamble ++# ++# Return the last preamble as ref to array of lines. ++# Gets reset by decode_it(). ++# ++sub last_preamble { ++ my $self = shift; ++ return $self->{MDU_Preamble} || []; ++} ++ ++#------------------------------ ++# ++# last_mode ++# ++# Return the last mode. ++# Gets reset to undef by decode_it(). ++# ++sub last_mode { ++ shift->{MDU_Mode}; ++} ++ ++#------------------------------ ++# ++# last_filename ++# ++# Return the last filename. ++# Gets reset by decode_it(). ++# ++sub last_filename { ++ shift->{MDU_File} || undef; #[]; ++} ++ ++#------------------------------ ++1; +--- lib/MIME/Decoder.pm.orig Sun Aug 1 22:44:50 2004 ++++ lib/MIME/Decoder.pm Sun Aug 1 22:45:10 2004 +@@ -111,6 +111,7 @@ + 'quoted-printable' => 'MIME::Decoder::QuotedPrint', + + ### Non-standard... ++ 'binhex' => 'MIME::Decoder::BinHex', + 'x-uu' => 'MIME::Decoder::UU', + 'x-uuencode' => 'MIME::Decoder::UU', + +--- lib/MIME/Parser.pm Tue Aug 31 18:54:05 2004 ++++ lib/MIME/Parser.pm Tue Aug 31 18:53:33 2004 +@@ -799,10 +802,11 @@ + $self->debug("extract uuencode? ", $self->extract_uuencode); + $self->debug("encoding? ", $encoding); + $self->debug("effective type? ", $ent->effective_type); ++ + if ($self->extract_uuencode and + ($encoding =~ /^(7bit|8bit|binary)\Z/) and +- ($ent->effective_type =~ m{^text/plain\Z})) { +- ++ ($ent->effective_type =~ ++ m{^(?:text/plain|application/mac-binhex40|application/mac-binhex)\Z})) { + ### Hunt for it: + my $uu_ent = eval { $self->hunt_for_uuencode($ENCODED, $ent) }; + if ($uu_ent) { ### snark +@@ -842,14 +844,21 @@ + # + sub hunt_for_uuencode { + my ($self, $ENCODED, $ent) = @_; +- my $good; ++ my ($good, $jkfis); + local $_; + $self->debug("sniffing around for UUENCODE"); + + ### Heuristic: + $ENCODED->seek(0,0); + while (defined($_ = $ENCODED->getline)) { +- last if ($good = /^begin [0-7]{3}/); ++ if ($good = /^begin [0-7]{3}/) { ++ $jkfis = 'uu'; ++ last; ++ } ++ if ($good = /^\(This file must be converted with/i) { ++ $jkfis = 'binhex'; ++ last; ++ } + } + $good or do { $self->debug("no one made the cut"); return 0 }; + +@@ -860,7 +869,9 @@ + + ### Made the first cut; on to the real stuff: + $ENCODED->seek(0,0); +- my $decoder = MIME::Decoder->new('x-uuencode'); ++ my $decoder = MIME::Decoder->new(($jkfis eq 'uu')?'x-uuencode' ++ :'binhex'); ++ $self->whine("Found a $jkfis attachment"); + my $pre; + while (1) { + my @bin_data; +@@ -910,12 +921,11 @@ + + ### Did we get anything? + @parts or return undef; +- + ### Set the parts and a nice preamble: + $top_ent->parts(\@parts); + $top_ent->preamble + (["The following is a multipart MIME message which was extracted\n", +- "from a uuencoded message.\n"]); ++ "from a $jkfis-encoded message.\n"]); + $top_ent; + } + Index: files/patch-Parser-MaxParts =================================================================== RCS file: files/patch-Parser-MaxParts diff -N files/patch-Parser-MaxParts --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/patch-Parser-MaxParts 31 Aug 2004 18:06:53 -0000 @@ -0,0 +1,81 @@ +--- lib/MIME/Parser.pm.orig Tue Aug 31 18:54:05 2004 ++++ lib/MIME/Parser.pm Tue Aug 31 18:53:33 2004 +@@ -250,6 +250,7 @@ + $self->{MP5_IgnoreErrors} = 1; + $self->{MP5_UseInnerFiles} = 0; + $self->{MP5_UUDecode} = 0; ++ $self->{MP5_MaxParts} = -1; + + $self->interface(ENTITY_CLASS => 'MIME::Entity'); + $self->interface(HEAD_CLASS => 'MIME::Head'); +@@ -277,6 +278,7 @@ + $self->{MP5_Filer}->results($self->{MP5_Results}); + $self->{MP5_Filer}->init_parse(); + $self->{MP5_Filer}->purgeable([]); ### just to be safe ++ $self->{MP5_NumParts} = 0; + 1; + } + +@@ -969,11 +980,19 @@ + # Retype => retype this part to the given content-type + # + # Return the entity. +-# Fatal exception on failure. ++# Fatal exception on failure. Returns undef if message to complex + # + sub process_part { + my ($self, $in, $rdr, %p) = @_; + ++ if ($self->{MP5_MaxParts} > 0) { ++ $self->{MP5_NumParts}++; ++ if ($self->{MP5_NumParts} > $self->{MP5_MaxParts}) { ++ # Return UNDEF if msg too complex ++ return undef; ++ } ++ } ++ + $rdr ||= MIME::Parser::Reader->new; + #debug "process_part"; + $self->results->level(+1); +@@ -1094,6 +1112,8 @@ + + Returns the parsed MIME::Entity on success. + Throws exception on failure. ++If the message contained too many ++parts (as set by I<max_parts>), returns undef. + + =cut + +@@ -1351,6 +1371,32 @@ + my $self = shift; + &MIME::Tools::whine("evil_filename deprecated in MIME::Parser"); + $self->filer->evil_filename(@_); ++} ++ ++#------------------------------ ++ ++=item max_parts NUM ++ ++I<Instance method.> ++Limits the number of MIME parts we will parse. ++ ++Normally, instances of this class parse a message to the bitter end. ++Messages with many MIME parts can cause excessive memory consumption. ++If you invoke this method, parsing will abort with a die() if a message ++contains more than NUM parts. ++ ++If NUM is set to -1 (the default), then no maximum limit is enforced. ++ ++With no argument, returns the current setting as an integer ++ ++=cut ++ ++sub max_parts { ++ my($self, $num) = @_; ++ if (@_ > 1) { ++ $self->{MP5_MaxParts} = $num; ++ } ++ return $self->{MP5_MaxParts}; + } + + #------------------------------ Index: files/patch-ParserUndef =================================================================== RCS file: files/patch-ParserUndef diff -N files/patch-ParserUndef --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/patch-ParserUndef 31 Aug 2004 18:06:53 -0000 @@ -0,0 +1,43 @@ +--- lib/MIME/Parser.pm Tue Aug 31 18:54:05 2004 ++++ lib/MIME/Parser.pm Tue Aug 31 18:53:33 2004 +@@ -708,6 +710,7 @@ + + ### Parse the next part, and add it to the entity... + my $part = $self->process_part($in, $part_rdr, Retype=>$retype); ++ return undef unless defined($part); + $ent->add_part($part); + + ### ...and look at how we finished up: +@@ -944,6 +954,7 @@ + + ### Parse the message: + my $msg = $self->process_part($in, $rdr); ++ return undef unless defined($msg); + + ### How to handle nested messages? + if ($self->extract_nested_messages eq 'REPLACE') { +@@ -1005,14 +1024,14 @@ + + ### Handle, according to the MIME type: + if ($type eq 'multipart') { +- $self->process_multipart($in, $rdr, $ent); ++ return undef unless defined($self->process_multipart($in, $rdr, $ent)); + } + elsif (("$type/$subtype" eq "message/rfc822" || + "$type/$subtype" eq "message/external-body" || + ("$type/$subtype" eq "message/partial" && $head->mime_attr("content-type.number") == 1)) && + $self->extract_nested_messages) { + $self->debug("attempting to process a nested message"); +- $self->process_message($in, $rdr, $ent); ++ return undef unless defined($self->process_message($in, $rdr, $ent)); + } + else { + $self->process_singlepart($in, $rdr, $ent); +@@ -1080,7 +1080,6 @@ + =back + + Returns the parsed MIME::Entity on success. +-Throws exception on failure. + + =cut + --0-923124273-1093976058=:6407 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="MIMETools.diff" Content-Transfer-Encoding: BASE64 Content-ID: <20040831201418.O6407@cvs.imp.ch> Content-Description: Content-Disposition: ATTACHMENT; FILENAME="MIMETools.diff" SW5kZXg6IE1ha2VmaWxlDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1Mg ZmlsZTogL2hvbWUvcGN2cy9wb3J0cy9tYWlsL3A1LU1JTUUtVG9vbHMvTWFr ZWZpbGUsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjI3DQpkaWZmIC11IC1y MS4yNyBNYWtlZmlsZQ0KLS0tIE1ha2VmaWxlCTE5IE5vdiAyMDAzIDEwOjAw OjQ1IC0wMDAwCTEuMjcNCisrKyBNYWtlZmlsZQkzMSBBdWcgMjAwNCAxODow Njo1MyAtMDAwMA0KQEAgLTcsOCArNyw4IEBADQogDQogUE9SVE5BTUU9CXA1 LU1JTUUtVG9vbHMNCiBQT1JUVkVSU0lPTj0JNS40MTFhDQotUE9SVFJFVklT SU9OPQkzDQotUE9SVEVQT0NIPQkxDQorUE9SVFJFVklTSU9OPQk0DQorUE9S VEVQT0NIPQkyDQogQ0FURUdPUklFUz0JbWFpbCBwZXJsNQ0KIE1BU1RFUl9T SVRFUz0JJHtNQVNURVJfU0lURV9QRVJMX0NQQU59DQogTUFTVEVSX1NJVEVf U1VCRElSPQlNSU1FDQpAQCAtMTgsNyArMTgsOSBAQA0KIENPTU1FTlQ9CUEg c2V0IG9mIHBlcmw1IG1vZHVsZXMgZm9yIE1JTUUNCiANCiBCVUlMRF9ERVBF TkRTPQkke1NJVEVfUEVSTH0vTWFpbC9IZWFkZXIucG06JHtQT1JUU0RJUn0v bWFpbC9wNS1NYWlsLVRvb2xzIFwNCi0JCSR7U0lURV9QRVJMfS9JTy9XcmFw LnBtOiR7UE9SVFNESVJ9L2RldmVsL3A1LUlPLXN0cmluZ3kNCisJCSR7U0lU RV9QRVJMfS9JTy9XcmFwLnBtOiR7UE9SVFNESVJ9L2RldmVsL3A1LUlPLXN0 cmluZ3kgXA0KKwkJJHtTSVRFX1BFUkx9L0NvbnZlcnQvQmluSGV4LnBtOiR7 UE9SVFNESVJ9L2NvbnZlcnRlcnMvcDUtQ29udmVydC1CaW5IZXggXA0KKwkJ JHtTSVRFX1BFUkx9LyR7UEVSTF9BUkNIfS9NSU1FL0Jhc2U2NC5wbToke1BP UlRTRElSfS9jb252ZXJ0ZXJzL3A1LU1JTUUtQmFzZTY0DQogUlVOX0RFUEVO RFM9CSR7QlVJTERfREVQRU5EU30NCiANCiBQRVJMX0NPTkZJR1VSRT0JWUVT DQpAQCAtNDgsOSArNTAsNiBAQA0KIA0KIC5pbmNsdWRlIDxic2QucG9ydC5w cmUubWs+DQogDQotLmlmICR7UEVSTF9MRVZFTH0gPCA1MDA4MDANCi1CVUlM RF9ERVBFTkRTKz0JJHtTSVRFX1BFUkx9LyR7UEVSTF9BUkNIfS9NSU1FL0Jh c2U2NC5wbToke1BPUlRTRElSfS9jb252ZXJ0ZXJzL3A1LU1JTUUtQmFzZTY0 DQotLmVuZGlmDQogDQogcG9zdC1wYXRjaDoNCiAJQCR7Uk19IC1mICR7V1JL U1JDfS9saWIvTUlNRS9GaWVsZC9QYXJhbVZhbC5wbS5vcmlnIFwNCkluZGV4 OiBmaWxlcy9wYXRjaC03b3I4Yml0LmRpZmYNCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0NClJDUyBmaWxlOiBmaWxlcy9wYXRjaC03b3I4Yml0LmRpZmYNCmRp ZmYgLU4gZmlsZXMvcGF0Y2gtN29yOGJpdC5kaWZmDQotLS0gL2Rldi9udWxs CTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDANCisrKyBmaWxlcy9wYXRjaC03 b3I4Yml0LmRpZmYJMzEgQXVnIDIwMDQgMTg6MDY6NTMgLTAwMDANCkBAIC0w LDAgKzEsMjAgQEANCistLS0gbGliL01JTUUvSGVhZC5wbS5vcmlnCVNhdCBO b3YgIDQgMjA6NTQ6NDYgMjAwMA0KKysrKyBsaWIvTUlNRS9IZWFkLnBtCVdl ZCBBdWcgMjUgMTE6MTI6MjUgMjAwNA0KK0BAIC02ODUsMTEgKzY4NSwxNiBA QA0KKyAgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSAtLSB0aGF0IGlz LCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN0JJVCIgDQorICAgICBp cyBhc3N1bWVkIGlmIHRoZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGhl YWRlciBmaWVsZCBpcyBub3QgcHJlc2VudC4NCisgDQorK0kgZG8gb25lIG90 aGVyIGZvcm0gb2YgZml4dXA6ICI3X2JpdCIsICI3LWJpdCIsIGFuZCAiNyBi aXQiIGFyZQ0KKytjb3JyZWN0ZWQgdG8gIjdiaXQiOyBsaWtld2lzZSBmb3Ig IjhiaXQiLg0KKysNCisgPWN1dA0KKyANCisgc3ViIG1pbWVfZW5jb2Rpbmcg ew0KKyAgICAgbXkgJHNlbGYgPSBzaGlmdDsNCistICAgIGxjKCRzZWxmLT5t aW1lX2F0dHIoJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnKSB8fCAnN2Jp dCcpOw0KKysgICAgbXkgJGVuYyA9IGxjKCRzZWxmLT5taW1lX2F0dHIoJ2Nv bnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnKSB8fCAnN2JpdCcpOw0KKysgICAg JGVuYyA9fiBze14oWzc4XSlbIF8tXWJpdFxafXskMWJpdH07DQorKyAgICAk ZW5jOw0KKyB9DQorIA0KKyAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tDQpJbmRleDogZmlsZXMvcGF0Y2gtQmVuY2htYXJrDQo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09DQpSQ1MgZmlsZTogZmlsZXMvcGF0Y2gtQmVuY2htYXJr DQpkaWZmIC1OIGZpbGVzL3BhdGNoLUJlbmNobWFyaw0KLS0tIC9kZXYvbnVs bAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwDQorKysgZmlsZXMvcGF0Y2gt QmVuY2htYXJrCTMxIEF1ZyAyMDA0IDE4OjA2OjUzIC0wMDAwDQpAQCAtMCww ICsxLDg4IEBADQorLS0tIGxpYi9NSU1FL1BhcnNlci5wbS5vcmlnCVdlZCBB dWcgMjUgMTE6MTk6NDQgMjAwNA0KKysrKyBsaWIvTUlNRS9QYXJzZXIucG0J V2VkIEF1ZyAyNSAxMToyMzozOSAyMDA0DQorQEAgLTU4MiwxMCArNTgyLDcg QEANCisgICAgIG15ICgkc2VsZiwgJGluLCAkcmRyLCAkb3V0KSA9IEBfOyAg ICAgICAgDQorIA0KKyAgICAgIyMjIFBhcnNlOg0KKy0gICAgbXkgJGJtID0g YmVuY2htYXJrIHsNCistCSRyZHItPnJlYWRfY2h1bmsoJGluLCAkb3V0KTsN CistICAgIH07DQorLSAgICAkc2VsZi0+ZGVidWcoInQgYm91bmQ6ICRibSIp Ow0KKysgICAgJHJkci0+cmVhZF9jaHVuaygkaW4sICRvdXQpOw0KKyAgICAg MTsNCisgfQ0KKyANCitAQCAtODI4LDExICs4MjUsOCBAQA0KKyANCisgICAg ICMjIyBEZWNvZGUgYW5kIHNhdmUgdGhlIGJvZHkgKHVzaW5nIHRoZSBkZWNv ZGVyKToNCisgICAgIG15ICRERUNPREVEID0gJGJvZHktPm9wZW4oInciKSB8 fCBkaWUgIiRNRTogYm9keSBub3Qgb3BlbmVkOiAkIVxuIjsgDQorLSAgICBt eSAkYm0gPSBiZW5jaG1hcmsgew0KKy0JZXZhbCB7ICRkZWNvZGVyLT5kZWNv ZGUoJEVOQ09ERUQsICRERUNPREVEKTsgfTsgDQorLQkkQCBhbmQgJHNlbGYt PmVycm9yKCRAKTsNCistICAgIH07DQorLSAgICAkc2VsZi0+ZGVidWcoInQg ZGVjb2RlOiAkYm0iKTsNCisrICAgIGV2YWwgeyAkZGVjb2Rlci0+ZGVjb2Rl KCRFTkNPREVELCAkREVDT0RFRCk7IH07IA0KKysgICAgJEAgYW5kICRzZWxm LT5lcnJvcigkQCk7DQorICAgICAkREVDT0RFRC0+Y2xvc2U7DQorICAgICAN CisgICAgICMjIyBTdWNjZXNzISAgUmVtZW1iZXIgd2hlcmUgd2UgcHV0IHN0 dWZmOg0KK0BAIC0xMTM0LDExICsxMTI4LDggQEANCisgICAgIG15ICRlbnRp dHk7DQorICAgICBsb2NhbCAkLyA9ICJcbiI7ICAgICMjIyBqdXN0IHRvIGJl IHNhZmUNCisgDQorLSAgICBteSAkYm0gPSBiZW5jaG1hcmsgew0KKy0JJHNl bGYtPmluaXRfcGFyc2U7DQorLQkoJGVudGl0eSkgPSAkc2VsZi0+cHJvY2Vz c19wYXJ0KCRpbiwgdW5kZWYpOyAgIyMjIHBhcnNlIQ0KKy0gICAgfTsNCist ICAgICRzZWxmLT5kZWJ1ZygidCBwYXJzZTogJGJtIik7DQorKyAgICAkc2Vs Zi0+aW5pdF9wYXJzZTsNCisrICAgICgkZW50aXR5KSA9ICRzZWxmLT5wcm9j ZXNzX3BhcnQoJGluLCB1bmRlZik7ICAjIyMgcGFyc2UhDQorIA0KKyAgICAg JGVudGl0eTsNCisgfQ0KKy0tLSBsaWIvTUlNRS9Ub29scy5wbS5vcmlnCVdl ZCBBdWcgMjUgMTA6NDc6MzIgMjAwNA0KKysrKyBsaWIvTUlNRS9Ub29scy5w bQlXZWQgQXVnIDI1IDEwOjUwOjQxIDIwMDQNCitAQCAtMjQsNyArMjQsNyBA QA0KKyAgICAgJ2NvbmZpZycgID0+IFtxdyglQ09ORklHKV0sDQorICAgICAn bXNncycgICAgPT4gW3F3KHVzYWdlIGRlYnVnIHdoaW5lIGVycm9yKV0sDQor ICAgICAnbXNndHlwZXMnPT4gW3F3KCRNX0RFQlVHICRNX1dBUk5JTkcgJE1f RVJST1IpXSwJCQ0KKy0gICAgJ3V0aWxzJyAgID0+IFtxdyhiZW5jaG1hcmsg Y2F0ZmlsZSBzaGVsbHF1b3RlIHRleHR1YWxfdHlwZSB0bXBvcGVuICldLA0K KysgICAgJ3V0aWxzJyAgID0+IFtxdyhjYXRmaWxlIHNoZWxscXVvdGUgdGV4 dHVhbF90eXBlIHRtcG9wZW4gKV0sDQorICAgICApOw0KKyBFeHBvcnRlcjo6 ZXhwb3J0X29rX3RhZ3MoJ2NvbmZpZycsICdtc2dzJywgJ21zZ3R5cGVzJywg J3V0aWxzJyk7DQorIA0KK0BAIC0xNTMsMjYgKzE1Myw2IEBADQorIA0KKyAj LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorICMNCistIyBiZW5j aG1hcmsgQ09ERQ0KKy0jDQorLSMgUHJpdmF0ZSBiZW5jaG1hcmtpbmcgdXRp bGl0eS4NCistIw0KKy1zdWIgYmVuY2htYXJrKCYpIHsNCistICAgIG15ICgk Y29kZSkgPSBAXzsNCistICAgIGlmICgxKSB7DQorLQlteSAkdDAgPSBuZXcg QmVuY2htYXJrOw0KKy0JJiRjb2RlOw0KKy0JbXkgJHQxID0gbmV3IEJlbmNo bWFyazsNCistCXJldHVybiB0aW1lc3RyKHRpbWVkaWZmKCR0MSwgJHQwKSk7 DQorLSAgICB9DQorLSAgICBlbHNlIHsNCistCSYkY29kZTsNCistCXJldHVy biAiIjsNCistICAgIH0NCistfQ0KKy0NCistIy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQ0KKy0jDQorICMgY2F0ZmlsZSBESVIsIEZJTEUNCisg Iw0KKyAjIERpcmVjdG9yeS9maWxlIGNvbmNhdGVuYXRpb24uDQorQEAgLTEz OTQsNyArMTM3NCw2IEBADQorICAgICAgICBOZXdsaW5lcyBpbiB0aGUgdm9p ZA0KKyANCisgU3RhcnRlZCB1c2luZyBCZW5jaG1hcmsgZm9yIGJlbmNobWFy a2luZy4NCistDQorIA0KKyA9aXRlbSBWZXJzaW9uIDUuMjA1ICAgKDIwMDAv MDYvMDYpDQorIA0KSW5kZXg6IGZpbGVzL3BhdGNoLURlY29kZXItcXBkZWNv ZGUNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiBmaWxlcy9w YXRjaC1EZWNvZGVyLXFwZGVjb2RlDQpkaWZmIC1OIGZpbGVzL3BhdGNoLURl Y29kZXItcXBkZWNvZGUNCi0tLSAvZGV2L251bGwJMSBKYW4gMTk3MCAwMDow MDowMCAtMDAwMA0KKysrIGZpbGVzL3BhdGNoLURlY29kZXItcXBkZWNvZGUJ MzEgQXVnIDIwMDQgMTg6MDY6NTMgLTAwMDANCkBAIC0wLDAgKzEsMzAgQEAN CistLS0gbGliL01JTUUvRGVjb2Rlci9RdW90ZWRQcmludC5wbS5vcmlnCVR1 ZSBBdWcgMzEgMTc6MDI6NDMgMjAwNA0KKysrKyBsaWIvTUlNRS9EZWNvZGVy L1F1b3RlZFByaW50LnBtCVR1ZSBBdWcgMzEgMTc6MDI6MzggMjAwNA0KK0BA IC04NSw5ICs4NSwyNiBAQA0KKyAjDQorIHN1YiBkZWNvZGVfaXQgew0KKyAg ICAgbXkgKCRzZWxmLCAkaW4sICRvdXQpID0gQF87DQorKyAgICBteSAkaW5p dCA9IDA7DQorKyAgICBteSAkaGF2ZXBkZiA9IDA7DQorIA0KKyAgICAgd2hp bGUgKGRlZmluZWQoJF8gPSAkaW4tPmdldGxpbmUpKSB7DQorLQkkb3V0LT5w cmludChkZWNvZGVfcXAoJF8pKTsNCisrCWlmICghJGluaXQpIHsNCisrCQlp ZiAoJF8gPX4gL14lUERGLykgew0KKysJCQkkaW5pdCA9IDE7DQorKwkJCSRo YXZlcGRmID0gMTsNCisrCQl9DQorKwl9DQorKwlpZiAoJGhhdmVwZGYpIHsN CisrCQlteSAkb3V0cHV0ID0gJF87DQorKwkJJG91dHB1dCA9fiBzL1sgXHRd Kz8oXHI/XG4pLyQxL2c7ICAjIHJ1bGUgIzMgKHRyYWlsaW5nIHNwYWNlIG11 c3QgYmUgZGVsZXRlZCkNCisrCQkkb3V0cHV0ID1+IHMvPVxyP1xuLy9nOyAg ICAgICAgICAgICMgcnVsZSAjNSAoc29mdCBsaW5lIGJyZWFrcykNCisrCQkk b3V0cHV0ID1+IHMvKF58W15ccl0pXG5cWi8kMVxyXG4vOyAgIyBKS0YgcnVs ZSB0byByZXBsYWNlIHRyYWlsaW5nIFxuIHdpdGggXHJcbg0KKysJCSRvdXRw dXQgPX4gcy89KFtcZGEtZkEtRl17Mn0pL3BhY2soIkMiLCBoZXgoJDEpKS9n ZTsNCisrCQkkb3V0LT5wcmludCgkb3V0cHV0KTsNCisrCX0gZWxzZSB7DQor KwkJJG91dC0+cHJpbnQoZGVjb2RlX3FwKCRfKSk7DQorKwl9DQorICAgICB9 DQorICAgICAxOw0KKyB9DQpJbmRleDogZmlsZXMvcGF0Y2gtRGVjb2Rlci1x cGVuY29kZQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IGZp bGVzL3BhdGNoLURlY29kZXItcXBlbmNvZGUNCmRpZmYgLU4gZmlsZXMvcGF0 Y2gtRGVjb2Rlci1xcGVuY29kZQ0KLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcw IDAwOjAwOjAwIC0wMDAwDQorKysgZmlsZXMvcGF0Y2gtRGVjb2Rlci1xcGVu Y29kZQkzMSBBdWcgMjAwNCAxODowNjo1MyAtMDAwMA0KQEAgLTAsMCArMSwx MjggQEANCistLS0gbGliL01JTUUvRGVjb2Rlci9RdW90ZWRQcmludC5wbS5v cmlnCVdlZCBBdWcgMjUgMTE6NDY6NDUgMjAwNA0KKysrKyBsaWIvTUlNRS9E ZWNvZGVyL1F1b3RlZFByaW50LnBtCVdlZCBBdWcgMjUgMTE6NDg6MjcgMjAw NA0KK0BAIC01NCw3ICs1NCw3IEBADQorIA0KKyB1c2UgdmFycyBxdyhASVNB ICRWRVJTSU9OKTsNCisgdXNlIE1JTUU6OkRlY29kZXI7DQorLXVzZSBNSU1F OjpRdW90ZWRQcmludCAyLjAzOw0KKyt1c2UgTUlNRTo6UXVvdGVkUHJpbnQg My4wMzsNCisgDQorIEBJU0EgPSBxdyhNSU1FOjpEZWNvZGVyKTsNCisgDQor QEAgLTYzLDcgKzYzLDcgQEANCisgDQorICMtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0NCisgIw0KKy0jIGVuY29kZV9xcF9yZWFsbHkgU1RSSU5H DQorKyMgZW5jb2RlX3FwX3JlYWxseSBTVFJJTkcgVEVYVFVBTF9UWVBFX0ZM QUcNCisgIw0KKyAjIEVuY29kZSBRUCwgYW5kIHRoZW4gZm9sbG93IGd1aWRl bGluZSA4IGZyb20gUkZDIDIwNDkgKHRoYW5rcyB0byBEZW5pcyANCisgIyBO LiBBbnRvbmlvbGkpIHdoZXJlYnkgd2UgbWFrZSB0aGluZ3MgYSBsaXR0bGUg c2FmZXIgZm9yIHRoZSB0cmFuc3BvcnQNCitAQCAtNzEsNyArNzEsNyBAQA0K KyAjIGdyb3cgYmV5b25kIDc2IGNoYXJhY3RlcnMhDQorICMNCisgc3ViIGVu Y29kZV9xcF9yZWFsbHkgew0KKy0gICAgbXkgJGVuYyA9IGVuY29kZV9xcCgk X1swXSk7DQorKyAgICBteSAkZW5jID0gZW5jb2RlX3FwKHNoaWZ0LCB1bmRl Ziwgbm90IHNoaWZ0KTsNCisgICAgIGlmIChsZW5ndGgoJGVuYykgPCA3NCkg ew0KKyAJJGVuYyA9fiBzL15cLiQvPTJFL2c7ICAgICAgICAgIyBmb3JjZSBl bmNvZGluZyBvZiAvXlwuJC8NCisgCSRlbmMgPX4gcy9eRnJvbSAvPTQ2cm9t IC9nOyAgICMgZm9yY2UgZW5jb2Rpbmcgb2YgL15Gcm9tIC8NCitAQCAtOTcs MTAgKzk3LDEwIEBADQorICMgZW5jb2RlX2l0IElOLCBPVVQNCisgIw0KKyBz dWIgZW5jb2RlX2l0IHsNCistICAgIG15ICgkc2VsZiwgJGluLCAkb3V0KSA9 IEBfOw0KKysgICAgbXkgKCRzZWxmLCAkaW4sICRvdXQsICR0ZXh0dWFsX3R5 cGUpID0gQF87DQorIA0KKyAgICAgd2hpbGUgKGRlZmluZWQoJF8gPSAkaW4t PmdldGxpbmUpKSB7DQorLQkkb3V0LT5wcmludChlbmNvZGVfcXBfcmVhbGx5 KCRfKSk7DQorKwkkb3V0LT5wcmludChlbmNvZGVfcXBfcmVhbGx5KCRfLCAk dGV4dHVhbF90eXBlKSk7DQorICAgICB9DQorICAgICAxOw0KKyB9DQorLS0t IGxpYi9NSU1FL0RlY29kZXIucG0ub3JpZwlXZWQgQXVnIDI1IDExOjQ5OjQy IDIwMDQNCisrKysgbGliL01JTUUvRGVjb2Rlci5wbQlXZWQgQXVnIDI1IDEx OjUwOjI2IDIwMDQNCitAQCAtMjQ4LDE0ICsyNDgsMTQgQEANCisgPWN1dA0K KyANCisgc3ViIGVuY29kZSB7DQorLSAgICBteSAoJHNlbGYsICRpbiwgJG91 dCkgPSBAXzsNCisrICAgIG15ICgkc2VsZiwgJGluLCAkb3V0LCAkdGV4dHVh bF90eXBlKSA9IEBfOw0KKyAgICAgDQorICAgICAjIyMgQ29lcmNlIG9sZC1z dHlsZSBmaWxlaGFuZGxlcyB0byBsZWdpdCBvYmplY3RzLCBhbmQgZG8gaXQh DQorICAgICAkaW4gID0gd3JhcGhhbmRsZSgkaW4pOw0KKyAgICAgJG91dCA9 IHdyYXBoYW5kbGUoJG91dCk7DQorIA0KKyAgICAgIyMjIEludm9rZSBiYWNr LWVuZCBtZXRob2QgdG8gZG8gdGhlIHdvcms6DQorLSAgICAkc2VsZi0+ZW5j b2RlX2l0KCRpbiwgJG91dCkgfHwgDQorKyAgICAkc2VsZi0+ZW5jb2RlX2l0 KCRpbiwgJG91dCwgJHNlbGYtPmVuY29kaW5nIGVxICdxdW90ZWQtcHJpbnRh YmxlJyA/ICgkdGV4dHVhbF90eXBlKSA6ICgpKSB8fA0KKyAJZGllICIkTUU6 ICIuJHNlbGYtPmVuY29kaW5nLiIgZW5jb2RpbmcgZmFpbGVkXG4iOw0KKyB9 DQorIA0KKy0tLSBsaWIvTUlNRS9FbnRpdHkucG0ub3JpZwlXZWQgQXVnIDI1 IDExOjUwOjU0IDIwMDQNCisrKysgbGliL01JTUUvRW50aXR5LnBtCVdlZCBB dWcgMjUgMTE6NTE6MjUgMjAwNA0KK0BAIC0xODUzLDcgKzE4NTMsNyBAQA0K KyANCisgICAgICMjIyBPdXRwdXQgdGhlIGJvZHk6DQorICAgICBteSAkSU8g PSAkc2VsZi0+b3BlbigiciIpICAgICB8fCBkaWUgIm9wZW4gYm9keTogJCEi Ow0KKy0gICAgJGRlY29kZXItPmVuY29kZSgkSU8sICRvdXQpICAgfHwgcmV0 dXJuIGVycm9yICJlbmNvZGluZyBmYWlsZWQiOw0KKysgICAgJGRlY29kZXIt PmVuY29kZSgkSU8sICRvdXQsIHRleHR1YWxfdHlwZSgkc2VsZi0+aGVhZC0+ bWltZV90eXBlKSA/IDEgOiAwKSAgIHx8IGRpZSAiZW5jb2RpbmcgZmFpbGVk XG4iOw0KKyAgICAgJElPLT5jbG9zZTsNCisgICAgIDE7DQorIH0NCistLS0g bGliL01JTUUvRGVjb2Rlci9RdW90ZWRQcmludC5wbS5vcmlnCVRodSBBdWcg MjYgMTI6Mjg6MzcgMjAwNA0KKysrKyBsaWIvTUlNRS9EZWNvZGVyL1F1b3Rl ZFByaW50LnBtCVRodSBBdWcgMjYgMTI6Mjg6MjYgMjAwNA0KK0BAIC03Myw3 ICs3Myw3IEBADQorIHN1YiBlbmNvZGVfcXBfcmVhbGx5IHsNCisgICAgIG15 ICRlbmMgPSBlbmNvZGVfcXAoc2hpZnQsIHVuZGVmLCBub3Qgc2hpZnQpOw0K KyAgICAgaWYgKGxlbmd0aCgkZW5jKSA8IDc0KSB7DQorLQkkZW5jID1+IHMv XlwuJC89MkUvZzsgICAgICAgICAjIGZvcmNlIGVuY29kaW5nIG9mIC9eXC4k Lw0KKysJJGVuYyA9fiBzL15cLlxuLz0yRVxuL2c7ICAgICAgIyBmb3JjZSBl bmNvZGluZyBvZiAvXlwuJC8NCisgCSRlbmMgPX4gcy9eRnJvbSAvPTQ2cm9t IC9nOyAgICMgZm9yY2UgZW5jb2Rpbmcgb2YgL15Gcm9tIC8NCisgICAgIH0N CisgICAgICRlbmM7DQorLS0tIHQvTWlzYy50Lm9yaWcJU3VuIE1heSAyMSAw NzoxNToyNiAyMDAwDQorKysrIHQvTWlzYy50CVRodSBBdWcgMjYgMTI6MzQ6 MjcgMjAwNA0KK0BAIC02LDcgKzYsNyBAQA0KKyANCisgIyBDcmVhdGUgY2hl Y2tlcjoNCisgbXkgJFQgPSB0eXBpY2FsIEV4dFV0aWxzOjpUQm9uZTsNCist JFQtPmJlZ2luKDcpOw0KKyskVC0+YmVnaW4oMTIpOw0KKyANCisgIy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAjIEJ1ZyA5NzEwMDggZnJv bSBNaWNoYWVsIFcuIE5vcm1hbmRpbiA8bWljaGFlbC5ub3JtYW5kaW5AY3Nm Yi5jb20+Og0KK0BAIC02NywxMyArNjcsMjkgQEANCisgIyAgICAkcmVzID1+ IHMvXC4vPTJFL2dvOw0KKyAjICAgICRyZXMgPX4gcy9Gcm9tIC89NDZyb20g L2dvOw0KKyAjIGF0IHRoZSBzdGFydCBvZiBlbmNvZGVfcXBfcmVhbGx5IGlu IE1JTUU6OkRlY29kZXI6OlF1b3RlZFByaW50Pw0KKysjDQorKyMgVGV4dHVh bCBtb2RlLg0KKyt7DQorKyAgICB1c2UgTUlNRTo6RGVjb2Rlcjo6UXVvdGVk UHJpbnQ7DQorKyAgICBteSAkcGFpcjsNCisrICAgIGZvcmVhY2ggJHBhaXIg KFsiRnJvbSBtZSIsICAgIj00NnJvbSBtZT1cbiJdLA0KKysJCSAgIFsiLiIs ICAgICAgICAgIi49XG4iXSwgICMgc29mdCBsaW5lLWJyZWFrDQorKwkJICAg WyIuXG4iLCAgICAgICAiPTJFXG4iXSwgIyBsaW5lLWJyZWFrDQorKwkJICAg WyIgRnJvbSB5b3UiLCAiIEZyb20geW91PVxuIl0pIHsNCisrCW15ICRvdXQg PSBNSU1FOjpEZWNvZGVyOjpRdW90ZWRQcmludDo6ZW5jb2RlX3FwX3JlYWxs eSgkcGFpci0+WzBdLCAxKTsNCisrCSRULT5va19lcSgkb3V0LCAkcGFpci0+ WzFdLA0KKysJCSAgImJ1ZyA5NzA3MjUtRE5BOiBRUCB1c2Ugb2YgUkZDMjA0 OSBndWlkZWxpbmUgOCIpOw0KKysgICAgfQ0KKyt9DQorKyMgQmluYXJ5IG1v ZGUNCisgew0KKyAgICAgdXNlIE1JTUU6OkRlY29kZXI6OlF1b3RlZFByaW50 Ow0KKyAgICAgbXkgJHBhaXI7DQorLSAgICBmb3JlYWNoICRwYWlyIChbIkZy b20gbWUiLCAgICI9NDZyb20gbWUiXSwNCistCQkgICBbIi4iLCAgICAgICAg ICI9MkUiXSwNCistCQkgICBbIiBGcm9tIHlvdSIsICIgRnJvbSB5b3UiXSkg ew0KKy0JbXkgJG91dCA9IE1JTUU6OkRlY29kZXI6OlF1b3RlZFByaW50Ojpl bmNvZGVfcXBfcmVhbGx5KCRwYWlyLT5bMF0pOw0KKysgICAgZm9yZWFjaCAk cGFpciAoWyJGcm9tIG1lIiwgICAiPTQ2cm9tIG1lPVxuIl0sDQorKwkJICAg WyIuIiwgICAgICAgICAiLj1cbiJdLCAgICAgIyBzb2Z0IGxpbmUtYnJlYWsN CisrCQkgICBbIi5cbiIsICAgICAgICIuPTBBPVxuIl0sICAjIGxpbmUtYnJl YWsNCisrCQkgICBbIiBGcm9tIHlvdSIsICIgRnJvbSB5b3U9XG4iXSkgew0K KysJbXkgJG91dCA9IE1JTUU6OkRlY29kZXI6OlF1b3RlZFByaW50OjplbmNv ZGVfcXBfcmVhbGx5KCRwYWlyLT5bMF0sIDApOw0KKyAJJFQtPm9rX2VxKCRv dXQsICRwYWlyLT5bMV0sDQorIAkJICAiYnVnIDk3MDcyNS1ETkE6IFFQIHVz ZSBvZiBSRkMyMDQ5IGd1aWRlbGluZSA4Iik7DQorICAgICB9DQpJbmRleDog ZmlsZXMvcGF0Y2gtRmlsZXIucG0td2hpdGVzcGFjZQ0KPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQ0KUkNTIGZpbGU6IGZpbGVzL3BhdGNoLUZpbGVyLnBtLXdo aXRlc3BhY2UNCmRpZmYgLU4gZmlsZXMvcGF0Y2gtRmlsZXIucG0td2hpdGVz cGFjZQ0KLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAw DQorKysgZmlsZXMvcGF0Y2gtRmlsZXIucG0td2hpdGVzcGFjZQkzMSBBdWcg MjAwNCAxODowNjo1MyAtMDAwMA0KQEAgLTAsMCArMSwyMyBAQA0KKy0tLSBs aWIvTUlNRS9QYXJzZXIvRmlsZXIucG0JVGh1IE5vdiAyMyAwNjowNDowMyAy MDAwDQorKysrIGxpYi9NSU1FL1BhcnNlci9GaWxlci5wbQlUaHUgQXVnIDI2 IDAwOjQyOjE4IDIwMDQNCitAQCAtMzU3LDggKzM1Nyw5IEBADQorICAgICAk c2VsZi0+ZGVidWcoImlzIHRoaXMgZXZpbD8gJyRuYW1lJyIpOw0KKyANCisg ICAgIHJldHVybiAxIGlmICghZGVmaW5lZCgkbmFtZSkgb3IgKCRuYW1lIGVx ICcnKSk7ICAgIyMjIGVtcHR5DQorKyAgICByZXR1cm4gMSBpZiAoJG5hbWUg PX4gbXsoXlxzKXwoXHMrXFopfSk7ICAjIyMgbGVhZGluZy90cmFpbGluZyB3 aGl0ZXNwYWNlDQorICAgICByZXR1cm4gMSBpZiAoJG5hbWUgPX4gbXteXC4r XFp9KTsgICAgICAgICAjIyMgZG90cw0KKy0gICAgcmV0dXJuIDEgaWYgKCRu YW1lID1+IHRye1xcLzpbXX17fSk7ICAgICAgIyMjIHBhdGggY2hhcmFjdGVy cw0KKysgICAgcmV0dXJuIDEgaWYgKCRuYW1lID1+IC8oKD86W1xbXF1cXFwv XDxcPlx8XD9cKlw6XCJdfFxwe0lzQ250cmx9KSkvKTsgIyMjIHBhdGggb3Ig c3BlY2lhbCBjaGFyYWN0ZXJzDQorICAgICByZXR1cm4gMSBpZiAoJHNlbGYt PntNUEZfTWF4TmFtZX0gYW5kIA0KKyAJCSAobGVuZ3RoKCRuYW1lKSA+ICRz ZWxmLT57TVBGX01heE5hbWV9KSk7DQorICAgICANCitAQCAtNDAyLDYgKzQw Myw5IEBADQorICAgICBteSAoJHJvb3QsICRleHQpID0gKCgkbGFzdCA9fiAv XiguKilcLihbXlwuXSspXFovKSANCisgCQkJPyAoJDEsICQyKQ0KKyAJCQk6 ICgkbGFzdCwgJycpKTsNCisrICAgICMjIyBEZWxldGUgbGVhZGluZyBhbmQg dHJhaWxpbmcgd2hpdGVzcGFjZQ0KKysgICAgJHJvb3QgPX4gcy9eXHMrLy87 DQorKyAgICAkZXh0ICA9fiBzL1xzKyQvLzsNCisgICAgICRyb290ID0gc3Vi c3RyKCRyb290LCAwLCAoJHNlbGYtPntNUEZfVHJpbVJvb3R9IHx8IDE0KSk7 DQorICAgICAkZXh0ICA9IHN1YnN0cigkZXh0LCAgMCwgKCRzZWxmLT57TVBG X1RyaW1FeHR9ICB8fCAgMykpOw0KKyAgICAgJGV4dCA9fiAvXlx3KyQvIG9y ICRleHQgPSAiZGF0IjsNCkluZGV4OiBmaWxlcy9wYXRjaC1QYXJzZXItQmlu SGV4DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogZmlsZXMv cGF0Y2gtUGFyc2VyLUJpbkhleA0KZGlmZiAtTiBmaWxlcy9wYXRjaC1QYXJz ZXItQmluSGV4DQotLS0gL2Rldi9udWxsCTEgSmFuIDE5NzAgMDA6MDA6MDAg LTAwMDANCisrKyBmaWxlcy9wYXRjaC1QYXJzZXItQmluSGV4CTMxIEF1ZyAy MDA0IDE4OjA2OjUzIC0wMDAwDQpAQCAtMCwwICsxLDI2MCBAQA0KKy0tLSAv ZGV2L251bGwJU3VuIEF1ZyAgMSAyMjo0NDowMiAyMDA0DQorKysrIGxpYi9N SU1FL0RlY29kZXIvQmluSGV4LnBtCVN1biBBdWcgIDEgMjI6NDM6MTIgMjAw NA0KK0BAIC0wLDAgKzEsMTgyIEBADQorK3BhY2thZ2UgTUlNRTo6RGVjb2Rl cjo6QmluSGV4Ow0KKysNCisrDQorKz1oZWFkMSBOQU1FDQorKw0KKytNSU1F OjpEZWNvZGVyOjpCaW5IZXggLSBkZWNvZGUgYSAiYmluaGV4IiBzdHJlYW0N CisrDQorKw0KKys9aGVhZDEgU1lOT1BTSVMNCisrDQorK0EgZ2VuZXJpYyBk ZWNvZGVyIG9iamVjdDsgc2VlIEw8TUlNRTo6RGVjb2Rlcj4gZm9yIHVzYWdl Lg0KKysNCisrQWxzbyBzdXBwb3J0cyBhIHByZWFtYmxlKCkgbWV0aG9kIHRv IHJlY292ZXIgdGV4dCBiZWZvcmUNCisrdGhlIGJpbmhleGVkIHBvcnRpb24g b2YgdGhlIHN0cmVhbS4NCisrDQorKw0KKys9aGVhZDEgREVTQ1JJUFRJT04N CisrDQorK0EgTUlNRTo6RGVjb2RlciBzdWJjbGFzcyBmb3IgYSBub25zdGFu ZGFyZCBlbmNvZGluZyB3aGVyZWJ5DQorK2RhdGEgYXJlIGJpbmhleC1lbmNv ZGVkLiAgQ29tbW9uIG5vbi1zdGFuZGFyZCBNSU1FIGVuY29kaW5ncyBmb3Ig dGhpczoNCisrDQorKyAgICB4LXV1DQorKyAgICB4LXV1ZW5jb2RlDQorKw0K KysNCisrPWhlYWQxIEFVVEhPUg0KKysNCisrSnVsaWFuIEZpZWxkIChGPG1h aWxzY2FubmVyQGVjcy5zb3Rvbi5hYy51az4pLg0KKysNCisrQWxsIHJpZ2h0 cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSANCisraXQgYW5kL29yIG1vZGlmeSBpdCB1 bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4NCisrDQorKz1o ZWFkMSBWRVJTSU9ODQorKw0KKyskUmV2aXNpb246IDEuMSAkICREYXRlOiAy MDA0LzA4LzAxIDIwOjQ2OjE3ICQNCisrDQorKz1jdXQNCisrDQorKw0KKyty ZXF1aXJlIDUuMDAyOw0KKyt1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsN CisrdXNlIE1JTUU6OkRlY29kZXI7DQorK3VzZSBNSU1FOjpUb29scyBxdyh3 aGluZSk7DQorK3VzZSBDb252ZXJ0OjpCaW5IZXg7DQorKw0KKytASVNBID0g cXcoTUlNRTo6RGVjb2Rlcik7DQorKw0KKysjIFRoZSBwYWNrYWdlIHZlcnNp b24sIGJvdGggaW4gMS4yMyBzdHlsZSAqYW5kKiB1c2FibGUgYnkgTWFrZU1h a2VyOg0KKyskVkVSU0lPTiA9IHN1YnN0ciBxJFJldmlzaW9uOiAxLjEgJCwg MTA7DQorKw0KKysNCisrIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQ0KKysjDQorKyMgZGVjb2RlX2l0IElOLCBPVVQNCisrIw0KKytzdWIgZGVj b2RlX2l0IHsNCisrICAgIG15ICgkc2VsZiwgJGluLCAkb3V0KSA9IEBfOw0K KysgICAgbXkgKCRtb2RlLCAkZmlsZSk7DQorKyAgICBteSAoQHByZWFtYmxl LCBAZGF0YSk7DQorKyAgICBsb2NhbCAkXzsNCisrICAgIG15ICRIMkIgPSBD b252ZXJ0OjpCaW5IZXgtPmhleDJiaW47DQorKyAgICAjbXkgJEgyQiA9IENv bnZlcnQ6OkJpbkhleC0+b3BlbigkaW4pOw0KKysgICAgbXkgJGxpbmU7DQor Kw0KKysgICAgJHNlbGYtPntNRFVfUHJlYW1ibGV9ID0gXEBwcmVhbWJsZTsN CisrICAgICRzZWxmLT57TURVX01vZGV9ID0gJzYwMCc7DQorKyAgICAkc2Vs Zi0+e01EVV9GaWxlfSA9IHVuZGVmOw0KKysNCisrICAgICMjIyBGaW5kIGJl Z2lubmluZy4uLg0KKysgICAgJE1haWxTY2FubmVyOjpCaW5IZXg6OklubGlu ZSA9IDE7DQorKyAgICBpZiAoJE1haWxTY2FubmVyOjpCaW5IZXg6OklubGlu ZSkgew0KKysgICAgICB3aGlsZSAoZGVmaW5lZCgkXyA9ICRpbi0+Z2V0bGlu ZSkpIHsNCisrICAgICAgICAjcHJpbnQgU1RERVJSICJMaW5lIGlzIFwiJF9c IlxuIjsNCisrICAgICAgICBpZiAoL15cKFRoaXMgZmlsZSBtdXN0IGJlIGNv bnZlcnRlZC8pIHsNCisrICAgICAgICAgICRfID0gJGluLT5nZXRsaW5lOw0K KysgICAgICAgICAgbGFzdCBpZiAvXjovOw0KKysgICAgICAgIH0NCisrICAg ICAgICBwdXNoIEBwcmVhbWJsZSwgJF87DQorKyAgICAgIH0NCisrICAgICAg ZGllKCJiaW5oZXggZGVjb2Rpbmc6IGZlbGwgb2ZmIGVuZCBvZiBmaWxlXG4i KSBpZiAhZGVmaW5lZCgkXyk7DQorKyAgICB9IGVsc2Ugew0KKysgICAgICB3 aGlsZSAoZGVmaW5lZCgkXyA9ICRpbi0+Z2V0bGluZSkpIHsNCisrICAgICAg ICAjIEZvdW5kIHRoZSBoZWFkZXI/IFNvIHN0YXJ0IGRlY29kaW5nIGl0DQor KyAgICAgICAgbGFzdCBpZiAvXjovOw0KKysgICAgICAgIHB1c2ggQHByZWFt YmxlLCAkXzsNCisrICAgICAgfQ0KKysgICAgICAjIyBoaXQgZW9mIQ0KKysg ICAgICBkaWUoImJpbmhleCBkZWNvZGluZzogbm8gVGhpcyBmaWxlIG11c3Qg YmUuLi4gZm91bmRcbiIpIGlmICFkZWZpbmVkKCRfKTsNCisrICAgIH0NCisr DQorKyAgICAjIyMgRGVjb2RlOg0KKysgICAgIyBEb24ndCByZWx5IG9uIHRo ZSBjb21tZW50IGFsd2F5cyBiZWluZyB0aGVyZQ0KKysgICAgIyRzZWxmLT53 aGluZSgiOkgyQiBpcyAkSDJCXG4iKTsNCisrICAgICMkc2VsZi0+d2hpbmUo IkhlYWRlciBpcyAiIC4gJEgyQi0+cmVhZF9oZWFkZXIgLiAiXG4iKTsNCisr ICAgICNAZGF0YSA9ICRIMkItPnJlYWRfZGF0YTsNCisrICAgICMkb3V0LT5w cmludChAZGF0YSk7DQorKyAgICAjcHJpbnQgU1RERVJSICJFbmQgb2YgYmlu aGV4IHN0cmVhbVxuIjsNCisrICAgICNyZXR1cm4gMTsNCisrICAgICNpZiAo L146Lykgew0KKysgICAgbXkgJGRhdGE7DQorKyAgICAkZGF0YSA9ICRIMkIt Pm5leHQoJF8pOyAjIG9yIHdoaW5lKCJOZXh0IGVycm9yIGlzICRAICQhXG4i KTsNCisrICAgICNwcmludCBTVERFUlIgIkRhdGEgbGluZSAxIGlzIGxlbmd0 aCBcIiIgLiBsZW5ndGgoJGRhdGEpIC4gIlwiIFwiJGRhdGFcIlxuIjsNCisr ICAgIG15ICRsZW4gPSB1bnBhY2soIkMiLCAkZGF0YSk7DQorKyAgICB3aGls ZSAoJGxlbiA+IGxlbmd0aCgkZGF0YSkrMjEgJiYgZGVmaW5lZCgkbGluZSA9 ICRpbi0+Z2V0bGluZSkpIHsNCisrICAgICAgJGRhdGEgLj0gJEgyQi0+bmV4 dCgkbGluZSk7DQorKyAgICB9DQorKyAgICAkZGF0YSA9IHN1YnN0cigkZGF0 YSwgMjIrJGxlbik7DQorKyAgICAkb3V0LT5wcmludCgkZGF0YSk7DQorKyAg ICAjfQ0KKysgICAgd2hpbGUgKGRlZmluZWQoJF8gPSAkaW4tPmdldGxpbmUp KSB7DQorKyAgICAgICAgJGxpbmUgPSAkXzsNCisrICAgICAgICAkZGF0YSA9 ICRIMkItPm5leHQoJGxpbmUpOw0KKysgICAgICAgICNwcmludCBTVERFUlIg IkRhdGEgaXMgbGVuZ3RoICIgLiBsZW5ndGgoJGRhdGEpIC4gIiBcIiRkYXRh XCJcbiI7DQorKyAgICAgICAgJG91dC0+cHJpbnQoJGRhdGEpOw0KKysgICAg ICAgICNjaG9tcCAkbGluZTsNCisrICAgICAgICAjcHJpbnQgU1RERVJSICJM aW5lIGlzIGxlbmd0aCAiIC4gbGVuZ3RoKCRsaW5lKSAuICIgXCIkbGluZVwi XG4iOw0KKysgICAgICAgICNwcmludCBTVERFUlIgIkxpbmUgbWF0Y2hlcyBl bmRcbiIgaWYgJGxpbmUgPX4gLzokLzsNCisrICAgICAgICBsYXN0IGlmICRs aW5lID1+IC86JC87DQorKyAgICB9DQorKyAgICAjcHJpbnQgU1RERVJSICJC cm9rZW4gb3V0IG9mIGxvb3BcbiI7DQorKyAgICAjcHJpbnQgU1RERVJSICJm aWxlIGluY29tcGxldGUsIG5vIGVuZCBmb3VuZFxuIiBpZiAhZGVmaW5lZCgk Xyk7ICMgZW9mDQorKyAgICAxOw0KKyt9DQorKw0KKysjLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQorKyMNCisrIyBlbmNvZGVfaXQgSU4sIE9V VA0KKysjDQorK3N1YiBlbmNvZGVfaXQgew0KKysgICAgbXkgKCRzZWxmLCAk aW4sICRvdXQpID0gQF87DQorKyAgICBteSAkbGluZTsNCisrICAgIG15ICRi dWYgPSAnJzsNCisrDQorKyAgICBteSAkZm5hbWUgPSAoKCRzZWxmLT5oZWFk ICYmIA0KKysJCSAgJHNlbGYtPmhlYWQtPm1pbWVfYXR0cignY29udGVudC1k aXNwb3NpdGlvbi5maWxlbmFtZScpKSB8fA0KKysJCSAnJyk7DQorKyAgICBt eSAkQjJIID0gQ29udmVydDo6QmluSGV4LT5iaW4yaGV4Ow0KKysgICAgJG91 dC0+cHJpbnQoIihUaGlzIGZpbGUgbXVzdCBiZSBjb252ZXJ0ZWQgd2l0aCBC aW5IZXggNC4wKVxuIik7DQorKyAgICAjd2hpbGUgKGRlZmluZWQoJGxpbmUg PSA8JGluPikpIHsNCisrICAgIHdoaWxlICgkaW4tPnJlYWQoJGJ1ZiwgMTAw MCkpIHsNCisrICAgICAgJG91dC0+cHJpbnQoJEIySC0+bmV4dCgkYnVmKSk7 DQorKyAgICB9DQorKyAgICAkb3V0LT5wcmludCgkQjJILT5kb25lKTsNCisr ICAgIDE7DQorK30NCisrDQorKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0NCisrIw0KKysjIGxhc3RfcHJlYW1ibGUNCisrIw0KKysjIFJldHVy biB0aGUgbGFzdCBwcmVhbWJsZSBhcyByZWYgdG8gYXJyYXkgb2YgbGluZXMu DQorKyMgR2V0cyByZXNldCBieSBkZWNvZGVfaXQoKS4NCisrIw0KKytzdWIg bGFzdF9wcmVhbWJsZSB7DQorKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKysg ICAgcmV0dXJuICRzZWxmLT57TURVX1ByZWFtYmxlfSB8fCBbXTsNCisrfQ0K KysNCisrIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKysjDQor KyMgbGFzdF9tb2RlDQorKyMNCisrIyBSZXR1cm4gdGhlIGxhc3QgbW9kZS4N CisrIyBHZXRzIHJlc2V0IHRvIHVuZGVmIGJ5IGRlY29kZV9pdCgpLg0KKysj DQorK3N1YiBsYXN0X21vZGUgew0KKysgICAgc2hpZnQtPntNRFVfTW9kZX07 DQorK30NCisrDQorKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N CisrIw0KKysjIGxhc3RfZmlsZW5hbWUNCisrIw0KKysjIFJldHVybiB0aGUg bGFzdCBmaWxlbmFtZS4NCisrIyBHZXRzIHJlc2V0IGJ5IGRlY29kZV9pdCgp Lg0KKysjDQorK3N1YiBsYXN0X2ZpbGVuYW1lIHsNCisrICAgIHNoaWZ0LT57 TURVX0ZpbGV9IHx8IHVuZGVmOyAjW107DQorK30NCisrDQorKyMtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisrMTsNCistLS0gbGliL01JTUUv RGVjb2Rlci5wbS5vcmlnCVN1biBBdWcgIDEgMjI6NDQ6NTAgMjAwNA0KKysr KyBsaWIvTUlNRS9EZWNvZGVyLnBtCVN1biBBdWcgIDEgMjI6NDU6MTAgMjAw NA0KK0BAIC0xMTEsNiArMTExLDcgQEANCisgICAgICdxdW90ZWQtcHJpbnRh YmxlJyA9PiAnTUlNRTo6RGVjb2Rlcjo6UXVvdGVkUHJpbnQnLA0KKyANCisg ICAjIyMgTm9uLXN0YW5kYXJkLi4uDQorKyAgICAnYmluaGV4JyAgICAgPT4g J01JTUU6OkRlY29kZXI6OkJpbkhleCcsDQorICAgICAneC11dScgICAgICAg PT4gJ01JTUU6OkRlY29kZXI6OlVVJywNCisgICAgICd4LXV1ZW5jb2RlJyA9 PiAnTUlNRTo6RGVjb2Rlcjo6VVUnLA0KKyANCistLS0gbGliL01JTUUvUGFy c2VyLnBtCVR1ZSBBdWcgMzEgMTg6NTQ6MDUgMjAwNA0KKysrKyBsaWIvTUlN RS9QYXJzZXIucG0JVHVlIEF1ZyAzMSAxODo1MzozMyAyMDA0DQorQEAgLTc5 OSwxMCArODAyLDExIEBADQorICAgICAkc2VsZi0+ZGVidWcoImV4dHJhY3Qg dXVlbmNvZGU/ICIsICRzZWxmLT5leHRyYWN0X3V1ZW5jb2RlKTsNCisgICAg ICRzZWxmLT5kZWJ1ZygiZW5jb2Rpbmc/ICAgICAgICAgIiwgJGVuY29kaW5n KTsNCisgICAgICRzZWxmLT5kZWJ1ZygiZWZmZWN0aXZlIHR5cGU/ICAgIiwg JGVudC0+ZWZmZWN0aXZlX3R5cGUpOw0KKysNCisgICAgIGlmICgkc2VsZi0+ ZXh0cmFjdF91dWVuY29kZSBhbmQNCisgCSgkZW5jb2RpbmcgPX4gL14oN2Jp dHw4Yml0fGJpbmFyeSlcWi8pIGFuZA0KKy0JKCRlbnQtPmVmZmVjdGl2ZV90 eXBlID1+IG17XnRleHQvcGxhaW5cWn0pKSB7DQorLQkNCisrCSgkZW50LT5l ZmZlY3RpdmVfdHlwZSA9fiANCisrCQlte14oPzp0ZXh0L3BsYWlufGFwcGxp Y2F0aW9uL21hYy1iaW5oZXg0MHxhcHBsaWNhdGlvbi9tYWMtYmluaGV4KVxa fSkpIHsNCisgCSMjIyBIdW50IGZvciBpdDoNCisgCW15ICR1dV9lbnQgPSBl dmFsIHsgJHNlbGYtPmh1bnRfZm9yX3V1ZW5jb2RlKCRFTkNPREVELCAkZW50 KSB9Ow0KKyAJaWYgKCR1dV9lbnQpIHsgICAjIyMgc25hcmsNCitAQCAtODQy LDE0ICs4NDQsMjEgQEANCisgIw0KKyBzdWIgaHVudF9mb3JfdXVlbmNvZGUg ew0KKyAgICAgbXkgKCRzZWxmLCAkRU5DT0RFRCwgJGVudCkgPSBAXzsNCist ICAgIG15ICRnb29kOw0KKysgICAgbXkgKCRnb29kLCAkamtmaXMpOw0KKyAg ICAgbG9jYWwgJF87DQorICAgICAkc2VsZi0+ZGVidWcoInNuaWZmaW5nIGFy b3VuZCBmb3IgVVVFTkNPREUiKTsNCisgDQorICAgICAjIyMgSGV1cmlzdGlj Og0KKyAgICAgJEVOQ09ERUQtPnNlZWsoMCwwKTsNCisgICAgIHdoaWxlIChk ZWZpbmVkKCRfID0gJEVOQ09ERUQtPmdldGxpbmUpKSB7DQorLQlsYXN0IGlm ICgkZ29vZCA9IC9eYmVnaW4gWzAtN117M30vKTsNCisrICAgICAgICBpZiAo JGdvb2QgPSAvXmJlZ2luIFswLTddezN9Lykgew0KKysgICAgICAgICAgJGpr ZmlzID0gJ3V1JzsNCisrICAgICAgICAgIGxhc3Q7DQorKyAgICAgICAgfQ0K KysgICAgICAgIGlmICgkZ29vZCA9IC9eXChUaGlzIGZpbGUgbXVzdCBiZSBj b252ZXJ0ZWQgd2l0aC9pKSB7DQorKyAgICAgICAgICAkamtmaXMgPSAnYmlu aGV4JzsNCisrICAgICAgICAgIGxhc3Q7DQorKyAgICAgICAgfQ0KKyAgICAg fQ0KKyAgICAgJGdvb2Qgb3IgZG8geyAkc2VsZi0+ZGVidWcoIm5vIG9uZSBt YWRlIHRoZSBjdXQiKTsgcmV0dXJuIDAgfTsNCisgDQorQEAgLTg2MCw3ICs4 NjksOSBAQA0KKyANCisgICAgICMjIyBNYWRlIHRoZSBmaXJzdCBjdXQ7IG9u IHRvIHRoZSByZWFsIHN0dWZmOg0KKyAgICAgJEVOQ09ERUQtPnNlZWsoMCww KTsNCistICAgIG15ICRkZWNvZGVyID0gTUlNRTo6RGVjb2Rlci0+bmV3KCd4 LXV1ZW5jb2RlJyk7DQorKyAgICBteSAkZGVjb2RlciA9IE1JTUU6OkRlY29k ZXItPm5ldygoJGprZmlzIGVxICd1dScpPyd4LXV1ZW5jb2RlJw0KKysgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDonYmluaGV4Jyk7DQorKyAgICAkc2VsZi0+d2hpbmUoIkZvdW5kIGEg JGprZmlzIGF0dGFjaG1lbnQiKTsNCisgICAgIG15ICRwcmU7DQorICAgICB3 aGlsZSAoMSkgew0KKyAJbXkgQGJpbl9kYXRhOw0KK0BAIC05MTAsMTIgKzky MSwxMSBAQA0KKyANCisgICAgICMjIyBEaWQgd2UgZ2V0IGFueXRoaW5nPw0K KyAgICAgQHBhcnRzIG9yIHJldHVybiB1bmRlZjsNCistDQorICAgICAjIyMg U2V0IHRoZSBwYXJ0cyBhbmQgYSBuaWNlIHByZWFtYmxlOg0KKyAgICAgJHRv cF9lbnQtPnBhcnRzKFxAcGFydHMpOw0KKyAgICAgJHRvcF9lbnQtPnByZWFt YmxlDQorIAkoWyJUaGUgZm9sbG93aW5nIGlzIGEgbXVsdGlwYXJ0IE1JTUUg bWVzc2FnZSB3aGljaCB3YXMgZXh0cmFjdGVkXG4iLA0KKy0JICAiZnJvbSBh IHV1ZW5jb2RlZCBtZXNzYWdlLlxuIl0pOw0KKysgICAgICAgICAgImZyb20g YSAkamtmaXMtZW5jb2RlZCBtZXNzYWdlLlxuIl0pOw0KKyAgICAgJHRvcF9l bnQ7DQorIH0NCisgDQpJbmRleDogZmlsZXMvcGF0Y2gtUGFyc2VyLU1heFBh cnRzDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogZmlsZXMv cGF0Y2gtUGFyc2VyLU1heFBhcnRzDQpkaWZmIC1OIGZpbGVzL3BhdGNoLVBh cnNlci1NYXhQYXJ0cw0KLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAw OjAwIC0wMDAwDQorKysgZmlsZXMvcGF0Y2gtUGFyc2VyLU1heFBhcnRzCTMx IEF1ZyAyMDA0IDE4OjA2OjUzIC0wMDAwDQpAQCAtMCwwICsxLDgxIEBADQor LS0tIGxpYi9NSU1FL1BhcnNlci5wbS5vcmlnCVR1ZSBBdWcgMzEgMTg6NTQ6 MDUgMjAwNA0KKysrKyBsaWIvTUlNRS9QYXJzZXIucG0JVHVlIEF1ZyAzMSAx ODo1MzozMyAyMDA0DQorQEAgLTI1MCw2ICsyNTAsNyBAQA0KKyAgICAgJHNl bGYtPntNUDVfSWdub3JlRXJyb3JzfSAgICA9IDE7DQorICAgICAkc2VsZi0+ e01QNV9Vc2VJbm5lckZpbGVzfSAgID0gMDsNCisgICAgICRzZWxmLT57TVA1 X1VVRGVjb2RlfSAgICAgICAgPSAwOw0KKysgICAgJHNlbGYtPntNUDVfTWF4 UGFydHN9CSA9IC0xOw0KKyANCisgICAgICRzZWxmLT5pbnRlcmZhY2UoRU5U SVRZX0NMQVNTID0+ICdNSU1FOjpFbnRpdHknKTsNCisgICAgICRzZWxmLT5p bnRlcmZhY2UoSEVBRF9DTEFTUyAgID0+ICdNSU1FOjpIZWFkJyk7DQorQEAg LTI3Nyw2ICsyNzgsNyBAQA0KKyAgICAgJHNlbGYtPntNUDVfRmlsZXJ9LT5y ZXN1bHRzKCRzZWxmLT57TVA1X1Jlc3VsdHN9KTsNCisgICAgICRzZWxmLT57 TVA1X0ZpbGVyfS0+aW5pdF9wYXJzZSgpOw0KKyAgICAgJHNlbGYtPntNUDVf RmlsZXJ9LT5wdXJnZWFibGUoW10pOyAgICMjIyBqdXN0IHRvIGJlIHNhZmUN CisrICAgICRzZWxmLT57TVA1X051bVBhcnRzfSA9IDA7DQorICAgICAxOw0K KyB9DQorIA0KK0BAIC05NjksMTEgKzk4MCwxOSBAQA0KKyAjICAgIFJldHlw ZSA9PiByZXR5cGUgdGhpcyBwYXJ0IHRvIHRoZSBnaXZlbiBjb250ZW50LXR5 cGUNCisgIw0KKyAjIFJldHVybiB0aGUgZW50aXR5Lg0KKy0jIEZhdGFsIGV4 Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKysjIEZhdGFsIGV4Y2VwdGlvbiBvbiBm YWlsdXJlLiBSZXR1cm5zIHVuZGVmIGlmIG1lc3NhZ2UgdG8gY29tcGxleA0K KyAjDQorIHN1YiBwcm9jZXNzX3BhcnQgew0KKyAgICAgbXkgKCRzZWxmLCAk aW4sICRyZHIsICVwKSA9IEBfOw0KKyANCisrICAgIGlmICgkc2VsZi0+e01Q NV9NYXhQYXJ0c30gPiAwKSB7DQorKwkkc2VsZi0+e01QNV9OdW1QYXJ0c30r KzsNCisrCWlmICgkc2VsZi0+e01QNV9OdW1QYXJ0c30gPiAkc2VsZi0+e01Q NV9NYXhQYXJ0c30pIHsNCisrCQkjIFJldHVybiBVTkRFRiBpZiBtc2cgdG9v IGNvbXBsZXgNCisrCQlyZXR1cm4gdW5kZWY7DQorKwl9DQorKyAgICB9DQor Kw0KKyAgICAgJHJkciB8fD0gTUlNRTo6UGFyc2VyOjpSZWFkZXItPm5ldzsN CisgICAgICNkZWJ1ZyAicHJvY2Vzc19wYXJ0IjsNCisgICAgICRzZWxmLT5y ZXN1bHRzLT5sZXZlbCgrMSk7DQorQEAgLTEwOTQsNiArMTExMiw4IEBADQor IA0KKyBSZXR1cm5zIHRoZSBwYXJzZWQgTUlNRTo6RW50aXR5IG9uIHN1Y2Nl c3MuDQorIFRocm93cyBleGNlcHRpb24gb24gZmFpbHVyZS4NCisrSWYgdGhl IG1lc3NhZ2UgY29udGFpbmVkIHRvbyBtYW55DQorK3BhcnRzIChhcyBzZXQg YnkgSTxtYXhfcGFydHM+KSwgcmV0dXJucyB1bmRlZi4NCisgDQorID1jdXQN CisgDQorQEAgLTEzNTEsNiArMTM3MSwzMiBAQA0KKyAgICAgbXkgJHNlbGYg PSBzaGlmdDsNCisgICAgICZNSU1FOjpUb29sczo6d2hpbmUoImV2aWxfZmls ZW5hbWUgZGVwcmVjYXRlZCBpbiBNSU1FOjpQYXJzZXIiKTsNCisgICAgICRz ZWxmLT5maWxlci0+ZXZpbF9maWxlbmFtZShAXyk7DQorK30NCisrDQorKyMt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisrDQorKz1pdGVtIG1h eF9wYXJ0cyBOVU0NCisrDQorK0k8SW5zdGFuY2UgbWV0aG9kLj4NCisrTGlt aXRzIHRoZSBudW1iZXIgb2YgTUlNRSBwYXJ0cyB3ZSB3aWxsIHBhcnNlLg0K KysNCisrTm9ybWFsbHksIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHBhcnNl IGEgbWVzc2FnZSB0byB0aGUgYml0dGVyIGVuZC4NCisrTWVzc2FnZXMgd2l0 aCBtYW55IE1JTUUgcGFydHMgY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBtZW1vcnkg Y29uc3VtcHRpb24uDQorK0lmIHlvdSBpbnZva2UgdGhpcyBtZXRob2QsIHBh cnNpbmcgd2lsbCBhYm9ydCB3aXRoIGEgZGllKCkgaWYgYSBtZXNzYWdlDQor K2NvbnRhaW5zIG1vcmUgdGhhbiBOVU0gcGFydHMuDQorKw0KKytJZiBOVU0g aXMgc2V0IHRvIC0xICh0aGUgZGVmYXVsdCksIHRoZW4gbm8gbWF4aW11bSBs aW1pdCBpcyBlbmZvcmNlZC4NCisrDQorK1dpdGggbm8gYXJndW1lbnQsIHJl dHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZyBhcyBhbiBpbnRlZ2VyDQorKw0K Kys9Y3V0DQorKw0KKytzdWIgbWF4X3BhcnRzIHsNCisrICAgIG15KCRzZWxm LCAkbnVtKSA9IEBfOw0KKysgICAgaWYgKEBfID4gMSkgew0KKysgICAgICAg JHNlbGYtPntNUDVfTWF4UGFydHN9ID0gJG51bTsNCisrICAgIH0NCisrICAg IHJldHVybiAkc2VsZi0+e01QNV9NYXhQYXJ0c307DQorIH0NCisgDQorICMt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkluZGV4OiBmaWxlcy9w YXRjaC1QYXJzZXJVbmRlZg0KPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNT IGZpbGU6IGZpbGVzL3BhdGNoLVBhcnNlclVuZGVmDQpkaWZmIC1OIGZpbGVz L3BhdGNoLVBhcnNlclVuZGVmDQotLS0gL2Rldi9udWxsCTEgSmFuIDE5NzAg MDA6MDA6MDAgLTAwMDANCisrKyBmaWxlcy9wYXRjaC1QYXJzZXJVbmRlZgkz MSBBdWcgMjAwNCAxODowNjo1MyAtMDAwMA0KQEAgLTAsMCArMSw0MyBAQA0K Ky0tLSBsaWIvTUlNRS9QYXJzZXIucG0JVHVlIEF1ZyAzMSAxODo1NDowNSAy MDA0DQorKysrIGxpYi9NSU1FL1BhcnNlci5wbQlUdWUgQXVnIDMxIDE4OjUz OjMzIDIwMDQNCitAQCAtNzA4LDYgKzcxMCw3IEBADQorIAkNCisgCSMjIyBQ YXJzZSB0aGUgbmV4dCBwYXJ0LCBhbmQgYWRkIGl0IHRvIHRoZSBlbnRpdHku Li4NCisgCW15ICRwYXJ0ID0gJHNlbGYtPnByb2Nlc3NfcGFydCgkaW4sICRw YXJ0X3JkciwgUmV0eXBlPT4kcmV0eXBlKTsNCisrICAgICAgICByZXR1cm4g dW5kZWYgdW5sZXNzIGRlZmluZWQoJHBhcnQpOw0KKyAJJGVudC0+YWRkX3Bh cnQoJHBhcnQpOw0KKyANCisgCSMjIyAuLi5hbmQgbG9vayBhdCBob3cgd2Ug ZmluaXNoZWQgdXA6DQorQEAgLTk0NCw2ICs5NTQsNyBAQA0KKyANCisgICAg ICMjIyBQYXJzZSB0aGUgbWVzc2FnZToNCisgICAgIG15ICRtc2cgPSAkc2Vs Zi0+cHJvY2Vzc19wYXJ0KCRpbiwgJHJkcik7DQorKyAgICByZXR1cm4gdW5k ZWYgdW5sZXNzIGRlZmluZWQoJG1zZyk7DQorIA0KKyAgICAgIyMjIEhvdyB0 byBoYW5kbGUgbmVzdGVkIG1lc3NhZ2VzPw0KKyAgICAgaWYgKCRzZWxmLT5l eHRyYWN0X25lc3RlZF9tZXNzYWdlcyBlcSAnUkVQTEFDRScpIHsNCitAQCAt MTAwNSwxNCArMTAyNCwxNCBAQA0KKyANCisgICAgICMjIyBIYW5kbGUsIGFj Y29yZGluZyB0byB0aGUgTUlNRSB0eXBlOg0KKyAgICAgaWYgKCR0eXBlIGVx ICdtdWx0aXBhcnQnKSB7DQorLQkkc2VsZi0+cHJvY2Vzc19tdWx0aXBhcnQo JGluLCAkcmRyLCAkZW50KTsNCisrICAgICAgICByZXR1cm4gdW5kZWYgdW5s ZXNzIGRlZmluZWQoJHNlbGYtPnByb2Nlc3NfbXVsdGlwYXJ0KCRpbiwgJHJk ciwgJGVudCkpOw0KKyAgICAgfQ0KKyAgICAgZWxzaWYgKCgiJHR5cGUvJHN1 YnR5cGUiIGVxICJtZXNzYWdlL3JmYzgyMiIgfHwNCisgICAgICAgICAgICAg IiR0eXBlLyRzdWJ0eXBlIiBlcSAibWVzc2FnZS9leHRlcm5hbC1ib2R5IiB8 fA0KKyAJICAgICgiJHR5cGUvJHN1YnR5cGUiIGVxICJtZXNzYWdlL3BhcnRp YWwiICYmICRoZWFkLT5taW1lX2F0dHIoImNvbnRlbnQtdHlwZS5udW1iZXIi KSA9PSAxKSkgJiYgDQorIAkgICAgJHNlbGYtPmV4dHJhY3RfbmVzdGVkX21l c3NhZ2VzKSB7DQorIAkkc2VsZi0+ZGVidWcoImF0dGVtcHRpbmcgdG8gcHJv Y2VzcyBhIG5lc3RlZCBtZXNzYWdlIik7DQorLQkkc2VsZi0+cHJvY2Vzc19t ZXNzYWdlKCRpbiwgJHJkciwgJGVudCk7DQorKwlyZXR1cm4gdW5kZWYgdW5s ZXNzIGRlZmluZWQoJHNlbGYtPnByb2Nlc3NfbWVzc2FnZSgkaW4sICRyZHIs ICRlbnQpKTsNCisgICAgIH0NCisgICAgIGVsc2UgeyAgICAgICAgICAgICAg ICAgICAgIA0KKyAJJHNlbGYtPnByb2Nlc3Nfc2luZ2xlcGFydCgkaW4sICRy ZHIsICRlbnQpOw0KK0BAIC0xMDgwLDcgKzEwODAsNiBAQA0KKyA9YmFjaw0K KyANCisgUmV0dXJucyB0aGUgcGFyc2VkIE1JTUU6OkVudGl0eSBvbiBzdWNj ZXNzLiAgDQorLVRocm93cyBleGNlcHRpb24gb24gZmFpbHVyZS4NCisgDQor ID1jdXQNCisgDQo= --0-923124273-1093976058=:6407--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040831200251.C6407>