From mboxrd@z Thu Jan 1 00:00:00 1970 From: "James Youngman" Subject: [PATCH] fast importer for SCCS files Date: Sun, 20 Jan 2008 11:12:47 +0000 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_14724_30307614.1200827567608" To: git@vger.kernel.org X-From: git-owner@vger.kernel.org Sun Jan 20 12:13:28 2008 Return-path: Envelope-to: gcvg-git-2@gmane.org Received: from vger.kernel.org ([209.132.176.167]) by lo.gmane.org with esmtp (Exim 4.50) id 1JGY76-0007Gd-7g for gcvg-git-2@gmane.org; Sun, 20 Jan 2008 12:13:21 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752511AbYATLMu (ORCPT ); Sun, 20 Jan 2008 06:12:50 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752654AbYATLMu (ORCPT ); Sun, 20 Jan 2008 06:12:50 -0500 Received: from wa-out-1112.google.com ([209.85.146.183]:41309 "EHLO wa-out-1112.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752398AbYATLMs (ORCPT ); Sun, 20 Jan 2008 06:12:48 -0500 Received: by wa-out-1112.google.com with SMTP id v27so2981861wah.23 for ; Sun, 20 Jan 2008 03:12:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:sender:to:subject:mime-version:content-type:x-google-sender-auth; bh=37+6dUqAaPRUZIU1ZkAWeJePWQIXZP3HqxdXEyoZ9QI=; b=chXm36ycQmAAGG871dhQ52IL0wtdP0dC9o1mDRuWFbccPZF87mJb/imQo0gAan9XPckyEPlYl+P2h4/TZOxWN85aQdXqJgyhk2FNXfxwyQLwP963oJ1Meuv1UPWe1IDZb7ZpOdr9W6k2+IvhF3Wr2UN2wi3ZyJKhMeahL4Wkac8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:sender:to:subject:mime-version:content-type:x-google-sender-auth; b=CrpbxqlYgVR/GE8ZU3yBbhujZhDYJRKoasrKm0sjmgxs8DABPEaO/IoKP+4dvUgdymT2v53k7RnwosbyGUHIgmhppQO7AqyQbKLLvHYUYL75xbQEVbRlmX1udoOs38jqd5HM09tzu3f6SFVanrtKzKVKmLTKbTVYnYyYkh1FLaU= Received: by 10.114.154.1 with SMTP id b1mr3721433wae.34.1200827567624; Sun, 20 Jan 2008 03:12:47 -0800 (PST) Received: by 10.115.49.20 with HTTP; Sun, 20 Jan 2008 03:12:47 -0800 (PST) X-Google-Sender-Auth: e0e3f7cf24cc650a Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: ------=_Part_14724_30307614.1200827567608 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline The attached patch implements an importer for SCCS files using git-fastimport. It's unidirectional SCCS->git. This is my first git patch, so apologies if I have done something the wrong way with regard to how one shoudl submit a patch. I've attached the patch because my mail client would probably screw the formatting up if I just pasted it :( Thanks, James. ------=_Part_14724_30307614.1200827567608 Content-Type: text/x-patch; name=0001-Add-a-fast-importer-for-SCCS.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_fbnhodfl0 Content-Disposition: attachment; filename=0001-Add-a-fast-importer-for-SCCS.patch RnJvbSA2NGM0OWEyZWU4NjRkNTAyODBkZjA2YjBmMDRkMTdkNzE4ZjE4N2MyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKYW1lcyBZb3VuZ21hbiA8amF5QGdudS5vcmc+CkRhdGU6IFN1 biwgMjAgSmFuIDIwMDggMTE6MDI6MTAgKzAwMDAKU3ViamVjdDogW1BBVENIXSBBZGQgYSBmYXN0 IGltcG9ydGVyIGZvciBTQ0NTLgoKLS0tCiBjb250cmliL2Zhc3QtaW1wb3J0L2dpdC1zY2NzaW1w b3J0LnB5IHwgIDczMyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZXMg Y2hhbmdlZCwgNzMzIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAx MDA3NTUgY29udHJpYi9mYXN0LWltcG9ydC9naXQtc2Njc2ltcG9ydC5weQoKZGlmZiAtLWdpdCBh L2NvbnRyaWIvZmFzdC1pbXBvcnQvZ2l0LXNjY3NpbXBvcnQucHkgYi9jb250cmliL2Zhc3QtaW1w b3J0L2dpdC1zY2NzaW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAu LjA2OTgwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2Zhc3QtaW1wb3J0L2dpdC1zY2Nz aW1wb3J0LnB5CkBAIC0wLDEgKzEsNzMzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMg Z2l0LXNjY3NpbXBvcnQucHkgLS0gSW1wb3J0cyBTQ0NTIGZpbGVzIGludG8gZ2l0CisjCisjIEF1 dGhvcjogSmFtZXMgWW91bmdtYW4gPGpheUBnbnUub3JnPgorIyBDb3B5cmlnaHQ6IDIwMDggSmFt ZXMgWW91bmdtYW4gPGpheUBnbnUub3JnPgorIyBMaWNlbnNlOiBHTlUgR1BMIHZlcnNpb24gMiBv ciBsYXRlciA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4w Lmh0bWw+CisjCisiIiIKK0EgZmFzdCBnaXQgaW1wb3J0ZXIgZm9yIFNDQ1MgZmlsZXMuCisKK0hv dyB0byB1c2UgdGhpcyBwcm9ncmFtOgorCitMZXQncyBhc3N1bWUgeW91IGhhdmUgc29tZSBTQ0NT IGZpbGVzIGluICRQUk9KRUNURElSIGFuZCB3YW50IHRvCitjb252ZXJ0IHRoZW0gdG8gYSBnaXQg cmVwb3NpdG9yeSBpbiB0aGUgZGlyZWN0b3J5ICRORVdHSVQuCisKK0ZpcnN0LCBtYWtlIHN1cmUg dGhlIFNDQ1MgKG9yIENTU0MpIGJpbmFyaWVzIGFyZSBvbiB5b3VyICRQQVRILiAgVGhlbgorZG8g dGhpczoKKworICBjZCAiJFBST0pFQ1RESVIiCisgIHB5dGhvbiBnaXQtc2Njc2ltcG9ydC5weSAt LWluaXQgLS1naXQtZGlyPSIkTkVXR0lUIiAtLWRpcnMgLgorCitOb3RpY2UgdGhhdCBnaXQtc2Nj c2ltcG9ydCBpcyBiZWluZyBydW4gd2l0aCBpdHMgd29ya2luZworZGlyZWN0b3J5IGFzIHRoZSBy b290IG9mIHRoZSB0cmVlIG9mIFNDQ1MgZmlsZXMuICBUaGlzIGlzCitiZWNhdWUgdGhlIHJlbGF0 aXZlIHBhdGggZnJvbSB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZQorU0NDUyBmaWxlIGlz IGFsc28gdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB0aGUgcmVzdWx0aW5nCitnaXQg cmVwb3NpdG9yeS4KKworSSB0cmllZCB0aGlzIG9uIGEgMzJNIGNvZGUgcmVwb3NpdG9yeSBpbiBT Q0NTIGFuZCBpdCBwcm9kdWNlZCBhCiszNk0gZ2l0IHJlcG9zaXRvcnkuIAorIiIiCitpbXBvcnQg ZGF0ZXRpbWUKK2ltcG9ydCBlcnJubworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgb3MKK2ltcG9y dCBvcy5wYXRoCitpbXBvcnQgcmUKK2ltcG9ydCBzdGF0CitpbXBvcnQgc3VicHJvY2VzcworaW1w b3J0IHN5cworaW1wb3J0IHRpbWUKKworR0VUID0gImdldCIKK1BSUyA9ICJwcnMiCitTQ0NTX0VT Q0FQRSA9IGNocigxKQorVElNRVpPTkUgPSBOb25lCitNQUlMX0RPTUFJTiA9IE5vbmUKK1VOSVhf RVBPQ0ggPSB0aW1lLm1rdGltZShkYXRldGltZS5kYXRldGltZSgxOTcwLCAxLCAxLAorCQkJCQkJ CQkJCQkwLCAwLCAwLCAwLAorCQkJCQkJCQkJCQlOb25lKS50aW1ldHVwbGUoKSkKK0lNUE9SVF9S RUYgPSBOb25lCisKKworIyBUd28gY2hlY2tpbnMgc2VwYXJhdGVkIGJ5IG1vcmUgdGhhbiBGVVpa WV9XSU5ET1cKKyMgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHNhbWUgY29t bWl0LgorRlVaWllfV0lORE9XID0gMzAwLjAKKworCit2ZXJib3NlID0gRmFsc2UKKworCitjbGFz cyBJbXBvcnRGYWlsdXJlKEV4Y2VwdGlvbik6CisgIHBhc3MKKworY2xhc3MgVXNhZ2VFcnJvcihF eGNlcHRpb24pOgorICBwYXNzCisKK2NsYXNzIEFic3RyYWN0Q2xhc3NFcnJvcihFeGNlcHRpb24p OgorICBwYXNzCisKK2RlZiBVc2FnZSh3aG8sIHJldHZhbCwgZiwgZSk6CisgIGlmIGU6CisJIHBy aW50ID4+ZiwgZQorICBwcmludCA+PmYsICgidXNhZ2U6ICVzIHNjY3MtZmlsZSBbc2Njcy1maWxl Li4uXSIKKwkJCSAgICUgKHdobywpKQorICBpZiByZXR2YWw6CisJIHN5cy5leGl0KHJldHZhbCkK KyAgcmV0dXJuIHJldHZhbAorCisKK2RlZiBOb3RJbXBvcnRpbmcoZmlsZSwgc2lkLCByZWFzb24p OgorICBpZiBzaWQ6CisJIG1zZyA9ICgiJXM6IG5vdCBpbXBvcnRpbmcgU0lEICVzOiAlcyIKKwkJ CSUgKGZpbGUsIHNpZCwgcmVhc29uKSkKKyAgZWxzZToKKwkgbXNnID0gKCIlczogbm90IGltcG9y dGluZyB0aGlzIGZpbGU6ICVzIgorCQkJJSAoZmlsZSwgcmVhc29uKSkKKyAgcHJpbnQgPj4gc3lz LnN0ZGVyciwgbXNnCisKKworZGVmIERpYWdub3NlQ29tbWFuZEZhaWx1cmUoY29tbWFuZCwgcmV0 dXJuY29kZSwgZXJyb3JzKToKKyAgaWYgbm90IGVycm9yczoKKwkgZXJyb3JzID0gIiIKKyAgaWYg cmV0dXJuY29kZSA8IDA6CisJIG1zZyA9ICgiJXMgJXMga2lsbGVkIGJ5IHNpZ25hbCAlcyIgJSBj b21tYW5kLCAtKHJldHVybmNvZGUpKQorICBlbHNlOgorCSBtc2cgPSAoIiVzICVzIHJldHVybmVk IGV4aXQgc3RhdHVzICVzIiAlIGNvbW1hbmQsIHJldHVybmNvZGUpCisgIHJhaXNlIEltcG9ydEZh aWx1cmUsICIlc1xuJXMiICUgKGVycm9ycywgbXNnKQorCSAKKworZGVmIFJ1bkNvbW1hbmQoY29t bWFuZGxpbmUpOgorICB0cnk6CisJIGlmIHZlcmJvc2U6CisJICAgbXNnID0gKCJSdW5uaW5nIGNv bW1hbmQ6ICVzXG4iCisJCQkgICUgKCIgIi5qb2luKGNvbW1hbmRsaW5lKSwpKQorCSAgIHN5cy5z dGRlcnIud3JpdGUobXNnKQorCSBjaGlsZCA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZGxpbmUs CisJCQkJCQkJICBjbG9zZV9mZHMgPSBUcnVlLAorCQkJCQkJCSAgc3RkaW4gPXN1YnByb2Nlc3Mu UElQRSwKKwkJCQkJCQkgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisJCQkJCQkJICBzdGRlcnI9 c3VicHJvY2Vzcy5QSVBFKQorCSBvdXRwdXQsIGVycm9ycyA9IGNoaWxkLmNvbW11bmljYXRlKE5v bmUpCisJIGlmIGNoaWxkLnJldHVybmNvZGUgIT0gMDoKKwkgICAjIFNvbWUgc3RkZXJyIG91dHB1 dCBpcyBub3JtYWwgKHdhcm5pbmdzLCBldGMuKQorCSAgIERpYWdub3NlQ29tbWFuZEZhaWx1cmUo Y29tbWFuZGxpbmVbMF0sIGNoaWxkLnJldHVybmNvZGUsIGVycm9ycykKKwkgZWxzZToKKwkgICBy ZXR1cm4gb3V0cHV0CisgIGV4Y2VwdCBPU0Vycm9yLCBvZToKKwkgbXNnID0gKCJGYWlsZWQgdG8g cnVuICclcyc6ICVzICglcykiCisJCQklIChjb21tYW5kbGluZVswXSwgb2UsCisJCQkgICBlcnJu by5lcnJvcmNvZGVbb2UuZXJybm9dKSkKKwkgcmFpc2UgSW1wb3J0RmFpbHVyZSwgbXNnCisJCSAK KworCSAKKworZGVmIEdldEJvZHkoc2ZpbGUsIHNlcW5vLCBleHBhbmRfa2V5d29yZHMpOgorICBv cHRpb25zID0gW0dFVCwgIi1wIiwgIi1zIiwgKCItYSVkIiAlIHNlcW5vKV0KKyAgaWYgbm90IGV4 cGFuZF9rZXl3b3JkczoKKwkgb3B0aW9ucy5hcHBlbmQoIi1rIikKKyAgb3B0aW9ucy5hcHBlbmQo c2ZpbGUpCisgIHJldHVybiBSdW5Db21tYW5kKG9wdGlvbnMpCisJIAorCitkZWYgRmlsZU1vZGUo ZmlsZW5hbWUpOgorICByZXR1cm4gc3RhdC5TX0lNT0RFKG9zLnN0YXQoZmlsZW5hbWUpLnN0X21v ZGUpCisKKworY2xhc3MgU2Njc0ZpbGVRdWVyeUJhc2Uob2JqZWN0KToKKyAgQHN0YXRpY21ldGhv ZAorICBkZWYgSGVhZGVyTGluZXMoZmlsZW5hbWUpOgorCSBoZWFkZXJfZW5kID0gIl4lY1QiICUg KFNDQ1NfRVNDQVBFLCkKKwkgcmVzdWx0ID0gW10KKwkgdHJ5OgorCSAgIGYgPSBvcGVuKGZpbGVu YW1lLCAicmIiKQorCSAgIGZvciBsaW5lIGluIGYucmVhZGxpbmVzKCk6CisJCSBpZiBsaW5lLnN0 YXJ0c3dpdGgoaGVhZGVyX2VuZCk6CisJCSAgIGJyZWFrCisJCSBlbHNlOgorCQkgICByZXN1bHQu YXBwZW5kKGxpbmUpCisJICAgcmV0dXJuIHJlc3VsdAorCSBmaW5hbGx5OgorCSAgIGYuY2xvc2Uo KQorCisJCSAKKworI2NsYXNzIFNjY3NGaWxlUXVlcnlTbG93KFNjY3NGaWxlUXVlcnlCYXNlKToK KyMJIiIiRXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIFNDQ1MgZmlsZXMgYnkgcnVubmluZyBwcnMu IiIiCisjCUBzdGF0aWNtZXRob2QKKyMJZGVmIFJ1blBycyhvcHRpb25zKToKKyMJICBjb21tYW5k bGluZSA9IFtQUlNdCisjCSAgY29tbWFuZGxpbmUuZXh0ZW5kKG9wdGlvbnMpCisjCSAgcmV0dXJu IFJ1bkNvbW1hbmQoY29tbWFuZGxpbmUpCisjCQorIwlAc3RhdGljbWV0aG9kCisjCWRlZiBGZXRj aERlbHRhUHJvcGVydGllcyhzaWQsIGZpbGVuYW1lKToKKyMJICBmbXQgPSAoIjpEeTovOkRtOi86 RGQ6JShlc2MpYyIgICMgMCBkZWx0YSBjcmVhdGlvbiBkYXRlCisjCQkJICI6VGg6OjpUbTo6OlRz OiUoZXNjKWMiICAjIDEgZGVsdGEgY3JlYXRpb24gdGltZSAoMjRoKQorIwkJCSAiOkM6JShlc2Mp YyIJCQkgICMgMiBjaGVja2luIGNvbW1lbnRzCisjCQkJICI6RFM6JShlc2MpYyIJCQkgICMgMyBz ZXFubworIwkJCSAiOkRQOiUoZXNjKWMiCQkJICAjIDQgcGFyZW50IHNlcW5vCisjCQkJICI6RFQ6 JShlc2MpYyIJCQkgICMgNSBkZWx0YSB0eXBlIChSIG9yIEQpCisjCQkJICI6STolKGVzYyljIgkJ CSAgIyA2IFNJRAorIwkJCSAiOk1SOiUoZXNjKWMiCQkJICAjIDcgTVIgbnVtYmVycworIwkJCSAi OlA6JShlc2MpYyIJCQkgICMgOCBQZXJwZXRyYXRvciAoY29tbWl0dGVyKQorIwkJCSAlIHsgJ2Vz Yyc6IFNDQ1NfRVNDQVBFIH0pCisjCSAgY21kbGluZSA9IFsoIi1kJXMiICUgZm10KSwgKCItciVz IiAlIHNpZCksIGZpbGVuYW1lXQorIwkgIHByb3BkYXRhID0gU2Njc0ZpbGVRdWVyeVNsb3cuUnVu UHJzKGNtZGxpbmUpCisjCSAgcmV0dXJuIHByb3BkYXRhLnNwbGl0KFNDQ1NfRVNDQVBFKQorIwor IwlAc3RhdGljbWV0aG9kCisjCWRlZiBJc1ZhbGlkU2Njc0ZpbGUoZmlsZW5hbWUpOgorIwkgIHRy eToKKyMJCW91dHB1dCA9IFNjY3NGaWxlUXVlcnlTbG93LlJ1blBycyhbIi1kOkY6ICIsIGZpbGVu YW1lXSkKKyMJCXJldHVybiBUcnVlCisjCSAgZXhjZXB0IEltcG9ydEZhaWx1cmU6CisjCQlyZXR1 cm4gRmFsc2UKKyMJICAKKyMJQHN0YXRpY21ldGhvZAorIwlkZWYgR2V0UmV2aXNpb25MaXN0KGZp bGVuYW1lKToKKyMJICByZXZpc2lvbnMgPSBTY2NzRmlsZVF1ZXJ5U2xvdy5SdW5QcnMoWyItZDpJ OiAiLCAiLWUiLCBmaWxlbmFtZV0pCisjCSAgcmV0dXJuIHJldmlzaW9ucy5zcGxpdCgpCisKKwor Y2xhc3MgU2Njc0ZpbGVRdWVyeUZhc3QoU2Njc0ZpbGVRdWVyeUJhc2UpOgorICAiIiJFeHRyYWN0 IGluZm9ybWF0aW9uIGZyb20gU0NDUyBmaWxlcyBieSBwYXJzaW5nIHRoZW0gZGlyZWN0bHkuIiIi CisgIERFTFRBX1JFID0gcmUuY29tcGlsZSgiXiVjZCBEIChbLjAtOV0qKSIgJSAoU0NDU19FU0NB UEUsKSkKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBJc1ZhbGlkU2Njc0ZpbGUoZmlsZW5hbWUp OgorCSB0cnk6CisJICAgZiA9IG9wZW4oZmlsZW5hbWUsICJyYiIpCisJICAgaGVhZGVyID0gZi5y ZWFkKDIpCisJICAgcmV0dXJuIGhlYWRlclswXSA9PSBTQ0NTX0VTQ0FQRSBhbmQgaGVhZGVyWzFd ID09ICdoJworCSBmaW5hbGx5OgorCSAgIGYuY2xvc2UoKQorCisgIEBzdGF0aWNtZXRob2QKKyAg ZGVmIEdldFJldmlzaW9uTGlzdChmaWxlbmFtZSk6CisJIHJlc3VsdCA9IFtdCisJIGhlYWRlcl9l bmQgPSAiXiVjVCIgJSAoU0NDU19FU0NBUEUsKQorCSBmb3IgbGluZSBpbiBTY2NzRmlsZVF1ZXJ5 QmFzZS5IZWFkZXJMaW5lcyhmaWxlbmFtZSk6CisJICAgbSA9IFNjY3NGaWxlUXVlcnlGYXN0LkRF TFRBX1JFLm1hdGNoKGxpbmUpCisJICAgaWYgbToKKwkJIHJlc3VsdC5hcHBlbmQobS5ncm91cCgx KSkKKwkgcmV0dXJuIHJlc3VsdAorCisgIEBzdGF0aWNtZXRob2QKKyAgZGVmIEZldGNoRGVsdGFQ cm9wZXJ0aWVzKHNpZCwgZmlsZW5hbWUpOgorCSBmb3VuZCA9IEZhbHNlCisJIHByb3BzID0gW10K KwkgY29tbWVudHMgPSBbXQorCSBjb21tZW50X2xlYWRlciA9ICIlY2MiICUgKFNDQ1NfRVNDQVBF LCkKKwkgZm9yIGxpbmUgaW4gU2Njc0ZpbGVRdWVyeUJhc2UuSGVhZGVyTGluZXMoZmlsZW5hbWUp OgorCSAgIGlmIG5vdCBmb3VuZDoKKwkJIG0gPSBTY2NzRmlsZVF1ZXJ5RmFzdC5ERUxUQV9SRS5t YXRjaChsaW5lKQorCQkgaWYgbSBhbmQgKHNpZCA9PSBtLmdyb3VwKDEpKToKKwkJICAgZm91bmQg PSBUcnVlCisJCSAgIGZpZWxkcyA9IGxpbmUuc3BsaXQoKQorCQkgICBwcm9wcyA9IFsgZmllbGRz WzNdLAorCQkJCQkgZmllbGRzWzRdLAorCQkJCQkgTm9uZSwgIyBjaGVja2luIGNvbW1lbnQKKwkJ CQkJIGZpZWxkc1s2XSwKKwkJCQkJIGZpZWxkc1s3XSwKKwkJCQkJICdEJywKKwkJCQkJIGZpZWxk c1syXSwKKwkJCQkJICIiLAkgICAjIE1SIGxpc3QKKwkJCQkJIGZpZWxkc1s1XSwKKwkJCQkJICJ5 b2RlbCIKKwkJCQkJIF0KKwkJICAgY29udGludWUKKwkJIGVsc2U6CisJCSAgIGlmIGZvdW5kOgor CQkJIGlmIGxpbmUuc3RhcnRzd2l0aChjb21tZW50X2xlYWRlcik6CisJCQkgICBjb21tZW50cy5h cHBlbmQobGluZVszOl0pCisJCQkgZWxzZToKKwkJCSAgIGJyZWFrCisJIGlmIGZvdW5kOgorCSAg IHByb3BzWzJdID0gIlxuIi5qb2luKGNvbW1lbnRzKQorCSAgICMgcHJpbnQgPj4gc3lzLnN0ZGVy ciwgInByb3BzOiAlcyIgJSAocHJvcHMsKQorCSAgIHJldHVybiBwcm9wcworCSBlbHNlOgorCSAg IHJldHVybiBOb25lCisKKworZGVmIFNjY3NGaWxlUXVlcnkoKToKKyAgIiIiRmFjdG9yeSBtZXRo b2QgZm9yIG9iamVjdHMgdGhhdCBxdWVyeSBTY2NzRmlsZVF1ZXJ5IG9iamVjdHMiIiIKKyAgcmV0 dXJuIFNjY3NGaWxlUXVlcnlGYXN0KCkKKworCitjbGFzcyBEZWx0YShvYmplY3QpOgorICAiIiJS ZXByZXNlbnRzIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIFNDQ1MgZGVsdGEgdGhhdCB3ZQorICBpbXBv cnQgaW50byBnaXQuIiIiCisgIGRlZiBfX2luaXRfXyhzZWxmLCBzY2NzZmlsZSwgc2lkLCBxaWYs ICphcmdzLCAqKmt3YXJncyk6CisJIHN1cGVyKERlbHRhLCBzZWxmKS5fX2luaXRfXygqYXJncywg Kiprd2FyZ3MpCisJIHNlbGYuX3NjY3NmaWxlID0gc2Njc2ZpbGUKKwkgc2VsZi5fc2lkCQk9IHNp ZAorCSBzZWxmLl9xaWYgPSBxaWYKKwkgc2VsZi5GZXRjaERlbHRhUHJvcGVydGllcygpCisKKyAg ZGVmIF9fcmVwcl9fKHNlbGYpOgorCSByZXR1cm4gJ0RlbHRhKCVzLCAiJXMiKScgJSAocmVwcihz ZWxmLl9zY2NzZmlsZSksIHNlbGYuX3NpZCkKKworICBkZWYgRmV0Y2hEZWx0YVByb3BlcnRpZXMo c2VsZik6CisJICIiIlF1ZXJ5IHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgZGVsdGEgZnJvbSB0aGUg U0NDUyBmaWxlLiIiIgorCSBwcm9wcyA9IHNlbGYuX3FpZi5GZXRjaERlbHRhUHJvcGVydGllcyhz ZWxmLl9zaWQsCisJCQkJCQkJCQkJCXNlbGYuX3NjY3NmaWxlLl9maWxlbmFtZSkKKwkgYXNzZXJ0 IGxlbihwcm9wcyk+MSwgIiVzICVzICVzIiAlIChzZWxmLl9zY2NzZmlsZS5fZmlsZW5hbWUsIHNl bGYuX3NpZCwgcHJvcHMpCisJIHNlbGYuU2V0VGltZXN0YW1wKHByb3BzWzBdLCBwcm9wc1sxXSkK KwkgKHNlbGYuX2NvbW1lbnQsIHNlbGYuX3NlcW5vLCBzZWxmLl9wYXJlbnRfc2Vxbm8sIHNlbGYu X3R5cGUsCisJICBzaWRjaGVjaywgbXJsaXN0LCBzZWxmLl9jb21pdHRlciwgXykgPSBwcm9wc1sy Ol0KKwkJIAorCSBzZWxmLl9zZXFubyA9IGludChzZWxmLl9zZXFubykKKwkgc2VsZi5fcGFyZW50 X3NlcW5vID0gaW50KHNlbGYuX3BhcmVudF9zZXFubykKKwkgaWYgc2VsZi5fY29tbWVudCA9PSAi XG4iOgorCQkgc2VsZi5fY29tbWVudCA9IE5vbmUKKwkgYXNzZXJ0IHNpZGNoZWNrPT1zZWxmLl9z aWQKKwkgc2VsZi5fbXJzID0gbXJsaXN0LnNwbGl0KCkKKworICBkZWYgU2FtZUZ1enp5Q29tbWl0 KHNlbGYsIG90aGVyKToKKwkgI3ByaW50ID4+c3lzLnN0ZGVyciwgKCJTYW1lRnV6enlDb21taXQ6 IGNvbXBhcmluZ1xuMTogJXMgd2l0aFxuMjogJXMiCisJICMJCQkJCSAgICUgKHNlbGYsIG90aGVy KSkKKwkgaWYgc2VsZi5fY29tbWVudCAhPSBvdGhlci5fY29tbWVudDoKKwkgICByZXR1cm4gRmFs c2UKKwkgZWxpZiBzZWxmLl9jb21pdHRlciAhPSBvdGhlci5fY29taXR0ZXI6CisJICAgcmV0dXJu IEZhbHNlCisJIGVsaWYgc2VsZi5fbXJzICE9IG90aGVyLl9tcnM6CisJICAgcmV0dXJuIEZhbHNl CisJIGVsc2U6CisJICAgZGVsdGEgPSBhYnMob3RoZXIuX3RpbWVzdGFtcCAtIHNlbGYuX3RpbWVz dGFtcCkKKwkgICBpZiBkZWx0YSA+IEZVWlpZX1dJTkRPVzoKKwkJIHJldHVybiBGYWxzZQorCSAg IGVsc2U6CisJCSByZXR1cm4gVHJ1ZQorCisgIGRlZiBTZXRUaW1lc3RhbXAoc2VsZiwgY2hlY2tp bl9kYXRlLCBjaGVja2luX3RpbWUpOgorCSAgIHRyeToKKwkJIHllYXIsIG1vbnRoLCBtb250aGRh eSA9IFtpbnQoZikgZm9yIGYgaW4gY2hlY2tpbl9kYXRlLnNwbGl0KCIvIildCisJICAgZXhjZXB0 IFZhbHVlRXJyb3I6CisJCSByYWlzZSBJbXBvcnRGYWlsdXJlLCAoIlVuZXhwZWN0ZWQgZGF0ZSBm b3JtYXQ6ICVzIgorCQkJCQkJCSAgICUgKGNoZWNraW5fZGF0ZSwpKQorCSAgIHRyeToKKwkJIGgs bSxzID0gW2ludChmKSBmb3IgZiBpbiBjaGVja2luX3RpbWUuc3BsaXQoIjoiKV0KKwkgICBleGNl cHQgVmFsdWVFcnJvcjoKKwkJIHJhaXNlIEltcG9ydEZhaWx1cmUsICgiVW5leHBlY3RlZCB0aW1l IGZvcm1hdDogJXMiCisJCQkJCQkJICAgJSAoY2hlY2tpbl90aW1lLCkpCisJICAgbWljcm9zZWMg PSAwCisKKwkgICBpZiB5ZWFyIDwgMTAwOgorCQkgIyBBcHBseSB0aGUgeTJrIHJ1bGUgKHNlZSB0 aGUgIlllYXIgMjAwMCBJc3N1ZXMiIHNlY3Rpb24KKwkJICMgb2YgdGhlIENTU0MgZG9jdW1lbnRh dGlvbikuCisJCSBpZiB5ZWFyIDwgNjk6CisJCSAgIHllYXIgKz0gMjAwMAorCQkgZWxzZToKKwkJ ICAgeWVhciArPSAxOTAwCisKKwkgICBkdCA9IGRhdGV0aW1lLmRhdGV0aW1lKHllYXIsIG1vbnRo LCBtb250aGRheSwKKwkJCQkJCQkgIGgsIG0sIHMsCisJCQkJCQkJICBtaWNyb3NlYywgVElNRVpP TkUpCisJICAgZXBvY2hfb2Zmc2V0ID0gdGltZS5ta3RpbWUoZHQudGltZXR1cGxlKCkpCisJICAg IyBXZSBzdWJ0cmFjdCBVTklYX0VQT0NIIHRvIHRha2UgYWNjb3VudCBvZiB0aGUgZmFjdAorCSAg ICMgdGhhdCB0aGUgc3lzdGVtIGVwb2NoIG1heSBpbiBmYWN0IG5vdCBiZSB0aGUgc2FtZSBhcyB0 aGUgVW5peAorCSAgICMgZXBvY2guCSBnaXQgZmFzdC1pbXBvcnQgcmVxdWlyZXMgdGhlIHRpbWVz dGFtcCB0byBiZSBtZWFzdXJlZCBpbgorCSAgICMgc2Vjb25kcyBzaW5jZSB0aGUgVW5peCBlcG9j aC4KKwkgICBzZWxmLl90aW1lc3RhbXAgPSBlcG9jaF9vZmZzZXQgLSBVTklYX0VQT0NICisJCSAK KyAgZGVmIEdpdFRpbWVzdGFtcChzZWxmKToKKwkgbiA9IGludChzZWxmLl90aW1lc3RhbXApCisJ IHJldHVybiAiJWQgKzAwMDAiICUgKG4sKQorCisKK2NsYXNzIFNjY3NGaWxlKG9iamVjdCk6Cisg IGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCAqYXJncywgKiprd2FyZ3MpOgorCSBzdXBlcihTY2Nz RmlsZSwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorCSBzZWxmLl9maWxlbmFtZSA9 IG5hbWUKKwkgcWlmID0gU2Njc0ZpbGVRdWVyeSgpCisJIHJldmlzaW9ucyA9IGZpbHRlcihzZWxm Lkdvb2RSZXZpc2lvbiwgcWlmLkdldFJldmlzaW9uTGlzdChuYW1lKSkKKwkgc2VsZi5fZGVsdGFz ID0gW0RlbHRhKHNlbGYsIHNpZCwgcWlmKSBmb3Igc2lkIGluIHJldmlzaW9uc10KKwkgc2VsZi5f Z2l0bmFtZSA9IHNlbGYuR2l0RnJpZW5kbHlOYW1lKHNlbGYuX0dvdHRlbk5hbWUoKSkKKwkgaWYg RmlsZU1vZGUoc2VsZi5fZmlsZW5hbWUpICYgMDExMToKKwkgICBzZWxmLl9naXRtb2RlID0gIjc1 NSIKKwkgZWxzZToKKwkgICBzZWxmLl9naXRtb2RlID0gIjY0NCIKKwkgCisgIGdpdG5hbWUgPSBw cm9wZXJ0eShsYW1iZGEgc2VsZjogc2VsZi5fZ2l0bmFtZSkKKyAgZ2l0bW9kZSA9IHByb3BlcnR5 KGxhbWJkYSBzZWxmOiBzZWxmLl9naXRtb2RlKQorICBmaWxlbmFtZSA9IHByb3BlcnR5KGxhbWJk YSBzZWxmOiBzZWxmLl9maWxlbmFtZSkKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBJc1ZhbGlk U2Njc0ZpbGUoZmlsZW5hbWUpOgorCSBxaWYgPSBTY2NzRmlsZVF1ZXJ5KCkKKwkgcmV0dXJuIHFp Zi5Jc1ZhbGlkU2Njc0ZpbGUoZmlsZW5hbWUpCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorCSBy ZXR1cm4gIlNjY3NGaWxlKHInJXMnKSIgJSBzZWxmLl9maWxlbmFtZQorCisgIEBzdGF0aWNtZXRo b2QKKyAgZGVmIEdpdEZyaWVuZGx5TmFtZShuYW1lKToKKwkgIiIiZ2l0LWZhc3RpbXBvcnQgZG9l cyBub3QgbGlrZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNsYXNoZXMsCisJIG9yIC4gb3IgLi4gaW4g ZmlsZSBuYW1lcy4JVGhpcyBtZXRob2QgcmVtb3ZlcyBzdWNoIHRoaW5ncy4iIiIKKwkgaWYgb3Mu cGF0aC5pc2FicyhuYW1lKToKKwkgICByYWlzZSBJbXBvcnRGYWlsdXJlLCAiJXMgaXMgYW4gYWJz b2x1dGUgcGF0aCBuYW1lIiAlIChuYW1lLCkKKwkgZHJpdmUsIHBhdGggPSBvcy5wYXRoLnNwbGl0 ZHJpdmUobmFtZSkKKwkgcmV0dXJuIG9zLnBhdGgubm9ybXBhdGgocGF0aCkKKworICBkZWYgX0dv dHRlbk5hbWUoc2VsZik6CisJICIiIkNvbnZlcnQgdGhlIG5hbWUgb2YgYW4gU0NDUyBmaWxlIHRv IHRoZSBuYW1lIG9mIHRoZQorCSB3b3JraW5nIGZpbGUgYXMgd291bGQgYmUgYXNzdW1lZCBieSBt YWtlLglTcGVjaWZpY2FsbHksCisJIHRoZSBzLiBwcmVmaXggaXMgc3RpcHBlZCwgYW5kIGlmIHRo ZSBzLmZpbGUgaXMgaW4gYSBkaXJlY3RvcnkKKwkgY2FsbGVkIFNDQ1MsIHRoYXQgZGlyZWN0b3J5 IGlzIHN0cmlwcGVkIG91dCBvZiB0aGUgcGF0aCBhbHNvLgorCSAiIiIKKwkgaGVhZCwgdGFpbCA9 IG9zLnBhdGguc3BsaXQoc2VsZi5fZmlsZW5hbWUpCisJIGlmIHRhaWwuc3RhcnRzd2l0aCgicy4i KToKKwkgICB0YWlsID0gdGFpbFsyOl0KKwkgZGlyaGVhZCwgZGlydGFpbCA9IG9zLnBhdGguc3Bs aXQoaGVhZCkKKwkgaWYgZGlydGFpbCA9PSAiU0NDUyI6CisJICAgaGVhZCA9IGRpcmhlYWQKKwkg cmV0dXJuIG9zLnBhdGguam9pbihoZWFkLCB0YWlsKQorCisKKyAgZGVmIEdvb2RSZXZpc2lvbihz ZWxmLCBzaWQpOgorCSBjb21wcyA9IHNpZC5zcGxpdCgiLiIpCisJIGlmIGxlbihjb21wcykgPiAx OgorCSAgIHJldHVybiBUcnVlCisJIGVsc2U6CisJICAgTm90SW1wb3J0aW5nKHNlbGYuX2ZpbGVu YW1lLCBzaWQsCisJCQkJCSJTSUQgY29udGFpbnMgbm8gbGV2ZWwgY29tcG9uZW50IikKKwkgICBy ZXR1cm4gRmFsc2UKKworCQkgCisJCSAKKworY2xhc3MgR2l0SW1wb3J0ZXIob2JqZWN0KToKKyAg IiIiSGFuZGxlcyBjb21tdW5pY2F0aW9ucyB3aXRoIGdpdC1mYXN0LWltcG9ydC4iIiIKKyAgCisg IGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorCSBzdXBlcihHaXRJbXBvcnRl ciwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorCSBzZWxmLl9uZXh0X21hcmsgPSAx CisJIHNlbGYuX2NvbW1hbmQgPSBOb25lCisJIHNlbGYuX2ltcG9ydGVyID0gTm9uZQorCSBzZWxm Ll93cml0ZV90b19zdGRvdXQgPSBGYWxzZQorCisgIGRlZiBTdGFydEltcG9ydGVyKHNlbGYpOgor CSBhcmdzID0gWyJnaXQiLCJmYXN0LWltcG9ydCJdCisJIHNlbGYuX2NvbW1hbmQgPSAiICIuam9p bihhcmdzKQorCSBzZWxmLl9pbXBvcnRlciA9IHN1YnByb2Nlc3MuUG9wZW4oYXJncywKKwkJCQkJ CQkJCSAgIGNsb3NlX2Zkcz1UcnVlLAorCQkJCQkJCQkJICAgc3RkaW49c3VicHJvY2Vzcy5QSVBF KQorCisgIGRlZiBTZW5kVG9TdGRvdXQoc2VsZik6CisJIHNlbGYuX2NvbW1hbmQgPSBOb25lCisJ IHNlbGYuX2ltcG9ydGVyID0gTm9uZQorCSBzZWxmLl93cml0ZV90b19zdGRvdXQgPSBUcnVlCisK KyAgZGVmIEdldE5leHRNYXJrKHNlbGYpOgorCSAiIiJHZXQgdGhlIG5leHQgdW51c2VkIGlkbnVt IGZvciBhIG1hcmsgc3RhdGVtZW50LiIiIgorCSByZXN1bHQgPSBzZWxmLl9uZXh0X21hcmsKKwkg c2VsZi5fbmV4dF9tYXJrICs9IDEKKwkgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBXcml0ZShzZWxm LCBzKToKKwkgIiIiV3JpdGUgc29tZSBkYXRhIHRvIHRoZSBpbXBvcnRlci4iIiIKKwkgaWYgc2Vs Zi5fd3JpdGVfdG9fc3Rkb3V0OgorCSAgIHN5cy5zdGRvdXQud3JpdGUocykKKwkgZWxzZToKKwkg ICBhc3NlcnQgc2VsZi5faW1wb3J0ZXIKKwkgICBzZWxmLl9pbXBvcnRlci5zdGRpbi53cml0ZShz KQorCSAgIAorICBkZWYgRG9uZShzZWxmKToKKwkgaWYgc2VsZi5faW1wb3J0ZXI6CisJICAgc2Vs Zi5faW1wb3J0ZXIuc3RkaW4uY2xvc2UoKQorCSAgIHJldHVybmNvZGUgPSBzZWxmLl9pbXBvcnRl ci53YWl0KCkKKwkgICBpZiByZXR1cm5jb2RlICE9IDA6CisJCSBEaWFnbm9zZUNvbW1hbmRGYWls dXJlKHNlbGYuX2NvbW1hbmQsIHJldHVybmNvZGUsIE5vbmUpCisJICAgZWxzZToKKwkJIHByaW50 ID4+c3lzLnN0ZGVyciwgKCIlcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IgorCQkJCQkJCSAgJSAo c2VsZi5fY29tbWFuZCwpKQorCQkgCisgIGRlZiBQcm9ncmVzc01zZyhzZWxmLCBtc2cpOgorCSAi IiJFbWl0IGEgcHJvZ3Jlc3MgbWVzc2FnZSBmb3IgdGhlIHVzZXIuIiIiCisJIHN5cy5zdGRlcnIu d3JpdGUobXNnKQorCisgIGRlZiBQcm9ncmVzcyhzZWxmLCBkb25lLCBpdGVtcyk6CisJICIiIklu Zm9ybSB0aGUgdXNlciBvZiBvdXIgY3VycmVudCBwcm9ncmVzcy4iIiIKKwkgcGVyY2VudCA9ICgx MDAuMCAqIGZsb2F0KGRvbmUpKSAvIGZsb2F0KGl0ZW1zKQorCSBpZiBkb25lID09IGl0ZW1zOgor CSAgIHRhaWwgPSAiIGRvbmVcbiIKKwkgZWxzZToKKwkgICB0YWlsID0gIiIKKwkgbXNnID0gIlxy ICUzLjBmJSUgKCVkLyVkKSVzIiAlIChwZXJjZW50LCBkb25lLCBpdGVtcywgdGFpbCkKKwkgc2Vs Zi5Qcm9ncmVzc01zZyhtc2cpCisKKyAgZGVmIEdldFVzZXJFbWFpbEFkZHJlc3Moc2VsZiwgbG9n aW5fbmFtZSk6CisJICIiIkdldCBhbiBlbWFpbCBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhl IGdpdmVuIGxvZ2luIG5hbWUuIiIiCisJIGlmIE1BSUxfRE9NQUlOOgorCSAgIHJldHVybiAiJXNA JHMiICUgKGxvZ2luX25hbWUsTUFJTF9ET01BSU4pCisJIGVsc2U6CisJICAgcmV0dXJuIGxvZ2lu X25hbWUKKworICBkZWYgV3JpdGVEYXRhKHNlbGYsIGRhdGEpOgorCSAiIiJFbWl0IGEgZGF0YSBj b21tYW5kIGZvbGxvd2QgYnkgYSBibG9iIG9mIGRhdGEuIiIiCisJIHNlbGYuV3JpdGUoImRhdGEg JWRcbiIgJSAobGVuKGRhdGEpLCkpCisJIHNlbGYuV3JpdGUoZGF0YSkKKwkgc2VsZi5Xcml0ZSgi XG4iKQorCQkJIAorICBkZWYgQmVnaW5Db21taXQoc2VsZiwgZGVsdGEsIHBhcmVudCk6CisJICIi IlN0YXJ0IGEgbmV3IGNvbW1pdCAoaGF2aW5nIHRoZSBpbmRpY2F0ZWQgcGFyZW50KS4iIiIKKwkg bWFyayA9IHNlbGYuR2V0TmV4dE1hcmsoKQorCSBzZWxmLldyaXRlKCJjb21taXQgJXNcbm1hcmsg OiVkXG4iICUgKElNUE9SVF9SRUYsIG1hcmspKQorCSB0cyA9IGRlbHRhLkdpdFRpbWVzdGFtcCgp CisJIHNlbGYuV3JpdGUoImNvbW1pdHRlciAlcyA8JXM+ICVzXG4iCisJCQkJJSAoZGVsdGEuX2Nv bWl0dGVyLAorCQkJCSAgIHNlbGYuR2V0VXNlckVtYWlsQWRkcmVzcyhkZWx0YS5fY29taXR0ZXIp LAorCQkJCSAgIHRzKSkKKwkgaWYgZGVsdGEuX2NvbW1lbnQ6CisJICAgc2VsZi5Xcml0ZURhdGEo ZGVsdGEuX2NvbW1lbnQpCisJIGVsc2U6CisJICAgc2VsZi5Xcml0ZURhdGEoIiIpCQkgICAjIGNv bW1pdCBjb21tZW50IGlzIG1hbmRhdG9yeQorCSBpZiBwYXJlbnQ6CisJICAgc2VsZi5Xcml0ZSgi ZnJvbSA6JWRcbiIgJSAocGFyZW50LCkpCisJIHJldHVybiBtYXJrCisKKyAgZGVmIEZpbGVtb2Rp Znkoc2VsZiwgc2ZpbGUsIGJvZHkpOgorCSAiIiJXcml0ZSBhIGZpbGVtb2RpZnkgc2VjdGlvbiBv ZiBhIGNvbW1pdC4iIiIKKwkgc2VsZi5Xcml0ZSgiTSAlcyBpbmxpbmUgJXNcbiIgJSAoc2ZpbGUu Z2l0bW9kZSwgc2ZpbGUuZ2l0bmFtZSkpCisJIHNlbGYuV3JpdGVEYXRhKGJvZHkpCisKKyAgZGVm IENvbXBsZXRlQ29tbWl0KHNlbGYpOgorCSAiIiJXcml0ZSB0aGUgZmluYWwgcGFydCBvZiBhIGNv bW1pdC4iIiIKKwkgc2VsZi5Xcml0ZSgiXG4iKQorCQkgCisjIFRPRE86IGlmIHRoZSBmdXp6eSBj b21taXQgbG9naWMgcHV0cyBzdWJzZXF1ZW50IGRlbHRhcyBpbnRvIHRoZSBzYW1lCisjIGNvbW1p dCwgdGhlIHRpbWVzdGFtcCBvZiB0aGUgY29tbWl0IGlzIHRoYXQgb2YgdGhlIGZpcnN0IGRlbHRh LglPbmUKKyMgY291bGQgYXJndWUgdGhhdCB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IG9uZSB3 b3VsZCBiZSBhIGJldHRlcgorIyBjaG9pY2UuCisKK2RlZiBJbXBvcnREZWx0YXMoaW1wLCBkZWx0 YXMpOgorICBpZiBub3QgZGVsdGFzOgorCSByYWlzZSBJbXBvcnRGYWlsdXJlLCAiTm8gZGVsdGFz IHRvIGltcG9ydCIKKyAgZmlyc3RfZGVsdGFfaW5fY29tbWl0ID0gTm9uZQorICBkb25lID0gMAor ICBpbXAuUHJvZ3Jlc3NNc2coIkNyZWF0aW5nIGNvbW1pdHMuLi5cbiIpCisgIHBhcmVudCA9IE5v bmUKKyAgY29tbWl0X2NvdW50ID0gMAorICBmb3IgZCBpbiBkZWx0YXM6CisJIGltcC5Qcm9ncmVz cyhkb25lLCBsZW4oZGVsdGFzKSkKKwkgZG9uZSArPSAxCisJICMgRmlndXJlIG91dCBpZiB3ZSBu ZWVkIHRvIHN0YXJ0IGEgbmV3IGNvbW1pdC4KKwkgaWYgZmlyc3RfZGVsdGFfaW5fY29tbWl0Ogor CSAgIGlmIG5vdCBmaXJzdF9kZWx0YV9pbl9jb21taXQuU2FtZUZ1enp5Q29tbWl0KGQpOgorCQkg aW1wLkNvbXBsZXRlQ29tbWl0KCkKKwkJIGZpcnN0X2RlbHRhX2luX2NvbW1pdCA9IE5vbmUKKwkg aWYgZmlyc3RfZGVsdGFfaW5fY29tbWl0IGlzIE5vbmU6CisJICAgZmlyc3RfZGVsdGFfaW5fY29t bWl0ID0gZAorCSAgIGN1cnJlbnQgPSBpbXAuQmVnaW5Db21taXQoZCwgcGFyZW50KQorCSAgIGNv bW1pdF9jb3VudCArPSAxCisJICAgcGFyZW50ID0gY3VycmVudAorCSAjIFdlJ3JlIG5vdyBpbiBh IGNvbW1pdC4gIEVtaXQgdGhlIGJvZHkgZm9yIHRoaXMgZGVsdGEuCisJIGJvZHkgPSBHZXRCb2R5 KGQuX3NjY3NmaWxlLl9maWxlbmFtZSwgZC5fc2Vxbm8sIEZhbHNlKQorCSBpbXAuRmlsZW1vZGlm eShkLl9zY2NzZmlsZSwgYm9keSkKKyAgIyBGaW5pc2hlZCBsb29waW5nIG92ZXIgZGVsdGFzCisg IGlmIHBhcmVudDoKKwkgICBpbXAuQ29tcGxldGVDb21taXQoKQorICBpbXAuUHJvZ3Jlc3MoZG9u ZSwgbGVuKGRlbHRhcykpCisgIHByaW50ID4+c3lzLnN0ZGVyciwgKCIlZCBTQ0NTIGRlbHRhcyBp biAlZCBnaXQgY29tbWl0cyIKKwkJCQkJCSUgKGxlbihkZWx0YXMpLCBjb21taXRfY291bnQpKQor CisKK2RlZiBJbXBvcnQoZmlsZW5hbWVzLCBzdGRvdXQpOgorICAiIiJJbXBvcnQgdGhlIGluZGlj YXRlZCBTQ0NTIGZpbGVzIGludG8gZ2l0LiIiIgorICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVz OgorCSBpZiBub3Qgb3MuYWNjZXNzKGZpbGVuYW1lLCBvcy5SX09LKToKKwkgICBtc2cgPSAiJXMg aXMgbm90IHJlYWRhYmxlIiAlIChmaWxlbmFtZSwpCisJICAgcmFpc2UgSW1wb3J0RmFpbHVyZSwg bXNnCisJIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShmaWxlbmFtZSk6CisJICAgbXNnID0gIiVzIGlz IG5vdCBhIGZpbGUiICUgKGZpbGVuYW1lLCkKKwkgICByYWlzZSBJbXBvcnRGYWlsdXJlLCBtc2cK KyAgc2Njc2ZpbGVzID0gW10KKyAgZG9uZSA9IDAKKyAgaW1wID0gR2l0SW1wb3J0ZXIoKQorICBp bXAuUHJvZ3Jlc3NNc2coIlJlYWRpbmcgbWV0YWRhdGEgZnJvbSBTQ0NTIGZpbGVzLi4uXG4iKQor ICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgorCSB0cnk6CisJICAgaW1wLlByb2dyZXNzKGRv bmUsIGxlbihmaWxlbmFtZXMpKQorCSAgIGlmIFNjY3NGaWxlLklzVmFsaWRTY2NzRmlsZShmaWxl bmFtZSk6CisJCSBzZiA9IFNjY3NGaWxlKGZpbGVuYW1lKQorCQkgc2Njc2ZpbGVzLmFwcGVuZChz ZikKKwkgICBlbHNlOgorCQkgTm90SW1wb3J0aW5nKGZpbGVuYW1lLCBOb25lLCAibm90IGEgdmFs aWQgU0NDUyBmaWxlIikKKwkgICBkb25lICs9IDEKKwkgZXhjZXB0IEltcG9ydEZhaWx1cmU6CisJ ICAgbXNnID0gKCJcbkFuIGltcG9ydCBmYWlsdXJlIG9jY3VycmVkIHdoaWxlIHByb2Nlc3Npbmcg JXMiCisJCQkgICUgKGZpbGVuYW1lLCkpCisJICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCisJ ICAgcmFpc2UKKyAgaW1wLlByb2dyZXNzKGRvbmUsIGxlbihmaWxlbmFtZXMpKQorICAjIE5vdyB3 ZSBoYXZlIGFsbCB0aGUgbWV0YWRhdGE7IHNvcnQgdGhlIGRlbHRhcyBieSB0aW1lc3RhbXAKKyAg IyBhbmQgaW1wb3J0IHRoZSBkZWx0YXMgaW4gdGltZSBvcmRlci4KKyAgZGVsdGFfbGlzdCA9IFtd CisgIGZvciBzZmlsZSBpbiBzY2NzZmlsZXM6CisJIGZvciBkZWx0YSBpbiBzZmlsZS5fZGVsdGFz OgorCSAgIHRzID0gIiUxNWYiICUgKGRlbHRhLl90aW1lc3RhbXAsKQorCSAgIHQgPSAodHMsIGRl bHRhKQorCSAgIGRlbHRhX2xpc3QuYXBwZW5kKHQpCisgIGRlbHRhX2xpc3Quc29ydCgpCisKKyAg aWYgc3Rkb3V0OgorCSBpbXAuU2VuZFRvU3Rkb3V0KCkKKyAgZWxzZToKKwkgaW1wLlN0YXJ0SW1w b3J0ZXIoKQorICB0cnk6CisJIEltcG9ydERlbHRhcyhpbXAsIFtkWzFdIGZvciBkIGluIGRlbHRh X2xpc3RdKQorICBmaW5hbGx5OgorCSBpbXAuRG9uZSgpCisKKworZGVmIElzVmFsaWRHaXREaXIo cGF0aCk6CisgICIiIlJldHVybnMgVHJ1ZSBJRkYgcGF0aCBpcyBhIHZhbGlkIGdpdCByZXBvLgor CisgIENvcGllZCBmcm9tIGdpdC1wNC4KKyAgIiIiCisgIGlmIChvcy5wYXRoLmV4aXN0cyhwYXRo ICsgIi9IRUFEIikKKwkgICBhbmQgb3MucGF0aC5leGlzdHMocGF0aCArICIvcmVmcyIpCisJICAg YW5kIG9zLnBhdGguZXhpc3RzKHBhdGggKyAiL29iamVjdHMiKSk6CisJIHJldHVybiBUcnVlOwor ICByZXR1cm4gRmFsc2UKKworCitkZWYgRmluZEdpdERpcihnaXRkaXIsIGluaXQpOgorICAiIiJM b2NhdGUgdGhlIGdpdCByZXBvc2l0b3J5LiIiIgorICBpZiBub3QgZ2l0ZGlyOgorCSBnaXRkaXIg PSBSdW5Db21tYW5kKFsiZ2l0IiwgInJldi1wYXJzZSIsICItLWdpdC1kaXIiXSkKKwkgaWYgZ2l0 ZGlyOgorCSAgIGdpdGRpciA9IGdpdGRpci5zdHJpcCgpCisJIGVsc2U6CisJICAgY2R1cCA9IFJ1 bkNvbW1hbmQoWyJnaXQiLCAicmV2LXBhcnNlIiwgIi0tc2hvdy1jZHVwIl0pCisJICAgaWYgY2R1 cDoKKwkJIGdpdGRpciA9IG9zLnBhdGguYWJzcGF0aChjZHVwLnN0cmlwKCkpCisJICAgZWxzZToK KwkJIGdpdGRpciA9ICIuIgorICBpZiBpbml0OgorCSAjIERvIGEgc2FuaXR5IGNoZWNrIHRoYXQg d2UncmUgbm90IGFib3V0IHRvIGNyZWF0ZSAvLmdpdC4KKwkgYXNzZXJ0IGdpdGRpcgorCSBpZiBu b3QgZ2l0ZGlyLmVuZHN3aXRoKCIvLmdpdCIpOgorCSAgIGdpdGRpciArPSAiLy5naXQiCisJIGlm IElzVmFsaWRHaXREaXIoZ2l0ZGlyKToKKwkgICByYWlzZSBJbXBvcnRGYWlsdXJlLCAoIkdpdCBy ZXBvc2l0b3J5ICVzIHdhcyBhbHJlYWR5IGluaXRpYWxpc2VkIgorCQkJCQkJCSAlIChnaXRkaXIs KSkKKwkgZWxzZToKKwkgICBSdW5Db21tYW5kKFsiZ2l0IiwgIi0tZ2l0LWRpcj0lcyIgJSAoZ2l0 ZGlyLCksICJpbml0Il0pCisJICAgCisgIGlmIG5vdCBJc1ZhbGlkR2l0RGlyKGdpdGRpcik6CisJ IGdpdGRpciArPSAiLy5naXQiCisJIGlmIG5vdCBJc1ZhbGlkR2l0RGlyKGdpdGRpcik6CisJICAg cmFpc2UgSW1wb3J0RmFpbHVyZSwgKCJjYW5ub3QgbG9jYXRlIGdpdCByZXBvc2l0b3J5IGF0ICVz IiAlCisJCQkJCQkJIChnaXRkaXIsKSkKKyAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgImdpdCByZXBv c2l0b3J5IGlzIGF0IiwgZ2l0ZGlyCisgIHJldHVybiBnaXRkaXIKKworCitkZWYgTWFrZURpcldv cmtsaXN0KGRpcnMpOgorICByZXN1bHQgPSBbXQorICBmb3IgZGlybmFtZSBpbiBkaXJzOgorCSBm b3Igcm9vdCwgc3ViZGlycywgZmlsZXMgaW4gb3Mud2FsayhkaXJuYW1lKToKKwkgICBmb3IgZiBp biBmaWxlczoKKwkJIGlmIGYuc3RhcnRzd2l0aCgicy4iKToKKwkJICAgcGh5c3BhdGggPSBvcy5w YXRoLmpvaW4ocm9vdCwgZikKKwkJICAgaWYgb3MuYWNjZXNzKHBoeXNwYXRoLCBvcy5SX09LKToK KwkJCSByZXN1bHQuYXBwZW5kKHBoeXNwYXRoKQorICBpZiBub3QgcmVzdWx0OgorCSBwcmludCA+ PnN5cy5zdGRlcnIsICgiV2FybmluZzogTm8gU0NDUyBmaWxlcyB3ZXJlIGZvdW5kIGluICVzIgor CQkJCQkJICAlICgiICIuam9pbihkaXJzKSkpCisgIHJldHVybiByZXN1bHQKKworCitkZWYgUGFy c2VPcHRpb25zKGFyZ3YpOgorICBnbG9iYWwgSU1QT1JUX1JFRgorICBnbG9iYWwgTUFJTF9ET01B SU4KKyAgZ2xvYmFsIEZVWlpZX1dJTkRPVworICBnbG9iYWwgdmVyYm9zZQorICBwYXJzZXIgPSBv cHRwYXJzZS5PcHRpb25QYXJzZXIoKQorICBwYXJzZXIuYWRkX29wdGlvbigiLS1icmFuY2giLAor CQkJCQkgaGVscD0iYnJhbmNoIHRvIHBvcHVsYXRlIiwKKwkJCQkJIGRlZmF1bHQ9Im1hc3RlciIp CisgIHBhcnNlci5hZGRfb3B0aW9uKCItLW1haWxkb21haW4iLAorCQkJCQkgaGVscD0iTWFpbCBk b21haW4gZm9yIHVzZXJuYW1lcyB0YWtlbiBmcm9tIFNDQ1MgZmlsZXMiKQorICBwYXJzZXIuYWRk X29wdGlvbigiLS1mdXp6eS1jb21taXQtd2luZG93IiwKKwkJCQkJIGRlZmF1bHQ9RlVaWllfV0lO RE9XLAorCQkJCQkgaGVscD0oIkRlbHRhcyBtb3JlIHRoYW4gdGhpcyBtYW55IHNlY29uZHMgYXBh cnQgIgorCQkJCQkJICAgImFyZSBhbHdheXMgY29uc2lkZXJlZCB0byBiZSBpbiBkaWZmZXJlbnQg Y29tbWl0cyIpKQorICBwYXJzZXIuYWRkX29wdGlvbigiLS1naXQtZGlyIiwKKwkJCQkJIGhlbHA9 IkRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBnaXQgcmVwb3NpdG9yeSIpCisgIHBhcnNlci5hZGRf b3B0aW9uKCItLWluaXQiLCBkZWZhdWx0PUZhbHNlLCBhY3Rpb249InN0b3JlX3RydWUiLAorCQkJ CQkgaGVscD0iSW5pdGlhbGlzZSB0aGUgZ2l0IHJlcG9zaXRvcnkgZmlyc3QiKQorICBwYXJzZXIu YWRkX29wdGlvbigiLS12ZXJib3NlIiwgZGVmYXVsdD1GYWxzZSwgYWN0aW9uPSJzdG9yZV90cnVl IiwKKwkJCQkJIGhlbHA9IlByaW50IHZlcmJvc2Ugc3RhdHVzIG1lc3NhZ2VzIikKKyAgcGFyc2Vy LmFkZF9vcHRpb24oIi0tc3Rkb3V0IiwgZGVmYXVsdD1GYWxzZSwgYWN0aW9uPSJzdG9yZV90cnVl IiwKKwkJCQkJIGhlbHA9KCJTZW5kIGdpdC1mYXN0LWltcG9ydCBkYXRhIHRvIHN0ZG91dCAiCisJ CQkJCQkgICAicmF0aGVyIHRoYW4gdG8gZ2l0LWZhc3QtaW1wb3J0IikpCisgIHBhcnNlci5hZGRf b3B0aW9uKCItLWRpcnMiLAorCQkJCQkgYWN0aW9uPSJzdG9yZV90cnVlIiwKKwkJCQkJIGhlbHA9 KCJDb21tYW5kLWxpbmUgYXJndW1lbnRzIGFyZSBhIGxpc3QgIgorCQkJCQkJICAgIm9mIGRpcmVj dG9yaWVzIHRvIGF1dG9tYXRpY2FsbHkgc2VhcmNoICIKKwkJCQkJCSAgICJyYXRoZXIgdGhhbiBh IGxpc3Qgb2YgU0NDUyBmaWxlcyIpKQorICAob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2Vf YXJncyhhcmd2KQorICB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlCisgIGlmIG9wdGlvbnMubWFp bGRvbWFpbjoKKwkgTUFJTF9ET01BSU4gPSBvcHRpb25zLm1haWxkb21haW4KKyAgdHJ5OgorCSBG VVpaWV9XSU5ET1cgPSBmbG9hdChvcHRpb25zLmZ1enp5X2NvbW1pdF93aW5kb3cpCisgIGV4Y2Vw dCBWYWx1ZUVycm9yOgorCSByYWlzZSBVc2FnZUVycm9yKCJUaGUgYXJndW1lbnQgZm9yIHRoZSAt LWZ1enp5LWNvbW1pdC13aW5kb3cgb3B0aW9uICIKKwkJCQkJICAic2hvdWxkIGJlIGEgbnVtYmVy LCBidXQgeW91IHNwZWNpZmllZCAnJXMnIgorCQkJCQkgICUgKG9wdGlvbnMuZnV6enlfY29tbWl0 X3dpbmRvdywpKQorICBJTVBPUlRfUkVGID0gInJlZnMvaGVhZHMvJXMiICUgKG9wdGlvbnMuYnJh bmNoLCkKKyAgcmV0dXJuIG9wdGlvbnMsIGFyZ3MKKworCitkZWYgbWFpbihhcmd2KToKKyAgcHJv Z25hbWUgPSBhcmd2WzBdIG9yICJnaXQtc2Njc2ltcG9ydCIKKyAgdHJ5OgorCSBvcHRpb25zLCBh cmdzID0gUGFyc2VPcHRpb25zKGFyZ3YpCisJIHByaW50ID4+c3lzLnN0ZGVyciwgIlBvc2l0aW9u YWwgYXJnczoiLCAiICIuam9pbihhcmdzKQorCSBhcmdzID0gYXJnc1sxOl0KKworCSBpZiBub3Qg YXJnczoKKwkgICBpZiBvcHRpb25zLmRpcnM6CisJCSByYWlzZSBVc2FnZUVycm9yKCJZb3UgZGlk IG5vdCBzcGVjaWZ5IGFueSBkaXJlY3RvcmllcyB0byBpbXBvcnQgZnJvbSIpCisJICAgZWxzZToK KwkJIHJhaXNlIFVzYWdlRXJyb3IoIllvdSBkaWQgbm90IHNwZWNpZnkgYW55IFNDQ1MgZmlsZXMg dG8gaW1wb3J0IikKKwkgCisJIGlmIG9wdGlvbnMuc3Rkb3V0IGFuZCBvcHRpb25zLmluaXQ6CisJ ICAgcmFpc2UgVXNhZ2VFcnJvcigiVGhlIC0taW5pdCBvcHRpb24gaXMgaW5jb21wYXRpYmxlICIK KwkJCQkJCSJ3aXRoIHRoZSAtLXN0ZG91dCBvcHRpb24iKQorCisJIGlmIG5vdCBvcHRpb25zLnN0 ZG91dDoKKwkgICB0cnk6CisJCSBvcy5lbnZpcm9uWyJHSVRfRElSIl0gPSBGaW5kR2l0RGlyKG9w dGlvbnMuZ2l0X2Rpciwgb3B0aW9ucy5pbml0KQorCSAgIGV4Y2VwdCBJbXBvcnRGYWlsdXJlLCBp bml0X2ZhaWx1cmU6CisJCSBpZiBvcHRpb25zLmluaXQ6CisJCSAgIGFjdGlvbiA9ICJpbml0aWFs aXNlIgorCQkgZWxzZToKKwkJICAgYWN0aW9uID0gImxvY2F0ZSIKKwkJICAgcHJpbnQgPj5zeXMu c3RkZXJyLCAoIkZhaWxlZCB0byAlcyB0aGUgZ2l0IHJlcG9zaXRvcnk6ICVzIgorCQkJCQkJCQkl IChhY3Rpb24sIGluaXRfZmFpbHVyZSkpCisJCSAgIHJldHVybiAxCisKKwkgaWYgb3B0aW9ucy5k aXJzOgorCSAgIGl0ZW1zID0gTWFrZURpcldvcmtsaXN0KGFyZ3MpCisJIGVsc2U6CisJICAgaXRl bXMgPSBhcmdzCisJIHByaW50ID4+c3lzLnN0ZGVyciwgIkltcG9ydGluZyBpdGVtczoiLCAiICIu am9pbihpdGVtcykKKwkgcmV0dXJuIEltcG9ydChpdGVtcywgb3B0aW9ucy5zdGRvdXQpCisKKyAg ZXhjZXB0IFVzYWdlRXJyb3IsIHVzYWdlX2VycjoKKwkgcmV0dXJuIFVzYWdlKHByb2duYW1lLCAx LCBzeXMuc3RkZXJyLCB1c2FnZV9lcnIpCisgIGV4Y2VwdCBJbXBvcnRGYWlsdXJlLCBpbXBfZmFp bHVyZToKKwkgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIkltcG9ydCBmYWlsZWQ6ICVzIiAlIChpbXBf ZmFpbHVyZSwpCisJIHJldHVybiAxCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAg c3lzLmV4aXQobWFpbihzeXMuYXJndikpCi0tIAoxLjUuMy44Cgo= ------=_Part_14724_30307614.1200827567608--