[PATCH] linux epoll support

[email protected] (Rusty Conover) Sun, 11 Sep 2005 20:01:06 -0600
Newsgroups perl.loop
Organization InfoGears Inc.
Message-ID <[email protected]>
--------------030406070300070003010305
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

Hi All,

I've hacked together a patch to Event-1.06 to add epoll support on 
Linux.  Its enabled by adding -DHAS_EPOLL.  I've turned on that switch 
by default in the attached patch.  I've tested it on Fedora Core 3 with 
kernel 2.6.11-1.14_FC3.

I thought about using libevent, but it turned out to be too hard to 
intermingle the event loops.

I'm interested in any feedback that anyone has. Especially any follow up 
assistance with properly detecting if epoll is available on the system 
and enabling it by default.  Do you think this code is suitable with 
putting into the main module? 

Here is a benchmark run with the epoll code enabled on a 1Ghz Intel 
Pentium 3:

 benchmark: 0.08
 Event: 1.06

 perl 5.008007
 uname=Linux synthesis.labs.infogears.com 2.6.11-1.14_FC3 #1 Thu Apr 7 19:23:49 EDT 2005 i686 i686 i386 GNU/Linux
 cc='cc', optimize='-O2'
 ccflags='-fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm'

Elapse Time:     99.94% of 11 seconds
Timer/sec:       98.43% (803 total)
Io/sec:          55665.822 (611936 total)
Signals/sec      1.91
Events/sec       59219.892
Null/sec         547318
Event/Null       10.82%

Thanks,

Rusty

-- 
Rusty Conover
InfoGears Inc.
http://www.infogears.com
406-587-5432



--------------030406070300070003010305
Content-Type: text/plain;
 name="epoll.diff"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="epoll.diff"

ZGlmZiAtdXIgRXZlbnQtMS4wNi9jL3VuaXguYyAvaG9tZS9yY29ub3Zlci9FdmVudC0xLjA2
L2MvdW5peC5jCi0tLSBFdmVudC0xLjA2L2MvdW5peC5jCTIwMDUtMDktMTEgMTQ6MTA6Mzgu
MDAwMDAwMDAwIC0wNjAwCisrKyAvaG9tZS9yY29ub3Zlci9FdmVudC0xLjA2L2MvdW5peC5j
CTIwMDUtMDktMTEgMTk6Mzg6NDguMDAwMDAwMDAwIC0wNjAwCkBAIC0xLDMgKzEsMjA4IEBA
CisjaWYgZGVmaW5lZChIQVNfRVBPTEwpCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNp
bmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4KKyNpbmNs
dWRlIDxzeXMvZXBvbGwuaD4KKworc3RydWN0IGVwb2xsb3AgeworCS8qIHdhdGNoZXIgcG9p
bnRlcnMgKi8KKwlwZV9pbyAqKmZkczsKKwlpbnQgbmZkczsKKwlzdHJ1Y3QgZXBvbGxfZXZl
bnQgKmV2ZW50czsKKwlpbnQgbmV2ZW50czsKKwlpbnQgZXBmZDsKK307CisKK3N0cnVjdCBl
cG9sbG9wIGVwb2xsb3A7CisKKworI2VuZGlmIC8qIEhBU19FUE9MTCAqLworCisvKiBRdWV1
ZSBzb21lIElPIGJhY2sgaW50byB0aGUgY2FsbGJhY2sgc3lzdGVtIGZvciBzb21lIGJpdHMg
Ki8KK3N0YXRpYyB2b2lkIF9xdWV1ZV9pbyhwZV9pbyAqd2EsIGludCBnb3QpIHsKKyAgICBw
ZV9pb2V2ZW50ICpldjsKKyAgICBnb3QgJj0gd2EtPnBvbGw7CisgICAgaWYgKCFnb3QpIHsK
KwlpZiAoV2FERUJVR3god2EpID49IDMpIHsKKwkgICAgU1RSTEVOIG5fYTsKKwkgICAgd2Fy
bigiRXZlbnQ6IGlvICclcycgcXVldWVkIG5vdGhpbmciLCBTdlBWKHdhLT5iYXNlLmRlc2Ms
IG5fYSkpOworCX0KKwlyZXR1cm47CisgICAgfQorICAgIGV2ID0gKHBlX2lvZXZlbnQqKSAo
KndhLT5iYXNlLnZ0YmwtPm5ld19ldmVudCkoKHBlX3dhdGNoZXIqKSB3YSk7CisgICAgKytl
di0+YmFzZS5oaXRzOworICAgIGV2LT5nb3QgfD0gZ290OyAgICAKKyAgICBxdWV1ZUV2ZW50
KChwZV9ldmVudCopIGV2KTsKK30KKworc3RhdGljIHZvaWQgYm9vdF9lcG9sbCgpIHsKKyNp
ZiBkZWZpbmVkKEhBU19FUE9MTCkKKwlzdHJ1Y3QgcmxpbWl0IHJsOworCWludCBlcGZkLCBu
ZmlsZXM7CisKKwkvKiBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBhYmxl
IHRvIGJlIG9wZW5lZCBpbiB0aGlzIHByb2Nlc3MKKwkgICBhbmQgYWxsb2NhdGUgZW5vdWdo
IHNsb3RzIHRvIGhhbmRsZSBhbGwgb2YgdGhlbSAqLworCWlmIChnZXRybGltaXQoUkxJTUlU
X05PRklMRSwgJnJsKSA9PSAwKSB7CisJCWlmKHJsLnJsaW1fY3VyICE9IFJMSU1fSU5GSU5J
VFkpIHsKKwkJCW5maWxlcyA9IHJsLnJsaW1fY3VyOworCQl9IGVsc2UgeworCQkJLyogQW4g
YXJiaXRyYXJ5IGxpbWl0IG9mIGRlc2NyaXB0b3JzICovCisJCQluZmlsZXMgPSA2NCoxMDI0
KjEwMjQ7CisJCX0KKwl9IGVsc2UgeworCQljcm9haygiRmFpbGVkIHRvIGdldCBvcGVuZWQg
ZmlsZSBoYW5kbGUgbGltaXQiKTsKKwl9CisJCisJLyogSW5pdGFsaXplIHRoZSBrZXJuZWwg
cXVldWUsIHdpdGggYW4gaW5pdGlhbCBzaXplIG9mCisJIGRlc2NyaXB0b3JzLCBkb24ndCBz
aXplIHRvIHRoZSBtYXhpbXVtIGhlcmUsIHNpbmNlIHRoZSBrZXJuZWwKKwkgd2lsbCBhdXRv
bWF0aWNhbGx5IHJlc2l6ZS4gKi8KKworCWlmICgoZXBmZCA9IGVwb2xsX2NyZWF0ZSgxMDAp
KSA9PSAtMSkgeworCQljcm9haygiRmFpbGVkIHRvIGNyZWF0ZSBlcG9sbCB3aXRoICVkIGZp
bGVzIiwgbmZpbGVzKTsKKwl9CisKKwkvKiBzZXQgdGhlIGNsb3NlIG9uIGV4ZWMgZmxhZyAq
LworCWZjbnRsKGVwZmQsIEZfU0VURkQsIDEpOworCisJZXBvbGxvcC5lcGZkID0gZXBmZDsK
KwkKKwkvKiBJbml0IGFuZCBhbGxvYyBmaWVsZHMgKi8KKwlFdk5ldyg5LCBlcG9sbG9wLmV2
ZW50cywgbmZpbGVzLCBzdHJ1Y3QgZXBvbGxfZXZlbnQpOworCWVwb2xsb3AubmV2ZW50cyA9
IG5maWxlczsKKworCUV2TmV3KDksIGVwb2xsb3AuZmRzLCBuZmlsZXMsIHBlX2lvICopOwor
CWVwb2xsb3AubmZkcyA9IG5maWxlczsKKworI2VuZGlmIC8qSEFTX0VQT0xMKi8KK30KKwor
CisKKworCisjaWYgZGVmaW5lZChIQVNfRVBPTEwpCisKK3N0YXRpYyB2b2lkIHBlX3N5c19z
bGVlcChkb3VibGUgbGVmdCkgeworCWludCByZXQ7CisJZG91YmxlIHQwID0gTlZ0aW1lKCk7
CisJZG91YmxlIHQxID0gdDAgKyBsZWZ0OworCXdoaWxlICgxKSB7CisJCS8qIE5vIG5lZWQg
dG8gY2FsbCBlcG9sbCBoZXJlIHdoZW4gcG9sbCB3aWxsIHdvcmsganVzdCBmaW5lICovCisJ
CXJldCA9IHBvbGwoMCwgMCwgKGludCkgKGxlZnQgKiAxMDAwKSk7IC8qIGhvcGUgemVyb2Vz
IG9rYXkgKi8KKwkJaWYgKHJldCA8IDAgJiYgZXJybm8gIT0gRUFHQUlOICYmIGVycm5vICE9
IEVJTlRSKQorCQkJY3JvYWsoInBvbGwoJS4yZikgZ290IGVycm5vICVkIiwgbGVmdCwgZXJy
bm8pOworCQlsZWZ0ID0gdDEgLSBOVnRpbWUoKTsKKwkJaWYgKGxlZnQgPiBJbnRlcnZhbEVw
c2lsb24pIHsKKwkJCWlmIChyZXQ9PTApICsrVGltZW91dFRvb0Vhcmx5OworCQkJY29udGlu
dWU7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBwZV9zeXNfaW9fYWRk
IChwZV9pbyAqZXYpIHsKKwlzdHJ1Y3Qgc3RhdCBidWY7CisJU1RSTEVOIG5fYTsJCisJaW50
IG9wID0gRVBPTExfQ1RMX0FERDsKKworCisJaWYgKGV2LT5mZCA8PSAwKSB7CisJCWNyb2Fr
KCJwZV9zeXNfaW9fYWRkOiBub24tdmFsaWQgZmQgKCVkKSIsIGV2LT5mZCk7CisJCXJldHVy
bjsKKwl9CisKKwlpZihldi0+cG9sbCAmIFBFX0UpIHsKKwkJZXBvbGxvcC5ldmVudHNbZXYt
PmZkXS5ldmVudHMgfD0gRVBPTExQUkk7CisJfQorCQorCWlmKGV2LT5wb2xsICYgUEVfUikg
eworCQllcG9sbG9wLmV2ZW50c1tldi0+ZmRdLmV2ZW50cyB8PSBFUE9MTElOIHwgRVBPTExQ
UkkgfCBFUE9MTEVSUiB8IEVQT0xMSFVQOworCX0KKwlpZihldi0+cG9sbCAmIFBFX1cpIHsK
KwkJZXBvbGxvcC5ldmVudHNbZXYtPmZkXS5ldmVudHMgfD0gRVBPTExPVVQgfCBFUE9MTEVS
UjsKKwl9CisJCisJLyogSWYgdGhpcyBkZXNjcmlwdG9yIGlzIGFscmVhZHkgdXNlZCB3ZSBu
ZWVkIHRvIG1vZGlmeSB0aGUgZmxhZ3MgKi8KKwlpZihlcG9sbG9wLmZkc1tldi0+ZmRdICE9
IE5VTEwpIHsKKwkJb3AgPSBFUE9MTF9DVExfTU9EOwkgICAgCisJfSAKKworCQorCWVwb2xs
b3AuZXZlbnRzW2V2LT5mZF0uZGF0YS5wdHIgPSBldjsKKwkgICAgICAgIAorCWlmIChlcG9s
bF9jdGwoZXBvbGxvcC5lcGZkLCBvcCwgZXYtPmZkLCAmZXBvbGxvcC5ldmVudHNbZXYtPmZk
XSkgPT0gLTEpIHsJCQorCQkvKiBDaGVjayBpZiBpdHMgYSBiYWQgZGVzY3JpcHRvciAqLwor
CQlpZiAoZXYtPmZkID49IDAgJiYgUGVybExJT19mc3RhdChldi0+ZmQsICZidWYpIDwgMCAm
JiBlcnJubyA9PSBFQkFERikgeworCQkgICAgd2FybigiRXZlbnQ6ICclcycgd2FzIHVuZXhw
ZWN0ZWRseSBjbG9zZWQiLAorCQkJIFN2UFYoZXYtPmJhc2UuZGVzYywgbl9hKSk7CisJCSAg
ICBwZV9pb19yZXNldF9oYW5kbGUoKHBlX3dhdGNoZXIqKSBldik7CisJCSAgICByZXR1cm47
CisJCX0KKwkJY3JvYWsoIkZhaWxlZCB0byBjaGFuZ2UgdGhlIGVwb2xsIHNldHRpbmdzIHVu
a25vd24gZXJyb3IiLCBldi0+ZmQpOworCX0KKworCS8qIFNhdmUgdGhlIHBvaW50ZXIgdG8g
dGhlIGN1cnJlbnQgZXZlbnQgKi8KKwllcG9sbG9wLmZkc1tldi0+ZmRdID0gZXY7ICAgIAor
CXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcGVfc3lzX2lvX2RlbCAocGVfaW8gKmV2KSB7
CisJaWYoZXYtPmZkIDwgMCkgeworCQlyZXR1cm47CisJfQorCisJaWYgKGVwb2xsX2N0bChl
cG9sbG9wLmVwZmQsIEVQT0xMX0NUTF9ERUwsIGV2LT5mZCwgJmVwb2xsb3AuZXZlbnRzW2V2
LT5mZF0pID09IC0xKQorCQljcm9haygiRmFpbGVkIHRvIGRlbGV0ZSBmcm9tIGVwb2xsIik7
CisKKwllcG9sbG9wLmZkc1tldi0+ZmRdID0gMDsKKwkKKwlyZXR1cm47Cit9CisKKworc3Rh
dGljIHZvaWQgcGVfc3lzX211bHRpcGxleChkb3VibGUgdGltZW91dCkgeworCWludCBpLCBy
ZXMsIHJlYWxfdGltZW91dDsKKwkKKwlpZih0aW1lb3V0IDw9IDApIHsKKwkJcmVhbF90aW1l
b3V0ID0gMDsKKwl9IGVsc2UgeworCQlyZWFsX3RpbWVvdXQgPSB0aW1lb3V0ICogMTAwMDsK
Kwl9CisKKwlyZXMgPSBlcG9sbF93YWl0KGVwb2xsb3AuZXBmZCwgZXBvbGxvcC5ldmVudHMs
IGVwb2xsb3AubmV2ZW50cywgcmVhbF90aW1lb3V0KTsKKwkKKwlpZiAocmVzID09IC0xKSB7
CisJCXJldHVybjsKKwl9CisJCisJZm9yIChpID0gMDsgaSA8IHJlczsgaSsrKSB7CisJCWlu
dCB3aGF0ID0gZXBvbGxvcC5ldmVudHNbaV0uZXZlbnRzOwkJCisJCXBlX2lvICp0aGlzX3dh
dGNoZXIgPSAoc3RydWN0IHBlX2lvICopZXBvbGxvcC5ldmVudHNbaV0uZGF0YS5wdHI7Cisg
ICAKKwkJLyogSW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yIHNpZ25hbCBlaXRoZXIgdGhlIHJl
YWQgb3IgdGhlIHdyaXRlIGNhbGxiYWNrICovCisgICAgICAgICAgICAgICAgaWYgKHdoYXQg
JiBFUE9MTEhVUCB8fCB3aGF0ICYgRVBPTExFUlIpIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHdoYXQgfD0gRVBPTExJTiB8IEVQT0xMT1VUOworCQl9CisKKwkJaWYgKHdoYXQgJiBF
UE9MTElOKSB7CisJCQlfcXVldWVfaW8odGhpc193YXRjaGVyLCBQRV9SKTsKKwkJfQorCisJ
CWlmICh3aGF0ICYgRVBPTExPVVQpIHsKKwkJCV9xdWV1ZV9pbyh0aGlzX3dhdGNoZXIsIFBF
X1cpOworCQl9CisJfQorCXJldHVybjsKK30KKworI2VuZGlmIC8qIEhBU19FUE9MTCAqLwor
CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVQT0xMICovCisKKworCiAj
aWYgZGVmaW5lZChIQVNfREVWUE9MTCkKICNpbmNsdWRlIDxzeXMvZGV2cG9sbC5oPgogICAg
IHN0YXRpYyBpbnQgZHBmZD0wOwpAQCAtNTMsMjQgKzI1OCw5IEBACiAgICAgcmV0dXJuIC0x
OwogfQogCi1zdGF0aWMgdm9pZCBfcXVldWVfaW8ocGVfaW8gKndhLCBpbnQgZ290KSB7Ci0g
ICAgcGVfaW9ldmVudCAqZXY7Ci0gICAgZ290ICY9IHdhLT5wb2xsOwotICAgIGlmICghZ290
KSB7Ci0JaWYgKFdhREVCVUd4KHdhKSA+PSAzKSB7Ci0JICAgIFNUUkxFTiBuX2E7Ci0JICAg
IHdhcm4oIkV2ZW50OiBpbyAnJXMnIHF1ZXVlZCBub3RoaW5nIiwgU3ZQVih3YS0+YmFzZS5k
ZXNjLCBuX2EpKTsKLQl9Ci0JcmV0dXJuOwotICAgIH0KLSAgICBldiA9IChwZV9pb2V2ZW50
KikgKCp3YS0+YmFzZS52dGJsLT5uZXdfZXZlbnQpKChwZV93YXRjaGVyKikgd2EpOwotICAg
ICsrZXYtPmJhc2UuaGl0czsKLSAgICBldi0+Z290IHw9IGdvdDsKLSAgICBxdWV1ZUV2ZW50
KChwZV9ldmVudCopIGV2KTsKLX0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKiogREVWUE9MTCAqLwotI2lmIGRlZmluZWQoSEFTX0RFVlBP
TEwpICYmICFQRV9TWVNfSU8KKyNpZiBkZWZpbmVkKEhBU19ERVZQT0xMKSAmJiAhUEVfU1lT
X0lPICYmICFkZWZpbmVkKEhBU19FUE9MTCkKICNkZWZpbmUgUEVfU1lTX0lPIDEKIAogc3Rh
dGljIHZvaWQgcGVfc3lzX3NsZWVwKGRvdWJsZSBsZWZ0KSB7CkBAIC0yMjksNyArNDE5LDcg
QEAKICNlbmRpZiAvKkhBU19ERVZQT0xMKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKiogUE9MTCAqLwotI2lmIGRlZmluZWQoSEFTX1BP
TEwpICYmICFQRV9TWVNfSU8KKyNpZiBkZWZpbmVkKEhBU19QT0xMKSAmJiAhUEVfU1lTX0lP
ICYmICFkZWZpbmVkKEhBU19FUE9MTCkKICNkZWZpbmUgUEVfU1lTX0lPIDEKIAogc3RhdGlj
IHN0cnVjdCBwb2xsZmQgKlBvbGxmZD0wOwpAQCAtMzQ2LDcgKzUzNiw3IEBACiAKIAogLyoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0VMRUNU
ICovCi0jaWYgZGVmaW5lZChIQVNfU0VMRUNUKSAmJiAhUEVfU1lTX0lPCisjaWYgZGVmaW5l
ZChIQVNfU0VMRUNUKSAmJiAhUEVfU1lTX0lPICYmICFkZWZpbmVkKEhBU19FUE9MTCkKICNk
ZWZpbmUgUEVfU1lTX0lPIDEKIAogc3RhdGljIGludCBOZmRzOwpkaWZmIC11ciBFdmVudC0x
LjA2L0NoYW5nZUxvZyAvaG9tZS9yY29ub3Zlci9FdmVudC0xLjA2L0NoYW5nZUxvZwotLS0g
RXZlbnQtMS4wNi9DaGFuZ2VMb2cJMjAwNS0wOS0xMSAxNDoxMDozOC4wMDAwMDAwMDAgLTA2
MDAKKysrIC9ob21lL3Jjb25vdmVyL0V2ZW50LTEuMDYvQ2hhbmdlTG9nCTIwMDUtMDktMTEg
MTk6NDQ6MTMuMDAwMDAwMDAwIC0wNjAwCkBAIC0xLDMgKzEsMTQgQEAKKzIwMDUtMDktMTEg
ICAgPHJjb25vdmVyQGluZm9nZWFycy5jb20+CisKKwkqIEFkZCBlcG9sbCBzdXBwb3J0IG9u
IGxpbnV4LCBlbmFibGVkIHdpdGggLURIQVNfRVBPTEwKKworCSogQ2hhbmdlIHRoZSB0L2lv
LnQgdGVzdCB0byBhZGQgdGhlIHdhcm5pbmcgaGFuZGxlciBiZWZvcmUgdGhlIGZkCisJaXMg
YWRkZWQgdG8gdGhlIEV2ZW50IG9iamVjdCwgYmVjYXVzZSB3aXRoIGVwb2xsIHRoZSBFQkFE
RiBlcnJvcgorCXdpbGwgYmUgcmVwb3J0ZWQgd2hlbiB0aGUgZmQgaXMgYWRkZWQgdG8gdGhl
IGVwb2xsIGZkLgorCisJKiBDaGFuZ2UgRXZlbnQueHMgdG8gY2FsbCBib290X2Vwb2xsKCkg
dG8gaW5pdGlhbGl6ZSB0aGUgZXBvbGwgZmQsCisJc28gaXQgY2FuIGJlIHVzZWQgbGF0ZXIg
b24uCisKIDIwMDUtMDUtMTQgICAgPGpvc2h1YUBhbHdheXMuam95LmV0aC5uZXQ+CiAKIAkq
IFJlbGVhc2UgMS4wNi4KT25seSBpbiAvaG9tZS9yY29ub3Zlci9FdmVudC0xLjA2OiBDaGFu
Z2VMb2d+CmRpZmYgLXVyIEV2ZW50LTEuMDYvRXZlbnQueHMgL2hvbWUvcmNvbm92ZXIvRXZl
bnQtMS4wNi9FdmVudC54cwotLS0gRXZlbnQtMS4wNi9FdmVudC54cwkyMDA1LTA5LTExIDE0
OjEwOjM4LjAwMDAwMDAwMCAtMDYwMAorKysgL2hvbWUvcmNvbm92ZXIvRXZlbnQtMS4wNi9F
dmVudC54cwkyMDA1LTA5LTExIDE5OjI3OjI3LjAwMDAwMDAwMCAtMDYwMApAQCAtMjk2LDYg
KzI5Niw3IEBACiAgIGJvb3RfaWRsZSgpOwogICBib290X3RpbWVyKCk7CiAgIGJvb3RfaW8o
KTsKKyAgYm9vdF9lcG9sbCgpOwogICBib290X2RldnBvbGwoKTsKICAgYm9vdF92YXIoKTsK
ICAgYm9vdF90aWVkKCk7CmRpZmYgLXVyIEV2ZW50LTEuMDYvTWFrZWZpbGUuUEwgL2hvbWUv
cmNvbm92ZXIvRXZlbnQtMS4wNi9NYWtlZmlsZS5QTAotLS0gRXZlbnQtMS4wNi9NYWtlZmls
ZS5QTAkyMDA1LTA5LTExIDE0OjEwOjM4LjAwMDAwMDAwMCAtMDYwMAorKysgL2hvbWUvcmNv
bm92ZXIvRXZlbnQtMS4wNi9NYWtlZmlsZS5QTAkyMDA1LTA5LTExIDE5OjI3OjAxLjAwMDAw
MDAwMCAtMDYwMApAQCAtMTEsNiArMTEsNyBAQAogbXkgQG9wdD0oUFJFUkVRX1BNID0+IHsg
VGVzdCA9PiAxIH0sCiAJIFZFUlNJT05fRlJPTQk9PiAiLi9saWIvRXZlbnQucG0iLAogCSBO
QU1FICAgICAgCT0+ICJFdmVudCIsCisJIERFRklORSAgICAgICAgID0+ICctREhBU19FUE9M
TCcsCiAJIFRZUEVNQVBTICAgICAgID0+IFsnLi9saWIvRXZlbnQvdHlwZW1hcCddLAogCSBJ
TkMJCT0+ICctSWMgLUlsaWIvRXZlbnQnLAogCSBICQk9PiBbZ2xvYigiYy8qIiksIGdsb2Io
IiouaCIpLCAibGliL0V2ZW50L0V2ZW50QVBJLmgiXSwKT25seSBpbiAvaG9tZS9yY29ub3Zl
ci9FdmVudC0xLjA2L3Q6IGZvby5ydW4KZGlmZiAtdXIgRXZlbnQtMS4wNi90L2lvLnQgL2hv
bWUvcmNvbm92ZXIvRXZlbnQtMS4wNi90L2lvLnQKLS0tIEV2ZW50LTEuMDYvdC9pby50CTIw
MDUtMDktMTEgMTk6NDc6NDQuMDAwMDAwMDAwIC0wNjAwCisrKyAvaG9tZS9yY29ub3Zlci9F
dmVudC0xLjA2L3QvaW8udAkyMDA1LTA5LTExIDE1OjQ5OjQzLjAwMDAwMDAwMCAtMDYwMApA
QCAtMjMsMTIgKzIzLDYgQEAKIAogbXkgJG5vdGljZWRfYm9ndXNfZmQ9MDsKIG15ICRib2d1
c190aW1lb3V0PTA7Ci1teSAkYm9ndXMgPSBFdmVudC0+aW8oZGVzYyA9PiAnb29wcycsIHBv
bGwgPT4gJ3InLCBmZCA9PiAxMjMsCi0JCSAgICAgIHRpbWVvdXQgPT4gLjEsIGNiID0+IHN1
YiB7Ci0JCQkgICsrJGJvZ3VzX3RpbWVvdXQ7Ci0JCSAgICAgIH0pOwotCi1wcmludCAiYm9n
dXM6ICRib2d1c1xuIjsKIAogJFNJR3tfX1dBUk5fX30gPSBzdWIgewogICAgIG15ICRpc19p
dCA9ICRfWzBdID1+IG0vXCdvb3BzXCcgd2FzIHVuZXhwZWN0ZWRseS87CkBAIC0zOSw2ICsz
MywxMiBAQAogICAgIH0KIH07CiAKKworbXkgJGJvZ3VzID0gRXZlbnQtPmlvKGRlc2MgPT4g
J29vcHMnLCBwb2xsID0+ICdyJywgZmQgPT4gMTIzLAorCQkgICAgICB0aW1lb3V0ID0+IC4x
LCBjYiA9PiBzdWIgeworCQkJICArKyRib2d1c190aW1lb3V0OworCQkgICAgICB9KTsKKwog
c3ViIG5ld19waXBlIHsKICAgICBteSAoJGNudCkgPSBAXzsKICAgICBteSAoJHIsJHcpID0g
KGdlbnN5bSwgZ2Vuc3ltKTsK
--------------030406070300070003010305--