fun with resources

[email protected] (D Ackerman) Mon, 28 Jan 2002 22:57:33 -0500
Newsgroups perl.macperl.toolbox
Message-ID <a05010400b87bcb8259fb@[140.247.42.110]>
--============_-1199845839==_============
Content-Type: text/plain; charset="us-ascii" ; format="flowed"



I wrote the following as an exercise to learn a bit about the 
resource manager. Though perhaps not super elegant, it does seem kind 
of fun, so I figured I would post it. Feedback on (mis)use of the 
Resource manager would be welcome if anyone in the know see's 
something glaringly wrong!

Thanks,

Dave


  ##############################################################################
  #
  #	File:			Random startup pict.pl
  #
  #	Author(s):		David Ackerman <[email protected]>
  #
  #
  #	Source:			Started anew.
  #
  #	Notes:			Script for picking a new 
StartupScreen each time the machine is started.
  #					Save as a dropplet and place 
in the Startup Items Folder.  If a StartupScreen
  #					already exists during the 
first run, it will be moved to ":Desktop Folder:Old Startup Pict:".
  #					On all future runs, the 
StartupPict file in the System Folder will be deleted and replaced
  #					with a new 'PICT" Resource 
file. Preferences are set during the first run as well.  You
  #					will be prompted to select a 
folder containing your PICT files (or file containing 'PICT'
  #					resources), and asked if you 
want to see each new selection when it is copied to the System
  #					Folder. If you wish to change 
the preferences later, locate the file named "Random Startup
  #					Pict Preferences" in the 
Preferences Folder and delete it.
  #
  #	Change History:
  #			1/25/02 [3:04 PM]	Source started
  #
  #############################################################################

__BEGIN__


#!perl -w

use strict;
use v5.6.1;
use Mac::Memory;
use Mac::Files;
use Mac::Resources;
use Mac::Windows;
use Mac::QuickDraw;
use Mac::Navigation;
use Storable;

use constant PICT_LOC => 0;
use constant SHOW_AT_STARTUP => 1;
use constant TYPE => 1;
use constant smRoman => 0;

use vars qw (@prefs $system_path);

$system_path = FindFolder(kOnSystemDisk, kSystemFolderType);

my $screen_rect = GetMainDevice()->gdRect;

my ($pict, $r_handle, $res) = "";

read_prefs();

my @files = get_file_list();

my $num = rand (scalar(@files));
$num = int($num);

my $new_pict = $prefs[PICT_LOC] . $files[$num];

if (-e ($system_path . "StartupScreen")) {
	FSpDelete ($system_path . "StartupScreen");
	if ($^E) {
		show_os_error("Trouble deleting old StartupPict!");
		die($!);
	}
}

MacPerl::MakeFSSpec($system_path);
MacPerl::MakeFSSpec($new_pict);

my @info = MacPerl::GetFileInfo($new_pict);
if ($info[TYPE] eq 'PICT') {
	my $cat_info = FSpGetCatInfo ($new_pict);
	my $data_fork_size = $cat_info->ioFlLgLen;
	open (IN, "<$new_pict") or die ($!);
	seek (IN, 512, 0);
	read (IN, my $data, $data_fork_size);
	close (IN);
	if (length($data) == ($data_fork_size - 512)) {
		$r_handle = new Handle($data);
	} else {
		show_os_error("Error occurred reading PICT data");
		die ($!);
	}
} else {
	#get a resource
	$res = FSpOpenResFile($new_pict, 1);
	if (defined($res)) {
		my $num_picts = Count1Resources 'PICT';
		my $r_num;
		if (defined($num_picts) && (!$^E)) {
			$r_num = rand ($num_picts);
			$r_num = int ($r_num);
			$r_num++;
			$r_handle = Get1IndResource ('PICT', $r_num);

			if (defined ($r_handle)) {
				DetachResource ($r_handle);
			} else {
				show_os_error ("Unable to get 'PICT' 
Resource Handle from \"$new_pict\"");
			}
		} else {
			show_os_error ("No 'PICT' Resources found in 
\"$new_pict\"");
		}
		CloseResFile ($res);
	} else {
		show_os_error("Error occured opening resource fork of 
\"$new_pict\"");
		die($!);
	}
}
my $f = $system_path . "StartupScreen";
MacPerl::MakeFSSpec($f);


FSpCreateResFile ($f, 'RSED', 'rsrc', smRoman);
unless ($^E) {
	$res = FSpOpenResFile($f, 3);
	if (defined($res)) {
		AddResource $r_handle, 'PICT', 0, '' if defined($r_handle);
		unless ($^E or (!defined($r_handle))) {
			WriteResource $r_handle;
			ReleaseResource $r_handle if defined ($r_handle);
		} else {
			show_os_error("Error occured adding 'PICT' 
Resource to \"$f\"");
		}
	} else {
		show_os_error("Unable to open Resource Fork of \"$f\"");
	}
} else {
	show_os_error("Error occured creating \"$f\"");
}

if ($prefs[SHOW_AT_STARTUP]) {
	my $pict = GetPicture 0;

	if (defined($pict)) {

	my $window_rect = $pict->picFrame;

	my $window_pos = Mac::QuickDraw::OffsetRect($window_rect,
				$screen_rect->left + 
($screen_rect->right - $screen_rect->left - $window_rect->right) / 2,
				$screen_rect->top + 
($screen_rect->bottom - $screen_rect->top - $window_rect->bottom) / 
3);

	my $w = MacColorWindow->new($window_pos, "", 1, dBoxProc, 1);

	SetPort($w->window);

	DrawPicture $pict, $pict->picFrame;

	sleep (2);

	$w->dispose if defined ($w->window);
	} else {
		show_os_error("Error occured getting StartupScreen 
'PICT' Resource");
	}
}
CloseResFile ($res);
MacPerl::Quit (2);




sub read_prefs {
	my $pref_path = FindFolder(kOnSystemDisk, kPreferencesFolderType);
	$pref_path .= "Random Startup Pict Preferences";
	if (-e $pref_path) {
		my $r = retrieve($pref_path);
		@prefs = @$r;
	}

	else {
		#set prefs
		$prefs[PICT_LOC] = get_folder("Locate source folder 
of 'PICT' files");
		$prefs[SHOW_AT_STARTUP] = MacPerl::Answer("Show next 
startup pict?", "Show", "Surprise me");
		if (-e $system_path . "StartupScreen") {
			my $target = FindFolder(kOnSystemDisk, 
kDesktopFolderType);
			mkdir ($target . "Old Startup Pict");
			FSpCatMove ($system_path . "StartupScreen", 
$target . "Old Startup Pict");
			if ($^E) {
				show_os_error("Trouble moving old 
StartupScreen!");
				die($!, " If \"Old Startup 
Pict:StartupScreen\" exists on the desktop try moving or deleting and 
run script again!");
			} else {
				MacPerl::Answer("Previous 
StartupScreen found in System folder, moved to desktop!", "OK");
			}

		}
		store (\@prefs,  $pref_path);
	}
}

sub get_file_list {
	opendir (D, $prefs[PICT_LOC]) or die ($!);
	my @file_list = readdir (D);
	closedir (D);

	#remove invalid files/folders from list
	for (my $i = 0; $i < scalar(@file_list); $i++) {
		my $f = $prefs[PICT_LOC] . $file_list[$i];

		if ((-d ($f)) || (-l ($f))) {
			splice (@file_list, $i, 1);
			$i--;
		} else {
			my @info = MacPerl::GetFileInfo($f);
			if ($info[TYPE] ne 'PICT') {
				#check for pict resource
				MacPerl::MakeFSSpec($f);
				my $rfd = FSpOpenResFile($f, 1);
				if (defined($rfd)) {
					my $num_picts = Count1Resources 'PICT';
					if (defined($num_picts) || (!$^E)) {
						if ($num_picts < 1) {
							splice 
(@file_list, $i, 1);
							$i--;
						}
					} else {
						show_os_error("Error 
occured while validating file list!");
					}
					CloseResFile ($rfd);
				} else {
					show_os_error("Error occured 
opening resource fork of \"$f\"");
				}

			}
		}

	}

	return @file_list;
}

sub show_os_error {
	my $error = shift;
	my $e;
	if ($^E) {
		if (defined($error)) {
			$e = $error;
		}
		$error = $^E . "\n\n$e";
	} elsif (!defined($error)) {
		$error = 'An unknown error has occured!';
	}
	MacPerl::Answer($error);
}

sub get_folder {
	my $message = shift;
	my $options = NavGetDefaultDialogOptions;
	$options->message($message);
	my $reply = NavChooseFolder (FindFolder(kOnSystemDisk, 
kDesktopFolderType), $options);
	if (defined($reply)) {
		my $file = $reply->file(1);
		NavDisposeReply $reply;
		return $file;
	} else {
		return undef;
	}
}

__END__
--============_-1199845839==_============
Content-Id: <a05010400b87bcb8259fb@[140.247.42.110].0.0>
Content-Type: multipart/appledouble; boundary="============_-1199845839==_D============"

--============_-1199845839==_D============
Content-Transfer-Encoding: base64
Content-Type: application/applefile; name="%Random_startup_pict.pl"
Content-Disposition: attachment; filename="%Random_startup_pict.pl"
 ; modification-date="Mon, 28 Jan 2002 22:49:41 -0500"

AAUWBwACAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAADAAAASgAAABYAAAAJAAAAYAAAACAA
AAAIAAAAgAAAABAAAAACAAAAkAAABa5SYW5kb20gc3RhcnR1cCBwaWN0LnBsVEVYVFIq
Y2gBAADcA8AAAAAAAAAAAAAAAAAAAAAAAAAD5tX6A+iSBUttDAAD6JPhAAABAAAABWgA
AARoAAAARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgACU1v
bmFjbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYABAB0AZwDCgUAAHQBnAMKBQC4
e4YFAAAEtwAABLcAAAAAAQAAAAQYUipjaACCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHQ291
cmllcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoA
AAAECUhlbHZldGljYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAxDb25maWRlbnRpYWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAEAAAEAAAEAAACAAAAAgAAAAIAAAACAAAAAAAAAAQEBAQEBAAAAAAMAUAEA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AQAAAAVoAAAEaAAAAEZTT1JUA5IAgAAcAEYAAUJCU1QAAAASTVBTUgAAAB4AgP//AAAA
TA0NbZgD7f//AAAAAA0NbXQ=
--============_-1199845839==_D============
Content-Type: application/octet-stream; name="Random_startup_pict.pl"
Content-Disposition: attachment; filename="Random_startup_pict.pl"
Content-Transfer-Encoding: base64

ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0gIw0gIwlGaWxlOgkJCVJhbmRvbSBz
dGFydHVwIHBpY3QucGwNICMNICMJQXV0aG9yKHMpOgkJRGF2aWQgQWNrZXJtYW4gPGRh
Y2tlcm1AZmFzLmhhcnZhcmQuZWR1Pg0gIw0gIw0gIwlTb3VyY2U6CQkJU3RhcnRlZCBh
bmV3Lg0gIw0gIwlOb3RlczoJCQlTY3JpcHQgZm9yIHBpY2tpbmcgYSBuZXcgU3RhcnR1
cFNjcmVlbiBlYWNoIHRpbWUgdGhlIG1hY2hpbmUgaXMgc3RhcnRlZC4NICMJCQkJCVNh
dmUgYXMgYSBkcm9wcGxldCBhbmQgcGxhY2UgaW4gdGhlIFN0YXJ0dXAgSXRlbXMgRm9s
ZGVyLiAgSWYgYSBTdGFydHVwU2NyZWVuDSAjCQkJCQlhbHJlYWR5IGV4aXN0cyBkdXJp
bmcgdGhlIGZpcnN0IHJ1biwgaXQgd2lsbCBiZSBtb3ZlZCB0byAiOkRlc2t0b3AgRm9s
ZGVyOk9sZCBTdGFydHVwIFBpY3Q6Ii4NICMJCQkJCU9uIGFsbCBmdXR1cmUgcnVucywg
dGhlIFN0YXJ0dXBQaWN0IGZpbGUgaW4gdGhlIFN5c3RlbSBGb2xkZXIgd2lsbCBiZSBk
ZWxldGVkIGFuZCByZXBsYWNlZA0gIwkJCQkJd2l0aCBhIG5ldyAnUElDVCIgUmVzb3Vy
Y2UgZmlsZS4gUHJlZmVyZW5jZXMgYXJlIHNldCBkdXJpbmcgdGhlIGZpcnN0IHJ1biBh
cyB3ZWxsLiAgWW91DSAjCQkJCQl3aWxsIGJlIHByb21wdGVkIHRvIHNlbGVjdCBhIGZv
bGRlciBjb250YWluaW5nIHlvdXIgUElDVCBmaWxlcyAob3IgZmlsZSBjb250YWluaW5n
ICdQSUNUJw0gIwkJCQkJcmVzb3VyY2VzKSwgYW5kIGFza2VkIGlmIHlvdSB3YW50IHRv
IHNlZSBlYWNoIG5ldyBzZWxlY3Rpb24gd2hlbiBpdCBpcyBjb3BpZWQgdG8gdGhlIFN5
c3RlbQ0gIwkJCQkJRm9sZGVyLiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIHByZWZl
cmVuY2VzIGxhdGVyLCBsb2NhdGUgdGhlIGZpbGUgbmFtZWQgIlJhbmRvbSBTdGFydHVw
IA0gIwkJCQkJUGljdCBQcmVmZXJlbmNlcyIgaW4gdGhlIFByZWZlcmVuY2VzIEZvbGRl
ciBhbmQgZGVsZXRlIGl0LgkJDSAjDSAjCUNoYW5nZSBIaXN0b3J5Og0gIwkJCTEvMjUv
MDIgWzM6MDQgUE1dCVNvdXJjZSBzdGFydGVkIA0gIwkNICMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjDQ0jIXBlcmwgLXcNDXVzZSBzdHJpY3Q7DXVzZSB2NS42LjE7DXVzZSBN
YWM6Ok1lbW9yeTsNdXNlIE1hYzo6RmlsZXM7DXVzZSBNYWM6OlJlc291cmNlczsNdXNl
IE1hYzo6V2luZG93czsNdXNlIE1hYzo6UXVpY2tEcmF3Ow11c2UgTWFjOjpOYXZpZ2F0
aW9uOw11c2UgU3RvcmFibGU7DQ11c2UgY29uc3RhbnQgUElDVF9MT0MgPT4gMDsNdXNl
IGNvbnN0YW50IFNIT1dfQVRfU1RBUlRVUCA9PiAxOw11c2UgY29uc3RhbnQgVFlQRSA9
PiAxOw11c2UgY29uc3RhbnQgc21Sb21hbiA9PiAwOw0NdXNlIHZhcnMgcXcgKEBwcmVm
cyAkc3lzdGVtX3BhdGgpOw0NJHN5c3RlbV9wYXRoID0gRmluZEZvbGRlcihrT25TeXN0
ZW1EaXNrLCBrU3lzdGVtRm9sZGVyVHlwZSk7DQ1teSAkc2NyZWVuX3JlY3QgPSBHZXRN
YWluRGV2aWNlKCktPmdkUmVjdDsNDW15ICgkcGljdCwgJHJfaGFuZGxlLCAkcmVzKSA9
ICIiOw0NcmVhZF9wcmVmcygpOw0NbXkgQGZpbGVzID0gZ2V0X2ZpbGVfbGlzdCgpOw0N
bXkgJG51bSA9IHJhbmQgKHNjYWxhcihAZmlsZXMpKTsNJG51bSA9IGludCgkbnVtKTsN
DW15ICRuZXdfcGljdCA9ICRwcmVmc1tQSUNUX0xPQ10gLiAkZmlsZXNbJG51bV07DQ1p
ZiAoLWUgKCRzeXN0ZW1fcGF0aCAuICJTdGFydHVwU2NyZWVuIikpIHsNCUZTcERlbGV0
ZSAoJHN5c3RlbV9wYXRoIC4gIlN0YXJ0dXBTY3JlZW4iKTsNCWlmICgkXkUpIHsNCQlz
aG93X29zX2Vycm9yKCJUcm91YmxlIGRlbGV0aW5nIG9sZCBTdGFydHVwUGljdCEiKTsN
CQlkaWUoJCEpOw0JfQ19DQ1NYWNQZXJsOjpNYWtlRlNTcGVjKCRzeXN0ZW1fcGF0aCk7
DU1hY1Blcmw6Ok1ha2VGU1NwZWMoJG5ld19waWN0KTsNDW15IEBpbmZvID0gTWFjUGVy
bDo6R2V0RmlsZUluZm8oJG5ld19waWN0KTsNaWYgKCRpbmZvW1RZUEVdIGVxICdQSUNU
Jykgew0JbXkgJGNhdF9pbmZvID0gRlNwR2V0Q2F0SW5mbyAoJG5ld19waWN0KTsNCW15
ICRkYXRhX2Zvcmtfc2l6ZSA9ICRjYXRfaW5mby0+aW9GbExnTGVuOw0Jb3BlbiAoSU4s
ICI8JG5ld19waWN0Iikgb3IgZGllICgkISk7DQlzZWVrIChJTiwgNTEyLCAwKTsNCXJl
YWQgKElOLCBteSAkZGF0YSwgJGRhdGFfZm9ya19zaXplKTsNCWNsb3NlIChJTik7DQlp
ZiAobGVuZ3RoKCRkYXRhKSA9PSAoJGRhdGFfZm9ya19zaXplIC0gNTEyKSkgeyANCQkk
cl9oYW5kbGUgPSBuZXcgSGFuZGxlKCRkYXRhKTsNCX0gZWxzZSB7DQkJc2hvd19vc19l
cnJvcigiRXJyb3Igb2NjdXJyZWQgcmVhZGluZyBQSUNUIGRhdGEiKTsNCQlkaWUgKCQh
KTsNCX0JDX0gZWxzZSB7DQkjZ2V0IGEgcmVzb3VyY2UNCSRyZXMgPSBGU3BPcGVuUmVz
RmlsZSgkbmV3X3BpY3QsIDEpOw0JaWYgKGRlZmluZWQoJHJlcykpIHsNCQlteSAkbnVt
X3BpY3RzID0gQ291bnQxUmVzb3VyY2VzICdQSUNUJzsNCQlteSAkcl9udW07DQkJaWYg
KGRlZmluZWQoJG51bV9waWN0cykgJiYgKCEkXkUpKSB7CQ0JCQkkcl9udW0gPSByYW5k
ICgkbnVtX3BpY3RzKTsNCQkJJHJfbnVtID0gaW50ICgkcl9udW0pOw0JCQkkcl9udW0r
KzsNCQkJJHJfaGFuZGxlID0gR2V0MUluZFJlc291cmNlICgnUElDVCcsICRyX251bSk7
DQkJCQ0JCQlpZiAoZGVmaW5lZCAoJHJfaGFuZGxlKSkgewkNCQkJCURldGFjaFJlc291
cmNlICgkcl9oYW5kbGUpOw0JCQl9IGVsc2Ugew0JCQkJc2hvd19vc19lcnJvciAoIlVu
YWJsZSB0byBnZXQgJ1BJQ1QnIFJlc291cmNlIEhhbmRsZSBmcm9tIFwiJG5ld19waWN0
XCIiKTsNCQkJfQkNCQl9IGVsc2Ugew0JCQlzaG93X29zX2Vycm9yICgiTm8gJ1BJQ1Qn
IFJlc291cmNlcyBmb3VuZCBpbiBcIiRuZXdfcGljdFwiIik7DQkJfQkNCQlDbG9zZVJl
c0ZpbGUgKCRyZXMpOw0JfSBlbHNlIHsNCQlzaG93X29zX2Vycm9yKCJFcnJvciBvY2N1
cmVkIG9wZW5pbmcgcmVzb3VyY2UgZm9yayBvZiBcIiRuZXdfcGljdFwiIik7DQkJZGll
KCQhKTsNCX0JDX0NbXkgJGYgPSAkc3lzdGVtX3BhdGggLiAiU3RhcnR1cFNjcmVlbiI7
DU1hY1Blcmw6Ok1ha2VGU1NwZWMoJGYpOw0NDUZTcENyZWF0ZVJlc0ZpbGUgKCRmLCAn
UlNFRCcsICdyc3JjJywgc21Sb21hbik7DXVubGVzcyAoJF5FKSB7DQkkcmVzID0gRlNw
T3BlblJlc0ZpbGUoJGYsIDMpOw0JaWYgKGRlZmluZWQoJHJlcykpIHsNCQlBZGRSZXNv
dXJjZSAkcl9oYW5kbGUsICdQSUNUJywgMCwgJycgaWYgZGVmaW5lZCgkcl9oYW5kbGUp
Ow0JCXVubGVzcyAoJF5FIG9yICghZGVmaW5lZCgkcl9oYW5kbGUpKSkgew0JCQlXcml0
ZVJlc291cmNlICRyX2hhbmRsZTsNCQkJUmVsZWFzZVJlc291cmNlICRyX2hhbmRsZSBp
ZiBkZWZpbmVkICgkcl9oYW5kbGUpOw0JCX0gZWxzZSB7DQkJCXNob3dfb3NfZXJyb3Io
IkVycm9yIG9jY3VyZWQgYWRkaW5nICdQSUNUJyBSZXNvdXJjZSB0byBcIiRmXCIiKTsN
CQl9DQl9IGVsc2Ugew0JCXNob3dfb3NfZXJyb3IoIlVuYWJsZSB0byBvcGVuIFJlc291
cmNlIEZvcmsgb2YgXCIkZlwiIik7DQl9CQ19IGVsc2Ugew0Jc2hvd19vc19lcnJvcigi
RXJyb3Igb2NjdXJlZCBjcmVhdGluZyBcIiRmXCIiKTsNfQ0NaWYgKCRwcmVmc1tTSE9X
X0FUX1NUQVJUVVBdKSB7DQlteSAkcGljdCA9IEdldFBpY3R1cmUgMDsNCQ0JaWYgKGRl
ZmluZWQoJHBpY3QpKSB7DQkNCW15ICR3aW5kb3dfcmVjdCA9ICRwaWN0LT5waWNGcmFt
ZTsNCQ0JbXkgJHdpbmRvd19wb3MgPSBNYWM6OlF1aWNrRHJhdzo6T2Zmc2V0UmVjdCgk
d2luZG93X3JlY3QsDQkJCQkkc2NyZWVuX3JlY3QtPmxlZnQgKyAoJHNjcmVlbl9yZWN0
LT5yaWdodCAtICRzY3JlZW5fcmVjdC0+bGVmdCAtICR3aW5kb3dfcmVjdC0+cmlnaHQp
IC8gMiwNCQkJCSRzY3JlZW5fcmVjdC0+dG9wICsgKCRzY3JlZW5fcmVjdC0+Ym90dG9t
IC0gJHNjcmVlbl9yZWN0LT50b3AgLSAkd2luZG93X3JlY3QtPmJvdHRvbSkgLyAzKTsN
CQ0JbXkgJHcgPSBNYWNDb2xvcldpbmRvdy0+bmV3KCR3aW5kb3dfcG9zLCAiIiwgMSwg
ZEJveFByb2MsIDEpOw0JDQlTZXRQb3J0KCR3LT53aW5kb3cpOw0JDQlEcmF3UGljdHVy
ZSAkcGljdCwgJHBpY3QtPnBpY0ZyYW1lOw0JDQlzbGVlcCAoMik7DQkNCSR3LT5kaXNw
b3NlIGlmIGRlZmluZWQgKCR3LT53aW5kb3cpOw0JfSBlbHNlIHsNCQlzaG93X29zX2Vy
cm9yKCJFcnJvciBvY2N1cmVkIGdldHRpbmcgU3RhcnR1cFNjcmVlbiAnUElDVCcgUmVz
b3VyY2UiKTsNCX0NfQ1DbG9zZVJlc0ZpbGUgKCRyZXMpOw1NYWNQZXJsOjpRdWl0ICgy
KTsNDQ0NDXN1YiByZWFkX3ByZWZzIHsNCW15ICRwcmVmX3BhdGggPSBGaW5kRm9sZGVy
KGtPblN5c3RlbURpc2ssIGtQcmVmZXJlbmNlc0ZvbGRlclR5cGUpOw0JJHByZWZfcGF0
aCAuPSAiUmFuZG9tIFN0YXJ0dXAgUGljdCBQcmVmZXJlbmNlcyI7DQlpZiAoLWUgJHBy
ZWZfcGF0aCkgeyANCQlteSAkciA9IHJldHJpZXZlKCRwcmVmX3BhdGgpOw0JCUBwcmVm
cyA9IEAkcjsNCX0gDQkNCWVsc2Ugew0JCSNzZXQgcHJlZnMNCQkkcHJlZnNbUElDVF9M
T0NdID0gZ2V0X2ZvbGRlcigiTG9jYXRlIHNvdXJjZSBmb2xkZXIgb2YgJ1BJQ1QnIGZp
bGVzIik7DQkJJHByZWZzW1NIT1dfQVRfU1RBUlRVUF0gPSBNYWNQZXJsOjpBbnN3ZXIo
IlNob3cgbmV4dCBzdGFydHVwIHBpY3Q/IiwgIlNob3ciLCAiU3VycHJpc2UgbWUiKTsN
CQlpZiAoLWUgJHN5c3RlbV9wYXRoIC4gIlN0YXJ0dXBTY3JlZW4iKSB7DQkJCW15ICR0
YXJnZXQgPSBGaW5kRm9sZGVyKGtPblN5c3RlbURpc2ssIGtEZXNrdG9wRm9sZGVyVHlw
ZSk7DQkJCW1rZGlyICgkdGFyZ2V0IC4gIk9sZCBTdGFydHVwIFBpY3QiKTsNCQkJRlNw
Q2F0TW92ZSAoJHN5c3RlbV9wYXRoIC4gIlN0YXJ0dXBTY3JlZW4iLCAkdGFyZ2V0IC4g
Ik9sZCBTdGFydHVwIFBpY3QiKTsNCQkJaWYgKCReRSkgew0JCQkJc2hvd19vc19lcnJv
cigiVHJvdWJsZSBtb3Zpbmcgb2xkIFN0YXJ0dXBTY3JlZW4hIik7DQkJCQlkaWUoJCEs
ICIgSWYgXCJPbGQgU3RhcnR1cCBQaWN0OlN0YXJ0dXBTY3JlZW5cIiBleGlzdHMgb24g
dGhlIGRlc2t0b3AgdHJ5IG1vdmluZyBvciBkZWxldGluZyBhbmQgcnVuIHNjcmlwdCBh
Z2FpbiEiKTsNCQkJfSBlbHNlIHsNCQkJCU1hY1Blcmw6OkFuc3dlcigiUHJldmlvdXMg
U3RhcnR1cFNjcmVlbiBmb3VuZCBpbiBTeXN0ZW0gZm9sZGVyLCBtb3ZlZCB0byBkZXNr
dG9wISIsICJPSyIpOw0JCQl9CQ0JCQkNCQl9DQkJc3RvcmUgKFxAcHJlZnMsICAkcHJl
Zl9wYXRoKTsNCX0NfQ0Nc3ViIGdldF9maWxlX2xpc3Qgew0Jb3BlbmRpciAoRCwgJHBy
ZWZzW1BJQ1RfTE9DXSkgb3IgZGllICgkISk7DQlteSBAZmlsZV9saXN0ID0gcmVhZGRp
ciAoRCk7DQljbG9zZWRpciAoRCk7DQkNCSNyZW1vdmUgaW52YWxpZCBmaWxlcy9mb2xk
ZXJzIGZyb20gbGlzdA0JZm9yIChteSAkaSA9IDA7ICRpIDwgc2NhbGFyKEBmaWxlX2xp
c3QpOyAkaSsrKSB7DQkJbXkgJGYgPSAkcHJlZnNbUElDVF9MT0NdIC4gJGZpbGVfbGlz
dFskaV07DQkJDQkJaWYgKCgtZCAoJGYpKSB8fCAoLWwgKCRmKSkpIHsNCQkJc3BsaWNl
IChAZmlsZV9saXN0LCAkaSwgMSk7DQkJCSRpLS07DQkJfSBlbHNlIHsNCQkJbXkgQGlu
Zm8gPSBNYWNQZXJsOjpHZXRGaWxlSW5mbygkZik7DQkJCWlmICgkaW5mb1tUWVBFXSBu
ZSAnUElDVCcpIHsNCQkJCSNjaGVjayBmb3IgcGljdCByZXNvdXJjZQ0JCQkJTWFjUGVy
bDo6TWFrZUZTU3BlYygkZik7DQkJCQlteSAkcmZkID0gRlNwT3BlblJlc0ZpbGUoJGYs
IDEpOw0JCQkJaWYgKGRlZmluZWQoJHJmZCkpIHsNCQkJCQlteSAkbnVtX3BpY3RzID0g
Q291bnQxUmVzb3VyY2VzICdQSUNUJzsNCQkJCQlpZiAoZGVmaW5lZCgkbnVtX3BpY3Rz
KSB8fCAoISReRSkpIHsJDQkJCQkJCWlmICgkbnVtX3BpY3RzIDwgMSkgew0JCQkJCQkJ
c3BsaWNlIChAZmlsZV9saXN0LCAkaSwgMSk7DQkJCQkJCQkkaS0tOw0JCQkJCQl9DQkJ
CQkJfSBlbHNlIHsNCQkJCQkJc2hvd19vc19lcnJvcigiRXJyb3Igb2NjdXJlZCB3aGls
ZSB2YWxpZGF0aW5nIGZpbGUgbGlzdCEiKTsNCQkJCQl9CQ0JCQkJCUNsb3NlUmVzRmls
ZSAoJHJmZCk7DQkJCQl9IGVsc2Ugew0JCQkJCXNob3dfb3NfZXJyb3IoIkVycm9yIG9j
Y3VyZWQgb3BlbmluZyByZXNvdXJjZSBmb3JrIG9mIFwiJGZcIiIpOw0JCQkJfQ0JCQkJ
DQkJCX0gCQ0JCX0JDQkJCQ0JfQ0NCXJldHVybiBAZmlsZV9saXN0Ow19DQ1zdWIgc2hv
d19vc19lcnJvciB7DQlteSAkZXJyb3IgPSBzaGlmdDsNCW15ICRlOwkNCWlmICgkXkUp
IHsNCQlpZiAoZGVmaW5lZCgkZXJyb3IpKSB7DQkJCSRlID0gJGVycm9yOw0JCX0NCQkk
ZXJyb3IgPSAkXkUgLiAiXG5cbiRlIjsNCX0gZWxzaWYgKCFkZWZpbmVkKCRlcnJvcikp
IHsNCQkkZXJyb3IgPSAnQW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJlZCEnOw0JfQkJ
CQkNCU1hY1Blcmw6OkFuc3dlcigkZXJyb3IpOw19DQ1zdWIgZ2V0X2ZvbGRlciB7DQlt
eSAkbWVzc2FnZSA9IHNoaWZ0Ow0JbXkgJG9wdGlvbnMgPSBOYXZHZXREZWZhdWx0RGlh
bG9nT3B0aW9uczsNCSRvcHRpb25zLT5tZXNzYWdlKCRtZXNzYWdlKTsNCW15ICRyZXBs
eSA9IE5hdkNob29zZUZvbGRlciAoRmluZEZvbGRlcihrT25TeXN0ZW1EaXNrLCBrRGVz
a3RvcEZvbGRlclR5cGUpLCAkb3B0aW9ucyk7DQlpZiAoZGVmaW5lZCgkcmVwbHkpKSB7
DQkJbXkgJGZpbGUgPSAkcmVwbHktPmZpbGUoMSk7DQkJTmF2RGlzcG9zZVJlcGx5ICRy
ZXBseTsgDQkJcmV0dXJuICRmaWxlOwkNCX0gZWxzZSB7DQkJcmV0dXJuIHVuZGVmOw0J
fQkNfQ==
--============_-1199845839==_D============--
--============_-1199845839==_============
Content-Type: text/plain; charset="us-ascii" ; format="flowed"

-- 
  ------------------------------------------------------------------
|  David Ackerman               |  Telephone: 617-495-2794         |
|  Audio Associate              |  Fax: 617-496-4636               |
|  Archive World Music          |  e-mail: [email protected] |
|  Harvard University           |                                  |
|  Cambridge, MA 02138          |  PGP key 0xE928B52F              |
  ------------------------------------------------------------------
--============_-1199845839==_============--