---559023410-1141662977-11304968009167
Content-Type: MULTIPART/MIXED; BOUNDARY="-559023410-1141662977-1130496800=:19167"

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

---559023410-1141662977-11304968009167
Content-Type: TEXT/PLAIN; charset=US-ASCII

For a database application I found using CSV to be rather slow.
I have made an attempt to speed it up, which, frankly has not been
very successuful.  However I think I have improved the code a
little.

I've added an error for if the state machine should get into an
unknown state, rather than assuming that "it must be in the other
one" after several tests.  This slows things down, but is probably
safer, given how hard state machines can be to debug.

I've changed if block to if block_given?  -- more idiomatic,
possibly faster??

I've tried to simplify 
  if something.is_a?(Klass)
    something.method
  end
to 
  if something.respond_to?(:method)
    something.method
  end

I think its faster, and its more duck-typing style.

I've tried to handle state transitions with a hash, as it is
probably clearer than if...elsif...else...end.  Likely to be faster,
too.

I've changed 
  if expr
    singlestatement
  end

to 
   singlestatement if expr

to shorten the code.  Don't know how that impacts speed.

I've changed if...elsif...else... to case statements where I can.  I
think that ought to be faster, but it is clearer code, I think.

There's a while statement with an if immediately inside it.  Since
thre is no else for that if, and the loop condition doesn't change
if the if-condition is false, then the condition must always apply.
For, if it did not apply, the while loop would never exit.  I have
commented out the condition and corresponding end.

idx_is_eos? is private, and thus not really part of the external
interface.  It takes a parameter that it doesn't use. I have removed
that and made it parameterless.  


I have tested the code and it still works.  I could not find
exhaustive test cases for CSV (looked in Rubycon and on the web) so
hope I haven't broken anything.  It does seem to be a tiny bit
faster, for the given case.  My tests are attached.  The test
program takes the file to test (csv or nova_csv) as an argument, to
allow comparison.  The name?  nova_csv because new_csv was already
being used for doc patches.

        HTH
        Hugh
---559023410-1141662977-11304968009167
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=csv_code_diffs
Content-Transfer-Encoding: BASE64
Content-Description: 
Content-Disposition: attachment; filename=csv_code_diffs

LS0tIGNzdi5yYgkyMDA0LTA1LTI3IDE1OjM5OjEwLjAwMDAwMDAwMCArMDEw
MA0KKysrIG5vdmFfY3N2LnJiCTIwMDUtMTAtMjggMTE6MDU6NDguNzUxNDc4
MDAwICswMTAwDQpAQCAtMTAsNiArMTAsNyBAQA0KICAgDQogY2xhc3MgQ1NW
DQogICBjbGFzcyBJbGxlZ2FsRm9ybWF0RXJyb3IgPCBSdW50aW1lRXJyb3I7
IGVuZA0KKyAgY2xhc3MgVW5rbm93blN0YXRlIDwgUnVudGltZUVycm9yOyBl
bmQNCiANCiAgICMgZGVwcmVjYXRlZA0KICAgY2xhc3MgQ2VsbCA8IFN0cmlu
Zw0KQEAgLTExOCw3ICsxMTksNyBAQA0KICAgICAgICAgIiAgVXNlIENTVi5v
cGVuKGZpbGVuYW1lLCAncicpIGluc3RlYWQuIikNCiAgICAgICByZXR1cm4g
b3Blbl9yZWFkZXIoc3RyX29yX3JlYWRhYmxlLCAncicsIGZzLCBycywgJmJs
b2NrKQ0KICAgICBlbmQNCi0gICAgaWYgYmxvY2sNCisgICAgaWYgYmxvY2tf
Z2l2ZW4/DQogICAgICAgQ1NWOjpSZWFkZXIucGFyc2Uoc3RyX29yX3JlYWRh
YmxlLCBmcywgcnMpIGRvIHxyb3d8DQogICAgICAgICB5aWVsZChyb3cpDQog
ICAgICAgZW5kDQpAQCAtMTM2LDEwICsxMzcsMTAgQEANCiAgICMgbm90LCB1
c2UgQ1NWLnBhcnNlX3JvdyBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kLg0KICAg
ZGVmIENTVi5wYXJzZV9saW5lKHNyYywgZnMgPSBuaWwsIHJzID0gbmlsKQ0K
ICAgICBmcyB8fD0gJywnDQotICAgIGlmIGZzLmlzX2E/KEZpeG51bSkNCisg
ICAgaWYgZnMucmVzcG9uZF90bz8gOmNocg0KICAgICAgIGZzID0gZnMuY2hy
DQogICAgIGVuZA0KLSAgICBpZiAhcnMubmlsPyBhbmQgcnMuaXNfYT8oRml4
bnVtKQ0KKyAgICBpZiBycy5yZXNwb25kX3RvPyA6Y2hyDQogICAgICAgcnMg
PSBycy5jaHINCiAgICAgZW5kDQogICAgIGlkeCA9IDANCkBAIC0xNjIsMTAg
KzE2MywxMCBAQA0KICAgICAgIHJldHVybiAnJw0KICAgICBlbmQNCiAgICAg
ZnMgfHw9ICcsJw0KLSAgICBpZiBmcy5pc19hPyhGaXhudW0pDQorICAgIGlm
IGZzLnJlc3BvbmRfdG8/IDpjaHINCiAgICAgICBmcyA9IGZzLmNocg0KICAg
ICBlbmQNCi0gICAgaWYgIXJzLm5pbD8gYW5kIHJzLmlzX2E/KEZpeG51bSkN
CisgICAgaWYgcnMucmVzcG9uZF90bz8gOmNocg0KICAgICAgIHJzID0gcnMu
Y2hyDQogICAgIGVuZA0KICAgICByZXNfdHlwZSA9IDpEVF9DT0xTRVANCkBA
IC0yMTMsMTAgKzIxNCwxMCBAQA0KICAgIw0KICAgZGVmIENTVi5wYXJzZV9y
b3coc3JjLCBpZHgsIG91dF9kZXYsIGZzID0gbmlsLCBycyA9IG5pbCkNCiAg
ICAgZnMgfHw9ICcsJw0KLSAgICBpZiBmcy5pc19hPyhGaXhudW0pDQorICAg
IGlmIGZzLnJlc3BvbmRfdG8/IDpjaHINCiAgICAgICBmcyA9IGZzLmNocg0K
ICAgICBlbmQNCi0gICAgaWYgIXJzLm5pbD8gYW5kIHJzLmlzX2E/KEZpeG51
bSkNCisgICAgaWYgcnMucmVzcG9uZF90bz8gOmNocg0KICAgICAgIHJzID0g
cnMuY2hyDQogICAgIGVuZA0KICAgICBpZHhfYmFja3VwID0gaWR4DQpAQCAt
MjcwLDEwICsyNzEsMTAgQEANCiAgICMNCiAgIGRlZiBDU1YuZ2VuZXJhdGVf
cm93KHNyYywgY2VsbHMsIG91dF9kZXYsIGZzID0gbmlsLCBycyA9IG5pbCkN
CiAgICAgZnMgfHw9ICcsJw0KLSAgICBpZiBmcy5pc19hPyhGaXhudW0pDQor
ICAgIGlmIGZzLnJlc3BvbmRfdG8gOmNocg0KICAgICAgIGZzID0gZnMuY2hy
DQogICAgIGVuZA0KLSAgICBpZiAhcnMubmlsPyBhbmQgcnMuaXNfYT8oRml4
bnVtKQ0KKyAgICBpZiBycy5yZXNwb25kX3RvIDpjaHINCiAgICAgICBycyA9
IHJzLmNocg0KICAgICBlbmQNCiAgICAgc3JjX3NpemUgPSBzcmMuc2l6ZQ0K
QEAgLTMwMyw2ICszMDQsOSBAQA0KICAgIyBQcml2YXRlIGNsYXNzIG1ldGhv
ZHMuDQogICBjbGFzcyA8PCBzZWxmDQogICBwcml2YXRlDQorICAgIERBVEFf
VFJBTlNJVElPTjEgPSBIYXNoLm5ld3t8aCxrfCBrfS5tZXJnZSEoOlNUX1NU
QVJUID0+IDpTVF9EQVRBLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIDpTVF9RVU9URSA9PiA6SUxMRUdBTF9G
T1JNQVQpDQorICAgICMgcmV0dXJuIHRoZSBrZXkgYXMgZGVmYXVsdA0KIA0K
ICAgICBkZWYgb3Blbl9yZWFkZXIocGF0aCwgbW9kZSwgZnMsIHJzLCAmYmxv
Y2spDQogICAgICAgZmlsZSA9IEZpbGUub3BlbihwYXRoLCBtb2RlKQ0KQEAg
LTM0MCw2ICszNDQsMTMgQEANCiAgICAgICBlbmQNCiAgICAgZW5kDQogDQor
DQorICAgIGRlZiB0b19kYXRhX3VubGVzc19xdW90ZShzdGF0ZSkNCisgICAg
ICBzdGF0ZSA9IERBVEFfVFJBTlNJVElPTjFbc3RhdGVdDQorICAgICAgcmFp
c2UgSWxsZWdhbEZvcm1hdEVycm9yIGlmIHN0YXRlID09IDpJTExFR0FMX0ZP
Uk1BVA0KKyAgICAgIHJldHVybiBzdGF0ZQ0KKyAgICBlbmQNCisNCiAgICAg
ZGVmIHBhcnNlX2JvZHkoc3JjLCBpZHgsIGZzLCBycykNCiAgICAgICBmc19z
dHIgPSBmcw0KICAgICAgIGZzX3NpemUgPSBmc19zdHIuc2l6ZQ0KQEAgLTM1
OSw1NCArMzcwLDM3IEBADQogICAgICAgICAgIGlmICFmc2NoYXIgYW5kIGMg
PT0gZnNfc3RyWzBdDQogICAgICAgICAgICAgZnNfaWR4ID0gMA0KICAgICAg
ICAgICAgIGZzY2hhciA9IHRydWUNCi0gICAgICAgICAgICBpZiBzdGF0ZSA9
PSA6U1RfU1RBUlQNCi0gICAgICAgICAgICAgIHN0YXRlID0gOlNUX0RBVEEN
Ci0gICAgICAgICAgICBlbHNpZiBzdGF0ZSA9PSA6U1RfUVVPVEUNCi0gICAg
ICAgICAgICAgIHJhaXNlIElsbGVnYWxGb3JtYXRFcnJvcg0KLSAgICAgICAg
ICAgIGVuZA0KKyAgICAgICAgICAgIHN0YXRlID0gdG9fZGF0YV91bmxlc3Nf
cXVvdGUoc3RhdGUpDQogICAgICAgICAgIGVuZA0KICAgICAgICAgICBpZiAh
cnNjaGFyIGFuZCBjID09IHJzX3N0clswXQ0KICAgICAgICAgICAgIHJzX2lk
eCA9IDANCiAgICAgICAgICAgICByc2NoYXIgPSB0cnVlDQotICAgICAgICAg
ICAgaWYgc3RhdGUgPT0gOlNUX1NUQVJUDQotICAgICAgICAgICAgICBzdGF0
ZSA9IDpTVF9EQVRBDQotICAgICAgICAgICAgZWxzaWYgc3RhdGUgPT0gOlNU
X1FVT1RFDQotICAgICAgICAgICAgICByYWlzZSBJbGxlZ2FsRm9ybWF0RXJy
b3INCi0gICAgICAgICAgICBlbmQNCisgICAgICAgICAgICBzdGF0ZSA9IHRv
X2RhdGFfdW5sZXNzX3F1b3RlKHN0YXRlKQ0KICAgICAgICAgICBlbmQNCiAg
ICAgICAgIGVuZA0KICAgICAgICAgaWYgYyA9PSA/Ig0KICAgICAgICAgICBm
c19pZHggPSByc19pZHggPSAwDQotICAgICAgICAgIGlmIGNyDQotICAgICAg
ICAgICAgcmFpc2UgSWxsZWdhbEZvcm1hdEVycm9yDQotICAgICAgICAgIGVu
ZA0KKyAgICAgICAgICByYWlzZSBJbGxlZ2FsRm9ybWF0RXJyb3IgaWYgY3IN
CiAgICAgICAgICAgY2VsbCA8PCBzcmNbbGFzdF9pZHgsIChpZHggLSBsYXN0
X2lkeCldDQotICAgICAgICAgIGxhc3RfaWR4ID0gaWR4DQotICAgICAgICAg
IGlmIHN0YXRlID09IDpTVF9EQVRBDQotICAgICAgICAgICAgaWYgcXVvdGVk
DQotICAgICAgICAgICAgICBsYXN0X2lkeCArPSAxDQotICAgICAgICAgICAg
ICBxdW90ZWQgPSBmYWxzZQ0KLSAgICAgICAgICAgICAgc3RhdGUgPSA6U1Rf
UVVPVEUNCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICByYWlz
ZSBJbGxlZ2FsRm9ybWF0RXJyb3INCi0gICAgICAgICAgICBlbmQNCi0gICAg
ICAgICAgZWxzaWYgc3RhdGUgPT0gOlNUX1FVT1RFDQorICAgICAgICAgIGxh
c3RfaWR4ID0gaWR4ICsgMQ0KKyAgICAgICAgICBjYXNlIHN0YXRlIA0KKyAg
ICAgICAgICB3aGVuIDpTVF9EQVRBDQorICAgICAgICAgICAgcmFpc2UgSWxs
ZWdhbEZvcm1hdEVycm9yIHVubGVzcyBxdW90ZWQNCisgICAgICAgICAgICBx
dW90ZWQgPSBmYWxzZSAgIyBSZWR1bmRhbnQsIHN1cmVseT8NCisgICAgICAg
ICAgICBzdGF0ZSA9IDpTVF9RVU9URQ0KKyAgICAgICAgICB3aGVuIDpTVF9R
VU9URQ0KICAgICAgICAgICAgIGNlbGwgPDwgYy5jaHINCi0gICAgICAgICAg
ICBsYXN0X2lkeCArPSAxDQogICAgICAgICAgICAgcXVvdGVkID0gdHJ1ZQ0K
ICAgICAgICAgICAgIHN0YXRlID0gOlNUX0RBVEENCi0gICAgICAgICAgZWxz
ZSAgIyA6U1RfU1RBUlQNCisgICAgICAgICAgd2hlbiA6U1RfU1RBUlQNCiAg
ICAgICAgICAgICBxdW90ZWQgPSB0cnVlDQotICAgICAgICAgICAgbGFzdF9p
ZHggKz0gMQ0KICAgICAgICAgICAgIHN0YXRlID0gOlNUX0RBVEENCisgICAg
ICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHJhaXNlIFVua25vd25TdGF0ZQ0K
ICAgICAgICAgICBlbmQNCiAgICAgICAgIGVsc2lmIGZzY2hhciBvciByc2No
YXINCi0gICAgICAgICAgaWYgZnNjaGFyDQotICAgICAgICAgICAgZnNfaWR4
ICs9IDENCi0gICAgICAgICAgZW5kDQotICAgICAgICAgIGlmIHJzY2hhcg0K
LSAgICAgICAgICAgIHJzX2lkeCArPSAxDQotICAgICAgICAgIGVuZA0KKyAg
ICAgICAgICBmc19pZHggKz0gMSBpZiBmc2NoYXINCisgICAgICAgICAgcnNf
aWR4ICs9IDEgaWYgcnNjaGFyDQogICAgICAgICAgIHNlcCA9IG5pbA0KICAg
ICAgICAgICBpZiBmc19pZHggPT0gZnNfc2l6ZQ0KICAgICAgICAgICAgIGlm
IHN0YXRlID09IDpTVF9TVEFSVCBhbmQgcnNfaWR4ID4gMCBhbmQgZnNfaWR4
IDwgcnNfaWR4DQpAQCAtNDE1LDkgKzQwOSw3IEBADQogICAgICAgICAgICAg
Y2VsbCA8PCBzcmNbbGFzdF9pZHgsIChpZHggLSBsYXN0X2lkeCAtIChmc19z
aXplIC0gMSkpXQ0KICAgICAgICAgICAgIGxhc3RfaWR4ID0gaWR4DQogICAg
ICAgICAgICAgZnNfaWR4ID0gcnNfaWR4ID0gMA0KLSAgICAgICAgICAgIGlm
IGNyDQotICAgICAgICAgICAgICByYWlzZSBJbGxlZ2FsRm9ybWF0RXJyb3IN
Ci0gICAgICAgICAgICBlbmQNCisgICAgICAgICAgICByYWlzZSBJbGxlZ2Fs
Rm9ybWF0RXJyb3IgaWYgY3INCiAgICAgICAgICAgICBzZXAgPSA6RFRfQ09M
U0VQDQogICAgICAgICAgIGVsc2lmIHJzX2lkeCA9PSByc19zaXplDQogICAg
ICAgICAgICAgaWYgc3RhdGUgPT0gOlNUX1NUQVJUIGFuZCBmc19pZHggPiAw
IGFuZCByc19pZHggPCBmc19pZHgNCkBAIC00MzEsMjAgKzQyMywxOSBAQA0K
ICAgICAgICAgICAgIHNlcCA9IDpEVF9ST1dTRVANCiAgICAgICAgICAgZW5k
DQogICAgICAgICAgIGlmIHNlcA0KLSAgICAgICAgICAgIGlmIHN0YXRlID09
IDpTVF9EQVRBDQotICAgICAgICAgICAgICByZXR1cm4gc2VwLCBpZHggKyAx
LCBjZWxsOw0KLSAgICAgICAgICAgIGVsc2lmIHN0YXRlID09IDpTVF9RVU9U
RQ0KLSAgICAgICAgICAgICAgcmV0dXJuIHNlcCwgaWR4ICsgMSwgY2VsbDsN
Ci0gICAgICAgICAgICBlbHNlICAjIDpTVF9TVEFSVA0KLSAgICAgICAgICAg
ICAgcmV0dXJuIHNlcCwgaWR4ICsgMSwgbmlsDQorICAgICAgICAgICAgcmV0
dXJuIHNlcCwgaWR4ICsgMSwgY2FzZSBzdGF0ZQ0KKyAgICAgICAgICAgIHdo
ZW4gOlNUX0RBVEEsIDpTVF9RVU9URQ0KKyAgICAgICAgICAgICAgIGNlbGwN
CisgICAgICAgICAgICB3aGVuIDpTVF9TVEFSVA0KKyAgICAgICAgICAgICAg
IG5pbA0KKyAgICAgICAgICAgIGVsc2UgIA0KKyAgICAgICAgICAgICAgcmFp
c2UgVW5rbm93blN0YXRlDQogICAgICAgICAgICAgZW5kDQogICAgICAgICAg
IGVuZA0KICAgICAgICAgZWxzaWYgcnMubmlsPyBhbmQgYyA9PSA/XHINCiAg
ICAgICAgICAgIyBzcGVjaWFsIFxyIHRyZWF0bWVudCBmb3IgYmFja3dhcmQg
Y29tcGF0aWJpbGl0eQ0KICAgICAgICAgICBmc19pZHggPSByc19pZHggPSAw
DQotICAgICAgICAgIGlmIGNyDQotICAgICAgICAgICAgcmFpc2UgSWxsZWdh
bEZvcm1hdEVycm9yDQotICAgICAgICAgIGVuZA0KKyAgICAgICAgICByYWlz
ZSBJbGxlZ2FsRm9ybWF0RXJyb3IgaWYgY3INCiAgICAgICAgICAgY2VsbCA8
PCBzcmNbbGFzdF9pZHgsIChpZHggLSBsYXN0X2lkeCldDQogICAgICAgICAg
IGxhc3RfaWR4ID0gaWR4DQogICAgICAgICAgIGlmIHF1b3RlZA0KQEAgLTQ1
NCwxMyArNDQ1LDE0IEBADQogICAgICAgICAgIGVuZA0KICAgICAgICAgZWxz
ZQ0KICAgICAgICAgICBmc19pZHggPSByc19pZHggPSAwDQotICAgICAgICAg
IGlmIHN0YXRlID09IDpTVF9EQVRBIG9yIHN0YXRlID09IDpTVF9TVEFSVA0K
LSAgICAgICAgICAgIGlmIGNyDQotICAgICAgICAgICAgICByYWlzZSBJbGxl
Z2FsRm9ybWF0RXJyb3INCi0gICAgICAgICAgICBlbmQNCisgICAgICAgICAg
Y2FzZSBzdGF0ZSANCisgICAgICAgICAgd2hlbiA6U1RfREFUQSwgOlNUX1NU
QVJUDQorICAgICAgICAgICAgcmFpc2UgSWxsZWdhbEZvcm1hdEVycm9yIGlm
IGNyDQogICAgICAgICAgICAgc3RhdGUgPSA6U1RfREFUQQ0KLSAgICAgICAg
ICBlbHNlICAjIDpTVF9RVU9URQ0KKyAgICAgICAgICB3aGVuIDpTVF9RVU9U
RQ0KICAgICAgICAgICAgIHJhaXNlIElsbGVnYWxGb3JtYXRFcnJvcg0KKyAg
ICAgICAgICBlbHNlIA0KKyAgICAgICAgICAgIHJhaXNlIFVua25vd25TdGF0
ZQ0KICAgICAgICAgICBlbmQNCiAgICAgICAgIGVuZA0KICAgICAgICAgaWR4
ICs9IDENCkBAIC00NzEsOSArNDYzLDcgQEANCiAgICAgICAgIGVsc2UNCiAg
ICAgICAgICAgcmV0dXJuIDpEVF9FT1MsIGlkeCwgbmlsDQogICAgICAgICBl
bmQNCi0gICAgICBlbHNpZiBxdW90ZWQNCi0gICAgICAgIHJhaXNlIElsbGVn
YWxGb3JtYXRFcnJvcg0KLSAgICAgIGVsc2lmIGNyDQorICAgICAgZWxzaWYg
cXVvdGVkIG9yIGNyDQogICAgICAgICByYWlzZSBJbGxlZ2FsRm9ybWF0RXJy
b3INCiAgICAgICBlbmQNCiAgICAgICBjZWxsIDw8IHNyY1tsYXN0X2lkeCwg
KGlkeCAtIGxhc3RfaWR4KV0NCkBAIC04MDQsNyArNzk0LDcgQEANCiAgICAg
ICBpZiBpZHggPCAwDQogICAgICAgICByZXR1cm4gbmlsDQogICAgICAgZW5k
DQotICAgICAgaWYgKGlkeF9pc19lb3M/KGlkeCkpDQorICAgICAgaWYgKGlk
eF9pc19lb3M/KQ0KICAgICAgICAgaWYgbiBhbmQgKEBvZmZzZXQgKyBpZHgg
PT0gYnVmX3NpemUoQGN1cl9idWYpKQ0KICAgICAgICAgICAjIExpa2UgYSBT
dHJpbmcsICdhYmMnWzQsIDFdIHJldHVybnMgbmlsIGFuZA0KICAgICAgICAg
ICAjICdhYmMnWzMsIDFdIHJldHVybnMgJycgbm90IG5pbC4NCkBAIC04MTgs
MTMgKzgwOCwxMiBAQA0KICAgICAgIG5leHRfaWR4ID0gaWR4DQogICAgICAg
d2hpbGUgKG15X29mZnNldCArIG5leHRfaWR4ID49IGJ1Zl9zaXplKG15X2J1
ZikpDQogICAgICAgICBpZiAobXlfYnVmID09IEBidWZfdGFpbF9pZHgpDQot
ICAgICAgICAgIHVubGVzcyBhZGRfYnVmDQotICAgICAgICAgICAgYnJlYWsN
Ci0gICAgICAgICAgZW5kDQorICAgICAgICAgIGJyZWFrIHVubGVzcyBhZGRf
YnVmDQogICAgICAgICBlbmQNCiAgICAgICAgIG5leHRfaWR4ID0gbXlfb2Zm
c2V0ICsgbmV4dF9pZHggLSBidWZfc2l6ZShteV9idWYpDQogICAgICAgICBt
eV9idWYgKz0gMQ0KICAgICAgICAgbXlfb2Zmc2V0ID0gMA0KKyAgICAgICAg
IyBpLmUuIGxvYyA9IG15X29mZnNldCArIG5leHRfaWR4IGJlY2F1c2UgbXlv
ZmZzZXQgaXMgMA0KICAgICAgIGVuZA0KICAgICAgIGxvYyA9IG15X29mZnNl
dCArIG5leHRfaWR4DQogICAgICAgaWYgIW4NCkBAIC04NTUsOSArODQ0LDkg
QEANCiAgICAgICBpZiBpc19lb3M/DQogICAgICAgICByZXR1cm4gMA0KICAg
ICAgIGVuZA0KLSAgICAgIHNpemVfZHJvcHBlZCA9IDANCisgICAgICBic2Mg
PSBzaXplX2Ryb3BwZWQgPSAwDQogICAgICAgd2hpbGUgKG4gPiAwKQ0KLSAg
ICAgICAgaWYgIUBpc19lb3Mgb3IgKEBjdXJfYnVmICE9IEBidWZfdGFpbF9p
ZHgpDQorICAgICAgICAjIGlmICFAaXNfZW9zIG9yIChAY3VyX2J1ZiAhPSBA
YnVmX3RhaWxfaWR4KSAjIHJlZHVuZGFudD8gSWYgaXQgZmFpbHMgbG9vcCBu
ZXZlciBleGl0cw0KICAgICAgICAgICBpZiAoQG9mZnNldCArIG4gPCBidWZf
c2l6ZShAY3VyX2J1ZikpDQogICAgICAgICAgICAgc2l6ZV9kcm9wcGVkICs9
IG4NCiAgICAgICAgICAgICBAb2Zmc2V0ICs9IG4NCkBAIC04NjgsMTkgKzg1
NywxNyBAQA0KICAgICAgICAgICAgIG4gLT0gc2l6ZQ0KICAgICAgICAgICAg
IEBvZmZzZXQgPSAwDQogICAgICAgICAgICAgdW5sZXNzIHJlbF9idWYNCi0g
ICAgICAgICAgICAgIHVubGVzcyBhZGRfYnVmDQotICAgICAgICAgICAgICAg
IGJyZWFrDQotICAgICAgICAgICAgICBlbmQNCisgICAgICAgICAgICAgIGJy
ZWFrIHVubGVzcyBhZGRfYnVmDQogICAgICAgICAgICAgICBAY3VyX2J1ZiA9
IEBidWZfdGFpbF9pZHgNCiAgICAgICAgICAgICBlbmQNCiAgICAgICAgICAg
ZW5kDQotICAgICAgICBlbmQNCisgICAgICAgICMgZW5kDQogICAgICAgZW5k
DQogICAgICAgc2l6ZV9kcm9wcGVkDQogICAgIGVuZA0KICAgDQogICAgIGRl
ZiBpc19lb3M/DQotICAgICAgcmV0dXJuIGlkeF9pc19lb3M/KDApDQorICAg
ICAgcmV0dXJuIGlkeF9pc19lb3M/DQogICAgIGVuZA0KICAgDQogICAgICMg
V0FSTjogRG8gbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHku
ICBEZWZpbmUgeW91ciBvd24gY2xhc3MNCkBAIC05MjksMTMgKzkxNiwxMiBA
QA0KICAgICAgIGlmIHN0cl9yZWFkLm5pbD8NCiAgICAgICAgIEBpc19lb3Mg
PSB0cnVlDQogICAgICAgICBAYnVmX2xpc3QucHVzaCgnJykNCi0gICAgICAg
IEBidWZfdGFpbF9pZHggKz0gMQ0KICAgICAgICAgZmFsc2UNCiAgICAgICBl
bHNlDQogICAgICAgICBAYnVmX2xpc3QucHVzaChzdHJfcmVhZCkNCi0gICAg
ICAgIEBidWZfdGFpbF9pZHggKz0gMQ0KICAgICAgICAgdHJ1ZQ0KICAgICAg
IGVuZA0KKyAgICAgIEBidWZfdGFpbF9pZHggKz0gMQ0KICAgICBlbmQNCiAg
IA0KICAgICBkZWYgcmVsX2J1Zg0KQEAgLTk1Miw4ICs5MzgsOCBAQA0KICAg
ICAgIGVuZA0KICAgICBlbmQNCiAgIA0KLSAgICBkZWYgaWR4X2lzX2Vvcz8o
aWR4KQ0KLSAgICAgIChAaXNfZW9zIGFuZCAoKEBjdXJfYnVmIDwgMCkgb3Ig
KEBjdXJfYnVmID09IEBidWZfdGFpbF9pZHgpKSkNCisgICAgZGVmIGlkeF9p
c19lb3M/DQorICAgICAgKEBpc19lb3MgYW5kICgoQGN1cl9idWYgPT0gQGJ1
Zl90YWlsX2lkeCkgb3IgKEBjdXJfYnVmIDwgMCkpKQ0KICAgICBlbmQNCiAg
IA0KICAgICBCdWZTaXplID0gMTAyNCAqIDgNCg
---559023410-1141662977-11304968009167
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=test_csv.rb
Content-Transfer-Encoding: BASE64
Content-Description: 
Content-Disposition: attachment; filename=test_csv.rb

IyEvdXNyL2xvY2FsL2Jpbi9ydWJ5IC13DQojDQojIFRlc3QgdGhlIENTViBs
aWJyYXJ5IGFuZCB0aGUgbmV3IHZlcnNpb24gdG8gc2VlIHRoZXkgYXJlIHRo
ZSBzYW1lLg0KIw0KIw0KDQpURVNUX0RBVEExID0gPDxFTkQNCnRoaXMsIHRo
YXQsIG90aGVyDQpvbmUsIHR3bywgdGhyZWUNCjEsMiwzDQoiYSBzdHJpbmci
LCJxdW90ZSBcIlwiIGluIGEgc3RyaW5nIiwiY29tbWEgLCBpbiBhIHN0cmlu
ZyINCkVORA0KDQpNVUxUSVBMRSA9IDMwMA0KUk9XUz1bIFsidGhpcyIsICIg
dGhhdCIsICIgb3RoZXIiXSwNCiAgICAgICBbICJvbmUiLCAiIHR3byIsICIg
dGhyZWUiXSwNCiAgICAgICBbICIxIiwgIjIiLCAiMyJdLA0KICAgICAgIFsg
ImEgc3RyaW5nIiwgInF1b3RlIFwiIGluIGEgc3RyaW5nIiwgImNvbW1hICwg
aW4gYSBzdHJpbmciXQ0KXQ0KcmVxdWlyZSBBUkdWWzBdDQoNCm9wZW4oInRl
c3RfY3N2MS5kYXQiLCAidyIpIGRvIHxkYXRhfA0KICBkYXRhLnByaW50IFRF
U1RfREFUQTENCmVuZA0Kb3BlbigidGVzdF9jc3YyLmRhdCIsICJ3IikgZG8g
fGRhdGF8DQogIE1VTFRJUExFLnRpbWVzIGRvIHxpfA0KICAgIGRhdGEucHJp
bnQgVEVTVF9EQVRBMQ0KICBlbmQNCmVuZA0KDQpkZWYgYXNzZXJ0X2VxdWFs
KGEsYixtZXNzYWdlPSIje2EuaW5zcGVjdH0gIT0gI3tiLmluc3BlY3R9IikN
CiAgcmFpc2UgbWVzc2FnZSB1bmxlc3MgYSA9PSBiDQplbmQNCmNvdW50ID0g
MA0KWyJ0ZXN0X2NzdjEuZGF0IiwgInRlc3RfY3N2Mi5kYXQiXS5lYWNoIGRv
IHxwYXRofA0KICBwdXRzIHBhdGguaW5zcGVjdA0KICBDU1Yub3BlbihwYXRo
LCAiciIpIGRvIHxyb3d8DQogICAgIyBwdXRzIHJvdy5pbnNwZWN0DQogICAg
YXNzZXJ0X2VxdWFsKHJvdywgUk9XU1tjb3VudF0pDQogICAgY291bnQgPSAo
Y291bnQgKyAxKSAlIFJPV1Muc2l6ZQ0KICBlbmQNCmVuZA0KDQo--559023410-1141662977-11304968009167--
---559023410-1141662977-11304968009167--