From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2095.outbound.protection.outlook.com [40.107.93.95]) by sourceware.org (Postfix) with ESMTPS id F1E0A3851C13 for ; Tue, 2 Feb 2021 01:45:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org F1E0A3851C13 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZSrCES/2boJI1H+JxaJixlee8abWkc3avR3mQUqLDuSaYJLFTqPgZOdeR63RMo0EOTHTh7loZjdV++L2wCWQaS5wvnfAJP4EVMGrPJNxhfG0DFqbKvMQCZ8S7pY8ut5gFcDXHDfdoOs8PUjplz3akd0nMwMxVs3vxrL4GT7ljNJ2ba3zPzCUbZ97t9RN50HSuFabNAHgIjXkusttH7IhsF6scqDI1Oh4jURtP+hiXOaJc71EzKCC/xXc2uP7b5HVhSNlerJEk7mJBmCIGu1ykZhZ1fyI7HJOkA/VXxmGgzVDeby0z2j+WsGknPenNbMnbJiDeuxTe6ZT3LoSCLQOdA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=z7ylFD8XADeO7k6wcVywqiAFugmCNeWAM9GgwslJmo4=; b=OFNQiRCTxmIMbFqIiMAkYtFaa2b2ap0z4NwbhuyL3vI3Wb+ThMbuueQNvAH78QiT6UiPXurY9onm19p95Zlmuj2u3IIJABqYLvyxntDvioyEsEp9UZRdI/u/jaOQgHVT3O3sqiSxkMqsfHbVXZ3zFOomNRT9izqQJXuXLBXhYrt1oxBUhWFW3X/6D63o3A0ybNfZL0XxShlvZGT2X2dR/3h59H3BwIo9a8ZyvotXYTCPpb1z7L1N7Km8s243tJ3MQYvgQwIhIVICm/OrKft3p2h01bbYQQ97Cl4zHDLGLizUIBvEYnOA29AZDDdtnZTeE2jW74S3j0cxpTYRUfE+Zw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=os.amperecomputing.com; dmarc=pass action=none header.from=os.amperecomputing.com; dkim=pass header.d=os.amperecomputing.com; arc=none Received: from MWHPR01MB2304.prod.exchangelabs.com (2603:10b6:300:26::15) by MW2PR0102MB3420.prod.exchangelabs.com (2603:10b6:302:7::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3805.17; Tue, 2 Feb 2021 01:45:07 +0000 Received: from MWHPR01MB2304.prod.exchangelabs.com ([fe80::48dd:7b44:ed66:9d67]) by MWHPR01MB2304.prod.exchangelabs.com ([fe80::48dd:7b44:ed66:9d67%11]) with mapi id 15.20.3805.028; Tue, 2 Feb 2021 01:45:04 +0000 From: Feng Xue OS To: "gcc-patches@gcc.gnu.org" Subject: Ping: [PATCH/RFC] Add a new memory gathering optimization for loop (PR98598) Thread-Topic: Ping: [PATCH/RFC] Add a new memory gathering optimization for loop (PR98598) Thread-Index: AQHW77yW3BYzqsozIEWUExeLbB3PRqpEKljM Date: Tue, 2 Feb 2021 01:45:04 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-originating-ip: [180.167.209.74] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 74e25eaa-9a90-4d60-329a-08d8c71c29ab x-ms-traffictypediagnostic: MW2PR0102MB3420: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:10000; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: O5USEGzTMK0TGLZPFXneDFD3wD5/PAwJHiYSOOuDPJPzU7ZC2YJRffg/l3MyHVpZl3RrmBwo/jC0Yp697Hvp9EaZ09psHzxXE6860Xq4a60QB8MTBdB7yfpRQG3UX16q8zcdDSS2Skuw79uPj9gvsQPnzlsrcf/HnbDUwzSQB6ETnsWHKhprPs8oUun6VRN+Ux7lmyHsJM3W6Rjzz+YpXiQiTeG2FZ9gXaXKARdIBZ0N0pHR9Sy8QfaZjn1L9moeS3WSpkWPEEDOf15DlBGWH0NuLqW/jtbHaKy4/WSaElKlG8fuLO5FNoLTbiJEgmn1VMJPohXw9LPnEScQTfyMlE83c5AXgmweooeLBfcj7Yjmcwxedu2CsumQBcUUkeJHOnJ0QDIOC/deeXk5NASYXVQG+R+/vP3j8RgiJKTAOJkqkD0IoTw+eoullDImcQ4yoGRZ4tmA6Kar/zi1+gbbs2eKloZEEOsChJywGIMIn/XFtrK0qdcZrygJDQdbMYiNS5Nz78FWe5hOD/SisfmXi8ulHPTWEthyvl0cuCjgw5pQ6V54eK0J2WLVbKXUYsGbBsNfojni3sWtO9zgCpPC+J2L24Oant2Pq43efD42tXo= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MWHPR01MB2304.prod.exchangelabs.com; PTR:; CAT:NONE; SFS:(4636009)(136003)(366004)(39840400004)(396003)(376002)(346002)(316002)(55016002)(5660300002)(966005)(9686003)(4001150100001)(33656002)(86362001)(26005)(71200400001)(6506007)(53546011)(8676002)(4326008)(186003)(7696005)(2906002)(99936003)(91956017)(66446008)(76116006)(107886003)(66476007)(66616009)(66946007)(64756008)(66556008)(6916009)(478600001)(52536014)(8936002)(54906003); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata: =?iso-8859-1?Q?2H9IL/qwWmsELt/uDofkwXXcowSnhsqFuofqFaInBGCZPZPAuxcv76DT5J?= =?iso-8859-1?Q?AE6YAB72pUWlEb7MzqPiPA3Et0o3E8AnlR/czNnwwWXxisxd97OPQIRxiY?= =?iso-8859-1?Q?iDsso7wgIPWoqCH/Y+kWUJWAS/adXbzL+8cNxZg92wo+v00cgCaDwSRMJu?= =?iso-8859-1?Q?CXYY7126R1tU10TPr5cwh18WuMdrIr2D2DtpqZxO9k/7YwE9moLlyIyd+W?= =?iso-8859-1?Q?v+jJa67j6vE8NYkiZHwQblY5p9zer+/xfnoObeTi2kO8PB6zR2yPCJypkk?= =?iso-8859-1?Q?moIMIwR/mCLp47SNQsX7v6Q1NTllsBzkRHRfArhBvA3ljmqugZ6laBGjRf?= =?iso-8859-1?Q?r0h5kKQMZnE76uy8kG/Aqxytk7xlicTEdE0rMxW1Ap1SeFew+4gi7ZTFTf?= =?iso-8859-1?Q?9W53KmwU5iywkdCOJ4C6VYjpVe0YAp+hxS7NvplGSrCVdSR95mdRdjwAZy?= =?iso-8859-1?Q?NeYpe2vlupH2R06HIk7EZguClOC8gS4R57Dunioo7v5TNo3auplrFNq7V9?= =?iso-8859-1?Q?SR93oZlEP6wm5z2nLyRB0iS2fbwfgHEX7CilJ8+ETorz3sfMoEK9PAFc5S?= =?iso-8859-1?Q?xcdEVDhM0yeW1uuf+dm5bldT9jqvPRL5+240rKMFpao8CZ+zyh6QgUo+4d?= =?iso-8859-1?Q?/iySQvbSXhAvIFCvrUxRIbxlO51/nU15vr+bqCpwIXz3LUUieE5m7lzoG+?= =?iso-8859-1?Q?DM/boLTHujAf+ar+yoMQhsHSs4VkNlCDdisD7SMSwHK+UywiunK4ELCrCQ?= =?iso-8859-1?Q?oDCx2y0iJo5pFjPv4XGP37R0hUVzZ5YLc/wIZyx/oU2zv1KqT2WgeBKGfg?= =?iso-8859-1?Q?XOWDHnYCtTw7pkbq04XUvhOTfEBA9oSxOvaDoUDdGN7Mi3rPcg8EGzGyqg?= =?iso-8859-1?Q?104ygxCh5fWwPrIstmQ43IzSxJzpqPSW7In06csjO4zy1NALI8fqyo2E4Q?= =?iso-8859-1?Q?Uq8lrgmAw/P4IeuGEQIaPTuBWLMjSVaHDyTvG8Qekqa8vcsDqXRdDB52KD?= =?iso-8859-1?Q?CUFVwXfzg15ki8OcwmqpRQlx5Y2X6yKI6FqQ6LnijdZtp/fSeBD/GxxxkX?= =?iso-8859-1?Q?4rMhjX4+YCZI1+gY2KKgI/jcpNTa91bRMGa5WVKcdaMt?= Content-Type: multipart/mixed; boundary="_002_MWHPR01MB23046172A3DF0E1886DF1FDBF7B59MWHPR01MB2304prod_" MIME-Version: 1.0 X-OriginatorOrg: os.amperecomputing.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MWHPR01MB2304.prod.exchangelabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 74e25eaa-9a90-4d60-329a-08d8c71c29ab X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Feb 2021 01:45:04.3033 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3bc2b170-fd94-476d-b0ce-4229bdc904a7 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: WK7VMDYDaC8RHm6lzriYXQs9Z4vf6J2si/x79iRWQ60NJdGVJ05A+qop6F8zjraJE1xoz68Bg4G0wdsZA8O2OxwRctDdAaU4vEOLrzpcsbI= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW2PR0102MB3420 X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, GIT_PATCH_0, KAM_ASCII_DIVIDERS, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Feb 2021 01:45:22 -0000 --_002_MWHPR01MB23046172A3DF0E1886DF1FDBF7B59MWHPR01MB2304prod_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Thanks,=0A= =0A= Feng=0A= ________________________________________=0A= From: Feng Xue OS=0A= Sent: Thursday, January 21, 2021 2:27 PM=0A= To: gcc-patches@gcc.gnu.org=0A= Cc: JiangNing OS; Hao Liu OS=0A= Subject: [PATCH/RFC] Add a new memory gathering optimization for loop (PR98= 598)=0A= =0A= This patch implements a new loop optimization according to the proposal=0A= in RFC given at https://gcc.gnu.org/pipermail/gcc/2021-January/234682.html.= =0A= So do not repeat the idea in this mail. Hope your comments on it.=0A= =0A= Bootstrapped/regtested on x86_64-linux and aarch64-linux.=0A= =0A= Thanks,=0A= Feng=0A= =0A= ----=0A= 2020-12-25 Feng Xue =0A= =0A= gcc/=0A= PR tree-optimization/98598=0A= * Makefile.in (OBJS): Add tree-ssa-loop-mgo.o.=0A= * common.opt (-ftree-loop-mgo): New option.=0A= * opts.c (default_options_table): Enable -ftree-loop-mgo at -O3+.= =0A= * params.opt (mgo-max-dep-load-level): New parameter.=0A= (mgo-max-cache-elem-size): Likewise.=0A= (mgo-min-cache-array-length): Likewise.=0A= (mgo-max-cache-array-length): Likewise.=0A= * doc/invoke.texi (mgo-max-dep-load-level): Document new parameter.= =0A= (mgo-max-cache-elem-size): Likewise.=0A= (mgo-min-cache-array-length): Likewise.=0A= (mgo-max-cache-array-length): Likewise.=0A= * passes.def: Add new pass_loop_mgo pass.=0A= * timevar.def (TV_LOOP_MGO): New timevar.=0A= * tree-pass.h (make_pass_loop_mgo): New declaration.=0A= * tree-ssa-loop-mgo.c: New file.=0A= =0A= gcc/testsuite/=0A= PR tree-optimization/98598=0A= * gcc.dg/tree-ssa/mgo/mgo.exp: New file.=0A= * gcc.dg/tree-ssa/mgo/mgo-common.h: New test header.=0A= * gcc.dg/tree-ssa/mgo/list/list-1.c: New test.=0A= * gcc.dg/tree-ssa/mgo/array/simple-1.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/simple-2.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/simple-3.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/param-1.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/param-2.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/param-3.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/dep-load-1.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/dep-load-2.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/dep-load-3.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/dep-load-4.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/dep-load-5.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/dep-load-6.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/dep-load-7.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/dep-load-8.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/dep-load-9.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/dep-load-10.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/indx-iter-1.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/indx-iter-2.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/indx-iter-3.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/indx-iter-4.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/indx-iter-5.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/indx-iter-6.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/outer-loop-1.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/outer-loop-2.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/outer-loop-3.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/outer-loop-4.c: Likewise.=0A= * gcc.dg/tree-ssa/mgo/array/outer-loop-5.c: Likewise.=0A= ---=0A= --_002_MWHPR01MB23046172A3DF0E1886DF1FDBF7B59MWHPR01MB2304prod_ Content-Type: text/x-patch; name="mgo-Add-a-new-memory-gathering-optimization-for-loop.patch" Content-Description: mgo-Add-a-new-memory-gathering-optimization-for-loop.patch Content-Disposition: attachment; filename="mgo-Add-a-new-memory-gathering-optimization-for-loop.patch"; size=124502; creation-date="Thu, 21 Jan 2021 06:24:24 GMT"; modification-date="Thu, 21 Jan 2021 06:27:30 GMT" Content-Transfer-Encoding: base64 RnJvbSAwZTAwYTZmZTgxOTdiYmQ3YzliMzliNjQ0N2ExMmRmYzc0YmU2ODhiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGZW5nIFh1ZSA8Znh1ZUBvcy5hbXBlcmVjb21wdXRpbmcuY29t PgpEYXRlOiBGcmksIDI1IERlYyAyMDIwIDE3OjQ4OjQ0ICswODAwClN1YmplY3Q6IFtQQVRDSCAx LzNdIG1nbzogQWRkIGEgbmV3IG1lbW9yeSBnYXRoZXJpbmcgb3B0aW1pemF0aW9uIGZvciBsb29w CiBbUFI5ODU5OF0KCkluIG5lc3RlZCBsb29wcywgaWYgc2NhdHRlcmVkIG1lbW9yeSBhY2Nlc3Nl cyBpbnNpZGUgaW5uZXIgbG9vcCByZW1haW4KdW5jaGFuZ2VkIGluIG91dGVyIGxvb3AsIHdlIGNh biBzZXF1ZW50aWFsaXplIHRoZXNlIGxvYWRzIGJ5IGNhY2hpbmcKdGhlaXIgdmFsdWVzIGludG8g YSB0ZW1wb3JhcnkgbWVtb3J5IHJlZ2lvbiBhdCB0aGUgZmlyc3QgdGltZSwgYW5kCnJldXNlIHRo ZSBjYWNoaW5nIGRhdGEgaW4gZm9sbG93aW5nIGl0ZXJhdGlvbnMuIFRoaXMgd2F5IGNhbiBpbXBy b3ZlCmVmZmljaWVuY3kgb2YgY3B1IGNhY2hlIHN1YnN5c3RlbSBieSByZWR1Y2luZyBpdHMgdW5w cmVkaWN0YWJsZSBhY3Rpdmllcy4KClRvIGlsbHVzdHJhdGUgd2hhdCB0aGUgb3B0aW1pemF0aW9u IHdpbGwgZG8sIHR3byBwaWVjZXMgb2YgcHNldWRvIGNvZGUsCmJlZm9yZSBhbmQgYWZ0ZXIgdHJh bnNmb3JtYXRpb24sIGFyZSBnaXZlbi4gU3VwcG9zZSBhbGwgbG9hZHMgYW5kCiJpdGVyX2NvdW50 IiBhcmUgaW52YXJpYW50IGluIG91dGVyIGxvb3AuCgpGcm9tOgoKICBvdXRlci1sb29wICgpCiAg ICB7CiAgICAgIGlubmVyLWxvb3AgKGl0ZXIsIGl0ZXJfY291bnQpCiAgICAgICAgewogICAgICAg ICAgVHlwZTEgdjEgPSBMT0FEIChpdGVyKTsKICAgICAgICAgIFR5cGUyIHYyID0gTE9BRCAodjEp OwogICAgICAgICAgVHlwZTMgdjMgPSBMT0FEICh2Mik7CiAgICAgICAgICAuLi4KICAgICAgICAg IGl0ZXIgPSBORVhUIChpdGVyKTsKICAgICAgICB9CiAgICB9CgpUbzoKCiAgdHlwZWRlZiBzdHJ1 Y3QgY2FjaGVfZWxlbQogICAgewogICAgICBib29sICAgaW5pdDsKICAgICAgVHlwZTEgIGNfdjE7 CiAgICAgIFR5cGUyICBjX3YyOwogICAgICBUeXBlMyAgY192MzsKICAgIH0gY2FjaGVfZWxlbTsK CiAgY2FjaGVfZWxlbSAqY2FjaGVfYXJyID0gY2FsbG9jIChpdGVyX2NvdW50LCBzaXplb2YgKGNh Y2hlX2VsZW0pKTsKCiAgb3V0ZXItbG9vcCAoKQogICAgewogICAgICBzaXplX3QgY2FjaGVfaWR4 ID0gMDsKCiAgICAgIGlubmVyLWxvb3AgKGl0ZXIsIGl0ZXJfY291bnQpCiAgICAgICAgewogICAg ICAgICAgaWYgKCFjYWNoZV9hcnJbY2FjaGVfaWR4XS0+aW5pdCkKICAgICAgICAgICAgewogICAg ICAgICAgICAgIHYxID0gTE9BRCAoaXRlcik7CiAgICAgICAgICAgICAgdjIgPSBMT0FEICh2MSk7 CiAgICAgICAgICAgICAgdjMgPSBMT0FEICh2Mik7CgogICAgICAgICAgICAgIGNhY2hlX2Fycltj YWNoZV9pZHhdLT5pbml0ID0gdHJ1ZTsKICAgICAgICAgICAgICBjYWNoZV9hcnJbY2FjaGVfaWR4 XS0+Y192MSA9IHYxOwogICAgICAgICAgICAgIGNhY2hlX2FycltjYWNoZV9pZHhdLT5jX3YyID0g djI7CiAgICAgICAgICAgICAgY2FjaGVfYXJyW2NhY2hlX2lkeF0tPmNfdjMgPSB2MzsKICAgICAg ICAgICAgfQoJICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICB2MSA9IGNhY2hlX2Fy cltjYWNoZV9pZHhdLT5jX3YxOwogICAgICAgICAgICAgIHYyID0gY2FjaGVfYXJyW2NhY2hlX2lk eF0tPmNfdjI7CiAgICAgICAgICAgICAgdjMgPSBjYWNoZV9hcnJbY2FjaGVfaWR4XS0+Y192MzsK ICAgICAgICAgICAgfQogICAgICAgICAgLi4uCiAgICAgICAgICBjYWNoZV9pZHgrKzsKICAgICAg ICAgIGl0ZXIgPSBORVhUIChpdGVyKTsKICAgICAgICB9CiAgICB9CgogIGZyZWUgKGNhY2hlX2Fy cik7CgpUaGlzIG9wdGltaXphdGlvbiB3aWxsIGJlIG9uZSBvZiB0cmVlIGxvb3AtcmVsYXRlZCBw YXNzZXMuIFNpbmNlIGl0IHVzZXMKaGVhcCBtZW1vcnkgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UsIHdo aWNoIGNvdWxkIGJlIGFzIHNlZW4gYXMgYW4gZXh0ZW5zaW9uCnRvIG9yaWRpbmFyeSBzdGFjay1i YXNlZCBtZWFucywgaXQgaXMgb25seSBlbmFibGVkIGluIE8zKy4KCjIwMjAtMTItMjUgIEZlbmcg WHVlICA8Znh1ZUBvcy5hbXBlcmVjb21wdXRpbmcuY29tPgoKZ2NjLwoJUFIgdHJlZS1vcHRpbWl6 YXRpb24vOTg1OTgKCSogTWFrZWZpbGUuaW4gKE9CSlMpOiBBZGQgdHJlZS1zc2EtbG9vcC1tZ28u by4KCSogY29tbW9uLm9wdCAoLWZ0cmVlLWxvb3AtbWdvKTogTmV3IG9wdGlvbi4KCSogb3B0cy5j IChkZWZhdWx0X29wdGlvbnNfdGFibGUpOiBFbmFibGUgLWZ0cmVlLWxvb3AtbWdvIGF0IC1PMysu CgkqIHBhcmFtcy5vcHQgKG1nby1tYXgtZGVwLWxvYWQtbGV2ZWwpOiBOZXcgcGFyYW1ldGVyLgoJ KG1nby1tYXgtY2FjaGUtZWxlbS1zaXplKTogTGlrZXdpc2UuCgkobWdvLW1pbi1jYWNoZS1hcnJh eS1sZW5ndGgpOiBMaWtld2lzZS4KCShtZ28tbWF4LWNhY2hlLWFycmF5LWxlbmd0aCk6IExpa2V3 aXNlLgoJKiBkb2MvaW52b2tlLnRleGkgKG1nby1tYXgtZGVwLWxvYWQtbGV2ZWwpOiBEb2N1bWVu dCBuZXcgcGFyYW1ldGVyLgoJKG1nby1tYXgtY2FjaGUtZWxlbS1zaXplKTogTGlrZXdpc2UuCgko bWdvLW1pbi1jYWNoZS1hcnJheS1sZW5ndGgpOiBMaWtld2lzZS4KCShtZ28tbWF4LWNhY2hlLWFy cmF5LWxlbmd0aCk6IExpa2V3aXNlLgoJKiBwYXNzZXMuZGVmOiBBZGQgbmV3IHBhc3NfbG9vcF9t Z28gcGFzcy4KCSogdGltZXZhci5kZWYgKFRWX0xPT1BfTUdPKTogTmV3IHRpbWV2YXIuCgkqIHRy ZWUtcGFzcy5oIChtYWtlX3Bhc3NfbG9vcF9tZ28pOiBOZXcgZGVjbGFyYXRpb24uCgkqIHRyZWUt c3NhLWxvb3AtbWdvLmM6IE5ldyBmaWxlLgoKZ2NjL3Rlc3RzdWl0ZS8KCVBSIHRyZWUtb3B0aW1p emF0aW9uLzk4NTk4CgkqIGdjYy5kZy90cmVlLXNzYS9tZ28vbWdvLmV4cDogTmV3IGZpbGUuCgkq IGdjYy5kZy90cmVlLXNzYS9tZ28vbWdvLWNvbW1vbi5oOiBOZXcgdGVzdCBoZWFkZXIuCgkqIGdj Yy5kZy90cmVlLXNzYS9tZ28vbGlzdC9saXN0LTEuYzogTmV3IHRlc3QuCgkqIGdjYy5kZy90cmVl LXNzYS9tZ28vYXJyYXkvc2ltcGxlLTEuYzogTGlrZXdpc2UuCgkqIGdjYy5kZy90cmVlLXNzYS9t Z28vYXJyYXkvc2ltcGxlLTIuYzogTGlrZXdpc2UuCgkqIGdjYy5kZy90cmVlLXNzYS9tZ28vYXJy YXkvc2ltcGxlLTMuYzogTGlrZXdpc2UuCgkqIGdjYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvcGFy YW0tMS5jOiBMaWtld2lzZS4KCSogZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9wYXJhbS0yLmM6 IExpa2V3aXNlLgoJKiBnY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L3BhcmFtLTMuYzogTGlrZXdp c2UuCgkqIGdjYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvZGVwLWxvYWQtMS5jOiBMaWtld2lzZS4K CSogZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC0yLmM6IExpa2V3aXNlLgoJKiBn Y2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTMuYzogTGlrZXdpc2UuCgkqIGdjYy5k Zy90cmVlLXNzYS9tZ28vYXJyYXkvZGVwLWxvYWQtNC5jOiBMaWtld2lzZS4KCSogZ2NjLmRnL3Ry ZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC01LmM6IExpa2V3aXNlLgoJKiBnY2MuZGcvdHJlZS1z c2EvbWdvL2FycmF5L2RlcC1sb2FkLTYuYzogTGlrZXdpc2UuCgkqIGdjYy5kZy90cmVlLXNzYS9t Z28vYXJyYXkvZGVwLWxvYWQtNy5jOiBMaWtld2lzZS4KCSogZ2NjLmRnL3RyZWUtc3NhL21nby9h cnJheS9kZXAtbG9hZC04LmM6IExpa2V3aXNlLgoJKiBnY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5 L2RlcC1sb2FkLTkuYzogTGlrZXdpc2UuCgkqIGdjYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvZGVw LWxvYWQtMTAuYzogTGlrZXdpc2UuCgkqIGdjYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvaW5keC1p dGVyLTEuYzogTGlrZXdpc2UuCgkqIGdjYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvaW5keC1pdGVy LTIuYzogTGlrZXdpc2UuCgkqIGdjYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvaW5keC1pdGVyLTMu YzogTGlrZXdpc2UuCgkqIGdjYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvaW5keC1pdGVyLTQuYzog TGlrZXdpc2UuCgkqIGdjYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvaW5keC1pdGVyLTUuYzogTGlr ZXdpc2UuCgkqIGdjYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvaW5keC1pdGVyLTYuYzogTGlrZXdp c2UuCgkqIGdjYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvb3V0ZXItbG9vcC0xLmM6IExpa2V3aXNl LgoJKiBnY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L291dGVyLWxvb3AtMi5jOiBMaWtld2lzZS4K CSogZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9vdXRlci1sb29wLTMuYzogTGlrZXdpc2UuCgkq IGdjYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvb3V0ZXItbG9vcC00LmM6IExpa2V3aXNlLgoJKiBn Y2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L291dGVyLWxvb3AtNS5jOiBMaWtld2lzZS4KLS0tCiBn Y2MvTWFrZWZpbGUuaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxICsKIGdj Yy9jb21tb24ub3B0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDQgKwogZ2Nj L2RvYy9pbnZva2UudGV4aSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNiArCiBnY2Mv b3B0cy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxICsKIGdjYy9w YXJhbXMub3B0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTYgKwogZ2NjL3Bh c3Nlcy5kZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiAuLi4vZ2Nj LmRnL3RyZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC0xLmMgICAgfCAgIDM5ICsKIC4uLi9nY2Mu ZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTEwLmMgICB8ICAgMjggKwogLi4uL2djYy5k Zy90cmVlLXNzYS9tZ28vYXJyYXkvZGVwLWxvYWQtMi5jICAgIHwgICAzMSArCiAuLi4vZ2NjLmRn L3RyZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC0zLmMgICAgfCAgIDMxICsKIC4uLi9nY2MuZGcv dHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTQuYyAgICB8ICAgMzMgKwogLi4uL2djYy5kZy90 cmVlLXNzYS9tZ28vYXJyYXkvZGVwLWxvYWQtNS5jICAgIHwgICAzMyArCiAuLi4vZ2NjLmRnL3Ry ZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC02LmMgICAgfCAgIDI5ICsKIC4uLi9nY2MuZGcvdHJl ZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTcuYyAgICB8ICAgMzMgKwogLi4uL2djYy5kZy90cmVl LXNzYS9tZ28vYXJyYXkvZGVwLWxvYWQtOC5jICAgIHwgICAyNyArCiAuLi4vZ2NjLmRnL3RyZWUt c3NhL21nby9hcnJheS9kZXAtbG9hZC05LmMgICAgfCAgIDI3ICsKIC4uLi9nY2MuZGcvdHJlZS1z c2EvbWdvL2FycmF5L2luZHgtaXRlci0xLmMgICB8ICAgMzAgKwogLi4uL2djYy5kZy90cmVlLXNz YS9tZ28vYXJyYXkvaW5keC1pdGVyLTIuYyAgIHwgICAyNyArCiAuLi4vZ2NjLmRnL3RyZWUtc3Nh L21nby9hcnJheS9pbmR4LWl0ZXItMy5jICAgfCAgIDI3ICsKIC4uLi9nY2MuZGcvdHJlZS1zc2Ev bWdvL2FycmF5L2luZHgtaXRlci00LmMgICB8ICAgMjkgKwogLi4uL2djYy5kZy90cmVlLXNzYS9t Z28vYXJyYXkvaW5keC1pdGVyLTUuYyAgIHwgICAyNyArCiAuLi4vZ2NjLmRnL3RyZWUtc3NhL21n by9hcnJheS9pbmR4LWl0ZXItNi5jICAgfCAgIDI3ICsKIC4uLi9nY2MuZGcvdHJlZS1zc2EvbWdv L2FycmF5L291dGVyLWxvb3AtMS5jICB8ICAgMzEgKwogLi4uL2djYy5kZy90cmVlLXNzYS9tZ28v YXJyYXkvb3V0ZXItbG9vcC0yLmMgIHwgICAzMyArCiAuLi4vZ2NjLmRnL3RyZWUtc3NhL21nby9h cnJheS9vdXRlci1sb29wLTMuYyAgfCAgIDM1ICsKIC4uLi9nY2MuZGcvdHJlZS1zc2EvbWdvL2Fy cmF5L291dGVyLWxvb3AtNC5jICB8ICAgMzkgKwogLi4uL2djYy5kZy90cmVlLXNzYS9tZ28vYXJy YXkvb3V0ZXItbG9vcC01LmMgIHwgICAzNSArCiAuLi4vZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJh eS9wYXJhbS0xLmMgICAgICAgfCAgIDI3ICsKIC4uLi9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5 L3BhcmFtLTIuYyAgICAgICB8ICAgMjggKwogLi4uL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkv cGFyYW0tMy5jICAgICAgIHwgICAyNiArCiAuLi4vZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9z aW1wbGUtMS5jICAgICAgfCAgIDQ2ICsKIC4uLi9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L3Np bXBsZS0yLmMgICAgICB8ICAgMjYgKwogLi4uL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvc2lt cGxlLTMuYyAgICAgIHwgICAyNSArCiAuLi4vZ2NjLmRnL3RyZWUtc3NhL21nby9saXN0L2xpc3Qt MS5jICAgICAgICAgfCAgIDI2ICsKIC4uLi9nY2MuZGcvdHJlZS1zc2EvbWdvL21nby1jb21tb24u aCAgICAgICAgICB8ICAgNjEgKwogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL21n by5leHAgICAgIHwgICAzOCArCiBnY2MvdGltZXZhci5kZWYgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICAxICsKIGdjYy90cmVlLXBhc3MuaCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8ICAgIDEgKwogZ2NjL3RyZWUtc3NhLWxvb3AtbWdvLmMgICAgICAgICAgICAgICAg ICAgICAgIHwgMjY3NyArKysrKysrKysrKysrKysrKwogMzkgZmlsZXMgY2hhbmdlZCwgMzY3MiBp bnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJl ZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0 c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC0xMC5jCiBjcmVhdGUgbW9k ZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2Fk LTIuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21n by9hcnJheS9kZXAtbG9hZC0zLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2dj Yy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvZGVwLWxvYWQtNC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQg Z2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTUuYwogY3Jl YXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9k ZXAtbG9hZC02LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVl LXNzYS9tZ28vYXJyYXkvZGVwLWxvYWQtNy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3Rz dWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTguYwogY3JlYXRlIG1vZGUg MTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC05 LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28v YXJyYXkvaW5keC1pdGVyLTEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2Nj LmRnL3RyZWUtc3NhL21nby9hcnJheS9pbmR4LWl0ZXItMi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQg Z2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2luZHgtaXRlci0zLmMKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkv aW5keC1pdGVyLTQuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3Ry ZWUtc3NhL21nby9hcnJheS9pbmR4LWl0ZXItNS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rl c3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2luZHgtaXRlci02LmMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvb3V0ZXIt bG9vcC0xLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNz YS9tZ28vYXJyYXkvb3V0ZXItbG9vcC0yLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1 aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvb3V0ZXItbG9vcC0zLmMKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvb3V0ZXItbG9v cC00LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9t Z28vYXJyYXkvb3V0ZXItbG9vcC01LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRl L2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvcGFyYW0tMS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQg Z2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L3BhcmFtLTIuYwogY3JlYXRl IG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9wYXJh bS0zLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9t Z28vYXJyYXkvc2ltcGxlLTEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2Nj LmRnL3RyZWUtc3NhL21nby9hcnJheS9zaW1wbGUtMi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L3NpbXBsZS0zLmMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vbGlzdC9saXN0LTEu YwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9t Z28tY29tbW9uLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy90cmVl LXNzYS9tZ28vbWdvLmV4cAogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90cmVlLXNzYS1sb29wLW1n by5jCgpkaWZmIC0tZ2l0IGEvZ2NjL01ha2VmaWxlLmluIGIvZ2NjL01ha2VmaWxlLmluCmluZGV4 IGE2M2M1ZDljYWI2Li44OTZiOWM2YmQxYiAxMDA2NDQKLS0tIGEvZ2NjL01ha2VmaWxlLmluCisr KyBiL2djYy9NYWtlZmlsZS5pbgpAQCAtMTYzMSw2ICsxNjMxLDcgQEAgT0JKUyA9IFwKIAl0cmVl LXNzYS1saXZlLm8gXAogCXRyZWUtc3NhLWxvb3AtY2gubyBcCiAJdHJlZS1zc2EtbG9vcC1pbS5v IFwKKwl0cmVlLXNzYS1sb29wLW1nby5vIFwKIAl0cmVlLXNzYS1sb29wLWl2Y2Fub24ubyBcCiAJ dHJlZS1zc2EtbG9vcC1pdm9wdHMubyBcCiAJdHJlZS1zc2EtbG9vcC1tYW5pcC5vIFwKZGlmZiAt LWdpdCBhL2djYy9jb21tb24ub3B0IGIvZ2NjL2NvbW1vbi5vcHQKaW5kZXggYmRlMTcxMTg3MGQu LjhhZTBmZTM3MDQ4IDEwMDY0NAotLS0gYS9nY2MvY29tbW9uLm9wdAorKysgYi9nY2MvY29tbW9u Lm9wdApAQCAtMjgzMCw2ICsyODMwLDEwIEBAIGZ0cmVlLWxvb3AtaW0KIENvbW1vbiBWYXIoZmxh Z190cmVlX2xvb3BfaW0pIEluaXQoMSkgT3B0aW1pemF0aW9uCiBFbmFibGUgbG9vcCBpbnZhcmlh bnQgbW90aW9uIG9uIHRyZWVzLgogCitmdHJlZS1sb29wLW1nbworQ29tbW9uIFZhcihmbGFnX3Ry ZWVfbG9vcF9tZ28pIE9wdGltaXphdGlvbgorRW5hYmxlIG1lbW9yeSBnYXRoZXJpbmcgb3B0aW1p emF0aW9uIGluIGxvb3BzLgorCiBmdHJlZS1sb29wLWxpbmVhcgogQ29tbW9uIEFsaWFzKGZsb29w LW5lc3Qtb3B0aW1pemUpCiBFbmFibGUgbG9vcCBuZXN0IHRyYW5zZm9ybXMuICBTYW1lIGFzIC1m bG9vcC1uZXN0LW9wdGltaXplLgpkaWZmIC0tZ2l0IGEvZ2NjL2RvYy9pbnZva2UudGV4aSBiL2dj Yy9kb2MvaW52b2tlLnRleGkKaW5kZXggNWY0YTA2NjI1ZWIuLjFhZjUyYTJhNDE2IDEwMDY0NAot LS0gYS9nY2MvZG9jL2ludm9rZS50ZXhpCisrKyBiL2djYy9kb2MvaW52b2tlLnRleGkKQEAgLTE0 MzI2LDYgKzE0MzI2LDIyIEBAIFRoZSBwYXJhbWV0ZXIgaXMgdXNlZCBvbmx5IGluIEdJTVBMRSBG RS4KIFRoZSBtYXhpbXVtIG51bWJlciBvZiAnYWZ0ZXIgc3VwZXJub2RlJyBleHBsb2RlZCBub2Rl cyB3aXRoaW4gdGhlIGFuYWx5emVyCiBwZXIgc3VwZXJub2RlLCBiZWZvcmUgdGVybWluYXRpbmcg YW5hbHlzaXMuCiAKK0BpdGVtIG1nby1tYXgtZGVwLWxvYWQtbGV2ZWwKK1RoZSBtYXhpbXVtIGxl dmVsIG9mIGRlcGVuZGVudCBsb2FkIHRoYXQgbWVtb3J5IGdhdGhlcmluZyBvcHRpbWl6YXRpb24g Y291bGQKK2ZpbmQgc3RhcnRpbmcgZm9yIGEgbG9vcCBpdGVyYXRvci4KKworQGl0ZW0gbWdvLW1h eC1jYWNoZS1lbGVtLXNpemUKK1RoZSBtYXhpbXVtIHNpemUgKGluIGJ5dGVzKSBmb3IgY2FjaGUg ZGF0YSBlbGVtZW50IHVzZWQgdG8gaG9sZCB2YWx1ZXMgb2YKK2xvYWRzIGluIGVhY2ggbG9vcCBp dGVyYXRpb24uCisKK0BpdGVtIG1nby1taW4tY2FjaGUtYXJyYXktbGVuZ3RoCitUaGUgbWluaW11 bSBlbGVtZW50IG51bWJlciBvZiBjYWNoZS1hcnJheSB0byB0cmlnZ2VyIG1lbW9yeSBnYXRoZXJp bmcKK29wdGltaXphdGlvbi4gIEl0IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG1nby1t YXgtY2FjaGUtYXJyYXktbGVuZ3RoLgorCitAaXRlbSBtZ28tbWF4LWNhY2hlLWFycmF5LWxlbmd0 aAorVGhlIG1heGltdW0gZWxlbWVudCBudW1iZXIgb2YgY2FjaGUtYXJyYXksIGFib3ZlIHdoaWNo IG1lbW9yeSBnYXRoZXJpbmcKK29wdGltaXphdGlvbiB3aWxsIGJlIHN1cHByZXNzZWQuCisKIEBl bmQgdGFibGUKIAogVGhlIGZvbGxvd2luZyBjaG9pY2VzIG9mIEB2YXJ7bmFtZX0gYXJlIGF2YWls YWJsZSBvbiBBQXJjaDY0IHRhcmdldHM6CmRpZmYgLS1naXQgYS9nY2Mvb3B0cy5jIGIvZ2NjL29w dHMuYwppbmRleCAxZjFjZjgzODhmNy4uMzI2MWIzMTBhNmYgMTAwNjQ0Ci0tLSBhL2djYy9vcHRz LmMKKysrIGIvZ2NjL29wdHMuYwpAQCAtNTM2LDYgKzUzNiw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1 Y3QgZGVmYXVsdF9vcHRpb25zIGRlZmF1bHRfb3B0aW9uc190YWJsZVtdID0KICAgICB7IE9QVF9M RVZFTFNfM19QTFVTLCBPUFRfZnByZWRpY3RpdmVfY29tbW9uaW5nLCBOVUxMLCAxIH0sCiAgICAg eyBPUFRfTEVWRUxTXzNfUExVUywgT1BUX2ZzcGxpdF9sb29wcywgTlVMTCwgMSB9LAogICAgIHsg T1BUX0xFVkVMU18zX1BMVVMsIE9QVF9mc3BsaXRfcGF0aHMsIE5VTEwsIDEgfSwKKyAgICB7IE9Q VF9MRVZFTFNfM19QTFVTLCBPUFRfZnRyZWVfbG9vcF9tZ28sIE5VTEwsIDEgfSwKICAgICB7IE9Q VF9MRVZFTFNfM19QTFVTLCBPUFRfZnRyZWVfbG9vcF9kaXN0cmlidXRpb24sIE5VTEwsIDEgfSwK ICAgICB7IE9QVF9MRVZFTFNfM19QTFVTLCBPUFRfZnRyZWVfbG9vcF92ZWN0b3JpemUsIE5VTEws IDEgfSwKICAgICB7IE9QVF9MRVZFTFNfM19QTFVTLCBPUFRfZnRyZWVfcGFydGlhbF9wcmUsIE5V TEwsIDEgfSwKZGlmZiAtLWdpdCBhL2djYy9wYXJhbXMub3B0IGIvZ2NjL3BhcmFtcy5vcHQKaW5k ZXggY2ZlZDk4MGE0ZDIuLmJlNjUxNzBjNjdiIDEwMDY0NAotLS0gYS9nY2MvcGFyYW1zLm9wdAor KysgYi9nY2MvcGFyYW1zLm9wdApAQCAtNzM3LDYgKzczNywyMiBAQCBNYXhpbXVtIG51bWJlciBv ZiBWQUxVRXMgaGFuZGxlZCBkdXJpbmcgYSBzaW5nbGUgZmluZF9iYXNlX3Rlcm0gY2FsbC4KIENv bW1vbiBKb2luZWQgVUludGVnZXIgVmFyKHBhcmFtX21heF92cnBfc3dpdGNoX2Fzc2VydGlvbnMp IEluaXQoMTApIFBhcmFtIE9wdGltaXphdGlvbgogTWF4aW11bSBudW1iZXIgb2YgYXNzZXJ0aW9u cyB0byBhZGQgYWxvbmcgdGhlIGRlZmF1bHQgZWRnZSBvZiBhIHN3aXRjaCBzdGF0ZW1lbnQgZHVy aW5nIFZSUC4KIAorLXBhcmFtPW1nby1tYXgtZGVwLWxvYWQtbGV2ZWw9CitDb21tb24gSm9pbmVk IFVJbnRlZ2VyIFZhcihwYXJhbV9tZ29fZGVwX2xvYWRfbGV2ZWwpIEluaXQoOCkgSW50ZWdlclJh bmdlKDEsIDMyKSBQYXJhbSBPcHRpbWl6YXRpb24KK1RoZSBtYXhpbXVtIGxldmVsIG9mIGRlcGVu ZGVudCBsb2FkIHRoYXQgTUdPIGNvdWxkIGZpbmQgc3RhcnRpbmcgZnJvbSBhIGxvb3AgaXRlcmF0 b3IuCisKKy1wYXJhbT1tZ28tbWF4LWNhY2hlLWVsZW0tc2l6ZT0KK0NvbW1vbiBKb2luZWQgVUlu dGVnZXIgVmFyKHBhcmFtX21nb19tYXhfY2FjaGVfZWxlbV9zaXplKSBJbml0KDY0KSBJbnRlZ2Vy UmFuZ2UoMSwgNjU1MzYpIFBhcmFtIE9wdGltaXphdGlvbgorVGhlIG1heGltdW0gc2l6ZSAoaW4g Ynl0ZXMpIGZvciBjYWNoZSBkYXRhIGVsZW1lbnQgdXNlZCB0byBob2xkIHZhbHVlcyBvZiBsb2Fk cyBpbiBlYWNoIGxvb3AgaXRlcmF0aW9uLgorCistcGFyYW09bWdvLW1pbi1jYWNoZS1hcnJheS1s ZW5ndGg9CitDb21tb24gSm9pbmVkIFVJbnRlZ2VyIFZhcihwYXJhbV9tZ29fbWluX2NhY2hlX2Fy cmF5X2xlbmd0aCkgSW5pdCg2NCkgSW50ZWdlclJhbmdlKDEsIDIxNDc0ODM2NDcpIFBhcmFtIE9w dGltaXphdGlvbgorVGhlIG1pbmltdW0gZWxlbWVudCBudW1iZXIgb2YgY2FjaGUtYXJyYXkgdG8g dHJpZ2dlciBNR08uICBJdCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtZ28tbWF4LWNh Y2hlLWFycmF5LWxlbmd0aC4KKworLXBhcmFtPW1nby1tYXgtY2FjaGUtYXJyYXktbGVuZ3RoPQor Q29tbW9uIEpvaW5lZCBVSW50ZWdlciBWYXIocGFyYW1fbWdvX21heF9jYWNoZV9hcnJheV9sZW5n dGgpIEluaXQoODM4ODYwOCkgSW50ZWdlclJhbmdlKDEsIDIxNDc0ODM2NDcpIFBhcmFtIE9wdGlt aXphdGlvbgorVGhlIG1heGltdW0gZWxlbWVudCBudW1iZXIgb2YgY2FjaGUtYXJyYXksIGFib3Zl IHdoaWNoIE1HTyB3aWxsIGJlIHN1cHByZXNzZWQuCisKIC1wYXJhbT1taW4tY3Jvc3NqdW1wLWlu c25zPQogQ29tbW9uIEpvaW5lZCBVSW50ZWdlciBWYXIocGFyYW1fbWluX2Nyb3NzanVtcF9pbnNu cykgSW5pdCg1KSBJbnRlZ2VyUmFuZ2UoMSwgNjU1MzYpIFBhcmFtIE9wdGltaXphdGlvbgogVGhl IG1pbmltdW0gbnVtYmVyIG9mIG1hdGNoaW5nIGluc3RydWN0aW9ucyB0byBjb25zaWRlciBmb3Ig Y3Jvc3NqdW1waW5nLgpkaWZmIC0tZ2l0IGEvZ2NjL3Bhc3Nlcy5kZWYgYi9nY2MvcGFzc2VzLmRl ZgppbmRleCBlOWVkM2M3YmM1Ny4uYjMyZjk4OGE3YmUgMTAwNjQ0Ci0tLSBhL2djYy9wYXNzZXMu ZGVmCisrKyBiL2djYy9wYXNzZXMuZGVmCkBAIC0yNjUsNiArMjY1LDcgQEAgYWxvbmcgd2l0aCBH Q0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKICAgICAgICAgICAvKiBCZWZv cmUgbG9vcF9pbml0IHdlIHJld3JpdGUgbm8gbG9uZ2VyIGFkZHJlc3NlZCBsb2NhbHMgaW50byBT U0EKIAkgICAgIGZvcm0gaWYgcG9zc2libGUuICAqLwogCSAgTkVYVF9QQVNTIChwYXNzX3RyZWVf bG9vcF9pbml0KTsKKwkgIE5FWFRfUEFTUyAocGFzc19sb29wX21nbyk7CiAJICBORVhUX1BBU1Mg KHBhc3NfdHJlZV91bnN3aXRjaCk7CiAJICBORVhUX1BBU1MgKHBhc3Nfc2Nldl9jcHJvcCk7CiAJ ICBORVhUX1BBU1MgKHBhc3NfbG9vcF9zcGxpdCk7CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRl L2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvZGVwLWxvYWQtMS5jIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwMC4uZDc2MjhlYTk2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nY2Mv dGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvZGVwLWxvYWQtMS5jCkBAIC0wLDAg KzEsMzkgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB7IHRhcmdldCBscDY0IH0gfSAqLworLyogeyBk Zy1vcHRpb25zICItTzMgLWZ0cmVlLWxvb3AtbWdvIC1mZHVtcC10cmVlLW1nby1kZXRhaWxzIiB9 ICovCisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiQ3JlYXRlIGZpZWxkOiAuKkwy X2wyX2JmIiAibWdvIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiQ3Jl YXRlIGZpZWxkOiAuKkwyX2wydV9pIiAibWdvIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2Fu LXRyZWUtZHVtcCAiQ3JlYXRlIGZpZWxkOiAuKkwzLiogZm9yIC4qbDNfaWEiICJtZ28iIH0gfSAq LworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJDcmVhdGUgZmllbGQ6IC4qTDMuKiBm b3IgLipsM19jYSIgIm1nbyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAg IkNyZWF0ZSBmaWVsZDogLipMM19pbDNfaTIiICJtZ28iIH0gfSAqLworLyogeyBkZy1maW5hbCB7 IHNjYW4tdHJlZS1kdW1wICJDcmVhdGUgZmllbGQ6IC4qTDMuKiBmb3IgLippbDNfaWEiICJtZ28i IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJDYWNoZSBlbGVtZW50IHNp emUgaXMgMjAgYnl0ZXMiICJtZ28iIH0gfSAqLworCisjaW5jbHVkZSAiLi4vbWdvLWNvbW1vbi5o IgorCisvKiBEZXBlbmRlbnQgbG9hZCBvZiBjb21wbGV4IHR5cGVzOiBiaXQtZmllbGQsIGFycmF5 LCB1bmlvbiwgbmVzdGVkIHN0cnVjdHVyZS4KKyAgIENhY2hlIGZpZWxkcyBhcmUgYWxzbyBzb3J0 ZWQgYnkgYWxpZ25tZW50cyB0byBzYXZlIG1lbW9yeSBzcGFjZS4gICovCisKK2ludAorZm9vIChp bnQgbiwgc2lnbmVkIG0sIEwxICphcnJheSkKK3sKKyAgaW50IHN1bSA9IDA7CisKKyAgZm9yIChp bnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBt OyBqKyspCisJeworCSAgTDIgKmwycCA9IGFycmF5W2pdLmwxX2wycDsKKwkgIHN1bSArPSBsMnAt PmwyX2JmOworCSAgc3VtICs9IGwycC0+bDJ1LmwydV9pOworCisJICBMMyAqbDNwID0gbDJwLT5s Ml9sM3A7CisJICBzdW0gKz0gbDNwLT5sM19pYVsyXTsKKwkgIHN1bSArPSBsM3AtPmwzX2NhWzNd OworCSAgc3VtICs9IGwzcC0+bDNfaXMuaWwzX2kyOworCSAgc3VtICs9IGwzcC0+bDNfaXMuaWwz X2lhWzFdOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHN1bTsKK30KZGlmZiAtLWdpdCBhL2djYy90 ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC0xMC5jIGIvZ2NjL3Rl c3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTEwLmMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjQzNzQxNDA2MzE2Ci0tLSAvZGV2L251bGwK KysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTEw LmMKQEAgLTAsMCArMSwyOCBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0 aW9ucyAiLU8zIC1mdHJlZS1sb29wLW1nbyAtZmR1bXAtdHJlZS1tZ28tZGV0YWlscyIgfSAqLwor CisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgIkNyZWF0ZSBmaWVsZDogLipMM19zYW1l X2lkX2lfY2ZfMCIgIm1nbyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAg IkNyZWF0ZSBmaWVsZDogLipMM19zYW1lX2lkX2lfY2ZfMSIgIm1nbyIgfSB9ICovCisKKyNpbmNs dWRlICIuLi9tZ28tY29tbW9uLmgiCisKKy8qIEZpZWxkcyBvZiBkaWZmZXJlbnQgbGV2ZWxzIGNh biBoYXZlIHRoZSBzYW1lIG5hbWUsIGFzIGVhY2ggbmV3IGZpZWxkIG5hbWUgaXMgYXBwZW5kZWQg YW4gdW5pcXVlIHByZWZpeCAgKi8KKworaW50Citmb28gKGludCBuLCBzaWduZWQgbSwgaW50IGlu dmFyLCBMMSAqYXJyYXkpCit7CisgIGludCBzdW0gPSAwOworCisgIGZvciAoaW50IGkgPSAwOyBp IDwgbjsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKQorCXsK KwkgIEwxICplbGVtID0gJmFycmF5W2pdOworCSAgc3VtICs9IGVsZW0tPmwxX2kxOworCSAgc3Vt ICs9IGVsZW0tPmwxX2wycC0+bDJfbDNwLT5zYW1lX2lkX2k7CisJICBzdW0gKz0gZWxlbS0+bDFf bDJwLT5sMl9sM29wLT5zYW1lX2lkX2k7CisJfQorICAgIH0KKworICByZXR1cm4gc3VtOworfQpk aWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1s b2FkLTIuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9kZXAtbG9h ZC0yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjc2NTI3MWM3OTZl Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2Fy cmF5L2RlcC1sb2FkLTIuYwpAQCAtMCwwICsxLDMxIEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAq LworLyogeyBkZy1vcHRpb25zICItTzMgLWZ0cmVlLWxvb3AtbWdvIC1mZHVtcC10cmVlLW1nby1k ZXRhaWxzIiB9ICovCisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAiQ3Jl YXRlIGZpZWxkOiAuKkwyX2wyX2kyIiAxICJtZ28iIH0gfSAqLworCisjaW5jbHVkZSAiLi4vbWdv LWNvbW1vbi5oIgorCisvKiBtZXJnZSBpZGVudGljYWwgZGVwIGxvYWQgICovCisKK2ludAorZm9v IChpbnQgbiwgc2lnbmVkIG0sIEwxICphcnJheSkKK3sKKyAgaW50IHN1bSA9IDA7CisKKyAgZm9y IChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGog PCBtOyBqKyspCisJeworCSAgTDIgKmwycCA9IGFycmF5W2pdLmwxX2wycDsKKwkgIGludCB0bXAg PSBsMnAtPmwyX2kxOworCSAgc3VtICs9IHRtcDsKKworCSAgaWYgKHRtcCAlIDQpCisJICAgIHN1 bSArPSBsMnAtPmwyX2kyOworCSAgZWxzZSBpZiAodG1wICUgNSkKKwkgICAgc3VtICs9IGwycC0+ bDJfaTI7CisJfQorICAgIH0KKworICByZXR1cm4gc3VtOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rl c3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTMuYyBiL2djYy90ZXN0 c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC0zLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjI3Mjc0NDgyMDI5Ci0tLSAvZGV2L251bGwKKysr IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTMuYwpA QCAtMCwwICsxLDMxIEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25z ICItTzMgLWZ0cmVlLWxvb3AtbWdvIC1mZHVtcC10cmVlLW1nby1kZXRhaWxzIiB9ICovCisKKy8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiUHJ1bmluZyBtYXktdHJhcCBkZXBlbmRlbnQg bG9hZHMiICJtZ28iIH0gfSAqLworCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtbm90 ICJDcmVhdGUgZmllbGQ6IC4qTDNfbDNfaTIiICJtZ28iIH0gfSAqLworCisjaW5jbHVkZSAiLi4v bWdvLWNvbW1vbi5oIgorCisvKiBwcnVuZSBtYXktdHJhcCBkZXAgbG9hZCAqLworCitpbnQKK2Zv byAoaW50IG4sIHNpZ25lZCBtLCBMMSAqYXJyYXkpCit7CisgIGludCBzdW0gPSAwOworCisgIGZv ciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoTDEgKmVsZW0gPSBh cnJheTsgZWxlbSA8IGFycmF5ICsgbTsgZWxlbSsrKQorCXsKKwkgIHN1bSArPSBlbGVtLT5sMV9p MTsKKwkgIHN1bSArPSBlbGVtLT5sMV9sMnAtPmwyX2kyOworCSAgc3VtICs9IGVsZW0tPmwxX2wy cC0+bDJfaTE7CisJICBpZiAoc3VtICUgMykKKwkgICAgY29udGludWU7CisJICBzdW0gKz0gZWxl bS0+bDFfbDJwLT5sMl9sM3AtPmwzX2kyOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHN1bTsKK30K ZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9kZXAt bG9hZC00LmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvZGVwLWxv YWQtNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5kNjE3Y2JmMmY2 MgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9h cnJheS9kZXAtbG9hZC00LmMKQEAgLTAsMCArMSwzMyBAQAorLyogeyBkZy1kbyBjb21waWxlIH0g Ki8KKy8qIHsgZGctb3B0aW9ucyAiLU8zIC1mdHJlZS1sb29wLW1nbyAtZmR1bXAtdHJlZS1tZ28t ZGV0YWlscyIgfSAqLworCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgIkNyZWF0ZSBm aWVsZDogLipMMl9sMnVfYyIgIm1nbyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVl LWR1bXAgIkNyZWF0ZSBmaWVsZDogLipMMl9sMnVfZiIgIm1nbyIgfSB9ICovCisvKiB7IGRnLWZp bmFsIHsgc2Nhbi10cmVlLWR1bXAgIkNyZWF0ZSBmaWVsZDogLipMMl9sMnVfaSIgIm1nbyIgfSB9 ICovCisKKyNpbmNsdWRlICIuLi9tZ28tY29tbW9uLmgiCisKKy8qIERlcGVuZGVudCBsb2FkIG9m IGNvbXBsZXggdHlwZXM6IGRpZmZlcmVudCB0eXBlcyBpbiBhIFVuaW9uICAqLworCitpbnQKK2Zv byAoaW50IG4sIHNpZ25lZCBtLCBMMSAqYXJyYXkpCit7CisgIGludCBzdW0gPSAwOworCisgIGZv ciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBq IDwgbTsgaisrKQorCXsKKwkgIEwyICpsMnAgPSBhcnJheVtqXS5sMV9sMnA7CisJICBpbnQgdG1w ID0gbDJwLT5sMnUubDJ1X2M7CisJICBzdW0gKz0gdG1wOworCisJICBpZiAodG1wICUgNCkKKwkg ICAgc3VtICs9IGwycC0+bDJ1LmwydV9pOworCSAgZWxzZSBpZiAodG1wICUgNSkKKwkgICAgc3Vt ICs9IGwycC0+bDJ1LmwydV9mOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHN1bTsKK30KZGlmZiAt LWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC01 LmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvZGVwLWxvYWQtNS5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5jYmRiZTE4NzIzYwotLS0g L2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9k ZXAtbG9hZC01LmMKQEAgLTAsMCArMSwzMyBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8q IHsgZGctb3B0aW9ucyAiLU8zIC1mdHJlZS1sb29wLW1nbyAtZmR1bXAtdHJlZS1tZ28tZGV0YWls cyIgfSAqLworCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgIkFkZHJlc3MgY29tcHV0 YXRpb24gc3RtdHMiICJtZ28iIH0gfSAqLworCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1 bXAgIkNyZWF0ZSBmaWVsZDogLipMMyIgIm1nbyIgfSB9ICovCisKKyNpbmNsdWRlICJzdGRsaWIu aCIKKyNpbmNsdWRlICIuLi9tZ28tY29tbW9uLmgiCisKKy8qIEhhbmRsZSBjb21wbGV4IGFkZHJl c3MgY29tcHV0YXRpb25zICovCisKK3ZvaWQgYmFyKGludCAqKTsKKworaW50Citmb28gKGludCBu LCBzaWduZWQgbSwgTDEgKmFycmF5KQoreworICBpbnQgc3VtID0gMDsKKyAgaW50ICpsb2NhbF9h cnJheSA9IChpbnQgKikgY2FsbG9jKG0sIHNpemVvZihpbnQpKTsKKyAgYmFyKGxvY2FsX2FycmF5 KTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICBmb3IgKGlu dCBqID0gMDsgaiA8IG07IGorKykKKwl7CisJICBMMiAqbDJwID0gYXJyYXlbal0ubDFfbDJwOwor CSAgaW50IHRtcCA9IGwycC0+bDJfaTI7CisJICBzdW0gKz0gbG9jYWxfYXJyYXlbdG1wICsgM107 CisJfQorICAgIH0KKworICByZXR1cm4gc3VtOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTYuYyBiL2djYy90ZXN0c3VpdGUv Z2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC02LmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAuLjNiMWUyY2RmNTJkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2RlcC1sb2FkLTYuYwpAQCAtMCww ICsxLDI5IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzMg LWZ0cmVlLWxvb3AtbWdvIC1mZHVtcC10cmVlLW1nby1kZXRhaWxzIiB9ICovCisKKy8qIHsgZGct ZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiUHJ1bmluZyBtYXktdHJhcCBkZXBlbmRlbnQgbG9hZHMi ICJtZ28iIH0gfSAqLworCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtbm90ICJDcmVh dGUgZmllbGQ6IC4qTDNfbDNfdmxhIiAibWdvIiB9IH0gKi8KKworI2luY2x1ZGUgIi4uL21nby1j b21tb24uaCIKKworLyogUHJ1bmUgbWF5IHRyYXBwZWQgbG9hZDogdmFyaWFibGUtbGVuZ3RoIGFy cmF5ICovCisKK2ludAorZm9vIChpbnQgbiwgc2lnbmVkIG0sIEwxICphcnJheSkKK3sKKyAgaW50 IHN1bSA9IDA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAg Zm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCisJeworCSAgTDMgKmwzcCA9IGFycmF5W2pdLmwx X2wycC0+bDJfbDNwOworCSAgc3VtICs9IGwzcC0+bDNfaTI7CisJICBpZiAobDNwLT5sM19pMSkK KwkgICAgc3VtICs9IGwzcC0+bDNfdmxhWzE2XTsKKwl9CisgICAgfQorCisgIHJldHVybiBzdW07 Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkv ZGVwLWxvYWQtNy5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2Rl cC1sb2FkLTcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOGQ0MjVl ZTM2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9t Z28vYXJyYXkvZGVwLWxvYWQtNy5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIHsgZGctZG8gY29tcGls ZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMyAtZnRyZWUtbG9vcC1tZ28gLWZkdW1wLXRyZWUt bWdvLWRldGFpbHMiIH0gKi8KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJDcmVh dGUgZmllbGQ6IC4qTDNfbDFfaTEiICJtZ28iIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4t dHJlZS1kdW1wICJDcmVhdGUgZmllbGQ6IC4qTDJfbDJfaTEiICJtZ28iIH0gfSAqLworCisjaW5j bHVkZSAic3RkbGliLmgiCisjaW5jbHVkZSAiLi4vbWdvLWNvbW1vbi5oIgorCisvKiBEaWZmZXJl bnQgbGV2ZWxzIG9mIGxvY2FsIGFycmF5IGxvYWRzICovCisKK3ZvaWQgYmFyKEwxICopOworCitp bnQKK2ZvbyAoaW50IG4sIHNpZ25lZCBtLCBMMSAqYXJyYXkpCit7CisgIGludCBzdW0gPSAwOwor ICBMMSAqbG9jYWxfYXJyYXkgPSAoTDEgKikgY2FsbG9jKG0sIHNpemVvZihMMSkpOworICBiYXIo bG9jYWxfYXJyYXkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAg ICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKQorCXsKKwkgIEwyICpsMnAgPSBhcnJheVtq XS5sMV9sMnA7CisJICBpbnQgdG1wID0gbDJwLT5sMl9pMjsKKwkgIHN1bSArPSBsb2NhbF9hcnJh eVt0bXAgKyAzXS5sMV9pMTsKKwkgIHN1bSArPSBsb2NhbF9hcnJheVtqXS5sMV9sMnAtPmwyX2kx OworCX0KKyAgICB9CisKKyAgcmV0dXJuIHN1bTsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3Vp dGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC04LmMgYi9nY2MvdGVzdHN1aXRl L2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvZGVwLWxvYWQtOC5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwLi42NGYxMDY4YTQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2dj Yy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9kZXAtbG9hZC04LmMKQEAgLTAs MCArMSwyNyBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8z IC1mdHJlZS1sb29wLW1nbyAtZmR1bXAtdHJlZS1tZ28tZGV0YWlscyIgfSAqLworCisvKiB7IGRn LWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgIkFwcGx5IG1nbyB0byBkZXBlbmRlbnQgbG9hZCIgIm1n byIgfSB9ICovCisKKyNpbmNsdWRlICIuLi9tZ28tY29tbW9uLmgiCisKKy8qIEFkZHJlc3MgY29t cHV0YXRpb24gbWF5IGNvbnRhaW4gaW52YXJpYW50IChpLmUuIGludmFyKSAqLworCitpbnQKK2Zv byAoaW50IG4sIHNpZ25lZCBtLCBpbnQgaW52YXIsIEwxICphcnJheSkKK3sKKyAgaW50IHN1bSA9 IDA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgZm9yIChp bnQgaiA9IDA7IGogPCBtOyBqKyspCisJeworCSAgTDEgKmVsZW0gPSAmYXJyYXlbaiArIGludmFy XTsKKwkgIHN1bSArPSBlbGVtLT5sMV9pMTsKKwkgIHN1bSArPSBlbGVtLT5sMV9sMnAtPmwyX2kx OworCSAgc3VtICs9IGVsZW0tPmwxX2wycC0+bDJfbDNwLT5sM19pMjsKKwl9CisgICAgfQorCisg IHJldHVybiBzdW07Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNz YS9tZ28vYXJyYXkvZGVwLWxvYWQtOS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2Ev bWdvL2FycmF5L2RlcC1sb2FkLTkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwMC4uYmU5MDViYTY5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5k Zy90cmVlLXNzYS9tZ28vYXJyYXkvZGVwLWxvYWQtOS5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIHsg ZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMyAtZnRyZWUtbG9vcC1tZ28g LWZkdW1wLXRyZWUtbWdvLWRldGFpbHMiIH0gKi8KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJl ZS1kdW1wICJBcHBseSBtZ28gdG8gZGVwZW5kZW50IGxvYWQiICJtZ28iIH0gfSAqLworCisjaW5j bHVkZSAiLi4vbWdvLWNvbW1vbi5oIgorCisvKiBBZGRyZXNzIGNvbXB1dGF0aW9uIG1heSBiZSBj b21wbGV4ICovCisKK2ludAorZm9vIChpbnQgbiwgc2lnbmVkIG0sIGludCBpbnZhciwgTDEgKmFy cmF5KQoreworICBpbnQgc3VtID0gMDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykK KyAgICB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykKKwl7CisJICBMMSAqZWxl bSA9ICZhcnJheVtqICogMiArIGludmFyXTsKKwkgIHN1bSArPSBlbGVtLT5sMV9pMTsKKwkgIHN1 bSArPSBlbGVtLT5sMV9sMnAtPmwyX2kxOworCSAgc3VtICs9IGVsZW0tPmwxX2wycC0+bDJfbDNw LT5sM19pMjsKKwl9CisgICAgfQorCisgIHJldHVybiBzdW07Cit9CmRpZmYgLS1naXQgYS9nY2Mv dGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvaW5keC1pdGVyLTEuYyBiL2djYy90 ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9pbmR4LWl0ZXItMS5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4xMjgxNzZhYWU4OAotLS0gL2Rldi9udWxs CisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9pbmR4LWl0ZXIt MS5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9w dGlvbnMgIi1PMyAtZnRyZWUtbG9vcC1tZ28gLWZkdW1wLXRyZWUtbWdvLWRldGFpbHMiIH0gKi8K KworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLW5vdCAiaXRlcmF0b3IgZm91bmQgaW4g bG9vcCIgIm1nbyIgfSB9ICovCisKKyNpbmNsdWRlICIuLi9tZ28tY29tbW9uLmgiCisKKy8qIFVu c3VwcG9ydGVkIGl0ZXJhdG9yOiB0aGUgbnVtYmVyIG9mIGl0ZXJhdG9yIGlzIHVua293biAqLwor CitpbnQKK2ZvbyAoaW50IG4sIHNpZ25lZCBtLCBMMSAqYXJyYXkpCit7CisgIGludCBzdW0gPSAw OworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoaW50 IGogPSAwOyBqIDwgbTsgaisrKQorCXsKKwkgIEwxICplbGVtID0gJmFycmF5W2pdOworCSAgc3Vt ICs9IGVsZW0tPmwxX2kxOworCSAgc3VtICs9IGVsZW0tPmwxX2wycC0+bDJfaTE7CisJICBzdW0g Kz0gZWxlbS0+bDFfbDJwLT5sMl9sM3AtPmwzX2kyOworCisJICBpZiAobSAlIDMpCisJICAgIGog Kz0gMTsKKwl9CisgICAgfQorCisgIHJldHVybiBzdW07Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVz dHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvaW5keC1pdGVyLTIuYyBiL2djYy90ZXN0 c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9pbmR4LWl0ZXItMi5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi43NWI1YTUxZTgzMAotLS0gL2Rldi9udWxsCisr KyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9pbmR4LWl0ZXItMi5j CkBAIC0wLDAgKzEsMjcgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlv bnMgIi1PMyAtZnRyZWUtbG9vcC1tZ28gLWZkdW1wLXRyZWUtbWdvLWRldGFpbHMiIH0gKi8KKwor LyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLW5vdCAiaXRlcmF0b3IgZm91bmQgaW4gbG9v cCIgIm1nbyIgfSB9ICovCisKKyNpbmNsdWRlICIuLi9tZ28tY29tbW9uLmgiCisKKy8qIFVuc3Vw cG9ydGVkIGl0ZXJhdG9yOiBzdHJpZGUgc2hvdWxkIGJlIGludGVnZXIgY29uc3QgKi8KKworaW50 Citmb28gKGludCBuLCBzaWduZWQgbSwgc2lnbmVkIGssIEwxICphcnJheSkKK3sKKyAgaW50IHN1 bSA9IDA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgZm9y IChpbnQgaiA9IDA7IGogPCBtOyBqKz1rKQorCXsKKwkgIEwxICplbGVtID0gJmFycmF5W2pdOwor CSAgc3VtICs9IGVsZW0tPmwxX2kxOworCSAgc3VtICs9IGVsZW0tPmwxX2wycC0+bDJfaTE7CisJ ICBzdW0gKz0gZWxlbS0+bDFfbDJwLT5sMl9sM3AtPmwzX2kyOworCX0KKyAgICB9CisKKyAgcmV0 dXJuIHN1bTsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21n by9hcnJheS9pbmR4LWl0ZXItMy5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdv L2FycmF5L2luZHgtaXRlci0zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw MDAuLmZhNDIwMDQxMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcv dHJlZS1zc2EvbWdvL2FycmF5L2luZHgtaXRlci0zLmMKQEAgLTAsMCArMSwyNyBAQAorLyogeyBk Zy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8zIC1mdHJlZS1sb29wLW1nbyAt ZmR1bXAtdHJlZS1tZ28tZGV0YWlscyIgfSAqLworCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVl LWR1bXAgIml0ZXJhdG9yIGZvdW5kIGluIGxvb3AiICJtZ28iIH0gfSAqLworCisjaW5jbHVkZSAi Li4vbWdvLWNvbW1vbi5oIgorCisvKiBJdGVyYXRvciBvZiBzdHJpZGUgb3RoZXIgdGhhbiAxICov CisKK2ludAorZm9vIChpbnQgbiwgc2lnbmVkIG0sIEwxICphcnJheSkKK3sKKyAgaW50IHN1bSA9 IDA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgZm9yIChp bnQgaiA9IDA7IGogPCBtOyBqKz01KQorCXsKKwkgIEwxICplbGVtID0gJmFycmF5W2pdOworCSAg c3VtICs9IGVsZW0tPmwxX2kxOworCSAgc3VtICs9IGVsZW0tPmwxX2wycC0+bDJfaTE7CisJICBz dW0gKz0gZWxlbS0+bDFfbDJwLT5sMl9sM3AtPmwzX2kyOworCX0KKyAgICB9CisKKyAgcmV0dXJu IHN1bTsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9h cnJheS9pbmR4LWl0ZXItNC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2Fy cmF5L2luZHgtaXRlci00LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAu LmE0YzhmNjFjZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJl ZS1zc2EvbWdvL2FycmF5L2luZHgtaXRlci00LmMKQEAgLTAsMCArMSwyOSBAQAorLyogeyBkZy1k byBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8zIC1mdHJlZS1sb29wLW1nbyAtZmR1 bXAtdHJlZS1tZ28tZGV0YWlscyIgfSAqLworCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1 bXAtbm90ICJpdGVyYXRvciBmb3VuZCBpbiBsb29wIiAibWdvIiB9IH0gKi8KKworI2luY2x1ZGUg Ii4uL21nby1jb21tb24uaCIKKworLyogVW5zdXBwb3J0ZWQgSXRlcmF0b3I6IHRoZSBudW1iZXIg b2YgaXRlcmF0b3IgaXMgdW5rb3duICovCisKK2ludAorZm9vIChpbnQgbiwgc2lnbmVkIG0sIEwx ICphcnJheSkKK3sKKyAgaW50IHN1bSA9IDA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBp KyspCisgICAgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyApCisJeworCSAgTDEgKmVs ZW0gPSAmYXJyYXlbal07CisJICBzdW0gKz0gZWxlbS0+bDFfaTE7CisJICBzdW0gKz0gZWxlbS0+ bDFfbDJwLT5sMl9pMTsKKwkgIHN1bSArPSBlbGVtLT5sMV9sMnAtPmwyX2wzcC0+bDNfaTI7CisJ ICBpZiAoc3VtICUgMykKKwkgICAgaisrOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHN1bTsKK30K ZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9pbmR4 LWl0ZXItNS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2luZHgt aXRlci01LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjVlZjI3OGE2 NTAwCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdv L2FycmF5L2luZHgtaXRlci01LmMKQEAgLTAsMCArMSwyNyBAQAorLyogeyBkZy1kbyBjb21waWxl IH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8zIC1mdHJlZS1sb29wLW1nbyAtZmR1bXAtdHJlZS1t Z28tZGV0YWlscyIgfSAqLworCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgIml0ZXJh dG9yIGZvdW5kIGluIGxvb3AiICJtZ28iIH0gfSAqLworCisjaW5jbHVkZSAiLi4vbWdvLWNvbW1v bi5oIgorCisvKiBTdHJpZGUgbWF5IGJlIG5lZ2F0aXZlICovCisKK2ludAorZm9vIChpbnQgbiwg c2lnbmVkIG0sIEwxICphcnJheSkKK3sKKyAgaW50IHN1bSA9IDA7CisKKyAgZm9yIChpbnQgaSA9 IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgZm9yIChpbnQgaiA9IG07IGogPiAwOyBqLS0p CisJeworCSAgTDEgKmVsZW0gPSAmYXJyYXlbal07CisJICBzdW0gKz0gZWxlbS0+bDFfaTE7CisJ ICBzdW0gKz0gZWxlbS0+bDFfbDJwLT5sMl9pMTsKKwkgIHN1bSArPSBlbGVtLT5sMV9sMnAtPmwy X2wzcC0+bDNfaTI7CisJfQorICAgIH0KKworICByZXR1cm4gc3VtOworfQpkaWZmIC0tZ2l0IGEv Z2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L2luZHgtaXRlci02LmMgYi9n Y2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvaW5keC1pdGVyLTYuYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYWY5ZWVkMDcwOWIKLS0tIC9kZXYv bnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvaW5keC1p dGVyLTYuYwpAQCAtMCwwICsxLDI3IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBk Zy1vcHRpb25zICItTzMgLWZ0cmVlLWxvb3AtbWdvIC1mZHVtcC10cmVlLW1nby1kZXRhaWxzIiB9 ICovCisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC1ub3QgIml0ZXJhdG9yIGZvdW5k IGluIGxvb3AiICJtZ28iIH0gfSAqLworCisjaW5jbHVkZSAiLi4vbWdvLWNvbW1vbi5oIgorCisv KiBTdHJpZGUgaXMgdW5rb3duICovCisKK2ludAorZm9vIChpbnQgbiwgc2lnbmVkIG0sIEwxICph cnJheSkKK3sKKyAgaW50IHN1bSA9IDA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKysp CisgICAgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqICo9IDIpCisJeworCSAgTDEg KmVsZW0gPSAmYXJyYXlbal07CisJICBzdW0gKz0gZWxlbS0+bDFfaTE7CisJICBzdW0gKz0gZWxl bS0+bDFfbDJwLT5sMl9pMTsKKwkgIHN1bSArPSBlbGVtLT5sMV9sMnAtPmwyX2wzcC0+bDNfaTI7 CisJfQorICAgIH0KKworICByZXR1cm4gc3VtOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L291dGVyLWxvb3AtMS5jIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L291dGVyLWxvb3AtMS5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi42MDU2ZTg3ZTI0MAotLS0gL2Rldi9udWxsCisrKyBi L2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9vdXRlci1sb29wLTEuYwpA QCAtMCwwICsxLDMxIEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25z ICItTzMgLWZ0cmVlLWxvb3AtbWdvIC1mZHVtcC10cmVlLW1nby1kZXRhaWxzIiB9ICovCisKKy8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiRmluYWwgbWdvIG91dGVyIGxvb3AgMSIgIm1n byIgfSB9ICovCisKKyNpbmNsdWRlICIuLi9tZ28tY29tbW9uLmgiCisKKy8qIEZpbmFsIG91dGVy IGxvb3AgaXMgdGhlIG91dGVybW9zdCBsb29wIGFzIGl0IGhhcyB0aGUgYmVzdCBwZXJmb3JtYW5j ZSAqLworCitpbnQKK2ZvbyAoaW50IG4sIHNpZ25lZCBtLCBzaWduZWQgbywgTDEgKmFycmF5KQor eworICBpbnQgc3VtID0gMDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICB7 CisgICAgICBhcnJheVtpXS5sMV9pMSA9IDE7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG07 IGorKykKKwl7CisJICBmb3IgKGludCBrID0gMDsgayA8IG87IGsrKykKKwkgICAgeworCSAgICAg IEwxICplbGVtID0gJmFycmF5W2tdOworCSAgICAgIHN1bSArPSBlbGVtLT5sMV9pMTsKKwkgICAg ICBzdW0gKz0gZWxlbS0+bDFfbDJwLT5sMl9pMTsKKwkgICAgICBzdW0gKz0gZWxlbS0+bDFfbDJw LT5sMl9sM3AtPmwzX2kyOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gc3VtOworfQpk aWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L291dGVy LWxvb3AtMi5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L291dGVy LWxvb3AtMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4wODA5OGM5 OTA1NAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21n by9hcnJheS9vdXRlci1sb29wLTIuYwpAQCAtMCwwICsxLDMzIEBACisvKiB7IGRnLWRvIGNvbXBp bGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzMgLWZ0cmVlLWxvb3AtbWdvIC1mZHVtcC10cmVl LW1nby1kZXRhaWxzIiB9ICovCisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiRmlu YWwgbWdvIG91dGVyIGxvb3AgMiIgIm1nbyIgfSB9ICovCisKKyNpbmNsdWRlICIuLi9tZ28tY29t bW9uLmgiCisKKy8qIEZpbmFsIG91dGVyIGxvb3AgaXMgYWZmZWN0ZWQgYnkgYWxpYXMgY2xvYmJl ciAqLworCit2b2lkIGJhcigpOworCitpbnQKK2ZvbyAoaW50IG4sIHNpZ25lZCBtLCBzaWduZWQg bywgTDEgKmFycmF5KQoreworICBpbnQgc3VtID0gMDsKKworICBmb3IgKGludCBpID0gMDsgaSA8 IG47IGkrKykKKyAgICB7CisgICAgICBiYXIoKTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwg bTsgaisrKQorCXsKKwkgIGZvciAoaW50IGsgPSAwOyBrIDwgbzsgaysrKQorCSAgICB7CisJICAg ICAgTDEgKmVsZW0gPSAmYXJyYXlba107CisJICAgICAgc3VtICs9IGVsZW0tPmwxX2kxOworCSAg ICAgIHN1bSArPSBlbGVtLT5sMV9sMnAtPmwyX2kxOworCSAgICAgIHN1bSArPSBlbGVtLT5sMV9s MnAtPmwyX2wzcC0+bDNfaTI7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiBzdW07Cit9 CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvb3V0 ZXItbG9vcC0zLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvb3V0 ZXItbG9vcC0zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmY0NzBj NDMwNWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2Ev bWdvL2FycmF5L291dGVyLWxvb3AtMy5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIHsgZGctZG8gY29t cGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMyAtZnRyZWUtbG9vcC1tZ28gLWZkdW1wLXRy ZWUtbWdvLWRldGFpbHMiIH0gKi8KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJG aW5hbCBtZ28gb3V0ZXIgbG9vcCAyIiAibWdvIiB9IH0gKi8KKworI2luY2x1ZGUgIi4uL21nby1j b21tb24uaCIKKworLyogRmluYWwgb3V0ZXIgbG9vcCBpcyBhZmZlY3RlZCBieSBjb3N0ICovCisK K3ZvaWQKK2JhciAoKTsKKworaW50Citmb28gKGludCBuLCBzaWduZWQgbSwgc2lnbmVkIG8sIEwx ICphcnJheSwgaW50ICpvdGhlcl92YWwpCit7CisgIGludCBzdW0gPSAwOworCisgIGZvciAoaW50 IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgIC8qIER5bmFtaWMgYWxpYXMgY2hlY2sg d2lsbCBpbnRyb2R1Y2UgYWRkaXRpb25hbCBjb3N0ICovCisgICAgICAqb3RoZXJfdmFsID0gMTsK KyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKQorCXsKKwkgIGZvciAoaW50IGsgPSAw OyBrIDwgbzsgaysrKQorCSAgICB7CisJICAgICAgTDEgKmVsZW0gPSAmYXJyYXlba107CisJICAg ICAgc3VtICs9IGVsZW0tPmwxX2kxOworCSAgICAgIHN1bSArPSBlbGVtLT5sMV9sMnAtPmwyX2kx OworCSAgICAgIHN1bSArPSBlbGVtLT5sMV9sMnAtPmwyX2wzcC0+bDNfaTI7CisJICAgIH0KKwl9 CisgICAgfQorCisgIHJldHVybiBzdW07Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2dj Yy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvb3V0ZXItbG9vcC00LmMgYi9nY2MvdGVzdHN1aXRlL2dj Yy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvb3V0ZXItbG9vcC00LmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAuLjI2NDRlNzZkMTkzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L291dGVyLWxvb3AtNC5jCkBAIC0w LDAgKzEsMzkgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1P MyAtZnRyZWUtbG9vcC1tZ28gLWZkdW1wLXRyZWUtbWdvLWRldGFpbHMiIH0gKi8KKworLyogeyBk Zy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJGaW5hbCBtZ28gb3V0ZXIgbG9vcCAyIiAibWdvIiB9 IH0gKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIi4uL21nby1jb21tb24uaCIK KworLyogRmluYWwgb3V0ZXIgbG9vcCBpcyBhZmZlY3RlZCBieSBpbnZhcmlhbnQgKi8KKwordm9p ZAorYmFyIChMMSAqKTsKKworaW50Citmb28gKGludCBuLCBzaWduZWQgbSwgc2lnbmVkIG8pCit7 CisgIGludCBzdW0gPSAwOworCisgIGZvciAoaW50IGlpID0gMDsgaWkgPCBuOyBpaSsrKQorICAg IHsKKyAgICAgIEwxICphcnJheSA9IChMMSAqKSBjYWxsb2MgKG8sIHNpemVvZiAoTDEpKTsKKwor ICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisJeworCSAgZm9yIChpbnQgaiA9IDA7 IGogPCBtOyBqKyspCisJICAgIHsKKwkgICAgICBmb3IgKGludCBrID0gMDsgayA8IG87IGsrKykK KwkJeworCQkgIEwxICplbGVtID0gJmFycmF5W2tdOworCQkgIHN1bSArPSBlbGVtLT5sMV9pMTsK KwkJICBzdW0gKz0gZWxlbS0+bDFfbDJwLT5sMl9pMTsKKwkJICBzdW0gKz0gZWxlbS0+bDFfbDJw LT5sMl9sM3AtPmwzX2kyOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiBzdW07 Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkv b3V0ZXItbG9vcC01LmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkv b3V0ZXItbG9vcC01LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmIz ZGUxMzgyOGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1z c2EvbWdvL2FycmF5L291dGVyLWxvb3AtNS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIHsgZGctZG8g Y29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMyAtZnRyZWUtbG9vcC1tZ28gLWZkdW1w LXRyZWUtbWdvLWRldGFpbHMiIH0gKi8KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1w ICJGaW5hbCBtZ28gb3V0ZXIgbG9vcCAyIiAibWdvIiB9IH0gKi8KKworI2luY2x1ZGUgPHN0ZGxp Yi5oPgorI2luY2x1ZGUgIi4uL21nby1jb21tb24uaCIKKworLyogRmluYWwgb3V0ZXIgbG9vcCBp cyBhZmZlY3RlZCBieSBpbnZhcmlhbnQgKi8KKwordm9pZAorYmFyIChMMSAqKTsKKworaW50Citm b28gKGludCBuLCBzaWduZWQgbSwgc2lnbmVkIG8sIEwxICphcnJheSkKK3sKKyAgaW50IHN1bSA9 IDA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgaW50IGlu dmFyID0gaTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKQorCXsKKwkgIGZvciAo aW50IGsgPSAwOyBrIDwgbzsgaysrKQorCSAgICB7CisJICAgICAgTDEgKmVsZW0gPSAmYXJyYXlb ayArIGludmFyXTsKKwkgICAgICBzdW0gKz0gZWxlbS0+bDFfaTE7CisJICAgICAgc3VtICs9IGVs ZW0tPmwxX2wycC0+bDJfaTE7CisJICAgICAgc3VtICs9IGVsZW0tPmwxX2wycC0+bDJfbDNwLT5s M19pMjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIHN1bTsKK30KZGlmZiAtLWdpdCBh L2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9wYXJhbS0xLmMgYi9nY2Mv dGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvcGFyYW0tMS5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4yYmRmOGU5NjFhOQotLS0gL2Rldi9udWxsCisr KyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9hcnJheS9wYXJhbS0xLmMKQEAg LTAsMCArMSwyNyBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAi LU8zIC1mdHJlZS1sb29wLW1nbyAtZmR1bXAtdHJlZS1tZ28tZGV0YWlscyAtLXBhcmFtIG1nby1t aW4tY2FjaGUtYXJyYXktbGVuZ3RoPTMyIC0tcGFyYW0gbWdvLW1heC1jYWNoZS1hcnJheS1sZW5n dGg9MTI4ICIgfSAqLworCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgIlxcKyAxODQ0 Njc0NDA3MzcwOTU1MTU4NCIgIm1nbyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVl LWR1bXAgIjw9IDk2IiAibWdvIiB9IH0gKi8KKworI2luY2x1ZGUgIi4uL21nby1jb21tb24uaCIK KworLyogTUdPIGlzIGRpc2FibGVkIGlmIHRoZSBwYXJhbXMgb2YgbWdvLXh4eC1jYWNoZS1hcnJh eS1sZW5ndGggYXJlIHVucmVhc29uYWJsZSAqLworCitpbnQKK2ZvbyAoaW50IG4sIHNpZ25lZCBt LCBMMSAqYXJyYXkpCit7CisgIGludCBzdW0gPSAwOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwg bjsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKQorCXsKKwkg IEwxICplbGVtID0gJmFycmF5W2pdOworCSAgc3VtICs9IGVsZW0tPmwxX2wycC0+bDJfaTE7CisJ ICBzdW0gKz0gZWxlbS0+bDFfbDJwLT5sMl9sM3AtPmwzX2kyOworCX0KKyAgICB9CisKKyAgcmV0 dXJuIHN1bTsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21n by9hcnJheS9wYXJhbS0yLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJy YXkvcGFyYW0tMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5mM2Fi OTAzMGJhMQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3Nh L21nby9hcnJheS9wYXJhbS0yLmMKQEAgLTAsMCArMSwyOCBAQAorLyogeyBkZy1kbyBjb21waWxl IH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8zIC1mdHJlZS1sb29wLW1nbyAtZmR1bXAtdHJlZS1t Z28tZGV0YWlscyAtLXBhcmFtIG1nby1tYXgtZGVwLWxvYWQtbGV2ZWw9MyIgfSAqLworCisvKiB7 IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgIkFwcGx5IG1nbyB0byBkZXBlbmRlbnQgbG9hZCIg Im1nbyIgfSB9ICovCisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC1ub3QgImxldmVs IDQiICJtZ28iIH0gfSAqLworCisjaW5jbHVkZSAiLi4vbWdvLWNvbW1vbi5oIgorCisvKiBtZ28t bWF4LWRlcC1sb2FkLWxldmVsOiB0byBsaW1pdCBkZXAgbG9hZCBsZXZlbCAqLworCitpbnQKK2Zv byAoaW50IG4sIHNpZ25lZCBtLCBMMSAqYXJyYXkpCit7CisgIGludCBzdW0gPSAwOworCisgIGZv ciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBq IDwgbTsgaisrKQorCXsKKwkgIEwxICplbGVtID0gJmFycmF5W2pdOworCSAgc3VtICs9IGVsZW0t PmwxX2wycC0+bDJfbDNwLT5sM19pMjsKKwkgIHN1bSArPSBlbGVtLT5sMV9sMnAtPmwyX2wzcC0+ bDNfbDRwLT5sNF9pMTsKKwl9CisgICAgfQorCisgIHJldHVybiBzdW07Cit9CmRpZmYgLS1naXQg YS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvcGFyYW0tMy5jIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L3BhcmFtLTMuYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uN2I4ZTQ3OWEyMGQKLS0tIC9kZXYvbnVsbAor KysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvcGFyYW0tMy5jCkBA IC0wLDAgKzEsMjYgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB7IHRhcmdldCBscDY0IH0gfSAqLwor LyogeyBkZy1vcHRpb25zICItTzMgLWZ0cmVlLWxvb3AtbWdvIC1mZHVtcC10cmVlLW1nby1kZXRh aWxzIC0tcGFyYW0gbWdvLW1heC1jYWNoZS1lbGVtLXNpemU9OCIgfSAqLworCisvKiB7IGRnLWZp bmFsIHsgc2Nhbi10cmVlLWR1bXAgIk92ZXItbGFyZ2UgY2FjaGUgZWxlbWVudCBzaXplOiAxMiIg Im1nbyIgfSB9ICovCisKKyNpbmNsdWRlICIuLi9tZ28tY29tbW9uLmgiCisKKy8qIG1nby1tYXgt Y2FjaGUtZWxlbS1zaXplOiB0byBsaW1pdCBjYWNoZSBlbGVtZW50IHNpemUgKi8KKworaW50Citm b28gKGludCBuLCBzaWduZWQgbSwgTDEgKmFycmF5KQoreworICBpbnQgc3VtID0gMDsKKworICBm b3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICBmb3IgKGludCBqID0gMDsg aiA8IG07IGorKykKKwl7CisJICBMMSAqZWxlbSA9ICZhcnJheVtqXTsKKwkgIHN1bSArPSBlbGVt LT5sMV9sMnAtPmwyX2wzcC0+bDNfaTI7CisJICBzdW0gKz0gZWxlbS0+bDFfbDJwLT5sMl9sM3At PmwzX2w0cC0+bDRfaTE7CisJfQorICAgIH0KKworICByZXR1cm4gc3VtOworfQpkaWZmIC0tZ2l0 IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L3NpbXBsZS0xLmMgYi9n Y2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvc2ltcGxlLTEuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uM2QyYWNjZjNhOGMKLS0tIC9kZXYvbnVs bAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvc2ltcGxlLTEu YwpAQCAtMCwwICsxLDQ2IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgeyB0YXJnZXQgbHA2NCB9IH0g Ki8KKy8qIHsgZGctb3B0aW9ucyAiLU8zIC1mdHJlZS1sb29wLW1nbyAtZmR1bXAtdHJlZS1tZ28t ZGV0YWlscyIgfSAqLworCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgIml0ZXJhdG9y IGZvdW5kIGluIGxvb3AiICJtZ28iIH0gfSAqLworCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVl LWR1bXAgIkFwcGx5IG1nbyB0byBkZXBlbmRlbnQgbG9hZCIgIm1nbyIgfSB9ICovCisvKiB7IGRn LWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgImxldmVsIDEgLipub3QgY2FjaGVkIiAibWdvIiB9IH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAibDFfbDJwIiAibWdvIiB9IH0gKi8K Ky8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAibGV2ZWwgMjoiICJtZ28iIH0gfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJsMl9pMSIgIm1nbyIgfSB9ICovCisvKiB7 IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgImxldmVsIDIgLipub3QgY2FjaGVkIiAibWdvIiB9 IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAibDJfbDNwIiAibWdvIiB9IH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAibGV2ZWwgMzoiICJtZ28iIH0gfSAq LworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJsM19pMiIgIm1nbyIgfSB9ICovCisK Ky8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiQ3JlYXRlIGZpZWxkOiAuKkwyX2wyX2kx IiAibWdvIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiQ3JlYXRlIGZp ZWxkOiAuKkwzX2wzX2kyIiAibWdvIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcCAiQ2FjaGUgZWxlbWVudCBzaXplIGlzIDEyIGJ5dGVzIiAibWdvIiB9IH0gKi8KKworLyog eyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJVc2UgbmV3IHZhbHVlOiAuKkwyX2wyX2kxLiog dG8gcmVwbGFjZSBvcmlnaW4gZGVwIGxvYWQiICJtZ28iIH0gfSAqLworLyogeyBkZy1maW5hbCB7 IHNjYW4tdHJlZS1kdW1wICJVc2UgbmV3IHZhbHVlOiAuKkwzX2wzX2kyLiogdG8gcmVwbGFjZSBv cmlnaW4gZGVwIGxvYWQiICJtZ28iIH0gfSAqLworCisjaW5jbHVkZSAiLi4vbWdvLWNvbW1vbi5o IgorCisvKiBBIHNpbXBsZSBjYXNlIG9mIGFuIGFycmF5IChpbnRlZ2VyIGFzIGl0ZXJhdG9yKSAq LworCitpbnQKK2ZvbyAoaW50IG4sIHNpZ25lZCBtLCBMMSAqYXJyYXkpCit7CisgIGludCBzdW0g PSAwOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgIGZvciAo aW50IGogPSAwOyBqIDwgbTsgaisrKQorCXsKKwkgIEwxICplbGVtID0gJmFycmF5W2pdOworCSAg LyogTGV2ZWwgMSBkZXBlbmRlbnQgbG9hZCBpcyBub3QgY2FjaGVkICovCisJICBzdW0gKz0gZWxl bS0+bDFfaTE7CisJICAvKiBEZXBlbmRlbnQgbG9hZHMgYXJlIGFjY2Vzc2VkIG11bHRpcGxlIHRp bWVzICovCisJICBzdW0gKz0gZWxlbS0+bDFfbDJwLT5sMl9pMTsKKwkgIHN1bSArPSBlbGVtLT5s MV9sMnAtPmwyX2wzcC0+bDNfaTI7CisJfQorICAgIH0KKworICByZXR1cm4gc3VtOworfQpkaWZm IC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L3NpbXBsZS0y LmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvc2ltcGxlLTIuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYWUwY2E5NTM0NGIKLS0tIC9k ZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvc2lt cGxlLTIuYwpAQCAtMCwwICsxLDI2IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBk Zy1vcHRpb25zICItTzMgLWZ0cmVlLWxvb3AtbWdvIC1mZHVtcC10cmVlLW1nby1kZXRhaWxzIiB9 ICovCisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiQXBwbHkgbWdvIHRvIGRlcGVu ZGVudCBsb2FkIiAibWdvIiB9IH0gKi8KKworI2luY2x1ZGUgIi4uL21nby1jb21tb24uaCIKKwor LyogQSBzaW1wbGUgY2FzZSBvZiBhbiBhcnJheSAocG9pbnRlciBhcyBpdGVyYXRvcikgKi8KKwor aW50Citmb28gKGludCBuLCBzaWduZWQgbSwgTDEgKmFycmF5KQoreworICBpbnQgc3VtID0gMDsK KworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICBmb3IgKEwxICpl bGVtID0gYXJyYXk7IGVsZW0gPCBhcnJheSArIG07IGVsZW0rKykKKwl7CisJICBzdW0gKz0gZWxl bS0+bDFfaTE7CisJICBzdW0gKz0gZWxlbS0+bDFfbDJwLT5sMl9pMTsKKwkgIHN1bSArPSBlbGVt LT5sMV9sMnAtPmwyX2wzcC0+bDNfaTI7CisJfQorICAgIH0KKworICByZXR1cm4gc3VtOworfQpk aWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL2FycmF5L3NpbXBs ZS0zLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkvc2ltcGxlLTMu YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMTg3NzAxNTNmOWEKLS0t IC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vYXJyYXkv c2ltcGxlLTMuYwpAQCAtMCwwICsxLDI1IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyog eyBkZy1vcHRpb25zICItTzMgLWZ0cmVlLWxvb3AtbWdvIC1mZHVtcC10cmVlLW1nby1kZXRhaWxz IiB9ICovCisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiQXBwbHkgbWdvIHRvIGRl cGVuZGVudCBsb2FkIiAibWdvIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVt cCAiQ3JlYXRlIGZpZWxkOiAuKkwzX3ZhbCIgIm1nbyIgfSB9ICovCisKK3R5cGVkZWYgc3RydWN0 IEMgeyBpbnQgdmFsOyB9IEM7Cit0eXBlZGVmIHN0cnVjdCBCIHsgQyAqcGM7IH0gQjsKK3R5cGVk ZWYgc3RydWN0IEEgeyBCICpwYjsgfSBBOworCisvKiBBIHNpbXBsZSBjYXNlIGZyb20gcHI5ODU5 OCAoaHR0cHM6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9OTg1OTgpICov CisKK2ludCBmb28gKGludCBuLCBpbnQgbSwgQSAqcGEpIHsKKyAgaW50IHN1bTsKKworICBmb3Ig KGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisr KSB7CisgICAgICBzdW0gKz0gcGFbal0ucGItPnBjLT52YWw7ICAvLyByZXBlYXRlZCAibiIgdGlt ZXMKKyAgICAgIHN1bSAlPSA3OworICAgIH0KKyAgICBzdW0gJT0gMTM7CisgIH0KKworICByZXR1 cm4gc3VtOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdv L2xpc3QvbGlzdC0xLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vbGlzdC9s aXN0LTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uN2Y4ZDkwN2Ew MTkKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28v bGlzdC9saXN0LTEuYwpAQCAtMCwwICsxLDI2IEBACisvKiB7IGRnLW9wdGlvbnMgIi1PMyAtZnRy ZWUtbG9vcC1tZ28gLWZkdW1wLXRyZWUtbWdvLWRldGFpbHMiIH0gKi8KKworI2luY2x1ZGUgIi4u L21nby1jb21tb24uaCIKKworaW50Citmb28gKGludCBuLCBOb2RlICpoZWFkKQoreworICBpbnQg c3VtID0gMDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICBO b2RlICppdGVyYXRvciA9IGhlYWQ7CisKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisr KQorCXsKKwkgIHN1bSArPSBpdGVyYXRvci0+bDFfbDJwLT5sMl9sM3AtPmwzX2NhWzBdOworCSAg c3VtICs9IGl0ZXJhdG9yLT5sMV9sMnAtPmwyX2wzcC0+bDNfaTE7CisJICBzdW0gKz0gaXRlcmF0 b3ItPmwxX2wycC0+bDJfbDNwLT5sM19jYVsyXTsKKwkgIGl0ZXJhdG9yID0gaXRlcmF0b3ItPm5l eHQ7CisJfQorICAgIH0KKworICByZXR1cm4gc3VtOworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi10cmVlLWR1bXAtdGltZXMgIkNyZWF0ZSBmaWVsZDoiIDMgIm1nbyIgfSB9ICovCmRpZmYgLS1n aXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vbWdvLWNvbW1vbi5oIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvdHJlZS1zc2EvbWdvL21nby1jb21tb24uaApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNjY5M2U3OTIyNjYKLS0tIC9kZXYvbnVsbAorKysg Yi9nY2MvdGVzdHN1aXRlL2djYy5kZy90cmVlLXNzYS9tZ28vbWdvLWNvbW1vbi5oCkBAIC0wLDAg KzEsNjEgQEAKK3R5cGVkZWYgc3RydWN0IEw0Cit7CisgIGludCBsNF9pMTsKKyAgaW50IGw0X2ky OworfSBMNDsKKwordHlwZWRlZiBzdHJ1Y3QgTDNfaW5uZXJfc3RydWN0Cit7CisgIGludCBpbDNf aWFbNF07CisgIGludCBpbDNfaTE7CisgIGludCBpbDNfaTI7Cit9IEwzX0lTOworCit0eXBlZGVm IHN0cnVjdCBMMworeworICBpbnQgbDNfaTE7CisgIGludCBsM19pYVs0XTsKKyAgTDNfSVMgbDNf aXM7CisgIGNoYXIgbDNfY2FbNV07CisgIGxvbmcgbDNfbDsKKyAgTDQgKmwzX2w0cDsKKyAgaW50 IGwzX2kyOworICBpbnQgc2FtZV9pZF9pOworICBjaGFyIGwzX3ZsYVswXTsgLy8gdmFyaWFibGUt bGVuZ3RoIGFycmF5Cit9IEwzOworCit0eXBlZGVmIHN0cnVjdCBMM28KK3sKKyAgaW50IHNhbWVf aWRfaTsKK30gTDNvOworCit0eXBlZGVmIHN0cnVjdCBMMgoreworICBpbnQgbDJfaTE7CisgIGlu dCBsMl9pMjsKKyAgaW50IGwyX2JmIDogMzsKKyAgdm9sYXRpbGUgaW50IGwyX3ZpOworICBMMyAq bDJfbDNwOworICBMM28gKmwyX2wzb3A7CisKKyAgdW5pb24KKyAgeworICAgIGNoYXIgbDJ1X2M7 CisgICAgaW50IGwydV9pOworICAgIGZsb2F0IGwydV9mOworICB9IGwydTsKK30gTDI7CisKKy8q IFRoZSBsZXZlbCAxIGRhdGEgc3RydWN0dXJlIG9mIGFycmF5ICovCit0eXBlZGVmIHN0cnVjdCBM MQoreworICBpbnQgbDFfaTE7CisgIEwyICpsMV9sMnA7Cit9IEwxOworCisvKiBUaGUgbGV2ZWwg MSBkYXRhIHN0cnVjdHVyZSBvZiBsaXN0LCBpLmUuIGxpc3Qgbm9kZS4gICovCit0eXBlZGVmIHN0 cnVjdCBOb2RlIHsKKyAgICBMMiAqbDFfbDJwOworICAgIHN0cnVjdCBOb2RlICpuZXh0OworICAg IGNoYXIgbDFfYzE7Cit9IE5vZGU7CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy90 cmVlLXNzYS9tZ28vbWdvLmV4cCBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9t Z28uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4wYzAwZmZhMzg1 NAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3RyZWUtc3NhL21nby9t Z28uZXhwCkBAIC0wLDAgKzEsMzggQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAyMCBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi eQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRo ZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAK KyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug Zm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggR0NDOyBzZWUg dGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisjIDxodHRwOi8vd3d3LmdudS5vcmcvbGlj ZW5zZXMvPi4KKworIyBHQ0MgdGVzdHN1aXRlIHRoYXQgdXNlcyB0aGUgYGRnLmV4cCcgZHJpdmVy LgorCisjIExvYWQgc3VwcG9ydCBwcm9jcy4KK2xvYWRfbGliIGdjYy1kZy5leHAKKworIyBJZiBh IHRlc3RjYXNlIGRvZXNuJ3QgaGF2ZSBzcGVjaWFsIG9wdGlvbnMsIHVzZSB0aGVzZS4KK2dsb2Jh bCBERUZBVUxUX0NGTEFHUworaWYgIVtpbmZvIGV4aXN0cyBERUZBVUxUX0NGTEFHU10gdGhlbiB7 CisgICAgc2V0IERFRkFVTFRfQ0ZMQUdTICIgLWFuc2kgLXBlZGFudGljLWVycm9ycyIKK30KKwor IyBJbml0aWFsaXplIGBkZycuCitkZy1pbml0CisKK2RnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1u b2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci9hcnJheS8qLmNdXSBcCisgICAgIiIgJERFRkFVTFRf Q0ZMQUdTIAorCitkZy1ydW50ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRz dWJkaXIvbGlzdC8qLmNdXSBcCisgICAgIiIgJERFRkFVTFRfQ0ZMQUdTIAorCisjIEFsbCBkb25l LgorZGctZmluaXNoCmRpZmYgLS1naXQgYS9nY2MvdGltZXZhci5kZWYgYi9nY2MvdGltZXZhci5k ZWYKaW5kZXggNjNjMGIzMzA2ZGUuLmQ1ZWYzZTJhZTQzIDEwMDY0NAotLS0gYS9nY2MvdGltZXZh ci5kZWYKKysrIGIvZ2NjL3RpbWV2YXIuZGVmCkBAIC0xOTYsNiArMTk2LDcgQEAgREVGVElNRVZB UiAoVFZfU0NFVl9DT05TVCAgICAgICAgICAgICwgInNjZXYgY29uc3RhbnQgcHJvcCIpCiBERUZU SU1FVkFSIChUVl9UUkVFX0xPT1BfVU5TV0lUQ0ggICAgLCAidHJlZSBsb29wIHVuc3dpdGNoaW5n IikKIERFRlRJTUVWQVIgKFRWX0xPT1BfU1BMSVQgICAgICAgICAgICAsICJsb29wIHNwbGl0dGlu ZyIpCiBERUZUSU1FVkFSIChUVl9MT09QX0pBTSAgICAgICAgICAgICAgLCAidW5yb2xsIGFuZCBq YW0iKQorREVGVElNRVZBUiAoVFZfTE9PUF9NR08gICAgICAgICAgICAgICwgImxvb3AgbWVtb3J5 IGdhdGhlcmluZyIpCiBERUZUSU1FVkFSIChUVl9DT01QTEVURV9VTlJPTEwgICAgICAgLCAiY29t cGxldGUgdW5yb2xsaW5nIikKIERFRlRJTUVWQVIgKFRWX1NDQUxBUl9DTEVBTlVQICAgICAgICAs ICJzY2FsYXIgY2xlYW51cCIpCiBERUZUSU1FVkFSIChUVl9UUkVFX1BBUkFMTEVMSVpFX0xPT1BT LCAidHJlZSBwYXJhbGxlbGl6ZSBsb29wcyIpCmRpZmYgLS1naXQgYS9nY2MvdHJlZS1wYXNzLmgg Yi9nY2MvdHJlZS1wYXNzLmgKaW5kZXggN2U5MDVlYTQ5ZWQuLjY2NGFjY2FjZDc0IDEwMDY0NAot LS0gYS9nY2MvdHJlZS1wYXNzLmgKKysrIGIvZ2NjL3RyZWUtcGFzcy5oCkBAIC0zNjcsNiArMzY3 LDcgQEAgZXh0ZXJuIGdpbXBsZV9vcHRfcGFzcyAqbWFrZV9wYXNzX3RyZWVfbG9vcCAoZ2NjOjpj b250ZXh0ICpjdHh0KTsKIGV4dGVybiBnaW1wbGVfb3B0X3Bhc3MgKm1ha2VfcGFzc190cmVlX25v X2xvb3AgKGdjYzo6Y29udGV4dCAqY3R4dCk7CiBleHRlcm4gZ2ltcGxlX29wdF9wYXNzICptYWtl X3Bhc3NfdHJlZV9sb29wX2luaXQgKGdjYzo6Y29udGV4dCAqY3R4dCk7CiBleHRlcm4gZ2ltcGxl X29wdF9wYXNzICptYWtlX3Bhc3NfbG9vcF92ZXJzaW9uaW5nIChnY2M6OmNvbnRleHQgKmN0eHQp OworZXh0ZXJuIGdpbXBsZV9vcHRfcGFzcyAqbWFrZV9wYXNzX2xvb3BfbWdvIChnY2M6OmNvbnRl eHQgKmN0eHQpOwogZXh0ZXJuIGdpbXBsZV9vcHRfcGFzcyAqbWFrZV9wYXNzX2xpbSAoZ2NjOjpj b250ZXh0ICpjdHh0KTsKIGV4dGVybiBnaW1wbGVfb3B0X3Bhc3MgKm1ha2VfcGFzc19saW50ZXJj aGFuZ2UgKGdjYzo6Y29udGV4dCAqY3R4dCk7CiBleHRlcm4gZ2ltcGxlX29wdF9wYXNzICptYWtl X3Bhc3NfdHJlZV91bnN3aXRjaCAoZ2NjOjpjb250ZXh0ICpjdHh0KTsKZGlmZiAtLWdpdCBhL2dj Yy90cmVlLXNzYS1sb29wLW1nby5jIGIvZ2NjL3RyZWUtc3NhLWxvb3AtbWdvLmMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmFiOGFmODQzMjBkCi0tLSAvZGV2L251bGwK KysrIGIvZ2NjL3RyZWUtc3NhLWxvb3AtbWdvLmMKQEAgLTAsMCArMSwyNjc3IEBACisvKiBMb29w IG1lbW9yeSBnYXRoZXJpbmcgb3B0aW1pemF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDIwIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0Mu CisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Ig bW9kaWZ5IGl0Cit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy IHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2xhdGVyIHZlcnNpb24uCisKK0dD QyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQg V0lUSE9VVAorQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg b2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisK K1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlCithbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90 IHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2luY2x1ZGUgImNv bmZpZy5oIgorI2luY2x1ZGUgInN5c3RlbS5oIgorI2luY2x1ZGUgImNvcmV0eXBlcy5oIgorI2lu Y2x1ZGUgImJhY2tlbmQuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgi CisjaW5jbHVkZSAiZ2ltcGxlLmgiCisjaW5jbHVkZSAidHJlZS1wYXNzLmgiCisjaW5jbHVkZSAi c3NhLmgiCisjaW5jbHVkZSAiY2ZnaG9va3MuaCIKKyNpbmNsdWRlICJnaW1wbGUtcHJldHR5LXBy aW50LmgiCisjaW5jbHVkZSAiZm9sZC1jb25zdC5oIgorI2luY2x1ZGUgImdpbXBsZS1mb2xkLmgi CisjaW5jbHVkZSAiZ2ltcGxpZnkuaCIKKyNpbmNsdWRlICJnaW1wbGUtaXRlcmF0b3IuaCIKKyNp bmNsdWRlICJnaW1wbGlmeS1tZS5oIgorI2luY2x1ZGUgImdpbXBsZS1pdGVyYXRvci5oIgorI2lu Y2x1ZGUgInRyZWUtY2ZnLmgiCisjaW5jbHVkZSAiY2ZnbG9vcC5oIgorI2luY2x1ZGUgInRyZWUt c2NhbGFyLWV2b2x1dGlvbi5oIgorI2luY2x1ZGUgInRyZWUtZGZhLmgiCisjaW5jbHVkZSAidHJl ZS1jaHJlYy5oIgorI2luY2x1ZGUgInRyZWUtaW50by1zc2EuaCIKKyNpbmNsdWRlICJ0cmVlLXNz YS1sb29wLWl2b3B0cy5oIgorI2luY2x1ZGUgInRyZWUtc3NhLWxvb3AtbWFuaXAuaCIKKyNpbmNs dWRlICJ0cmVlLXNzYS1sb29wLW5pdGVyLmgiCisjaW5jbHVkZSAidHJlZS1zc2EtbG9vcC5oIgor I2luY2x1ZGUgInN0b3ItbGF5b3V0LmgiCisKKy8qIEluIGEgbG9vcCwgaXQgaXMgb3B0aW1hbCBp ZiBvbmx5IG9uZSBtZW1vcnkgc3RyZWFtIGlzIGFjdGl2YXRlZCwgdGhhdCBpcywKKyAgIGFsbCBt ZW1vcnkgb3BlcmF0aW9ucyBzZXF1ZW50aWFsbHkgYWNjZXNzIG9uZSBkYXRhIHJlZ2lvbi4gIEJ1 dCBpdCBpcyBub3QKKyAgIGFsd2F5cyB0aGUgY2FzZSwgc3VjaCBhcyB0cmF2ZXJzaW5nIGxpbmsg bGlzdCBvciBtYW5pcHVsYXRpbmcgZGlzY3JldGUKKyAgIGFycmF5cy4gIEluIHRoaXMgc2NlbmFy aW8sIHRoZSBsb29wIHdvdWxkIGNvbnRhaW4gbXVsdGlwbGUgc2NhdHRlcmVkIG1lbW9yeQorICAg YWNjZXNzZXMsIHdoaWNoIGNvdWxkIHRyaWdnZXIgaW5lZmZpY2llbnQgbXVsdGktd2F5IGhhcmR3 YXJlIHByZWZldGNoaW5nLAorICAgdGh1cyBtYWtpbmcgY3B1IGNhY2hlIGhpdCByYXRlIGRyb3Au CisKKyAgIEZvciBuZXN0ZWQgbG9vcHMsIGlmIHNjYXR0ZXJlZCBtZW1vcnkgYWNjZXNzZXMgaW5z aWRlIGlubmVyIGxvb3AgcmVtYWluCisgICB1bmNoYW5nZWQgaW4gZWFjaCBpdGVyYXRpb24gb2Yg b3V0ZXIgbG9vcCwgd2UgY2FuIGR5bmFtaWNhbGx5IGdhdGhlciByZXN1bHQKKyAgIGRhdGEgaW50 byBhIHNlcXVlbnRpYWwgbWVtb3J5IHJlZ2lvbiB3aGVuIHRoZSBmaXJzdCBhY2Nlc3MgaW4gdGhl IGlubmVyCisgICBsb29wIHRha2VzIHBsYWNlLiAgSW4gdGhpcyB3YXkgdGhlIGhhcmR3YXJlIHBy ZWZldGNoaW5nIGNhbiBiZSByZWR1Y2VkLAorICAgYW5kIGNwdSBjYWNoZSBoaXQgcmF0ZSBjYW4g YmUgaW1wcm92ZWQuICBUaGUgb3B0aW1pemF0aW9uIGlzIGNhbGxlZCBtZW1vcnkKKyAgIGdhdGhl cmluZyBvcHRpbWl6YXRpb24gKGFiYnJldmlhdGVkIGFzIE1HTykuCisKKyAgIEEgcGllY2Ugb2Yg cHNldWRvIGNvZGUgZm9yIG5lc3RlZCBsb29wIGlzIGdpdmVuIGFzOgorCisgICBvdXRlci1sb29w ICgpCisgICAgIHsKKyAgICAgICAuLi4KKyAgICAgICBpbm5lci1sb29wIChpdGVyLCBpdGVyX2Nv dW50KQorCSB7CisJICAgLi4uCisJICAgVHlwZTEgdjEgPSBMT0FEX0ZOMSAoaXRlcik7CisJICAg VHlwZTIgdjIgPSBMT0FEX0ZOMiAodjEpOworCSAgIFR5cGUzIHYzID0gTE9BRF9GTjMgKHYyKTsK KwkgICAuLi4KKwkgICBpdGVyID0gTkVYVF9GTiAoaXRlcik7CisJIH0KKyAgICAgICAuLi4KKyAg ICAgfQorCisgICAiTE9BRF9GTngoKSIgaXMgYSBjb25jZXB0dWFsIGZ1bmN0aW9uIHRoYXQgdHJh bnNsYXRlcyBpdHMgYXJndW1lbnQgdG8gYQorICAgcmVzdWx0LCBhbmQgaXMgY29tcG9zZWQgb2Yg YSBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGluIHdoaWNoIHRoZXJlIGlzIG9ubHkKKyAgIG9uZSBt ZW1vcnkgbG9hZC4gIEl0IGlzIGNhcGFibGUgb2YgcmVwcmVzZW50aW5nIHNpbXBsZSBtZW1vcnkg ZGVyZWZlcmVuY2UKKyAgIGxpa2UgIml0ZXItPmZpZWxkIiwgb3IgY29tcGxpY2F0ZWQgb25lIGxp a2UgImFycmF5W2l0ZXIgKiAyICsgY3N0XS5maWVsZCIuCisKKyAgICJORVhUX0ZOKCkiIGlzIGFs c28gYSBjb25jZXB0dWFsIGZ1bmN0aW9uIHdoaWNoIGRlZmluZXMgaG93IGFuIGl0ZXJhdG9yIGlz CisgICBhZHZhbmNlZC4gIEl0IGlzIGFibGUgdG8gZGVzY3JpYmUgc2ltcGxlIGludGVnZXIgaXRl cmF0b3IsIGxpc3QgaXRlcmF0b3IsCisgICBvciBldmVuIHB1cmUtZnVuY3Rpb24tYmFzZWQgaXRl cmF0b3Igb24gYWR2YW5jZWQgc3R1ZmYgbGlrZSBoYXNoc2V0L3RyZWUuCisKKyAgIFRoZSBiYXNl bGluZSB0cmFuc2Zvcm1hdGlvbiB3aWxsIGJlOgorCisgICB0eXBlZGVmIHN0cnVjdCBjYWNoZV9l bGVtCisgICAgIHsKKyAgICAgICBib29sICAgaW5pdDsKKyAgICAgICBUeXBlMSAgY192MTsKKyAg ICAgICBUeXBlMiAgY192MjsKKyAgICAgICBUeXBlMyAgY192MzsKKyAgICAgfSBjYWNoZV9lbGVt OworCisgICBjYWNoZV9lbGVtICpjYWNoZV9hcnIgPSBjYWxsb2MgKGl0ZXJfY291bnQsIHNpemVv ZiAoY2FjaGVfZWxlbSkpOworCisgICBvdXRlci1sb29wICgpCisgICAgIHsKKyAgICAgICAuLi4K KyAgICAgICBzaXplX3QgY2FjaGVfaWR4ID0gMDsKKworICAgICAgIGlubmVyLWxvb3AgKGl0ZXIs IGl0ZXJfY291bnQpCisJIHsKKwkgICAuLi4KKwkgICBpZiAoIWNhY2hlX2FycltjYWNoZV9pZHhd LT5pbml0KQorCSAgICAgeworCSAgICAgICB2MSA9IExPQURfRk4xIChpdGVyKTsKKwkgICAgICAg djIgPSBMT0FEX0ZOMiAodjEpOworCSAgICAgICB2MyA9IExPQURfRk4zICh2Mik7CisKKwkgICAg ICAgY2FjaGVfYXJyW2NhY2hlX2lkeF0tPmluaXQgPSB0cnVlOworCSAgICAgICBjYWNoZV9hcnJb Y2FjaGVfaWR4XS0+Y192MSA9IHYxOworCSAgICAgICBjYWNoZV9hcnJbY2FjaGVfaWR4XS0+Y192 MiA9IHYyOworCSAgICAgICBjYWNoZV9hcnJbY2FjaGVfaWR4XS0+Y192MyA9IHYzOworCSAgICAg fQorCSAgIGVsc2UKKwkgICAgIHsKKwkgICAgICAgdjEgPSBjYWNoZV9hcnJbY2FjaGVfaWR4XS0+ Y192MTsKKwkgICAgICAgdjIgPSBjYWNoZV9hcnJbY2FjaGVfaWR4XS0+Y192MjsKKwkgICAgICAg djMgPSBjYWNoZV9hcnJbY2FjaGVfaWR4XS0+Y192MzsKKwkgICAgIH0KKwkgICAuLi4KKwkgICBj YWNoZV9pZHgrKzsKKwkgICBpdGVyID0gTkVYVF9GTiAoaXRlcik7CisJIH0KKyAgICAgICAuLi4K KyAgICAgfQorCisgICBmcmVlIChjYWNoZV9hcnIpOworCisgICAiaXRlcl9jb3VudCIgc3RhbmRz IGZvciBhbiB1cHBlciBib3VuZCBmb3IgaW5uZXItbG9vcCBpdGVyYXRpb24gY291bnQsCisgICB3 aGljaCBtdXN0IGJlIGFuIG91dGVyLWxvb3AgaW52YXJpYW50IGV4cHJlc3Npb24sIGluIHRoYXQg aXQgZGV0ZXJtaW5lcworICAgZGF0YSBjb3VudCBpbiBjYWNoZSBzcGFjZSwgYW5kIHRoZSBzcGFj ZSBpcyBhbGxvY2F0ZWQgYmVmb3JlIG91dGVyLWxvb3AuCisgICBBbmQgdG8gYXZvaWQgT09NIGF0 IGxhcmdlIGNvdW50IGFuZCBuZWdhdGl2ZSBpbXBhY3QgZm9yIHNtYWxsIGNvdW50LCB0d28KKyAg IHRocmVzaG9sZHMgZm9yIG1heGltdW0gYW5kIG1pbmltdW0gY2FjaGUgZGF0YSBjb3VudCBhcmUg YWRkZWQuICAqLworCisKKy8qIEEgdW5pcXVlIHN1ZmZpeCBJRCB1c2VkIGluIG5hbWUgZ2VuZXJh dGlvbiwgd2lsbCBiZSB1cGRhdGVkIGVhY2ggdGltZSBtZ28KKyAgIGlzIGFwcGxpZWQuICAqLwor c3RhdGljIHVuc2lnbmVkIG1nb19uYW1lX3N1ZmZpeF9pZCA9IDA7CisKK2NsYXNzIGxvb3BfaXRl cl9pbmZvOworCisvKiBEYXRhIHN0cnVjdHVyZSB0byBob2xkIHRlbXBvcmFyeSBsb29wLXdpc2Ug aW5mb3JtYXRpb24gZm9yIG1nby4gICovCitjbGFzcyBsb29wX21nb19pbmZvCit7CitwdWJsaWM6 CisgIGNsYXNzIGxvb3AgKmxvb3A7CisKKyAgLyogVmlydHVhbCBQSEkgaW4gbG9vcCBoZWFkZXIu ICAqLworICBncGhpICpyb290X3ZwaGk7CisKKyAgLyogRXhwcmVzc2lvbiByZXByZXNlbnRpbmcg bnVtYmVyIG9mIGxvb3AgaXRlcmF0aW9ucy4gICovCisgIHRyZWUgaXRlcmF0aW9uczsKKworICAv KiBBbGwgc3RhdGVtZW50cyB0aGF0IGhhdmUgc2lkZSBlZmZlY3RzIG9uIG1lbW9yeSBpbiBhIGxv b3AuICAqLworICBhdXRvX3ZlYzxnaW1wbGUgKj4gc3RvcmVfdmRlZnM7CisKKyAgLyogQWxsIGl0 ZXJhdG9ycyBmb3IgbWdvIGluIGEgbG9vcC4gICovCisgIGF1dG9fZGVsZXRlX3ZlYzxsb29wX2l0 ZXJfaW5mbz4gaXRlcnM7CisKKyAgbG9vcF9tZ29faW5mbyAoY2xhc3MgbG9vcCAqbG9vcCkgOiBs b29wIChsb29wKSwgcm9vdF92cGhpIChOVUxMKSwKKwkJCQkgICAgIGl0ZXJhdGlvbnMgKE5VTExf VFJFRSkge30KKyAgfmxvb3BfbWdvX2luZm8gKCkge30KKworICBib29sIGhhc192ZGVmcyAoKSBj b25zdAorICB7CisgICAgcmV0dXJuICFzdG9yZV92ZGVmcy5pc19lbXB0eSAoKTsKKyAgfQorfTsK Kworc3RhdGljIGlubGluZSBsb29wX21nb19pbmZvICoKK2dldF9tZ29faW5mbyAoY29uc3QgY2xh c3MgbG9vcCAqbG9vcCkKK3sKKyAgbG9vcF9tZ29faW5mbyAqaW5mbyA9IChsb29wX21nb19pbmZv ICopIGxvb3AtPmF1eDsKKworICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChpbmZvICYmIGluZm8tPmxv b3AgPT0gbG9vcCk7CisKKyAgcmV0dXJuIGluZm87Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIFNU TVQgYmVsb25ncyB0byBMT09QLiAgKi8KKworc3RhdGljIGlubGluZSBib29sCitzdG10X2luc2lk ZV9sb29wX3AgKGNvbnN0IGNsYXNzIGxvb3AgKmxvb3AsIGdpbXBsZSAqc3RtdCkKK3sKKyAgYmFz aWNfYmxvY2sgYmIgPSBnaW1wbGVfYmIgKHN0bXQpOworCisgIHJldHVybiBiYiAmJiBmbG93X2Ji X2luc2lkZV9sb29wX3AgKGxvb3AsIGJiKTsKK30KKworLyogQSB3cmFwcGVyIGZ1bmN0aW9uIG9u IHByaW50X2dpbXBsZV9zdG10KCksIHdpdGggYmFzaWMgYmxvY2sgbnVtYmVyIGFzCisgICBwcmVm aXggd2hlbiBwcmludGluZyBTVE1ULiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X2dpbXBsZV9z dG10X3dpdGhfYmIgKEZJTEUgKmZpbGUsIGdpbXBsZSAqc3RtdCwgaW50IHNwYyA9IDAsCisJCQkg ICBkdW1wX2ZsYWdzX3QgZmxhZ3MgPSBUREZfTk9ORSkKK3sKKyAgYmFzaWNfYmxvY2sgYmIgPSBn aW1wbGVfYmIgKHN0bXQpOworCisgIGlmIChiYikKKyAgICBmcHJpbnRmIChmaWxlLCAiKEJCICVk KSAiLCBiYi0+aW5kZXgpOworCisgIHByaW50X2dpbXBsZV9zdG10IChmaWxlLCBzdG10LCBzcGMs IGZsYWdzKTsKK30KKworLyogQ3JlYXRlIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBhcyBDT05E ID8gVkFMMSA6IFZBTDIuICAqLworCitzdGF0aWMgaW5saW5lIHRyZWUKK2J1aWxkX2NvbmRfZXhw ciAodHJlZSBjb25kLCB0cmVlIHZhbDEsIHRyZWUgdmFsMikKK3sKKyAgaWYgKFRSRUVfQ09ERSAo VFJFRV9UWVBFIChjb25kKSkgIT0gQk9PTEVBTl9UWVBFKQorICAgIGNvbmQgPSBmb2xkX2J1aWxk MiAoTkVfRVhQUiwgYm9vbGVhbl90eXBlX25vZGUsIGNvbmQsCisJCQlidWlsZF96ZXJvX2NzdCAo VFJFRV9UWVBFIChjb25kKSkpOworCisgIHJldHVybiBmb2xkX2J1aWxkMyAoQ09ORF9FWFBSLCBU UkVFX1RZUEUgKHZhbDEpLCBjb25kLCB2YWwxLCB2YWwyKTsKK30KKworLyogR2l2ZW4gYSBzdHJ1 Y3QvY2xhc3MgcG9pbnRlciBBRERSLCBhbmQgRklFTERfREVDTCBiZWxvbmdpbmcgdG8gdGhlCisg ICBzdHJ1Y3QvY2xhc3MsIGNyZWF0ZSBhIGZpZWxkIHJlZmVyZW5jZSBleHByZXNzaW9uLiAgKi8K Kworc3RhdGljIGlubGluZSB0cmVlCitidWlsZF9maWVsZF9yZWYgKHRyZWUgYWRkciwgdHJlZSBm aWVsZF9kZWNsKQoreworICBlbnVtIHRyZWVfY29kZSBjb2RlOworCisgIGlmIChERUNMX0JJVF9G SUVMRCAoZmllbGRfZGVjbCkpCisgICAgY29kZSA9IEJJVF9GSUVMRF9SRUY7CisgIGVsc2UKKyAg ICBjb2RlID0gQ09NUE9ORU5UX1JFRjsKKworICByZXR1cm4gYnVpbGQzIChjb2RlLCBUUkVFX1RZ UEUgKGZpZWxkX2RlY2wpLCBidWlsZF9zaW1wbGVfbWVtX3JlZiAoYWRkciksCisJCSBmaWVsZF9k ZWNsLCBOVUxMX1RSRUUpOworfQorCisvKiBHZW5lcmF0ZSBhIGdpbXBsZSBhc3NpZ25tZW50IGFz IExIUyA9IE9QMSBDT0RFIE9QMiwgb3Igc2ltcGxlIExIUyA9IE9QMSwKKyAgIGlmIE9QMiBpcyBO VUxMLiBUaGUgc3RhdGVtZW50IHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIEdTSSB3aGVuIEJFRk9S RSBpcworICAgdHJ1ZSwgb3RoZXJ3aXNlIGFwcGVuZGVkIGFmdGVyIGl0LiAgKi8KKworc3RhdGlj IGlubGluZSBnYXNzaWduICoKK2J1aWxkX2Fzc2lnbl9hdF9nc2kgKGdpbXBsZV9zdG10X2l0ZXJh dG9yICpnc2ksIGJvb2wgYmVmb3JlLCB0cmVlIGxocywKKwkJICAgICB0cmVlIG9wMSwgZW51bSB0 cmVlX2NvZGUgY29kZSA9IE5PUF9FWFBSLAorCQkgICAgIHRyZWUgb3AyID0gTlVMTF9UUkVFKQor eworICBnYXNzaWduICpzdG10OworCisgIGlmIChvcDIpCisgICAgc3RtdCA9IGdpbXBsZV9idWls ZF9hc3NpZ24gKGxocywgY29kZSwgb3AxLCBvcDIpOworICBlbHNlCisgICAgc3RtdCA9IGdpbXBs ZV9idWlsZF9hc3NpZ24gKGxocywgb3AxKTsKKworICBpZiAoYmVmb3JlKQorICAgIGdzaV9pbnNl cnRfYmVmb3JlIChnc2ksIHN0bXQsIEdTSV9ORVdfU1RNVCk7CisgIGVsc2UKKyAgICBnc2lfaW5z ZXJ0X2FmdGVyIChnc2ksIHN0bXQsIEdTSV9ORVdfU1RNVCk7CisgIHJldHVybiBzdG10OworfQor CisvKiBHZW5lcmF0ZSBhIGdpbXBsZSBhc3NpZ25tZW50IGFuZCBpbnNlcnQgaXQgYXMgdGhlIGxh c3Qgc3RtdCBvZiBCQi4gICovCisKK3N0YXRpYyBpbmxpbmUgZ2Fzc2lnbiAqCitidWlsZF9hc3Np Z25fYWZ0ZXJfYmIgKGJhc2ljX2Jsb2NrIGJiLCB0cmVlIGxocywgdHJlZSBvcDEsCisJCSAgICAg ICBlbnVtIHRyZWVfY29kZSBjb2RlID0gTk9QX0VYUFIsIHRyZWUgb3AyID0gTlVMTF9UUkVFKQor eworICBnaW1wbGVfc3RtdF9pdGVyYXRvciBnc2kgPSBnc2lfbGFzdF9iYiAoYmIpOworCisgIHJl dHVybiBidWlsZF9hc3NpZ25fYXRfZ3NpICgmZ3NpLCBmYWxzZSwgbGhzLCBvcDEsIGNvZGUsIG9w Mik7Cit9CisKKy8qIEdlbmVyYXRlIGEgZ2ltcGxlIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBhcyBP UDEgQ09ERSBPUDIsIGFuZCBpbnNlcnQgaXQgYXMKKyAgIHRoZSBsYXN0IHN0bXQgb2YgQkIuICAq LworCitzdGF0aWMgaW5saW5lIGdjb25kICoKK2J1aWxkX2NvbmRfYWZ0ZXJfYmIgKGJhc2ljX2Js b2NrIGJiLCB0cmVlIG9wMSwgZW51bSB0cmVlX2NvZGUgY29kZSwgdHJlZSBvcDIpCit7CisgIGdp bXBsZV9zdG10X2l0ZXJhdG9yIGdzaSA9IGdzaV9sYXN0X2JiIChiYik7CisgIGdjb25kICpjb25k ID0gZ2ltcGxlX2J1aWxkX2NvbmQgKGNvZGUsIG9wMSwgb3AyLCBOVUxMX1RSRUUsIE5VTExfVFJF RSk7CisKKyAgZ3NpX2luc2VydF9hZnRlciAoJmdzaSwgY29uZCwgR1NJX05FV19TVE1UKTsKKyAg cmV0dXJuIGNvbmQ7Cit9CisKKy8qIEZpbmQgYWxsIHN0YXRlbWVudHMgd2l0aCBtZW1vcnktd3Jp dGUgZWZmZWN0IGluIExPT1AsIGluY2x1ZGluZyBtZW1vcnkKKyAgIHN0b3JlcyBhbmQgbm9uLXB1 cmUgZnVuY3Rpb24gY2FsbHMsIGFuZCBrZWVwIHRoZW0gaW4gYSB2ZWN0b3IuICAqLworCitzdGF0 aWMgYm9vbAorZ2V0X3ZkZWZzX2luX2xvb3AgKGNvbnN0IGNsYXNzIGxvb3AgKmxvb3ApCit7Cisg IGxvb3BfbWdvX2luZm8gKmluZm8gPSBnZXRfbWdvX2luZm8gKGxvb3ApOworICBncGhpICp2cGhp OworCisgIGlmIChpbmZvLT5yb290X3ZwaGkpCisgICAgcmV0dXJuIGluZm8tPmhhc192ZGVmcyAo KTsKKworICBpZiAoISh2cGhpID0gZ2V0X3ZpcnR1YWxfcGhpIChsb29wLT5oZWFkZXIpKSkKKyAg ICByZXR1cm4gZmFsc2U7CisKKyAgaW5mby0+cm9vdF92cGhpID0gdnBoaTsKKworICBlZGdlIGxh dGNoID0gbG9vcF9sYXRjaF9lZGdlIChsb29wKTsKKyAgdHJlZSBmaXJzdCA9IGdpbXBsZV9waGlf cmVzdWx0ICh2cGhpKTsKKyAgdHJlZSBsYXN0ID0gUEhJX0FSR19ERUZfRlJPTV9FREdFICh2cGhp LCBsYXRjaCk7CisKKyAgaWYgKGZpcnN0ID09IGxhc3QpCisgICAgcmV0dXJuIGZhbHNlOworCisg IGF1dG9fdmVjPHRyZWU+IHdvcmtsaXN0OworICBhdXRvX2JpdG1hcCB2aXNpdGVkOworCisgIGJp dG1hcF9zZXRfYml0ICh2aXNpdGVkLCBTU0FfTkFNRV9WRVJTSU9OIChmaXJzdCkpOworICBiaXRt YXBfc2V0X2JpdCAodmlzaXRlZCwgU1NBX05BTUVfVkVSU0lPTiAobGFzdCkpOworICB3b3JrbGlz dC5zYWZlX3B1c2ggKGxhc3QpOworCisgIGRvCisgICAgeworICAgICAgdHJlZSB2dXNlID0gd29y a2xpc3QucG9wICgpOworICAgICAgZ2ltcGxlICpzdG10ID0gU1NBX05BTUVfREVGX1NUTVQgKHZ1 c2UpOworICAgICAgYmFzaWNfYmxvY2sgYmIgPSBnaW1wbGVfYmIgKHN0bXQpOworCisgICAgICBn Y2NfY2hlY2tpbmdfYXNzZXJ0IChzdG10X2luc2lkZV9sb29wX3AgKGxvb3AsIHN0bXQpKTsKKwor ICAgICAgaWYgKGJiLT5sb29wX2ZhdGhlciAhPSBsb29wKQorCXsKKwkgIGNsYXNzIGxvb3AgKnN1 Ymxvb3AgPSBiYi0+bG9vcF9mYXRoZXI7CisKKwkgIC8qIFRoZSB2aXJ0dWFsIFNTQSBuYW1lIGJl bG9uZ3MgdG8gYW4gaW5uZXIgbG9vcCwgZmluZCBvdXQgYW5kCisJICAgICByZWN1cnNpdmVseSBw cm9jZXNzIHRoZSB0b3Btb3N0IGlubmVyIGxvb3AsIHRoZW4gbWVyZ2UgdGhvc2UKKwkgICAgIGlu bmVyIFZERUZzIGludG8gdGhlIGVuY2xvc2luZyBsb29wLiAgKi8KKwkgIHdoaWxlIChsb29wICE9 IGxvb3Bfb3V0ZXIgKHN1Ymxvb3ApKQorCSAgICBzdWJsb29wID0gbG9vcF9vdXRlciAoc3VibG9v cCk7CisKKwkgIGdldF92ZGVmc19pbl9sb29wIChzdWJsb29wKTsKKworCSAgbG9vcF9tZ29faW5m byAqc3VibG9vcF9pbmZvID0gZ2V0X21nb19pbmZvIChzdWJsb29wKTsKKwkgIGdwaGkgKnN1Ymxv b3BfdnBoaSA9IHN1Ymxvb3BfaW5mby0+cm9vdF92cGhpOworCisJICBnY2NfY2hlY2tpbmdfYXNz ZXJ0IChzdWJsb29wX3ZwaGkpOworCisJICB0cmVlIHJlc3VsdCA9IGdpbXBsZV9waGlfcmVzdWx0 IChzdWJsb29wX3ZwaGkpOworCisJICAvKiBPbmNlIGFuIGlubmVyIGxvb3AgaGFzIGJlZW4gbWVy Z2VkLCBpdHMgZmlyc3QgdmlydHVhbCBTU0EgbmFtZQorCSAgICAgaXMgbWFya2VkIGFzIHZpc2l0 ZWQgdG8gYXZvaWQgcmVwZXRpdGlvbi4gIEhlcmUgaXMgYSBzdWJ0bGUgY2FzZQorCSAgICAgdGhh dCB0aGUgdmlydHVhbCBTU0EgbmFtZSBpbiBwcm9jZXNzaW5nIGlzIGp1c3QgdGhlIGZpcnN0IG9u ZSBvZgorCSAgICAgdGhlIGlubmVyIGxvb3AuICBUaGUgU1NBIG5hbWUgaGFzIHRhZyBvZiB2aXNp dGVkLCBidXQgdGhlIGlubmVyCisJICAgICBsb29wIGhhcyBub3QgYmVlbiBtZXJnZWQuICAqLwor CSAgaWYgKHZ1c2UgPT0gcmVzdWx0CisJICAgICAgfHwgYml0bWFwX3NldF9iaXQgKHZpc2l0ZWQs IFNTQV9OQU1FX1ZFUlNJT04gKHJlc3VsdCkpKQorCSAgICB7CisJICAgICAgZWRnZSBlbnRyeSA9 IGxvb3BfcHJlaGVhZGVyX2VkZ2UgKHN1Ymxvb3ApOworCSAgICAgIHRyZWUgaW5pdCA9IFBISV9B UkdfREVGX0ZST01fRURHRSAoc3VibG9vcF92cGhpLCBlbnRyeSk7CisKKwkgICAgICBpbmZvLT5z dG9yZV92ZGVmcy5zYWZlX3NwbGljZSAoc3VibG9vcF9pbmZvLT5zdG9yZV92ZGVmcyk7CisKKwkg ICAgICBpZiAoYml0bWFwX3NldF9iaXQgKHZpc2l0ZWQsIFNTQV9OQU1FX1ZFUlNJT04gKGluaXQp KSkKKwkJd29ya2xpc3Quc2FmZV9wdXNoIChpbml0KTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2Ug aWYgKGdpbXBsZV9jb2RlIChzdG10KSA9PSBHSU1QTEVfUEhJKQorCXsKKwkgIGZvciAodW5zaWdu ZWQgaSA9IDA7IGkgPCBnaW1wbGVfcGhpX251bV9hcmdzIChzdG10KTsgKytpKQorCSAgICB7CisJ ICAgICAgdHJlZSBhcmcgPSBnaW1wbGVfcGhpX2FyZ19kZWYgKHN0bXQsIGkpOworCisJICAgICAg aWYgKGJpdG1hcF9zZXRfYml0ICh2aXNpdGVkLCBTU0FfTkFNRV9WRVJTSU9OIChhcmcpKSkKKwkJ d29ya2xpc3Quc2FmZV9wdXNoIChhcmcpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkg IHRyZWUgcHJldiA9IGdpbXBsZV92dXNlIChzdG10KTsKKworCSAgaW5mby0+c3RvcmVfdmRlZnMu c2FmZV9wdXNoIChzdG10KTsKKworCSAgaWYgKGJpdG1hcF9zZXRfYml0ICh2aXNpdGVkLCBTU0Ff TkFNRV9WRVJTSU9OIChwcmV2KSkpCisJICAgIHdvcmtsaXN0LnNhZmVfcHVzaCAocHJldik7CisJ fQorICAgIH0KKyAgd2hpbGUgKCF3b3JrbGlzdC5pc19lbXB0eSAoKSk7CisKKyAgaWYgKGR1bXBf ZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKyAgICB7CisgICAgICB1bnNpZ25l ZCBpOworICAgICAgZ2ltcGxlICpzdG10OworCisgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJW REVGcyBpbiBsb29wICVkOlxuIiwgbG9vcC0+bnVtKTsKKworICAgICAgRk9SX0VBQ0hfVkVDX0VM VCAoaW5mby0+c3RvcmVfdmRlZnMsIGksIHN0bXQpCisJcHJpbnRfZ2ltcGxlX3N0bXRfd2l0aF9i YiAoZHVtcF9maWxlLCBzdG10KTsKKworICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG4iKTsK KyAgICB9CisKKyAgcmV0dXJuIGluZm8tPmhhc192ZGVmcyAoKTsKK30KKworLyogVHJ5IHRvIGRl ZHVjZSBhIHBvc3NpYmxlIG1pbmltdW0gaXRlcmF0aW9uIGNvdW50IGZvciBMT09QLCBhbmQgcmV0 dXJuIHRoZQorICAgZXhwcmVzc2lvbiBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgcmV0dXJuIGNo cmVjX2RvbnRfa25vdy4gICovCisKK3N0YXRpYyB0cmVlCitnZXRfbG9vcF9pdGVyYXRpb25zIChj bGFzcyBsb29wICpsb29wKQoreworICBsb29wX21nb19pbmZvICppbmZvID0gZ2V0X21nb19pbmZv IChsb29wKTsKKworICBpZiAoaW5mby0+aXRlcmF0aW9ucykKKyAgICByZXR1cm4gaW5mby0+aXRl cmF0aW9uczsKKworICBhdXRvX3ZlYzxlZGdlPiBleGl0cyA9IGdldF9sb29wX2V4aXRfZWRnZXMg KGxvb3ApOworICB1bnNpZ25lZCBpOworICBlZGdlIGV4OworICB0cmVlIG5pdGVyID0gY2hyZWNf ZG9udF9rbm93OworICBiYXNpY19ibG9jayBiYiA9IE5VTEw7CisKKyAgRk9SX0VBQ0hfVkVDX0VM VCAoZXhpdHMsIGksIGV4KQorICAgIHsKKyAgICAgIGNsYXNzIHRyZWVfbml0ZXJfZGVzYyBuaXRl cl9kZXNjOworCisgICAgICAvKiBPbmx5IGNhcmUgYWJvdXQgZXhpdCB0aGF0IGRvbWluYXRlcyBs YXRjaC4gICovCisgICAgICBpZiAoIW51bWJlcl9vZl9pdGVyYXRpb25zX2V4aXRfYXNzdW1wdGlv bnMgKGxvb3AsIGV4LCAmbml0ZXJfZGVzYywgTlVMTCkKKwkgIHx8IGNocmVjX2NvbnRhaW5zX3Vu ZGV0ZXJtaW5lZCAobml0ZXJfZGVzYy5uaXRlcikpCisJY29udGludWU7CisKKyAgICAgIHRyZWUg YXNzdW1wdGlvbnMgPSBuaXRlcl9kZXNjLmFzc3VtcHRpb25zOworICAgICAgdHJlZSBtYXlfYmVf emVybyA9IG5pdGVyX2Rlc2MubWF5X2JlX3plcm87CisgICAgICB0cmVlIG5pdGVyX3R5cGUgPSBU UkVFX1RZUEUgKG5pdGVyX2Rlc2Mubml0ZXIpOworICAgICAgdHJlZSBuaXRlcl96ZXJvID0gYnVp bGRfaW50X2NzdCAobml0ZXJfdHlwZSwgMCk7CisgICAgICB0cmVlIG5pdGVyX29uZSA9IGJ1aWxk X2ludF9jc3QgKG5pdGVyX3R5cGUsIDEpOworICAgICAgdHJlZSBuZXdfbml0ZXIgPSBzaXplX2Jp bm9wIChQTFVTX0VYUFIsIG5pdGVyX2Rlc2Mubml0ZXIsIG5pdGVyX29uZSk7CisKKyAgICAgIC8q IEdlbmVyYXRlIGV4cHJlc3Npb24gdG8gY2FsY3VsYXRlIGl0ZXJhdGlvbnMgY291bnQgYXQgcnVu dGltZSAoaS5lLik6CisKKwkgICBhc3N1bXB0aW9ucyAmJiAhbWF5X2JlX3plcm8gPyAobml0ZXIg KyAxKSA6IDAKKworCSBJZiB0aGUgY291bnQgY291bGQgbm90IGJlIG5vcm1hbGx5IGV2YWx1YXRl ZCwgMCB3aWxsIGJlIGdpdmVuIGFzCisJIHJlc3VsdCB0byBsZXQgZHluYW1pYyBjaGVjayBvbiB0 aGF0IGJlIHBvc3NpYmxlLiAgKi8KKyAgICAgIGlmIChpbnRlZ2VyX25vbnplcm9wIChtYXlfYmVf emVybykpCisJbmV3X25pdGVyID0gbml0ZXJfemVybzsKKyAgICAgIGVsc2UgaWYgKENPTVBBUklT T05fQ0xBU1NfUCAobWF5X2JlX3plcm8pKQorCXsKKwkgIHRyZWUgbm90X2JlX3plcm8gPSBmb2xk X2J1aWxkMSAoVFJVVEhfTk9UX0VYUFIsIGJvb2xlYW5fdHlwZV9ub2RlLAorCQkJCQkgIG1heV9i ZV96ZXJvKTsKKworCSAgLyogVHJ5IHRvIGNvbWJpbmUgbWF5X2JlX3plcm8gd2l0aCBhc3N1bXB0 aW9ucywgdGhpcyBjYW4gc2ltcGxpZnkKKwkgICAgIGNvbXB1dGF0aW9uIG9mIG5pdGVyIGV4cHJl c3Npb24uICAqLworCSAgaWYgKCFpbnRlZ2VyX25vbnplcm9wIChhc3N1bXB0aW9ucykpCisJICAg IGFzc3VtcHRpb25zID0gZm9sZF9idWlsZDIgKFRSVVRIX0FORF9FWFBSLCBib29sZWFuX3R5cGVf bm9kZSwKKwkJCQkgICAgICAgYXNzdW1wdGlvbnMsIG5vdF9iZV96ZXJvKTsKKwkgIGVsc2UKKwkg ICAgYXNzdW1wdGlvbnMgPSBub3RfYmVfemVybzsKKwl9CisgICAgICBlbHNlIGlmICghaW50ZWdl cl96ZXJvcCAobWF5X2JlX3plcm8pKQorCWNvbnRpbnVlOworCisgICAgICBpZiAoIWludGVnZXJf bm9uemVyb3AgKGFzc3VtcHRpb25zKSkKKwluZXdfbml0ZXIgPSBidWlsZF9jb25kX2V4cHIgKGFz c3VtcHRpb25zLCBuZXdfbml0ZXIsIG5pdGVyX3plcm8pOworCisgICAgICBpZiAobml0ZXIgPT0g Y2hyZWNfZG9udF9rbm93KQorCXsKKwkgIG5pdGVyID0gbmV3X25pdGVyOworCSAgYmIgPSBleC0+ c3JjOworCX0KKyAgICAgIGVsc2UgaWYgKFRSRUVfQ09ERSAobmV3X25pdGVyKSA9PSBJTlRFR0VS X0NTVCkKKwl7CisJICAvKiBQcmVmZXIgY29uc3RhbnRzLCB0aGUgbG93ZXIgdGhlIGJldHRlci4g ICovCisJICBpZiAoVFJFRV9DT0RFIChuaXRlcikgIT0gSU5URUdFUl9DU1QKKwkgICAgICB8fCB0 cmVlX2ludF9jc3RfbHQgKG5ld19uaXRlciwgbml0ZXIpKQorCSAgICB7CisJICAgICAgbml0ZXIg PSBuZXdfbml0ZXI7CisJICAgICAgYmIgPSBleC0+c3JjOworCSAgICB9CisJfQorICAgICAgZWxz ZSBpZiAoVFJFRV9DT0RFIChuaXRlcikgIT0gSU5URUdFUl9DU1QpCisJeworCSAgIC8qIEZyb20g dGhvc2UgZXhpdCBjb25kaXRpb25zLCB0aGUgb25lIHRoYXQgaXMgbmVhcmVzdCB0byB0aGUgbGF0 Y2gKKwkgICAgICB3b3VsZCBnaXZlIHRoZSBtaW5pbXVtIGl0ZXJhdGlvbnMgaW4gYWxsIHBvc3Np YmlsaXR5LiAgKi8KKwkgIGlmIChkb21pbmF0ZWRfYnlfcCAoQ0RJX0RPTUlOQVRPUlMsIGV4LT5z cmMsIGJiKSkKKwkgICAgeworCSAgICAgIG5pdGVyID0gbmV3X25pdGVyOworCSAgICAgIGJiID0g ZXgtPnNyYzsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaW5mby0+aXRlcmF0aW9ucyA9IG5pdGVy OworICByZXR1cm4gbml0ZXI7Cit9CisKKy8qIEdpdmVuIGEgbG9hZCwgd2Ugd2lsbCBhbmFseXpl IGZlYXNpYmlsaXR5IG9mIGNhY2hpbmcgaXQsIGZyb20gbWdvIGxvb3AgdG8KKyAgIGFsbCBpdHMg cGFyZW50IGxvb3BzIG9uZS1ieS1vbmUuICBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8g aG9sZAorICAgcGVyLWxvb3AgYW5hbHlzaXMgaW5mb3JtYXRpb24gZm9yIHRoZSBsb2FkLiAgKi8K KworY2xhc3MgZGVwX2xvYWRfaW5mbworeworcHVibGljOgorICAvKiBUaGUgbG9hZCBpcyBhIGNh bmRpZGF0ZSB0byBjYWNoZSBvciBub3QsIGlmIGdpdmVuIG91dGVyIGxvb3AgaXMgcHJlc2VudC4K KyAgICAgRm9yIGV4YW1wbGUsIGV4Y2x1ZGUgaXQgaWYgdGhlIGxvb3AgY29udGFpbnMgYW4gYWxp YXNlZCBzdG9yZS4gICovCisgIGJvb2wgZXhjbHVkZWQ7CisKKyAgZGVwX2xvYWRfaW5mbyAoKSA6 IGV4Y2x1ZGVkIChmYWxzZSkge30KK307CisKKy8qIEFsbCBsb2FkcyB0aGF0IG9yaWdpbmF0ZSBm cm9tIGEgbG9vcCBpdGVyYXRvciBhcmUgb3JnYW5pemVkIGFzIGEgZGVwZW5kZW50CisgICBsb2Fk IHRyZWUsIHdob3NlIHJvb3QgaXMgdGhlIGl0ZXJhdG9yLiAgVGhlIGRhdGEgc3RydWN0dXJlIGNv cnJlc3BvbmRzIHRvCisgICBhIHRyZWUgbm9kZS4gICovCisKK2NsYXNzIGRlcF9sb2FkCit7Citw dWJsaWM6CisgIC8qIE91dGVyIGxvb3AgaW52YXJpYW50IG9wZXJhbmRzIHVzZWQgaW4gbG9hZCBh ZGRyZXNzIGNvbXB1dGF0aW9uLiAgKi8KKyAgYXV0b192ZWM8dHJlZT4gaW52YXJfb3BuZHM7CisK KyAgLyogU3RhdGVtZW50cyB1c2VkIHRvIGNvbXB1dGUgbG9hZCBhZGRyZXNzIGZyb20gcmVzdWx0 IHZhbHVlIG9mIHBhcmVudC4gKi8KKyAgYXV0b192ZWM8Z2ltcGxlICo+IGFkZHJfc3RtdHM7CisK KyAgLyogTG9hZHMgdGhhdCBkZXBlbmRzIG9uIGN1cnJlbnQgb25lLiAgKi8KKyAgYXV0b19kZWxl dGVfdmVjPGRlcF9sb2FkPiBjaGlsZHJlbjsKKworICAvKiBOZWVkIHRvIGNhY2hlIHRoZSB0aGlz IGxvYWQ/ICAqLworICBib29sIG5lZWRfY2FjaGluZzsKKworICAvKiBMZXZlbCBvZiBwb2ludGVy LWNoYXNpbmcgZnJvbSBpdGVyYXRvciB0byBjdXJyZW50IGxvYWQuICAqLworICBpbnQgbGV2ZWw7 CisKKyAgLyogU3RhdGVtZW50cyB0aGF0IGRlZmluZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGlz IGxvYWQuICBUaGVyZSBtaWdodCBiZQorICAgICBtb3JlIHRoYW4gb25lIHN0YXRlbWVudCBkdWUg dG8gZGVwZW5kZW50IGxvYWRzIG1lcmdpbmcuICBXaGlsZSByb290IG5vZGUKKyAgICAgaXMgc29t ZXdoYXQgZGlmZmVyZW50LCBpdCBvbmx5IGNvbnRhaW5zIFBISSBzdGF0ZW1lbnRzLCBhbmQgZWFj aCBQSEkKKyAgICAgY29ycmVsYXRlcyB3aXRoIGFuIGl0ZXJhdG9yLiAgKi8KKyAgYXV0b192ZWM8 Z2ltcGxlICo+IGRlZl9zdG10czsKKworICAvKiBBbmFseXNpcyBpbmZvcm1hdGlvbiBjb2xsZWN0 ZWQgZm9yIGFsbCBwYXJlbnQgbG9vcHMuICAqLworICBhdXRvX2RlbGV0ZV92ZWM8ZGVwX2xvYWRf aW5mbz4gYW5hbHlzaXNfZm9yX2xvb3BzOworCisgIGlubGluZSBib29sIGlzX3Jvb3QgKCkgY29u c3QgeyByZXR1cm4gIWxldmVsOyB9CisgIGlubGluZSBib29sIGlzX2xlYWYgKCkgY29uc3QgeyBy ZXR1cm4gY2hpbGRyZW4uaXNfZW1wdHkgKCk7IH0KKworICAvKiBDaGVjayB3aGV0aGVyIHRoZSBs b2FkIGlzIGV4Y2x1ZGVkIGZyb20gY2FjaGluZyBjYW5kaWRhdGVzIHdoZW4gb3V0ZXIKKyAgICAg bG9vcCBkZW5vdGVkIGJ5IExPT1BfSU5ERVggaXMgcHJlc2VudCBpbiBsb29wIGhpZXJhcmNoeSBm b3IgbWdvLiAgKi8KKworICBib29sIGV4Y2x1ZGVkX3AgKHVuc2lnbmVkIGxvb3BfaW5kZXgpIGNv bnN0CisgIHsKKyAgICBnY2NfY2hlY2tpbmdfYXNzZXJ0ICghYW5hbHlzaXNfZm9yX2xvb3BzLmlz X2VtcHR5ICgpKTsKKworICAgIHVuc2lnbmVkIGxhc3RfaW5kZXggPSBhbmFseXNpc19mb3JfbG9v cHMubGVuZ3RoICgpIC0gMTsKKworICAgIGlmIChsYXN0X2luZGV4IDwgbG9vcF9pbmRleCkKKyAg ICAgIHsKKwlnY2NfY2hlY2tpbmdfYXNzZXJ0IChhbmFseXNpc19mb3JfbG9vcHNbbGFzdF9pbmRl eF0tPmV4Y2x1ZGVkKTsKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgIHJldHVybiBhbmFs eXNpc19mb3JfbG9vcHNbbG9vcF9pbmRleF0tPmV4Y2x1ZGVkOworICB9CisKKyAgLyogUmVtb3Zl IGNoaWxkIGZyb20gZGVwZW5kZW50IGxvYWQgdHJlZSwgd2hvc2UgcG9zaXRpb24gaXMgc3BlY2lm aWVkIGJ5CisgICAgIElOREVYLiAgKi8KKworICB2b2lkIHJlbW92ZV9jaGlsZCAodW5zaWduZWQg aW5kZXgpCisgIHsKKyAgICBkZWxldGUgY2hpbGRyZW5baW5kZXhdOworICAgIGNoaWxkcmVuLnVu b3JkZXJlZF9yZW1vdmUgKGluZGV4KTsKKyAgfQorCisgIGRlcF9sb2FkIChnaW1wbGUgKmRlZl9z dG10LCBpbnQgbGV2ZWwgPSAwKQorICAgIDogbmVlZF9jYWNoaW5nIChsZXZlbCA+IDApLCBsZXZl bCAobGV2ZWwpCisgIHsKKyAgICBkZWZfc3RtdHMuc2FmZV9wdXNoIChkZWZfc3RtdCk7CisgIH0K KworICB+ZGVwX2xvYWQgKCkge30KK307CisKKy8qIEEgdXRpbGl0eSBjbGFzcyB0byB0cmF2ZXJz ZSBkZXBlbmRlbnQgbG9hZCB0cmVlIGluIHByZS1vcmRlci4gICovCisKK2NsYXNzIGRlcF9sb2Fk X3dhbGtlcgoreworICBzdHJ1Y3QgZGVwX2xvYWRfdmVjCisgIHsKKyAgICBkZXBfbG9hZCAqKmFk ZHI7CisgICAgdW5zaWduZWQgc2l6ZTsKKyAgICB1bnNpZ25lZCBpbmRleDsKKworICAgIGRlcF9s b2FkICpub2RlICgpIGNvbnN0CisgICAgeworICAgICAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoaW5k ZXggPCBzaXplKTsKKyAgICAgIHJldHVybiBhZGRyW2luZGV4XTsKKyAgICB9CisgIH07CisKKyAg LyogUm9vdCBvZiBkZXBlbmRlbnQgbG9hZCB0cmVlLiAgKi8KKyAgZGVwX2xvYWQgKnJvb3Q7CisK KyAgLyogU3RhY2sgdG8gaG9sZCBjaGlsZCBkZXBlbmRlbnQgbG9hZHMgaW4gc2FtZSBsZXZlbC4g ICovCisgIGF1dG9fdmVjPGRlcF9sb2FkX3ZlYywgOD4gc3RhY2s7CisKKyAgLyogV2hldGhlciB0 byB0cmF2ZXJzZSBjaGlsZHJlbiB0cmVlIG9mIGN1cnJlbnQgbG9hZC4gICovCisgIGJvb2wgd2Fs a19jaGlsZHJlbl9wOworCitwdWJsaWM6CisgIGRlcF9sb2FkX3dhbGtlciAoKSA6IHJvb3QgKE5V TEwpLCB3YWxrX2NoaWxkcmVuX3AgKHRydWUpIHt9CisKKyAgdm9pZCBpbml0IChjb25zdCBkZXBf bG9hZCAqZGxfcm9vdCkKKyAgeworICAgIC8qIEluIHRoZSBjbGFzcywgInJvb3QiIGlzIGFjdHVh bGx5IHVzZWQgYXMgYSBjb25zdCBwb2ludGVyLCBidXQgd2UgY2FuCisgICAgICAgbm90IHN5bnRh Y3RpY2FsbHkgZGVjb3JhdGUgaXQgd2l0aCBjb25zdCBzcGVjaWZpZXIsIHRoaXMgaXMgbWVhbnQg dG8KKyAgICAgICBzdXBwb3J0IGJvdGggdXNhZ2VzIHcvbyBjb25zdCByZXF1aXJlbWVudC4gICov CisgICAgcm9vdCA9IGNvbnN0X2Nhc3Q8ZGVwX2xvYWQgKj4gKGRsX3Jvb3QpOworICAgIHdhbGtf Y2hpbGRyZW5fcCA9IHRydWU7CisKKyAgICBkZXBfbG9hZF92ZWMgZGxfdmVjID0geyAmcm9vdCwg MSwgMCB9OworICAgIHN0YWNrLnNhZmVfcHVzaCAoZGxfdmVjKTsKKyAgfQorCisgIHZvaWQgc2tp cF9jaGlsZHJlbiAoKSB7IHdhbGtfY2hpbGRyZW5fcCA9IGZhbHNlOyB9CisKKyAgZGVwX2xvYWQg Km5leHQgKCkKKyAgeworICAgIHdoaWxlICghc3RhY2suaXNfZW1wdHkgKCkpCisgICAgICB7CisJ ZGVwX2xvYWRfdmVjICZkbF92ZWMgPSBzdGFjay5sYXN0ICgpOworCisJaWYgKHdhbGtfY2hpbGRy ZW5fcCkKKwkgIHsKKwkgICAgZGVwX2xvYWQgKmRsID0gZGxfdmVjLm5vZGUgKCk7CisKKwkgICAg aWYgKCFkbC0+aXNfbGVhZiAoKSkKKwkgICAgICB7CisJCWRlcF9sb2FkX3ZlYyBuZXdfZGxfdmVj CisJCSAgPSB7IGRsLT5jaGlsZHJlbi5iZWdpbiAoKSwgZGwtPmNoaWxkcmVuLmxlbmd0aCAoKSwg MCB9OworCQlzdGFjay5zYWZlX3B1c2ggKG5ld19kbF92ZWMpOworCQlyZXR1cm4gbmV3X2RsX3Zl Yy5ub2RlICgpOworCSAgICAgIH0KKwkgIH0KKworCWlmICgrK2RsX3ZlYy5pbmRleCA8IGRsX3Zl Yy5zaXplKQorCSAgeworCSAgICB3YWxrX2NoaWxkcmVuX3AgPSB0cnVlOworCSAgICByZXR1cm4g ZGxfdmVjLm5vZGUgKCk7CisJICB9CisKKwkvKiBBbGwgY2hpbGRyZW4gaGF2ZSBiZWVuIHZpc2l0 ZWQsIGZvcmNlIHdhbGtlciB0byBhZHZhbmNlIHRvIHNpYmxpbmcKKwkgICBvZiB0aGUgY2hpbGRy ZW4ncyBwYXJlbnQuICAqLworCXdhbGtfY2hpbGRyZW5fcCA9IGZhbHNlOworCisJc3RhY2sucG9w ICgpOworICAgICAgfQorCisgICAgcmV0dXJuIE5VTEw7CisgIH0KK307CisKKyNkZWZpbmUgV0FM S19ERVBfTE9BRF9QUkVfT1JERVIoV0FMS0VSLCBST09ULCBETCkgXAorICBmb3IgKChETCkgPSAo Uk9PVCksIChXQUxLRVIpLmluaXQgKFJPT1QpOyAoREwpOyAoREwpID0gKFdBTEtFUikubmV4dCAo KSkKKworLyogRHVtcCBkZXBlbmRlbnQgbG9hZCB0cmVlIHdpdGggaW5kZW50aW9uLiAgKi8KKwor c3RhdGljIHZvaWQKK2R1bXBfZGVwX2xvYWQgKGNvbnN0IGRlcF9sb2FkICpkbF9yb290KQorewor ICBjb25zdCBkZXBfbG9hZCAqZGw7CisgIGRlcF9sb2FkX3dhbGtlciBkbF93YWxrZXI7CisKKyAg V0FMS19ERVBfTE9BRF9QUkVfT1JERVIgKGRsX3dhbGtlciwgZGxfcm9vdCwgZGwpCisgICAgewor ICAgICAgaW50IGluZGVudCA9IGRsLT5sZXZlbCAqIDI7CisgICAgICB1bnNpZ25lZCBpOworICAg ICAgZ2ltcGxlICpzdG10OworICAgICAgZGVwX2xvYWRfaW5mbyAqZGxfaW5mbzsKKworICAgICAg ZnByaW50ZiAoZHVtcF9maWxlLCAiJSpzIiwgaW5kZW50LCAiIik7CisKKyAgICAgIGlmIChkbC0+ aXNfcm9vdCAoKSkKKwlmcHJpbnRmIChkdW1wX2ZpbGUsICJyb290OlxuIik7CisgICAgICBlbHNl CisJZnByaW50ZiAoZHVtcF9maWxlLCAibGV2ZWwgJWQlczpcbiIsIGRsLT5sZXZlbCwKKwkJIGRs LT5uZWVkX2NhY2hpbmcgPyAiIiA6ICIgKG5vdCBjYWNoZWQpIik7CisKKyAgICAgIEZPUl9FQUNI X1ZFQ19FTFQgKGRsLT5kZWZfc3RtdHMsIGksIHN0bXQpCisJeworCSAgZnByaW50ZiAoZHVtcF9m aWxlLCAiJSpzIiwgaW5kZW50LCAiIik7CisJICBwcmludF9naW1wbGVfc3RtdF93aXRoX2JiIChk dW1wX2ZpbGUsIHN0bXQpOworCX0KKworICAgICAgaWYgKCFkbC0+aW52YXJfb3BuZHMuaXNfZW1w dHkgKCkpCisJeworCSAgdHJlZSBvcG5kOworCisJICBmcHJpbnRmIChkdW1wX2ZpbGUsICIlKnNJ bnZhcmlhbnQgb3BlcmFuZHM6XG4iLCBpbmRlbnQgKyAyLCAiIik7CisKKwkgIEZPUl9FQUNIX1ZF Q19FTFQgKGRsLT5pbnZhcl9vcG5kcywgaSwgb3BuZCkKKwkgICAgeworCSAgICAgIGZwcmludGYg KGR1bXBfZmlsZSwgIiUqcyIsIGluZGVudCArIDQsICIiKTsKKworCSAgICAgIGlmIChTU0FfTkFN RV9JU19ERUZBVUxUX0RFRiAob3BuZCkpCisJCXsKKwkJICBwcmludF9nZW5lcmljX2V4cHIgKGR1 bXBfZmlsZSwgb3BuZCk7CisJCSAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG4iKTsKKwkJfQorCSAg ICAgIGVsc2UKKwkJcHJpbnRfZ2ltcGxlX3N0bXRfd2l0aF9iYiAoZHVtcF9maWxlLAorCQkJCQkg ICBTU0FfTkFNRV9ERUZfU1RNVCAob3BuZCkpOworCSAgICB9CisJfQorCisgICAgICBpZiAoIWRs LT5hZGRyX3N0bXRzLmlzX2VtcHR5ICgpKQorCXsKKworCSAgZnByaW50ZiAoZHVtcF9maWxlLCAi JSpzQWRkcmVzcyBjb21wdXRhdGlvbiBzdG10czpcbiIsCisJCSAgIGluZGVudCArIDIsICIiKTsK KworCSAgRk9SX0VBQ0hfVkVDX0VMVCAoZGwtPmFkZHJfc3RtdHMsIGksIHN0bXQpCisJICAgIHsK KwkgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICIlKnMiLCBpbmRlbnQgKyA0LCAiIik7CisJICAg ICAgcHJpbnRfZ2ltcGxlX3N0bXRfd2l0aF9iYiAoZHVtcF9maWxlLCBzdG10KTsKKwkgICAgfQor CX0KKworICAgICAgRk9SX0VBQ0hfVkVDX0VMVCAoZGwtPmFuYWx5c2lzX2Zvcl9sb29wcywgaSwg ZGxfaW5mbykKKwl7CisJICBpZiAoZGxfaW5mby0+ZXhjbHVkZWQpCisJICAgIGZwcmludGYgKGR1 bXBfZmlsZSwgIiUqc0V4Y2x1ZGVkIGluIG91dGVyIGxvb3AgIyVkXG4iLAorCQkgICAgIGluZGVu dCArIDIsICIiLCBpKTsKKwl9CisgICAgfQorCisgIGlmIChkbF9yb290LT5pc19yb290ICgpKQor ICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIlxuIik7Cit9CisKKy8qIENhY2hlIGVsZW1lbnQgdHlw ZSBsYXlvdXQgcmVsYXRlZCB0aGluZ3MgZm9yIGEgZGVwZW5kZW50IGxvYWQgdHJlZS4gICovCisK K2NsYXNzIGNhY2hlX3R5cGVfaW5mbworeworcHVibGljOgorICAvKiBUaGUgImluaXQiIGZsYWcg ZmllbGQgdXNlZCB0byB0cmFjayBpZiBhIGNhY2hlIGVsZW1lbnQgaXMgaW5pdGlhbGl6ZWQuICAq LworICB0cmVlIGluaXRfZmllbGQ7CisKKyAgLyogQ2FjaGUgdHlwZSBmaWVsZHMgZm9yIGFsbCAi bmVlZC1jYWNoaW5nIiBsb2FkcyBpbiB0aGUgdHJlZSwgZ2VuZXJhdGVkCisgICAgIGluIHByZS1v cmRlciBvZiB0aGUgdHJlZS4gICovCisgIGF1dG9fdmVjPHRyZWU+IGZpZWxkczsKKworICAvKiBU aGUgc3RydWN0dXJlIHR5cGUgdG8gaG9sZCBhYm92ZSBmaWVsZHMuICAqLworICB0cmVlIHN0cnVj dF90eXBlOworCisgIC8qIE1heGltdW0gY291bnQgb2YgY2FjaGUgZWxlbWVudHMgY291bGQgYmUg YWxsb2NhdGVkLiAgKi8KKyAgaW50IG1heF9jb3VudDsKKworICBjYWNoZV90eXBlX2luZm8gKCkK KyAgICA6IGluaXRfZmllbGQgKE5VTExfVFJFRSksIHN0cnVjdF90eXBlIChOVUxMX1RSRUUpLCBt YXhfY291bnQgKDApIHt9Cit9OworCisvKiBTaW5jZSBsb2FkcyBhcmUgY2FjaGVkIGluIHRlcm0g b2YgbG9vcCBpdGVyYXRpb24sIHdlIHdpbGwgdHJ5IHRvIGNvbnN0cnVjdAorICAgYSBkZXBlbmRl bnQgdHJlZSBmb3IgYWxsIGxvYWRzIG9yZ2luYXRlZCBmcm9tIGEgbG9vcCBpdGVyYXRvciwgd2hp Y2ggaXMKKyAgIGRlc2NyaWJlZCBieSB0aGUgZGF0YSBzdHJ1Y3R1cmUuICAqLworCitjbGFzcyBs b29wX2l0ZXJfaW5mbworeworcHVibGljOgorICAvKiBUaGUgaXRlcmF0b3IncyBQSEkgc3RhdGVt ZW50IGluIHRoZSBsb29wIGhlYWRlci4gICovCisgIGdwaGkgKml0ZXJfcGhpOworCisgIC8qIFRo ZSBpdGVyYXRvcidzIGluaXRpYWxpemF0aW9uIHZhbHVlIG91dHNpZGUgdGhlIGxvb3AuICAqLwor ICB0cmVlIGl0ZXJfaW5pdDsKKworICAvKiBBbGwgc3RhdGVtZW50cyB0aGF0IGNvbXBvc2UgdG9n ZXRoZXIgYXMgYW4gaXRlcmF0b3IgYWR2YW5jaW5nCisgICAgIG9wZXJhdGlvbi4gICovCisgIGF1 dG9fdmVjPGdpbXBsZSAqPiBpdGVyX25leHRfc3RtdHM7CisKKyAgLyogUm9vdCBvZiBkZXBlbmRl bnQgbG9hZCB0cmVlIGZvciB0aGUgaXRlcmF0b3IuICAqLworICBkZXBfbG9hZCAqZGVwX2xvYWRf cm9vdDsKKworICAvKiBUaGUgbG9vcCB0aGF0IHRoZSBpdGVyYXRvciBsaWVzIGluLiAgKi8KKyAg Y2xhc3MgbG9vcCAqbWdvX2xvb3A7CisKKyAgLyogVGhlIG91dGVyIGxvb3AgdGhhdCBtZ28gc3Rh cnRzIGZyb20uICBBdCBmaXJzdCwgaXQgd2lsbCBiZSBzZXQgdG8gYQorICAgICBsZWdhbCBvbmUg YXMgb3V0ZXIgYXMgcG9zc2libGUsIGFuZCBsYXRlciBiZSBhZGp1c3RlZCB0byBhbiBvcHRpbWFs CisgICAgIG9uZSBpbiB3aGljaCB0aGUgYmVzdCBkZXBlbmRlbnQgbG9hZCBjYW5kaWRhdGVzIGNv dWxkIGJlIG9idGFpbmVkLiAgKi8KKyAgY2xhc3MgbG9vcCAqbWdvX291dGVyX2xvb3A7CisKKyAg LyogRXhwcmVzc2lvbiB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mIGNhY2hlIGFycmF5LiAgKi8KKyAg dHJlZSBjYWNoZV9kYXRhX2NvdW50OworCisgIC8qIENhY2hlIGVsZW1lbnQgdHlwZSBsYXlvdXQg aW5mb3JtYXRpb24uICAqLworICBjYWNoZV90eXBlX2luZm8gY3RfaW5mbzsKKworICAvKiBTU0Eg bmFtZSB0byByZXByZXNlbnQgbWdvIHRyYW5zZm9ybWF0aW9uIHN0YXR1cyBhdCBydW50aW1lLiAg Ki8KKyAgdHJlZSB0cmFuc19vazsKKworICBsb29wX2l0ZXJfaW5mbyAoZ3BoaSAqcGhpLCBjb25z dCBhdXRvX3ZlYzxnaW1wbGUgKj4gJm5leHRfc3RtdHMsCisJCSAgY29uc3QgYXV0b192ZWM8dHJl ZT4gJmludmFyX29wbmRzKQorICAgIDogaXRlcl9waGkgKHBoaSksIGRlcF9sb2FkX3Jvb3QgKE5V TEwpLCBjYWNoZV9kYXRhX2NvdW50IChOVUxMX1RSRUUpLAorICAgICAgdHJhbnNfb2sgKE5VTExf VFJFRSkKKyAgeworICAgIHVuc2lnbmVkIGk7CisgICAgdHJlZSBvcG5kOworCisgICAgaXRlcl9u ZXh0X3N0bXRzLnNhZmVfc3BsaWNlIChuZXh0X3N0bXRzKTsKKworICAgIG1nb19sb29wID0gZ2lt cGxlX2JiIChwaGkpLT5sb29wX2ZhdGhlcjsKKyAgICBpdGVyX2luaXQgPSBQSElfQVJHX0RFRl9G Uk9NX0VER0UgKHBoaSwgbG9vcF9wcmVoZWFkZXJfZWRnZSAobWdvX2xvb3ApKTsKKworICAgIC8q IEluaXRpYWxpemUgdG8gdGhlIG91dGVybW9zdCByZWFsIGxvb3AuICAqLworICAgIG1nb19vdXRl cl9sb29wID0gc3VwZXJsb29wX2F0X2RlcHRoIChtZ29fbG9vcCwgMSk7CisKKyAgICBGT1JfRUFD SF9WRUNfRUxUIChpbnZhcl9vcG5kcywgaSwgb3BuZCkKKyAgICAgIGFkanVzdF9vdXRlcl9sb29w X2Zvcl9leHByIChvcG5kKTsKKyAgfQorCisgIH5sb29wX2l0ZXJfaW5mbyAoKQorICB7CisgICAg aWYgKGRlcF9sb2FkX3Jvb3QpCisgICAgICBkZWxldGUgZGVwX2xvYWRfcm9vdDsKKyAgfQorCisg IGJvb2wgcG9zdF9jaGVjayAoKTsKKyAgYm9vbCBjbGVhbl90cml2aWFsX2RlcF9sb2FkICgpIGNv bnN0OworICBib29sIHByb2Nlc3NfZGVwX2xvYWQgKCk7CisgIGJvb2wgbWVyZ2UgKGNsYXNzIGxv b3BfaXRlcl9pbmZvICopOworICB2b2lkIGluc2VydF9tZ29fY29kZSAoKTsKKworcHJpdmF0ZToK KyAgYm9vbCBhZGp1c3Rfb3V0ZXJfbG9vcCAoY2xhc3MgbG9vcCAqb3V0ZXJfbG9vcCkKKyAgewor ICAgIGdjY19jaGVja2luZ19hc3NlcnQgKG1nb19vdXRlcl9sb29wICE9IG1nb19sb29wKTsKKwor ICAgIGlmIChmbG93X2xvb3BfbmVzdGVkX3AgKG1nb19vdXRlcl9sb29wLCBvdXRlcl9sb29wKSkK KyAgICAgIHsKKwltZ29fb3V0ZXJfbG9vcCA9IG91dGVyX2xvb3A7CisKKwlpZiAob3V0ZXJfbG9v cCA9PSBtZ29fbG9vcCkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgIGdjY19jaGVj a2luZ19hc3NlcnQgKGZsb3dfbG9vcF9uZXN0ZWRfcCAob3V0ZXJfbG9vcCwgbWdvX2xvb3ApKTsK KyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qIEFkanVzdCBtZ29fb3V0ZXJfbG9vcCB0byBh IGxvb3AsIGFzIG91dGVyIGFzIHBvc3NpYmxlLCBpbiB3aGljaCBFWFBSCisgICAgIHJlbWFpbnMg aW52YXJpYW50LiAgKi8KKworICBib29sIGFkanVzdF9vdXRlcl9sb29wX2Zvcl9leHByICh0cmVl IGV4cHIpCisgIHsKKyAgICBjbGFzcyBsb29wICppbnZhcl9sb29wCisJPSBvdXRlcm1vc3RfaW52 YXJpYW50X2xvb3BfZm9yX2V4cHIgKG1nb19sb29wLCBleHByKTsKKworICAgIC8qIFRoZSBleHBy ZXNzaW9uIHNob3VsZCBiZSBtZ29fbG9vcCBpbnZhcmlhbnQgYXQgbGVhc3QuICAqLworICAgIGdj Y19jaGVja2luZ19hc3NlcnQgKGludmFyX2xvb3ApOworCisgICAgcmV0dXJuIGFkanVzdF9vdXRl cl9sb29wIChpbnZhcl9sb29wKTsKKyAgfQorCisgIHVuc2lnbmVkIGFuYWx5emVfZGVwX2xvYWRf aW5fbG9vcCAoY2xhc3MgbG9vcCAqKTsKKyAgYm9vbCBwcnVuZV9kZXBfbG9hZCAoKSBjb25zdDsK KyAgYm9vbCBmaW5hbGl6ZV9kZXBfbG9hZCAoKSBjb25zdDsKKworICBib29sIGdlbl9jYWNoZV90 eXBlX2luZm8gKCk7CisgIHZvaWQgZ2VuX2NhY2hpbmdfY29kZSAoKSBjb25zdDsKKyAgdHJlZSBn ZW5fY2FjaGVfYXJyYXkgKCkgY29uc3Q7CisgIHRyZWUgZ2VuX2NhY2hlX2RhdGFfcG9pbnRlciAo KSBjb25zdDsKK307CisKKy8qIFJldHVybiB0cnVlIGlmIFNUTVQgaXMgYW4gYXNzaWdubWVudCBj b3B5IGZyb20gYSBTU0EgbmFtZS4gICovCisKK3N0YXRpYyBib29sCithc3NpZ25fc3NhX2NvcHlf cCAoY29uc3QgZ2ltcGxlICpzdG10KQoreworICBpZiAoIWlzX2dpbXBsZV9hc3NpZ24gKHN0bXQp KQorICAgIHJldHVybiBmYWxzZTsKKworICB0cmVlIHJocyA9IGdpbXBsZV9hc3NpZ25fcmhzMSAo c3RtdCk7CisKKyAgaWYgKGdpbXBsZV9hc3NpZ25fc2luZ2xlX3AgKHN0bXQpKQorICAgIHJldHVy biBUUkVFX0NPREUgKHJocykgPT0gU1NBX05BTUU7CisKKyAgaWYgKENPTlZFUlRfRVhQUl9DT0RF X1AgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQpKSkKKyAgICB7CisgICAgICB0cmVlIGxo cyA9IGdpbXBsZV9hc3NpZ25fbGhzIChzdG10KTsKKworICAgICAgaWYgKFRSRUVfQ09ERSAocmhz KSA9PSBTU0FfTkFNRQorCSAgJiYgdHlwZXNfY29tcGF0aWJsZV9wIChUUkVFX1RZUEUgKGxocyks IFRSRUVfVFlQRSAocmhzKSkpCisJcmV0dXJuIHRydWU7CisgICAgfQorCisgIHJldHVybiBmYWxz ZTsKK30KKworLyogUmV0dXJucyBvdXRlciBwYXJlbnQgbG9vcCBvZiBMT09QLCBhbmQgMC1iYXNl ZCBJTkRFWCBpcyBudW1iZXJlZCBzdGFydGluZworICAgZnJvbSBMT09QIGl0c2VsZiB0byB0aGUg b3V0ZXJtb3N0LiAgKi8KKworc3RhdGljIGlubGluZSBjbGFzcyBsb29wICoKK2xvb3BfcGFyZW50 IChjbGFzcyBsb29wICpsb29wLCB1bnNpZ25lZCBpbmRleCkKK3sKKyAgdW5zaWduZWQgZGVwdGgg PSBsb29wX2RlcHRoIChsb29wKTsKKworICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChkZXB0aCA+PSBp bmRleCk7CisKKyAgcmV0dXJuIHN1cGVybG9vcF9hdF9kZXB0aCAobG9vcCwgZGVwdGggLSBpbmRl eCk7Cit9CisKKy8qIFJldHVybnMgdGhlIHJlbGF0aXZlIGRlcHRoIG9mIExPT1AgYWdhaW5zdCBP VVRFUl9MT09QLiAgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZAorbG9vcF9yZWxhdGl2ZV9k ZXB0aCAoY29uc3QgY2xhc3MgbG9vcCAqb3V0ZXJfbG9vcCwgY29uc3QgY2xhc3MgbG9vcCAqbG9v cCkKK3sKKyAgZ2NjX2NoZWNraW5nX2Fzc2VydCAob3V0ZXJfbG9vcCA9PSBsb29wCisJCSAgICAg ICB8fCBmbG93X2xvb3BfbmVzdGVkX3AgKG91dGVyX2xvb3AsIGxvb3ApKTsKKworICByZXR1cm4g bG9vcF9kZXB0aCAobG9vcCkgLSBsb29wX2RlcHRoIChvdXRlcl9sb29wKTsKK30KKworLyogVHJ5 IHRvIGRlZHVjZSBhIHJlcHJlc2VudGFibGUgY2FjaGUgZGF0YSBjb3VudCBleHByZXNzaW9uIGZv ciBtZ28gb24gdGhlCisgICBpdGVyYXRvciwgd2hpY2ggc2hvdWxkIGJlIG5vdCBsZXNzIHRoYW4g aXRlcmF0aW9uIGNvdW50LiAgQW5kIGNoZWNrIHdoZXRoZXIKKyAgIHRoZXJlIGV4aXN0cyBhbiBv dXRlciBsb29wIGluIHdoaWNoIGluaXRpYWwgdmFsdWUgb2YgdGhlIGl0ZXJhdG9yIGFuZCB0aGUK KyAgIGNhY2hlIGRhdGEgY291bnQgZXhwcmVzc2lvbiBtdXN0IGJlIGludmFyaWFudC4gIFJldHVy biBmYWxzZSBpZiBzb21lCisgICBjb25kaXRpb24gY291bGQgbm90IGJlIHNhdGlzZmllZC4gICov CisKK2Jvb2wKK2xvb3BfaXRlcl9pbmZvOjpwb3N0X2NoZWNrICgpCit7CisgIGlmICghYWRqdXN0 X291dGVyX2xvb3BfZm9yX2V4cHIgKGl0ZXJfaW5pdCkpCisgICAgcmV0dXJuIGZhbHNlOworCisg IHRyZWUgbml0ZXIgPSBnZXRfbG9vcF9pdGVyYXRpb25zIChtZ29fbG9vcCk7CisKKyAgaWYgKG5p dGVyID09IGNocmVjX2RvbnRfa25vdykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFhZGp1 c3Rfb3V0ZXJfbG9vcF9mb3JfZXhwciAobml0ZXIpKQorICAgIHJldHVybiBmYWxzZTsKKworICAv KiBIZXJlIGNhY2hlIGRhdGEgY291bnQgaXMgYXNzdW1lZCB0byBiZSBzaWduZWQgaW50ZWdlciwg d2hpY2ggbWlnaHQgYmUKKyAgICAgdG9vIHN0cmljdGVyIGZvciB1bnNpZ25lZCBpbnRlZ2VyIGxv b3AgaW5kZXgsIGJ1dCBzaG91bGQgYmUgZW5vdWdoIGluCisgICAgIHJlYWwgYXBwbGljYXRpb24u ICBTbyBtYXhpbXVtIGNvdW50IGRvZXMgbm90IGV4Y2VlZCB1cHBlciBib3VuZCBvZgorICAgICBz aWduZWQgaW50ZWdlciB0eXBlLiAgKi8KKyAgdHJlZSBuaXRlcl90eXBlID0gVFJFRV9UWVBFIChu aXRlcik7CisgIGludCBwcmVjID0gTUlOIChUWVBFX1BSRUNJU0lPTiAobml0ZXJfdHlwZSksIFRZ UEVfUFJFQ0lTSU9OIChzaXpldHlwZSkpOworICB3aWRlX2ludCBtYXhfdmFsdWUgPSB3aTo6bWF4 X3ZhbHVlIChwcmVjLCBTSUdORUQpOworICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIG1heF9jb3Vu dCA9IHBhcmFtX21nb19tYXhfY2FjaGVfYXJyYXlfbGVuZ3RoOworCisgIGlmICh3aTo6Zml0c191 aHdpX3AgKG1heF92YWx1ZSkpCisgICAgbWF4X2NvdW50ID0gTUlOIChtYXhfY291bnQsIG1heF92 YWx1ZS50b191aHdpICgpKTsKKworICAvKiBTa2lwIG1nbyBpZiBjYWNoZSBkYXRhIGNvdW50IHRo cmVzaG9sZHMgYXJlIHVucmVhc29uYWJsZS4gICovCisgIGlmIChtYXhfY291bnQgPCAodW5zaWdu ZWQgSE9TVF9XSURFX0lOVCkgcGFyYW1fbWdvX21pbl9jYWNoZV9hcnJheV9sZW5ndGgpCisgICAg cmV0dXJuIGZhbHNlOworCisgIGN0X2luZm8ubWF4X2NvdW50ID0gbWF4X2NvdW50OworICBjYWNo ZV9kYXRhX2NvdW50ID0gbml0ZXI7CisKKyAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAm IFRERl9ERVRBSUxTKSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpOworICAgICAgZ2ltcGxlICpz dG10OworCisgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICI+IGl0ZXJhdG9yIGZvdW5kIGluIGxv b3AgJWQgKGRlcHRoICV1KTpcbiIsCisJICAgICAgIG1nb19sb29wLT5udW0sIGxvb3BfZGVwdGgg KG1nb19sb29wKSk7CisgICAgICBwcmludF9naW1wbGVfc3RtdF93aXRoX2JiIChkdW1wX2ZpbGUs IGl0ZXJfcGhpKTsKKworICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiPiBpdGVyYXRvciBhZHZh bmNpbmcgc3RtdHM6XG4iKTsKKyAgICAgIEZPUl9FQUNIX1ZFQ19FTFQgKGl0ZXJfbmV4dF9zdG10 cywgaSwgc3RtdCkKKwlwcmludF9naW1wbGVfc3RtdF93aXRoX2JiIChkdW1wX2ZpbGUsIHN0bXQp OworCisgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICI+IGl0ZXJhdG9yIGNhY2hlIGRhdGEgY291 bnQ6XG4iKTsKKyAgICAgIHByaW50X2dlbmVyaWNfZXhwciAoZHVtcF9maWxlLCBjYWNoZV9kYXRh X2NvdW50LCBUREZfTk9ORSk7CisgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOworCisg ICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICI+IGl0ZXJhdG9yIG1nbyBvdXRlciBsb29wICVkIChk ZXB0aCAldSlcbiIsCisJICAgICAgIG1nb19vdXRlcl9sb29wLT5udW0sIGxvb3BfZGVwdGggKG1n b19vdXRlcl9sb29wKSk7CisgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOworICAgIH0K KworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQW5hbHl6ZSBlYWNoIGxvYWQgaW4gZGVwZW5kZW5n IGxvYWQgdHJlZSB0byBjaGVjayB3aGV0aGVyIGl0IGNvdWxkIGtlZXAKKyAgIGludmFyaWFudCB3 aGVuIE9VVEVSX0xPT1AgaXMgaW5jbHVkZWQgaW4gbG9vcCBoaWVyYXJjaHkgZm9yIG1nby4gIFJl dHVybgorICAgdHJ1ZSBpZiB0aGVyZSBleGlzdHMgYW55IHN1Y2gga2luZCBvZiBsb2FkLCB3aGlj aCB3b3VsZCBiZSBjYW5kaWRhdGUgZm9yCisgICBjYWNoaW5nLiAgKi8KKwordW5zaWduZWQKK2xv b3BfaXRlcl9pbmZvOjphbmFseXplX2RlcF9sb2FkX2luX2xvb3AgKGNsYXNzIGxvb3AgKm91dGVy X2xvb3ApCit7CisgIGNsYXNzIGxvb3AgKnNraXBfbG9vcCA9IE5VTEw7CisgIHVuc2lnbmVkIGlu ZGV4ID0gbG9vcF9yZWxhdGl2ZV9kZXB0aCAob3V0ZXJfbG9vcCwgbWdvX2xvb3ApOworICBsb29w X21nb19pbmZvICpvdXRlcl9tZ29faW5mbyA9IGdldF9tZ29faW5mbyAob3V0ZXJfbG9vcCk7Cisg IGRlcF9sb2FkX3dhbGtlciBkbF93YWxrZXI7CisgIGRlcF9sb2FkICpkbDsKKyAgdW5zaWduZWQg bl9sb2FkcyA9IDA7CisgIGdpbXBsZSAqc3RtdDsKKyAgZ2ltcGxlICpzdG9yZTsKKyAgYW9fcmVm IHJlZjsKKyAgdW5zaWduZWQgaTsKKworICBpZiAoaW5kZXgpCisgICAgc2tpcF9sb29wID0gbG9v cF9wYXJlbnQgKG1nb19sb29wLCBpbmRleCAtIDEpOworCisgIGdldF92ZGVmc19pbl9sb29wIChv dXRlcl9sb29wKTsKKworICAvKiBXZSBzaG91bGQgZW5zdXJlIHRoYXQgaXRlcmF0b3IgYWR2YW5j ZXMgd2l0aCBjb25zdGFudCBzdGF0ZSB0cmFuc2l0aW9uLgorICAgICBUbyBiZSBzcGVjaWZpYywg dGhpcyBtZWFucyB0aGF0IGluZGV4IGl0ZXJhdG9yIGhhcyBjb25zdGFudCBzdHJpZGUsIGFuZAor ICAgICBsaXN0IGl0ZXJhdG9yIGhhcyBjb25zdGFudCBsaW5rYWdlLiAgU28sIGFsbCBtZW1vcnkg b3BlcmFuZHMgdXNlZCBpbgorICAgICBpdGVyYXRvciBhZHZhbmNpbmcgb3BlcmF0aW9uIGlzIHJl cXVpcmVkIHRvIGJlIGludmFyaWFudCBpbgorICAgICBPVVRFUl9MT09QLiAgKi8KKyAgRk9SX0VB Q0hfVkVDX0VMVCAoaXRlcl9uZXh0X3N0bXRzLCBpLCBzdG10KQorICAgIHsKKyAgICAgIHVuc2ln bmVkIGo7CisKKyAgICAgIGlmICghZ2ltcGxlX3Z1c2UgKHN0bXQpKQorCWNvbnRpbnVlOworICAg ICAgZWxzZSBpZiAoZ2ltcGxlX2Fzc2lnbl9sb2FkX3AgKHN0bXQpKQorCWFvX3JlZl9pbml0ICgm cmVmLCBnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpKTsKKyAgICAgIGVsc2UgaWYgKG91dGVyX21n b19pbmZvLT5oYXNfdmRlZnMgKCkpCisJcmV0dXJuIDA7CisKKyAgICAgIEZPUl9FQUNIX1ZFQ19F TFQgKG91dGVyX21nb19pbmZvLT5zdG9yZV92ZGVmcywgaiwgc3RvcmUpCisJeworCSAgaWYgKHNr aXBfbG9vcAorCSAgICAgICYmIGZsb3dfYmJfaW5zaWRlX2xvb3BfcCAoc2tpcF9sb29wLCBnaW1w bGVfYmIgKHN0b3JlKSkpCisJICAgIGNvbnRpbnVlOworCisJICBpZiAoc3RtdF9tYXlfY2xvYmJl cl9yZWZfcF8xIChzdG9yZSwgJnJlZikpCisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAg V0FMS19ERVBfTE9BRF9QUkVfT1JERVIgKGRsX3dhbGtlciwgZGVwX2xvYWRfcm9vdCwgZGwpCisg ICAgeworICAgICAgaWYgKGluZGV4KQorCXsKKwkgIGRlcF9sb2FkX2luZm8gKmxhc3RfZGxfaW5m byA9IGRsLT5hbmFseXNpc19mb3JfbG9vcHMubGFzdCAoKTsKKworCSAgLyogSGVyZSBpcyBhbiBp bXBsaWNpdCBjb25zdHJhaW50IG9uIGludm9jYXRpb24gb2YgdGhpcyBmdW5jdGlvbi4KKwkgICAg IFdlIGFzc3VtZSB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gTE9PUCB0 byBpdHMKKwkgICAgIG91dGVyIHBhcmVudHMgb25lLWJ5LW9uZS4gIEhlcmUgYWRkIGFzc2VydGlv biB0byBkZXRlY3QgdmlvbGF0aW9uCisJICAgICBvZiB0aGlzIGFzc3VtcHRpb24uICAqLworCSAg aWYgKGxhc3RfZGxfaW5mby0+ZXhjbHVkZWQpCisJICAgIHsKKwkgICAgICAvKiBJZiB0aGUgbG9h ZCBpcyB1bmFibGUgdG8ga2VlcCBpbnZhcmlhbnQgaW4gY2VydGFpbiBpbm5lcgorCQkgcGFyZW50 IGxvb3AsIGl0IGlzIGFsc28gbm90IGluIG91dGVyIHBhcmVudCBsb29wLiAgKi8KKwkgICAgICBn Y2NfY2hlY2tpbmdfYXNzZXJ0ICghZGwtPmlzX3Jvb3QgKCkpOworCisJICAgICAgZGxfd2Fsa2Vy LnNraXBfY2hpbGRyZW4gKCk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgZ2NjX2No ZWNraW5nX2Fzc2VydCAoZGwtPmFuYWx5c2lzX2Zvcl9sb29wcy5sZW5ndGggKCkgPT0gaW5kZXgp OworCX0KKworICAgICAgZGVwX2xvYWRfaW5mbyAqZGxfaW5mbyA9IG5ldyBkZXBfbG9hZF9pbmZv ICgpOworCisgICAgICBkbC0+YW5hbHlzaXNfZm9yX2xvb3BzLnNhZmVfcHVzaCAoZGxfaW5mbyk7 CisKKyAgICAgIGlmIChkbC0+aXNfcm9vdCAoKSkKKwljb250aW51ZTsKKworICAgICAgZGxfaW5m by0+ZXhjbHVkZWQgPSB0cnVlOworCisgICAgICB0cmVlIG9wbmQ7CisKKyAgICAgIEZPUl9FQUNI X1ZFQ19FTFQgKGRsLT5pbnZhcl9vcG5kcywgaSwgb3BuZCkKKwl7CisJICAvKiBJZiBhbiBvcGVy YW5kIGZvciBsb2FkIGFkZHJlc3MgY29tcHV0YXRpb24gYmVjb21lcyB2YXJpYW50IGluCisJICAg ICBPVVRFUl9MT09QLCB0aGUgbG9hZCBoYXMgdG8gYmUgZXhjbHVkZWQuICAqLworCSAgaWYgKCFl eHByX2ludmFyaWFudF9pbl9sb29wX3AgKG91dGVyX2xvb3AsIG9wbmQpKQorCSAgICBnb3RvIHdh bGtfbmV4dDsKKwl9CisKKyAgICAgIGFvX3JlZl9pbml0ICgmcmVmLCBnaW1wbGVfYXNzaWduX3Jo czEgKGRsLT5kZWZfc3RtdHNbMF0pKTsKKworICAgICAgRk9SX0VBQ0hfVkVDX0VMVCAob3V0ZXJf bWdvX2luZm8tPnN0b3JlX3ZkZWZzLCBpLCBzdG9yZSkKKwl7CisJICBpZiAoc2tpcF9sb29wCisJ ICAgICAgJiYgZmxvd19iYl9pbnNpZGVfbG9vcF9wIChza2lwX2xvb3AsIGdpbXBsZV9iYiAoc3Rv cmUpKSkKKwkgICAgY29udGludWU7CisKKwkgIGlmIChzdG10X21heV9jbG9iYmVyX3JlZl9wXzEg KHN0b3JlLCAmcmVmKSkKKwkgICAgZ290byB3YWxrX25leHQ7CisJfQorCisgICAgICBkbF9pbmZv LT5leGNsdWRlZCA9IGZhbHNlOworICAgICAgbl9sb2FkcysrOworCisgICAgd2Fsa19uZXh0Ogor ICAgICAgLyogSWYgYSBsb2FkIGlzIGV4Y2x1ZGVkLCBubyBuZWVkIHRvIHByb2Nlc3MgaXRzIGNo aWxkcmVuIGRlcGVuZGVudAorCSBsb2FkIHRyZWUuICAqLworICAgICAgaWYgKGRsX2luZm8tPmV4 Y2x1ZGVkKQorCWRsX3dhbGtlci5za2lwX2NoaWxkcmVuICgpOworICAgIH0KKworICBpZiAoZHVt cF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQorICAgIHsKKyAgICAgIGZwcmlu dGYgKGR1bXBfZmlsZSwgIj4gQW5hbHl6aW5nIGRlcGVuZGVudCBsb2FkIGluIGxvb3AgJWQgIgor CSAgICAgICAiKGRlcHRoICV1KTpcbiIsIG91dGVyX2xvb3AtPm51bSwgbG9vcF9kZXB0aCAob3V0 ZXJfbG9vcCkpOworICAgICAgZHVtcF9kZXBfbG9hZCAoZGVwX2xvYWRfcm9vdCk7CisgICAgfQor CisgIHJldHVybiBuX2xvYWRzOworfQorCisvKiBJbiBtb3N0IHNpdHVhdGlvbnMsIHRoZXJlIGlz IG5vIGJlbmVmaXQgdG8gY2FjaGUgbGV2ZWwgMSBsb2FkLCBzbyByZW1vdmUKKyAgIHRoZSBsb2Fk IGlmIGl0IGhhcyBubyBjaGlsZHJlbi4gIFJldHVybiB0cnVlIGlmIHRoZSByb290IGNvbnRhaW5z IG5vdGhpbmcuCisgICBUT0RPOiBtZ28gY291bGQgYWxzbyBiZSBhcHBsaWVkIHRvIHRoZSBjYXNl IHdoZXJlIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lCisgICBsZXZlbCAxIGxvYWRzLCBhbmQgYWxs IG9mIHRoZW0gYXJlIGZyb20gZGlmZmVyZW50IG1lbW9yeSByZWdpb25zLgorICAgRm9yIGV4YW1w bGU6CisKKyAgICAgbG9vcCAoaSkgICAgICAgICAgICAgICAgICBsb29wIChpKQorICAgICAgIHsg ICAgICAgICAgICAgICAgICAgICAgICAgeworCSAuLi4gPSBBW2ldOyAgICAgICAgICAgICAgIC4u LiA9IGNhY2hlX2FycltpXS5BOworCSAuLi4gPSBCW2ldOyAgICAgID0+ICAgICAgIC4uLiA9IGNh Y2hlX2FycltpXS5COworCSAuLi4gPSBDW2ldOyAgICAgICAgICAgICAgIC4uLiA9IGNhY2hlX2Fy cltpXS5DOworICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICBUaGlzIGNh biBpbXByb3ZlIGNhY2hlIGVmZmNpZW5jeSBieSByZWR1Y2luZyBoYXJkd2FyZSBtZW1vcnkgYWNj ZXNzCisgICBzdHJlYW1zLiAgKi8KKworYm9vbAorbG9vcF9pdGVyX2luZm86OmNsZWFuX3RyaXZp YWxfZGVwX2xvYWQgKCkgY29uc3QKK3sKKyAgZGVwX2xvYWQgKmRsOworICB1bnNpZ25lZCBpOwor CisgIEZPUl9FQUNIX1ZFQ19FTFQgKGRlcF9sb2FkX3Jvb3QtPmNoaWxkcmVuLCBpLCBkbCkKKyAg ICB7CisgICAgICBpZiAoZGwtPmlzX2xlYWYgKCkpCisJZGVwX2xvYWRfcm9vdC0+cmVtb3ZlX2No aWxkIChpLS0pOworICAgICAgZWxzZQorCWRsLT5uZWVkX2NhY2hpbmcgPSBmYWxzZTsKKyAgICB9 CisKKyAgcmV0dXJuIGRlcF9sb2FkX3Jvb3QtPmlzX2xlYWYgKCk7Cit9CisKKy8qIENoZWNrIHdo ZXRoZXIgREwwIGFuZCBETDEgYXJlIGZyb20gc2FtZSBzdHJ1Y3QvY2xhc3Mgb2JqZWN0LiAgKi8K Kworc3RhdGljIGJvb2wKK2hhc19zYW1lX2NvbXBvbmVudF9iYXNlX3AgKGNvbnN0IGRlcF9sb2Fk ICpkbDAsIGNvbnN0IGRlcF9sb2FkICpkbDEpCit7CisgIHRyZWUgbWVtcmVmMCA9IGdpbXBsZV9h c3NpZ25fcmhzMSAoZGwwLT5kZWZfc3RtdHNbMF0pOworICB0cmVlIG1lbXJlZjEgPSBnaW1wbGVf YXNzaWduX3JoczEgKGRsMS0+ZGVmX3N0bXRzWzBdKTsKKyAgZW51bSB0cmVlX2NvZGUgY29kZTAg PSBUUkVFX0NPREUgKG1lbXJlZjApOworICBlbnVtIHRyZWVfY29kZSBjb2RlMSA9IFRSRUVfQ09E RSAobWVtcmVmMSk7CisKKyAgLyogVE9ETzogVHdvIGxvYWRzIG1heSByb290IHRvIGRpZmZlcmVu dCBpbm5lciBvYmplY3RzIG9mIHNhbWUgc3RydWN0L2NsYXNzCisgICAgIChlLmcuICBiYXNlLT5h cnJbM10uZjEgYW5kIGJhc2UtPmYyKS4gICovCisgIGlmIChjb2RlMCAhPSBDT01QT05FTlRfUkVG ICYmIGNvZGUwICE9IEJJVF9GSUVMRF9SRUYgJiYKKyAgICAgIGNvZGUwICE9IFJFQUxQQVJUX0VY UFIgJiYgY29kZTAgIT0gSU1BR1BBUlRfRVhQUikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYg KGNvZGUxICE9IENPTVBPTkVOVF9SRUYgJiYgY29kZTEgIT0gQklUX0ZJRUxEX1JFRiAmJgorICAg ICAgY29kZTEgIT0gUkVBTFBBUlRfRVhQUiAmJiBjb2RlMSAhPSBJTUFHUEFSVF9FWFBSKQorICAg IHJldHVybiBmYWxzZTsKKworICByZXR1cm4gb3BlcmFuZF9lcXVhbF9wIChUUkVFX09QRVJBTkQg KG1lbXJlZjAsIDApLCBUUkVFX09QRVJBTkQgKG1lbXJlZjEsIDApLAorCQkJICBPRVBfQUREUkVT U19PRik7Cit9CisKKy8qIFBydW5lIGRlcGVuZGVudCBsb2FkIHRyZWUgdG8gZXhjbHVkZSBzb21l IGxvYWRzIHRvIGF2b2lkIHJ1bnRpbWUgdHJhcC4KKyAgIFJldHVybiB0cnVlIGlmIGRlcGVuZGVu dCBsb2FkIHRyZWUgaXMgbm90IGVtcHR5LiAgKi8KKworYm9vbAorbG9vcF9pdGVyX2luZm86OnBy dW5lX2RlcF9sb2FkICgpIGNvbnN0Cit7CisgIGJhc2ljX2Jsb2NrIGxhc3RfYWx3YXlzX2V4ZWN1 dGVkID0gbWdvX2xvb3AtPmxhdGNoOworICBhdXRvX3ZlYzxlZGdlPiBleGl0cyA9IGdldF9sb29w X2V4aXRfZWRnZXMgKG1nb19sb29wKTsKKyAgdW5zaWduZWQgaTsKKyAgZWRnZSBleDsKKyAgZGVw X2xvYWRfd2Fsa2VyIGRsX3dhbGtlcjsKKyAgZGVwX2xvYWQgKmRsOworCisgIC8qIEdldCB0aGUg bGFzdCBhbHdheXMgZXhlY3V0ZWQgYmFzaWMgYmxvY2sgaW4gbG9vcC4gICovCisgIEZPUl9FQUNI X1ZFQ19FTFQgKGV4aXRzLCBpLCBleCkKKyAgICBsYXN0X2Fsd2F5c19leGVjdXRlZCA9IG5lYXJl c3RfY29tbW9uX2RvbWluYXRvciAoCisJCQlDRElfRE9NSU5BVE9SUywgbGFzdF9hbHdheXNfZXhl Y3V0ZWQsIGV4LT5zcmMpOworCisgIFdBTEtfREVQX0xPQURfUFJFX09SREVSIChkbF93YWxrZXIs IGRlcF9sb2FkX3Jvb3QsIGRsKQorICAgIHsKKyAgICAgIGRlcF9sb2FkICpjaGlsZDsKKworICAg ICAgaWYgKGRsLT5pc19sZWFmICgpKQorCWNvbnRpbnVlOworCisgICAgICAvKiBJZiBhIGNoaWxk IGlzIGFsd2F5cyBleGVjdXRlZCwgaXQgaXMgbm9uLXRyYXBwaW5nLiAgQXMgb3RoZXIKKwkgY2hp bGRyZW4gYXJlIGxvYWRlZCBmcm9tIHRoZSBzYW1lIGJhc2UgKG9mIHN0cnVjdHVyZSB0eXBlKSwK KwkgdGhleSBhcmUgYWxzbyBub24tdHJhcHBpbmcuICAqLworICAgICAgYXV0b19kZWxldGVfdmVj PGRlcF9sb2FkPiBtYXlfdHJhcF9jaGlsZHJlbjsKKworICAgICAgLyogTW92ZSB0aGUgY2hpbGQg dGhhdCBkb2Vzbid0IGFsd2F5cyBleGVjdXRlIGluIHRoZSBsb29wIHRvCisJICdtYXlfdHJhcF9j aGlsZHJlbicuICAqLworICAgICAgRk9SX0VBQ0hfVkVDX0VMVCAoZGwtPmNoaWxkcmVuLCBpLCBj aGlsZCkKKwl7CisJICBpZiAoIWRvbWluYXRlZF9ieV9wIChDRElfRE9NSU5BVE9SUywgbGFzdF9h bHdheXNfZXhlY3V0ZWQsCisJCQkgICAgICBnaW1wbGVfYmIgKGNoaWxkLT5kZWZfc3RtdHNbMF0p KSkKKwkgICAgeworCSAgICAgIGRsLT5jaGlsZHJlbi51bm9yZGVyZWRfcmVtb3ZlIChpLS0pOwor CSAgICAgIG1heV90cmFwX2NoaWxkcmVuLnNhZmVfcHVzaCAoY2hpbGQpOworCSAgICB9CisJfQor CisgICAgICB1bnNpZ25lZCBub25fdHJhcF9jb3VudCA9IGRsLT5jaGlsZHJlbi5sZW5ndGggKCk7 CisKKyAgICAgIC8qIElmIGEgY2hpbGQgaW4gJ21heV90cmFwX2NoaWxkcmVuJyBoYXMgdGhlIHNh bWUgYmFzZSBhcyB0aGUgb25lcyB0aGF0CisJIGFsd2F5cyBleGVjdXRlIGluIHRoZSBsb29wLCBt b3ZlIGl0IGJhY2suICAqLworICAgICAgRk9SX0VBQ0hfVkVDX0VMVCAobWF5X3RyYXBfY2hpbGRy ZW4sIGksIGNoaWxkKQorCXsKKwkgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBub25fdHJhcF9j b3VudDsgaisrKQorCSAgICB7CisJICAgICAgaWYgKGhhc19zYW1lX2NvbXBvbmVudF9iYXNlX3Ag KGNoaWxkLCBkbC0+Y2hpbGRyZW5bal0pKQorCQl7CisJCSAgZGwtPmNoaWxkcmVuLnNhZmVfcHVz aCAoY2hpbGQpOworCQkgIG1heV90cmFwX2NoaWxkcmVuLnVub3JkZXJlZF9yZW1vdmUgKGktLSk7 CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgaWYgKGR1bXBfZmlsZSAmJiAo ZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKQorCSAgJiYgIW1heV90cmFwX2NoaWxkcmVuLmlzX2Vt cHR5ICgpKQorCXsKKwkgIGZwcmludGYgKGR1bXBfZmlsZSwgIj4gUHJ1bmluZyBtYXktdHJhcCBk ZXBlbmRlbnQgbG9hZHM6XG4iKTsKKworCSAgRk9SX0VBQ0hfVkVDX0VMVCAobWF5X3RyYXBfY2hp bGRyZW4sIGksIGNoaWxkKQorCSAgICBkdW1wX2RlcF9sb2FkIChjaGlsZCk7CisJfQorCisgICAg ICBGT1JfRUFDSF9WRUNfRUxUIChkbC0+Y2hpbGRyZW4sIGksIGNoaWxkKQorCXsKKwkgIGlmIChj aGlsZC0+ZXhjbHVkZWRfcCAoMCkpCisJICAgIHsKKwkgICAgICBpZiAoZHVtcF9maWxlICYmIChk dW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQorCQl7CisJCSAgZnByaW50ZiAoZHVtcF9maWxlLCAi PiBQcnVuaW5nIGRlcGVuZGVudCBsb2FkIGFnYWluc3QgIgorCQkJCSAgICAgICJtZ286XG4iKTsK KworCQkgIGR1bXBfZGVwX2xvYWQgKGNoaWxkKTsKKwkJfQorCisJICAgICAgZGwtPnJlbW92ZV9j aGlsZCAoaS0tKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuICFkZXBfbG9hZF9yb290 LT5pc19sZWFmICgpOworfQorCisvKiBGbGFnIG9uIHN0YXRlbWVudCB0byBpbmRpY2F0ZSBpdCBp cyBhIG5vZGUgaW4gZGVwZW5kZW50IGxvYWQgdHJlZS4gICovCisjZGVmaW5lIEdGX0RFUF9MT0FE ICAgIEdGX1BMRl8xCisKKy8qIEZsYWcgb24gc3RhdGVtZW50IHRvIGluZGljYXRlIGl0IGlzIGlu Y2x1ZGVkIGluIGRlcGVuZGVudCBsb2FkIHRyZWUuICovCisjZGVmaW5lIEdGX0lOQ0xVREVEICAg IEdGX1BMRl8yCisKKy8qIEZpbmFsaXplIGRlcGVuZGVudCBsb2FkIHRyZWUgYnkgcmVtb3Zpbmcg dGhvc2UgbG9hZHMgd2l0aCBzdG9yZSBhbGlhcy4KKyAgIFJldHVybiB0cnVlIGlmIGZpbmFsIGRl cGVuZGVudCBsb2FkIHRyZWUgaXMgbm90IGVtcHR5LiAgKi8KKworYm9vbAorbG9vcF9pdGVyX2lu Zm86OmZpbmFsaXplX2RlcF9sb2FkICgpIGNvbnN0Cit7CisgIGRlcF9sb2FkX3dhbGtlciBkbF93 YWxrZXI7CisgIGRlcF9sb2FkICpkbDsKKyAgZGVwX2xvYWQgKmNoaWxkOworICB1bnNpZ25lZCBv dXRlcl9sb29wX2luZGV4ID0gbG9vcF9yZWxhdGl2ZV9kZXB0aCAobWdvX291dGVyX2xvb3AsIG1n b19sb29wKTsKKyAgdW5zaWduZWQgaTsKKworICBXQUxLX0RFUF9MT0FEX1BSRV9PUkRFUiAoZGxf d2Fsa2VyLCBkZXBfbG9hZF9yb290LCBkbCkKKyAgICB7CisgICAgICBGT1JfRUFDSF9WRUNfRUxU IChkbC0+Y2hpbGRyZW4sIGksIGNoaWxkKQorCXsKKwkgIGlmICghY2hpbGQtPmV4Y2x1ZGVkX3Ag KG91dGVyX2xvb3BfaW5kZXgpKQorCSAgICBjb250aW51ZTsKKworCSAgaWYgKGR1bXBfZmlsZSAm JiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKwkgICAgeworCSAgICAgIGZwcmludGYgKGR1 bXBfZmlsZSwgIj4gUHJ1bmluZyBkZXBlbmRlbnQgbG9hZCBhZ2FpbnN0IG1nbzpcbiIpOworCSAg ICAgIGR1bXBfZGVwX2xvYWQgKGNoaWxkKTsKKwkgICAgfQorCisJICBkbC0+cmVtb3ZlX2NoaWxk IChpLS0pOworCX0KKyAgICB9CisKKyAgaWYgKGNsZWFuX3RyaXZpYWxfZGVwX2xvYWQgKCkpCisg ICAgcmV0dXJuIGZhbHNlOworCisgIGF1dG9fdmVjPGdpbXBsZSAqPiB3b3JrbGlzdDsKKyAgYXV0 b19iaXRtYXAgdmlzaXRlZDsKKworICBXQUxLX0RFUF9MT0FEX1BSRV9PUkRFUiAoZGxfd2Fsa2Vy LCBkZXBfbG9hZF9yb290LCBkbCkKKyAgICB7CisgICAgICBnaW1wbGUgKnN0bXQ7CisgICAgICB1 bnNpZ25lZCBqOworCisgICAgICAvKiBNZXJnZSBvYnZpb3VzbHkgaWRlbnRpY2FsIGRlcGVuZGVu dCBsb2FkcyB0byBzYXZlIGNhY2hpbmcgY29zdCBhbmQKKwkgYW5kIGRhdGEgc2l6ZS4gICovCisg ICAgICBGT1JfRUFDSF9WRUNfRUxUIChkbC0+Y2hpbGRyZW4sIGksIGNoaWxkKQorCXsKKwkgIHRy ZWUgbWVtcmVmID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChjaGlsZC0+ZGVmX3N0bXRzWzBdKTsKKwkg IHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAobWVtcmVmKTsKKwkgIGRlcF9sb2FkICpvdGhlcjsKKwor CSAgRk9SX0VBQ0hfVkVDX0VMVF9GUk9NIChkbC0+Y2hpbGRyZW4sIGosIG90aGVyLCBpICsgMSkK KwkgICAgeworCSAgICAgIHRyZWUgb3RoZXJfbWVtcmVmID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChv dGhlci0+ZGVmX3N0bXRzWzBdKTsKKwkgICAgICB0cmVlIG90aGVyX3R5cGUgPSBUUkVFX1RZUEUg KG90aGVyX21lbXJlZik7CisKKwkgICAgICBpZiAob3BlcmFuZF9lcXVhbF9wIChtZW1yZWYsIG90 aGVyX21lbXJlZiwgT0VQX0FERFJFU1NfT0YpCisJCSAgJiYgdHlwZXNfY29tcGF0aWJsZV9wICh0 eXBlLCBvdGhlcl90eXBlKSkKKwkJeworCQkgIGNoaWxkLT5kZWZfc3RtdHMuc2FmZV9zcGxpY2Ug KG90aGVyLT5kZWZfc3RtdHMpOworCQkgIGNoaWxkLT5jaGlsZHJlbi5zYWZlX3NwbGljZSAob3Ro ZXItPmNoaWxkcmVuKTsKKwkJICBvdGhlci0+Y2hpbGRyZW4ucmVsZWFzZSAoKTsKKwkJICBkbC0+ cmVtb3ZlX2NoaWxkIChqLS0pOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIEZPUl9FQUNIX1ZF Q19FTFQgKGRsLT5jaGlsZHJlbiwgaSwgY2hpbGQpCisJeworCSAgRk9SX0VBQ0hfVkVDX0VMVCAo Y2hpbGQtPmRlZl9zdG10cywgaiwgc3RtdCkKKwkgICAgeworCSAgICAgIGdjY19jaGVja2luZ19h c3NlcnQgKGdpbXBsZV9wbGYgKHN0bXQsIEdGX0RFUF9MT0FEKSk7CisJICAgICAgZ2ltcGxlX3Nl dF9wbGYgKHN0bXQsIEdGX0lOQ0xVREVELCB0cnVlKTsKKwkgICAgfQorCisJICBGT1JfRUFDSF9W RUNfRUxUIChjaGlsZC0+YWRkcl9zdG10cywgaiwgc3RtdCkKKwkgICAgeworCSAgICAgIGdjY19j aGVja2luZ19hc3NlcnQgKCFnaW1wbGVfcGxmIChzdG10LCBHRl9ERVBfTE9BRCkpOworCSAgICAg IGdpbXBsZV9zZXRfcGxmIChzdG10LCBHRl9JTkNMVURFRCwgdHJ1ZSk7CisJICAgIH0KKwl9CisK KyAgICAgIC8qIEluIGRlcGVuZGVudCBsb2FkIHRyZWUsIHRoZSByb290IG5vZGUgZG9lcyBub3Qg bmVlZCB0byBiZSBjYWNoZWQsCisJIHdoaWxlIHRoZSBsZWFmIG5vZGUgc2hvdWxkIGFsd2F5cyBi ZS4gICovCisgICAgICBpZiAoIWRsLT5uZWVkX2NhY2hpbmcgfHwgZGwtPmlzX2xlYWYgKCkpCisJ Y29udGludWU7CisKKyAgICAgIGRsLT5uZWVkX2NhY2hpbmcgPSBmYWxzZTsKKyAgICAgIHdvcmts aXN0LnNhZmVfc3BsaWNlIChkbC0+ZGVmX3N0bXRzKTsKKworICAgICAgLyogSWYgYSBub2RlIGlu IGRlcGVuZGVudCBsb2FkIHRyZWUgaXMgb25seSB1c2VkIGJ5IGl0cyBjaGlsZHJlbiBub2RlcywK KwkgaXQgYWN0cyBhcyBhIHRlbXBvcmFyeSB0byBnZW5lcmF0ZSBvdGhlciBub2Rlcywgc28gZG9l cyBub3QgbmVlZCB0bworCSBhbGxvY2F0ZSBhIHNsb3QgaW4gY2FjaGUgZGF0YSBzcGFjZS4gICov CisgICAgICBkbworCXsKKwkgIHRyZWUgdmFsdWUgPSBnaW1wbGVfZ2V0X2xocyAod29ya2xpc3Qu cG9wICgpKTsKKwkgIGdpbXBsZSAqdXNlX3N0bXQ7CisJICBpbW1fdXNlX2l0ZXJhdG9yIHVzZV9p dGVyOworCisJICBGT1JfRUFDSF9JTU1fVVNFX1NUTVQgKHVzZV9zdG10LCB1c2VfaXRlciwgdmFs dWUpCisJICAgIHsKKwkgICAgICBpZiAoaXNfZ2ltcGxlX2RlYnVnICh1c2Vfc3RtdCkpCisJCWNv bnRpbnVlOworCisJICAgICAgaWYgKCFzdG10X2luc2lkZV9sb29wX3AgKG1nb19sb29wLCB1c2Vf c3RtdCkKKwkJICB8fCAhZ2ltcGxlX3BsZiAodXNlX3N0bXQsIEdGX0lOQ0xVREVEKSkKKwkJewor CQkgIC8qIEZpbmQgc29tZSBleHRlcm5hbCB1c2Ugb2YgbG9hZCB2YWx1ZSwgaGF2ZSB0bworCQkg ICAgIGNhY2hlIGl0LiAgKi8KKwkJICBkbC0+bmVlZF9jYWNoaW5nID0gdHJ1ZTsKKworCQkgIC8q IENsZWFyIHdvcmtsaXN0IGZvciBmb2xsb3dpbmcgcmV1c2UuICAqLworCQkgIHdvcmtsaXN0LnRy dW5jYXRlICgwKTsKKwkJICBicmVhazsKKwkJfQorCisJICAgICAgZ2NjX2NoZWNraW5nX2Fzc2Vy dCAoZ2ltcGxlX3VpZCAodXNlX3N0bXQpKTsKKworCSAgICAgIGlmICghZ2ltcGxlX3BsZiAodXNl X3N0bXQsIEdGX0RFUF9MT0FEKQorCQkgICYmIGJpdG1hcF9zZXRfYml0ICh2aXNpdGVkLCBnaW1w bGVfdWlkICh1c2Vfc3RtdCkpKQorCQl3b3JrbGlzdC5zYWZlX3B1c2ggKHVzZV9zdG10KTsKKwkg ICAgfQorCX0gd2hpbGUgKCF3b3JrbGlzdC5pc19lbXB0eSAoKSk7CisgICAgfQorCisgIHJldHVy biB0cnVlOworfQorCisvKiBDaGVja3Mgd2hldGhlciBMT09QIGhhcyBhbnkgYWJub3JtYWwvZWgg ZXhpdCB3aGVyZSB3ZSBjb3VsZCBub3QgaW5zZXJ0CisgICBzdGF0ZW1lbnQuICAqLworCitzdGF0 aWMgaW5saW5lIGJvb2wKK2hhc19hYm5vcm1hbF9vcl9laF9leGl0X3AgKGNsYXNzIGxvb3AgKmxv b3ApCit7CisgIGF1dG9fdmVjPGVkZ2U+IGV4aXRzID0gZ2V0X2xvb3BfZXhpdF9lZGdlcyAobG9v cCk7CisgIHVuc2lnbmVkIGk7CisgIGVkZ2UgZXg7CisKKyAgRk9SX0VBQ0hfVkVDX0VMVCAoZXhp dHMsIGksIGV4KQorICAgIGlmIChleC0+ZmxhZ3MgJiAoRURHRV9BQk5PUk1BTCB8IEVER0VfRUgp KQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBNYWluIGVu dHJ5IHRvIHBlcmZvcm0gYW5hbHlzaXMgYW5kIHByZXBhcmF0aW9uIG9uIGRlcGVuZGVudCBsb2Fk IHRyZWUgZm9yCisgICBtZ28gdHJhbnNmb3JtYXRpb24uICAqLworCitib29sCitsb29wX2l0ZXJf aW5mbzo6cHJvY2Vzc19kZXBfbG9hZCAoKQoreworICBpZiAoZGVwX2xvYWRfcm9vdC0+aXNfbGVh ZiAoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFhbmFseXplX2RlcF9sb2FkX2luX2xv b3AgKG1nb19sb29wKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFwcnVuZV9kZXBfbG9h ZCAoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoZmxvd19s b29wX25lc3RlZF9wIChtZ29fb3V0ZXJfbG9vcCwgbWdvX2xvb3ApKTsKKworICBjbGFzcyBsb29w ICpvdXRlcl9sb29wID0gbWdvX2xvb3A7CisgIHVuc2lnbmVkIG5fbG9hZHMgPSAxOworCisgIC8q IEFuYWx5emUgZGVwZW5kZW50IGxvYWQgdHJlZSBpbiBhbGwgcGFyZW50IGxvb3BzIG9uZSBieSBv bmUsIGFuZCB0cnkgdG8KKyAgICAgaWRlbnRpZnkgdGhlIG91dGVybW9zdCBsb29wIHRoYXQgaXMg cXVhbGlmaWVkIGZvciBtZ28uICAqLworICBkbworICAgIHsKKyAgICAgIGNsYXNzIGxvb3AgKm5l eHRfb3V0ZXJfbG9vcCA9IGxvb3Bfb3V0ZXIgKG91dGVyX2xvb3ApOworICAgICAgdW5zaWduZWQg bmV4dF9uX2xvYWRzOworCisgICAgICBpZiAoaGFzX2Fibm9ybWFsX29yX2VoX2V4aXRfcCAobmV4 dF9vdXRlcl9sb29wKSkKKwlicmVhazsKKworICAgICAgbmV4dF9uX2xvYWRzID0gYW5hbHl6ZV9k ZXBfbG9hZF9pbl9sb29wIChuZXh0X291dGVyX2xvb3ApOworCisgICAgICBpZiAobmV4dF9uX2xv YWRzIDwgbl9sb2FkcykKKwlicmVhazsKKworICAgICAgbl9sb2FkcyA9IG5leHRfbl9sb2FkczsK KyAgICAgIG91dGVyX2xvb3AgPSBuZXh0X291dGVyX2xvb3A7CisgICAgfSB3aGlsZSAob3V0ZXJf bG9vcCAhPSBtZ29fb3V0ZXJfbG9vcCk7CisKKyAgLyogRm9yIG91dGVyIGxvb3AsIHRoZSBjbG9z ZXIgdG8gbWdvIGxvb3AsIHRoZSBtb3JlIGRlcGVuZGVudCBsb2FkCisgICAgIGNhbmRpZGF0ZXMs IGJ1dCB0aGUgaGlnaGVyIG1nby1jYWNoaW5nIGluaXRpYWxpemF0aW9uIGNvc3QuICBOb3cgd2UK KyAgICAgc2ltcGxlbHkgY2hvb3NlIHRoZSBvdXRlcm1vc3QgbG9vcCB0aGF0IGNvbnRhaW5zIG1h eGltdW0gZGVwZW5kZW50CisgICAgIGxvYWRzLiAgKi8KKyAgaWYgKCFhZGp1c3Rfb3V0ZXJfbG9v cCAob3V0ZXJfbG9vcCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChkdW1wX2ZpbGUgJiYg KGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCisgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiPiBG aW5hbCBtZ28gb3V0ZXIgbG9vcCAlZCAoZGVwdGggJXUpXG5cbiIsCisJICAgICBtZ29fb3V0ZXJf bG9vcC0+bnVtLCBsb29wX2RlcHRoIChtZ29fb3V0ZXJfbG9vcCkpOworCisgIHJldHVybiBmaW5h bGl6ZV9kZXBfbG9hZCAoKTsKK30KKworLyogVHJ5IHRvIG1lcmdlIHdpdGggZGVwZW5kZW50IGxv YWQgdHJlZSBvZiBPVEhFUiBpdGVyYXRvciBpZiB0d28gaXRlcmF0b3JzCisgICB3b3VsZCBhZHZh bmNlIGF0IHRoZSBzYW1lIHBhY2UuICAqLworCitib29sCitsb29wX2l0ZXJfaW5mbzo6bWVyZ2Ug KGxvb3BfaXRlcl9pbmZvICpvdGhlcikKK3sKKyAgZGVwX2xvYWQgKmRsX3Jvb3QgPSBkZXBfbG9h ZF9yb290OworICBkZXBfbG9hZCAqZGxfcm9vdF9vdGhlciA9IG90aGVyLT5kZXBfbG9hZF9yb290 OworCisgIGdjY19jaGVja2luZ19hc3NlcnQgKGNhY2hlX2RhdGFfY291bnQgPT0gb3RoZXItPmNh Y2hlX2RhdGFfY291bnQpOworCisgIGRsX3Jvb3QtPmRlZl9zdG10cy5zYWZlX3NwbGljZSAoZGxf cm9vdF9vdGhlci0+ZGVmX3N0bXRzKTsKKyAgZGxfcm9vdC0+Y2hpbGRyZW4uc2FmZV9zcGxpY2Ug KGRsX3Jvb3Rfb3RoZXItPmNoaWxkcmVuKTsKKyAgZGxfcm9vdF9vdGhlci0+Y2hpbGRyZW4ucmVs ZWFzZSAoKTsKKworICBhZGp1c3Rfb3V0ZXJfbG9vcCAob3RoZXItPm1nb19vdXRlcl9sb29wKTsK KyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqCithcHBlbmRf bWdvX3N1ZmZpeCAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgY2hhciBzdWZmaXhbMzJdOworCisg IHNwcmludGYgKHN1ZmZpeCwgIl8ldSIsIG1nb19uYW1lX3N1ZmZpeF9pZCk7CisgIHJldHVybiBj b25jYXQgKG5hbWUsIHN1ZmZpeCwgTlVMTCk7Cit9CisKKy8qIENyZWF0ZSBhIFNTQSBuYW1lIGRl ZmluaXRpb24gc3RhdGVtZW50IGF0IHByZWhlYWRlciBvZiBMT09QLCB3aG9zZQorICAgaW5pdGlh bGl6YXRpb24gYXJnIGlzIElOSVQuIFNUUl9OQU1FLCBpZiBub24tTlVMTCwgd2lsbCBiZSBjb25j YXRlbmF0ZWQKKyAgIHRvIGJlIG5hbWUgcHJlZml4IG9mIHRoZSBTU0EgbmFtZS4gICovCisKK3N0 YXRpYyB0cmVlCittYWtlX3NzYV9uYW1lX2JlZm9yZV9sb29wIChjb25zdCBjbGFzcyBsb29wICps b29wLCB0cmVlIGluaXQsCisJCQkgICBjb25zdCBjaGFyICpzdHJfbmFtZSA9IE5VTEwpCit7Cisg IGJhc2ljX2Jsb2NrIHByZWhlYWRlciA9IGxvb3BfcHJlaGVhZGVyX2VkZ2UgKGxvb3ApLT5zcmM7 CisgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaSA9IGdzaV9sYXN0X2JiIChwcmVoZWFkZXIpOwor ICB0cmVlIG5hbWUgPSBzdHJfbmFtZSA/IG1ha2VfdGVtcF9zc2FfbmFtZSAoVFJFRV9UWVBFIChp bml0KSwgTlVMTCwKKwkJCQkJICAgICBhcHBlbmRfbWdvX3N1ZmZpeCAoc3RyX25hbWUpKQorCQkg ICAgICAgOiBtYWtlX3NzYV9uYW1lIChUUkVFX1RZUEUgKGluaXQpKTsKKworICBpbml0ID0gZm9y Y2VfZ2ltcGxlX29wZXJhbmRfZ3NpICgmZ3NpLCBpbml0LCBmYWxzZSwKKwkJCQkgICBOVUxMX1RS RUUsIGZhbHNlLCBHU0lfTkVXX1NUTVQpOworCisgIGJ1aWxkX2Fzc2lnbl9hZnRlcl9iYiAocHJl aGVhZGVyLCBuYW1lLCBpbml0KTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8qIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJBVEUgQ0FDSEUgVFlQRSAg ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEdl bmVyYXRlIGZpZWxkIGRlY2wgaW4gY2FjaGUgZWxlbWVudCB0eXBlIGZvciBlYWNoIGxvYWQgaW4g ZGVwZW5kZW50IGxvYWQKKyAgIHRyZWUgRExfUk9PVCwgd2hpY2ggbmVlZHMgdG8gYmUgY2FjaGVk LCBhbmQgcmVjb3JkcyB0aGVzZSBuZXcgZmllbGRzIGludG8KKyAgIEZJRUxEUy4gICovCisKK3N0 YXRpYyB2b2lkCitnZW5fY2FjaGVfZmllbGRfZGVjbCAoZGVwX2xvYWQgKmRsX3Jvb3QsIGF1dG9f dmVjPHRyZWU+ICZmaWVsZHMpCit7CisgIHVuc2lnbmVkIHVuaXF1ZV9pZCA9IDA7CisgIGRlcF9s b2FkX3dhbGtlciBkbF93YWxrZXI7CisgIGRlcF9sb2FkICpkbDsKKworICBXQUxLX0RFUF9MT0FE X1BSRV9PUkRFUiAoZGxfd2Fsa2VyLCBkbF9yb290LCBkbCkKKyAgICB7CisgICAgICBpZiAoIWRs LT5uZWVkX2NhY2hpbmcpCisJY29udGludWU7CisKKyAgICAgIHRyZWUgY2FjaGVfZXhwciA9IGdp bXBsZV9hc3NpZ25fcmhzMSAoZGwtPmRlZl9zdG10c1swXSk7CisgICAgICB0cmVlIGNhY2hlX3R5 cGUgPSBUUkVFX1RZUEUgKGNhY2hlX2V4cHIpOworICAgICAgY29uc3QgY2hhciAqbmFtZSA9ICIi OworCisgICAgICBzd2l0Y2ggKFRSRUVfQ09ERSAoY2FjaGVfZXhwcikpCisJeworCWNhc2UgQ09N UE9ORU5UX1JFRjoKKwljYXNlIEJJVF9GSUVMRF9SRUY6CisJICAvKiBGb3IgZmllbGQgcmVmZXJl bmNlLCBhZGQgaXRzIG5hbWUgaW50byBuZXcgY2FjaGUgZmllbGQuICAqLworCSAgbmFtZSA9IElE RU5USUZJRVJfUE9JTlRFUiAoREVDTF9OQU1FIChUUkVFX09QRVJBTkQgKGNhY2hlX2V4cHIsIDEp KSk7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisKKyAgICAgIGNoYXIg KmJ1ZiA9IFhBTExPQ0FWRUMgKGNoYXIsIHN0cmxlbiAobmFtZSkgKyAzNik7CisKKyAgICAgIGlm ICgqbmFtZSkKKwlzcHJpbnRmIChidWYsICJfTCVkXyVzX2NmXyV1IiwgZGwtPmxldmVsLCBuYW1l LCB1bmlxdWVfaWQrKyk7CisgICAgICBlbHNlCisJc3ByaW50ZiAoYnVmLCAiX0wlZF9jZl8ldSIs IGRsLT5sZXZlbCwgdW5pcXVlX2lkKyspOworCisgICAgICB0cmVlIG5ld19maWVsZCA9IGJ1aWxk X2RlY2wgKFVOS05PV05fTE9DQVRJT04sIEZJRUxEX0RFQ0wsCisJCQkJICAgZ2V0X2lkZW50aWZp ZXIgKGJ1ZiksIGNhY2hlX3R5cGUpOworICAgICAgU0VUX0RFQ0xfQUxJR04gKG5ld19maWVsZCwg VFlQRV9BTElHTiAoY2FjaGVfdHlwZSkpOworCisgICAgICBpZiAoVFJFRV9DT0RFIChjYWNoZV9l eHByKSA9PSBCSVRfRklFTERfUkVGKQorCXsKKwkgIERFQ0xfU0laRSAobmV3X2ZpZWxkKSA9IGJp dHNpemVfaW50IChUWVBFX1BSRUNJU0lPTiAoY2FjaGVfdHlwZSkpOworCSAgREVDTF9CSVRfRklF TEQgKG5ld19maWVsZCkgPSAxOworCX0KKworICAgICAgZmllbGRzLnNhZmVfcHVzaCAobmV3X2Zp ZWxkKTsKKworICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxT KSkKKwl7CisJICBmcHJpbnRmIChkdW1wX2ZpbGUsICI+IENyZWF0ZSBmaWVsZDogICIpOworCSAg cHJpbnRfZ2VuZXJpY19leHByIChkdW1wX2ZpbGUsIG5ld19maWVsZCwgVERGX1NMSU0pOworCSAg ZnByaW50ZiAoZHVtcF9maWxlLCAiIGZvciAiKTsKKwkgIHByaW50X2dpbXBsZV9leHByIChkdW1w X2ZpbGUsIGRsLT5kZWZfc3RtdHNbMF0sIDAsIFRERl9TTElNKTsKKwkgIGZwcmludGYgKGR1bXBf ZmlsZSwgIlxuIik7CisJfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQKK2RlY2xfYWxp Z25fY21wIChjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICpxKQoreworICB0cmVlIGEgPSAqKGNv bnN0IHRyZWUgKikgcDsKKyAgdHJlZSBiID0gKihjb25zdCB0cmVlICopIHE7CisKKyAgLyogR3Jv dXAgYml0LWZpZWxkcyBhdCBmaXJzdC4gICovCisgIGlmIChERUNMX0JJVF9GSUVMRCAoYSkgXiBE RUNMX0JJVF9GSUVMRCAoYikpCisgICAgcmV0dXJuIERFQ0xfQklUX0ZJRUxEIChhKSA/IC0xIDog MTsKKworICByZXR1cm4gREVDTF9BTElHTiAoYSkgLSBERUNMX0FMSUdOIChiKTsKK30KKworLyog SW5zZXJ0IEZJRUxEUyBpbnRvIFNUUlVDVF9UWVBFIGFmdGVyIElOSVRfRklFTEQsIHNvcnRlZCBi eSBhbGlnbm1lbnQKKyAgIHJlcXVpcmVtZW50cyB0byBzYXZlIG1lbW9yeSBzcGFjZSByZXF1aXJl ZCBieSBmaW5hbCBjYWNoZSBkYXRhLiAgKi8KKworc3RhdGljIHZvaWQKK2luc2VydF9maWVsZHNf aW50b19zdHJ1Y3QgKHRyZWUgc3RydWN0X3R5cGUsIGNvbnN0IGF1dG9fdmVjPHRyZWU+ICZmaWVs ZHMsCisJCQkgICB0cmVlIGluaXRfZmllbGQpCit7CisgIHZlYzx0cmVlPiBzb3J0ZWRfZmllbGRz ID0gZmllbGRzLmNvcHkgKCk7CisgIHNvcnRlZF9maWVsZHMucXNvcnQgKGRlY2xfYWxpZ25fY21w KTsKKworICB0cmVlIGxhc3RfZiA9IGluaXRfZmllbGQ7CisgIHVuc2lnbmVkIGk7CisgIHRyZWUg ZmllbGQ7CisKKyAgRk9SX0VBQ0hfVkVDX0VMVCAoc29ydGVkX2ZpZWxkcywgaSwgZmllbGQpCisg ICAgeworICAgICAgREVDTF9DT05URVhUIChmaWVsZCkgPSBzdHJ1Y3RfdHlwZTsKKyAgICAgIERF Q0xfQ0hBSU4gKGxhc3RfZikgPSBmaWVsZDsKKyAgICAgIGxhc3RfZiA9IGZpZWxkOworICAgIH0K KworICBzb3J0ZWRfZmllbGRzLnJlbGVhc2UgKCk7Cit9CisKKy8qIEJ1aWxkIGEgZmxhdCBzdHJ1 Y3QgZm9yIGRlcGVuZGVudCBsb2FkcyB0aGF0IG5lZWQgdG8gYmUgY2FjaGVkLiAgUmV0dXJuCisg ICB0cnVlIGlmIGNhY2hlIGVsZW1lbnQgc2l6ZSBkb2VzIG5vdCBleGNlZWQgYSB0aHJlc2hvbGQu ICovCisKK2Jvb2wKK2xvb3BfaXRlcl9pbmZvOjpnZW5fY2FjaGVfdHlwZV9pbmZvICgpCit7Cisg IHRyZWUgY2FjaGVfc3RydWN0ID0gY3RfaW5mby5zdHJ1Y3RfdHlwZSA9IG1ha2Vfbm9kZSAoUkVD T1JEX1RZUEUpOworCisgIC8qIEdlbmVyYXRlIGEgZmxhZyB0byByZWNvcmQgd2hldGhlciBjdXJy ZW50IGVsZW1lbnQgaXMgaW5pdGlhbGl6ZWQuICAqLworICB0cmVlIGluaXRfZmllbGQgPSBidWls ZF9kZWNsIChVTktOT1dOX0xPQ0FUSU9OLCBGSUVMRF9ERUNMLAorCQkJCWdldF9pZGVudGlmaWVy ICgiX2luaXQiKSwgYm9vbGVhbl90eXBlX25vZGUpOworICBERUNMX0NPTlRFWFQgKGluaXRfZmll bGQpID0gY2FjaGVfc3RydWN0OworICBjdF9pbmZvLmluaXRfZmllbGQgPSBpbml0X2ZpZWxkOwor CisgIFRZUEVfRklFTERTIChjYWNoZV9zdHJ1Y3QpID0gaW5pdF9maWVsZDsKKworICAvKiBHZW5l cmF0ZSBhbmQgYWRkIGFsbCBjYWNoZSBmaWVsZCBkZWNscy4gICovCisgIGdlbl9jYWNoZV9maWVs ZF9kZWNsIChkZXBfbG9hZF9yb290LCBjdF9pbmZvLmZpZWxkcyk7CisgIGlmIChjdF9pbmZvLmZp ZWxkcy5pc19lbXB0eSAoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW5zZXJ0X2ZpZWxkc19p bnRvX3N0cnVjdCAoY2FjaGVfc3RydWN0LCBjdF9pbmZvLmZpZWxkcywgaW5pdF9maWVsZCk7CisK KyAgbG9jYXRpb25fdCBsb2MgPSBERUNMX1NPVVJDRV9MT0NBVElPTiAoY3VycmVudF9mdW5jdGlv bl9kZWNsKTsKKyAgdHJlZSBuYW1lID0gZ2V0X2lkZW50aWZpZXIgKGFwcGVuZF9tZ29fc3VmZml4 ICgiX2NhY2hlX3N0IikpOworICB0cmVlIGRlY2wgPSBidWlsZF9kZWNsIChsb2MsIFRZUEVfREVD TCwgbmFtZSwgY2FjaGVfc3RydWN0KTsKKworICBERUNMX0lHTk9SRURfUCAoZGVjbCkgPSAxOwor ICBERUNMX0FSVElGSUNJQUwgKGRlY2wpID0gMTsKKyAgVFlQRV9OQU1FIChjYWNoZV9zdHJ1Y3Qp ID0gZGVjbDsKKyAgVFlQRV9TVFVCX0RFQ0wgKGNhY2hlX3N0cnVjdCkgPSBkZWNsOworICBUWVBF X0FSVElGSUNJQUwgKGNhY2hlX3N0cnVjdCkgPSAxOworICBsYXlvdXRfdHlwZSAoY2FjaGVfc3Ry dWN0KTsKKworICAvKiBDYWxjdWxhdGUgdGhlIGNhY2hlIGVsZW1lbnQgc2l6ZS4gICovCisgIHRy ZWUgY2FjaGVfc2l6ZSA9IFRZUEVfU0laRV9VTklUIChjYWNoZV9zdHJ1Y3QpOworCisgIGdjY19j aGVja2luZ19hc3NlcnQgKFRSRUVfQ09ERSAoY2FjaGVfc2l6ZSkgPT0gSU5URUdFUl9DU1QpOwor ICBpZiAod2k6Omd0dV9wICh3aTo6dG9fd2lkZSAoY2FjaGVfc2l6ZSksIHBhcmFtX21nb19tYXhf Y2FjaGVfZWxlbV9zaXplKSkKKyAgICB7CisgICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2Zs YWdzICYgVERGX0RFVEFJTFMpKQorCXsKKwkgIGZwcmludGYgKGR1bXBfZmlsZSwgIj4gT3Zlci1s YXJnZSBjYWNoZSBlbGVtZW50IHNpemU6ICIpOworCSAgcHJpbnRfZ2VuZXJpY19leHByIChkdW1w X2ZpbGUsIGNhY2hlX3NpemUsIFRERl9TTElNKTsKKwkgIGZwcmludGYgKGR1bXBfZmlsZSwgIlxu Iik7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoZHVtcF9maWxlICYm IChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQorICAgIHsKKyAgICAgIGZwcmludGYgKGR1bXBf ZmlsZSwgIj4gQ2FjaGUgZWxlbWVudCBzaXplIGlzICIpOworICAgICAgcHJpbnRfZ2VuZXJpY19l eHByIChkdW1wX2ZpbGUsIGNhY2hlX3NpemUsIFRERl9TTElNKTsKKyAgICAgIGZwcmludGYgKGR1 bXBfZmlsZSwgIiBieXRlc1xuXG4iKTsKKyAgICB9CisKKyAgd2lkZV9pbnQgbWF4X3ZhbHVlID0g d2k6OnRvX3dpZGUgKFRZUEVfTUFYX1ZBTFVFIChzaXpldHlwZSkpOworCisgIG1heF92YWx1ZSA9 IHdpOjp1ZGl2X3RydW5jIChtYXhfdmFsdWUsIHdpOjp0b193aWRlIChjYWNoZV9zaXplKSk7CisK KyAgaWYgKHdpOjpmaXRzX3Vod2lfcCAobWF4X3ZhbHVlKSkKKyAgICB7CisgICAgICB1bnNpZ25l ZCBIT1NUX1dJREVfSU5UIG1pbl9jb3VudCA9IHBhcmFtX21nb19taW5fY2FjaGVfYXJyYXlfbGVu Z3RoOworICAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBtYXhfY291bnQgPSBtYXhfdmFsdWUu dG9fdWh3aSAoKTsKKworICAgICAgaWYgKG1heF9jb3VudCA8IG1pbl9jb3VudCkKKwlyZXR1cm4g ZmFsc2U7CisKKyAgICAgIGlmIChtYXhfY291bnQgPCAodW5zaWduZWQgSE9TVF9XSURFX0lOVCkg Y3RfaW5mby5tYXhfY291bnQpCisJY3RfaW5mby5tYXhfY291bnQgPSBtYXhfY291bnQ7CisgICAg fQorCisgIHJldHVybiB0cnVlOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKiAgICAgICAg ICAgICAgICAgICAgICAgICBHRU5FUkFURSBDQUNISU5HIENPREUgICAgICAgICAgICAgICAgICAg ICAgICAgICAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBJbnNlcnQgY2FsbG9jIHRvIGNy ZWF0ZSBhIG5ldyBjYWNoZSBhcnJheSBhdCBwcmVoZWFkZXIgb2YgbWdvIG91dGVyIGxvb3AsIGFu ZAorICAgZnJlZSBpdCBhdCB0aGUgbG9vcCBleGl0cy4gKi8KKwordHJlZQorbG9vcF9pdGVyX2lu Zm86Omdlbl9jYWNoZV9hcnJheSAoKSBjb25zdAoreworICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChj YWNoZV9kYXRhX2NvdW50KTsKKworICAvKiBDYWxjdWxhdGUgY2FjaGUtYXJyYXkgbGVuZ3RoIGZy b20gZGF0YSBjb3VudCBhdCBydW50aW1lLiAgSWYgcmVzdWx0IGlzCisgICAgIG91dHNpZGUgb2Yg bG93ZXIvdXBwZXIgYm91bmRzLCBpdCB3aWxsIGJlIHNldCB0byAwLiAgKi8KKyAgdHJlZSBtaW5f Y291bnQgPSBzaXplX2ludCAocGFyYW1fbWdvX21pbl9jYWNoZV9hcnJheV9sZW5ndGgpOworICB0 cmVlIG1heF9jb3VudCA9IHNpemVfaW50IChjdF9pbmZvLm1heF9jb3VudCk7CisgIHRyZWUgY291 bnQgPSBmb2xkX2NvbnZlcnQgKHNpemV0eXBlLCBjYWNoZV9kYXRhX2NvdW50KTsKKyAgdHJlZSBs ZW5ndGggPSBtYWtlX3NzYV9uYW1lX2JlZm9yZV9sb29wIChtZ29fb3V0ZXJfbG9vcCwgY291bnQp OworCisgIC8qIGxlbmd0aCA9IGNvdW50ID49IG1pbl9jb3VudCAmJiBjb3VudCA8PSBtYXhfY291 bnQgPyBjb3VudCA6IDAgICovCisgIHRyZWUgcmFuZ2VfY2hlY2sgPSBidWlsZF9yYW5nZV9jaGVj ayAoVU5LTk9XTl9MT0NBVElPTiwgc2l6ZXR5cGUsIGxlbmd0aCwgMSwKKwkJCQkJbWluX2NvdW50 LCBtYXhfY291bnQpOworICBsZW5ndGggPSBidWlsZF9jb25kX2V4cHIgKHJhbmdlX2NoZWNrLCBs ZW5ndGgsIHNpemVfemVyb19ub2RlKTsKKyAgbGVuZ3RoID0gbWFrZV9zc2FfbmFtZV9iZWZvcmVf bG9vcCAobWdvX291dGVyX2xvb3AsIGxlbmd0aCwgIl9jYWNoZV9sZW4iKTsKKworICAvKiBjYWNo ZV9hcnJheSA9IGNhbGxvYyAobGVuZ3RoLCBzaXplKSAgKi8KKyAgdHJlZSBjYWNoZV9zdHJ1Y3Qg PSBjdF9pbmZvLnN0cnVjdF90eXBlOworICB0cmVlIGNhbGxfZXhwciA9IGJ1aWxkX2NhbGxfZXhw ciAoYnVpbHRpbl9kZWNsX2V4cGxpY2l0IChCVUlMVF9JTl9DQUxMT0MpLCAyLAorCQkJCSAgICBs ZW5ndGgsIFRZUEVfU0laRV9VTklUIChjYWNoZV9zdHJ1Y3QpKTsKKyAgY2FsbF9leHByID0gZm9s ZF9jb252ZXJ0IChidWlsZF9wb2ludGVyX3R5cGUgKGNhY2hlX3N0cnVjdCksIGNhbGxfZXhwcik7 CisgIHRyZWUgY2FjaGVfYXJyYXkKKyAgICA9IG1ha2Vfc3NhX25hbWVfYmVmb3JlX2xvb3AgKG1n b19vdXRlcl9sb29wLCBjYWxsX2V4cHIsICJfY2FjaGVfYXJyYXkiKTsKKworICAvKiBJZiBmYWls IHRvIGNyZWF0ZSB0aGUgY2FjaGUgYXJyYXksIHRyYW5zZm9ybSBvayBmbGFnIGlzIHNldCB0byBm YWxzZS4KKyAgICAgQWxzbyBjaGVjayBpZiBsZW5ndGggaXMgemVybyBhcyBjYWxsb2MoMCwgbikg aXMgbm90IGd1cmFudGVlZCB0byByZXR1cm4KKyAgICAgTlVMTC4KKwl0cmFuc19vayA9IChsZW5n dGggJiYgY2FjaGVfYXJyYXkpID8gdHJhbnNfb2sgOiBmYWxzZSAgKi8KKyAgdHJlZSBjbXBfbGVu ID0gZm9sZF9idWlsZDIgKE5FX0VYUFIsIGJvb2xlYW5fdHlwZV9ub2RlLCBsZW5ndGgsCisJCQkg ICAgICBzaXplX3plcm9fbm9kZSk7CisgIHRyZWUgY21wX2FyciA9IGZvbGRfYnVpbGQyIChORV9F WFBSLCBib29sZWFuX3R5cGVfbm9kZSwgY2FjaGVfYXJyYXksCisJCQkgICAgICBudWxsX3BvaW50 ZXJfbm9kZSk7CisgIHRyZWUgY29uZCA9IGZvbGRfYnVpbGQyIChUUlVUSF9BTkRfRVhQUiwgYm9v bGVhbl90eXBlX25vZGUsIGNtcF9sZW4sCisJCQkgICBjbXBfYXJyKTsKKyAgdHJlZSBjb25kX2V4 cHIgPSBidWlsZF9jb25kX2V4cHIgKGNvbmQsIHRyYW5zX29rLCBib29sZWFuX2ZhbHNlX25vZGUp OworICB0cmVlIG5ld190cmFuc19vaworICAgID0gbWFrZV9zc2FfbmFtZV9iZWZvcmVfbG9vcCAo bWdvX291dGVyX2xvb3AsIGNvbmRfZXhwciwgIl90cmFuc2Zvcm1fb2siKTsKKworICBjcmVhdGVf bmV3X2RlZl9mb3IgKHRyYW5zX29rLCBTU0FfTkFNRV9ERUZfU1RNVCAobmV3X3RyYW5zX29rKSwg TlVMTCk7CisKKyAgYXV0b192ZWM8ZWRnZT4gZXhpdHMgPSBnZXRfbG9vcF9leGl0X2VkZ2VzICht Z29fb3V0ZXJfbG9vcCk7CisgIHVuc2lnbmVkIGk7CisgIGVkZ2UgZXg7CisKKyAgRk9SX0VBQ0hf VkVDX0VMVCAoZXhpdHMsIGksIGV4KQorICAgIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgY2Fj aGUgYXJyYXkgdmFyaWFibGUgY2FuIGFsd2F5cyByZWFjaCBpdHMgZnJlZQorCSBzdGF0ZW1lbnQu ICBJZiB0aGUgZXhpdCBkZXN0IGhhcyBtdWx0aXBsZSBwcmVkZWNlc3NvcnMsIGl0IG1pZ2h0IGJl CisJIHJlYWNoZWQgYnkgb3RoZXIgZXhpdHMuICBUbyBhdm9pZCBlcnJvbmVvdXMgZG91YmxlLWZy ZWUsIHdlIGluc2VydCBhCisJIG5ldyBibG9jayBhdCB0aGUgZXhpdCBlZGdlLiAgKi8KKyAgICAg IGJhc2ljX2Jsb2NrIGRlc3RfYmIgPSBleC0+ZGVzdDsKKyAgICAgIGlmICghc2luZ2xlX3ByZWRf cCAoZGVzdF9iYikpCisJZGVzdF9iYiA9IHNwbGl0X2VkZ2UgKGV4KTsKKworICAgICAgZ2ltcGxl X3N0bXRfaXRlcmF0b3IgZ3NpID0gZ3NpX2FmdGVyX2xhYmVscyAoZGVzdF9iYik7CisgICAgICBn aW1wbGUgKmZyZWVfc3RtdAorCT0gZ2ltcGxlX2J1aWxkX2NhbGwgKGJ1aWx0aW5fZGVjbF9leHBs aWNpdCAoQlVJTFRfSU5fRlJFRSksIDEsCisJCQkgICAgIGNhY2hlX2FycmF5KTsKKyAgICAgIGdz aV9pbnNlcnRfYmVmb3JlICgmZ3NpLCBmcmVlX3N0bXQsIEdTSV9ORVdfU1RNVCk7CisgICAgfQor CisgIHJldHVybiBjYWNoZV9hcnJheTsKK30KKworLyogR2VuZXJhdGUgYmFzZSBhZGRyZXNzIHRv IGFjY2VzcyBjYWNoaW5nIGRhdGEgd2hpY2ggc2hvdWxkIGtlZXAgcGFjZSB3aXRoCisgICBpdGVy YXRvci4gICovCisKK3RyZWUKK2xvb3BfaXRlcl9pbmZvOjpnZW5fY2FjaGVfZGF0YV9wb2ludGVy ICgpIGNvbnN0Cit7CisgIHRyZWUgY2FjaGVfc3RydWN0ID0gY3RfaW5mby5zdHJ1Y3RfdHlwZTsK KyAgdHJlZSBjYWNoZV9hcnJheSA9IGdlbl9jYWNoZV9hcnJheSAoKTsKKyAgdHJlZSBjYWNoZV9w dHJfcmhzID0gbWFrZV9zc2FfbmFtZV9iZWZvcmVfbG9vcCAobWdvX2xvb3AsIGNhY2hlX2FycmF5 KTsKKworICAvKiBDcmVhdGUgY2FjaGUgYXJyYXkgcG9pbnRlciB1cGRhdGluZyBzdGF0ZW1lbnQg aW4gbWdvIHRhcmdldCBsb29wIGxhdGNoCisgICAgIGJsb2NrLiAgKi8KKyAgZ2ltcGxlICpzdG10 ID0gYnVpbGRfYXNzaWduX2FmdGVyX2JiIChtZ29fbG9vcC0+bGF0Y2gsIE5VTExfVFJFRSwKKwkJ CQkJY2FjaGVfcHRyX3JocywgUE9JTlRFUl9QTFVTX0VYUFIsCisJCQkJCVRZUEVfU0laRV9VTklU IChjYWNoZV9zdHJ1Y3QpKTsKKworICBjcmVhdGVfbmV3X2RlZl9mb3IgKGNhY2hlX3B0cl9yaHMs IHN0bXQsIE5VTEwpOworCisgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaSA9IGdzaV9hZnRlcl9s YWJlbHMgKG1nb19sb29wLT5oZWFkZXIpOworICB0cmVlIGNhY2hlX3B0ciA9IG1ha2VfdGVtcF9z c2FfbmFtZSAoVFJFRV9UWVBFIChjYWNoZV9wdHJfcmhzKSwgTlVMTCwKKwkJCQkgICAgICAgIl9j YWNoZV9wdHIiKTsKKworICBidWlsZF9hc3NpZ25fYXRfZ3NpICgmZ3NpLCB0cnVlLCBjYWNoZV9w dHIsIGNhY2hlX3B0cl9yaHMpOworICByZXR1cm4gY2FjaGVfcHRyOworfQorCisvKiBDYWxsYmFj ayBvZiB3YWxrX3RyZWUoKSB0byByZXBsYWNlIHNzYSBvcGVyYW5kIChwb2ludGVkIGJ5IE9QTkRf UFRSKSB3aXRoCisgICBuZXcgc3NhLCB0aGUgcGFpciByZWxhdGlvbiBpcyBkZW5vdGVkIGJ5IERB VEEuICAqLworCitzdGF0aWMgdHJlZQorcmVwbGFjZV9zc2Ffb3BlcmFuZHMgKHRyZWUgKm9wbmRf cHRyLCBpbnQgKndhbGtfc3VidHJlZXMsIHZvaWQgKmRhdGEpCit7CisgIHRyZWUgb3BuZCA9ICpv cG5kX3B0cjsKKyAgaGFzaF9tYXA8dHJlZSwgdHJlZT4gJnNzYV9yZXBzID0gKihoYXNoX21hcDx0 cmVlLCB0cmVlPiAqKSBkYXRhOworCisgIGlmIChUUkVFX0NPREUgKG9wbmQpID09IFNTQV9OQU1F KQorICAgIHsKKyAgICAgIHRyZWUgKm5ld19vcG5kX3B0ciA9IHNzYV9yZXBzLmdldCAob3BuZCk7 CisKKyAgICAgIGlmIChuZXdfb3BuZF9wdHIpCisJeworCSAgLyogUmVmZXIgdG8gYSBsb29wIHZh cmlhbnQgU1NBIHRoYXQgbXVzdCBiZSBkZWZpbmVkIGJ5IGEgcHJldmlvdXMKKwkgICAgIGFkZHJl c3MgY29tcHV0YXRpb24gc3RhdGVtZW50LiAgKi8KKwkgIGdjY19jaGVja2luZ19hc3NlcnQgKCpu ZXdfb3BuZF9wdHIpOworCSAgKm9wbmRfcHRyID0gKm5ld19vcG5kX3B0cjsKKwl9CisgICAgICAq d2Fsa19zdWJ0cmVlcyA9IDA7CisgICAgfQorCisgIHJldHVybiBOVUxMX1RSRUU7Cit9CisKKy8q IER1cGxpY2F0ZSBTVE1UIHdoaWNoIGlzIGluY2x1ZGVkIGluIGEgZGVwZW5kZW50IGxvYWQgdHJl ZSwgZWl0aGVyIGFzIGEKKyAgIG5vZGUsIG9yIHVzZWQgdG8gY29tcHV0ZSBhZGRyZXNzIGZvciBh IG5vZGUuICBUaGUgbmV3IHN0YXRlbWVudCB3aWxsIGJlCisgICBpbnNlcnRlZCBhZnRlciBHU0ks ICBhbmQgb3JpZ2luYWwgYW5kIG5ldyByZXN1bHQgU1NBcyBhcmUgcGFpcmVkIGludG8KKyAgIFNT QV9SRVBTLCBzbyB0aGF0IG9wZXJhbmRzIG9mIGZvbGxvd2luZyBkdXBsaWNhdGVkIHN0YXRlbWVu dHMgd291bGQKKyAgIHJlZmVyIHRvIHRob3NlIG5ldyBTU0FzLiAgKi8KKworc3RhdGljIGdpbXBs ZSAqCitjb3B5X2RlcF9zdG10IChnaW1wbGUgKnN0bXQsIGdpbXBsZV9zdG10X2l0ZXJhdG9yICpn c2ksCisJICAgICAgIGhhc2hfbWFwPHRyZWUsIHRyZWU+ICZzc2FfcmVwcykKK3sKKyAgdHJlZSB2 YWx1ZSA9IGdpbXBsZV9nZXRfbGhzIChzdG10KTsKKyAgYm9vbCBleGlzdGVkOworICB0cmVlICZu ZXdfdmFsID0gc3NhX3JlcHMuZ2V0X29yX2luc2VydCAodmFsdWUsICZleGlzdGVkKTsKKworICBp ZiAoZXhpc3RlZCkKKyAgICByZXR1cm4gU1NBX05BTUVfREVGX1NUTVQgKG5ld192YWwpOworCisg IGdpbXBsZSAqbmV3X3N0bXQgPSBnaW1wbGVfY29weSAoc3RtdCk7CisgIHRyZWUgKm9wbmRfcHRy ID0gZ2ltcGxlX29wX3B0ciAobmV3X3N0bXQsIDApOworICB0cmVlIHZhbHVlX3ZhciA9IFNTQV9O QU1FX1ZBUiAodmFsdWUpOworCisgIGlmICghdmFsdWVfdmFyKQorICAgIHZhbHVlX3ZhciA9IFRS RUVfVFlQRSAodmFsdWUpOworCisgIC8qIFNpbmNlIGRlZi11c2UgY2hhaW4gaXMgbm90IHJlYWR5 IGZvciBuZXcgc3RhdGVtZW50LCB3ZSBoYXZlIHRvIHNldCBTU0EKKyAgICAgb3BlcmFuZHMgdXNp bmcgd2Fsa190cmVlLiAgQXQgZmlyc3QsIHJlcGxhY2UgcmVzdWx0IFNTQSBvZiBuZXcgc3RtdC4g ICovCisgICpvcG5kX3B0ciA9IG5ld192YWwgPSBtYWtlX3NzYV9uYW1lICh2YWx1ZV92YXIsIG5l d19zdG10KTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgZ2ltcGxlX251bV9vcHMgKG5l d19zdG10KTsgKytpKQorICAgIHdhbGtfdHJlZSAoZ2ltcGxlX29wX3B0ciAobmV3X3N0bXQsIGkp LCByZXBsYWNlX3NzYV9vcGVyYW5kcywKKwkgICAgICAgJnNzYV9yZXBzLCBOVUxMKTsKKworICBn c2lfaW5zZXJ0X2FmdGVyIChnc2ksIG5ld19zdG10LCBHU0lfTkVXX1NUTVQpOworICByZXR1cm4g bmV3X3N0bXQ7Cit9CisKKy8qIEdlbmVyYXRlIG1lbW9yeSBsb2FkcyBhcyBvcmlnaW5hbCBzZXF1 ZW5jZSBmb3IgZGVwZW5kZW50IGxvYWQgdHJlZSBETF9ST09ULgorICAgVGhvc2UgbmV3IGxvYWRz IHdpbGwgYmUgaW5zZXJ0ZWQgYXQgZW5kIG9mIEJCLCBhbmQgcmVzdWx0IHZhbHVlcyBhcmUKKyAg IHJlY29yZGVkIGludG8gTE9BRF9WQUxTLiAgKi8KKworc3RhdGljIHZvaWQKK2dlbl9vcmlnX2xv YWRfc2VxdWVuY2UgKGJhc2ljX2Jsb2NrIGJiLCBkZXBfbG9hZCAqZGxfcm9vdCwKKwkJCWF1dG9f dmVjPHRyZWU+ICZsb2FkX3ZhbHMpCit7CisgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaSA9IGdz aV9sYXN0X2JiIChiYik7CisgIGhhc2hfbWFwPHRyZWUsIHRyZWU+IHNzYV9yZXBzOworICBkZXBf bG9hZF93YWxrZXIgZGxfd2Fsa2VyOworICBkZXBfbG9hZCAqZGw7CisKKyAgV0FMS19ERVBfTE9B RF9QUkVfT1JERVIgKGRsX3dhbGtlciwgZGxfcm9vdCwgZGwpCisgICAgeworICAgICAgdW5zaWdu ZWQgaTsKKyAgICAgIGdpbXBsZSAqc3RtdDsKKworICAgICAgaWYgKGRsLT5pc19yb290ICgpKQor CXsKKwkgIC8qIFdlIGRvIG5vdCByZWdlbmVyYXRlIHJvb3Qgbm9kZSwgc28gcmVzdWx0IHZhbHVl cyBvZiBzdGF0ZW1lbnRzIGluCisJICAgICB0aGUgbm9kZSBhcmUgdGhlIG9yaWdpbmFsLCBhbmQg d2lsbCBub3QgYmUgcmVkZWZpbmVkLiAgKi8KKwkgIEZPUl9FQUNIX1ZFQ19FTFQgKGRsLT5kZWZf c3RtdHMsIGksIHN0bXQpCisJICAgIHsKKwkgICAgICB0cmVlIHJvb3RfdmFsID0gZ2ltcGxlX2dl dF9saHMgKHN0bXQpOworCisJICAgICAgc3NhX3JlcHMucHV0IChyb290X3ZhbCwgcm9vdF92YWwp OworCSAgICB9CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIEFkZHJlc3MgY29tcHV0YXRp b24gc3RhdGVtZW50cyBoYXZlIGJlZW4gc29ydGVkIGluIG9yaWdpbmFsIG9yZGVyLiAgKi8KKyAg ICAgIEZPUl9FQUNIX1ZFQ19FTFQgKGRsLT5hZGRyX3N0bXRzLCBpLCBzdG10KQorCWNvcHlfZGVw X3N0bXQgKHN0bXQsICZnc2ksIHNzYV9yZXBzKTsKKworICAgICAgZ2ltcGxlICpuZXdfc3RtdCA9 IGNvcHlfZGVwX3N0bXQgKGRsLT5kZWZfc3RtdHNbMF0sICZnc2ksIHNzYV9yZXBzKTsKKyAgICAg IHRyZWUgbmV3X2xocyA9IGdpbXBsZV9hc3NpZ25fbGhzIChuZXdfc3RtdCk7CisKKyAgICAgIEZP Ul9FQUNIX1ZFQ19FTFRfRlJPTSAoZGwtPmRlZl9zdG10cywgaSwgc3RtdCwgMSkKKwl7CisJICB0 cmVlIG9sZF9saHMgPSBnaW1wbGVfYXNzaWduX2xocyAoc3RtdCk7CisKKwkgIC8qIEFsbCBsb2Fk cyBpbiBzYW1lIG5vZGUgd291bGQgZGVmaW5lIHNhbWUgbmV3IHJlc3VsdC4gICovCisJICBzc2Ff cmVwcy5wdXQgKG9sZF9saHMsIG5ld19saHMpOworCX0KKworICAgICAgaWYgKGRsLT5uZWVkX2Nh Y2hpbmcpCisJbG9hZF92YWxzLnNhZmVfcHVzaCAobmV3X2xocyk7CisgICAgfQorfQorCisvKiBV c2UgdmFsdWVzIGluIExPQURfVkFMUyB0byBpbml0aWFsaXplIGNvcnJlc3BvbmRpbmcgZmllbGRz IGluIGEgY2FjaGUKKyAgIGVsZW1lbnQgcG9pbnRlciBDQUNIRV9QVFIgd2hvc2UgdHlwZSBpcyBk ZXNjcmliZWQgYnkgQ1RfSU5GTy4gIEdlbmVyYXRlZAorICAgc3RhdGVtZW50cyB3aWxsIGJlIGlu c2VydGVkIGF0IGVuZCBvZiBCQi4gKi8KKworc3RhdGljIHZvaWQKK2dlbl9jYWNoZV9pbml0IChi YXNpY19ibG9jayBiYiwgY29uc3QgY2FjaGVfdHlwZV9pbmZvICZjdF9pbmZvLCB0cmVlIGNhY2hl X3B0ciwKKwkJYXV0b192ZWM8dHJlZT4gJmxvYWRfdmFscykKK3sKKyAgLyogU2V0IHRoZSBpbml0 IGZsYWcgdG8gYmUgdHJ1ZS4gICovCisgIHRyZWUgaW5pdF9yZWYgPSBidWlsZF9maWVsZF9yZWYg KGNhY2hlX3B0ciwgY3RfaW5mby5pbml0X2ZpZWxkKTsKKyAgYnVpbGRfYXNzaWduX2FmdGVyX2Ji IChiYiwgaW5pdF9yZWYsIGJvb2xlYW5fdHJ1ZV9ub2RlKTsKKworICB1bnNpZ25lZCBpOworICB0 cmVlIGZpZWxkX2RlY2w7CisKKyAgLyogU3RvcmUgZmllbGQgdmFsdWVzIHRvIHRoZSBjdXJyZW50 IGNhY2hlIGVsZW1lbnQuICBBcyBib3RoIGZpZWxkcyBhbmQKKyAgICAgbG9hZGVkIHZhbHVlcyBh cmUgYWRkZWQgaW4gcHJlLW9yZGVyIG9mIGRlcGVuZGVudCBsb2FkIHRyZWUsIHZhbHVlIGFuZAor ICAgICBmaWVsZCBhcmUgbWF0Y2hlZCBvbmUtYnktb25lLiAgKi8KKyAgRk9SX0VBQ0hfVkVDX0VM VCAoY3RfaW5mby5maWVsZHMsIGksIGZpZWxkX2RlY2wpCisgICAgeworICAgICAgdHJlZSByZWYg PSBidWlsZF9maWVsZF9yZWYgKGNhY2hlX3B0ciwgZmllbGRfZGVjbCk7CisgICAgICBidWlsZF9h c3NpZ25fYWZ0ZXJfYmIgKGJiLCByZWYsIGxvYWRfdmFsc1tpXSk7CisgICAgfQorfQorCisvKiBH ZW5lcmF0ZSBsb2FkIGZpZWxkcyBmcm9tIHRoZSBjdXJyZW50IGNhY2hlIGVsZW1lbnQgcG9pbnRl ciBDQUNIRV9QVFIsCisgICB3aG9zZSB0eXBlIGlzIGRlc2NyaWJlZCBieSBDVF9JTkZPLiAgVGhl c2UgbmV3IGxvYWQgc3RhdGVtZW50cyB3aWxsIGJlCisgICBpbnNlcnRlZCBhdCBlbmQgb2YgQkIs IGFuZCByZXN1bHQgdmFsdWVzIGFyZSByZWNvcmRlZCBpbnRvIExPQURfVkFMUy4gICovCisKK3N0 YXRpYyB2b2lkCitnZW5fbG9hZF9mcm9tX2NhY2hlIChiYXNpY19ibG9jayBiYiwgY29uc3QgY2Fj aGVfdHlwZV9pbmZvICZjdF9pbmZvLAorCQkgICAgIHRyZWUgY2FjaGVfcHRyLCBhdXRvX3ZlYzx0 cmVlPiAmbG9hZF92YWxzKQoreworICB1bnNpZ25lZCBpOworICB0cmVlIGZpZWxkX2RlY2w7CisK KyAgRk9SX0VBQ0hfVkVDX0VMVCAoY3RfaW5mby5maWVsZHMsIGksIGZpZWxkX2RlY2wpCisgICAg eworICAgICAgdHJlZSBsaHMgPSBtYWtlX3NzYV9uYW1lIChUUkVFX1RZUEUgKGZpZWxkX2RlY2wp KTsKKyAgICAgIGJ1aWxkX2Fzc2lnbl9hZnRlcl9iYiAoYmIsIGxocywgYnVpbGRfZmllbGRfcmVm IChjYWNoZV9wdHIsIGZpZWxkX2RlY2wpKTsKKyAgICAgIGxvYWRfdmFscy5zYWZlX3B1c2ggKGxo cyk7CisgICAgfQorfQorCisvKiBDcmVhdGUgZWRnZXMgdG8gbGluayBiYXNpYyBibG9ja3MgY3Jl YXRlZCBmb3IgbWdvLCBhbmQgcHJvcGVybHkgc2V0dXAgYmxvY2sKKyAgIHJlbGF0aW9uc2hpcCwg aW5jbHVkaW5nIGxvb3AgcGFyZW50IGFuZCBkb21pbmF0ZSBpbmZvcm1hdGlvbi4gICovCisKK3N0 YXRpYyB2b2lkCitjb25uZWN0X21nb19iYnMgKGJhc2ljX2Jsb2NrIGJiX2hlYWRlciwgYmFzaWNf YmxvY2sgYmJfbWVyZ2UsCisJCSBiYXNpY19ibG9jayBiYl90cmFuc19ubywgYmFzaWNfYmxvY2sg YmJfY2hlY2tfaW5pdCwKKwkJIGJhc2ljX2Jsb2NrIGJiX2luaXRfbm8sIGJhc2ljX2Jsb2NrIGJi X2luaXRfeWVzKQoreworICAvKiBMaW5rIGJhc2ljIGJsb2NrcyB0aGF0IG1ha2UgdXAgb2YgY29u ZGl0aW9uIHRvIGNoZWNrIHdoZXRoZXIgdHJhbnNmb3JtCisgICAgIGlzIG9rLiAgKi8KKyAgZWRn ZSB0cmFuc19mYWxzZV9lID0gRURHRV9QUkVEIChiYl90cmFuc19ubywgMCk7CisgIHRyYW5zX2Zh bHNlX2UtPmZsYWdzCisgICAgPSAoKHRyYW5zX2ZhbHNlX2UtPmZsYWdzICYgfkVER0VfRkFMTFRI UlUpIHwgRURHRV9GQUxTRV9WQUxVRSk7CisgIHRyYW5zX2ZhbHNlX2UtPnByb2JhYmlsaXR5ID0g cHJvZmlsZV9wcm9iYWJpbGl0eTo6dW5saWtlbHkgKCk7CisKKyAgZWRnZSB0cmFuc190cnVlX2Ug PSBtYWtlX2VkZ2UgKGJiX2hlYWRlciwgYmJfY2hlY2tfaW5pdCwgRURHRV9UUlVFX1ZBTFVFKTsK KyAgdHJhbnNfdHJ1ZV9lLT5wcm9iYWJpbGl0eSA9IHRyYW5zX2ZhbHNlX2UtPnByb2JhYmlsaXR5 LmludmVydCAoKTsKKworICAvKiBMaW5rIGJhc2ljIGJsb2NrcyB0aGF0IG1ha2UgdXAgb2YgY29u ZGl0aW9uIHRvIGNoZWNrIHRoYXQgY2FjaGUgZWxlbWVudAorICAgICBpcyBpbml0aWFsaXplZC4g ICovCisgIGVkZ2UgY2FjaGVfZmFsc2VfZSA9IG1ha2VfZWRnZSAoYmJfY2hlY2tfaW5pdCwgYmJf aW5pdF9ubywgRURHRV9GQUxTRV9WQUxVRSk7CisgIGNhY2hlX2ZhbHNlX2UtPnByb2JhYmlsaXR5 ID0gcHJvZmlsZV9wcm9iYWJpbGl0eTo6dW5saWtlbHkgKCk7CisgIG1ha2Vfc2luZ2xlX3N1Y2Nf ZWRnZSAoYmJfaW5pdF9ubywgYmJfbWVyZ2UsIEVER0VfRkFMTFRIUlUpOworCisgIGVkZ2UgY2Fj aGVfdHJ1ZV9lID0gbWFrZV9lZGdlIChiYl9jaGVja19pbml0LCBiYl9pbml0X3llcywgRURHRV9U UlVFX1ZBTFVFKTsKKyAgY2FjaGVfdHJ1ZV9lLT5wcm9iYWJpbGl0eSA9IGNhY2hlX2ZhbHNlX2Ut PnByb2JhYmlsaXR5LmludmVydCAoKTsKKyAgbWFrZV9zaW5nbGVfc3VjY19lZGdlIChiYl9pbml0 X3llcywgYmJfbWVyZ2UsIEVER0VfRkFMTFRIUlUpOworCisgIGNsYXNzIGxvb3AgKmxvb3AgPSBi Yl9oZWFkZXItPmxvb3BfZmF0aGVyOworICBhZGRfYmJfdG9fbG9vcCAoYmJfY2hlY2tfaW5pdCwg bG9vcCk7CisgIGFkZF9iYl90b19sb29wIChiYl9pbml0X25vLCBsb29wKTsKKyAgYWRkX2JiX3Rv X2xvb3AgKGJiX2luaXRfeWVzLCBsb29wKTsKKworICBzZXRfaW1tZWRpYXRlX2RvbWluYXRvciAo Q0RJX0RPTUlOQVRPUlMsIGJiX3RyYW5zX25vLCBiYl9oZWFkZXIpOworICBzZXRfaW1tZWRpYXRl X2RvbWluYXRvciAoQ0RJX0RPTUlOQVRPUlMsIGJiX2NoZWNrX2luaXQsIGJiX2hlYWRlcik7Cisg IHNldF9pbW1lZGlhdGVfZG9taW5hdG9yIChDRElfRE9NSU5BVE9SUywgYmJfaW5pdF9ubywgYmJf Y2hlY2tfaW5pdCk7CisgIHNldF9pbW1lZGlhdGVfZG9taW5hdG9yIChDRElfRE9NSU5BVE9SUywg YmJfaW5pdF95ZXMsIGJiX2NoZWNrX2luaXQpOworICBzZXRfaW1tZWRpYXRlX2RvbWluYXRvciAo Q0RJX0RPTUlOQVRPUlMsIGJiX21lcmdlLCBiYl9oZWFkZXIpOworfQorCisvKiBHZW5lcmF0ZSBQ SElzIGluIEJCX01FUkdFIHRvIG1lcmdlIHZhbHVlcyBMT0FEX1ZBTFMgZnJvbSAzIHByZWRlY2Vz c29ycyBpbgorICAgTUVSR0VfRS4gIFJlc3VsdHMgb2YgZ2VuZXJhdGVkIFBISXMgYXJlIGFkZGVk IGludG8gTkVXX1ZBTFMuICAqLworCitzdGF0aWMgdm9pZAorZ2VuX3BoaXNfZm9yX2xvYWRfdmFs dWUgKGJhc2ljX2Jsb2NrIGJiX21lcmdlLCBlZGdlIG1lcmdlX2VbM10sCisJCQkgY29uc3QgY2Fj aGVfdHlwZV9pbmZvICZjdF9pbmZvLAorCQkJIGF1dG9fdmVjPHRyZWU+IGxvYWRfdmFsc1szXSwK KwkJCSBhdXRvX3ZlYzx0cmVlPiAmbmV3X3ZhbHMpCit7CisgIHVuc2lnbmVkIGk7CisgIHRyZWUg ZmllbGRfZGVjbDsKKworICBGT1JfRUFDSF9WRUNfRUxUIChjdF9pbmZvLmZpZWxkcywgaSwgZmll bGRfZGVjbCkKKyAgICB7CisgICAgICB0cmVlIGxocworCT0gbWFrZV90ZW1wX3NzYV9uYW1lIChU UkVFX1RZUEUgKGZpZWxkX2RlY2wpLCBOVUxMLAorCQkJICAgICAgSURFTlRJRklFUl9QT0lOVEVS IChERUNMX05BTUUgKGZpZWxkX2RlY2wpKSk7CisgICAgICBncGhpICpwaGkgPSBjcmVhdGVfcGhp X25vZGUgKGxocywgYmJfbWVyZ2UpOworICAgICAgYWRkX3BoaV9hcmcgKHBoaSwgbG9hZF92YWxz WzBdW2ldLCBtZXJnZV9lWzBdLCBVTktOT1dOX0xPQ0FUSU9OKTsKKyAgICAgIGFkZF9waGlfYXJn IChwaGksIGxvYWRfdmFsc1sxXVtpXSwgbWVyZ2VfZVsxXSwgVU5LTk9XTl9MT0NBVElPTik7Cisg ICAgICBhZGRfcGhpX2FyZyAocGhpLCBsb2FkX3ZhbHNbMl1baV0sIG1lcmdlX2VbMl0sIFVOS05P V05fTE9DQVRJT04pOworCisgICAgICBuZXdfdmFscy5zYWZlX3B1c2ggKGxocyk7CisgICAgfQor fQorCisvKiBSZXBsYWNlIG9sZCB1c2VzIGZvciBsb2FkcyBpbiBkZXBlbmRlbnQgbG9hZCB0cmVl IERMX1JPT1Qgd2l0aCB2YWx1ZXMgaW4KKyAgIE5FV19WQUxTLiAgKi8KKworc3RhdGljIHZvaWQK K3VwZGF0ZV9kZXBfbG9hZHMgKGRlcF9sb2FkICpkbF9yb290LCBhdXRvX3ZlYzx0cmVlPiAmbmV3 X3ZhbHMpCit7CisgIHVuc2lnbmVkIG9yZGVyID0gMDsKKyAgZGVwX2xvYWRfd2Fsa2VyIGRsX3dh bGtlcjsKKyAgZGVwX2xvYWQgKmRsOworCisgIFdBTEtfREVQX0xPQURfUFJFX09SREVSIChkbF93 YWxrZXIsIGRsX3Jvb3QsIGRsKQorICAgIHsKKyAgICAgIGlmICghZGwtPm5lZWRfY2FjaGluZykK Kwljb250aW51ZTsKKworICAgICAgdHJlZSBuZXdfdmFsID0gbmV3X3ZhbHNbb3JkZXIrK107CisK KyAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCisJewor CSAgZnByaW50ZiAoZHVtcF9maWxlLCAiPj4gVXNlIG5ldyB2YWx1ZTogIik7CisJICBwcmludF9n ZW5lcmljX2V4cHIgKGR1bXBfZmlsZSwgbmV3X3ZhbCwgVERGX1NMSU0pOworCSAgZnByaW50ZiAo ZHVtcF9maWxlLCAiIHRvIHJlcGxhY2Ugb3JpZ2luIGRlcCBsb2FkOlxuIik7CisJfQorCisgICAg ICB1bnNpZ25lZCBpOworICAgICAgZ2ltcGxlICpvbGRfc3RtdDsKKyAgICAgIGdpbXBsZSAqdXNl X3N0bXQ7CisgICAgICBpbW1fdXNlX2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdXNlX29wZXJh bmRfcCBpbW1fdXNlX3A7CisKKyAgICAgIEZPUl9FQUNIX1ZFQ19FTFQgKGRsLT5kZWZfc3RtdHMs IGksIG9sZF9zdG10KQorCXsKKwkgIHRyZWUgbGhzID0gZ2ltcGxlX2Fzc2lnbl9saHMgKG9sZF9z dG10KTsKKworCSAgLyogT2xkIGxvYWQgc3RhdGVtZW50cyBhcmUgbm90IG5lZWRlZCBhbnltb3Jl LiAgVG8gYmUgc2ltcGxlLCBqdXN0CisJICAgICBsZXQgZm9sbG93aW5nIGRjZSBwYXNzIHRvIHJl bW92ZSB0aGVtIGFuZCByZWxhdGVkIHVudXNlZCBhZGRyZXNzCisJICAgICBjb21wdXRhdGlvbiBz dGF0ZW1lbnRzLiAgKi8KKwkgIEZPUl9FQUNIX0lNTV9VU0VfU1RNVCAodXNlX3N0bXQsIGl0ZXJh dG9yLCBsaHMpCisJICAgIEZPUl9FQUNIX0lNTV9VU0VfT05fU1RNVCAoaW1tX3VzZV9wLCBpdGVy YXRvcikKKwkgICAgICBTRVRfVVNFIChpbW1fdXNlX3AsIG5ld192YWwpOworCisJICBpZiAoZHVt cF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQorCSAgICBwcmludF9naW1wbGVf c3RtdF93aXRoX2JiIChkdW1wX2ZpbGUsIG9sZF9zdG10KTsKKwl9CisgICAgfQorfQorCisvKiBH aXZlbiBhIGxvb3AgaXRlcmF0b3IgZm9yIG1nbywgZ2VuZXJhdGUgY29kZSB0byBjYWNoZSBkYXRh IGlsbHVzdHJhdGVkIGFzCisgICB0aGUgZm9sbG93aW5nIGdyYXBoLgorCisJCSAgICBsb29wIGhl YWRlcgorCQkJIHwKKwkgICAgY2FjaGVfcHRyID0gUEhJIChjYWNoZV9hcnJheSwgY2FjaGVfcHRy ICsgMSkKKwkJCSB8CisJCSAgaWYgKHRyYW5zZm9ybSkKKwkJCSB8CisJICAgICB0cmFuc19ubyAg IC8gXCAgICB0cmFuc195ZXMKKwkgIC4tLS0tLS0tLS0tLS0qICAgKi0tLS0tLS0tLS0tLS0tLS0t LgorCSAgfAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKwkgIHwJCSAJICAgaWYgKGNh Y2hlX3B0ci0+aW5pdCkKKwkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAor CSAgfAkJIAkgICBpbml0X25vICAvIFwgIGluaXRfeWVzCisJICB8ICAgICAgICAgICAgICAgICAg ICAuLS0tLS0tLS0tLS0qICAgKi0tLS0tLS0tLS0tLgorCSAgfAkJICAgICAgIHwJICAgICAgICAg ICAgICAgICAgIHwKKyAgICB2MCA9ICpvcmlnX2RhdGEgICAgIHYxID0gKm9yaWdfZGF0YSAgICAg ICAgICAgdjIgPSBjYWNoZV9wdHItPmRhdGEKKwkgIHwgICAgICAgICAgICAgICAgICAgIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICB8CisJICB8ICAgICAgICAgICAgIGNhY2hlX3B0ci0+ZGF0 YSA9IHYxICAgICAgICAgICAgICAgfAorCSAgfCAgICAgICAgICAgICBjYWNoZV9wdHItPmluaXQg PSB0cnVlICAgICAgICAgICAgIHwKKwkgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAg ICAgICAgICAgICAgICAgICB8CisJICAnLS0tLS0tLS0tLS0tLS0tLS0tLT58PC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tJworCQkJICAgICAgIHwKKwkJCSAgICAgICBWCisJCSAgICAgdjMgPSBQ SEkgKHYwLCB2MSwgdjIpCisqLworCit2b2lkCitsb29wX2l0ZXJfaW5mbzo6Z2VuX2NhY2hpbmdf Y29kZSAoKSBjb25zdAoreworICB0cmVlIGNhY2hlX3B0ciA9IGdlbl9jYWNoZV9kYXRhX3BvaW50 ZXIgKCk7CisgIGdpbXBsZSAqZGVmX3N0bXQgPSBTU0FfTkFNRV9ERUZfU1RNVCAoY2FjaGVfcHRy KTsKKyAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoZ2ltcGxlX2JiIChkZWZfc3RtdCkgPT0gbWdvX2xv b3AtPmhlYWRlcik7CisKKyAgZWRnZSBmYWxsdGhydSA9IHNwbGl0X2Jsb2NrIChnaW1wbGVfYmIg KGRlZl9zdG10KSwgZGVmX3N0bXQpOworICBiYXNpY19ibG9jayBiYl9oZWFkZXIgPSBmYWxsdGhy dS0+c3JjOworICBiYXNpY19ibG9jayBiYl9tZXJnZSA9IGZhbGx0aHJ1LT5kZXN0OworICBiYXNp Y19ibG9jayBiYl90cmFuc19ubyA9IHNwbGl0X2VkZ2UgKGZhbGx0aHJ1KTsKKworICBiYXNpY19i bG9jayBiYl9jaGVja19pbml0ID0gY3JlYXRlX2VtcHR5X2JiIChiYl9oZWFkZXIpOworICBiYXNp Y19ibG9jayBiYl9pbml0X25vID0gY3JlYXRlX2VtcHR5X2JiIChiYl9jaGVja19pbml0KTsKKyAg YmFzaWNfYmxvY2sgYmJfaW5pdF95ZXMgPSBjcmVhdGVfZW1wdHlfYmIgKGJiX2NoZWNrX2luaXQp OworCisgIC8qIFZhbHVlcyBsb2FkZWQgZWl0aGVyIGZyb20gY2FjaGUgb3Igb3JpZ2luYWwgbGlz dC4gICovCisgIGF1dG9fdmVjPHRyZWU+IGxvYWRfdmFsc1szXTsKKworICAvKiAoMSkgQnVpbGQg YmFzaWMgYmxvY2tzLiAgKi8KKworICAvKiBDaGVjayBpZiB0cmFuc2Zvcm0gaXMgb2sgaW4gaGVh ZGVyLiAgKi8KKyAgYnVpbGRfY29uZF9hZnRlcl9iYiAoYmJfaGVhZGVyLCB0cmFuc19vaywgRVFf RVhQUiwgYm9vbGVhbl90cnVlX25vZGUpOworCisgIC8qIENoZWNrIGlmIGVsZW1lbnQgaXMgYWxy ZWFkeSBpbiBjYWNoZS4gICovCisgIHRyZWUgaW5pdCA9IG1ha2Vfc3NhX25hbWUgKFRSRUVfVFlQ RSAoY3RfaW5mby5pbml0X2ZpZWxkKSk7CisgIHRyZWUgaW5pdF9yZWYgPSBidWlsZF9maWVsZF9y ZWYgKGNhY2hlX3B0ciwgY3RfaW5mby5pbml0X2ZpZWxkKTsKKyAgYnVpbGRfYXNzaWduX2FmdGVy X2JiIChiYl9jaGVja19pbml0LCBpbml0LCBpbml0X3JlZik7CisgIGJ1aWxkX2NvbmRfYWZ0ZXJf YmIgKGJiX2NoZWNrX2luaXQsIGluaXQsIEVRX0VYUFIsIGJvb2xlYW5fdHJ1ZV9ub2RlKTsKKwor ICAvKiBMb2FkIHZhbHVlcyBmcm9tIHRoZSBjdXJyZW50IGNhY2hlIHBvaW50ZXIuICAqLworICBn ZW5fbG9hZF9mcm9tX2NhY2hlIChiYl9pbml0X3llcywgY3RfaW5mbywgY2FjaGVfcHRyLCBsb2Fk X3ZhbHNbMF0pOworCisgIC8qIExvYWQgdmFsdWVzIGFzIG9yaWdpbmFsIHNlcXVlbmNlIGFuZCBp bml0IHRoZSBjdXJyZW50IGNhY2hlIGVsZW1lbnQuICAqLworICBnZW5fb3JpZ19sb2FkX3NlcXVl bmNlIChiYl9pbml0X25vLCBkZXBfbG9hZF9yb290LCBsb2FkX3ZhbHNbMV0pOworICBnZW5fY2Fj aGVfaW5pdCAoYmJfaW5pdF9ubywgY3RfaW5mbywgY2FjaGVfcHRyLCBsb2FkX3ZhbHNbMV0pOwor CisgIC8qIEp1c3QgbG9hZCB2YWx1ZXMgYXMgb3JpZ2luYWwgbG9hZCBzZXF1ZW5jZS4gICovCisg IGdlbl9vcmlnX2xvYWRfc2VxdWVuY2UgKGJiX3RyYW5zX25vLCBkZXBfbG9hZF9yb290LCBsb2Fk X3ZhbHNbMl0pOworCisgIC8qICgyKSBCdWlsZCBlZGdlcyBhbmQgUEhJcy4gICovCisKKyAgLyog Q29ubmVjdCBiYXNpYyBibG9ja3Mgd2l0aCBlZGdlcy4gICovCisgIGNvbm5lY3RfbWdvX2JicyAo YmJfaGVhZGVyLCBiYl9tZXJnZSwgYmJfdHJhbnNfbm8sIGJiX2NoZWNrX2luaXQsIGJiX2luaXRf bm8sCisJCSAgIGJiX2luaXRfeWVzKTsKKworICAvKiBHZW5lcmF0ZSBQSElzIHRvIG1lcmdlIGxv YWQgdmFsdWVzIGluIGJiX21lcmdlLiAgKi8KKyAgZWRnZSBtZXJnZV9lW10gPSB7IEVER0VfU1VD QyAoYmJfaW5pdF95ZXMsIDApLCBFREdFX1NVQ0MgKGJiX2luaXRfbm8sIDApLAorCQkgICAgIEVE R0VfU1VDQyAoYmJfdHJhbnNfbm8sIDApIH07CisgIGF1dG9fdmVjPHRyZWU+IG5ld192YWxzOwor ICBnZW5fcGhpc19mb3JfbG9hZF92YWx1ZSAoYmJfbWVyZ2UsIG1lcmdlX2UsIGN0X2luZm8sIGxv YWRfdmFscywgbmV3X3ZhbHMpOworCisgIC8qICgzKSBVcGRhdGUgb2xkIGRlcGVuZGVudCBsb2Fk cyB3aXRoIG5ldyB2YWx1ZXMuICAqLworCisgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3Mg JiBUREZfREVUQUlMUykpCisgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiPiBVcGRhdGluZyBvbGQg ZGVwZW5kZW50IGxvYWRzIHdpdGggbmV3IHZhbHVlczpcbiIpOworCisgIHVwZGF0ZV9kZXBfbG9h ZHMgKGRlcF9sb2FkX3Jvb3QsIG5ld192YWxzKTsKK30KKworLyogTWFpbiBlbnRyeSB0byBnZW5l cmF0ZSBkYXRhIGNhY2hpbmcgY29kZS4gICovCisKK3ZvaWQKK2xvb3BfaXRlcl9pbmZvOjppbnNl cnRfbWdvX2NvZGUgKCkKK3sKKyAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9E RVRBSUxTKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICI+IEFwcGx5IG1nbyB0 byBkZXBlbmRlbnQgbG9hZCBpbiBsb29wICVkICIKKwkgICAgICAgIihvdXRlciAlZClcbiIsIG1n b19sb29wLT5udW0sIG1nb19vdXRlcl9sb29wLT5udW0pOworICAgICAgZHVtcF9kZXBfbG9hZCAo ZGVwX2xvYWRfcm9vdCk7CisgICAgfQorCisgIC8qIFRPRE86IENhY2hlIHN0cnVjdCBzaXplIGlz IGEgZmFjdG9yIG9mIGNvc3QgbW9kZWwuIElmIGl0IGV4Y2VlZHMKKyAgICAgc3BlY2lmaWVkIHRo cmVzaG9sZCwgdGhlIGl0ZXJhdG9yIHNob3VsZCBiZSBieXBhc3NlZCBpbiBhZHZhbmNlLAorICAg ICBpbnN0ZWFkIG9mIGRvaW5nIHRoaXMgY2hlY2sgaGVyZS4gICovCisgIGlmICghZ2VuX2NhY2hl X3R5cGVfaW5mbyAoKSkKKyAgICByZXR1cm47CisKKyAgLyogR2VuZXJhdGUgX3RyYW5zZm9ybV9v aywgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgdG8gdHJ1ZS4gICovCisgIHRyYW5zX29rID0gbWFrZV9z c2FfbmFtZV9iZWZvcmVfbG9vcCAobWdvX291dGVyX2xvb3AsIGJvb2xlYW5fdHJ1ZV9ub2RlLAor CQkJCQkiX3RyYW5zZm9ybV9vayIpOworCisgIGdlbl9jYWNoaW5nX2NvZGUgKCk7Cit9CisKKy8q IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgR0VO RVJBVElORyBDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t ICovCisKKy8qIEdpdmVuIFBISSBhdCBoZWFkZXIgb2YgTE9PUCwgc2NhbiB0aGUgZGVmL3VzZSBj aGFpbiBpbiBMT09QIGJhY2t3YXJkcyB0bworICAgc2VlIHdoZXRoZXIgaXQgY291bGQgYmUgYSBt Z28gaXRlcmF0b3IsICBhbmQgaWYgaWRlbnRpZmllZCwgYQorICAgTE9PUF9JVEVSX0lORk8gc3Ry dWN0IGRlc2NyaWJpbmcgdGhlIGl0ZXJhdG9yIHdvdWxkIGJlIHJldHVybmVkLiAgKi8KKworc3Rh dGljIGxvb3BfaXRlcl9pbmZvICoKK2lkZW50aWZ5X2l0ZXJhdG9yIChjb25zdCBjbGFzcyBsb29w ICpsb29wLCBncGhpICpwaGkpCit7CisgIGVkZ2UgbGF0Y2ggPSBsb29wX2xhdGNoX2VkZ2UgKGxv b3ApOworICB0cmVlIGxhdGNoX3ZhbCA9IFBISV9BUkdfREVGX0ZST01fRURHRSAocGhpLCBsYXRj aCk7CisKKyAgLyogVmFsdWUgc3BhY2Ugb2YgYm9vbGVhbiB0eXBlIGNvbnRhaW5zIG9ubHkgdHdv IHZhbHVlcywgdG9vIHNtYWxsIHRvIGdldAorICAgICBiZW5lZml0IGZyb20gbWdvLiAgKi8KKyAg aWYgKFRSRUVfQ09ERSAobGF0Y2hfdmFsKSAhPSBTU0FfTkFNRQorICAgICAgfHwgVFJFRV9DT0RF IChUUkVFX1RZUEUgKGxhdGNoX3ZhbCkpID09IEJPT0xFQU5fVFlQRSkKKyAgICByZXR1cm4gTlVM TDsKKworICBjbGFzcyBsb29wICpvdXRlcl9sb29wID0gbG9vcF9vdXRlciAobG9vcCk7CisgIGF1 dG9fdmVjPHRyZWU+IHdvcmtsaXN0OworICBhdXRvX3ZlYzx0cmVlPiBpbnZhcl9vcG5kczsKKyAg YXV0b192ZWM8Z2ltcGxlICo+IGl0ZXJfbmV4dF9zdG10czsKKyAgYXV0b19iaXRtYXAgdmlzaXRl ZDsKKworICAvKiBBZGQgdmFsdWUgZnJvbSBsYXRjaCBlZGdlIHRvIHdvcmtsaXN0LiAgKi8KKyAg Yml0bWFwX3NldF9iaXQgKHZpc2l0ZWQsIFNTQV9OQU1FX1ZFUlNJT04gKGxhdGNoX3ZhbCkpOwor ICB3b3JrbGlzdC5zYWZlX3B1c2ggKGxhdGNoX3ZhbCk7CisKKyAgLyogU2VhcmNoIGFsbCBkZWYg c3RtdHMgYmFja3dhcmRzIHRvIGNoZWNrIGlmIGl0IGlzIGFuIGl0ZXJhdG9yLiAgKi8KKyAgZG8K KyAgICB7CisgICAgICB0cmVlIG5hbWUgPSB3b3JrbGlzdC5wb3AgKCk7CisKKyAgICAgIGlmIChl eHByX2ludmFyaWFudF9pbl9sb29wX3AgKG91dGVyX2xvb3AsIG5hbWUpKQorCXsKKwkgIGludmFy X29wbmRzLnNhZmVfcHVzaCAobmFtZSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGdpbXBs ZSAqc3RtdCA9IFNTQV9OQU1FX0RFRl9TVE1UIChuYW1lKTsKKworICAgICAgaWYgKCFzdG10X2lu c2lkZV9sb29wX3AgKGxvb3AsIHN0bXQpIHx8IGdpbXBsZV9oYXNfc2lkZV9lZmZlY3RzIChzdG10 KSkKKwlyZXR1cm4gTlVMTDsKKworICAgICAgLyogTm93IHdlIHJlcXVpcmUgdGhhdCB0aGUgaXRl cmF0b3IgaXMgYWR2YW5jZWQgb25jZSBpbiBlYWNoIGl0ZXJhdGlvbgorCSBvZiB0aGUgbG9vcCwg c28gZG8gbm90IGFsbG93IFBISSBzdGF0ZW1lbnQuICBUT0RPOiBTdXBwb3J0IGlycmVndWxhcgor CSBsb29wIGZvcm0gd2hpY2ggY29udGFpbnMgbXVsdGlwbGUgaXRlcmF0b3IgYWR2YW5jaW5nIHN0 YXRlbWVudHMuICAqLworICAgICAgaWYgKGdpbXBsZV9jb2RlIChzdG10KSAhPSBHSU1QTEVfUEhJ KQorCXsKKwkgIHRyZWUgb3BuZDsKKwkgIHNzYV9vcF9pdGVyIGl0ZXI7CisKKwkgIEZPUl9FQUNI X1NTQV9UUkVFX09QRVJBTkQgKG9wbmQsIHN0bXQsIGl0ZXIsIFNTQV9PUF9VU0UpCisJICAgIGlm IChiaXRtYXBfc2V0X2JpdCAodmlzaXRlZCwgU1NBX05BTUVfVkVSU0lPTiAob3BuZCkpKQorCSAg ICAgIHdvcmtsaXN0LnNhZmVfcHVzaCAob3BuZCk7CisKKwkgIC8qIFJlY29yZCBub24tY29weSBz dGF0ZW1lbnRzLCBhcyBhIHdob2xlLCB3aGljaCB3b3VsZCBjb21wb3NlCisJICAgICBpdGVyYXRv ciBhZHZhbmNpbmcgb3BlcmF0aW9uLiAgKi8KKwkgIGlmICghYXNzaWduX3NzYV9jb3B5X3AgKHN0 bXQpKQorCSAgICBpdGVyX25leHRfc3RtdHMuc2FmZV9wdXNoIChzdG10KTsKKwl9CisgICAgICBl bHNlIGlmIChzdG10ICE9IHBoaSkKKwlyZXR1cm4gTlVMTDsKKworICAgIH0gd2hpbGUgKCF3b3Jr bGlzdC5pc19lbXB0eSAoKSk7CisKKyAgLyogTm90IGEgcmVhbCBpdGVyYXRvciwgc2luY2UgaXRz IG5leHQgc3RhdGUgaXMgbm90IGRlcml2ZWQgZnJvbSBjdXJyZW50CisgICAgIHN0YXRlLCBvciBp dHMgc3RhdGUgaXMgbmV2ZXIgY2hhbmdlZC4gICovCisgIGlmICghYml0bWFwX2JpdF9wICh2aXNp dGVkLCBTU0FfTkFNRV9WRVJTSU9OIChnaW1wbGVfcGhpX3Jlc3VsdCAocGhpKSkpCisgICAgICB8 fCBpdGVyX25leHRfc3RtdHMuaXNfZW1wdHkgKCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbG9v cF9pdGVyX2luZm8gKml0ZXJfaW5mbyA9IG5ldyBsb29wX2l0ZXJfaW5mbyAocGhpLCBpdGVyX25l eHRfc3RtdHMsCisJCQkJCQkgIGludmFyX29wbmRzKTsKKworICBpZiAoIWl0ZXJfaW5mby0+cG9z dF9jaGVjayAoKSkKKyAgICB7CisgICAgICBkZWxldGUgaXRlcl9pbmZvOworICAgICAgcmV0dXJu IE5VTEw7CisgICAgfQorCisgIHJldHVybiBpdGVyX2luZm87Cit9CisKKy8qIElkZW50aWZ5IGFs bCBpdGVyYXRvcnMgcXVhbGlmaWVkIGZvciBtZ28gaW4gTE9PUCwgcmV0dXJuIHRydWUgaWYgc29t ZXRoaW5nCisgICB3YXMgZm91bmQuICAqLworCitzdGF0aWMgYm9vbAorZmluZF9pdGVyYXRvcnMg KGNvbnN0IGNsYXNzIGxvb3AgKmxvb3ApCit7CisgIGxvb3BfbWdvX2luZm8gKm1nb19pbmZvID0g Z2V0X21nb19pbmZvIChsb29wKTsKKworICAvKiBTY2FuIGFsbCBwaGlzIGluIGxvb3AgaGVhZGVy IGFzIHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIGl0ZXJhdG9ycyBpbgorICAgICBhIHNpbmdsZSBs b29wLiAgKi8KKyAgZm9yIChncGhpX2l0ZXJhdG9yIGdzaSA9IGdzaV9zdGFydF9ub252aXJ0dWFs X3BoaXMgKGxvb3AtPmhlYWRlcik7CisgICAgICAgIWdzaV9lbmRfcCAoZ3NpKTsgZ3NpX25leHRf bm9udmlydHVhbF9waGkgKCZnc2kpKQorICAgIHsKKyAgICAgIGxvb3BfaXRlcl9pbmZvICppdGVy X2luZm8gPSBpZGVudGlmeV9pdGVyYXRvciAobG9vcCwgZ3NpLnBoaSAoKSk7CisKKyAgICAgIGlm ICghaXRlcl9pbmZvKQorCWNvbnRpbnVlOworCisgICAgICBtZ29faW5mby0+aXRlcnMuc2FmZV9w dXNoIChpdGVyX2luZm8pOworICAgIH0KKworICByZXR1cm4gIW1nb19pbmZvLT5pdGVycy5pc19l bXB0eSAoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3N0bXRfdWlkX2NtcCAoY29uc3Qgdm9p ZCAqcDAsIGNvbnN0IHZvaWQgKnAxKQoreworICB1bnNpZ25lZCB1aWQwID0gZ2ltcGxlX3VpZCAo Kihjb25zdCBnaW1wbGUgKmNvbnN0ICopIHAwKTsKKyAgdW5zaWduZWQgdWlkMSA9IGdpbXBsZV91 aWQgKCooY29uc3QgZ2ltcGxlICpjb25zdCAqKSBwMSk7CisKKyAgZ2NjX2NoZWNraW5nX2Fzc2Vy dCAodWlkMCAmJiB1aWQxKTsKKworICByZXR1cm4gKGludCkgKHVpZDAgLSB1aWQxKTsKK30KKwor LyogQnVpbGQgdmFsdWUgZGVwZW5kZW5jeSBmb3IgU1RNVCBpbiBMT09QLCBhbmQgdHJ5IHRvIGFk ZCBpdCB0byBhIGRlcGVuZGVudAorICAgbG9hZCB0cmVlLiAgSWYgb3BlcmFuZHMgb2YgU1RNVCBh cmUgZGVyaXZlZCBmcm9tIHJlc3VsdCBvZiBjZXJ0YWluCisgICBkZXBlbmRlbnQgbG9hZCwgb3Ig ZnJvbSB2YWx1ZXMgdGhhdCBhcmUgaW52YXJpYW50IGluIGltbWVkaWF0ZSBvdXRlciBsb29wLAor ICAgaXQgd2lsbCBiZSBhc3NpZ25lZCBhIHVpZCBudW1iZXIsIGFuZCBpdHMgY29ycmVzcG9uZGlu ZyBlbnRyeSBpbiBERVBfQVJSQVkKKyAgIHdpbGwgYmUgc2V0IHRvIHRoYXQgZGVwZW5kZW50IGxv YWQsIG9yIGVtcHR5IGlmIG1lcmVseSBvdXRlciBsb29wCisgICBpbnZhcmlhbnQuICAqLworCitz dGF0aWMgdm9pZAorYWRkX3RvX2RlcF9sb2FkX3RyZWUgKGNvbnN0IGNsYXNzIGxvb3AgKmxvb3As IGdpbXBsZSAqc3RtdCwKKwkJICAgICAgYXV0b192ZWM8ZGVwX2xvYWQgKj4gJmRlcF9hcnJheSkK K3sKKyAgdHJlZSBsaHMgPSBnaW1wbGVfZ2V0X2xocyAoc3RtdCk7CisgIGJvb2wgaXNfbG9hZCA9 IGZhbHNlOworCisgIC8qIFR3byBraW5kcyBvZiBzdGF0ZW1lbnRzIGFyZSBpbmNsdWRlZCBpbiBk ZXBlbmRlbnQgbG9hZCB0cmVlLCBvbmUgaXMgbG9hZAorICAgICBzdGF0ZW1lbnQgd2UgYXJlIGlu dGVyZXN0ZWQgaW4sIHdoaWNoIGFjdHMgYXMgdHJlZSBub2RlLCB0aGUgb3RoZXIgb2NjdXJzCisg ICAgIGluIGNoaWxkIGxvYWQncyBhZGRyZXNzIGNvbXB1dGlvbiBmcm9tIHJlc3VsdCBvZiBwYXJl bnQgbG9hZCwgd2hpY2ggYWN0cworICAgICBhcyBhIGJyaWRnZSBiZXR3ZWVuIHRoZW0sIGFuZCB3 aWxsIGJlIGNvbGxlY3RlZCBpbnRvICJhZGRyX3N0bXRzIiBvZiB0aGUKKyAgICAgYmVsb25naW5n IGNoaWxkIG5vZGUuCisKKwkJdjEgPSBsb2FkWy5dICAgICAgPC0tLSAgcGFyZW50IGxvYWQKKwor CQl2MiA9IHYxIG9wIGNvbnN0ICA8LS0uCisJCQkJICAgICB8ICBjaGlsZCBsb2FkJ3MgYWRkcmVz cyBjb21wdXRhdGlvbgorCQl2MyA9IGJhc2Ugb3AgdjIgICA8LS0nCisKKwkJdjQgPSBsb2FkW3Yz XSAgICAgPC0tLSAgY2hpbGQgbG9hZAorCisgICAgIEN1cnJlbnRseSwgb25seSBzdGF0ZW1lbnQg dGhhdCBkZXBlbmRzIG9uIHNvbGUgb25lIHRyZWUgbm9kZSBpcyBoYW5kbGVkLAorICAgICBhbHRo b3VnaCBtdWx0aXBsZSBwYXJlbnRzIGFyZSBwb3NzaWJsZSwgd2hpY2ggaXMgYSBUT0RPLiAgQW5k IHRoZXNlCisgICAgIHN0YXRlbWVudHMgd2lsbCBiZSBhc3NpZ25lZCBhIG5vbi16ZXJvIHVpZC4g IEZvciBhIGxvYWQsIGl0IHdpbGwgYWxzbyBiZQorICAgICBtYXJrZWQgYXMgR0ZfREVQX0xPQUQs IHNpbmNlIGl0IGlzIGRlZmluaXRlbHkgYSB0cmVlIG5vZGUuICBXaGlsZSBmb3IKKyAgICAgb3Ro ZXIgc3RhdGVtZW50LCBpdCB3aWxsIG5vdCBiZSBwYXJ0IG9mIGRlcGVuZGVudCBsb2FkIHRyZWUg aWYgaXRzIHJlc3VsdAorICAgICBpcyBub3QgdXNlZCBieSBhbnkgbG9hZC4gIFNvIGluIG9yZGVy IHRvIGZhc3QgY2hlY2sgd2hldGhlciBhIHN0YXRlbWVudAorICAgICB3aXRoIG5vbi16ZXJvIHVp ZCBpcyByZWFsbHkgY292ZXJlZCBieSBhIGRlcGVuZGVudCBsb2FkIHRyZWUsIEdGX0lOQ0xVREVE CisgICAgIGZsYWcgaXMgdXNlZC4KKworICAgICBTaW5jZSB0aGVzZSB1aWQvZmxhZ3Mgd2lsbCBi ZSBjbGVhcmVkIHdoZW4gYW5hbHl6aW5nIG90aGVyIGxvb3AsIHdlCisgICAgIFNIT1VMRCBOT1Qg cmVseSBvbiB0aGVtIHRvIGRvIHNvbWV0aGluZyBpbiB0cmFuc2Zvcm1hdGlvbiBwaGFzZS4gICov CisKKyAgZ2ltcGxlX3NldF91aWQgKHN0bXQsIDApOworICBnaW1wbGVfc2V0X3BsZiAoc3RtdCwg R0ZfREVQX0xPQUQsIGZhbHNlKTsKKyAgZ2ltcGxlX3NldF9wbGYgKHN0bXQsIEdGX0lOQ0xVREVE LCBmYWxzZSk7CisKKyAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoZ2ltcGxlX2NvZGUgKHN0bXQpICE9 IEdJTVBMRV9QSEkpOworCisgIGlmICghbGhzIHx8IFRSRUVfQ09ERSAobGhzKSAhPSBTU0FfTkFN RSB8fCBnaW1wbGVfaGFzX3NpZGVfZWZmZWN0cyAoc3RtdCkpCisgICAgcmV0dXJuOworCisgIHRy ZWUgdHlwZSA9IFRSRUVfVFlQRSAobGhzKTsKKworICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChDT01Q TEVURV9UWVBFX1AgKHR5cGUpKTsKKworICAvKiBOb3cgd2Ugb25seSBjYXJlIGFib3V0IG5vbi1h Z2dyZWdhdGUgdHlwZSB3aXRoIGZpeGVkIHNpemUuICAqLworICBpZiAoVFJFRV9DT0RFIChUWVBF X1NJWkUgKHR5cGUpKSAhPSBJTlRFR0VSX0NTVCB8fCBBR0dSRUdBVEVfVFlQRV9QICh0eXBlKSkK KyAgICByZXR1cm47CisKKyAgaWYgKGdpbXBsZV9hc3NpZ25fbG9hZF9wIChzdG10KSkKKyAgICBp c19sb2FkID0gdHJ1ZTsKKyAgZWxzZSBpZiAoZ2ltcGxlX3Z1c2UgKHN0bXQpKQorICAgIHJldHVy bjsKKworICBjbGFzcyBsb29wICpvdXRlcl9sb29wID0gbG9vcF9vdXRlciAobG9vcCk7CisgIHRy ZWUgb3BuZDsKKyAgc3NhX29wX2l0ZXIgaXRlcjsKKyAgZGVwX2xvYWQgKnBhcmVudCA9IE5VTEw7 CisKKyAgRk9SX0VBQ0hfU1NBX1RSRUVfT1BFUkFORCAob3BuZCwgc3RtdCwgaXRlciwgU1NBX09Q X1VTRSkKKyAgICB7CisgICAgICBnaW1wbGUgKm9wbmRfc3RtdCA9IFNTQV9OQU1FX0RFRl9TVE1U IChvcG5kKTsKKworICAgICAgaWYgKCFzdG10X2luc2lkZV9sb29wX3AgKGxvb3AsIG9wbmRfc3Rt dCkpCisJeworCSAgaWYgKCFleHByX2ludmFyaWFudF9pbl9sb29wX3AgKG91dGVyX2xvb3AsIG9w bmQpKQorCSAgICByZXR1cm47CisKKwkgIC8qIENsZWFyIHVpZCBvZiBvdXRlciBsb29wIGludmFy aWFudCBzdGF0ZW1lbnQgdG8gbGV0IHVzIHF1aWNrbHkKKwkgICAgIGRpc3Rpbmd1aXNoIGl0IGZy b20gaW4tbG9vcCBvcGVyYW5kcyBpbiBwcm9jZXNzaW5nIGJlbG93LiAgKi8KKwkgIGdpbXBsZV9z ZXRfdWlkIChvcG5kX3N0bXQsIDApOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoIWdp bXBsZV91aWQgKG9wbmRfc3RtdCkpCisJcmV0dXJuOworCisgICAgICBkZXBfbG9hZCAqbmV3X3Bh cmVudCA9IGRlcF9hcnJheVtnaW1wbGVfdWlkIChvcG5kX3N0bXQpIC0gMV07CisKKyAgICAgIGlm ICghcGFyZW50KQorCXBhcmVudCA9IG5ld19wYXJlbnQ7CisgICAgICBlbHNlIGlmIChwYXJlbnQg IT0gbmV3X3BhcmVudCAmJiBuZXdfcGFyZW50KQorCS8qIFRPRE86IEEgc3RhdGVtZW50IG1heSBk ZXBlbmQgb24gbXVsdGlwbGUgcGFyZW50IG5vZGVzLiAgKi8KKwlyZXR1cm47CisgICAgfQorCisg IGlmICghaXNfbG9hZCkKKyAgICB7CisgICAgICAvKiBXaGVuIHN0YXRlbWVudCBkZWZpbmVzIGFu IG91dGVyIGxvb3AgaW52YXJpYW50IHZhbHVlLCBpdHMgZGVwZW5kcworCSBvbiBub3RoaW5nIChl LmcuIHBhcmVudCBpcyBlbXB0eSksIG90aGVyd2lzZSBzZXQgcGFyZW50IGZvdW5kLiAgKi8KKyAg ICAgIGRlcF9hcnJheS5zYWZlX3B1c2ggKHBhcmVudCk7CisgICAgICBnaW1wbGVfc2V0X3VpZCAo c3RtdCwgZGVwX2FycmF5Lmxlbmd0aCAoKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlm ICghcGFyZW50KQorICAgIHsKKyAgICAgIC8qIFRoZSB2YWx1ZSBpcyBmcm9tIGEgbWVtb3J5IGxv YWQgd2hvc2UgYWRkcmVzcyBpcyBvdXRlciBsb29wCisJIGludmFyaWFudCwgYW5kIGNvdWxkIGFs c28gY29udHJpYnV0ZSB0byBhZGRyZXNzIGNvbXB1dGF0aW9uIGZvcgorCSBkZXBlbmRlbnQgbG9h ZCwgYnV0IGl0cyB2YWx1ZSBtYXkgYmUgdmFyaWFudCwgc28gaXMgaWdub3JlZCBub3cuCisJIFRP RE86IHJlc29ydCB0byBzdGF0aWMgYWxpYXMgYW5hbHlzaXMgb3IgZHluYW1pYyBjaGVjayB0byBl bnN1cmUgaXRzCisJIGludmFyaWFudG5lc3Mgc28gYXMgdG8gdXNlIGl0IGFzIGFkZHJlc3MgY29t cHV0YXRpb24gc3RhdGVtZW50IGZvcgorCSBkZXBlbmRlbnQgbG9hZC4gICovCisgICAgICByZXR1 cm47CisgICAgfQorCisgIGludCBsZXZlbCA9IHBhcmVudC0+bGV2ZWwgKyAxOworCisgIGlmIChs ZXZlbCA+IHBhcmFtX21nb19kZXBfbG9hZF9sZXZlbCkKKyAgICByZXR1cm47CisKKyAgZGVwX2xv YWQgKmRsID0gbmV3IGRlcF9sb2FkIChzdG10LCBsZXZlbCk7CisgIGF1dG9fdmVjPGdpbXBsZSAq PiB3b3JrbGlzdDsKKyAgYXV0b19iaXRtYXAgdmlzaXRlZDsKKworICB3b3JrbGlzdC5zYWZlX3B1 c2ggKHN0bXQpOworCisgIC8qIExvYWQgYWRkcmVzcyBtYXkgbm90IGRpcmVjdGx5IHVzZSB2YWx1 ZSBvZiBwcmlvciBsb2FkLCBpdCBjb3VsZCBiZQorICAgICBhIHJlc3VsdCBvZiBhIHNlcmllcyBv ZiBvcGVyYXRpb25zIG9uIHRoZSB2YWx1ZSwgd2hpY2ggaXMgY29tbW9uIGluCisgICAgIGFkZHJl c3MgY29tcHV0YXRpb24gZm9yIGFycmF5IGFjY2VzcyAoZS5nLiBhcnJheVsoKm1lbSArIDgpICUg MjVdKS4KKworICAgICBIZXJlIHRyYXZlcnNlIGJhY2t3YXJkcyBmcm9tIHRoZSBsb2FkIHVudGls IHJlYWNoaW5nIGl0cyBkZXBlbmRlbnQKKyAgICAgcGFyZW50LCBjb2xsZWN0IGFsbCBzdGF0ZW1l bnRzIHRoYXQgY29udHJpYnV0ZSB0byB0aGUgbG9hZCBhZGRyZXNzCisgICAgIGNvbXB1dGF0aW9u LiAgKi8KKyAgZG8KKyAgICB7CisgICAgICBnaW1wbGUgKmRlcF9zdG10ID0gd29ya2xpc3QucG9w ICgpOworCisgICAgICBGT1JfRUFDSF9TU0FfVFJFRV9PUEVSQU5EIChvcG5kLCBkZXBfc3RtdCwg aXRlciwgU1NBX09QX1VTRSkKKwl7CisJICBnaW1wbGUgKm9wbmRfc3RtdCA9IFNTQV9OQU1FX0RF Rl9TVE1UIChvcG5kKTsKKworCSAgLyogT3BlcmFuZCBpcyBvdXRlciBsb29wIGludmFyaWFudC4g ICovCisJICBpZiAoIWdpbXBsZV91aWQgKG9wbmRfc3RtdCkpCisJICAgIHsKKwkgICAgICBpZiAo IWRsLT5pbnZhcl9vcG5kcy5jb250YWlucyAob3BuZCkpCisJCWRsLT5pbnZhcl9vcG5kcy5zYWZl X3B1c2ggKG9wbmQpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIC8qIFJlYWNoIGRl cGVuZGVudCBwYXJlbnQsIHN0b3Agd2Fsa2luZy4gICovCisJICBpZiAoZ2ltcGxlX3BsZiAob3Bu ZF9zdG10LCBHRl9ERVBfTE9BRCkpCisJICAgIGNvbnRpbnVlOworCisJICBpZiAoYml0bWFwX3Nl dF9iaXQgKHZpc2l0ZWQsIGdpbXBsZV91aWQgKG9wbmRfc3RtdCkpKQorCSAgICB7CisJICAgICAg ZGwtPmFkZHJfc3RtdHMuc2FmZV9wdXNoIChvcG5kX3N0bXQpOworCSAgICAgIHdvcmtsaXN0LnNh ZmVfcHVzaCAob3BuZF9zdG10KTsKKwkgICAgfQorCX0KKyAgICB9IHdoaWxlICghd29ya2xpc3Qu aXNfZW1wdHkgKCkpOworCisgIC8qIEtlZXAgdGhvc2UgYWRkcmVzcyBjb21wdXRhdGlvbiBzdGF0 ZW1lbnRzIGFzIG9yaWdpbmFsIG9yZGVyLiAgKi8KKyAgZGwtPmFkZHJfc3RtdHMucXNvcnQgKHN0 bXRfdWlkX2NtcCk7CisKKyAgZGVwX2FycmF5LnNhZmVfcHVzaCAoZGwpOworICBnaW1wbGVfc2V0 X3VpZCAoc3RtdCwgZGVwX2FycmF5Lmxlbmd0aCAoKSk7CisgIGdpbXBsZV9zZXRfcGxmIChzdG10 LCBHRl9ERVBfTE9BRCwgdHJ1ZSk7CisKKyAgcGFyZW50LT5jaGlsZHJlbi5zYWZlX3B1c2ggKGRs KTsKK30KKworLyogQnVpbGQgZGVwZW5kZW50IGxvYWQgdHJlZSBmb3IgYWxsIGl0ZXJhdG9ycyBm b3VuZCBpbiBMT09QLiAgQXMgYW4gZXhhbXBsZSwKKyAgIHRoZXJlIGlzIGEgc2VxdWVuY2Ugb2Yg bG9hZHMgZGVyaXZlZCBmcm9tIGFuIGl0ZXJhdG9yLCBhbmQgc3VwcG9zZSAnYXJyYXknCisgICBp cyBhIG1lbW9yeSBiYXNlIGFkZHJlc3MgaW52YXJpYW50IGluIExPT1AuCisKKyAgICAgIHB0cl9h ID0gaXRlcmF0b3ItPmE7CisgICAgICBpZHhfYiA9IHB0cl9hLT5iOworICAgICAgdmFsX2MgPSBw dHJfYS0+b2JqZWN0LmM7CisgICAgICB2YWxfZCA9IGFycmF5W2lkeF9iICogMiArIDFdLmQ7CisK KyAgIFRoZXNlIGxvYWRzIHdpbGwgYmUgaWRlbnRpZmllZCBhcyBub2RlcyBpbiBmb2xsb3dpbmcg ZGVwZW5kZW50IGxvYWQgdHJlZToKKworICAgICAgcm9vdCAoaXRlcmF0b3IpCisJfAorCSctLT4g cHRyX2EgPSBpdGVyYXRvci0+YQorCSAgICAgICB8CisJICAgICAgIHwtLT4gaWR4X2IgPSBwdHJf YS0+YgorCSAgICAgICB8ICAgICAgfAorCSAgICAgICB8ICAgICAgJy0tPiB2YWxfZCA9IGFycmF5 W2lkeF9iICogMiArIDFdLmQKKwkgICAgICAgfAorCSAgICAgICAnLS0+IHZhbF9jID0gcHRyX2Et Pm9iamVjdC5jCisKKyAgIFdlIHdhbGsgYWxsIGJhc2ljIGJsb2NrcyBvZiBMT09QIGluIGRvbWlu YW5jZSBvcmRlciB0byBpbmNyZW1lbnRhbGx5IHJlY29yZAorICAgZGVwZW5kZW5jeSByZWxhdGlv biBmb3IgYWxsIGxvYWRzIGludG8gYSBsaW5lYXIgdmVjdG9yLCBhbmQgYXQgc2FtZSB0aW1lCisg ICBhZGQgZWFjaCBjYW5kaWRhdGUgbG9hZCB0byBjb3JyZXNwb25kaW5nIHRyZWUgYnkgdXNpbmcg aW5mb3JtYXRpb24gaW4gdGhlCisgICB2ZWN0b3IuICAqLworCitzdGF0aWMgdm9pZAorZmluZF9k ZXBfbG9hZHMgKGNvbnN0IGNsYXNzIGxvb3AgKmxvb3ApCit7CisgIGJhc2ljX2Jsb2NrICpib2R5 ID0gZ2V0X2xvb3BfYm9keV9pbl9kb21fb3JkZXIgKGxvb3ApOworICBsb29wX21nb19pbmZvICpt Z29faW5mbyA9IGdldF9tZ29faW5mbyAobG9vcCk7CisgIGxvb3BfaXRlcl9pbmZvICppdGVyX2lu Zm87CisgIGF1dG9fdmVjPGRlcF9sb2FkICo+IGRlcF9hcnJheTsKKworICBmb3IgKHVuc2lnbmVk IGkgPSAwOyBpIDwgbG9vcC0+bnVtX25vZGVzOyBpKyspCisgICAgeworICAgICAgYmFzaWNfYmxv Y2sgYmIgPSBib2R5W2ldOworICAgICAgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgZ3NpOworCisgICAg ICBmb3IgKGdzaSA9IGdzaV9zdGFydF9waGlzIChiYik7ICFnc2lfZW5kX3AgKGdzaSk7IGdzaV9u ZXh0ICgmZ3NpKSkKKwl7CisJICBnaW1wbGVfc2V0X3VpZCAoZ3NpX3N0bXQgKGdzaSksICAwKTsK KwkgIGdpbXBsZV9zZXRfcGxmIChnc2lfc3RtdCAoZ3NpKSwgR0ZfREVQX0xPQUQsIGZhbHNlKTsK KwkgIGdpbXBsZV9zZXRfcGxmIChnc2lfc3RtdCAoZ3NpKSwgR0ZfSU5DTFVERUQsIGZhbHNlKTsK Kwl9CisKKyAgICAgIGlmICghaSkKKwl7CisJICB1bnNpZ25lZCBqOworCisJICAvKiBJdGVyYXRv cnMgc2hvdWxkIGxvY2F0ZSBhdCBsb29wIGhlYWRlci4gICovCisJICBnY2NfY2hlY2tpbmdfYXNz ZXJ0IChiYiA9PSBsb29wLT5oZWFkZXIpOworCisJICAvKiBDcmVhdGUgcm9vdCBvZiBkZXBlbmRl bnQgbG9hZCB0cmVlIGZvciBpdGVyYXRvcnMsIGFzc2lnbiB1aWQgYW5kCisJICAgICBzZXQgZmxh Z3MgZm9yIGRlZmluaXRpb24gc3RhdGVtZW50cy4gICovCisJICBGT1JfRUFDSF9WRUNfRUxUICht Z29faW5mby0+aXRlcnMsIGosIGl0ZXJfaW5mbykKKwkgICAgeworCSAgICAgIGdwaGkgKml0ZXJf cGhpID0gaXRlcl9pbmZvLT5pdGVyX3BoaTsKKworCSAgICAgIGl0ZXJfaW5mby0+ZGVwX2xvYWRf cm9vdCA9IG5ldyBkZXBfbG9hZCAoaXRlcl9waGkpOworCSAgICAgIGRlcF9hcnJheS5zYWZlX3B1 c2ggKGl0ZXJfaW5mby0+ZGVwX2xvYWRfcm9vdCk7CisKKwkgICAgICBnaW1wbGVfc2V0X3VpZCAo aXRlcl9waGksIGRlcF9hcnJheS5sZW5ndGggKCkpOworCSAgICAgIGdpbXBsZV9zZXRfcGxmIChp dGVyX3BoaSwgR0ZfREVQX0xPQUQsIHRydWUpOworCSAgICAgIGdpbXBsZV9zZXRfcGxmIChpdGVy X3BoaSwgR0ZfSU5DTFVERUQsIHRydWUpOworCSAgICB9CisJfQorCisgICAgICBmb3IgKGdzaSA9 IGdzaV9zdGFydF9iYiAoYmIpOyAhZ3NpX2VuZF9wIChnc2kpOyBnc2lfbmV4dCAoJmdzaSkpCisJ YWRkX3RvX2RlcF9sb2FkX3RyZWUgKGxvb3AsIGdzaV9zdG10IChnc2kpLCBkZXBfYXJyYXkpOwor ICAgIH0KKworICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQor ICAgIHsKKyAgICAgIHVuc2lnbmVkIGk7CisKKyAgICAgIEZPUl9FQUNIX1ZFQ19FTFQgKG1nb19p bmZvLT5pdGVycywgaSwgaXRlcl9pbmZvKQorCXsKKwkgIGlmIChpdGVyX2luZm8tPmNsZWFuX3Ry aXZpYWxfZGVwX2xvYWQgKCkpCisJICAgIGNvbnRpbnVlOworCisJICBmcHJpbnRmIChkdW1wX2Zp bGUsICI+IEZvdW5kIGRlcGVuZGVudCBsb2FkcyBpbiBsb29wICVkOlxuIiwKKwkJICAgbG9vcC0+ bnVtKTsKKwkgIGR1bXBfZGVwX2xvYWQgKGl0ZXJfaW5mby0+ZGVwX2xvYWRfcm9vdCk7CisJfQor ICAgIH0KK30KKworc3RhdGljIHZvaWQKK2FuYWx5emVfbWdvX2luX2xvb3AgKGNsYXNzIGxvb3Ag Kmxvb3ApCit7CisgIC8qIEZpbmQgYWxsIHRoZSBpdGVyYXRvcnMgdGhhdCBtYXkgYmUgdXNlZCBp biB0aGUgbG9vcC4gICovCisgIGlmICghZmluZF9pdGVyYXRvcnMgKGxvb3ApKQorICAgIHJldHVy bjsKKworICAvKiBCdWlsZCBkZXBlbmRlbnQgbG9hZCB0cmVlIGZvciBpdGVyYXRvcnMuICAqLwor ICBmaW5kX2RlcF9sb2FkcyAobG9vcCk7CisKKyAgbG9vcF9tZ29faW5mbyAqbWdvX2luZm8gPSBn ZXRfbWdvX2luZm8gKGxvb3ApOworICBsb29wX2l0ZXJfaW5mbyAqaXRlcl9pbmZvOworICB1bnNp Z25lZCBpOworCisgIEZPUl9FQUNIX1ZFQ19FTFQgKG1nb19pbmZvLT5pdGVycywgaSwgaXRlcl9p bmZvKQorICAgIGlmICghaXRlcl9pbmZvLT5wcm9jZXNzX2RlcF9sb2FkICgpKQorICAgICAgewor CWRlbGV0ZSBpdGVyX2luZm87CisJbWdvX2luZm8tPml0ZXJzLnVub3JkZXJlZF9yZW1vdmUgKGkt LSk7CisgICAgICB9CisKKyAgaWYgKG1nb19pbmZvLT5pdGVycy5sZW5ndGggKCkgPCAyKQorICAg IHJldHVybjsKKworICAvKiBTaW5jZSBhbGwgaXRlcmF0b3JzIGFkdmFuY2UgYXQgdGhlIHNhbWUg cGFjZSwgdGhlaXIgZGVwZW5kZW50IGxvYWQgdHJlZXMKKyAgICAgY291bGQgYmUgY29tYmluZWQg dG9nZXRoZXIuIEZvciBleGFtcGxlLAorCisJZm9yIChsaXN0ID0gbGlzdF9oZWFkLCBpID0gMDsg aSA8IG47IGkrKykKKwkgIHsKKwkgICAgLi4uID0gYXJyYXlbaV0tPmE7CisJICAgIC4uLiA9IGxp c3QtPnB0ci0+YjsKKworCSAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKwkgIH0KKworICAgICBTdXBw b3NlICJsaXN0X2hlYWQiIGFuZCAiYXJyYXkiIGFyZSBpbnZhcmlhbnQgbWVtb3J5IGFkZHJlc3Mg aW4KKyAgICAgY2VydGFpbiBvdXRlciBsb29wLCB0aGVuIGJvdGggdHdvIGRlcGVuZGVudCBsb2Fk cyAiYXJyYXlbaV0tPmEiIGFuZAorICAgICAibGlzdC0+cHRyLT5iIiBjb3VsZCBiZSBjYWNoZWQg YnkgbWdvLCB0aG91Z2ggdGhleSBhcmUgZGVyaXZlZCBmcm9tCisgICAgIGRpZmZlcmVudCBpdGVy YXRvcnMuICAqLworICBsb29wX2l0ZXJfaW5mbyAqZmlyc3RfaXRlcl9pbmZvID0gbWdvX2luZm8t Pml0ZXJzWzBdOworCisgIEZPUl9FQUNIX1ZFQ19FTFRfRlJPTSAobWdvX2luZm8tPml0ZXJzLCBp LCBpdGVyX2luZm8sIDEpCisgICAgZmlyc3RfaXRlcl9pbmZvLT5tZXJnZSAoaXRlcl9pbmZvKTsK K30KKworc3RhdGljIGJvb2wKK2FwcGx5X21nb19pbl9sb29wIChsb29wX21nb19pbmZvICptZ29f aW5mbykKK3sKKyAgaWYgKG1nb19pbmZvLT5pdGVycy5pc19lbXB0eSAoKSkKKyAgICByZXR1cm4g ZmFsc2U7CisKKyAgbG9vcF9pdGVyX2luZm8gKml0ZXJfaW5mbyA9IG1nb19pbmZvLT5pdGVyc1sw XTsKKworICBpdGVyX2luZm8tPmluc2VydF9tZ29fY29kZSAoKTsKKyAgbWdvX25hbWVfc3VmZml4 X2lkKys7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2RvX21n byAodm9pZCkKK3sKKyAgY2xhc3MgbG9vcCAqbG9vcDsKKyAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7 CisKKyAgZ2NjX2Fzc2VydCAoc2Nldl9pbml0aWFsaXplZF9wICgpKTsKKworICBGT1JfRUFDSF9M T09QIChsb29wLCAwKQorICAgIGxvb3AtPmF1eCA9IG5ldyBsb29wX21nb19pbmZvIChsb29wKTsK KworICBGT1JfRUFDSF9MT09QIChsb29wLCBMSV9GUk9NX0lOTkVSTU9TVCkKKyAgICB7CisgICAg ICAvKiBJZiBjdXJyZW50IGxvb3AgaXMgbm90IGFuIGlubmVyIGxvb3AsIHRoZSBjYWNoZWQgZGF0 YSB3aWxsIG5vdAorCSBoYXZlIGEgY2hhbmNlIHRvIGJlIHJlbG9hZGVkIHRvIGJyaW5nIGJlbmVm aXQgdGhyb3VnaCBMMSBjYWNoZQorCSBsaW5lIGhhcmR3YXJlIHByZWZldGNoLiAgKi8KKyAgICAg IGlmIChsb29wX2RlcHRoIChsb29wKSA8IDIpCisJY29udGludWU7CisKKyAgICAgIGlmIChvcHRp bWl6ZV9sb29wX2Zvcl9zaXplX3AgKGxvb3ApKQorCWNvbnRpbnVlOworCisgICAgICBhbmFseXpl X21nb19pbl9sb29wIChsb29wKTsKKyAgICB9CisKKyAgRk9SX0VBQ0hfTE9PUCAobG9vcCwgTElf RlJPTV9JTk5FUk1PU1QpCisgICAgeworICAgICAgbG9vcF9tZ29faW5mbyAqbWdvX2luZm8gPSBn ZXRfbWdvX2luZm8gKGxvb3ApOworICAgICAgY2hhbmdlZCB8PSBhcHBseV9tZ29faW5fbG9vcCAo bWdvX2luZm8pOworICAgICAgZGVsZXRlIG1nb19pbmZvOworICAgICAgbG9vcC0+YXV4ID0gTlVM TDsKKyAgICB9CisKKyAgaWYgKGNoYW5nZWQpCisgICAgeworICAgICAgcmV3cml0ZV9pbnRvX2xv b3BfY2xvc2VkX3NzYSAoTlVMTCwgVE9ET191cGRhdGVfc3NhKTsKKyAgICAgIHJldHVybiBUT0RP X2NsZWFudXBfY2ZnOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK25hbWVzcGFjZSB7CisKK2Nv bnN0IHBhc3NfZGF0YSBwYXNzX2RhdGFfbG9vcF9tZ28gPSB7CisgIEdJTVBMRV9QQVNTLAkgICAg LyogdHlwZSAqLworICAibWdvIiwJICAgIC8qIG5hbWUgKi8KKyAgT1BUR1JPVVBfTk9ORSwgICAg Lyogb3B0aW5mb19mbGFncyAqLworICBUVl9MT09QX01HTywJICAgIC8qIHR2X2lkICovCisgIDAs CQkgICAgLyogcHJvcGVydGllc19yZXF1aXJlZCAqLworICAwLAkJICAgIC8qIHByb3BlcnRpZXNf cHJvdmlkZWQgKi8KKyAgMCwJCSAgICAvKiBwcm9wZXJ0aWVzX2Rlc3Ryb3llZCAqLworICAwLAkJ ICAgIC8qIHRvZG9fZmxhZ3Nfc3RhcnQgKi8KKyAgVE9ET19jbGVhbnVwX2NmZywgLyogdG9kb19m bGFnc19maW5pc2ggKi8KK307CisKK2NsYXNzIHBhc3NfbG9vcF9tZ28gOiBwdWJsaWMgZ2ltcGxl X29wdF9wYXNzCit7CitwdWJsaWM6CisgIHBhc3NfbG9vcF9tZ28gKGdjYzo6Y29udGV4dCAqY3R4 dCkKKyAgICA6IGdpbXBsZV9vcHRfcGFzcyAocGFzc19kYXRhX2xvb3BfbWdvLCBjdHh0KQorICB7 fQorCisgIHZpcnR1YWwgYm9vbCBnYXRlIChmdW5jdGlvbiAqKSB7IHJldHVybiBmbGFnX3RyZWVf bG9vcF9tZ287IH0KKyAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZXhlY3V0ZSAoZnVuY3Rpb24gKik7 CisKK307IC8vIGNsYXNzIHBhc3NfbG9vcF9tZ28KKwordW5zaWduZWQgaW50CitwYXNzX2xvb3Bf bWdvOjpleGVjdXRlIChmdW5jdGlvbiAqZnVuKQoreworICBpZiAobnVtYmVyX29mX2xvb3BzIChm dW4pIDw9IDIpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIGRvX21nbyAoKTsKK30KKworfSAv LyBuYW1lc3BhY2UKKworZ2ltcGxlX29wdF9wYXNzICoKK21ha2VfcGFzc19sb29wX21nbyAoZ2Nj Ojpjb250ZXh0ICpjdHh0KQoreworICByZXR1cm4gbmV3IHBhc3NfbG9vcF9tZ28gKGN0eHQpOwor fQotLSAKMi4xNy4xCgo= --_002_MWHPR01MB23046172A3DF0E1886DF1FDBF7B59MWHPR01MB2304prod_--