Path: csiph.com!usenet.pasdenom.info!weretis.net!feeder4.news.weretis.net!border2.nntp.ams2.giganews.com!border1.nntp.ams2.giganews.com!border3.nntp.ams.giganews.com!border1.nntp.ams.giganews.com!nntp.giganews.com!usenetcore.com!newsfeed.xs4all.nl!newsfeed6.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.000 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'author:': 0.03; 'else:': 0.03; 'string.': 0.04; 'append': 0.07; 'executed': 0.07; 'filename:fname piece:py': 0.07; 'sequences.': 0.07; 'skip:% 20': 0.07; 'python': 0.09; '#print': 0.09; "'''": 0.09; '32-bit': 0.09; '[];': 0.09; 'assumed': 0.09; 'behavior,': 0.09; 'notes:': 0.09; 'skip:# 60': 0.09; 'toc': 0.09; 'def': 0.10; 'index': 0.13; 'vista': 0.13; '(must': 0.16; 'indexerror:': 0.16; 'messy': 0.16; 'mug': 0.16; 'run.': 0.16; 'skip:[ 50': 0.16; 'true:': 0.16; 'string': 0.17; 'wrote:': 0.17; 'char': 0.17; 'element': 0.17; 'string,': 0.17; '>>>': 0.18; 'windows': 0.19; 'math': 0.20; 'parameters': 0.20; 'python?': 0.20; 'import': 0.21; '"",': 0.22; 'assignment': 0.22; 'clock': 0.22; 'delta': 0.22; 'displayed': 0.22; 'skip:% 10': 0.22; 'runs': 0.22; 'attached.': 0.23; 'elements': 0.23; 'task': 0.23; '(this': 0.24; 'random': 0.24; 'testing': 0.24; 'header:User-Agent:1': 0.26; 'charset:iso-8859-15': 0.26; '(most': 0.27; 'possibility': 0.27; 'instead.': 0.27; 'initial': 0.28; 'run': 0.28; '100000': 0.29; '>>>>': 0.29; 'cpu': 0.29; "d'aprano": 0.29; 'seed': 0.29; "skip:' 50": 0.29; 'steven': 0.29; 'character': 0.29; 'words': 0.29; 'skip:& 10': 0.29; '(from': 0.30; 'checks': 0.30; 'resolution': 0.30; 'seconds': 0.30; 'lists': 0.31; 'code': 0.31; 'skip:- 30': 0.31; 'file': 0.32; 'print': 0.32; 'traceback': 0.33; 'version:': 0.33; 'to:addr:python-list': 0.33; 'thanks': 0.34; 'list': 0.35; 'clear': 0.35; 'fail': 0.35; 'false': 0.35; 'faster': 0.35; 'but': 0.36; 'characters': 0.36; 'generation': 0.36; 'skip:g 30': 0.36; 'email addr:python.org': 0.36; 'method': 0.36; 'should': 0.36; 'itself': 0.37; '(for': 0.37; 'passed': 0.37; 'subject:: ': 0.38; 'mean': 0.38; 'gives': 0.39; 'to:addr:python.org': 0.39; 'received:192': 0.39; 'skip:" 10': 0.40; 'received:192.168': 0.40; 'your': 0.60; 'easy': 0.60; 'range': 0.60; 'leading': 0.61; 'containing': 0.61; 'received:62': 0.62; 'email name:python-list': 0.62; 'strange': 0.62; 'different': 0.63; 'email addr:gmail.com': 0.63; 'note:': 0.64; 'here': 0.65; 'charset:windows-1252': 0.65; 'results': 0.65; '10,000': 0.65; '10000': 0.65; '100': 0.78; 'completion': 0.78; '50%': 0.81; 'avg': 0.84; "d'aprano)": 0.84; 'otten': 0.84; 'otten)': 0.84; 'peter,': 0.84; '100,000': 0.91; 'average': 0.93 X-SENDER-IP: [213.112.50.224] X-LISTENER: [smtp.bredband.net] X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmIbAAwHLVDVcDLgPGdsb2JhbAANOItfrlwBAQEBN4JUAQEBfBwYCRYRBwMCAQIBDyIGASAGAgEBh3oDpwCKHg2JToolZIZXA45agSCEAoxfh2c X-IronPort-AV: E=Sophos;i="4.77,779,1336341600"; d="py'?scan'208,217";a="392097251" Date: Thu, 16 Aug 2012 16:31:47 +0200 From: Virgil Stokes User-Agent: Mozilla/5.0 (Windows NT 6.0; rv:15.0) Gecko/20120808 Thunderbird/15.0 MIME-Version: 1.0 To: python-list@python.org Subject: Re: Strange behavior Content-Type: multipart/mixed; boundary="------------040906040107050500000506" X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 383 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1345128356 news.xs4all.nl 6935 [2001:888:2000:d::a6]:45412 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:27166 This is a multi-part message in MIME format. --------------040906040107050500000506 Content-Type: multipart/alternative; boundary="------------050204000703070807090606" --------------050204000703070807090606 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit On 16-Aug-2012 15:02, Peter Otten wrote: > Virgil Stokes wrote: > >>>> def testFunc(startingList): >>>> xOnlyList = []; j = -1 >>>> for xl in startingList: >>>> if (xl[0] == 'x'): >>> That's going to fail in the starting list contains an empty string. Use >>> xl.startswith('x') instead. >> Yes, but this was by design (tacitly assumed that startingList was both a >> list and non-empty). > You missunderstood it will fail if the list contains an empty string, not if > the list itself is empty: > >>>> words = ["alpha", "", "xgamma"] >>>> [word for word in words if word[0] == "x"] > Traceback (most recent call last): > File "", line 1, in > IndexError: string index out of range > > The startswith() version: > >>>> [word for word in words if word.startswith("x")] > ['xgamma'] > > Also possible: > >>>> [word for word in words if word[:1] == "x"] > ['xgamma'] > >> def testFunc1(startingList): >> ''' >> Algorithm-1 >> Note: >> One should check for an empty startingList before >> calling testFunc1 -- If this possibility exists! >> ''' >> return([x for x in startingList if x[0] == 'x'], >> [x for x in startingList if x[0] != 'x']) >> >> >> I would be interested in seeing code that is faster than algorithm-1 > In pure Python? Perhaps the messy variant: > > def test_func(words): > nox = [] > append = nox.append > withx = [x for x in words if x[0] == 'x' or append(x)] > return withx, nox > > Very nice Peter, Here are the new results for timing with your method added (algorithm-3). Method average (sd) time in seconds algorithm-1 (list comprehension) 0.11774 (0.002968) algorithm-2 (S. D'Aprano) 0.17573 (0.003385) algorithm-2A (modified S. D'Aprano) 0.18116 (0.003081) algorithm-3 (improved list comprehension) 0.06639 (0.001728) Algorithm-3 is 43% faster than algorithm-1. Again, the code used to obtain these results is attached. Thanks Peter for your contribution --------------050204000703070807090606 Content-Type: text/html; charset=ISO-8859-15 Content-Transfer-Encoding: 8bit
On 16-Aug-2012 15:02, Peter Otten wrote:
Virgil Stokes wrote:

def testFunc(startingList):
xOnlyList = []; j = -1
for xl in startingList:
if (xl[0] == 'x'):
That's going to fail in the starting list contains an empty string. Use
xl.startswith('x') instead.
Yes, but this was by design (tacitly assumed that startingList was both a
list and non-empty).
You missunderstood it will fail if the list contains an empty string, not if 
the list itself is empty: 

words = ["alpha", "", "xgamma"]
[word for word in words if word[0] == "x"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

The startswith() version:

[word for word in words if word.startswith("x")]
['xgamma']

Also possible:

[word for word in words if word[:1] == "x"]
['xgamma']

def testFunc1(startingList): 
     ''' 
       Algorithm-1 
       Note: 
         One should check for an empty startingList before 
         calling testFunc1 -- If this possibility exists! 
     ''' 
     return([x for x in startingList if x[0] == 'x'], 
            [x for x in startingList if x[0] != 'x']) 
 

I would be interested in seeing code that is faster than algorithm-1
In pure Python? Perhaps the messy variant:

def test_func(words):
    nox = []
    append = nox.append
    withx = [x for x in words if x[0] == 'x' or append(x)]
    return withx, nox


Very nice Peter,

Here are the new results for timing with your method added (algorithm-3).

Method
average (sd) time in seconds
algorithm-1 (list comprehension)
0.11774 (0.002968)
algorithm-2 (S. D'Aprano)
0.17573 (0.003385)
algorithm-2A (modified S. D'Aprano)
0.18116 (0.003081)
algorithm-3 (improved list comprehension)
0.06639 (0.001728)

Algorithm-3 is 43% faster than algorithm-1.  Again, the code used to obtain these results is attached.

Thanks Peter for your contribution --------------050204000703070807090606-- --------------040906040107050500000506 Content-Type: text/plain; charset=windows-1252; name="testList4.py" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="testList4.py" JycnDQogIFB1cnBvc2U6IFRpbWUgZm91ciBkaWZmZXJlbnQgYWxnb3JpdGhtcyBmb3IgdGhl IHNhbWUgdGFzaw0KICANCiAgQXV0aG9yOiBWLiBTdG9rZXMgKHZzQGl0LnV1LnNlLCAyMDEy LTA4LTE2ICgxNTo0NiksIDIwMTItMDgtMTYpDQogIFJlZnM6DQogICBweXRob24tbGlzdEBw eXRob24ub3JnIGxpc3QNCiAgICAqIFN0cmFuZ2UgYmVoYXZpb3IsIDE0LUF1Zy0yMDEyIDE3 OjM4LCBsaWdodDFxdWFya0BnbWFpbC5jb20NCiAgICAqIFJlOiBTdHJhbmdlIGJlaGF2aW9y LCAxNC1BdWctMjAxMiAyMTo0MCwgU3Rva2VzLCBWaXJnaWwNCiAgICAqIFJlOiBTdHJhbmdl IGJlaGF2aW9yLCAxNS1BdWctMjAxMiAwMjoxOSwgU3RldmVuIEQnQXByYW5vDQogICAgKiBS ZTogU3RyYW5nZSBiZWhhdmlvciwgMTYtQXVnLTIwMTIgMTU6MDIsIFBldGVyIE90dGVuDQog IA0KICBOb3RlczoNCiAgIDEuIFRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb3Zl ciB0aGUgcnVucyAoTUMgc2ltdWxhdGlvbnMpDQogICAgICBhcmUgZXN0aW1hdGVkIHVzaW5n IHJlY3Vyc2l2ZSBlcXVhdGlvbnMuDQogICAyLiBBIHNlZWQgKHN5ZCkgaXMgdXNlZCB3aXRo IHRoZSBSTkcgZm9yIHJlcGVhdGFiaWxpdHkuIEVhY2ggcnVuIGlzIA0KICAgICAgc3RhcnRl ZCB3aXRoIGEgbmV3IHNlZWQgdG8gZm9yY2UgdGhlIGdlbmVyYXRpb24gb2YgaW5kZXBlbmRl bnQgDQogICAgICByYW5kb20gc2VxdWVuY2VzLg0KICAgMy4gV2FybmluZyEgTm8gY2hlY2tz IGFyZSBtYWRlIG9uIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0bw0KICAgICAgdGhlIGZ1bmN0 aW9ucyAodGhpcyB3YXMgYnkgZGVzaWduKS4NCiAgIDQuIE5vIGVmZm9ydCBoYXMgYmVlbiBt YWRlIHRvIG1ha2UgdGhpcyBjb2RlIGVsZWdhbnQuIE15IGZvY3VzIHdhcw0KICAgICAgdG8g bWFrZSB0aGUgY29kZSBjbGVhciBhbmQgZWFzeSB0byB1bmRlcnN0YW5kLg0KICAgNS4gVGhp cyB3YXMgZXhlY3V0ZWQgb24gYSBXaW5kb3dzIFZpc3RhIDMyLWJpdCBwbGF0Zm9ybSB3aXRo IFB5dGhvbiAyLjYuNg0KICAgICAgIFByb2Nlc3NvcjogSW50ZWwoUikgY29yZShUTSkyIER1 byBDUFUgRTg1MDBAMy4xNkdIeiAzLjE3R0h6DQogICA2LiBUaGUgZXN0aW1hdGVkIHRpbWUg dG8gY29tcGxldGlvbiBpcyBkaXNwbGF5ZWQgYWZ0ZXIgZWFjaCBydW4uICAgIA0KICAgICAg DQonJycNCmltcG9ydCByYW5kb20gYXMgcmFuZG9tDQppbXBvcnQgbWF0aCBhcyBtYXRoDQpm cm9tIHRpbWUgaW1wb3J0IGNsb2NrICMgY2xvY2sgZ2l2ZXMgZ29vZCByZXNvbHV0aW9uIG9u IE1TIFdpbmRvd3MNCg0KZGVmIHRlc3RGdW5jMShzdGFydGluZ0xpc3QpOiANCiAgICAnJycN CiAgICAgIEFsZ29yaXRobS0xDQogICAgICBOb3RlOiANCiAgICAgICAgT25lIHNob3VsZCBj aGVjayBmb3IgYW4gZW1wdHkgc3RhcnRpbmdMaXN0IGJlZm9yZSANCiAgICAgICAgY2FsbGlu ZyB0ZXN0RnVuYzEgLS0gSWYgdGhpcyBwb3NzaWJpbGl0eSBleGlzdHMhDQogICAgJycnDQog ICAgcmV0dXJuKFt4IGZvciB4IGluIHN0YXJ0aW5nTGlzdCBpZiB4WzBdID09ICd4J10sIA0K ICAgICAgICAgICBbeCBmb3IgeCBpbiBzdGFydGluZ0xpc3QgaWYgeFswXSAhPSAneCddKQ0K DQpkZWYgdGVzdEZ1bmMyKHdvcmRzKToNCiAgICAnJycNCiAgICAgIEFsZ29yaXRobS0yDQog ICAgJycnDQogICAgd29yZHNfd2l0aF94ID0gW10NCiAgICB3b3Jkc193aXRob3V0X3ggPSBb XQ0KICAgIGZvciB3b3JkIGluIHdvcmRzOg0KICAgICAgICBpZiB3b3JkLnN0YXJ0c3dpdGgo J3gnKToNCiAgICAgICAgICAgIHdvcmRzX3dpdGhfeC5hcHBlbmQod29yZCkNCiAgICAgICAg ZWxzZToNCiAgICAgICAgICAgIHdvcmRzX3dpdGhvdXRfeC5hcHBlbmQod29yZCkNCiAgICB3 b3Jkc1s6XSA9IHdvcmRzX3dpdGhvdXRfeCAgIyBzbGljZSBhc3NpZ25tZW50DQogICAgcmV0 dXJuIHdvcmRzX3dpdGhfeA0KDQpkZWYgdGVzdEZ1bmMyQSh3b3Jkcyk6DQogICAgJycnDQog ICAgICBBbGdvcml0aG0tMkENCiAgICAnJycNCiAgICB3b3Jkc193aXRoX3ggPSBbXQ0KICAg IHdvcmRzX3dpdGhvdXRfeCA9IFtdDQogICAgZm9yIHdvcmQgaW4gd29yZHM6DQogICAgICAg IGlmIHdvcmQuc3RhcnRzd2l0aCgneCcpOg0KICAgICAgICAgICAgd29yZHNfd2l0aF94LmFw cGVuZCh3b3JkKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgd29yZHNfd2l0aG91dF94 LmFwcGVuZCh3b3JkKQ0KICAgICN3b3Jkc1s6XSA9IHdvcmRzX3dpdGhvdXRfeCAgIyBzbGlj ZSBhc3NpZ25tZW50DQogICAgcmV0dXJuIHdvcmRzX3dpdGhfeCwgd29yZHNfd2l0aG91dF94 DQoNCmRlZiB0ZXN0RnVuYzMod29yZHMpOg0KICAgICcnJw0KICAgICAgQWxnb3JpdGhtLTMg KGZyb206IFBldGVyIE90dGVuKSANCiAgICAnJycNCiAgICBub3ggPSBbXQ0KICAgIGFwcGVu ZCA9IG5veC5hcHBlbmQNCiAgICB3aXRoeCA9IFt4IGZvciB4IGluIHdvcmRzIGlmIHhbMF0g PT0gJ3gnIG9yIGFwcGVuZCh4KV0NCiAgICByZXR1cm4gd2l0aHgsIG5veA0KDQoNCmRlZiBn ZW5TdHJMaXN0KE5DaGFyLE5TdHJuZyxBbHBoLGxlYWRDaHIpOg0KICAgICcnJw0KICAgICBQ dXJwb3NlOiBHZW5lcmF0ZSBhIGxpc3Qgb2YgTlN0cm5nIGVsZW1lbnRzIHdpdGggZWFjaCBl bGVtZW50IGEgc3RyaW5nDQogICAgICAgICAgICAgIG9mIGxlbmd0aCBOQ2hhciBhbmQgY29u c3RyYWluZWQgc3VjaCB0aGF0IGFwcHJveC4gNTAlIG9mIHRoZSANCiAgICAgICAgICAgICAg c3RyaW5ncyB3aWxsIGJlZ2luIHdpdGggdGhlIGNoYXJhY3RlciAoc3ltYm9sKSBsZWFkQ2hy DQogICAgICAgSW5wdXRzOiANCiAgICAgICAgICAgTkNoYXIgLS0gbnVtYmVyIG9mIGNoYXJh Y3RlcnMgaW4gZWFjaCBlbGVtZW50DQogICAgICAgICAgTlN0cm5nIC0tIG51bWJlciBvZiBl bGVtZW50cyBpbiBsaXN0IChzdHJnTGlzdCkNCiAgICAgICAgICAgIEFscGggLS0gbGlzdCBv ZiBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQgKG11c3QgY29udGFpbiB0aGUgbGVhZENocikNCiAg ICAgICAgIGxlYWRDaHIgLS0gbGVhZGluZyBjaGFyYWN0ZXIgZm9yIHN0cmluZ3MgdG8gYmUg Z2VuZXJhdGVkIGZyb20gQWxwaA0KICAgICAgIE90cHV0czoNCiAgICAgICAgc3RyZ0xpc3Qg LS0gbGlzdCB3aXRoIE5TdHJpbmcgc3RyaW5ncyBvZiBOQ2hhciBjaGFyYWN0ZXJzIChmcm9t IEFscGgpIGluIGVhY2ggICAgICAgICAgICAgICAgICAgIA0KICAgICcnJw0KICAgIE5TeW0g PSBsZW4oQWxwaCkNCiAgICBzdHJnTGlzdCA9IFtdDQogICAgZm9yIGkgaW4gcmFuZ2UoTlN0 cm5nKTogDQogICAgICAgIGlmIHJhbmRvbS5yYW5kb20oKSA8IDAuNTogDQogICAgICAgICAg ICBjaGFyID0gbGVhZENocg0KICAgICAgICBlbHNlOiANCiAgICAgICAgICAgIHdoaWxlIFRy dWU6DQogICAgICAgICAgICAgICAgaW5keCA9IHJhbmRvbS5yYW5kaW50KDAsTlN5bS0xKSAg ICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGNoYXIgPSBBbHBoW2luZHhdDQogICAgICAg ICAgICAgICAgaWYgY2hhciAhPSBsZWFkQ2hyOiBicmVhaw0KICAgICAgICAgICAgDQogICAg ICAgIGZvciBqIGluIHJhbmdlKDEsTkNoYXIpOg0KICAgICAgICAgICAgaW5keCA9IHJhbmRv bS5yYW5kaW50KDAsTlN5bS0xKSAgICAgICAgICAgIA0KICAgICAgICAgICAgY2hhciA9IGNo YXIgKyBBbHBoW2luZHhdDQogICAgICAgICAgICANCiAgICAgICAgc3RyZ0xpc3QuYXBwZW5k KGNoYXIpICAgDQogICAgICAgIA0KICAgIHJldHVybiBzdHJnTGlzdA0KDQojKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysN CkFscGggPSBbJ2EnLCdiJywnYycsJ2QnLCdlJywnZicsJ2cnLCdoJywnaScsJ2onLCdrJywn bCcsJ20nLA0KICAgICAgICAnbicsJ28nLCdwJywncScsJ3InLCdzJywndCcsJ3UnLCd2Jywn dycsJ3gnLCd5JywneiddDQoNCk5DaGFyID0gNCAgICAgICAgICMgNCBjaGFycyBwZXIgc3Ry aW5nDQpOU3RybmcgPSAxMDAwMDAgICAjIDEwMCwwMDAgc3RyaW5ncyBpbiBsaXN0IA0KTlJ1 bnMgPSAxMDAgICAgICAgIyAxMDAgcmFuZG9tIGxpc3RzIChudW1iZXIgb2YgTUMgc2ltdWxh dGlvbnMpDQoNCiMgRm9yIHF1aWNrIHRlc3RpbmcNCiNOQ2hhciA9IDQgICAgICAgICMgNCBj aGFycyBwZXIgc3RyaW5nDQojTlN0cm5nID0gMTAwMDAgICAjIDEwLDAwMCBzdHJpbmdzIGlu IGxpc3QgDQojTlJ1bnMgPSAyMCAgICAgICAjIDIwIHJhbmRvbSBsaXN0cw0KDQpzeWQgPSAx MDcxICAgICAgICMgaW5pdGlhbCBzZWVkIGZvciBSTkcgKGZvciByZXBlYXRhYmlsaXR5KQ0K DQpwcmludFJ1bm5pbmdNZWFuID0gRmFsc2UNCg0KbXUxLG11MixtdTMsbXU0LG11ZyA9IDAu MCwwLjAsMC4wLDAuMCwwLjANCngxLHgyLHgzLHg0ID0gMC4wLDAuMCwwLjAsMC4wDQpwcmlu dCAnJTVkIHJ1bnMgd2l0aCBsaXN0cyBjb250YWluaW5nICU3ZCBlbGVtZW50cycgJShOUnVu cyxOU3RybmcpDQpmb3IgaXJ1biBpbiByYW5nZShOUnVucyk6DQogICAgdGljID0gY2xvY2so KQ0KICAgIGsgPSBpcnVuICsgMQ0KICAgIHByaW50ICcgcnVuIC0gJTJkIC4uLicgJWsNCiAg ICBzeWQgKz0gMTkgICAgIyBuZXcgc2VlZCBmb3IgZWFjaCBydW4NCiAgICANCiAgICByYW5k b20uc2VlZChzeWQpDQogICAgI3ByaW50ICdHZW5yYXRpbmcgbGlzdCBvZiAlN2Qgc3RyaW5n cy4uLicgJU5TdHJuZw0KICAgIHN0cmdMaXN0ID0gZ2VuU3RyTGlzdChOQ2hhcixOU3Rybmcs QWxwaCwneCcpICAgDQogICAgDQogICAgdDAgPSBjbG9jaygpDQogICAgeE9ubHlMaXN0LHN0 cmdMaXN0ID0gdGVzdEZ1bmMxKHN0cmdMaXN0KSAjIGFsZ29yaXRobS0xDQogICAgdDEgPSBj bG9jaygpICAgIA0KICAgIA0KICAgICNwcmludCAnTGVuZ3RoIG9mIHhPbmx5TGlzdCA9ICU3 ZCcgJWxlbih4T25seUxpc3QpDQogICAgI3ByaW50ICcgTGVuZ3RoIG9mIHN0cmdMaXN0ID0g JTdkJyAlbGVuKHN0cmdMaXN0KSAgICANCiAgICBldGltZSA9IHQxIC0gdDANCiAgICBkZWx0 YSA9IGV0aW1lIC0gbXUxDQogICAgbXUxICs9IGRlbHRhL2sNCiAgICBpZiBwcmludFJ1bm5p bmdNZWFuOg0KICAgICAgICBwcmludCAnICBhbGdvcml0aG0tMSAtLSAlOS41ZicgJW11MQ0K ICAgIHgxICs9IGRlbHRhKihldGltZS1tdTEpDQogICAgDQogICAgI3ByaW50DQogICAgcmFu ZG9tLnNlZWQoc3lkKQ0KICAgICNwcmludCAnR2VucmF0aW5nIGxpc3Qgb2YgJTdkIHN0cmlu Z3MuLi4nICVOU3RybmcNCiAgICBzdHJnTGlzdCA9IGdlblN0ckxpc3QoTkNoYXIsTlN0cm5n LEFscGgsJ3gnKQ0KICAgIA0KICAgIHQwID0gY2xvY2soKQ0KICAgIHhPbmx5TGlzdCA9IHRl c3RGdW5jMihzdHJnTGlzdCkgICAgICAgICAgIyBhbGdvcml0aG0tMiAgIA0KICAgIHQxID0g Y2xvY2soKQ0KICAgIA0KICAgICNwcmludCAnTGVuZ3RoIG9mIHhPbmx5TGlzdCA9ICU3ZCcg JWxlbih4T25seUxpc3QpDQogICAgI3ByaW50ICcgTGVuZ3RoIG9mIHN0cmdMaXN0ID0gJTdk JyAlbGVuKHN0cmdMaXN0KSAgICANCiAgICBldGltZSA9IHQxIC0gdDANCiAgICBkZWx0YSA9 IGV0aW1lIC0gbXUyDQogICAgbXUyICs9IGRlbHRhL2sNCiAgICBpZiBwcmludFJ1bm5pbmdN ZWFuOg0KICAgICAgICBwcmludCAnICBhbGdvcml0aG0tMiAtLSAlOS41ZicgJW11Mg0KICAg IHgyICs9IGRlbHRhKihldGltZS1tdTIpICAgIA0KICAgIA0KICAgIHJhbmRvbS5zZWVkKHN5 ZCkgICAgDQogICAgI3ByaW50ICdHZW5yYXRpbmcgbGlzdCBvZiAlN2Qgc3RyaW5ncy4uLicg JU5TdHJuZw0KICAgIHN0cmdMaXN0ID0gZ2VuU3RyTGlzdChOQ2hhcixOU3RybmcsQWxwaCwn eCcpDQogICAgDQogICAgdDAgPSBjbG9jaygpDQogICAgeE9ubHlMaXN0LHN0cmdMaXN0ID0g dGVzdEZ1bmMyQShzdHJnTGlzdCkgICAgICAgICAgIyBhbGdvcml0aG0tMkENCiAgICB0MSA9 IGNsb2NrKCkNCiAgICANCiAgICAjcHJpbnQgJ0xlbmd0aCBvZiB4T25seUxpc3QgPSAlN2Qn ICVsZW4oeE9ubHlMaXN0KQ0KICAgICNwcmludCAnIExlbmd0aCBvZiBzdHJnTGlzdCA9ICU3 ZCcgJWxlbihzdHJnTGlzdCkgICAgDQogICAgZXRpbWUgPSB0MSAtIHQwDQogICAgZGVsdGEg PSBldGltZSAtIG11Mw0KICAgIG11MyArPSBkZWx0YS9rDQogICAgaWYgcHJpbnRSdW5uaW5n TWVhbjoNCiAgICAgICAgcHJpbnQgJyAgYWxnb3JpdGhtLTJBIC0tICU5LjVmJyAlbXUzDQog ICAgeDMgKz0gZGVsdGEqKGV0aW1lLW11MykNCiAgICANCiAgICByYW5kb20uc2VlZChzeWQp ICAgIA0KICAgICNwcmludCAnR2VucmF0aW5nIGxpc3Qgb2YgJTdkIHN0cmluZ3MuLi4nICVO U3RybmcNCiAgICBzdHJnTGlzdCA9IGdlblN0ckxpc3QoTkNoYXIsTlN0cm5nLEFscGgsJ3gn KQ0KICAgICAgICANCiAgICB0MCA9IGNsb2NrKCkNCiAgICB4T25seUxpc3Qsc3RyZ0xpc3Qg PSB0ZXN0RnVuYzMoc3RyZ0xpc3QpICAgICAgICAgICMgYWxnb3JpdGhtLTMNCiAgICB0MSA9 IGNsb2NrKCkNCiAgICAgICAgDQogICAgI3ByaW50ICdMZW5ndGggb2YgeE9ubHlMaXN0ID0g JTdkJyAlbGVuKHhPbmx5TGlzdCkNCiAgICAjcHJpbnQgJyBMZW5ndGggb2Ygc3RyZ0xpc3Qg PSAlN2QnICVsZW4oc3RyZ0xpc3QpICAgIA0KICAgIGV0aW1lID0gdDEgLSB0MA0KICAgIGRl bHRhID0gZXRpbWUgLSBtdTQNCiAgICBtdTQgKz0gZGVsdGEvaw0KICAgIGlmIHByaW50UnVu bmluZ01lYW46DQogICAgICAgIHByaW50ICcgIGFsZ29yaXRobS0zIC0tICU5LjVmJyAlbXU0 DQogICAgeDQgKz0gZGVsdGEqKGV0aW1lLW11NCkgICAgDQogICAgDQogICAgdG9jID0gY2xv Y2soKQ0KICAgIGxvb3BUaW1lID0gdG9jIC0gdGljDQogICAgZGVsdGEgPSBsb29wVGltZSAt IG11Zw0KICAgIG11ZyArPSBkZWx0YS9rDQogICAgcnVuc1IgPSBOUnVucyAtIGsNCiAgICBl c3RUb0NvbXBsZXRlID0gbXVnKnJ1bnNSDQogICAgcHJpbnQgJyAgIEVUVEMgPSAlOC4yZiBz ZWNvbmRzJyAlZXN0VG9Db21wbGV0ZQ0KICAgIA0KDQpwcmludA0KcHJpbnQgJyAgICAgICAg VGltaW5nIGluIHNlY29uZHMnDQpwcmludCAnICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKicNCnByaW50ICcgICAgbWV0aG9kICAgICB8ICAgICBhdmcgdGltZSAoc2Qp Jw0KcHJpbnQgJyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nDQpwcmlu dCAnIGFsZ29yaXRobS0xICAgfCAlOS41ZiAoJTguNmYpJyAlKG11MSxtYXRoLnNxcnQoeDEv TlJ1bnMpKQ0KcHJpbnQgJyBhbGdvcml0aG0tMiAgIHwgJTkuNWYgKCU4LjZmKScgJShtdTIs bWF0aC5zcXJ0KHgyL05SdW5zKSkNCnByaW50ICcgYWxnb3JpdGhtLTJBICB8ICU5LjVmICgl OC42ZiknICUobXUzLG1hdGguc3FydCh4My9OUnVucykpDQpwcmludCAnIGFsZ29yaXRobS0z ICAgfCAlOS41ZiAoJTguNmYpJyAlKG11NCxtYXRoLnNxcnQoeDQvTlJ1bnMpKQ0KDQpwcmlu dA0KcHJpbnQgIlRoLXRoYS10aGEtdGhhdCdzIGFsbCBmb2xrcyEi --------------040906040107050500000506--