X-Original-To: pgsql-patches-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [64.117.224.130]) by svr1.postgresql.org (Postfix) with ESMTP id CA1C3D1C92A for ; Fri, 1 Aug 2003 03:31:47 +0000 (GMT) Received: from svr1.postgresql.org ([64.117.224.193]) by localhost (neptune.hub.org [64.117.224.130]) (amavisd-new, port 10024) with ESMTP id 11624-03 for ; Fri, 1 Aug 2003 00:30:41 -0300 (ADT) Received: from linuxworld.com.au (www.linuxworld.com.au [203.34.46.50]) by svr1.postgresql.org (Postfix) with ESMTP id 5694CD1C921 for ; Fri, 1 Aug 2003 00:31:44 -0300 (ADT) Received: from localhost (swm@localhost) by linuxworld.com.au (8.11.6p2/8.11.4) with ESMTP id h713VKH25832; Fri, 1 Aug 2003 13:31:20 +1000 Date: Fri, 1 Aug 2003 13:31:20 +1000 (EST) From: Gavin Sherry To: Tom Lane Cc: pgsql-patches@postgresql.org Subject: Re: Numeric version of factorial() In-Reply-To: <3765.1059703681@sss.pgh.pa.us> Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="583741998-231842385-1059708680=:25534" X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200308/2 X-Sequence-Number: 7842 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. --583741998-231842385-1059708680=:25534 Content-Type: TEXT/PLAIN; charset=US-ASCII On Thu, 31 Jul 2003, Tom Lane wrote: > Gavin Sherry writes: > > What are your feelings about numeric argument vs. int4/int8 arguments? > > Actually I think it'd be fine to take int8. We'd not be able to cope > with any larger input anyway, and the inner loop could be noticeably > faster if the control logic just deals with int. > > We could leave the factorial(numeric) case open for a future > implementation that uses gamma, if anyone gets hot to do it. > Attached is a revised patch based on your Tom's comments. It removes int[248]fac(), modifies regression tests (which referenced int4fac()), and implements a much cleaned numeric_fac(). > regards, tom lane > Thanks, Gavin --583741998-231842385-1059708680=:25534 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="factorial2.diff" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="factorial2.diff" SW5kZXg6IHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9pbnQuYw0KPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC91c3IvbG9jYWwvY3Zzcm9vdC9w Z3NxbC1zZXJ2ZXIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2ludC5jLHYNCnJl dHJpZXZpbmcgcmV2aXNpb24gMS41NA0KZGlmZiAtMiAtYyAtcjEuNTQgaW50 LmMNCioqKiBzcmMvYmFja2VuZC91dGlscy9hZHQvaW50LmMJOSBNYXkgMjAw MyAxNTo0NDo0MCAtMDAwMAkxLjU0DQotLS0gc3JjL2JhY2tlbmQvdXRpbHMv YWR0L2ludC5jCTEgQXVnIDIwMDMgMTc6MTE6MTggLTAwMDANCioqKioqKioq KioqKioqKg0KKioqIDI3LDMxICoqKioNCiAgICoNCiAgICoJCUFyaXRobWV0 aWMgb3BlcmF0b3JzOg0KISAgKgkJIGludG1vZCwgaW50NGZhYw0KICAgKi8N CiAgDQotLS0gMjcsMzEgLS0tLQ0KICAgKg0KICAgKgkJQXJpdGhtZXRpYyBv cGVyYXRvcnM6DQohICAqCQkgaW50bW9kDQogICAqLw0KICANCioqKioqKioq KioqKioqKg0KKioqIDgzNSw4NzIgKioqKg0KICB9DQogIA0KLSAvKiBpbnRb MjRdZmFjKCkNCi0gICogRmFjdG9yaWFsDQotICAqLw0KLSBEYXR1bQ0KLSBp bnQ0ZmFjKFBHX0ZVTkNUSU9OX0FSR1MpDQotIHsNCi0gCWludDMyCQlhcmcx ID0gUEdfR0VUQVJHX0lOVDMyKDApOw0KLSAJaW50MzIJCXJlc3VsdDsNCi0g DQotIAlpZiAoYXJnMSA9PSAwKQ0KLSAJCXJlc3VsdCA9IDE7DQotIAllbHNl IGlmIChhcmcxIDwgMCkNCi0gCQlyZXN1bHQgPSAwOw0KLSAJZWxzZQ0KLSAJ CWZvciAocmVzdWx0ID0gMTsgYXJnMSA+IDA7IC0tYXJnMSkNCi0gCQkJcmVz dWx0ICo9IGFyZzE7DQotIAlQR19SRVRVUk5fSU5UMzIocmVzdWx0KTsNCi0g fQ0KLSANCi0gRGF0dW0NCi0gaW50MmZhYyhQR19GVU5DVElPTl9BUkdTKQ0K LSB7DQotIAlpbnQxNgkJYXJnMSA9IFBHX0dFVEFSR19JTlQxNigwKTsNCi0g CWludDMyCQlyZXN1bHQ7DQotIA0KLSAJaWYgKGFyZzEgPT0gMCkNCi0gCQly ZXN1bHQgPSAxOw0KLSAJZWxzZSBpZiAoYXJnMSA8IDApDQotIAkJcmVzdWx0 ID0gMDsNCi0gCWVsc2UNCi0gCQlmb3IgKHJlc3VsdCA9IDE7IGFyZzEgPiAw OyAtLWFyZzEpDQotIAkJCXJlc3VsdCAqPSBhcmcxOw0KLSAJUEdfUkVUVVJO X0lOVDMyKHJlc3VsdCk7DQotIH0NCiAgDQogIC8qIGludFsyNF1hYnMoKQ0K LS0tIDgzNSw4MzggLS0tLQ0KSW5kZXg6IHNyYy9iYWNrZW5kL3V0aWxzL2Fk dC9pbnQ4LmMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAv dXNyL2xvY2FsL2N2c3Jvb3QvcGdzcWwtc2VydmVyL3NyYy9iYWNrZW5kL3V0 aWxzL2FkdC9pbnQ4LmMsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjQ0DQpk aWZmIC0yIC1jIC1yMS40NCBpbnQ4LmMNCioqKiBzcmMvYmFja2VuZC91dGls cy9hZHQvaW50OC5jCTkgTWF5IDIwMDMgMTU6NDQ6NDAgLTAwMDAJMS40NA0K LS0tIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9pbnQ4LmMJMSBBdWcgMjAwMyAx NzowMDowOSAtMDAwMA0KKioqKioqKioqKioqKioqDQoqKiogNTUyLDU3NSAq KioqDQogIH0NCiAgDQotIC8qIGludDhmYWMoKQ0KLSAgKiBGYWN0b3JpYWwN Ci0gICovDQotIERhdHVtDQotIGludDhmYWMoUEdfRlVOQ1RJT05fQVJHUykN Ci0gew0KLSAJaW50NjQJCWFyZzEgPSBQR19HRVRBUkdfSU5UNjQoMCk7DQot IAlpbnQ2NAkJcmVzdWx0Ow0KLSAJaW50NjQJCWk7DQotIA0KLSAJaWYgKGFy ZzEgPT0gMCkNCi0gCQlyZXN1bHQgPSAxOw0KLSAJZWxzZSBpZiAoYXJnMSA8 IDEpDQotIAkJcmVzdWx0ID0gMDsNCi0gCWVsc2UNCi0gCQlmb3IgKGkgPSBh cmcxLCByZXN1bHQgPSAxOyBpID4gMDsgLS1pKQ0KLSAJCQlyZXN1bHQgKj0g aTsNCi0gDQotIAlQR19SRVRVUk5fSU5UNjQocmVzdWx0KTsNCi0gfQ0KICAN CiAgRGF0dW0NCi0tLSA1NTIsNTU1IC0tLS0NCkluZGV4OiBzcmMvYmFja2Vu ZC91dGlscy9hZHQvbnVtZXJpYy5jDQo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 DQpSQ1MgZmlsZTogL3Vzci9sb2NhbC9jdnNyb290L3Bnc3FsLXNlcnZlci9z cmMvYmFja2VuZC91dGlscy9hZHQvbnVtZXJpYy5jLHYNCnJldHJpZXZpbmcg cmV2aXNpb24gMS42Mg0KZGlmZiAtMiAtYyAtcjEuNjIgbnVtZXJpYy5jDQoq Kiogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L251bWVyaWMuYwkzIEp1bCAyMDAz IDE5OjQxOjQ3IC0wMDAwCTEuNjINCi0tLSBzcmMvYmFja2VuZC91dGlscy9h ZHQvbnVtZXJpYy5jCTEgQXVnIDIwMDMgMTY6NDM6MzAgLTAwMDANCioqKioq KioqKioqKioqKg0KKioqIDEzMTIsMTMxNSAqKioqDQotLS0gMTMxMiwxMzY0 IC0tLS0NCiAgICovDQogIA0KKyAvKg0KKyAgKiBudW1lcmljX2ZhYygpDQor ICAqIENvbXB1dGVyIGZhY3RvcmlhbA0KKyAgKi8NCisgDQorIERhdHVtDQor IG51bWVyaWNfZmFjKFBHX0ZVTkNUSU9OX0FSR1MpDQorIHsNCisgDQorIAlp bnQ2NAkJbnVtID0gUEdfR0VUQVJHX0lOVDY0KDApOw0KKyAJTnVtZXJpY1Zh cgljb3VudDsNCisgCU51bWVyaWNWYXIJZmFjdDsNCisgCU51bWVyaWNWYXIJ emVyb3ZhcjsNCisgCU51bWVyaWNWYXIJcmVzdWx0Ow0KKyAJTnVtZXJpYwkJ cmVzOw0KKyANCisgCWlmKG51bSA8IDEpIHsNCisgCQlyZXMgPSBtYWtlX3Jl c3VsdCgmY29uc3Rfb25lKTsNCisgCQlQR19SRVRVUk5fTlVNRVJJQyhyZXMp Ow0KKyAJfQ0KKyANCisgDQorIAlpbml0X3ZhcigmZmFjdCk7DQorIAlpbml0 X3ZhcigmY291bnQpOw0KKyAJaW5pdF92YXIoJnJlc3VsdCk7DQorIAlpbml0 X3ZhcigmemVyb3Zhcik7DQorIAl6ZXJvX3ZhcigmemVyb3Zhcik7DQorIA0K KyAJaW50OF90b19udW1lcmljdmFyKChpbnQ2NCludW0sICZyZXN1bHQpOw0K KyAJc2V0X3Zhcl9mcm9tX3ZhcigmY29uc3Rfb25lLCAmY291bnQpOw0KKyAN CisgCWZvcihudW0gPSBudW0gLSAxO251bT4wO251bS0tKSB7DQorIAkJc2V0 X3Zhcl9mcm9tX3ZhcigmcmVzdWx0LCZjb3VudCk7DQorIA0KKyAJCWludDhf dG9fbnVtZXJpY3ZhcigoaW50NjQpbnVtLCZmYWN0KTsNCisgDQorIAkJbXVs X3ZhcigmY291bnQsICZmYWN0LCAmcmVzdWx0LCBjb3VudC5kc2NhbGUgKyBm YWN0LmRzY2FsZSk7DQorIAl9DQorIA0KKyAJcmVzID0gbWFrZV9yZXN1bHQo JmNvdW50KTsNCisgDQorIAlmcmVlX3ZhcigmY291bnQpOw0KKyAJZnJlZV92 YXIoJmZhY3QpOw0KKyAJZnJlZV92YXIoJnJlc3VsdCk7DQorIAlmcmVlX3Zh cigmemVyb3Zhcik7DQorIA0KKyAJUEdfUkVUVVJOX05VTUVSSUMocmVzKTsN CisgfQ0KKyANCiAgDQogIC8qDQpJbmRleDogc3JjL2luY2x1ZGUvY2F0YWxv Zy9wZ19vcGVyYXRvci5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1Mg ZmlsZTogL3Vzci9sb2NhbC9jdnNyb290L3Bnc3FsLXNlcnZlci9zcmMvaW5j bHVkZS9jYXRhbG9nL3BnX29wZXJhdG9yLmgsdg0KcmV0cmlldmluZyByZXZp c2lvbiAxLjExOA0KZGlmZiAtMiAtYyAtcjEuMTE4IHBnX29wZXJhdG9yLmgN CioqKiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX29wZXJhdG9yLmgJMjcgSnVu IDIwMDMgMDA6MzM6MjUgLTAwMDAJMS4xMTgNCi0tLSBzcmMvaW5jbHVkZS9j YXRhbG9nL3BnX29wZXJhdG9yLmgJMSBBdWcgMjAwMyAxNjo1NTo1OCAtMDAw MA0KKioqKioqKioqKioqKioqDQoqKiogMTIzLDEzMiAqKioqDQogIERBVEEo aW5zZXJ0IE9JRCA9IDM1MiAoICAiPSIJICAgUEdOU1AgUEdVSUQgYiB0CTI4 CTI4CTE2IDM1MgkgMAkgMAkgMAkgMAkgMCB4aWRlcSBlcXNlbCBlcWpvaW5z ZWwgKSk7DQogIERBVEEoaW5zZXJ0IE9JRCA9IDM1MyAoICAiPSIJICAgUEdO U1AgUEdVSUQgYiBmCTI4CTIzCTE2CSAwCSAwCSAwCSAwCSAwCSAwIHhpZGVx aW50NCBlcXNlbCBlcWpvaW5zZWwgKSk7DQogIERBVEEoaW5zZXJ0IE9JRCA9 IDM4NSAoICAiPSIJICAgUEdOU1AgUEdVSUQgYiB0CTI5CTI5CTE2IDM4NQkg MAkgMAkgMAkgMAkgMCBjaWRlcSBlcXNlbCBlcWpvaW5zZWwgKSk7DQogIERB VEEoaW5zZXJ0IE9JRCA9IDM4NiAoICAiPSIJICAgUEdOU1AgUEdVSUQgYiB0 CTIyCTIyCTE2IDM4NgkgMAkgMAkgMAkgMAkgMCBpbnQydmVjdG9yZXEgZXFz ZWwgZXFqb2luc2VsICkpOw0KICBEQVRBKGluc2VydCBPSUQgPSAzODcgKCAg Ij0iCSAgIFBHTlNQIFBHVUlEIGIgZgkyNwkyNwkxNiAzODcJIDAJIDAJIDAJ IDAJIDAgdGlkZXEgZXFzZWwgZXFqb2luc2VsICkpOw0KICAjZGVmaW5lIFRJ REVxdWFsT3BlcmF0b3IgICAzODcNCi0gREFUQShpbnNlcnQgT0lEID0gMzg4 ICggICIhIgkgICBQR05TUCBQR1VJRCByIGYJMjAJIDAJMjAJIDAJIDAJIDAJ IDAJIDAJIDAgaW50OGZhYyAtIC0gKSk7DQotIERBVEEoaW5zZXJ0IE9JRCA9 IDM4OSAoICAiISEiCSAgIFBHTlNQIFBHVUlEIGwgZgkgMAkyMAkyMAkgMAkg MAkgMAkgMAkgMAkgMCBpbnQ4ZmFjIC0gLSApKTsNCiAgDQogIERBVEEoaW5z ZXJ0IE9JRCA9IDQxMCAoICI9IgkJICAgUEdOU1AgUEdVSUQgYiB0CTIwCTIw CTE2IDQxMCA0MTEgNDEyIDQxMiA0MTIgNDEzIGludDhlcSBlcXNlbCBlcWpv aW5zZWwgKSk7DQotLS0gMTIzLDEzMiAtLS0tDQogIERBVEEoaW5zZXJ0IE9J RCA9IDM1MiAoICAiPSIJICAgUEdOU1AgUEdVSUQgYiB0CTI4CTI4CTE2IDM1 MgkgMAkgMAkgMAkgMAkgMCB4aWRlcSBlcXNlbCBlcWpvaW5zZWwgKSk7DQog IERBVEEoaW5zZXJ0IE9JRCA9IDM1MyAoICAiPSIJICAgUEdOU1AgUEdVSUQg YiBmCTI4CTIzCTE2CSAwCSAwCSAwCSAwCSAwCSAwIHhpZGVxaW50NCBlcXNl bCBlcWpvaW5zZWwgKSk7DQorIERBVEEoaW5zZXJ0IE9JRCA9IDM4MCAoICAi ISIJICAgUEdOU1AgUEdVSUQgciBmICAyMCAgIDAgIDE3MDAgICAwICAgMCAg IDAgICAwICAwICAgMCBudW1lcmljX2ZhYyAtIC0gKSk7DQorIERBVEEoaW5z ZXJ0IE9JRCA9IDM4MSAoICAiISEiCSAgIFBHTlNQIFBHVUlEIGwgZiAgIDAg IDIwICAxNzAwICAgMCAgIDAgICAwICAgMCAgMCAgIDAgbnVtZXJpY19mYWMg LSAtICkpOw0KICBEQVRBKGluc2VydCBPSUQgPSAzODUgKCAgIj0iCSAgIFBH TlNQIFBHVUlEIGIgdAkyOQkyOQkxNiAzODUJIDAJIDAJIDAJIDAJIDAgY2lk ZXEgZXFzZWwgZXFqb2luc2VsICkpOw0KICBEQVRBKGluc2VydCBPSUQgPSAz ODYgKCAgIj0iCSAgIFBHTlNQIFBHVUlEIGIgdAkyMgkyMgkxNiAzODYJIDAJ IDAJIDAJIDAJIDAgaW50MnZlY3RvcmVxIGVxc2VsIGVxam9pbnNlbCApKTsN CiAgREFUQShpbnNlcnQgT0lEID0gMzg3ICggICI9IgkgICBQR05TUCBQR1VJ RCBiIGYJMjcJMjcJMTYgMzg3CSAwCSAwCSAwCSAwCSAwIHRpZGVxIGVxc2Vs IGVxam9pbnNlbCApKTsNCiAgI2RlZmluZSBUSURFcXVhbE9wZXJhdG9yICAg Mzg3DQogIA0KICBEQVRBKGluc2VydCBPSUQgPSA0MTAgKCAiPSIJCSAgIFBH TlNQIFBHVUlEIGIgdAkyMAkyMAkxNiA0MTAgNDExIDQxMiA0MTIgNDEyIDQx MyBpbnQ4ZXEgZXFzZWwgZXFqb2luc2VsICkpOw0KKioqKioqKioqKioqKioq DQoqKiogMTc3LDE4MiAqKioqDQogIERBVEEoaW5zZXJ0IE9JRCA9IDUxMyAo ICAiQEAiCSAgIFBHTlNQIFBHVUlEIGwgZgkgMCA2MDMgNjAwCSAwCSAwCSAw CSAwCSAwCSAwIGJveF9jZW50ZXIgLSAtICkpOw0KICBEQVRBKGluc2VydCBP SUQgPSA1MTQgKCAgIioiCSAgIFBHTlNQIFBHVUlEIGIgZgkyMwkyMwkyMyA1 MTQJIDAJIDAJIDAJIDAJIDAgaW50NG11bCAtIC0gKSk7DQotIERBVEEoaW5z ZXJ0IE9JRCA9IDUxNSAoICAiISIJICAgUEdOU1AgUEdVSUQgciBmCTIzCSAw CTIzCSAwCSAwCSAwCSAwCSAwCSAwIGludDRmYWMgLSAtICkpOw0KLSBEQVRB KGluc2VydCBPSUQgPSA1MTYgKCAgIiEhIgkgICBQR05TUCBQR1VJRCBsIGYJ IDAJMjMJMjMJIDAJIDAJIDAJIDAJIDAJIDAgaW50NGZhYyAtIC0gKSk7DQog IERBVEEoaW5zZXJ0IE9JRCA9IDUxNyAoICAiPC0+IgkgICBQR05TUCBQR1VJ RCBiIGYgNjAwIDYwMCA3MDEgNTE3CSAwCSAwCSAwCSAwCSAwIHBvaW50X2Rp c3RhbmNlIC0gLSApKTsNCiAgREFUQShpbnNlcnQgT0lEID0gNTE4ICggICI8 PiIJICAgUEdOU1AgUEdVSUQgYiBmCTIzCTIzCTE2IDUxOAk5NgkwICAwICAg MCAgIDAgaW50NG5lIG5lcXNlbCBuZXFqb2luc2VsICkpOw0KLS0tIDE3Nywx ODAgLS0tLQ0KKioqKioqKioqKioqKioqDQoqKiogNTA3LDUxMiAqKioqDQog IERBVEEoaW5zZXJ0IE9JRCA9IDExMzUgKCAgIj49IgkJUEdOU1AgUEdVSUQg YiBmICA3MDEJNzAwICAxNiAxMTI0IDExMzIgIDAgMCAwIDAgZmxvYXQ4NGdl IHNjYWxhcmd0c2VsIHNjYWxhcmd0am9pbnNlbCApKTsNCiAgDQotIERBVEEo aW5zZXJ0IE9JRCA9IDExNTggKCAgIiEiCQlQR05TUCBQR1VJRCByIGYgMjEJ ICAwICAgMjMgMCAwIDAgMCAwIDAgaW50MmZhYyAtIC0gKSk7DQotIERBVEEo aW5zZXJ0IE9JRCA9IDExNzUgKCAgIiEhIgkJUEdOU1AgUEdVSUQgbCBmICAw CSAyMSAgIDIzIDAgMCAwIDAgMCAwIGludDJmYWMgLSAtICkpOw0KICANCiAg LyogTElLRSBoYWNrcyBieSBLZWl0aCBQYXJrcy4gKi8NCi0tLSA1MDUsNTA4 IC0tLS0NCkluZGV4OiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuaA0K PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC91c3IvbG9jYWwv Y3Zzcm9vdC9wZ3NxbC1zZXJ2ZXIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19w cm9jLmgsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjMwOQ0KZGlmZiAtMiAt YyAtcjEuMzA5IHBnX3Byb2MuaA0KKioqIHNyYy9pbmNsdWRlL2NhdGFsb2cv cGdfcHJvYy5oCTEgSnVsIDIwMDMgMDA6MDQ6MzggLTAwMDAJMS4zMDkNCi0t LSBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuaAkxIEF1ZyAyMDAzIDE3 OjEwOjQ5IC0wMDAwDQoqKioqKioqKioqKioqKioNCioqKiAyMDksMjE0ICoq KioNCiAgLyogT0lEUyAxMDAgLSAxOTkgKi8NCiAgDQotIERBVEEoaW5zZXJ0 IE9JRCA9IDEwMCAoICBpbnQ4ZmFjCQkgICBQR05TUCBQR1VJRCAxMiBmIGYg dCBmIGkgMSAyMCAiMjAiICBpbnQ4ZmFjIC0gX251bGxfICkpOw0KLSBERVND UigiZmFjdG9yaWFsIik7DQogIERBVEEoaW5zZXJ0IE9JRCA9IDEwMSAoICBl cXNlbAkJCSAgIFBHTlNQIFBHVUlEIDEyIGYgZiB0IGYgcyA0IDcwMSAiMjI4 MSAyNiAyMjgxIDIzIiAgZXFzZWwgLSBfbnVsbF8gKSk7DQogIERFU0NSKCJy ZXN0cmljdGlvbiBzZWxlY3Rpdml0eSBvZiA9IGFuZCByZWxhdGVkIG9wZXJh dG9ycyIpOw0KLS0tIDIwOSwyMTIgLS0tLQ0KKioqKioqKioqKioqKioqDQoq KiogMjMyLDIzNiAqKioqDQogIERBVEEoaW5zZXJ0IE9JRCA9ICAxMTAgKCAg dW5rbm93bm91dAkgICBQR05TUCBQR1VJRCAxMiBmIGYgdCBmIGkgMSAyMjc1 CSI3MDUiCXVua25vd25vdXQgLSBfbnVsbF8gKSk7DQogIERFU0NSKCJJL08i KTsNCiEgDQogIERBVEEoaW5zZXJ0IE9JRCA9IDExMiAoICB0ZXh0CQkJICAg UEdOU1AgUEdVSUQgMTIgZiBmIHQgZiBpIDEgIDI1ICIyMyIJaW50NF90ZXh0 IC0gX251bGxfICkpOw0KICBERVNDUigiY29udmVydCBpbnQ0IHRvIHRleHQi KTsNCi0tLSAyMzAsMjM0IC0tLS0NCiAgREFUQShpbnNlcnQgT0lEID0gIDEx MCAoICB1bmtub3dub3V0CSAgIFBHTlNQIFBHVUlEIDEyIGYgZiB0IGYgaSAx IDIyNzUJIjcwNSIJdW5rbm93bm91dCAtIF9udWxsXyApKTsNCiAgREVTQ1Io IkkvTyIpOw0KISBEQVRBKGluc2VydCBPSUQgPSAxMTEgKCAgbnVtZXJpY19m YWMJICAgUEdOU1AgUEdVSUQgMTIgZiBmIHQgZiBpIDEgMTcwMCAiMjAiICBu dW1lcmljX2ZhYyAtIF9udWxsXyApKTsNCiAgREFUQShpbnNlcnQgT0lEID0g MTEyICggIHRleHQJCQkgICBQR05TUCBQR1VJRCAxMiBmIGYgdCBmIGkgMSAg MjUgIjIzIglpbnQ0X3RleHQgLSBfbnVsbF8gKSk7DQogIERFU0NSKCJjb252 ZXJ0IGludDQgdG8gdGV4dCIpOw0KKioqKioqKioqKioqKioqDQoqKiogMjk1 LDMwMCAqKioqDQogIERBVEEoaW5zZXJ0IE9JRCA9IDE0MSAoICBpbnQ0bXVs CQkgICBQR05TUCBQR1VJRCAxMiBmIGYgdCBmIGkgMiAyMyAiMjMgMjMiCWlu dDRtdWwgLSBfbnVsbF8gKSk7DQogIERFU0NSKCJtdWx0aXBseSIpOw0KLSBE QVRBKGluc2VydCBPSUQgPSAxNDIgKCAgaW50NGZhYwkJICAgUEdOU1AgUEdV SUQgMTIgZiBmIHQgZiBpIDEgMjMgIjIzIiAgaW50NGZhYyAtIF9udWxsXyAp KTsNCi0gREVTQ1IoImZhY3RvcmlhbCIpOw0KICBEQVRBKGluc2VydCBPSUQg PSAxNDQgKCAgaW50NG5lCQkJICAgUEdOU1AgUEdVSUQgMTIgZiBmIHQgZiBp IDIgMTYgIjIzIDIzIglpbnQ0bmUgLSBfbnVsbF8gKSk7DQogIERFU0NSKCJu b3QgZXF1YWwiKTsNCi0tLSAyOTMsMjk2IC0tLS0NCioqKioqKioqKioqKioq Kg0KKioqIDU3NCw1ODAgKioqKg0KICBERVNDUigiZmluaXRlIGFic3RpbWU/ Iik7DQogIA0KLSBEQVRBKGluc2VydCBPSUQgPSAyNzYgKCAgaW50MmZhYwkJ ICAgUEdOU1AgUEdVSUQgMTIgZiBmIHQgZiBpIDEgMjMgIjIxIiAgaW50MmZh YyAtIF9udWxsXyApKTsNCi0gREVTQ1IoImZhY3RvcmlhbCIpOw0KLSANCiAg REFUQShpbnNlcnQgT0lEID0gMjc3ICggIGludGVyX3NsCQkgICBQR05TUCBQ R1VJRCAxMiBmIGYgdCBmIGkgMiAxNiAiNjAxIDYyOCIJaW50ZXJfc2wgLSBf bnVsbF8gKSk7DQogIERFU0NSKCJpbnRlcnNlY3Q/Iik7DQotLS0gNTcwLDU3 MyAtLS0tDQoqKioqKioqKioqKioqKioNCioqKiAxNzUzLDE3NjEgKioqKg0K ICANCiAgDQohIERBVEEoaW5zZXJ0IE9JRCA9IDEzOTEgKCAgZmFjdG9yaWFs CQkgICBQR05TUCBQR1VJRCAxMiBmIGYgdCBmIGkgMSAyMyAiMjEiICBpbnQy ZmFjIC0gX251bGxfICkpOw0KISBERVNDUigiZmFjdG9yaWFsIik7DQohIERB VEEoaW5zZXJ0IE9JRCA9IDEzOTIgKCAgZmFjdG9yaWFsCQkgICBQR05TUCBQ R1VJRCAxMiBmIGYgdCBmIGkgMSAyMyAiMjMiICBpbnQ0ZmFjIC0gX251bGxf ICkpOw0KISBERVNDUigiZmFjdG9yaWFsIik7DQohIERBVEEoaW5zZXJ0IE9J RCA9IDEzOTMgKCAgZmFjdG9yaWFsCQkgICBQR05TUCBQR1VJRCAxMiBmIGYg dCBmIGkgMSAyMCAiMjAiICBpbnQ4ZmFjIC0gX251bGxfICkpOw0KICBERVND UigiZmFjdG9yaWFsIik7DQogIERBVEEoaW5zZXJ0IE9JRCA9IDEzOTQgKCAg YWJzCQkJICAgUEdOU1AgUEdVSUQgMTIgZiBmIHQgZiBpIDEgNzAwICI3MDAi ICBmbG9hdDRhYnMgLSBfbnVsbF8gKSk7DQotLS0gMTc0NiwxNzUwIC0tLS0N CiAgDQogIA0KISBEQVRBKGluc2VydCBPSUQgPSAxMzc2ICggIGZhY3Rvcmlh bCAgICAgICAgUEdOU1AgUEdVSUQgMTIgZiBmIHQgZiBpIDEgMTcwMCAiMjAi ICBudW1lcmljX2ZhYyAtIF9udWxsXyApKTsNCiAgREVTQ1IoImZhY3Rvcmlh bCIpOw0KICBEQVRBKGluc2VydCBPSUQgPSAxMzk0ICggIGFicwkJCSAgIFBH TlNQIFBHVUlEIDEyIGYgZiB0IGYgaSAxIDcwMCAiNzAwIiAgZmxvYXQ0YWJz IC0gX251bGxfICkpOw0KSW5kZXg6IHNyYy9pbmNsdWRlL3V0aWxzL2J1aWx0 aW5zLmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAvdXNy L2xvY2FsL2N2c3Jvb3QvcGdzcWwtc2VydmVyL3NyYy9pbmNsdWRlL3V0aWxz L2J1aWx0aW5zLmgsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjIyMw0KZGlm ZiAtMiAtYyAtcjEuMjIzIGJ1aWx0aW5zLmgNCioqKiBzcmMvaW5jbHVkZS91 dGlscy9idWlsdGlucy5oCTI3IEp1biAyMDAzIDAwOjMzOjI2IC0wMDAwCTEu MjIzDQotLS0gc3JjL2luY2x1ZGUvdXRpbHMvYnVpbHRpbnMuaAkxIEF1ZyAy MDAzIDE3OjAwOjI5IC0wMDAwDQoqKioqKioqKioqKioqKioNCioqKiAxNjAs MTY1ICoqKioNCiAgZXh0ZXJuIERhdHVtIGludDI0bW9kKFBHX0ZVTkNUSU9O X0FSR1MpOw0KICBleHRlcm4gRGF0dW0gaW50NDJtb2QoUEdfRlVOQ1RJT05f QVJHUyk7DQotIGV4dGVybiBEYXR1bSBpbnQ0ZmFjKFBHX0ZVTkNUSU9OX0FS R1MpOw0KLSBleHRlcm4gRGF0dW0gaW50MmZhYyhQR19GVU5DVElPTl9BUkdT KTsNCiAgZXh0ZXJuIERhdHVtIGludDJsYXJnZXIoUEdfRlVOQ1RJT05fQVJH Uyk7DQogIGV4dGVybiBEYXR1bSBpbnQyc21hbGxlcihQR19GVU5DVElPTl9B UkdTKTsNCi0tLSAxNjAsMTYzIC0tLS0NCioqKioqKioqKioqKioqKg0KKioq IDcwNSw3MDggKioqKg0KLS0tIDcwMyw3MDcgLS0tLQ0KICBleHRlcm4gRGF0 dW0gbnVtZXJpY19zbWFsbGVyKFBHX0ZVTkNUSU9OX0FSR1MpOw0KICBleHRl cm4gRGF0dW0gbnVtZXJpY19sYXJnZXIoUEdfRlVOQ1RJT05fQVJHUyk7DQor IGV4dGVybiBEYXR1bSBudW1lcmljX2ZhYyhQR19GVU5DVElPTl9BUkdTKTsN CiAgZXh0ZXJuIERhdHVtIG51bWVyaWNfc3FydChQR19GVU5DVElPTl9BUkdT KTsNCiAgZXh0ZXJuIERhdHVtIG51bWVyaWNfZXhwKFBHX0ZVTkNUSU9OX0FS R1MpOw0KSW5kZXg6IHNyYy9pbmNsdWRlL3V0aWxzL2ludDguaA0KPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC91c3IvbG9jYWwvY3Zzcm9v dC9wZ3NxbC1zZXJ2ZXIvc3JjL2luY2x1ZGUvdXRpbHMvaW50OC5oLHYNCnJl dHJpZXZpbmcgcmV2aXNpb24gMS4zNw0KZGlmZiAtMiAtYyAtcjEuMzcgaW50 OC5oDQoqKiogc3JjL2luY2x1ZGUvdXRpbHMvaW50OC5oCTkgTWF5IDIwMDMg MTU6NDQ6NDIgLTAwMDAJMS4zNw0KLS0tIHNyYy9pbmNsdWRlL3V0aWxzL2lu dDguaAkxIEF1ZyAyMDAzIDE3OjAwOjQ3IC0wMDAwDQoqKioqKioqKioqKioq KioNCioqKiA3Myw3NyAqKioqDQogIGV4dGVybiBEYXR1bSBpbnQ4ZGl2KFBH X0ZVTkNUSU9OX0FSR1MpOw0KICBleHRlcm4gRGF0dW0gaW50OGFicyhQR19G VU5DVElPTl9BUkdTKTsNCi0gZXh0ZXJuIERhdHVtIGludDhmYWMoUEdfRlVO Q1RJT05fQVJHUyk7DQogIGV4dGVybiBEYXR1bSBpbnQ4bW9kKFBHX0ZVTkNU SU9OX0FSR1MpOw0KICBleHRlcm4gRGF0dW0gaW50OGluYyhQR19GVU5DVElP Tl9BUkdTKTsNCi0tLSA3Myw3NiAtLS0tDQpJbmRleDogc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9jcmVhdGVfb3BlcmF0b3Iub3V0DQo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09DQpSQ1MgZmlsZTogL3Vzci9sb2NhbC9jdnNyb290L3Bn c3FsLXNlcnZlci9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV9v cGVyYXRvci5vdXQsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjQNCmRpZmYg LTIgLWMgLXIxLjQgY3JlYXRlX29wZXJhdG9yLm91dA0KKioqIHNyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX29wZXJhdG9yLm91dAk1IEphbiAy MDAwIDE3OjMxOjA4IC0wMDAwCTEuNA0KLS0tIHNyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvY3JlYXRlX29wZXJhdG9yLm91dAkxIEF1ZyAyMDAzIDE3OjIx OjMyIC0wMDAwDQoqKioqKioqKioqKioqKioNCioqKiAxNiwyOCAqKioqDQog ICk7DQogIENSRUFURSBPUEVSQVRPUiBAI0AgKA0KISAgICByaWdodGFyZyA9 IGludDQsCQktLSBsZWZ0IHVuYXJ5IA0KISAgICBwcm9jZWR1cmUgPSBpbnQ0 ZmFjIA0KICApOw0KICBDUkVBVEUgT1BFUkFUT1IgI0AjICgNCiEgICAgbGVm dGFyZyA9IGludDQsCQktLSByaWdodCB1bmFyeQ0KISAgICBwcm9jZWR1cmUg PSBpbnQ0ZmFjIA0KICApOw0KICBDUkVBVEUgT1BFUkFUT1IgIyUjICggDQoh ICAgIGxlZnRhcmcgPSBpbnQ0LAkJLS0gcmlnaHQgdW5hcnkgDQohICAgIHBy b2NlZHVyZSA9IGludDRmYWMgDQogICk7DQotLS0gMTYsMjggLS0tLQ0KICAp Ow0KICBDUkVBVEUgT1BFUkFUT1IgQCNAICgNCiEgICAgcmlnaHRhcmcgPSBp bnQ4LAkJLS0gbGVmdCB1bmFyeSANCiEgICAgcHJvY2VkdXJlID0gbnVtZXJp Y19mYWMgDQogICk7DQogIENSRUFURSBPUEVSQVRPUiAjQCMgKA0KISAgICBs ZWZ0YXJnID0gaW50OCwJCS0tIHJpZ2h0IHVuYXJ5DQohICAgIHByb2NlZHVy ZSA9IG51bWVyaWNfZmFjDQogICk7DQogIENSRUFURSBPUEVSQVRPUiAjJSMg KCANCiEgICAgbGVmdGFyZyA9IGludDgsCQktLSByaWdodCB1bmFyeSANCiEg ICAgcHJvY2VkdXJlID0gbnVtZXJpY19mYWMgDQogICk7DQpJbmRleDogc3Jj L3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRlX29wZXJhdG9yLnNxbA0KPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC91c3IvbG9jYWwvY3Zzcm9v dC9wZ3NxbC1zZXJ2ZXIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRlX29w ZXJhdG9yLnNxbCx2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNA0KZGlmZiAt MiAtYyAtcjEuNCBjcmVhdGVfb3BlcmF0b3Iuc3FsDQoqKiogc3JjL3Rlc3Qv cmVncmVzcy9zcWwvY3JlYXRlX29wZXJhdG9yLnNxbAk1IEphbiAyMDAwIDE3 OjMyOjI5IC0wMDAwCTEuNA0KLS0tIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2Ny ZWF0ZV9vcGVyYXRvci5zcWwJMSBBdWcgMjAwMyAxNzoxOTowOCAtMDAwMA0K KioqKioqKioqKioqKioqDQoqKiogMTksMzQgKioqKg0KICANCiAgQ1JFQVRF IE9QRVJBVE9SIEAjQCAoDQohICAgIHJpZ2h0YXJnID0gaW50NCwJCS0tIGxl ZnQgdW5hcnkgDQohICAgIHByb2NlZHVyZSA9IGludDRmYWMgDQogICk7DQog IA0KICBDUkVBVEUgT1BFUkFUT1IgI0AjICgNCiEgICAgbGVmdGFyZyA9IGlu dDQsCQktLSByaWdodCB1bmFyeQ0KISAgICBwcm9jZWR1cmUgPSBpbnQ0ZmFj IA0KICApOw0KICANCiAgQ1JFQVRFIE9QRVJBVE9SICMlIyAoIA0KISAgICBs ZWZ0YXJnID0gaW50NCwJCS0tIHJpZ2h0IHVuYXJ5IA0KISAgICBwcm9jZWR1 cmUgPSBpbnQ0ZmFjIA0KICApOw0KICANCi0tLSAxOSwzNCAtLS0tDQogIA0K ICBDUkVBVEUgT1BFUkFUT1IgQCNAICgNCiEgICAgcmlnaHRhcmcgPSBpbnQ4 LAkJLS0gbGVmdCB1bmFyeSANCiEgICAgcHJvY2VkdXJlID0gbnVtZXJpY19m YWMgDQogICk7DQogIA0KICBDUkVBVEUgT1BFUkFUT1IgI0AjICgNCiEgICAg bGVmdGFyZyA9IGludDgsCQktLSByaWdodCB1bmFyeQ0KISAgICBwcm9jZWR1 cmUgPSBudW1lcmljX2ZhYw0KICApOw0KICANCiAgQ1JFQVRFIE9QRVJBVE9S ICMlIyAoIA0KISAgICBsZWZ0YXJnID0gaW50OCwJCS0tIHJpZ2h0IHVuYXJ5 IA0KISAgICBwcm9jZWR1cmUgPSBudW1lcmljX2ZhYyANCiAgKTsNCiAgDQo= --583741998-231842385-1059708680=:25534--