From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.5 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E24D4C47404 for ; Mon, 7 Oct 2019 15:15:04 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 999C12070B for ; Mon, 7 Oct 2019 15:15:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mVvk80P2" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 999C12070B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iHUic-0007QC-Lv; Mon, 07 Oct 2019 15:14:38 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iHUia-0007OG-Om for xen-devel@lists.xenproject.org; Mon, 07 Oct 2019 15:14:36 +0000 X-Inumbo-ID: 088c9b36-e915-11e9-8c93-bc764e2007e4 Received: from mail-qk1-x72d.google.com (unknown [2607:f8b0:4864:20::72d]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 088c9b36-e915-11e9-8c93-bc764e2007e4; Mon, 07 Oct 2019 15:13:35 +0000 (UTC) Received: by mail-qk1-x72d.google.com with SMTP id 4so12909930qki.6 for ; Mon, 07 Oct 2019 08:13:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lhc2CDeFl+CA5GFkR8PqfjU6ZB+kFH/Iv3l3PzO0QVU=; b=mVvk80P2+1QvwN29vq68WSfpG9vlFcPXvuxd1ceVruXscfzTg2K06uG28ZzxPS2yeI qnScBSGXQFRIMKU9kFGqPtQiGN0XF7v1VqpQ8PaB409aPntIBasd72kUObpta37hGQc4 Bkthc29gejNM1beizqn9JDoTFvUrIvqyouHwe5IV5xosnXMVpqD0/X1+V3YYdhU7Rsma ghTzUagamu0DaejcIUG8+kUSjOm4weuPztnow1DxLX818jWRJxLgy7aFfygW/YtL4GoD NX6c2lr0PvwtC6xQhPasnk6tWoRR2ggU+kiu6XbIfbK54TDrFb6Yyw2LvH9wDyKVPj6F iFKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=lhc2CDeFl+CA5GFkR8PqfjU6ZB+kFH/Iv3l3PzO0QVU=; b=cOzKrauU/nDLnkR3nP7TLOjzTBUnfFZonoircslNY1At7mjOYJRimcbDbFNs5T/zln hT+L5qnFzIIfLwz6XIRY6XZ/XcB5uIuvv+U/N34Kmz/zL0byaftHGLlW2Yp8LCnQdzVR ll1fifuPtS2umlgX3LRcLZhyzTXzkC7Nvk55ijK59emLNtEXBWhHSv0ClvlY9Pc8a2F3 mUbNeosax/loVx0T7WUklfS81a4Lx4NNozsSIfw6LIfprjkfUOycBeurltTAtVWzA5Se +jz6pgkzcs7r3a4t4fJvquqGeXfH9Yq0gIzynY0SYyvzHz9kOf1CRo7LVjBo4q2gqOLy 3DxA== X-Gm-Message-State: APjAAAVjjy/YngkDj5QH4OyOGPWuXEhmGZ0rL5MdzrBSMhMfBhpv1PWH +CtC4Vd/dSZRD53kmJy05dT2ug7V X-Google-Smtp-Source: APXvYqwwc/RWuG5eBC20X8O2c5O61laDst3JqsEPsNPMVVeazwVXS6+w1hWXIbjs82mLqf9caIyENg== X-Received: by 2002:a37:4f94:: with SMTP id d142mr23114383qkb.421.1570461214603; Mon, 07 Oct 2019 08:13:34 -0700 (PDT) Received: from five.crux.rad.ainfosec.com (209-217-208-226.northland.net. [209.217.208.226]) by smtp.googlemail.com with ESMTPSA id c185sm8354313qkg.74.2019.10.07.08.13.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Oct 2019 08:13:33 -0700 (PDT) From: Nick Rosbrook To: xen-devel@lists.xenproject.org Date: Mon, 7 Oct 2019 11:13:03 -0400 Message-Id: X-Mailer: git-send-email 2.19.1 In-Reply-To: References: MIME-Version: 1.0 Subject: [Xen-devel] [PATCH 16/24] golang/xenlight: begin C to Go type marshaling X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Nick Rosbrook , Ian Jackson , kerriganb@ainfosec.com, George Dunlap , Wei Liu Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" RnJvbTogTmljayBSb3Nicm9vayA8cm9zYnJvb2tuQGFpbmZvc2VjLmNvbT4KCkltcGxlbWVudCBi YXNpYyB0eXBlIGNvbnZlcnNpb24gaW4gZnJvbUMgZnVuY3Rpb25zIHN1Y2ggYXMgc3RyaW5ncyBh bmQKaW50ZWdlciB0eXBlcy4gQWxzbywgcmVtb3ZlIGV4aXN0aW5nIHRvR28gZnVuY3Rpb25zIGZy b20geGVubGlnaHQuZ28gaW4KZmF2b3Igb2YgdGhlIG5ldyBnZW5lcmF0ZWQgZnVuY3Rpb25zLgoK U2lnbmVkLW9mZi1ieTogTmljayBSb3Nicm9vayA8cm9zYnJvb2tuQGFpbmZvc2VjLmNvbT4KLS0t CkNjOiBHZW9yZ2UgRHVubGFwIDxnZW9yZ2UuZHVubGFwQGNpdHJpeC5jb20+CkNjOiBJYW4gSmFj a3NvbiA8aWFuLmphY2tzb25AZXUuY2l0cml4LmNvbT4KQ2M6IFdlaSBMaXUgPHdsQHhlbi5vcmc+ CgogdG9vbHMvZ29sYW5nL3hlbmxpZ2h0L2dlbmdvdHlwZXMucHkgICAgICAgfCAxMjAgKysrCiB0 b29scy9nb2xhbmcveGVubGlnaHQveGVubGlnaHQuZ28gICAgICAgICB8IDExMSArLS0KIHRvb2xz L2dvbGFuZy94ZW5saWdodC94ZW5saWdodF9oZWxwZXJzLmdvIHwgOTY3ICsrKysrKysrKysrKysr KysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgMTA5OCBpbnNlcnRpb25zKCspLCAxMDAgZGVsZXRp b25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMvZ29sYW5nL3hlbmxpZ2h0L3hlbmxpZ2h0 X2hlbHBlcnMuZ28KCmRpZmYgLS1naXQgYS90b29scy9nb2xhbmcveGVubGlnaHQvZ2VuZ290eXBl cy5weSBiL3Rvb2xzL2dvbGFuZy94ZW5saWdodC9nZW5nb3R5cGVzLnB5CmluZGV4IGM4NTEzYjc5 ZTAuLjc1ZGNkMDE3MjQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2dvbGFuZy94ZW5saWdodC9nZW5nb3R5 cGVzLnB5CisrKyBiL3Rvb2xzL2dvbGFuZy94ZW5saWdodC9nZW5nb3R5cGVzLnB5CkBAIC0xOCw2 ICsxOCwxMiBAQCBidWlsdGluX3R5cGVfbmFtZXMgPSB7CiAgICAgaWRsLnVpbnQ2NC50eXBlbmFt ZTogJ3VpbnQ2NCcsCiB9CiAKKyMgU29tZSBnbyBrZXl3b3JkcyB0aGF0IGNvbmZsaWN0IHdpdGgg ZmllbGQgbmFtZXMgaW4gbGlieGwgc3RydWN0cy4KK2dvX2tleXdvcmRzID0gWyd0eXBlJywgJ2Z1 bmMnXQorCitnb19idWlsdGluX3R5cGVzID0gWydib29sJywgJ3N0cmluZycsICdpbnQnLCAnYnl0 ZScsCisgICAgICAgICAgICAgICAgICAgICd1aW50MTYnLCAndWludDMyJywgJ3VpbnQ2NCddCisK ICMgTGlzdCBvZiBzdHJpbmdzIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIHRvIGEgZmlsZQogIyBh ZnRlciBhIHN0cnVjdCBkZWZpbml0aW9uLgogdHlwZV9leHRyYXMgPSBbXQpAQCAtMTY4LDYgKzE3 NCwxMTggQEAgZGVmIHhlbmxpZ2h0X2dvbGFuZ19kZWZpbmVfdW5pb24odHkgPSBOb25lLCBzdHJ1 Y3RuYW1lID0gJycpOgogCiAgICAgcmV0dXJuIHMKIAorZGVmIHhlbmxpZ2h0X2dvbGFuZ19nZW5l cmF0ZV9oZWxwZXJzKHBhdGggPSBOb25lLCB0eXBlcyA9IE5vbmUsIGNvbW1lbnQgPSBOb25lKToK KyAgICAiIiIKKyAgICBHZW5lcmF0ZSBhIC5nbyBmaWxlICh4ZW5saWdodF9oZWxwZXJzLmdvIGJ5 IGRlZmF1bHQpCisgICAgdGhhdCBjb250YWlucyBoZWxwZXIgZnVuY3Rpb25zIGZvciBtYXJzaGFs aW5nIGJldHdlZW4KKyAgICBDIGFuZCBHbyB0eXBlcy4KKyAgICAiIiIKKyAgICBpZiBwYXRoIGlz IE5vbmU6CisgICAgICAgIHBhdGggPSAneGVubGlnaHRfaGVscGVycy5nbycKKworICAgIHdpdGgg b3BlbihwYXRoLCAndycpIGFzIGY6CisgICAgICAgIGlmIGNvbW1lbnQgaXMgbm90IE5vbmU6Cisg ICAgICAgICAgICBmLndyaXRlKGNvbW1lbnQpCisgICAgICAgIGYud3JpdGUoJ3BhY2thZ2UgeGVu bGlnaHRcbicpCisKKyAgICAgICAgIyBDZ28gcHJlYW1ibGUKKyAgICAgICAgZi53cml0ZSgnLypc bicpCisgICAgICAgIGYud3JpdGUoJyNjZ28gTERGTEFHUzogLWx4ZW5saWdodFxuJykKKyAgICAg ICAgZi53cml0ZSgnI2luY2x1ZGUgPHN0ZGxpYi5oPlxuJykKKyAgICAgICAgZi53cml0ZSgnI2lu Y2x1ZGUgPGxpYnhsLmg+XG4nKQorICAgICAgICBmLndyaXRlKCdcbicpCisKKyAgICAgICAgZi53 cml0ZSgnKi9cbmltcG9ydCAiQyJcbicpCisKKyAgICAgICAgZm9yIHR5IGluIHR5cGVzOgorICAg ICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodHksIGlkbC5TdHJ1Y3QpOgorICAgICAgICAgICAg ICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGYud3JpdGUoeGVubGlnaHRfZ29sYW5nX2RlZmlu ZV9mcm9tX0ModHkpKQorICAgICAgICAgICAgZi53cml0ZSgnXG4nKQorCisgICAgZ29fZm10KHBh dGgpCisKK2RlZiB4ZW5saWdodF9nb2xhbmdfZGVmaW5lX2Zyb21fQyh0eSA9IE5vbmUsIHR5cGVu YW1lID0gTm9uZSwgbmVzdGVkID0gRmFsc2UpOgorICAgIHMgPSAnJworCisgICAgZ290eXBlbmFt ZSA9IGN0eXBlbmFtZSA9ICcnCisKKyAgICBpZiB0eXBlbmFtZSBpcyBub3QgTm9uZToKKyAgICAg ICAgZ290eXBlbmFtZSA9IHhlbmxpZ2h0X2dvbGFuZ19mbXRfbmFtZSh0eXBlbmFtZSkKKyAgICAg ICAgY3R5cGVuYW1lICA9IHR5cGVuYW1lCisgICAgZWxzZToKKyAgICAgICAgZ290eXBlbmFtZSA9 IHhlbmxpZ2h0X2dvbGFuZ19mbXRfbmFtZSh0eS50eXBlbmFtZSkKKyAgICAgICAgY3R5cGVuYW1l ICA9IHR5LnR5cGVuYW1lCisKKyAgICBpZiBub3QgbmVzdGVkOgorICAgICAgICBzICs9ICdmdW5j ICh4ICp7fSkgZnJvbUMoeGMgKkMue30pIGVycm9yIHt7XG4nLmZvcm1hdChnb3R5cGVuYW1lLGN0 eXBlbmFtZSkKKworICAgIGZvciBmIGluIHR5LmZpZWxkczoKKyAgICAgICAgaWYgZi50eXBlLnR5 cGVuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmLnR5cGUsIGlk bC5BcnJheSk6CisgICAgICAgICAgICAgICAgIyBUT0RPCisgICAgICAgICAgICAgICAgY29udGlu dWUKKworICAgICAgICAgICAgZ290eXBlbmFtZSA9IHhlbmxpZ2h0X2dvbGFuZ19mbXRfbmFtZShm LnR5cGUudHlwZW5hbWUpCisgICAgICAgICAgICBnb2ZuYW1lICAgID0geGVubGlnaHRfZ29sYW5n X2ZtdF9uYW1lKGYubmFtZSkKKyAgICAgICAgICAgIGNmbmFtZSAgICAgPSBmLm5hbWUKKworICAg ICAgICAgICAgIyBJbiBjZ28sIEMgbmFtZXMgdGhhdCBjb25mbGljdCB3aXRoIEdvIGtleXdvcmRz IGNhbiBiZQorICAgICAgICAgICAgIyBhY2Nlc3NlZCBieSBwcmVwZW5kaW5nIGFuIHVuZGVyc2Nv cmUgdG8gdGhlIG5hbWUuCisgICAgICAgICAgICBpZiBjZm5hbWUgaW4gZ29fa2V5d29yZHM6Cisg ICAgICAgICAgICAgICAgY2ZuYW1lID0gJ18nICsgY2ZuYW1lCisKKyAgICAgICAgICAgICMgSWYg dGhpcyBpcyBuZXN0ZWQsIHdlIG5lZWQgdGhlIG91dGVyIG5hbWUgdG9vLgorICAgICAgICAgICAg aWYgbmVzdGVkIGFuZCB0eXBlbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBnb25h bWUgPSB4ZW5saWdodF9nb2xhbmdfZm10X25hbWUodHlwZW5hbWUpCisgICAgICAgICAgICAgICAg Z29uYW1lID0gJ3t9Lnt9Jy5mb3JtYXQoZ29uYW1lLCBnb2ZuYW1lKQorICAgICAgICAgICAgICAg IGNuYW1lICA9ICd7fS57fScuZm9ybWF0KHR5cGVuYW1lLCBjZm5hbWUpCisKKyAgICAgICAgICAg IGVsc2U6CisgICAgICAgICAgICAgICAgZ29uYW1lID0gZ29mbmFtZQorICAgICAgICAgICAgICAg IGNuYW1lICA9IGNmbmFtZQorCisgICAgICAgICAgICAjIFR5cGVzIHRoYXQgc2F0aXNmeSB0aGlz IGNvbmRpdGlvbiBjYW4gYmUgZWFzaWx5IGNhc3RlZCBvcgorICAgICAgICAgICAgIyBjb252ZXJ0 ZWQgdG8gYSBHbyBidWlsdGluIHR5cGUuCisgICAgICAgICAgICBpc19jYXN0YWJsZSA9IChmLnR5 cGUuanNvbl9wYXJzZV90eXBlID09ICdKU09OX0lOVEVHRVInIG9yCisgICAgICAgICAgICAgICAg ICAgICAgICAgICBpc2luc3RhbmNlKGYudHlwZSwgaWRsLkVudW1lcmF0aW9uKSBvcgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgZ290eXBlbmFtZSBpbiBnb19idWlsdGluX3R5cGVzKQorCisg ICAgICAgICAgICBpZiBpc19jYXN0YWJsZToKKyAgICAgICAgICAgICAgICAjIFVzZSB0aGUgY2dv IGhlbHBlciBmb3IgY29udmVydGluZyBDIHN0cmluZ3MuCisgICAgICAgICAgICAgICAgaWYgZ290 eXBlbmFtZSA9PSAnc3RyaW5nJzoKKyAgICAgICAgICAgICAgICAgICAgcyArPSAneC57fSA9IEMu R29TdHJpbmcoeGMue30pXG4nLmZvcm1hdChnb25hbWUsIGNuYW1lKQorICAgICAgICAgICAgICAg ICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgcyArPSAneC57fSA9IHt9KHhjLnt9KVxu Jy5mb3JtYXQoZ29uYW1lLCBnb3R5cGVuYW1lLCBjbmFtZSkKKworICAgICAgICAgICAgZWxzZToK KyAgICAgICAgICAgICAgICAjIElmIHRoZSB0eXBlIGlzIG5vdCBjYXN0YWJsZSwgd2UgbmVlZCB0 byBjYWxsIGl0cyBmcm9tQworICAgICAgICAgICAgICAgICMgZnVuY3Rpb24uCisgICAgICAgICAg ICAgICAgdmFybmFtZSA9ICd7fV97fScuZm9ybWF0KGYudHlwZS50eXBlbmFtZSxmLm5hbWUpCisg ICAgICAgICAgICAgICAgdmFybmFtZSA9IHhlbmxpZ2h0X2dvbGFuZ19mbXRfbmFtZSh2YXJuYW1l LCBleHBvcnRlZD1GYWxzZSkKKworICAgICAgICAgICAgICAgIHMgKz0gJ3ZhciB7fSB7fVxuJy5m b3JtYXQodmFybmFtZSwgZ290eXBlbmFtZSkKKyAgICAgICAgICAgICAgICBzICs9ICdpZiBlcnIg Oj0ge30uZnJvbUMoJnhjLnt9KTsnLmZvcm1hdCh2YXJuYW1lLCBjbmFtZSkKKyAgICAgICAgICAg ICAgICBzICs9ICdlcnIgIT0gbmlsIHtcbiByZXR1cm4gZXJyXG59XG4nCisgICAgICAgICAgICAg ICAgcyArPSAneC57fSA9IHt9XG4nLmZvcm1hdChnb25hbWUsIHZhcm5hbWUpCisKKyAgICAgICAg ZWxpZiBpc2luc3RhbmNlKGYudHlwZSwgaWRsLlN0cnVjdCk6CisgICAgICAgICAgICBzICs9IHhl bmxpZ2h0X2dvbGFuZ19kZWZpbmVfZnJvbV9DKGYudHlwZSwgdHlwZW5hbWU9Zi5uYW1lLCBuZXN0 ZWQ9VHJ1ZSkKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZi50eXBlLCBpZGwuS2V5ZWRVbmlv bik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNl IEV4Y2VwdGlvbigndHlwZSB7fSBub3Qgc3VwcG9ydGVkJy5mb3JtYXQoZi50eXBlKSkKKworICAg IGlmIG5vdCBuZXN0ZWQ6CisgICAgICAgIHMgKz0gJ3JldHVybiBuaWwnCisgICAgICAgIHMgKz0g J31cbicKKworICAgIHJldHVybiBzCisKIGRlZiB4ZW5saWdodF9nb2xhbmdfZm10X25hbWUobmFt ZSwgZXhwb3J0ZWQgPSBUcnVlKToKICAgICAiIiIKICAgICBUYWtlIGEgZ2l2ZW4gdHlwZSBuYW1l IGFuZCByZXR1cm4gYW4KQEAgLTIxMCwzICszMjgsNSBAQCBpZiBfX25hbWVfXyA9PSAnX19tYWlu X18nOgogCiAgICAgeGVubGlnaHRfZ29sYW5nX2dlbmVyYXRlX3R5cGVzKHR5cGVzPXR5cGVzLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50PWhlYWRlcl9jb21tZW50 KQorICAgIHhlbmxpZ2h0X2dvbGFuZ19nZW5lcmF0ZV9oZWxwZXJzKHR5cGVzPXR5cGVzLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ9aGVhZGVyX2NvbW1lbnQp CmRpZmYgLS1naXQgYS90b29scy9nb2xhbmcveGVubGlnaHQveGVubGlnaHQuZ28gYi90b29scy9n b2xhbmcveGVubGlnaHQveGVubGlnaHQuZ28KaW5kZXggZjkxYzBkMmJlMi4uYThmOTMzYzc1ZiAx MDA2NDQKLS0tIGEvdG9vbHMvZ29sYW5nL3hlbmxpZ2h0L3hlbmxpZ2h0LmdvCisrKyBiL3Rvb2xz L2dvbGFuZy94ZW5saWdodC94ZW5saWdodC5nbwpAQCAtNDMyLDQ3ICs0MzIsNiBAQCBmdW5jIChi bSAqQml0bWFwKSB0b0MoKSAoQy5saWJ4bF9iaXRtYXAsIGVycm9yKSB7CiAJcmV0dXJuIGNibSwg bmlsCiB9CiAKLWZ1bmMgKGNwaHlzICpDLmxpYnhsX3BoeXNpbmZvKSB0b0dvKCkgKHBoeXNpbmZv ICpQaHlzaW5mbykgewotCi0JcGh5c2luZm8gPSAmUGh5c2luZm97fQotCXBoeXNpbmZvLlRocmVh ZHNQZXJDb3JlID0gdWludDMyKGNwaHlzLnRocmVhZHNfcGVyX2NvcmUpCi0JcGh5c2luZm8uQ29y ZXNQZXJTb2NrZXQgPSB1aW50MzIoY3BoeXMuY29yZXNfcGVyX3NvY2tldCkKLQlwaHlzaW5mby5N YXhDcHVJZCA9IHVpbnQzMihjcGh5cy5tYXhfY3B1X2lkKQotCXBoeXNpbmZvLk5yQ3B1cyA9IHVp bnQzMihjcGh5cy5ucl9jcHVzKQotCXBoeXNpbmZvLkNwdUtoeiA9IHVpbnQzMihjcGh5cy5jcHVf a2h6KQotCXBoeXNpbmZvLlRvdGFsUGFnZXMgPSB1aW50NjQoY3BoeXMudG90YWxfcGFnZXMpCi0J cGh5c2luZm8uRnJlZVBhZ2VzID0gdWludDY0KGNwaHlzLmZyZWVfcGFnZXMpCi0JcGh5c2luZm8u U2NydWJQYWdlcyA9IHVpbnQ2NChjcGh5cy5zY3J1Yl9wYWdlcykKLQlwaHlzaW5mby5TY3J1YlBh Z2VzID0gdWludDY0KGNwaHlzLnNjcnViX3BhZ2VzKQotCXBoeXNpbmZvLlNoYXJpbmdGcmVlZFBh Z2VzID0gdWludDY0KGNwaHlzLnNoYXJpbmdfZnJlZWRfcGFnZXMpCi0JcGh5c2luZm8uU2hhcmlu Z1VzZWRGcmFtZXMgPSB1aW50NjQoY3BoeXMuc2hhcmluZ191c2VkX2ZyYW1lcykKLQlwaHlzaW5m by5Ock5vZGVzID0gdWludDMyKGNwaHlzLm5yX25vZGVzKQotCXBoeXNpbmZvLkh3Q2FwLmZyb21D KCZjcGh5cy5od19jYXApCi0JcGh5c2luZm8uQ2FwSHZtID0gYm9vbChjcGh5cy5jYXBfaHZtKQot CXBoeXNpbmZvLkNhcEh2bURpcmVjdGlvID0gYm9vbChjcGh5cy5jYXBfaHZtX2RpcmVjdGlvKQot Ci0JcmV0dXJuCi19Ci0KLWZ1bmMgKGNpbmZvICpDLmxpYnhsX3ZlcnNpb25faW5mbykgdG9Hbygp IChpbmZvICpWZXJzaW9uSW5mbykgewotCWluZm8gPSAmVmVyc2lvbkluZm97fQotCWluZm8uWGVu VmVyc2lvbk1ham9yID0gaW50KGNpbmZvLnhlbl92ZXJzaW9uX21ham9yKQotCWluZm8uWGVuVmVy c2lvbk1pbm9yID0gaW50KGNpbmZvLnhlbl92ZXJzaW9uX21pbm9yKQotCWluZm8uWGVuVmVyc2lv bkV4dHJhID0gQy5Hb1N0cmluZyhjaW5mby54ZW5fdmVyc2lvbl9leHRyYSkKLQlpbmZvLkNvbXBp bGVyID0gQy5Hb1N0cmluZyhjaW5mby5jb21waWxlcikKLQlpbmZvLkNvbXBpbGVCeSA9IEMuR29T dHJpbmcoY2luZm8uY29tcGlsZV9ieSkKLQlpbmZvLkNvbXBpbGVEb21haW4gPSBDLkdvU3RyaW5n KGNpbmZvLmNvbXBpbGVfZG9tYWluKQotCWluZm8uQ29tcGlsZURhdGUgPSBDLkdvU3RyaW5nKGNp bmZvLmNvbXBpbGVfZGF0ZSkKLQlpbmZvLkNhcGFiaWxpdGllcyA9IEMuR29TdHJpbmcoY2luZm8u Y2FwYWJpbGl0aWVzKQotCWluZm8uQ2hhbmdlc2V0ID0gQy5Hb1N0cmluZyhjaW5mby5jaGFuZ2Vz ZXQpCi0JaW5mby5WaXJ0U3RhcnQgPSB1aW50NjQoY2luZm8udmlydF9zdGFydCkKLQlpbmZvLlBh Z2VzaXplID0gaW50KGNpbmZvLnBhZ2VzaXplKQotCWluZm8uQ29tbWFuZGxpbmUgPSBDLkdvU3Ry aW5nKGNpbmZvLmNvbW1hbmRsaW5lKQotCWluZm8uQnVpbGRJZCA9IEMuR29TdHJpbmcoY2luZm8u YnVpbGRfaWQpCi0KLQlyZXR1cm4KLX0KLQogZnVuYyAoc3IgU2h1dGRvd25SZWFzb24pIFN0cmlu ZygpIChzdHIgc3RyaW5nKSB7CiAJY3N0ciA6PSBDLmxpYnhsX3NodXRkb3duX3JlYXNvbl90b19z dHJpbmcoQy5saWJ4bF9zaHV0ZG93bl9yZWFzb24oc3IpKQogCXN0ciA9IEMuR29TdHJpbmcoY3N0 cikKQEAgLTQ4NywzNCArNDQ2LDYgQEAgZnVuYyAoZHQgRG9tYWluVHlwZSkgU3RyaW5nKCkgKHN0 ciBzdHJpbmcpIHsKIAlyZXR1cm4KIH0KIAotZnVuYyAoY2RpICpDLmxpYnhsX2RvbWluZm8pIHRv R28oKSAoZGkgKkRvbWluZm8pIHsKLQotCWRpID0gJkRvbWluZm97fQotCWRpLlV1aWQuZnJvbUMo JmNkaS51dWlkKQotCWRpLkRvbWlkID0gRG9taWQoY2RpLmRvbWlkKQotCWRpLlNzaWRyZWYgPSB1 aW50MzIoY2RpLnNzaWRyZWYpCi0JZGkuU3NpZExhYmVsID0gQy5Hb1N0cmluZyhjZGkuc3NpZF9s YWJlbCkKLQlkaS5SdW5uaW5nID0gYm9vbChjZGkucnVubmluZykKLQlkaS5CbG9ja2VkID0gYm9v bChjZGkuYmxvY2tlZCkKLQlkaS5QYXVzZWQgPSBib29sKGNkaS5wYXVzZWQpCi0JZGkuU2h1dGRv d24gPSBib29sKGNkaS5zaHV0ZG93bikKLQlkaS5EeWluZyA9IGJvb2woY2RpLmR5aW5nKQotCWRp Lk5ldmVyU3RvcCA9IGJvb2woY2RpLm5ldmVyX3N0b3ApCi0JZGkuU2h1dGRvd25SZWFzb24gPSBT aHV0ZG93blJlYXNvbihjZGkuc2h1dGRvd25fcmVhc29uKQotCWRpLk91dHN0YW5kaW5nTWVta2Ig PSB1aW50NjQoY2RpLm91dHN0YW5kaW5nX21lbWtiKQotCWRpLkN1cnJlbnRNZW1rYiA9IHVpbnQ2 NChjZGkuY3VycmVudF9tZW1rYikKLQlkaS5TaGFyZWRNZW1rYiA9IHVpbnQ2NChjZGkuc2hhcmVk X21lbWtiKQotCWRpLlBhZ2VkTWVta2IgPSB1aW50NjQoY2RpLnBhZ2VkX21lbWtiKQotCWRpLk1h eE1lbWtiID0gdWludDY0KGNkaS5tYXhfbWVta2IpCi0JZGkuQ3B1VGltZSA9IHVpbnQ2NChjZGku Y3B1X3RpbWUpCi0JZGkuVmNwdU1heElkID0gdWludDMyKGNkaS52Y3B1X21heF9pZCkKLQlkaS5W Y3B1T25saW5lID0gdWludDMyKGNkaS52Y3B1X29ubGluZSkKLQlkaS5DcHVwb29sID0gdWludDMy KGNkaS5jcHVwb29sKQotCWRpLkRvbWFpblR5cGUgPSBEb21haW5UeXBlKGNkaS5kb21haW5fdHlw ZSkKLQotCXJldHVybgotfQotCiAvLyBjb25zdCBjaGFyICpsaWJ4bF9zY2hlZHVsZXJfdG9fc3Ry aW5nKGxpYnhsX3NjaGVkdWxlciBwKTsKIGZ1bmMgKHMgU2NoZWR1bGVyKSBTdHJpbmcoKSBzdHJp bmcgewogCWNzIDo9IEMubGlieGxfc2NoZWR1bGVyX3RvX3N0cmluZyhDLmxpYnhsX3NjaGVkdWxl cihzKSkKQEAgLTU0NiwxNiArNDc3LDYgQEAgZnVuYyBTY2hlZHVsZXJGcm9tU3RyaW5nKG5hbWUg c3RyaW5nKSAocyBTY2hlZHVsZXIsIGVyciBlcnJvcikgewogCXJldHVybgogfQogCi1mdW5jIChj Y2kgQy5saWJ4bF9jcHVwb29saW5mbykgdG9HbygpIChnY2kgQ3B1cG9vbGluZm8pIHsKLQlnY2ku UG9vbGlkID0gdWludDMyKGNjaS5wb29saWQpCi0JZ2NpLlBvb2xOYW1lID0gQy5Hb1N0cmluZyhj Y2kucG9vbF9uYW1lKQotCWdjaS5TY2hlZCA9IFNjaGVkdWxlcihjY2kuc2NoZWQpCi0JZ2NpLk5E b20gPSB1aW50MzIoY2NpLm5fZG9tKQotCWdjaS5DcHVtYXAuZnJvbUMoJmNjaS5jcHVtYXApCi0K LQlyZXR1cm4KLX0KLQogLy8gbGlieGxfY3B1cG9vbGluZm8gKiBsaWJ4bF9saXN0X2NwdXBvb2wo bGlieGxfY3R4KiwgaW50ICpuYl9wb29sX291dCk7CiAvLyB2b2lkIGxpYnhsX2NwdXBvb2xpbmZv X2xpc3RfZnJlZShsaWJ4bF9jcHVwb29saW5mbyAqbGlzdCwgaW50IG5iX3Bvb2wpOwogZnVuYyAo Q3R4ICpDb250ZXh0KSBMaXN0Q3B1cG9vbCgpIChsaXN0IFtdQ3B1cG9vbGluZm8pIHsKQEAgLTU3 Nyw3ICs0OTgsOCBAQCBmdW5jIChDdHggKkNvbnRleHQpIExpc3RDcHVwb29sKCkgKGxpc3QgW11D cHVwb29saW5mbykgewogCS8vIE1hZ2ljCiAJY3B1cG9vbExpc3RTbGljZSA6PSAoKlsxIDw8IDMw XUMubGlieGxfY3B1cG9vbGluZm8pKHVuc2FmZS5Qb2ludGVyKGNfY3B1cG9vbF9saXN0KSlbOm5i UG9vbDpuYlBvb2xdCiAJZm9yIGkgOj0gcmFuZ2UgY3B1cG9vbExpc3RTbGljZSB7Ci0JCWluZm8g Oj0gY3B1cG9vbExpc3RTbGljZVtpXS50b0dvKCkKKwkJdmFyIGluZm8gQ3B1cG9vbGluZm8KKwkJ XyA9IGluZm8uZnJvbUMoJmNwdXBvb2xMaXN0U2xpY2VbaV0pCiAJCWxpc3QgPSBhcHBlbmQobGlz dCwgaW5mbykKIAl9CiAKQEAgLTYwMCw3ICs1MjIsNyBAQCBmdW5jIChDdHggKkNvbnRleHQpIENw dXBvb2xJbmZvKFBvb2xpZCB1aW50MzIpIChwb29sIENwdXBvb2xpbmZvKSB7CiAJfQogCWRlZmVy IEMubGlieGxfY3B1cG9vbGluZm9fZGlzcG9zZSgmY19jcHVwb29sKQogCi0JcG9vbCA9IGNfY3B1 cG9vbC50b0dvKCkKKwlfID0gcG9vbC5mcm9tQygmY19jcHVwb29sKQogCiAJcmV0dXJuCiB9CkBA IC0xMDkxLDcgKzEwMTMsNyBAQCBmdW5jIChDdHggKkNvbnRleHQpIEdldFBoeXNpbmZvKCkgKHBo eXNpbmZvICpQaHlzaW5mbywgZXJyIGVycm9yKSB7CiAJCWVyciA9IEVycm9yKHJldCkKIAkJcmV0 dXJuCiAJfQotCXBoeXNpbmZvID0gY3BoeXMudG9HbygpCisJZXJyID0gcGh5c2luZm8uZnJvbUMo JmNwaHlzKQogCiAJcmV0dXJuCiB9CkBAIC0xMTA3LDcgKzEwMjksNyBAQCBmdW5jIChDdHggKkNv bnRleHQpIEdldFZlcnNpb25JbmZvKCkgKGluZm8gKlZlcnNpb25JbmZvLCBlcnIgZXJyb3IpIHsK IAogCWNpbmZvID0gQy5saWJ4bF9nZXRfdmVyc2lvbl9pbmZvKEN0eC5jdHgpCiAKLQlpbmZvID0g Y2luZm8udG9HbygpCisJZXJyID0gaW5mby5mcm9tQyhjaW5mbykKIAogCXJldHVybgogfQpAQCAt MTEyOSw3ICsxMDUxLDcgQEAgZnVuYyAoQ3R4ICpDb250ZXh0KSBEb21haW5JbmZvKElkIERvbWlk KSAoZGkgKkRvbWluZm8sIGVyciBlcnJvcikgewogCQlyZXR1cm4KIAl9CiAKLQlkaSA9IGNkaS50 b0dvKCkKKwllcnIgPSBkaS5mcm9tQygmY2RpKQogCiAJcmV0dXJuCiB9CkBAIC0xMjExLDI2ICsx MTMzLDE0IEBAIGZ1bmMgKEN0eCAqQ29udGV4dCkgTGlzdERvbWFpbigpIChnbGlzdCBbXURvbWlu Zm8pIHsKIAogCWdzbGljZSA6PSAoKlsxIDw8IDMwXUMubGlieGxfZG9taW5mbykodW5zYWZlLlBv aW50ZXIoY2xpc3QpKVs6bmJEb21haW46bmJEb21haW5dCiAJZm9yIGkgOj0gcmFuZ2UgZ3NsaWNl IHsKLQkJaW5mbyA6PSBnc2xpY2VbaV0udG9HbygpCi0JCWdsaXN0ID0gYXBwZW5kKGdsaXN0LCAq aW5mbykKKwkJdmFyIGluZm8gRG9taW5mbworCQlfID0gaW5mby5mcm9tQygmZ3NsaWNlW2ldKQor CQlnbGlzdCA9IGFwcGVuZChnbGlzdCwgaW5mbykKIAl9CiAKIAlyZXR1cm4KIH0KIAotZnVuYyAo Y3ZjaSBDLmxpYnhsX3ZjcHVpbmZvKSB0b0dvKCkgKGd2Y2kgVmNwdWluZm8pIHsKLQlndmNpLlZj cHVpZCA9IHVpbnQzMihjdmNpLnZjcHVpZCkKLQlndmNpLkNwdSA9IHVpbnQzMihjdmNpLmNwdSkK LQlndmNpLk9ubGluZSA9IGJvb2woY3ZjaS5vbmxpbmUpCi0JZ3ZjaS5CbG9ja2VkID0gYm9vbChj dmNpLmJsb2NrZWQpCi0JZ3ZjaS5SdW5uaW5nID0gYm9vbChjdmNpLnJ1bm5pbmcpCi0JZ3ZjaS5W Y3B1VGltZSA9IHVpbnQ2NChjdmNpLnZjcHVfdGltZSkKLQlndmNpLkNwdW1hcC5mcm9tQygmY3Zj aS5jcHVtYXApCi0JZ3ZjaS5DcHVtYXBTb2Z0LmZyb21DKCZjdmNpLmNwdW1hcF9zb2Z0KQotCi0J cmV0dXJuCi19Ci0KIC8vbGlieGxfdmNwdWluZm8gKmxpYnhsX2xpc3RfdmNwdShsaWJ4bF9jdHgg KmN0eCwgdWludDMyX3QgZG9taWQsCiAvLwkJCQlpbnQgKm5iX3ZjcHUsIGludCAqbnJfY3B1c19v dXQpOwogLy92b2lkIGxpYnhsX3ZjcHVpbmZvX2xpc3RfZnJlZShsaWJ4bF92Y3B1aW5mbyAqLCBp bnQgbnJfdmNwdXMpOwpAQCAtMTI1Miw3ICsxMTYyLDggQEAgZnVuYyAoQ3R4ICpDb250ZXh0KSBM aXN0VmNwdShpZCBEb21pZCkgKGdsaXN0IFtdVmNwdWluZm8pIHsKIAogCWdzbGljZSA6PSAoKlsx IDw8IDMwXUMubGlieGxfdmNwdWluZm8pKHVuc2FmZS5Qb2ludGVyKGNsaXN0KSlbOm5iVmNwdTpu YlZjcHVdCiAJZm9yIGkgOj0gcmFuZ2UgZ3NsaWNlIHsKLQkJaW5mbyA6PSBnc2xpY2VbaV0udG9H bygpCisJCXZhciBpbmZvIFZjcHVpbmZvCisJCV8gPSBpbmZvLmZyb21DKCZnc2xpY2VbaV0pCiAJ CWdsaXN0ID0gYXBwZW5kKGdsaXN0LCBpbmZvKQogCX0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvZ29s YW5nL3hlbmxpZ2h0L3hlbmxpZ2h0X2hlbHBlcnMuZ28gYi90b29scy9nb2xhbmcveGVubGlnaHQv eGVubGlnaHRfaGVscGVycy5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw Li40ZWNlOTBkYzZiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZ29sYW5nL3hlbmxpZ2h0L3hl bmxpZ2h0X2hlbHBlcnMuZ28KQEAgLTAsMCArMSw5NjcgQEAKKy8vIERPIE5PVCBFRElULgorLy8K Ky8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnk6CisvLyBnZW5nb3R5cGVzLnB5IC4uLy4uL2xp YnhsL2xpYnhsX3R5cGVzLmlkbAorLy8KK3BhY2thZ2UgeGVubGlnaHQKKworLyoKKyNjZ28gTERG TEFHUzogLWx4ZW5saWdodAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpYnhsLmg+ CisKKyovCitpbXBvcnQgIkMiCisKK2Z1bmMgKHggKklvcG9ydFJhbmdlKSBmcm9tQyh4YyAqQy5s aWJ4bF9pb3BvcnRfcmFuZ2UpIGVycm9yIHsKKwl4LkZpcnN0ID0gdWludDMyKHhjLmZpcnN0KQor CXguTnVtYmVyID0gdWludDMyKHhjLm51bWJlcikKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHgg KklvbWVtUmFuZ2UpIGZyb21DKHhjICpDLmxpYnhsX2lvbWVtX3JhbmdlKSBlcnJvciB7CisJeC5T dGFydCA9IHVpbnQ2NCh4Yy5zdGFydCkKKwl4Lk51bWJlciA9IHVpbnQ2NCh4Yy5udW1iZXIpCisJ eC5HZm4gPSB1aW50NjQoeGMuZ2ZuKQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqVmdhSW50 ZXJmYWNlSW5mbykgZnJvbUMoeGMgKkMubGlieGxfdmdhX2ludGVyZmFjZV9pbmZvKSBlcnJvciB7 CisJeC5LaW5kID0gVmdhSW50ZXJmYWNlVHlwZSh4Yy5raW5kKQorCXJldHVybiBuaWwKK30KKwor ZnVuYyAoeCAqVm5jSW5mbykgZnJvbUMoeGMgKkMubGlieGxfdm5jX2luZm8pIGVycm9yIHsKKwl2 YXIgZGVmYm9vbEVuYWJsZSBEZWZib29sCisJaWYgZXJyIDo9IGRlZmJvb2xFbmFibGUuZnJvbUMo JnhjLmVuYWJsZSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguRW5hYmxlID0g ZGVmYm9vbEVuYWJsZQorCXguTGlzdGVuID0gQy5Hb1N0cmluZyh4Yy5saXN0ZW4pCisJeC5QYXNz d2QgPSBDLkdvU3RyaW5nKHhjLnBhc3N3ZCkKKwl4LkRpc3BsYXkgPSBpbnQoeGMuZGlzcGxheSkK Kwl2YXIgZGVmYm9vbEZpbmR1bnVzZWQgRGVmYm9vbAorCWlmIGVyciA6PSBkZWZib29sRmluZHVu dXNlZC5mcm9tQygmeGMuZmluZHVudXNlZCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJ fQorCXguRmluZHVudXNlZCA9IGRlZmJvb2xGaW5kdW51c2VkCisJcmV0dXJuIG5pbAorfQorCitm dW5jICh4ICpTcGljZUluZm8pIGZyb21DKHhjICpDLmxpYnhsX3NwaWNlX2luZm8pIGVycm9yIHsK Kwl2YXIgZGVmYm9vbEVuYWJsZSBEZWZib29sCisJaWYgZXJyIDo9IGRlZmJvb2xFbmFibGUuZnJv bUMoJnhjLmVuYWJsZSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguRW5hYmxl ID0gZGVmYm9vbEVuYWJsZQorCXguUG9ydCA9IGludCh4Yy5wb3J0KQorCXguVGxzUG9ydCA9IGlu dCh4Yy50bHNfcG9ydCkKKwl4Lkhvc3QgPSBDLkdvU3RyaW5nKHhjLmhvc3QpCisJdmFyIGRlZmJv b2xEaXNhYmxlVGlja2V0aW5nIERlZmJvb2wKKwlpZiBlcnIgOj0gZGVmYm9vbERpc2FibGVUaWNr ZXRpbmcuZnJvbUMoJnhjLmRpc2FibGVfdGlja2V0aW5nKTsgZXJyICE9IG5pbCB7CisJCXJldHVy biBlcnIKKwl9CisJeC5EaXNhYmxlVGlja2V0aW5nID0gZGVmYm9vbERpc2FibGVUaWNrZXRpbmcK Kwl4LlBhc3N3ZCA9IEMuR29TdHJpbmcoeGMucGFzc3dkKQorCXZhciBkZWZib29sQWdlbnRNb3Vz ZSBEZWZib29sCisJaWYgZXJyIDo9IGRlZmJvb2xBZ2VudE1vdXNlLmZyb21DKCZ4Yy5hZ2VudF9t b3VzZSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguQWdlbnRNb3VzZSA9IGRl ZmJvb2xBZ2VudE1vdXNlCisJdmFyIGRlZmJvb2xWZGFnZW50IERlZmJvb2wKKwlpZiBlcnIgOj0g ZGVmYm9vbFZkYWdlbnQuZnJvbUMoJnhjLnZkYWdlbnQpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJu IGVycgorCX0KKwl4LlZkYWdlbnQgPSBkZWZib29sVmRhZ2VudAorCXZhciBkZWZib29sQ2xpcGJv YXJkU2hhcmluZyBEZWZib29sCisJaWYgZXJyIDo9IGRlZmJvb2xDbGlwYm9hcmRTaGFyaW5nLmZy b21DKCZ4Yy5jbGlwYm9hcmRfc2hhcmluZyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJ fQorCXguQ2xpcGJvYXJkU2hhcmluZyA9IGRlZmJvb2xDbGlwYm9hcmRTaGFyaW5nCisJeC5Vc2Jy ZWRpcmVjdGlvbiA9IGludCh4Yy51c2JyZWRpcmVjdGlvbikKKwl4LkltYWdlQ29tcHJlc3Npb24g PSBDLkdvU3RyaW5nKHhjLmltYWdlX2NvbXByZXNzaW9uKQorCXguU3RyZWFtaW5nVmlkZW8gPSBD LkdvU3RyaW5nKHhjLnN0cmVhbWluZ192aWRlbykKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHgg KlNkbEluZm8pIGZyb21DKHhjICpDLmxpYnhsX3NkbF9pbmZvKSBlcnJvciB7CisJdmFyIGRlZmJv b2xFbmFibGUgRGVmYm9vbAorCWlmIGVyciA6PSBkZWZib29sRW5hYmxlLmZyb21DKCZ4Yy5lbmFi bGUpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwl4LkVuYWJsZSA9IGRlZmJvb2xF bmFibGUKKwl2YXIgZGVmYm9vbE9wZW5nbCBEZWZib29sCisJaWYgZXJyIDo9IGRlZmJvb2xPcGVu Z2wuZnJvbUMoJnhjLm9wZW5nbCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXgu T3BlbmdsID0gZGVmYm9vbE9wZW5nbAorCXguRGlzcGxheSA9IEMuR29TdHJpbmcoeGMuZGlzcGxh eSkKKwl4LlhhdXRob3JpdHkgPSBDLkdvU3RyaW5nKHhjLnhhdXRob3JpdHkpCisJcmV0dXJuIG5p bAorfQorCitmdW5jICh4ICpEb21pbmZvKSBmcm9tQyh4YyAqQy5saWJ4bF9kb21pbmZvKSBlcnJv ciB7CisJdmFyIHV1aWRVdWlkIFV1aWQKKwlpZiBlcnIgOj0gdXVpZFV1aWQuZnJvbUMoJnhjLnV1 aWQpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwl4LlV1aWQgPSB1dWlkVXVpZAor CXguRG9taWQgPSBEb21pZCh4Yy5kb21pZCkKKwl4LlNzaWRyZWYgPSB1aW50MzIoeGMuc3NpZHJl ZikKKwl4LlNzaWRMYWJlbCA9IEMuR29TdHJpbmcoeGMuc3NpZF9sYWJlbCkKKwl4LlJ1bm5pbmcg PSBib29sKHhjLnJ1bm5pbmcpCisJeC5CbG9ja2VkID0gYm9vbCh4Yy5ibG9ja2VkKQorCXguUGF1 c2VkID0gYm9vbCh4Yy5wYXVzZWQpCisJeC5TaHV0ZG93biA9IGJvb2woeGMuc2h1dGRvd24pCisJ eC5EeWluZyA9IGJvb2woeGMuZHlpbmcpCisJeC5OZXZlclN0b3AgPSBib29sKHhjLm5ldmVyX3N0 b3ApCisJeC5TaHV0ZG93blJlYXNvbiA9IFNodXRkb3duUmVhc29uKHhjLnNodXRkb3duX3JlYXNv bikKKwl4Lk91dHN0YW5kaW5nTWVta2IgPSB1aW50NjQoeGMub3V0c3RhbmRpbmdfbWVta2IpCisJ eC5DdXJyZW50TWVta2IgPSB1aW50NjQoeGMuY3VycmVudF9tZW1rYikKKwl4LlNoYXJlZE1lbWti ID0gdWludDY0KHhjLnNoYXJlZF9tZW1rYikKKwl4LlBhZ2VkTWVta2IgPSB1aW50NjQoeGMucGFn ZWRfbWVta2IpCisJeC5NYXhNZW1rYiA9IHVpbnQ2NCh4Yy5tYXhfbWVta2IpCisJeC5DcHVUaW1l ID0gdWludDY0KHhjLmNwdV90aW1lKQorCXguVmNwdU1heElkID0gdWludDMyKHhjLnZjcHVfbWF4 X2lkKQorCXguVmNwdU9ubGluZSA9IHVpbnQzMih4Yy52Y3B1X29ubGluZSkKKwl4LkNwdXBvb2wg PSB1aW50MzIoeGMuY3B1cG9vbCkKKwl4LkRvbWFpblR5cGUgPSBEb21haW5UeXBlKHhjLmRvbWFp bl90eXBlKQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqQ3B1cG9vbGluZm8pIGZyb21DKHhj ICpDLmxpYnhsX2NwdXBvb2xpbmZvKSBlcnJvciB7CisJeC5Qb29saWQgPSB1aW50MzIoeGMucG9v bGlkKQorCXguUG9vbE5hbWUgPSBDLkdvU3RyaW5nKHhjLnBvb2xfbmFtZSkKKwl4LlNjaGVkID0g U2NoZWR1bGVyKHhjLnNjaGVkKQorCXguTkRvbSA9IHVpbnQzMih4Yy5uX2RvbSkKKwl2YXIgYml0 bWFwQ3B1bWFwIEJpdG1hcAorCWlmIGVyciA6PSBiaXRtYXBDcHVtYXAuZnJvbUMoJnhjLmNwdW1h cCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguQ3B1bWFwID0gYml0bWFwQ3B1 bWFwCisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpDaGFubmVsaW5mbykgZnJvbUMoeGMgKkMu bGlieGxfY2hhbm5lbGluZm8pIGVycm9yIHsKKwl4LkJhY2tlbmQgPSBDLkdvU3RyaW5nKHhjLmJh Y2tlbmQpCisJeC5CYWNrZW5kSWQgPSB1aW50MzIoeGMuYmFja2VuZF9pZCkKKwl4LkZyb250ZW5k ID0gQy5Hb1N0cmluZyh4Yy5mcm9udGVuZCkKKwl4LkZyb250ZW5kSWQgPSB1aW50MzIoeGMuZnJv bnRlbmRfaWQpCisJeC5EZXZpZCA9IERldmlkKHhjLmRldmlkKQorCXguU3RhdGUgPSBpbnQoeGMu c3RhdGUpCisJeC5FdnRjaCA9IGludCh4Yy5ldnRjaCkKKwl4LlJyZWYgPSBpbnQoeGMucnJlZikK KwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKlZtaW5mbykgZnJvbUMoeGMgKkMubGlieGxfdm1p bmZvKSBlcnJvciB7CisJdmFyIHV1aWRVdWlkIFV1aWQKKwlpZiBlcnIgOj0gdXVpZFV1aWQuZnJv bUMoJnhjLnV1aWQpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwl4LlV1aWQgPSB1 dWlkVXVpZAorCXguRG9taWQgPSBEb21pZCh4Yy5kb21pZCkKKwlyZXR1cm4gbmlsCit9CisKK2Z1 bmMgKHggKlZlcnNpb25JbmZvKSBmcm9tQyh4YyAqQy5saWJ4bF92ZXJzaW9uX2luZm8pIGVycm9y IHsKKwl4LlhlblZlcnNpb25NYWpvciA9IGludCh4Yy54ZW5fdmVyc2lvbl9tYWpvcikKKwl4Llhl blZlcnNpb25NaW5vciA9IGludCh4Yy54ZW5fdmVyc2lvbl9taW5vcikKKwl4LlhlblZlcnNpb25F eHRyYSA9IEMuR29TdHJpbmcoeGMueGVuX3ZlcnNpb25fZXh0cmEpCisJeC5Db21waWxlciA9IEMu R29TdHJpbmcoeGMuY29tcGlsZXIpCisJeC5Db21waWxlQnkgPSBDLkdvU3RyaW5nKHhjLmNvbXBp bGVfYnkpCisJeC5Db21waWxlRG9tYWluID0gQy5Hb1N0cmluZyh4Yy5jb21waWxlX2RvbWFpbikK Kwl4LkNvbXBpbGVEYXRlID0gQy5Hb1N0cmluZyh4Yy5jb21waWxlX2RhdGUpCisJeC5DYXBhYmls aXRpZXMgPSBDLkdvU3RyaW5nKHhjLmNhcGFiaWxpdGllcykKKwl4LkNoYW5nZXNldCA9IEMuR29T dHJpbmcoeGMuY2hhbmdlc2V0KQorCXguVmlydFN0YXJ0ID0gdWludDY0KHhjLnZpcnRfc3RhcnQp CisJeC5QYWdlc2l6ZSA9IGludCh4Yy5wYWdlc2l6ZSkKKwl4LkNvbW1hbmRsaW5lID0gQy5Hb1N0 cmluZyh4Yy5jb21tYW5kbGluZSkKKwl4LkJ1aWxkSWQgPSBDLkdvU3RyaW5nKHhjLmJ1aWxkX2lk KQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqRG9tYWluQ3JlYXRlSW5mbykgZnJvbUMoeGMg KkMubGlieGxfZG9tYWluX2NyZWF0ZV9pbmZvKSBlcnJvciB7CisJeC5UeXBlID0gRG9tYWluVHlw ZSh4Yy5fdHlwZSkKKwl2YXIgZGVmYm9vbEhhcCBEZWZib29sCisJaWYgZXJyIDo9IGRlZmJvb2xI YXAuZnJvbUMoJnhjLmhhcCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguSGFw ID0gZGVmYm9vbEhhcAorCXZhciBkZWZib29sT29zIERlZmJvb2wKKwlpZiBlcnIgOj0gZGVmYm9v bE9vcy5mcm9tQygmeGMub29zKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJeC5P b3MgPSBkZWZib29sT29zCisJeC5Tc2lkcmVmID0gdWludDMyKHhjLnNzaWRyZWYpCisJeC5Tc2lk TGFiZWwgPSBDLkdvU3RyaW5nKHhjLnNzaWRfbGFiZWwpCisJeC5OYW1lID0gQy5Hb1N0cmluZyh4 Yy5uYW1lKQorCXZhciB1dWlkVXVpZCBVdWlkCisJaWYgZXJyIDo9IHV1aWRVdWlkLmZyb21DKCZ4 Yy51dWlkKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJeC5VdWlkID0gdXVpZFV1 aWQKKwl2YXIga2V5VmFsdWVMaXN0WHNkYXRhIEtleVZhbHVlTGlzdAorCWlmIGVyciA6PSBrZXlW YWx1ZUxpc3RYc2RhdGEuZnJvbUMoJnhjLnhzZGF0YSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4g ZXJyCisJfQorCXguWHNkYXRhID0ga2V5VmFsdWVMaXN0WHNkYXRhCisJdmFyIGtleVZhbHVlTGlz dFBsYXRmb3JtZGF0YSBLZXlWYWx1ZUxpc3QKKwlpZiBlcnIgOj0ga2V5VmFsdWVMaXN0UGxhdGZv cm1kYXRhLmZyb21DKCZ4Yy5wbGF0Zm9ybWRhdGEpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVy cgorCX0KKwl4LlBsYXRmb3JtZGF0YSA9IGtleVZhbHVlTGlzdFBsYXRmb3JtZGF0YQorCXguUG9v bGlkID0gdWludDMyKHhjLnBvb2xpZCkKKwl4LlBvb2xOYW1lID0gQy5Hb1N0cmluZyh4Yy5wb29s X25hbWUpCisJdmFyIGRlZmJvb2xSdW5Ib3RwbHVnU2NyaXB0cyBEZWZib29sCisJaWYgZXJyIDo9 IGRlZmJvb2xSdW5Ib3RwbHVnU2NyaXB0cy5mcm9tQygmeGMucnVuX2hvdHBsdWdfc2NyaXB0cyk7 IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguUnVuSG90cGx1Z1NjcmlwdHMgPSBk ZWZib29sUnVuSG90cGx1Z1NjcmlwdHMKKwl2YXIgZGVmYm9vbERyaXZlckRvbWFpbiBEZWZib29s CisJaWYgZXJyIDo9IGRlZmJvb2xEcml2ZXJEb21haW4uZnJvbUMoJnhjLmRyaXZlcl9kb21haW4p OyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwl4LkRyaXZlckRvbWFpbiA9IGRlZmJv b2xEcml2ZXJEb21haW4KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkRvbWFpblJlc3RvcmVQ YXJhbXMpIGZyb21DKHhjICpDLmxpYnhsX2RvbWFpbl9yZXN0b3JlX3BhcmFtcykgZXJyb3Igewor CXguQ2hlY2twb2ludGVkU3RyZWFtID0gaW50KHhjLmNoZWNrcG9pbnRlZF9zdHJlYW0pCisJeC5T dHJlYW1WZXJzaW9uID0gdWludDMyKHhjLnN0cmVhbV92ZXJzaW9uKQorCXguQ29sb1Byb3h5U2Ny aXB0ID0gQy5Hb1N0cmluZyh4Yy5jb2xvX3Byb3h5X3NjcmlwdCkKKwl2YXIgZGVmYm9vbFVzZXJz cGFjZUNvbG9Qcm94eSBEZWZib29sCisJaWYgZXJyIDo9IGRlZmJvb2xVc2Vyc3BhY2VDb2xvUHJv eHkuZnJvbUMoJnhjLnVzZXJzcGFjZV9jb2xvX3Byb3h5KTsgZXJyICE9IG5pbCB7CisJCXJldHVy biBlcnIKKwl9CisJeC5Vc2Vyc3BhY2VDb2xvUHJveHkgPSBkZWZib29sVXNlcnNwYWNlQ29sb1By b3h5CisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpTY2hlZFBhcmFtcykgZnJvbUMoeGMgKkMu bGlieGxfc2NoZWRfcGFyYW1zKSBlcnJvciB7CisJeC5WY3B1aWQgPSBpbnQoeGMudmNwdWlkKQor CXguV2VpZ2h0ID0gaW50KHhjLndlaWdodCkKKwl4LkNhcCA9IGludCh4Yy5jYXApCisJeC5QZXJp b2QgPSBpbnQoeGMucGVyaW9kKQorCXguRXh0cmF0aW1lID0gaW50KHhjLmV4dHJhdGltZSkKKwl4 LkJ1ZGdldCA9IGludCh4Yy5idWRnZXQpCisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpWY3B1 U2NoZWRQYXJhbXMpIGZyb21DKHhjICpDLmxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zKSBlcnJvciB7 CisJeC5TY2hlZCA9IFNjaGVkdWxlcih4Yy5zY2hlZCkKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMg KHggKkRvbWFpblNjaGVkUGFyYW1zKSBmcm9tQyh4YyAqQy5saWJ4bF9kb21haW5fc2NoZWRfcGFy YW1zKSBlcnJvciB7CisJeC5TY2hlZCA9IFNjaGVkdWxlcih4Yy5zY2hlZCkKKwl4LldlaWdodCA9 IGludCh4Yy53ZWlnaHQpCisJeC5DYXAgPSBpbnQoeGMuY2FwKQorCXguUGVyaW9kID0gaW50KHhj LnBlcmlvZCkKKwl4LkJ1ZGdldCA9IGludCh4Yy5idWRnZXQpCisJeC5FeHRyYXRpbWUgPSBpbnQo eGMuZXh0cmF0aW1lKQorCXguU2xpY2UgPSBpbnQoeGMuc2xpY2UpCisJeC5MYXRlbmN5ID0gaW50 KHhjLmxhdGVuY3kpCisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpWbm9kZUluZm8pIGZyb21D KHhjICpDLmxpYnhsX3Zub2RlX2luZm8pIGVycm9yIHsKKwl4Lk1lbWtiID0gdWludDY0KHhjLm1l bWtiKQorCXguUG5vZGUgPSB1aW50MzIoeGMucG5vZGUpCisJdmFyIGJpdG1hcFZjcHVzIEJpdG1h cAorCWlmIGVyciA6PSBiaXRtYXBWY3B1cy5mcm9tQygmeGMudmNwdXMpOyBlcnIgIT0gbmlsIHsK KwkJcmV0dXJuIGVycgorCX0KKwl4LlZjcHVzID0gYml0bWFwVmNwdXMKKwlyZXR1cm4gbmlsCit9 CisKK2Z1bmMgKHggKlJkbVJlc2VydmUpIGZyb21DKHhjICpDLmxpYnhsX3JkbV9yZXNlcnZlKSBl cnJvciB7CisJeC5TdHJhdGVneSA9IFJkbVJlc2VydmVTdHJhdGVneSh4Yy5zdHJhdGVneSkKKwl4 LlBvbGljeSA9IFJkbVJlc2VydmVQb2xpY3koeGMucG9saWN5KQorCXJldHVybiBuaWwKK30KKwor ZnVuYyAoeCAqRG9tYWluQnVpbGRJbmZvKSBmcm9tQyh4YyAqQy5saWJ4bF9kb21haW5fYnVpbGRf aW5mbykgZXJyb3IgeworCXguTWF4VmNwdXMgPSBpbnQoeGMubWF4X3ZjcHVzKQorCXZhciBiaXRt YXBBdmFpbFZjcHVzIEJpdG1hcAorCWlmIGVyciA6PSBiaXRtYXBBdmFpbFZjcHVzLmZyb21DKCZ4 Yy5hdmFpbF92Y3B1cyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguQXZhaWxW Y3B1cyA9IGJpdG1hcEF2YWlsVmNwdXMKKwl2YXIgYml0bWFwQ3B1bWFwIEJpdG1hcAorCWlmIGVy ciA6PSBiaXRtYXBDcHVtYXAuZnJvbUMoJnhjLmNwdW1hcCk7IGVyciAhPSBuaWwgeworCQlyZXR1 cm4gZXJyCisJfQorCXguQ3B1bWFwID0gYml0bWFwQ3B1bWFwCisJdmFyIGJpdG1hcE5vZGVtYXAg Qml0bWFwCisJaWYgZXJyIDo9IGJpdG1hcE5vZGVtYXAuZnJvbUMoJnhjLm5vZGVtYXApOyBlcnIg IT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwl4Lk5vZGVtYXAgPSBiaXRtYXBOb2RlbWFwCisJ dmFyIGRlZmJvb2xOdW1hUGxhY2VtZW50IERlZmJvb2wKKwlpZiBlcnIgOj0gZGVmYm9vbE51bWFQ bGFjZW1lbnQuZnJvbUMoJnhjLm51bWFfcGxhY2VtZW50KTsgZXJyICE9IG5pbCB7CisJCXJldHVy biBlcnIKKwl9CisJeC5OdW1hUGxhY2VtZW50ID0gZGVmYm9vbE51bWFQbGFjZW1lbnQKKwl4LlRz Y01vZGUgPSBUc2NNb2RlKHhjLnRzY19tb2RlKQorCXguTWF4TWVta2IgPSB1aW50NjQoeGMubWF4 X21lbWtiKQorCXguVGFyZ2V0TWVta2IgPSB1aW50NjQoeGMudGFyZ2V0X21lbWtiKQorCXguVmlk ZW9NZW1rYiA9IHVpbnQ2NCh4Yy52aWRlb19tZW1rYikKKwl4LlNoYWRvd01lbWtiID0gdWludDY0 KHhjLnNoYWRvd19tZW1rYikKKwl4LlJ0Y1RpbWVvZmZzZXQgPSB1aW50MzIoeGMucnRjX3RpbWVv ZmZzZXQpCisJeC5FeGVjU3NpZHJlZiA9IHVpbnQzMih4Yy5leGVjX3NzaWRyZWYpCisJeC5FeGVj U3NpZExhYmVsID0gQy5Hb1N0cmluZyh4Yy5leGVjX3NzaWRfbGFiZWwpCisJdmFyIGRlZmJvb2xM b2NhbHRpbWUgRGVmYm9vbAorCWlmIGVyciA6PSBkZWZib29sTG9jYWx0aW1lLmZyb21DKCZ4Yy5s b2NhbHRpbWUpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwl4LkxvY2FsdGltZSA9 IGRlZmJvb2xMb2NhbHRpbWUKKwl2YXIgZGVmYm9vbERpc2FibGVNaWdyYXRlIERlZmJvb2wKKwlp ZiBlcnIgOj0gZGVmYm9vbERpc2FibGVNaWdyYXRlLmZyb21DKCZ4Yy5kaXNhYmxlX21pZ3JhdGUp OyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwl4LkRpc2FibGVNaWdyYXRlID0gZGVm Ym9vbERpc2FibGVNaWdyYXRlCisJdmFyIGNwdWlkUG9saWN5TGlzdENwdWlkIENwdWlkUG9saWN5 TGlzdAorCWlmIGVyciA6PSBjcHVpZFBvbGljeUxpc3RDcHVpZC5mcm9tQygmeGMuY3B1aWQpOyBl cnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwl4LkNwdWlkID0gY3B1aWRQb2xpY3lMaXN0 Q3B1aWQKKwl4LkJsa2RldlN0YXJ0ID0gQy5Hb1N0cmluZyh4Yy5ibGtkZXZfc3RhcnQpCisJeC5N YXhHcmFudEZyYW1lcyA9IHVpbnQzMih4Yy5tYXhfZ3JhbnRfZnJhbWVzKQorCXguTWF4TWFwdHJh Y2tGcmFtZXMgPSB1aW50MzIoeGMubWF4X21hcHRyYWNrX2ZyYW1lcykKKwl4LkRldmljZU1vZGVs VmVyc2lvbiA9IERldmljZU1vZGVsVmVyc2lvbih4Yy5kZXZpY2VfbW9kZWxfdmVyc2lvbikKKwl2 YXIgZGVmYm9vbERldmljZU1vZGVsU3R1YmRvbWFpbiBEZWZib29sCisJaWYgZXJyIDo9IGRlZmJv b2xEZXZpY2VNb2RlbFN0dWJkb21haW4uZnJvbUMoJnhjLmRldmljZV9tb2RlbF9zdHViZG9tYWlu KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJeC5EZXZpY2VNb2RlbFN0dWJkb21h aW4gPSBkZWZib29sRGV2aWNlTW9kZWxTdHViZG9tYWluCisJeC5EZXZpY2VNb2RlbCA9IEMuR29T dHJpbmcoeGMuZGV2aWNlX21vZGVsKQorCXguRGV2aWNlTW9kZWxTc2lkcmVmID0gdWludDMyKHhj LmRldmljZV9tb2RlbF9zc2lkcmVmKQorCXguRGV2aWNlTW9kZWxTc2lkTGFiZWwgPSBDLkdvU3Ry aW5nKHhjLmRldmljZV9tb2RlbF9zc2lkX2xhYmVsKQorCXguRGV2aWNlTW9kZWxVc2VyID0gQy5H b1N0cmluZyh4Yy5kZXZpY2VfbW9kZWxfdXNlcikKKwl2YXIgc3RyaW5nTGlzdEV4dHJhIFN0cmlu Z0xpc3QKKwlpZiBlcnIgOj0gc3RyaW5nTGlzdEV4dHJhLmZyb21DKCZ4Yy5leHRyYSk7IGVyciAh PSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguRXh0cmEgPSBzdHJpbmdMaXN0RXh0cmEKKwl2 YXIgc3RyaW5nTGlzdEV4dHJhUHYgU3RyaW5nTGlzdAorCWlmIGVyciA6PSBzdHJpbmdMaXN0RXh0 cmFQdi5mcm9tQygmeGMuZXh0cmFfcHYpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0K Kwl4LkV4dHJhUHYgPSBzdHJpbmdMaXN0RXh0cmFQdgorCXZhciBzdHJpbmdMaXN0RXh0cmFIdm0g U3RyaW5nTGlzdAorCWlmIGVyciA6PSBzdHJpbmdMaXN0RXh0cmFIdm0uZnJvbUMoJnhjLmV4dHJh X2h2bSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguRXh0cmFIdm0gPSBzdHJp bmdMaXN0RXh0cmFIdm0KKwl2YXIgZG9tYWluU2NoZWRQYXJhbXNTY2hlZFBhcmFtcyBEb21haW5T Y2hlZFBhcmFtcworCWlmIGVyciA6PSBkb21haW5TY2hlZFBhcmFtc1NjaGVkUGFyYW1zLmZyb21D KCZ4Yy5zY2hlZF9wYXJhbXMpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwl4LlNj aGVkUGFyYW1zID0gZG9tYWluU2NoZWRQYXJhbXNTY2hlZFBhcmFtcworCXZhciBkZWZib29sQ2xh aW1Nb2RlIERlZmJvb2wKKwlpZiBlcnIgOj0gZGVmYm9vbENsYWltTW9kZS5mcm9tQygmeGMuY2xh aW1fbW9kZSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguQ2xhaW1Nb2RlID0g ZGVmYm9vbENsYWltTW9kZQorCXguRXZlbnRDaGFubmVscyA9IHVpbnQzMih4Yy5ldmVudF9jaGFu bmVscykKKwl4Lktlcm5lbCA9IEMuR29TdHJpbmcoeGMua2VybmVsKQorCXguQ21kbGluZSA9IEMu R29TdHJpbmcoeGMuY21kbGluZSkKKwl4LlJhbWRpc2sgPSBDLkdvU3RyaW5nKHhjLnJhbWRpc2sp CisJeC5EZXZpY2VUcmVlID0gQy5Hb1N0cmluZyh4Yy5kZXZpY2VfdHJlZSkKKwl2YXIgZGVmYm9v bEFjcGkgRGVmYm9vbAorCWlmIGVyciA6PSBkZWZib29sQWNwaS5mcm9tQygmeGMuYWNwaSk7IGVy ciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguQWNwaSA9IGRlZmJvb2xBY3BpCisJeC5C b290bG9hZGVyID0gQy5Hb1N0cmluZyh4Yy5ib290bG9hZGVyKQorCXZhciBzdHJpbmdMaXN0Qm9v dGxvYWRlckFyZ3MgU3RyaW5nTGlzdAorCWlmIGVyciA6PSBzdHJpbmdMaXN0Qm9vdGxvYWRlckFy Z3MuZnJvbUMoJnhjLmJvb3Rsb2FkZXJfYXJncyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJy CisJfQorCXguQm9vdGxvYWRlckFyZ3MgPSBzdHJpbmdMaXN0Qm9vdGxvYWRlckFyZ3MKKwl4LlRp bWVyTW9kZSA9IFRpbWVyTW9kZSh4Yy50aW1lcl9tb2RlKQorCXZhciBkZWZib29sTmVzdGVkSHZt IERlZmJvb2wKKwlpZiBlcnIgOj0gZGVmYm9vbE5lc3RlZEh2bS5mcm9tQygmeGMubmVzdGVkX2h2 bSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguTmVzdGVkSHZtID0gZGVmYm9v bE5lc3RlZEh2bQorCXZhciBkZWZib29sQXBpYyBEZWZib29sCisJaWYgZXJyIDo9IGRlZmJvb2xB cGljLmZyb21DKCZ4Yy5hcGljKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJeC5B cGljID0gZGVmYm9vbEFwaWMKKwl2YXIgZGVmYm9vbERtUmVzdHJpY3QgRGVmYm9vbAorCWlmIGVy ciA6PSBkZWZib29sRG1SZXN0cmljdC5mcm9tQygmeGMuZG1fcmVzdHJpY3QpOyBlcnIgIT0gbmls IHsKKwkJcmV0dXJuIGVycgorCX0KKwl4LkRtUmVzdHJpY3QgPSBkZWZib29sRG1SZXN0cmljdAor CXguVGVlID0gVGVlVHlwZSh4Yy50ZWUpCisJeC5BcmNoQXJtLkdpY1ZlcnNpb24gPSBHaWNWZXJz aW9uKHhjLmFyY2hfYXJtLmdpY192ZXJzaW9uKQorCXguQXJjaEFybS5WdWFydCA9IFZ1YXJ0VHlw ZSh4Yy5hcmNoX2FybS52dWFydCkKKwl4LkFsdHAyTSA9IEFsdHAyTU1vZGUoeGMuYWx0cDJtKQor CXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqRGV2aWNlVmZiKSBmcm9tQyh4YyAqQy5saWJ4bF9k ZXZpY2VfdmZiKSBlcnJvciB7CisJeC5CYWNrZW5kRG9taWQgPSBEb21pZCh4Yy5iYWNrZW5kX2Rv bWlkKQorCXguQmFja2VuZERvbW5hbWUgPSBDLkdvU3RyaW5nKHhjLmJhY2tlbmRfZG9tbmFtZSkK Kwl4LkRldmlkID0gRGV2aWQoeGMuZGV2aWQpCisJdmFyIHZuY0luZm9WbmMgVm5jSW5mbworCWlm IGVyciA6PSB2bmNJbmZvVm5jLmZyb21DKCZ4Yy52bmMpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJu IGVycgorCX0KKwl4LlZuYyA9IHZuY0luZm9WbmMKKwl2YXIgc2RsSW5mb1NkbCBTZGxJbmZvCisJ aWYgZXJyIDo9IHNkbEluZm9TZGwuZnJvbUMoJnhjLnNkbCk7IGVyciAhPSBuaWwgeworCQlyZXR1 cm4gZXJyCisJfQorCXguU2RsID0gc2RsSW5mb1NkbAorCXguS2V5bWFwID0gQy5Hb1N0cmluZyh4 Yy5rZXltYXApCisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpEZXZpY2VWa2IpIGZyb21DKHhj ICpDLmxpYnhsX2RldmljZV92a2IpIGVycm9yIHsKKwl4LkJhY2tlbmREb21pZCA9IERvbWlkKHhj LmJhY2tlbmRfZG9taWQpCisJeC5CYWNrZW5kRG9tbmFtZSA9IEMuR29TdHJpbmcoeGMuYmFja2Vu ZF9kb21uYW1lKQorCXguRGV2aWQgPSBEZXZpZCh4Yy5kZXZpZCkKKwl4LkJhY2tlbmRUeXBlID0g VmtiQmFja2VuZCh4Yy5iYWNrZW5kX3R5cGUpCisJeC5VbmlxdWVJZCA9IEMuR29TdHJpbmcoeGMu dW5pcXVlX2lkKQorCXguRmVhdHVyZURpc2FibGVLZXlib2FyZCA9IGJvb2woeGMuZmVhdHVyZV9k aXNhYmxlX2tleWJvYXJkKQorCXguRmVhdHVyZURpc2FibGVQb2ludGVyID0gYm9vbCh4Yy5mZWF0 dXJlX2Rpc2FibGVfcG9pbnRlcikKKwl4LkZlYXR1cmVBYnNQb2ludGVyID0gYm9vbCh4Yy5mZWF0 dXJlX2Fic19wb2ludGVyKQorCXguRmVhdHVyZVJhd1BvaW50ZXIgPSBib29sKHhjLmZlYXR1cmVf cmF3X3BvaW50ZXIpCisJeC5GZWF0dXJlTXVsdGlUb3VjaCA9IGJvb2woeGMuZmVhdHVyZV9tdWx0 aV90b3VjaCkKKwl4LldpZHRoID0gdWludDMyKHhjLndpZHRoKQorCXguSGVpZ2h0ID0gdWludDMy KHhjLmhlaWdodCkKKwl4Lk11bHRpVG91Y2hXaWR0aCA9IHVpbnQzMih4Yy5tdWx0aV90b3VjaF93 aWR0aCkKKwl4Lk11bHRpVG91Y2hIZWlnaHQgPSB1aW50MzIoeGMubXVsdGlfdG91Y2hfaGVpZ2h0 KQorCXguTXVsdGlUb3VjaE51bUNvbnRhY3RzID0gdWludDMyKHhjLm11bHRpX3RvdWNoX251bV9j b250YWN0cykKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkRldmljZURpc2spIGZyb21DKHhj ICpDLmxpYnhsX2RldmljZV9kaXNrKSBlcnJvciB7CisJeC5CYWNrZW5kRG9taWQgPSBEb21pZCh4 Yy5iYWNrZW5kX2RvbWlkKQorCXguQmFja2VuZERvbW5hbWUgPSBDLkdvU3RyaW5nKHhjLmJhY2tl bmRfZG9tbmFtZSkKKwl4LlBkZXZQYXRoID0gQy5Hb1N0cmluZyh4Yy5wZGV2X3BhdGgpCisJeC5W ZGV2ID0gQy5Hb1N0cmluZyh4Yy52ZGV2KQorCXguQmFja2VuZCA9IERpc2tCYWNrZW5kKHhjLmJh Y2tlbmQpCisJeC5Gb3JtYXQgPSBEaXNrRm9ybWF0KHhjLmZvcm1hdCkKKwl4LlNjcmlwdCA9IEMu R29TdHJpbmcoeGMuc2NyaXB0KQorCXguUmVtb3ZhYmxlID0gaW50KHhjLnJlbW92YWJsZSkKKwl4 LlJlYWR3cml0ZSA9IGludCh4Yy5yZWFkd3JpdGUpCisJeC5Jc0Nkcm9tID0gaW50KHhjLmlzX2Nk cm9tKQorCXguRGlyZWN0SW9TYWZlID0gYm9vbCh4Yy5kaXJlY3RfaW9fc2FmZSkKKwl2YXIgZGVm Ym9vbERpc2NhcmRFbmFibGUgRGVmYm9vbAorCWlmIGVyciA6PSBkZWZib29sRGlzY2FyZEVuYWJs ZS5mcm9tQygmeGMuZGlzY2FyZF9lbmFibGUpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgor CX0KKwl4LkRpc2NhcmRFbmFibGUgPSBkZWZib29sRGlzY2FyZEVuYWJsZQorCXZhciBkZWZib29s Q29sb0VuYWJsZSBEZWZib29sCisJaWYgZXJyIDo9IGRlZmJvb2xDb2xvRW5hYmxlLmZyb21DKCZ4 Yy5jb2xvX2VuYWJsZSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguQ29sb0Vu YWJsZSA9IGRlZmJvb2xDb2xvRW5hYmxlCisJdmFyIGRlZmJvb2xDb2xvUmVzdG9yZUVuYWJsZSBE ZWZib29sCisJaWYgZXJyIDo9IGRlZmJvb2xDb2xvUmVzdG9yZUVuYWJsZS5mcm9tQygmeGMuY29s b19yZXN0b3JlX2VuYWJsZSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguQ29s b1Jlc3RvcmVFbmFibGUgPSBkZWZib29sQ29sb1Jlc3RvcmVFbmFibGUKKwl4LkNvbG9Ib3N0ID0g Qy5Hb1N0cmluZyh4Yy5jb2xvX2hvc3QpCisJeC5Db2xvUG9ydCA9IGludCh4Yy5jb2xvX3BvcnQp CisJeC5Db2xvRXhwb3J0ID0gQy5Hb1N0cmluZyh4Yy5jb2xvX2V4cG9ydCkKKwl4LkFjdGl2ZURp c2sgPSBDLkdvU3RyaW5nKHhjLmFjdGl2ZV9kaXNrKQorCXguSGlkZGVuRGlzayA9IEMuR29TdHJp bmcoeGMuaGlkZGVuX2Rpc2spCisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpEZXZpY2VOaWMp IGZyb21DKHhjICpDLmxpYnhsX2RldmljZV9uaWMpIGVycm9yIHsKKwl4LkJhY2tlbmREb21pZCA9 IERvbWlkKHhjLmJhY2tlbmRfZG9taWQpCisJeC5CYWNrZW5kRG9tbmFtZSA9IEMuR29TdHJpbmco eGMuYmFja2VuZF9kb21uYW1lKQorCXguRGV2aWQgPSBEZXZpZCh4Yy5kZXZpZCkKKwl4Lk10dSA9 IGludCh4Yy5tdHUpCisJeC5Nb2RlbCA9IEMuR29TdHJpbmcoeGMubW9kZWwpCisJdmFyIG1hY01h YyBNYWMKKwlpZiBlcnIgOj0gbWFjTWFjLmZyb21DKCZ4Yy5tYWMpOyBlcnIgIT0gbmlsIHsKKwkJ cmV0dXJuIGVycgorCX0KKwl4Lk1hYyA9IG1hY01hYworCXguSXAgPSBDLkdvU3RyaW5nKHhjLmlw KQorCXguQnJpZGdlID0gQy5Hb1N0cmluZyh4Yy5icmlkZ2UpCisJeC5JZm5hbWUgPSBDLkdvU3Ry aW5nKHhjLmlmbmFtZSkKKwl4LlNjcmlwdCA9IEMuR29TdHJpbmcoeGMuc2NyaXB0KQorCXguTmlj dHlwZSA9IE5pY1R5cGUoeGMubmljdHlwZSkKKwl4LlJhdGVCeXRlc1BlckludGVydmFsID0gdWlu dDY0KHhjLnJhdGVfYnl0ZXNfcGVyX2ludGVydmFsKQorCXguUmF0ZUludGVydmFsVXNlY3MgPSB1 aW50MzIoeGMucmF0ZV9pbnRlcnZhbF91c2VjcykKKwl4LkdhdGV3YXlkZXYgPSBDLkdvU3RyaW5n KHhjLmdhdGV3YXlkZXYpCisJeC5Db2xvZnRGb3J3YXJkZGV2ID0gQy5Hb1N0cmluZyh4Yy5jb2xv ZnRfZm9yd2FyZGRldikKKwl4LkNvbG9Tb2NrTWlycm9ySWQgPSBDLkdvU3RyaW5nKHhjLmNvbG9f c29ja19taXJyb3JfaWQpCisJeC5Db2xvU29ja01pcnJvcklwID0gQy5Hb1N0cmluZyh4Yy5jb2xv X3NvY2tfbWlycm9yX2lwKQorCXguQ29sb1NvY2tNaXJyb3JQb3J0ID0gQy5Hb1N0cmluZyh4Yy5j b2xvX3NvY2tfbWlycm9yX3BvcnQpCisJeC5Db2xvU29ja0NvbXBhcmVQcmlJbklkID0gQy5Hb1N0 cmluZyh4Yy5jb2xvX3NvY2tfY29tcGFyZV9wcmlfaW5faWQpCisJeC5Db2xvU29ja0NvbXBhcmVQ cmlJbklwID0gQy5Hb1N0cmluZyh4Yy5jb2xvX3NvY2tfY29tcGFyZV9wcmlfaW5faXApCisJeC5D b2xvU29ja0NvbXBhcmVQcmlJblBvcnQgPSBDLkdvU3RyaW5nKHhjLmNvbG9fc29ja19jb21wYXJl X3ByaV9pbl9wb3J0KQorCXguQ29sb1NvY2tDb21wYXJlU2VjSW5JZCA9IEMuR29TdHJpbmcoeGMu Y29sb19zb2NrX2NvbXBhcmVfc2VjX2luX2lkKQorCXguQ29sb1NvY2tDb21wYXJlU2VjSW5JcCA9 IEMuR29TdHJpbmcoeGMuY29sb19zb2NrX2NvbXBhcmVfc2VjX2luX2lwKQorCXguQ29sb1NvY2tD b21wYXJlU2VjSW5Qb3J0ID0gQy5Hb1N0cmluZyh4Yy5jb2xvX3NvY2tfY29tcGFyZV9zZWNfaW5f cG9ydCkKKwl4LkNvbG9Tb2NrQ29tcGFyZU5vdGlmeUlkID0gQy5Hb1N0cmluZyh4Yy5jb2xvX3Nv Y2tfY29tcGFyZV9ub3RpZnlfaWQpCisJeC5Db2xvU29ja0NvbXBhcmVOb3RpZnlJcCA9IEMuR29T dHJpbmcoeGMuY29sb19zb2NrX2NvbXBhcmVfbm90aWZ5X2lwKQorCXguQ29sb1NvY2tDb21wYXJl Tm90aWZ5UG9ydCA9IEMuR29TdHJpbmcoeGMuY29sb19zb2NrX2NvbXBhcmVfbm90aWZ5X3BvcnQp CisJeC5Db2xvU29ja1JlZGlyZWN0b3IwSWQgPSBDLkdvU3RyaW5nKHhjLmNvbG9fc29ja19yZWRp cmVjdG9yMF9pZCkKKwl4LkNvbG9Tb2NrUmVkaXJlY3RvcjBJcCA9IEMuR29TdHJpbmcoeGMuY29s b19zb2NrX3JlZGlyZWN0b3IwX2lwKQorCXguQ29sb1NvY2tSZWRpcmVjdG9yMFBvcnQgPSBDLkdv U3RyaW5nKHhjLmNvbG9fc29ja19yZWRpcmVjdG9yMF9wb3J0KQorCXguQ29sb1NvY2tSZWRpcmVj dG9yMUlkID0gQy5Hb1N0cmluZyh4Yy5jb2xvX3NvY2tfcmVkaXJlY3RvcjFfaWQpCisJeC5Db2xv U29ja1JlZGlyZWN0b3IxSXAgPSBDLkdvU3RyaW5nKHhjLmNvbG9fc29ja19yZWRpcmVjdG9yMV9p cCkKKwl4LkNvbG9Tb2NrUmVkaXJlY3RvcjFQb3J0ID0gQy5Hb1N0cmluZyh4Yy5jb2xvX3NvY2tf cmVkaXJlY3RvcjFfcG9ydCkKKwl4LkNvbG9Tb2NrUmVkaXJlY3RvcjJJZCA9IEMuR29TdHJpbmco eGMuY29sb19zb2NrX3JlZGlyZWN0b3IyX2lkKQorCXguQ29sb1NvY2tSZWRpcmVjdG9yMklwID0g Qy5Hb1N0cmluZyh4Yy5jb2xvX3NvY2tfcmVkaXJlY3RvcjJfaXApCisJeC5Db2xvU29ja1JlZGly ZWN0b3IyUG9ydCA9IEMuR29TdHJpbmcoeGMuY29sb19zb2NrX3JlZGlyZWN0b3IyX3BvcnQpCisJ eC5Db2xvRmlsdGVyTWlycm9yUXVldWUgPSBDLkdvU3RyaW5nKHhjLmNvbG9fZmlsdGVyX21pcnJv cl9xdWV1ZSkKKwl4LkNvbG9GaWx0ZXJNaXJyb3JPdXRkZXYgPSBDLkdvU3RyaW5nKHhjLmNvbG9f ZmlsdGVyX21pcnJvcl9vdXRkZXYpCisJeC5Db2xvRmlsdGVyUmVkaXJlY3RvcjBRdWV1ZSA9IEMu R29TdHJpbmcoeGMuY29sb19maWx0ZXJfcmVkaXJlY3RvcjBfcXVldWUpCisJeC5Db2xvRmlsdGVy UmVkaXJlY3RvcjBJbmRldiA9IEMuR29TdHJpbmcoeGMuY29sb19maWx0ZXJfcmVkaXJlY3RvcjBf aW5kZXYpCisJeC5Db2xvRmlsdGVyUmVkaXJlY3RvcjBPdXRkZXYgPSBDLkdvU3RyaW5nKHhjLmNv bG9fZmlsdGVyX3JlZGlyZWN0b3IwX291dGRldikKKwl4LkNvbG9GaWx0ZXJSZWRpcmVjdG9yMVF1 ZXVlID0gQy5Hb1N0cmluZyh4Yy5jb2xvX2ZpbHRlcl9yZWRpcmVjdG9yMV9xdWV1ZSkKKwl4LkNv bG9GaWx0ZXJSZWRpcmVjdG9yMUluZGV2ID0gQy5Hb1N0cmluZyh4Yy5jb2xvX2ZpbHRlcl9yZWRp cmVjdG9yMV9pbmRldikKKwl4LkNvbG9GaWx0ZXJSZWRpcmVjdG9yMU91dGRldiA9IEMuR29TdHJp bmcoeGMuY29sb19maWx0ZXJfcmVkaXJlY3RvcjFfb3V0ZGV2KQorCXguQ29sb0NvbXBhcmVQcmlJ biA9IEMuR29TdHJpbmcoeGMuY29sb19jb21wYXJlX3ByaV9pbikKKwl4LkNvbG9Db21wYXJlU2Vj SW4gPSBDLkdvU3RyaW5nKHhjLmNvbG9fY29tcGFyZV9zZWNfaW4pCisJeC5Db2xvQ29tcGFyZU91 dCA9IEMuR29TdHJpbmcoeGMuY29sb19jb21wYXJlX291dCkKKwl4LkNvbG9Db21wYXJlTm90aWZ5 RGV2ID0gQy5Hb1N0cmluZyh4Yy5jb2xvX2NvbXBhcmVfbm90aWZ5X2RldikKKwl4LkNvbG9Tb2Nr U2VjUmVkaXJlY3RvcjBJZCA9IEMuR29TdHJpbmcoeGMuY29sb19zb2NrX3NlY19yZWRpcmVjdG9y MF9pZCkKKwl4LkNvbG9Tb2NrU2VjUmVkaXJlY3RvcjBJcCA9IEMuR29TdHJpbmcoeGMuY29sb19z b2NrX3NlY19yZWRpcmVjdG9yMF9pcCkKKwl4LkNvbG9Tb2NrU2VjUmVkaXJlY3RvcjBQb3J0ID0g Qy5Hb1N0cmluZyh4Yy5jb2xvX3NvY2tfc2VjX3JlZGlyZWN0b3IwX3BvcnQpCisJeC5Db2xvU29j a1NlY1JlZGlyZWN0b3IxSWQgPSBDLkdvU3RyaW5nKHhjLmNvbG9fc29ja19zZWNfcmVkaXJlY3Rv cjFfaWQpCisJeC5Db2xvU29ja1NlY1JlZGlyZWN0b3IxSXAgPSBDLkdvU3RyaW5nKHhjLmNvbG9f c29ja19zZWNfcmVkaXJlY3RvcjFfaXApCisJeC5Db2xvU29ja1NlY1JlZGlyZWN0b3IxUG9ydCA9 IEMuR29TdHJpbmcoeGMuY29sb19zb2NrX3NlY19yZWRpcmVjdG9yMV9wb3J0KQorCXguQ29sb0Zp bHRlclNlY1JlZGlyZWN0b3IwUXVldWUgPSBDLkdvU3RyaW5nKHhjLmNvbG9fZmlsdGVyX3NlY19y ZWRpcmVjdG9yMF9xdWV1ZSkKKwl4LkNvbG9GaWx0ZXJTZWNSZWRpcmVjdG9yMEluZGV2ID0gQy5H b1N0cmluZyh4Yy5jb2xvX2ZpbHRlcl9zZWNfcmVkaXJlY3RvcjBfaW5kZXYpCisJeC5Db2xvRmls dGVyU2VjUmVkaXJlY3RvcjBPdXRkZXYgPSBDLkdvU3RyaW5nKHhjLmNvbG9fZmlsdGVyX3NlY19y ZWRpcmVjdG9yMF9vdXRkZXYpCisJeC5Db2xvRmlsdGVyU2VjUmVkaXJlY3RvcjFRdWV1ZSA9IEMu R29TdHJpbmcoeGMuY29sb19maWx0ZXJfc2VjX3JlZGlyZWN0b3IxX3F1ZXVlKQorCXguQ29sb0Zp bHRlclNlY1JlZGlyZWN0b3IxSW5kZXYgPSBDLkdvU3RyaW5nKHhjLmNvbG9fZmlsdGVyX3NlY19y ZWRpcmVjdG9yMV9pbmRldikKKwl4LkNvbG9GaWx0ZXJTZWNSZWRpcmVjdG9yMU91dGRldiA9IEMu R29TdHJpbmcoeGMuY29sb19maWx0ZXJfc2VjX3JlZGlyZWN0b3IxX291dGRldikKKwl4LkNvbG9G aWx0ZXJTZWNSZXdyaXRlcjBRdWV1ZSA9IEMuR29TdHJpbmcoeGMuY29sb19maWx0ZXJfc2VjX3Jl d3JpdGVyMF9xdWV1ZSkKKwl4LkNvbG9DaGVja3BvaW50SG9zdCA9IEMuR29TdHJpbmcoeGMuY29s b19jaGVja3BvaW50X2hvc3QpCisJeC5Db2xvQ2hlY2twb2ludFBvcnQgPSBDLkdvU3RyaW5nKHhj LmNvbG9fY2hlY2twb2ludF9wb3J0KQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqRGV2aWNl UGNpKSBmcm9tQyh4YyAqQy5saWJ4bF9kZXZpY2VfcGNpKSBlcnJvciB7CisJeC5GdW5jID0gYnl0 ZSh4Yy5fZnVuYykKKwl4LkRldiA9IGJ5dGUoeGMuZGV2KQorCXguQnVzID0gYnl0ZSh4Yy5idXMp CisJeC5Eb21haW4gPSBpbnQoeGMuZG9tYWluKQorCXguVmRldmZuID0gdWludDMyKHhjLnZkZXZm bikKKwl4LlZmdW5jTWFzayA9IHVpbnQzMih4Yy52ZnVuY19tYXNrKQorCXguTXNpdHJhbnNsYXRl ID0gYm9vbCh4Yy5tc2l0cmFuc2xhdGUpCisJeC5Qb3dlck1nbXQgPSBib29sKHhjLnBvd2VyX21n bXQpCisJeC5QZXJtaXNzaXZlID0gYm9vbCh4Yy5wZXJtaXNzaXZlKQorCXguU2VpemUgPSBib29s KHhjLnNlaXplKQorCXguUmRtUG9saWN5ID0gUmRtUmVzZXJ2ZVBvbGljeSh4Yy5yZG1fcG9saWN5 KQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqRGV2aWNlUmRtKSBmcm9tQyh4YyAqQy5saWJ4 bF9kZXZpY2VfcmRtKSBlcnJvciB7CisJeC5TdGFydCA9IHVpbnQ2NCh4Yy5zdGFydCkKKwl4LlNp emUgPSB1aW50NjQoeGMuc2l6ZSkKKwl4LlBvbGljeSA9IFJkbVJlc2VydmVQb2xpY3koeGMucG9s aWN5KQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqRGV2aWNlVXNiY3RybCkgZnJvbUMoeGMg KkMubGlieGxfZGV2aWNlX3VzYmN0cmwpIGVycm9yIHsKKwl4LlR5cGUgPSBVc2JjdHJsVHlwZSh4 Yy5fdHlwZSkKKwl4LkRldmlkID0gRGV2aWQoeGMuZGV2aWQpCisJeC5WZXJzaW9uID0gaW50KHhj LnZlcnNpb24pCisJeC5Qb3J0cyA9IGludCh4Yy5wb3J0cykKKwl4LkJhY2tlbmREb21pZCA9IERv bWlkKHhjLmJhY2tlbmRfZG9taWQpCisJeC5CYWNrZW5kRG9tbmFtZSA9IEMuR29TdHJpbmcoeGMu YmFja2VuZF9kb21uYW1lKQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqRGV2aWNlVXNiZGV2 KSBmcm9tQyh4YyAqQy5saWJ4bF9kZXZpY2VfdXNiZGV2KSBlcnJvciB7CisJeC5DdHJsID0gRGV2 aWQoeGMuY3RybCkKKwl4LlBvcnQgPSBpbnQoeGMucG9ydCkKKwlyZXR1cm4gbmlsCit9CisKK2Z1 bmMgKHggKkRldmljZUR0ZGV2KSBmcm9tQyh4YyAqQy5saWJ4bF9kZXZpY2VfZHRkZXYpIGVycm9y IHsKKwl4LlBhdGggPSBDLkdvU3RyaW5nKHhjLnBhdGgpCisJcmV0dXJuIG5pbAorfQorCitmdW5j ICh4ICpEZXZpY2VWdHBtKSBmcm9tQyh4YyAqQy5saWJ4bF9kZXZpY2VfdnRwbSkgZXJyb3Igewor CXguQmFja2VuZERvbWlkID0gRG9taWQoeGMuYmFja2VuZF9kb21pZCkKKwl4LkJhY2tlbmREb21u YW1lID0gQy5Hb1N0cmluZyh4Yy5iYWNrZW5kX2RvbW5hbWUpCisJeC5EZXZpZCA9IERldmlkKHhj LmRldmlkKQorCXZhciB1dWlkVXVpZCBVdWlkCisJaWYgZXJyIDo9IHV1aWRVdWlkLmZyb21DKCZ4 Yy51dWlkKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJeC5VdWlkID0gdXVpZFV1 aWQKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkRldmljZVA5KSBmcm9tQyh4YyAqQy5saWJ4 bF9kZXZpY2VfcDkpIGVycm9yIHsKKwl4LkJhY2tlbmREb21pZCA9IERvbWlkKHhjLmJhY2tlbmRf ZG9taWQpCisJeC5CYWNrZW5kRG9tbmFtZSA9IEMuR29TdHJpbmcoeGMuYmFja2VuZF9kb21uYW1l KQorCXguVGFnID0gQy5Hb1N0cmluZyh4Yy50YWcpCisJeC5QYXRoID0gQy5Hb1N0cmluZyh4Yy5w YXRoKQorCXguU2VjdXJpdHlNb2RlbCA9IEMuR29TdHJpbmcoeGMuc2VjdXJpdHlfbW9kZWwpCisJ eC5EZXZpZCA9IERldmlkKHhjLmRldmlkKQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqRGV2 aWNlUHZjYWxsc2lmKSBmcm9tQyh4YyAqQy5saWJ4bF9kZXZpY2VfcHZjYWxsc2lmKSBlcnJvciB7 CisJeC5CYWNrZW5kRG9taWQgPSBEb21pZCh4Yy5iYWNrZW5kX2RvbWlkKQorCXguQmFja2VuZERv bW5hbWUgPSBDLkdvU3RyaW5nKHhjLmJhY2tlbmRfZG9tbmFtZSkKKwl4LkRldmlkID0gRGV2aWQo eGMuZGV2aWQpCisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpEZXZpY2VDaGFubmVsKSBmcm9t Qyh4YyAqQy5saWJ4bF9kZXZpY2VfY2hhbm5lbCkgZXJyb3IgeworCXguQmFja2VuZERvbWlkID0g RG9taWQoeGMuYmFja2VuZF9kb21pZCkKKwl4LkJhY2tlbmREb21uYW1lID0gQy5Hb1N0cmluZyh4 Yy5iYWNrZW5kX2RvbW5hbWUpCisJeC5EZXZpZCA9IERldmlkKHhjLmRldmlkKQorCXguTmFtZSA9 IEMuR29TdHJpbmcoeGMubmFtZSkKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkNvbm5lY3Rv clBhcmFtKSBmcm9tQyh4YyAqQy5saWJ4bF9jb25uZWN0b3JfcGFyYW0pIGVycm9yIHsKKwl4LlVu aXF1ZUlkID0gQy5Hb1N0cmluZyh4Yy51bmlxdWVfaWQpCisJeC5XaWR0aCA9IHVpbnQzMih4Yy53 aWR0aCkKKwl4LkhlaWdodCA9IHVpbnQzMih4Yy5oZWlnaHQpCisJcmV0dXJuIG5pbAorfQorCitm dW5jICh4ICpEZXZpY2VWZGlzcGwpIGZyb21DKHhjICpDLmxpYnhsX2RldmljZV92ZGlzcGwpIGVy cm9yIHsKKwl4LkJhY2tlbmREb21pZCA9IERvbWlkKHhjLmJhY2tlbmRfZG9taWQpCisJeC5CYWNr ZW5kRG9tbmFtZSA9IEMuR29TdHJpbmcoeGMuYmFja2VuZF9kb21uYW1lKQorCXguRGV2aWQgPSBE ZXZpZCh4Yy5kZXZpZCkKKwl4LkJlQWxsb2MgPSBib29sKHhjLmJlX2FsbG9jKQorCXJldHVybiBu aWwKK30KKworZnVuYyAoeCAqVnNuZFBhcmFtcykgZnJvbUMoeGMgKkMubGlieGxfdnNuZF9wYXJh bXMpIGVycm9yIHsKKwl4LkNoYW5uZWxzTWluID0gdWludDMyKHhjLmNoYW5uZWxzX21pbikKKwl4 LkNoYW5uZWxzTWF4ID0gdWludDMyKHhjLmNoYW5uZWxzX21heCkKKwl4LkJ1ZmZlclNpemUgPSB1 aW50MzIoeGMuYnVmZmVyX3NpemUpCisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpWc25kU3Ry ZWFtKSBmcm9tQyh4YyAqQy5saWJ4bF92c25kX3N0cmVhbSkgZXJyb3IgeworCXguVW5pcXVlSWQg PSBDLkdvU3RyaW5nKHhjLnVuaXF1ZV9pZCkKKwl4LlR5cGUgPSBWc25kU3RyZWFtVHlwZSh4Yy5f dHlwZSkKKwl2YXIgdnNuZFBhcmFtc1BhcmFtcyBWc25kUGFyYW1zCisJaWYgZXJyIDo9IHZzbmRQ YXJhbXNQYXJhbXMuZnJvbUMoJnhjLnBhcmFtcyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJy CisJfQorCXguUGFyYW1zID0gdnNuZFBhcmFtc1BhcmFtcworCXJldHVybiBuaWwKK30KKworZnVu YyAoeCAqVnNuZFBjbSkgZnJvbUMoeGMgKkMubGlieGxfdnNuZF9wY20pIGVycm9yIHsKKwl4Lk5h bWUgPSBDLkdvU3RyaW5nKHhjLm5hbWUpCisJdmFyIHZzbmRQYXJhbXNQYXJhbXMgVnNuZFBhcmFt cworCWlmIGVyciA6PSB2c25kUGFyYW1zUGFyYW1zLmZyb21DKCZ4Yy5wYXJhbXMpOyBlcnIgIT0g bmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwl4LlBhcmFtcyA9IHZzbmRQYXJhbXNQYXJhbXMKKwly ZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkRldmljZVZzbmQpIGZyb21DKHhjICpDLmxpYnhsX2Rl dmljZV92c25kKSBlcnJvciB7CisJeC5CYWNrZW5kRG9taWQgPSBEb21pZCh4Yy5iYWNrZW5kX2Rv bWlkKQorCXguQmFja2VuZERvbW5hbWUgPSBDLkdvU3RyaW5nKHhjLmJhY2tlbmRfZG9tbmFtZSkK Kwl4LkRldmlkID0gRGV2aWQoeGMuZGV2aWQpCisJeC5TaG9ydE5hbWUgPSBDLkdvU3RyaW5nKHhj LnNob3J0X25hbWUpCisJeC5Mb25nTmFtZSA9IEMuR29TdHJpbmcoeGMubG9uZ19uYW1lKQorCXZh ciB2c25kUGFyYW1zUGFyYW1zIFZzbmRQYXJhbXMKKwlpZiBlcnIgOj0gdnNuZFBhcmFtc1BhcmFt cy5mcm9tQygmeGMucGFyYW1zKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJeC5Q YXJhbXMgPSB2c25kUGFyYW1zUGFyYW1zCisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpEb21h aW5Db25maWcpIGZyb21DKHhjICpDLmxpYnhsX2RvbWFpbl9jb25maWcpIGVycm9yIHsKKwl2YXIg ZG9tYWluQ3JlYXRlSW5mb0NJbmZvIERvbWFpbkNyZWF0ZUluZm8KKwlpZiBlcnIgOj0gZG9tYWlu Q3JlYXRlSW5mb0NJbmZvLmZyb21DKCZ4Yy5jX2luZm8pOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJu IGVycgorCX0KKwl4LkNJbmZvID0gZG9tYWluQ3JlYXRlSW5mb0NJbmZvCisJdmFyIGRvbWFpbkJ1 aWxkSW5mb0JJbmZvIERvbWFpbkJ1aWxkSW5mbworCWlmIGVyciA6PSBkb21haW5CdWlsZEluZm9C SW5mby5mcm9tQygmeGMuYl9pbmZvKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJ eC5CSW5mbyA9IGRvbWFpbkJ1aWxkSW5mb0JJbmZvCisJeC5PblBvd2Vyb2ZmID0gQWN0aW9uT25T aHV0ZG93bih4Yy5vbl9wb3dlcm9mZikKKwl4Lk9uUmVib290ID0gQWN0aW9uT25TaHV0ZG93bih4 Yy5vbl9yZWJvb3QpCisJeC5PbldhdGNoZG9nID0gQWN0aW9uT25TaHV0ZG93bih4Yy5vbl93YXRj aGRvZykKKwl4Lk9uQ3Jhc2ggPSBBY3Rpb25PblNodXRkb3duKHhjLm9uX2NyYXNoKQorCXguT25T b2Z0UmVzZXQgPSBBY3Rpb25PblNodXRkb3duKHhjLm9uX3NvZnRfcmVzZXQpCisJcmV0dXJuIG5p bAorfQorCitmdW5jICh4ICpEaXNraW5mbykgZnJvbUMoeGMgKkMubGlieGxfZGlza2luZm8pIGVy cm9yIHsKKwl4LkJhY2tlbmQgPSBDLkdvU3RyaW5nKHhjLmJhY2tlbmQpCisJeC5CYWNrZW5kSWQg PSB1aW50MzIoeGMuYmFja2VuZF9pZCkKKwl4LkZyb250ZW5kID0gQy5Hb1N0cmluZyh4Yy5mcm9u dGVuZCkKKwl4LkZyb250ZW5kSWQgPSB1aW50MzIoeGMuZnJvbnRlbmRfaWQpCisJeC5EZXZpZCA9 IERldmlkKHhjLmRldmlkKQorCXguU3RhdGUgPSBpbnQoeGMuc3RhdGUpCisJeC5FdnRjaCA9IGlu dCh4Yy5ldnRjaCkKKwl4LlJyZWYgPSBpbnQoeGMucnJlZikKKwlyZXR1cm4gbmlsCit9CisKK2Z1 bmMgKHggKk5pY2luZm8pIGZyb21DKHhjICpDLmxpYnhsX25pY2luZm8pIGVycm9yIHsKKwl4LkJh Y2tlbmQgPSBDLkdvU3RyaW5nKHhjLmJhY2tlbmQpCisJeC5CYWNrZW5kSWQgPSB1aW50MzIoeGMu YmFja2VuZF9pZCkKKwl4LkZyb250ZW5kID0gQy5Hb1N0cmluZyh4Yy5mcm9udGVuZCkKKwl4LkZy b250ZW5kSWQgPSB1aW50MzIoeGMuZnJvbnRlbmRfaWQpCisJeC5EZXZpZCA9IERldmlkKHhjLmRl dmlkKQorCXguU3RhdGUgPSBpbnQoeGMuc3RhdGUpCisJeC5FdnRjaCA9IGludCh4Yy5ldnRjaCkK Kwl4LlJyZWZUeCA9IGludCh4Yy5ycmVmX3R4KQorCXguUnJlZlJ4ID0gaW50KHhjLnJyZWZfcngp CisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpWdHBtaW5mbykgZnJvbUMoeGMgKkMubGlieGxf dnRwbWluZm8pIGVycm9yIHsKKwl4LkJhY2tlbmQgPSBDLkdvU3RyaW5nKHhjLmJhY2tlbmQpCisJ eC5CYWNrZW5kSWQgPSB1aW50MzIoeGMuYmFja2VuZF9pZCkKKwl4LkZyb250ZW5kID0gQy5Hb1N0 cmluZyh4Yy5mcm9udGVuZCkKKwl4LkZyb250ZW5kSWQgPSB1aW50MzIoeGMuZnJvbnRlbmRfaWQp CisJeC5EZXZpZCA9IERldmlkKHhjLmRldmlkKQorCXguU3RhdGUgPSBpbnQoeGMuc3RhdGUpCisJ eC5FdnRjaCA9IGludCh4Yy5ldnRjaCkKKwl4LlJyZWYgPSBpbnQoeGMucnJlZikKKwl2YXIgdXVp ZFV1aWQgVXVpZAorCWlmIGVyciA6PSB1dWlkVXVpZC5mcm9tQygmeGMudXVpZCk7IGVyciAhPSBu aWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguVXVpZCA9IHV1aWRVdWlkCisJcmV0dXJuIG5pbAor fQorCitmdW5jICh4ICpVc2JjdHJsaW5mbykgZnJvbUMoeGMgKkMubGlieGxfdXNiY3RybGluZm8p IGVycm9yIHsKKwl4LlR5cGUgPSBVc2JjdHJsVHlwZSh4Yy5fdHlwZSkKKwl4LkRldmlkID0gRGV2 aWQoeGMuZGV2aWQpCisJeC5WZXJzaW9uID0gaW50KHhjLnZlcnNpb24pCisJeC5Qb3J0cyA9IGlu dCh4Yy5wb3J0cykKKwl4LkJhY2tlbmQgPSBDLkdvU3RyaW5nKHhjLmJhY2tlbmQpCisJeC5CYWNr ZW5kSWQgPSB1aW50MzIoeGMuYmFja2VuZF9pZCkKKwl4LkZyb250ZW5kID0gQy5Hb1N0cmluZyh4 Yy5mcm9udGVuZCkKKwl4LkZyb250ZW5kSWQgPSB1aW50MzIoeGMuZnJvbnRlbmRfaWQpCisJeC5T dGF0ZSA9IGludCh4Yy5zdGF0ZSkKKwl4LkV2dGNoID0gaW50KHhjLmV2dGNoKQorCXguUmVmVXJi ID0gaW50KHhjLnJlZl91cmIpCisJeC5SZWZDb25uID0gaW50KHhjLnJlZl9jb25uKQorCXJldHVy biBuaWwKK30KKworZnVuYyAoeCAqVmNwdWluZm8pIGZyb21DKHhjICpDLmxpYnhsX3ZjcHVpbmZv KSBlcnJvciB7CisJeC5WY3B1aWQgPSB1aW50MzIoeGMudmNwdWlkKQorCXguQ3B1ID0gdWludDMy KHhjLmNwdSkKKwl4Lk9ubGluZSA9IGJvb2woeGMub25saW5lKQorCXguQmxvY2tlZCA9IGJvb2wo eGMuYmxvY2tlZCkKKwl4LlJ1bm5pbmcgPSBib29sKHhjLnJ1bm5pbmcpCisJeC5WY3B1VGltZSA9 IHVpbnQ2NCh4Yy52Y3B1X3RpbWUpCisJdmFyIGJpdG1hcENwdW1hcCBCaXRtYXAKKwlpZiBlcnIg Oj0gYml0bWFwQ3B1bWFwLmZyb21DKCZ4Yy5jcHVtYXApOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJu IGVycgorCX0KKwl4LkNwdW1hcCA9IGJpdG1hcENwdW1hcAorCXZhciBiaXRtYXBDcHVtYXBTb2Z0 IEJpdG1hcAorCWlmIGVyciA6PSBiaXRtYXBDcHVtYXBTb2Z0LmZyb21DKCZ4Yy5jcHVtYXBfc29m dCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguQ3B1bWFwU29mdCA9IGJpdG1h cENwdW1hcFNvZnQKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKlBoeXNpbmZvKSBmcm9tQyh4 YyAqQy5saWJ4bF9waHlzaW5mbykgZXJyb3IgeworCXguVGhyZWFkc1BlckNvcmUgPSB1aW50MzIo eGMudGhyZWFkc19wZXJfY29yZSkKKwl4LkNvcmVzUGVyU29ja2V0ID0gdWludDMyKHhjLmNvcmVz X3Blcl9zb2NrZXQpCisJeC5NYXhDcHVJZCA9IHVpbnQzMih4Yy5tYXhfY3B1X2lkKQorCXguTnJD cHVzID0gdWludDMyKHhjLm5yX2NwdXMpCisJeC5DcHVLaHogPSB1aW50MzIoeGMuY3B1X2toeikK Kwl4LlRvdGFsUGFnZXMgPSB1aW50NjQoeGMudG90YWxfcGFnZXMpCisJeC5GcmVlUGFnZXMgPSB1 aW50NjQoeGMuZnJlZV9wYWdlcykKKwl4LlNjcnViUGFnZXMgPSB1aW50NjQoeGMuc2NydWJfcGFn ZXMpCisJeC5PdXRzdGFuZGluZ1BhZ2VzID0gdWludDY0KHhjLm91dHN0YW5kaW5nX3BhZ2VzKQor CXguU2hhcmluZ0ZyZWVkUGFnZXMgPSB1aW50NjQoeGMuc2hhcmluZ19mcmVlZF9wYWdlcykKKwl4 LlNoYXJpbmdVc2VkRnJhbWVzID0gdWludDY0KHhjLnNoYXJpbmdfdXNlZF9mcmFtZXMpCisJeC5N YXhQb3NzaWJsZU1mbiA9IHVpbnQ2NCh4Yy5tYXhfcG9zc2libGVfbWZuKQorCXguTnJOb2RlcyA9 IHVpbnQzMih4Yy5ucl9ub2RlcykKKwl2YXIgaHdjYXBId0NhcCBId2NhcAorCWlmIGVyciA6PSBo d2NhcEh3Q2FwLmZyb21DKCZ4Yy5od19jYXApOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgor CX0KKwl4Lkh3Q2FwID0gaHdjYXBId0NhcAorCXguQ2FwSHZtID0gYm9vbCh4Yy5jYXBfaHZtKQor CXguQ2FwUHYgPSBib29sKHhjLmNhcF9wdikKKwl4LkNhcEh2bURpcmVjdGlvID0gYm9vbCh4Yy5j YXBfaHZtX2RpcmVjdGlvKQorCXguQ2FwSGFwID0gYm9vbCh4Yy5jYXBfaGFwKQorCXguQ2FwU2hh ZG93ID0gYm9vbCh4Yy5jYXBfc2hhZG93KQorCXguQ2FwSW9tbXVIYXBQdFNoYXJlID0gYm9vbCh4 Yy5jYXBfaW9tbXVfaGFwX3B0X3NoYXJlKQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqQ29u bmVjdG9yaW5mbykgZnJvbUMoeGMgKkMubGlieGxfY29ubmVjdG9yaW5mbykgZXJyb3IgeworCXgu VW5pcXVlSWQgPSBDLkdvU3RyaW5nKHhjLnVuaXF1ZV9pZCkKKwl4LldpZHRoID0gdWludDMyKHhj LndpZHRoKQorCXguSGVpZ2h0ID0gdWludDMyKHhjLmhlaWdodCkKKwl4LlJlcUV2dGNoID0gaW50 KHhjLnJlcV9ldnRjaCkKKwl4LlJlcVJyZWYgPSBpbnQoeGMucmVxX3JyZWYpCisJeC5FdnRFdnRj aCA9IGludCh4Yy5ldnRfZXZ0Y2gpCisJeC5FdnRScmVmID0gaW50KHhjLmV2dF9ycmVmKQorCXJl dHVybiBuaWwKK30KKworZnVuYyAoeCAqVmRpc3BsaW5mbykgZnJvbUMoeGMgKkMubGlieGxfdmRp c3BsaW5mbykgZXJyb3IgeworCXguQmFja2VuZCA9IEMuR29TdHJpbmcoeGMuYmFja2VuZCkKKwl4 LkJhY2tlbmRJZCA9IHVpbnQzMih4Yy5iYWNrZW5kX2lkKQorCXguRnJvbnRlbmQgPSBDLkdvU3Ry aW5nKHhjLmZyb250ZW5kKQorCXguRnJvbnRlbmRJZCA9IHVpbnQzMih4Yy5mcm9udGVuZF9pZCkK Kwl4LkRldmlkID0gRGV2aWQoeGMuZGV2aWQpCisJeC5TdGF0ZSA9IGludCh4Yy5zdGF0ZSkKKwl4 LkJlQWxsb2MgPSBib29sKHhjLmJlX2FsbG9jKQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAq U3RyZWFtaW5mbykgZnJvbUMoeGMgKkMubGlieGxfc3RyZWFtaW5mbykgZXJyb3IgeworCXguUmVx RXZ0Y2ggPSBpbnQoeGMucmVxX2V2dGNoKQorCXguUmVxUnJlZiA9IGludCh4Yy5yZXFfcnJlZikK KwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKlBjbWluZm8pIGZyb21DKHhjICpDLmxpYnhsX3Bj bWluZm8pIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKlZzbmRpbmZvKSBmcm9t Qyh4YyAqQy5saWJ4bF92c25kaW5mbykgZXJyb3IgeworCXguQmFja2VuZCA9IEMuR29TdHJpbmco eGMuYmFja2VuZCkKKwl4LkJhY2tlbmRJZCA9IHVpbnQzMih4Yy5iYWNrZW5kX2lkKQorCXguRnJv bnRlbmQgPSBDLkdvU3RyaW5nKHhjLmZyb250ZW5kKQorCXguRnJvbnRlbmRJZCA9IHVpbnQzMih4 Yy5mcm9udGVuZF9pZCkKKwl4LkRldmlkID0gRGV2aWQoeGMuZGV2aWQpCisJeC5TdGF0ZSA9IGlu dCh4Yy5zdGF0ZSkKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKlZrYmluZm8pIGZyb21DKHhj ICpDLmxpYnhsX3ZrYmluZm8pIGVycm9yIHsKKwl4LkJhY2tlbmQgPSBDLkdvU3RyaW5nKHhjLmJh Y2tlbmQpCisJeC5CYWNrZW5kSWQgPSB1aW50MzIoeGMuYmFja2VuZF9pZCkKKwl4LkZyb250ZW5k ID0gQy5Hb1N0cmluZyh4Yy5mcm9udGVuZCkKKwl4LkZyb250ZW5kSWQgPSB1aW50MzIoeGMuZnJv bnRlbmRfaWQpCisJeC5EZXZpZCA9IERldmlkKHhjLmRldmlkKQorCXguU3RhdGUgPSBpbnQoeGMu c3RhdGUpCisJeC5FdnRjaCA9IGludCh4Yy5ldnRjaCkKKwl4LlJyZWYgPSBpbnQoeGMucnJlZikK KwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKk51bWFpbmZvKSBmcm9tQyh4YyAqQy5saWJ4bF9u dW1haW5mbykgZXJyb3IgeworCXguU2l6ZSA9IHVpbnQ2NCh4Yy5zaXplKQorCXguRnJlZSA9IHVp bnQ2NCh4Yy5mcmVlKQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqQ3B1dG9wb2xvZ3kpIGZy b21DKHhjICpDLmxpYnhsX2NwdXRvcG9sb2d5KSBlcnJvciB7CisJeC5Db3JlID0gdWludDMyKHhj LmNvcmUpCisJeC5Tb2NrZXQgPSB1aW50MzIoeGMuc29ja2V0KQorCXguTm9kZSA9IHVpbnQzMih4 Yy5ub2RlKQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqUGNpdG9wb2xvZ3kpIGZyb21DKHhj ICpDLmxpYnhsX3BjaXRvcG9sb2d5KSBlcnJvciB7CisJeC5TZWcgPSB1aW50MTYoeGMuc2VnKQor CXguQnVzID0gYnl0ZSh4Yy5idXMpCisJeC5EZXZmbiA9IGJ5dGUoeGMuZGV2Zm4pCisJeC5Ob2Rl ID0gdWludDMyKHhjLm5vZGUpCisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpTY2hlZENyZWRp dFBhcmFtcykgZnJvbUMoeGMgKkMubGlieGxfc2NoZWRfY3JlZGl0X3BhcmFtcykgZXJyb3Igewor CXguVHNsaWNlTXMgPSBpbnQoeGMudHNsaWNlX21zKQorCXguUmF0ZWxpbWl0VXMgPSBpbnQoeGMu cmF0ZWxpbWl0X3VzKQorCXguVmNwdU1pZ3JEZWxheVVzID0gaW50KHhjLnZjcHVfbWlncl9kZWxh eV91cykKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKlNjaGVkQ3JlZGl0MlBhcmFtcykgZnJv bUMoeGMgKkMubGlieGxfc2NoZWRfY3JlZGl0Ml9wYXJhbXMpIGVycm9yIHsKKwl4LlJhdGVsaW1p dFVzID0gaW50KHhjLnJhdGVsaW1pdF91cykKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkRv bWFpblJlbXVzSW5mbykgZnJvbUMoeGMgKkMubGlieGxfZG9tYWluX3JlbXVzX2luZm8pIGVycm9y IHsKKwl4LkludGVydmFsID0gaW50KHhjLmludGVydmFsKQorCXZhciBkZWZib29sQWxsb3dVbnNh ZmUgRGVmYm9vbAorCWlmIGVyciA6PSBkZWZib29sQWxsb3dVbnNhZmUuZnJvbUMoJnhjLmFsbG93 X3Vuc2FmZSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguQWxsb3dVbnNhZmUg PSBkZWZib29sQWxsb3dVbnNhZmUKKwl2YXIgZGVmYm9vbEJsYWNraG9sZSBEZWZib29sCisJaWYg ZXJyIDo9IGRlZmJvb2xCbGFja2hvbGUuZnJvbUMoJnhjLmJsYWNraG9sZSk7IGVyciAhPSBuaWwg eworCQlyZXR1cm4gZXJyCisJfQorCXguQmxhY2tob2xlID0gZGVmYm9vbEJsYWNraG9sZQorCXZh ciBkZWZib29sQ29tcHJlc3Npb24gRGVmYm9vbAorCWlmIGVyciA6PSBkZWZib29sQ29tcHJlc3Np b24uZnJvbUMoJnhjLmNvbXByZXNzaW9uKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9 CisJeC5Db21wcmVzc2lvbiA9IGRlZmJvb2xDb21wcmVzc2lvbgorCXZhciBkZWZib29sTmV0YnVm IERlZmJvb2wKKwlpZiBlcnIgOj0gZGVmYm9vbE5ldGJ1Zi5mcm9tQygmeGMubmV0YnVmKTsgZXJy ICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJeC5OZXRidWYgPSBkZWZib29sTmV0YnVmCisJ eC5OZXRidWZzY3JpcHQgPSBDLkdvU3RyaW5nKHhjLm5ldGJ1ZnNjcmlwdCkKKwl2YXIgZGVmYm9v bERpc2tidWYgRGVmYm9vbAorCWlmIGVyciA6PSBkZWZib29sRGlza2J1Zi5mcm9tQygmeGMuZGlz a2J1Zik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXguRGlza2J1ZiA9IGRlZmJv b2xEaXNrYnVmCisJdmFyIGRlZmJvb2xDb2xvIERlZmJvb2wKKwlpZiBlcnIgOj0gZGVmYm9vbENv bG8uZnJvbUMoJnhjLmNvbG8pOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwl4LkNv bG8gPSBkZWZib29sQ29sbworCXZhciBkZWZib29sVXNlcnNwYWNlQ29sb1Byb3h5IERlZmJvb2wK KwlpZiBlcnIgOj0gZGVmYm9vbFVzZXJzcGFjZUNvbG9Qcm94eS5mcm9tQygmeGMudXNlcnNwYWNl X2NvbG9fcHJveHkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwl4LlVzZXJzcGFj ZUNvbG9Qcm94eSA9IGRlZmJvb2xVc2Vyc3BhY2VDb2xvUHJveHkKKwlyZXR1cm4gbmlsCit9CisK K2Z1bmMgKHggKkV2ZW50KSBmcm9tQyh4YyAqQy5saWJ4bF9ldmVudCkgZXJyb3IgeworCXZhciBl dkxpbmtMaW5rIEV2TGluaworCWlmIGVyciA6PSBldkxpbmtMaW5rLmZyb21DKCZ4Yy5saW5rKTsg ZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJeC5MaW5rID0gZXZMaW5rTGluaworCXgu RG9taWQgPSBEb21pZCh4Yy5kb21pZCkKKwl2YXIgdXVpZERvbXV1aWQgVXVpZAorCWlmIGVyciA6 PSB1dWlkRG9tdXVpZC5mcm9tQygmeGMuZG9tdXVpZCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4g ZXJyCisJfQorCXguRG9tdXVpZCA9IHV1aWREb211dWlkCisJeC5Gb3JVc2VyID0gdWludDY0KHhj LmZvcl91c2VyKQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqUHNyQ2F0SW5mbykgZnJvbUMo eGMgKkMubGlieGxfcHNyX2NhdF9pbmZvKSBlcnJvciB7CisJeC5JZCA9IHVpbnQzMih4Yy5pZCkK Kwl4LkNvc01heCA9IHVpbnQzMih4Yy5jb3NfbWF4KQorCXguQ2JtTGVuID0gdWludDMyKHhjLmNi bV9sZW4pCisJeC5DZHBFbmFibGVkID0gYm9vbCh4Yy5jZHBfZW5hYmxlZCkKKwlyZXR1cm4gbmls Cit9CisKK2Z1bmMgKHggKlBzckh3SW5mbykgZnJvbUMoeGMgKkMubGlieGxfcHNyX2h3X2luZm8p IGVycm9yIHsKKwl4LklkID0gdWludDMyKHhjLmlkKQorCXJldHVybiBuaWwKK30KLS0gCjIuMTku MQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1k ZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8v bGlzdHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw=