Return-Path: X-Original-To: apmail-couchdb-user-archive@www.apache.org Delivered-To: apmail-couchdb-user-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id E057884A6 for ; Fri, 12 Aug 2011 10:01:52 +0000 (UTC) Received: (qmail 677 invoked by uid 500); 12 Aug 2011 10:01:48 -0000 Delivered-To: apmail-couchdb-user-archive@couchdb.apache.org Received: (qmail 431 invoked by uid 500); 12 Aug 2011 10:01:22 -0000 Mailing-List: contact user-help@couchdb.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@couchdb.apache.org Delivered-To: mailing list user@couchdb.apache.org Received: (qmail 340 invoked by uid 99); 12 Aug 2011 10:01:18 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 12 Aug 2011 10:01:18 +0000 X-ASF-Spam-Status: No, hits=1.8 required=5.0 tests=LONGWORDS,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of simon@struktur.de designates 213.61.168.242 as permitted sender) Received: from [213.61.168.242] (HELO hugin.struktur.de) (213.61.168.242) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 12 Aug 2011 10:01:12 +0000 Received: from zarafa1.struktur.de (zarafa1.struktur.de [10.2.0.71]) by hugin.struktur.de (Postfix) with ESMTP id 7F9904080CB for ; Fri, 12 Aug 2011 10:00:49 +0000 (UTC) Received: from [10.1.1.201] (redemption.intranet.struktur.de [10.1.1.201]) by zarafa1.struktur.de (Postfix) with ESMTPS id 95B7D1604FD for ; Fri, 12 Aug 2011 12:02:58 +0200 (CEST) Subject: Re: Compact not completing From: Simon Eisenmann To: user@couchdb.apache.org In-Reply-To: <15B4B79E-5C7D-4447-A620-F4D1A663E180@apache.org> References: <1312821086.28552.374.camel@redemption.intranet.struktur.de> <23F087AD-2BB7-444B-A392-DA4DD502960B@apache.org> <1312883349.28552.391.camel@redemption.intranet.struktur.de> <2084656C-6545-4856-B941-E2D41956D8CE@apache.org> <1313078897.28552.590.camel@redemption.intranet.struktur.de> <15B4B79E-5C7D-4447-A620-F4D1A663E180@apache.org> Content-Type: multipart/signed; micalg="sha1"; protocol="application/x-pkcs7-signature"; boundary="=-WYkTLsFkqyE9kkryVM+R" Organization: struktur AG Date: Fri, 12 Aug 2011 12:00:48 +0200 Message-ID: <1313143248.9784.11.camel@redemption.intranet.struktur.de> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 --=-WYkTLsFkqyE9kkryVM+R Content-Type: multipart/mixed; boundary="=-Dspd+H01DhBGBCqrTnzY" --=-Dspd+H01DhBGBCqrTnzY Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Adam, all right, looks like i am able to find the trouble makers when also looking at the deleted documents: ~# python repaircompact.py http://localhost:5984/gangstercluster_1 Changes feed is http://localhost:5984/gangstercluster_1/_changes?since=3D0. Fetched feed into /tmp/tmpLjRkZY. Not found error: missing!=3Ddeleted (/gangstercluster_1/alive_1dcc4efdb2a411e0acd3003048679e10) Not found error: missing!=3Ddeleted (/gangstercluster_1/alive_1dcc523bb2a411e0acd4003048679e10) Not found error: missing!=3Ddeleted (/gangstercluster_1/alive_41ed63c1b2a411e0acd4003048679e10) Not found error: missing!=3Ddeleted (/gangstercluster_1/alive_41ed678bb2a411e0acd5003048679e10) Processed 8225 entries (last sequence: 5972567) Document count: 8222 (count: 74, deleted: 8148) Document commited sequence is now: 5972569 Though its hard to say if the number of changes feed rows matches the number of the database infos as its constantly changing. Though its very close so probably it would match if nothing changes. So now that i have found the missing documents. Should i just create an empty document with that ID, and delete it again? Thank you and best regards Simon ps: updated script attached Am Donnerstag, den 11.08.2011, 12:30 -0400 schrieb Adam Kocoloski: > Hi Simon, I wouldn't skip the deleted documents, a deleted doc could just= as easily be the one missing in the ID index. When you lookup a deleted d= ocument you should see "reason":"deleted" instead of the "reason":"missing"= that you get if the ID is not in the index at all. Then again, if you see= that only ever see deleted docs after retrieving the full _changes then a = deleted doc is probably not the source of your troubles. >=20 > Can you confirm that the number of rows in the changes feed is equal to d= oc_count + doc_del_count from db.info()? Best, >=20 > Adam >=20 > On Aug 11, 2011, at 12:08 PM, Simon Eisenmann wrote: >=20 > > Hi Adam, > >=20 > > i wrote a short python script, which loads the complete changes feed an= d > > requests all of the documents not marked "deleted" using HTTP HEAD > > requests. Though i only find documents which have been deleted after i > > have retrieved the complete changes view (takes a while for large > > databases), and never the same. > >=20 > > So again no luck here in finding the problems. > >=20 > > Any more suggestions? Is there a way to rebuild the complete database > > file (maybe offline?). > >=20 > > Thank you and best regards > > Simon > >=20 > >=20 > > ps: The script i have been using is attached. > >=20 > >=20 > >=20 > > Am Dienstag, den 09.08.2011, 16:10 -0400 schrieb Adam Kocoloski: > >> Hi Simon, CouchDB 1.1.0 includes a recent optimization to _changes?inc= lude_docs=3Dtrue which allows it to skip a lookup in the id tree and instea= d load the document body from the pointer in the sequence tree. In that ca= se you wouldn't notice any missing entry in the id tree. You would notice = it, however, if you did direct lookups for each document. Apologies for the= outdated instructions. Can you try looking up the documents in a separate= request and see if the results change? > >>=20 > >> Adam > >>=20 > >> On Aug 9, 2011, at 5:49 AM, Simon Eisenmann wrote: > >>=20 > >>> Hi Adam, > >>>=20 > >>> i just checked the whole _changes feed (since=3D0) and could not find= any > >>> document "missing" when using "include_docs=3Dtrue". > >>>=20 > >>> The database in itself has only around 30 documents, so should be qui= te > >>> small. Though there are lots of creations and deletions happening all > >>> the time. Thus it its daily purged and compacted.=20 > >>>=20 > >>> So - the changes feed is of no help. Any other idea? > >>>=20 > >>> Thank you and best regards > >>> Simon > >>>=20 > >>> Am Montag, den 08.08.2011, 13:25 -0400 schrieb Adam Kocoloski: > >>>> Hi Simon, I think my amended instructions to Mike are still a sensib= le way to debug/workaround the problem. Reiterating (96282148 was the last= seq Mike observed in the Futon status for the compaction): > >>>>=20 > >>>>> 1) What you really want are the last 1000 Ids in the seq_tree prior= to the compactor crash. So maybe something like > >>>>>=20 > >>>>> GET /iris/_changes?descending=3Dtrue&limit=3D1000&since=3D96282148 > >>>>=20 > >>>>> 2) Figure out which of those entries are missing from the id tree, = e.g. lookup the document and see if the response is {"not_found":"missing"}= . You could also try using include_docs=3Dtrue on the _changes feed to acc= omplish the same. > >>>>=20 > >>>>> 3) Once you've identified the problematic IDs, try creating them ag= ain. You might end up introducing duplicates in the _changes feed, but if = you do there's a procedure to fix that. > >>>>=20 > >>>> Regards, Adam > >>>>=20 > >>>> On Aug 8, 2011, at 12:31 PM, Simon Eisenmann wrote: > >>>>=20 > >>>>> Hi Guys, > >>>>>=20 > >>>>> i have a couple of CouchDB instances which started to be come > >>>>> unpackable. It shows this error: > >>>>>=20 > >>>>> [Mon, 08 Aug 2011 16:16:27 GMT] [info] [<0.10808.123>] Starting > >>>>> compaction for db "database1" > >>>>> [Mon, 08 Aug 2011 16:16:45 GMT] [error] [<0.10808.123>] ** Generic > >>>>> server <0.10808.123> terminating=20 > >>>>> ** Last message in was {'EXIT',<0.30396.143>, > >>>>> {function_clause, > >>>>> [{couch_db_updater,'-copy_docs/4-fun-2-', > >>>>> [not_found, > >>>>> {db,<0.10807.123>,<0.10808.123>,nil, > >>>>> <<"1312767347007568">>,<0.10805.123>, > >>>>> <0.10809.123>, > >>>>> {db_header,5,6340261,0, > >>>>> {7198006895,{65952,10145}}, > >>>>> {7198010315,76813}, > >>>>> {7198051016,[]}, > >>>>> 364,7050915618,nil,1000}, > >>>>> 6340261, > >>>>> {btree,<0.10805.123>, > >>>>> {7198006895,{65952,10145}}, > >>>>> #Fun, > >>>>> #Fun, > >>>>> #Fun, > >>>>> #Fun}, > >>>>> {btree,<0.10805.123>, > >>>>> {7198010315,76813}, > >>>>> #Fun, > >>>>> #Fun, > >>>>> #Fun, > >>>>> #Fun}, > >>>>> {btree,<0.10805.123>, > >>>>> {7198051016,[]}, > >>>>> #Fun, > >>>>> #Fun, > >>>>> #Fun,nil}, > >>>>> 6340261,<<"spreedcom_accounts_1">>, > >>>>> "/var/lib/couchdb/database1.couch",[], > >>>>> [],nil, > >>>>> {user_ctx,null,[],undefined}, > >>>>> nil,1000, > >>>>> [before_header,after_header,on_file_open]= , > >>>>> false}, > >>>>> <0.30397.143>]}, > >>>>> {lists,map,2}, > >>>>> {lists,map,2}, > >>>>> {couch_db_updater,copy_docs,4}, > >>>>> {couch_db_updater,'-copy_compact/3-fun-0-',6= }, > >>>>> {couch_btree,stream_kv_node2,8}, > >>>>> {couch_btree,stream_kp_node,7}, > >>>>> {couch_btree,fold,4}]}} > >>>>>=20 > >>>>>=20 > >>>>> ... lots of more similar errors following. > >>>>>=20 > >>>>> In this mailing list i have found a similar issue from the beginnin= g of > >>>>> this year (Fri, 31 Dec 2010 12:38:18), though without a solution. > >>>>>=20 > >>>>> This database got purged a lot and has constant changes. So pretty > >>>>> similar from the older topic. So i assume there is something wrong = in > >>>>> the database file related to previous purges. So looks like some bu= g > >>>>> here. > >>>>>=20 > >>>>> So - any hints how to fix this? The database is getting pretty larg= e and > >>>>> has to be packed from time to time. > >>>>>=20 > >>>>> CouchDB is running with Version 1.1.0 on Linux 64bit. The database = has > >>>>> initially been created with CouchDB 1.0.1 - though the issue appear= ed a > >>>>> couple of weeks ago (packing has been working with 1.1.0 before. > >>>>>=20 > >>>>>=20 > >>>>> Thank you and best regards > >>>>> Simon > >>>>>=20 > >>>>>=20 > >>>>> --=20 > >>>>> Simon Eisenmann > >>>>>=20 > >>>>> [ mailto:simon@struktur.de ] > >>>>>=20 > >>>>> [ struktur AG | Kronenstra=C3=9Fe 22a | D-70173 Stuttgart ] > >>>>> [ T. +49.711.896656.0 | F.+49.711.89665610 ] > >>>>> [ http://www.struktur.de | mailto:info@struktur.de ] > >>>>=20 > >>>=20 > >>> --=20 > >>> Simon Eisenmann > >>>=20 > >>> [ mailto:simon@struktur.de ] > >>>=20 > >>> [ struktur AG | Kronenstra=C3=9Fe 22a | D-70173 Stuttgart ] > >>> [ T. +49.711.896656.68 | F.+49.711.89665610 ] > >>> [ http://www.struktur.de | mailto:info@struktur.de ] > >>=20 > >=20 > > --=20 > > Simon Eisenmann > >=20 > > [ mailto:simon@struktur.de ] > >=20 > > [ struktur AG | Kronenstra=C3=9Fe 22a | D-70173 Stuttgart ] > > [ T. +49.711.896656.68 | F.+49.711.89665610 ] > > [ http://www.struktur.de | mailto:info@struktur.de ] > > >=20 --=20 Simon Eisenmann [ mailto:simon@struktur.de ] [ struktur AG | Kronenstra=C3=9Fe 22a | D-70173 Stuttgart ] [ T. +49.711.896656.68 | F.+49.711.89665610 ] [ http://www.struktur.de | mailto:info@struktur.de ] --=-Dspd+H01DhBGBCqrTnzY Content-Disposition: attachment; filename="repaircompact.py" Content-Type: text/x-python; name="repaircompact.py"; charset="UTF-8" Content-Transfer-Encoding: base64 IyEvdXNyL2Jpbi9weXRob24NCiIiIg0KU2ltcGxlIHNjcmlwdCB0byBsb2FkIGFsbCBkb2N1bWVu dHMgcmV0dXJuZWQgYnkgYSBDb3VjaERCIF9jaGFuZ2VzIGZlZWQgd2l0aCANCihzaW5jZT0wKSB0 byBmaW5kIGlmIHNvbWUgb2YgdGhlIGRvY3VtZW50cyBhcmUgbWlzc2luZyAoY2hlY2tzIEhUVFAg c3RhdHVzKS4NCg0KKGMpMjAxMSBTaW1vbiBFaXNlbm1hbm4gLSBtYWlsdG86c2ltb25Ac3RydWt0 dXIuZGUNCiIiIg0KDQppbXBvcnQgc3lzDQppbXBvcnQgY2pzb24NCmltcG9ydCB1cmxsaWINCmlt cG9ydCB0ZW1wZmlsZQ0KaW1wb3J0IHVybHBhcnNlDQppbXBvcnQgaHR0cGxpYg0KaW1wb3J0IHVy bGxpYg0KDQpjbGFzcyBSZXBhaXJlcihvYmplY3QpOg0KDQogICAgZGVmIF9faW5pdF9fKHNlbGYs IGRhdGFiYXNlX3VybCwgYmF0Y2hzaXplPTEwMDApOg0KDQogICAgICAgIGlmIGRhdGFiYXNlX3Vy bC5lbmRzd2l0aCgiLyIpOg0KICAgICAgICAgICAgZGF0YWJhc2VfdXJsID0gZGF0YWJhc2VfdXJs WzotMV0NCiAgICANCiAgICAgICAgc2VsZi5kYXRhYmFzZV91cmwgPSBkYXRhYmFzZV91cmwNCiAg ICAgICAgc2VsZi5kYXRhYmFzZV91cmxfcGFydHMgPSB1cmxwYXJzZS51cmxwYXJzZShzZWxmLmRh dGFiYXNlX3VybCkNCiAgICAgICAgc2VsZi5kYXRhYmFzZV9ob3N0LCBzZWxmLmRhdGFiYXNlX3Bv cnQgPSBzZWxmLmRhdGFiYXNlX3VybF9wYXJ0c1sxXS5zcGxpdCgiOiIsIDEpDQogICAgICAgIHNl bGYuYmF0Y2hzaXplID0gYmF0Y2hzaXplDQogICAgICAgIA0KICAgIGRlZiByZXBhaXIoc2VsZik6 DQoNCiAgICAgICAgdXJsID0gIiVzL19jaGFuZ2VzP3NpbmNlPTAiICUgc2VsZi5kYXRhYmFzZV91 cmwNCiAgICAgICAgcHJpbnQgIkNoYW5nZXMgZmVlZCBpcyAlcy4iICUgdXJsDQogICAgICAgIA0K ICAgICAgICBjaGFuZ2VzLCBoZWFkZXJzID0gdXJsbGliLnVybHJldHJpZXZlKHVybCwgdGVtcGZp bGUubWt0ZW1wKCkpDQogICAgICAgIHByaW50ICJGZXRjaGVkIGZlZWQgaW50byAlcy4iICUgY2hh bmdlcw0KDQogICAgICAgICMgTG9hZCBhbmQgcHJpbnQgc3RhdHMuDQogICAgICAgIGNvbm4gPSBo dHRwbGliLkhUVFBDb25uZWN0aW9uKHNlbGYuZGF0YWJhc2VfaG9zdCwgaW50KHNlbGYuZGF0YWJh c2VfcG9ydCkpDQogICAgICAgIGNvbm4ucmVxdWVzdCgiR0VUIiwgIiVzLyIgJSBzZWxmLmRhdGFi YXNlX3VybF9wYXJ0c1syXSkNCiAgICAgICAgcmVzID0gY29ubi5nZXRyZXNwb25zZSgpDQogICAg ICAgIGluZm8gPSBjanNvbi5kZWNvZGUocmVzLnJlYWQoKSkNCiAgICAgICAgY29ubi5jbG9zZSgp DQoNCiAgICAgICAgZnAgPSBmaWxlKGNoYW5nZXMsICJyYiIpDQogICAgICAgIGZwLnJlYWRsaW5l KCkNCiAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkuc3RyaXAoKQ0KICAgICAgICANCiAgICAg ICAgY291bnQgPSAwDQogICAgICAgIGJ1ZiA9IFtdDQogICAgICAgIGZhaWxlZCA9IHt9DQogICAg ICAgIHNlcSA9IE5vbmUNCiAgICAgICAgDQogICAgICAgIHdoaWxlIGxpbmU6DQoNCiAgICAgICAg ICAgIGlmIGxpbmUuZW5kc3dpdGgoIiwiKToNCiAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6 LTFdDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpZiBsaW5lLnN0cmlwKCkgPT0gIl0i Og0KICAgICAgICAgICAgICAgIGJyZWFrDQoNCiAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2pzb24u ZGVjb2RlKGxpbmUpKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgbGVuKGJ1Zikg Pj0gc2VsZi5iYXRjaHNpemU6DQogICAgICAgICAgICAgICAgY291bnQsIHNlcSA9IHNlbGYuX2No ZWNrKGJ1ZiwgY291bnQ9Y291bnQsIGZhaWxlZD1mYWlsZWQpDQogICAgICAgICAgICAgICAgYnVm ID0gW10NCg0KICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkuc3RyaXAoKQ0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICBmcC5jbG9zZSgpDQogICAgICAgICAgICAg ICAgICAgIA0KICAgICAgICBpZiBsZW4oYnVmKToNCiAgICAgICAgICAgIGNvdW50LCBzZXEgPSBz ZWxmLl9jaGVjayhidWYsIGNvdW50PWNvdW50LCBmYWlsZWQ9ZmFpbGVkKQ0KICAgICAgICAgICAg YnVmID0gW10NCg0KICAgICAgICBwcmludCAiUHJvY2Vzc2VkICVkIGVudHJpZXMgKGxhc3Qgc2Vx dWVuY2U6ICVzKSIgJSAoY291bnQsIHNlcSkNCiAgICAgICAgcHJpbnQgIkRvY3VtZW50IGNvdW50 OiAlZCAoY291bnQ6ICVkLCBkZWxldGVkOiAlZCkiICUgKGluZm9bImRvY19jb3VudCJdK2luZm9b ImRvY19kZWxfY291bnQiXSwgaW5mb1siZG9jX2NvdW50Il0sIGluZm9bImRvY19kZWxfY291bnQi XSkNCiAgICAgICAgcHJpbnQgIkRvY3VtZW50IGNvbW1pdGVkIHNlcXVlbmNlIGlzIG5vdzogJWQi ICUgaW5mb1siY29tbWl0dGVkX3VwZGF0ZV9zZXEiXQ0KDQogICAgZGVmIF9jaGVjayhzZWxmLCBy ZXN1bHRzLCBjb3VudD0wLCBmYWlsZWQ9Tm9uZSk6DQoNCiAgICAgICAgaWYgZmFpbGVkIGlzIE5v bmU6DQogICAgICAgICAgICBmYWlsZWQgPSB7fQ0KDQogICAgICAgIHNlcSA9IE5vbmUNCg0KICAg ICAgICBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbihzZWxmLmRhdGFiYXNlX2hvc3QsIGlu dChzZWxmLmRhdGFiYXNlX3BvcnQpKQ0KICAgICAgICANCiAgICAgICAgZm9yIGMgaW4gcmVzdWx0 czoNCiAgICAgICAgICAgIHNlcSA9IGMuZ2V0KCJzZXEiLCAwKQ0KICAgICAgICAgICAgZGVsZXRl ZCA9IGMuZ2V0KCJkZWxldGVkIiwgTm9uZSkNCiAgICAgICAgICAgIGlmIFRydWU6DQogICAgICAg ICAgICAgICAgaSA9IGMuZ2V0KCJpZCIpDQogICAgICAgICAgICAgICAgcXVvdGVkX2kgPSB1cmxs aWIucXVvdGVfcGx1cyhpKQ0KICAgICAgICAgICAgICAgIGlmIHF1b3RlZF9pLnN0YXJ0c3dpdGgo Il9kZXNpZ24lMkYiKToNCiAgICAgICAgICAgICAgICAgICAgIyBGSVhNRShsb25nc2xlZXApIHdh YWggd2hhdCBhIGNoZWFwIGhhY2sNCiAgICAgICAgICAgICAgICAgICAgcXVvdGVkX2kgPSAiX2Rl c2lnbi8lcyIgJSBxdW90ZWRfaVsxMDpdDQogICAgICAgICAgICAgICAgcGF0aCA9ICIlcy8lcyIg JSAoc2VsZi5kYXRhYmFzZV91cmxfcGFydHNbMl0sIHF1b3RlZF9pKQ0KICAgICAgICAgICAgICAg IGNvbm4ucmVxdWVzdCgiR0VUIiwgcGF0aCkNCiAgICAgICAgICAgICAgICByZXMgPSBjb25uLmdl dHJlc3BvbnNlKCkNCiAgICAgICAgICAgICAgICBkYXRhID0gcmVzLnJlYWQoKQ0KICAgICAgICAg ICAgICAgIA0KICAgICAgICAgICAgICAgIGlmIHJlcy5zdGF0dXMgPT0gNDA0Og0KICAgICAgICAg ICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGl0IHNheXMgcmVhc29uPT0iZGVsZXRlZCIuDQog ICAgICAgICAgICAgICAgICAgIGRhdGEgPSBjanNvbi5kZWNvZGUoZGF0YSkNCiAgICAgICAgICAg ICAgICAgICAgaWYgZGF0YS5nZXQoInJlYXNvbiIsIE5vbmUpICE9ICJkZWxldGVkIjoNCiAgICAg ICAgICAgICAgICAgICAgICAgIHByaW50ICJOb3QgZm91bmQgZXJyb3I6ICVzIT1kZWxldGVkICgl cykiICUgKGRhdGEuZ2V0KCJyZWFzb24iKSwgcGF0aCkNCiAgICAgICAgICAgICAgICAgICAgICAg ICNwcmludCByZXMuc3RhdHVzLCBkYXRhLCBkZWxldGVkDQogICAgICAgICAgICAgICAgICAgICAg ICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAiIiINCiAgICAgICAgICAgICAg ICBpZiBkZWxldGVkOg0KICAgICAgICAgICAgICAgICAgICBpZiByZXMuc3RhdHVzIG5vdCBpbiAo NDA0LCk6DQogICAgICAgICAgICAgICAgICAgICAgICAjIElnbm9yZSBkb2N1bWVudHMgd2hpY2gg YXJlIGZvdW5kIChtaWdodCBiZSBjcmVhdGVkIA0KICAgICAgICAgICAgICAgICAgICAgICAgIyBh ZnRlciB0aGUgY2hhbmdlcyBmZWVkIHdhcyByZXRyaWV2ZWQuDQogICAgICAgICAgICAgICAgICAg ICAgICBwYXNzDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAg ICAgICAjIE1ha2Ugc3VyZSB0aGF0IGl0IHNheXMgcmVhc29uPT0iZGVsZXRlZCIuDQogICAgICAg ICAgICAgICAgICAgICAgICBkYXRhID0gY2pzb24uZGVjb2RlKGRhdGEpDQogICAgICAgICAgICAg ICAgICAgICAgICBpZiBkYXRhLmdldCgicmVhc29uIiwgTm9uZSkgIT0gImRlbGV0ZWQiOg0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJSZWFzb24gZm9yIG5vdCBmb3VuZCBlcnJv cjogJXMgKCVzIT1kZWxldGVkKSIgJSAocGF0aCwgZGF0YS5nZXQoInJlYXNvbiIpKQ0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgICNwcmludCByZXMuc3RhdHVzLCBkYXRhLCBkZWxldGVkDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGVsc2U6 DQogICAgICAgICAgICAgICAgICAgIGlmIHJlcy5zdGF0dXMgbm90IGluICgyMDAsKToNCiAgICAg ICAgICAgICAgICAgICAgICAgIHByaW50ICJGYWlsZWQgbG9va3VwOiAlcyAobm90IGRlbGV0ZWQp IiAlIHBhdGgNCiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZFtpXT1UcnVlDQogICAgICAg ICAgICAgICAgICAgICAgICBwcmludCByZXMuc3RhdHVzLCBkZWxldGVkDQogICAgICAgICAgICAg ICAgIiIiDQoNCiAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQ0KICAgICAgICANCiAg ICAgICAgY29ubi5jbG9zZSgpDQogICAgICAgIA0KICAgICAgICByZXR1cm4gY291bnQsIHNlcQ0K DQoNCg0KICAgIA0KaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoNCiAgICBhcmdzID0gc3lzLmFy Z3ZbMTpdOw0KICAgIGlmIG5vdCBsZW4oYXJncykgPT0gMToNCiAgICAgICAgcHJpbnQgIlVzYWdl OiAlcyBkYXRhYmFzZV91cmwiICUgc3lzLmFyZ3ZbMF0NCiAgICAgICAgc3lzLmV4aXQoMSkNCg0K ICAgIHJlcGFpcmVyID0gUmVwYWlyZXIoYXJnc1swXSkNCiAgICByZXBhaXJlci5yZXBhaXIoKQ0K IA0KICAgIA0K --=-Dspd+H01DhBGBCqrTnzY-- --=-WYkTLsFkqyE9kkryVM+R Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Disposition: attachment; filename="smime.p7s" Content-Transfer-Encoding: base64 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 AAA= --=-WYkTLsFkqyE9kkryVM+R--