From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <pmg-devel-bounces@lists.proxmox.com>
Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9])
	by lore.proxmox.com (Postfix) with ESMTPS id BCF641FF183
	for <inbox@lore.proxmox.com>; Fri, 21 Feb 2025 14:44:57 +0100 (CET)
Received: from firstgate.proxmox.com (localhost [127.0.0.1])
	by firstgate.proxmox.com (Proxmox) with ESMTP id CFD602E50;
	Fri, 21 Feb 2025 14:44:55 +0100 (CET)
Message-ID: <f5bc9071-85b9-48d9-933d-2748774748e0@proxmox.com>
Date: Fri, 21 Feb 2025 14:44:20 +0100
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Content-Language: en-US
To: =?UTF-8?Q?Fabian_Gr=C3=BCnbichler?= <f.gruenbichler@proxmox.com>,
 pmg-devel@lists.proxmox.com
References: <20250218161905.17224-1-m.frank@proxmox.com>
 <20250218161905.17224-7-m.frank@proxmox.com>
 <2043234582.10132.1740141683339@webmail.proxmox.com>
From: Markus Frank <m.frank@proxmox.com>
In-Reply-To: <2043234582.10132.1740141683339@webmail.proxmox.com>
X-SPAM-LEVEL: Spam detection results:  0
 AWL -0.166 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DMARC_MISSING             0.1 Missing DMARC policy
 KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment
 POISEN_SPAM_PILL          0.1 Meta: its spam
 POISEN_SPAM_PILL_1        0.1 random spam to be learned in bayes
 POISEN_SPAM_PILL_3        0.1 random spam to be learned in bayes
 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to
 Validity was blocked. See
 https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more
 information.
 RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to
 Validity was blocked. See
 https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more
 information.
 RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to
 Validity was blocked. See
 https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more
 information.
 SPF_HELO_NONE           0.001 SPF: HELO does not publish an SPF Record
 SPF_PASS               -0.001 SPF: sender matches SPF record
 URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See
 http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more
 information. [objectgrouphelpers.pm, tfaconfig.pm, proxmox.com,
 accesscontrol.pm, postfix.pm, realm.pm, quarantine.pm, domain.pm, tfa.pm]
Subject: Re: [pmg-devel] [PATCH pmg-api v5 6/10] api: add/update/remove
 realms like in PVE
X-BeenThere: pmg-devel@lists.proxmox.com
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Proxmox Mail Gateway development discussion
 <pmg-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pmg-devel>, 
 <mailto:pmg-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pmg-devel/>
List-Post: <mailto:pmg-devel@lists.proxmox.com>
List-Help: <mailto:pmg-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel>, 
 <mailto:pmg-devel-request@lists.proxmox.com?subject=subscribe>
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset="utf-8"; Format="flowed"
Errors-To: pmg-devel-bounces@lists.proxmox.com
Sender: "pmg-devel" <pmg-devel-bounces@lists.proxmox.com>

VGhhbmsgeW91IGZvciByZXZpZXdpbmcgdGhpcyBwYXRjaCBzZXJpZXMuCgpPbiAgMjAyNS0wMi0y
MSAxMzo0MSwgRmFiaWFuIEdyw7xuYmljaGxlciB3cm90ZToKPiAKPj4gTWFya3VzIEZyYW5rIDxt
LmZyYW5rQHByb3htb3guY29tPiBoYXQgYW0gMTguMDIuMjAyNSAxNzoxOSBDRVQgZ2VzY2hyaWVi
ZW46Cj4+Cj4+ICAgCj4+IFRoZSBuYW1lIFJlYWxtLnBtIHdhcyBjaG9zZW4gYmVjYXVzZSBhIERv
bWFpbi5wbSBhbHJlYWR5IGV4aXN0cy4KPiAKPiBidXQgdGhlIEFQSSBwYXRoIGlzIHN0aWxsIGRv
bWFpbnMsIGFuZCB0aGUgbmFtaW5nIGluc2lkZSB0aGUgY29kZS9kZXNjcmlwdGlvbnMvLi4gaXMg
YWxzbyByYXRoZXIgaW5jb25zaXN0ZW50LiBzaG91bGQgd2Ugc2V0dGxlIG9uIG9uZSBvciB0aGUg
b3RoZXI/CgpXZSB1c2UgL2FjY2Vzcy9kb21haW4gaW4gUFZFL1BCUyBhbmQgYWxyZWFkeSBhbGxv
dyAvYWNjZXNzL2RvbWFpbnMgaW4gUE1HL0hUVFBTZXJ2ZXIucG06CmBgYAogICAgICAjIGV4cGxp
Y2l0bHkgYWxsb3cgc29tZSBjYWxscyB3aXRob3V0IGF1dGgKICAgICAgaWYgKCgkcmVsX3VyaSBl
cSAnL2FjY2Vzcy9kb21haW5zJyAmJiAkbWV0aG9kIGVxICdHRVQnKSB8fAogICAgICAgICAoJHJl
bF91cmkgZXEgJy9xdWFyYW50aW5lL3NlbmRsaW5rJyAmJiAoJG1ldGhvZCBlcSAnR0VUJyB8fCAk
bWV0aG9kIGVxICdQT1NUJykpIHx8CiAgCSgkcmVsX3VyaSBlcSAnL2FjY2Vzcy90aWNrZXQnICYm
ICgkbWV0aG9kIGVxICdHRVQnIHx8ICRtZXRob2QgZXEgJ1BPU1QnKSkpIHsKYGBgCgpCZWZvcmUg
cmVuYW1pbmcgaXQgdG8gUmVhbG0sIEkgd2FzIHVzaW5nIEF1dGhkb21haW4gYXMgdGhlIGZpbGUv
bW9kdWxlIG5hbWUuCklmIHdlIHdhbnQgdG8gc3RpY2sgdG8gb25lIG5hbWUsIHdlIGVpdGhlciB1
c2UgQXV0aGRvbWFpbnMgKG9yIHNvbWV0aGluZyBzaW1pbGFyKSBhZ2Fpbiwgb3Igd2UgY2hhbmdl
IGV2ZXJ5dGhpbmcgdG8gcmVhbG0gYW5kIHVzZSBhIGRpZmZlcmVudCBhcGkgcGF0aCB0aGFuIFBW
RS9QQlMuCkkgdGhpbmsgSSB3b3VsZCBwcmVmZXIgdXNpbmcgQXV0aGRvbWFpbnMgYW5kIC9hY2Nl
c3MvZG9tYWluLgoKQW55IG9waW5pb25zPwo+IAo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBNYXJrdXMg
RnJhbmsgPG0uZnJhbmtAcHJveG1veC5jb20+Cj4+IC0tLQo+PiAgIHNyYy9NYWtlZmlsZSAgICAg
ICAgICAgICAgICAgIHwgICAxICsKPj4gICBzcmMvUE1HL0FQSTIvQWNjZXNzQ29udHJvbC5wbSB8
ICAxMCArLQo+PiAgIHNyYy9QTUcvQVBJMi9SZWFsbS5wbSAgICAgICAgIHwgMjc0ICsrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrKysKPj4gICAzIGZpbGVzIGNoYW5nZWQsIDI4NCBpbnNl
cnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9QTUcv
QVBJMi9SZWFsbS5wbQo+Pgo+PiBkaWZmIC0tZ2l0IGEvc3JjL01ha2VmaWxlIGIvc3JjL01ha2Vm
aWxlCj4+IGluZGV4IDNjYWU3YzcuLmU5MzliYmQgMTAwNjQ0Cj4+IC0tLSBhL3NyYy9NYWtlZmls
ZQo+PiArKysgYi9zcmMvTWFrZWZpbGUKPj4gQEAgLTE1MSw2ICsxNTEsNyBAQCBMSUJTT1VSQ0VT
ID0JCQkJXAo+PiAgIAlQTUcvQVBJMi9Qb3N0Zml4LnBtCQlcCj4+ICAgCVBNRy9BUEkyL1F1YXJh
bnRpbmUucG0JCVwKPj4gICAJUE1HL0FQSTIvQWNjZXNzQ29udHJvbC5wbQlcCj4+ICsJUE1HL0FQ
STIvUmVhbG0ucG0JCVwKPj4gICAJUE1HL0FQSTIvVEZBLnBtCQkJXAo+PiAgIAlQTUcvQVBJMi9U
RkFDb25maWcucG0JCVwKPj4gICAJUE1HL0FQSTIvT2JqZWN0R3JvdXBIZWxwZXJzLnBtCVwKPj4g
ZGlmZiAtLWdpdCBhL3NyYy9QTUcvQVBJMi9BY2Nlc3NDb250cm9sLnBtIGIvc3JjL1BNRy9BUEky
L0FjY2Vzc0NvbnRyb2wucG0KPj4gaW5kZXggZTI2YWU3MC4uZjRjYmM4MSAxMDA2NDQKPj4gLS0t
IGEvc3JjL1BNRy9BUEkyL0FjY2Vzc0NvbnRyb2wucG0KPj4gKysrIGIvc3JjL1BNRy9BUEkyL0Fj
Y2Vzc0NvbnRyb2wucG0KPj4gQEAgLTEyLDYgKzEyLDcgQEAgdXNlIFBWRTo6SlNPTlNjaGVtYSBx
dyhnZXRfc3RhbmRhcmRfb3B0aW9uKTsKPj4gICB1c2UgUE1HOjpVdGlsczsKPj4gICB1c2UgUE1H
OjpVc2VyQ29uZmlnOwo+PiAgIHVzZSBQTUc6OkFjY2Vzc0NvbnRyb2w7Cj4+ICt1c2UgUE1HOjpB
UEkyOjpSZWFsbTsKPj4gICB1c2UgUE1HOjpBUEkyOjpVc2VyczsKPj4gICB1c2UgUE1HOjpBUEky
OjpURkE7Cj4+ICAgdXNlIFBNRzo6VEZBQ29uZmlnOwo+PiBAQCAtMzAsNiArMzEsMTEgQEAgX19Q
QUNLQUdFX18tPnJlZ2lzdGVyX21ldGhvZCAoewo+PiAgICAgICBwYXRoID0+ICd0ZmEnLAo+PiAg
IH0pOwo+PiAgIAo+PiArX19QQUNLQUdFX18tPnJlZ2lzdGVyX21ldGhvZCAoewo+PiArICAgIHN1
YmNsYXNzID0+ICJQTUc6OkFQSTI6OlJlYWxtIiwKPj4gKyAgICBwYXRoID0+ICdkb21haW5zJywK
PiAKPiByZWFsbSB2cyBkb21haW5zCj4gCj4+ICt9KTsKPj4gKwo+PiAgIF9fUEFDS0FHRV9fLT5y
ZWdpc3Rlcl9tZXRob2QgKHsKPj4gICAgICAgbmFtZSA9PiAnaW5kZXgnLAo+PiAgICAgICBwYXRo
ID0+ICcnLAo+PiBAQCAtNTcsNiArNjMsNyBAQCBfX1BBQ0tBR0VfXy0+cmVnaXN0ZXJfbWV0aG9k
ICh7Cj4+ICAgCj4+ICAgCW15ICRyZXMgPSBbCj4+ICAgCSAgICB7IHN1YmRpciA9PiAndGlja2V0
JyB9LAo+PiArCSAgICB7IHN1YmRpciA9PiAnZG9tYWlucycgfSwKPj4gICAJICAgIHsgc3ViZGly
ID0+ICdwYXNzd29yZCcgfSwKPj4gICAJICAgIHsgc3ViZGlyID0+ICd1c2VycycgfSwKPj4gICAJ
XTsKPj4gQEAgLTI0OCw3ICsyNTUsOCBAQCBfX1BBQ0tBR0VfXy0+cmVnaXN0ZXJfbWV0aG9kICh7
Cj4+ICAgCj4+ICAgCW15ICR1c2VybmFtZSA9ICRwYXJhbS0+e3VzZXJuYW1lfTsKPj4gICAKPj4g
LQlpZiAoJHVzZXJuYW1lICF+IG0vXEAocGFtfHBtZ3xxdWFyYW50aW5lKSQvKSB7Cj4+ICsJbXkg
JHJlYWxtX3JlZ2V4ID0gUE1HOjpVdGlsczo6dmFsaWRfcG1nX3JlYWxtX3JlZ2V4KCk7Cj4+ICsJ
aWYgKCR1c2VybmFtZSAhfiBtL1xAKCR7cmVhbG1fcmVnZXh9KSQvKSB7Cj4+ICAgCSAgICBteSAk
cmVhbG0gPSAkcGFyYW0tPntyZWFsbX0gLy8gJ3F1YXJhbnRpbmUnOwo+PiAgIAkgICAgJHVzZXJu
YW1lIC49ICJcQCRyZWFsbSI7Cj4+ICAgCX0KPj4gZGlmZiAtLWdpdCBhL3NyYy9QTUcvQVBJMi9S
ZWFsbS5wbSBiL3NyYy9QTUcvQVBJMi9SZWFsbS5wbQo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+
PiBpbmRleCAwMDAwMDAwLi5kYTIwNzJhCj4+IC0tLSAvZGV2L251bGwKPj4gKysrIGIvc3JjL1BN
Ry9BUEkyL1JlYWxtLnBtCj4+IEBAIC0wLDAgKzEsMjc0IEBACj4+ICtwYWNrYWdlIFBNRzo6QVBJ
Mjo6UmVhbG07Cj4+ICsKPj4gK3VzZSBzdHJpY3Q7Cj4+ICt1c2Ugd2FybmluZ3M7Cj4+ICsKPj4g
K3VzZSBQVkU6OkV4Y2VwdGlvbiBxdyhyYWlzZV9wYXJhbV9leGMpOwo+PiArdXNlIFBWRTo6SU5v
dGlmeTsKPj4gK3VzZSBQVkU6OkpTT05TY2hlbWEgcXcoZ2V0X3N0YW5kYXJkX29wdGlvbik7Cj4+
ICt1c2UgUFZFOjpSRVNUSGFuZGxlcjsKPj4gK3VzZSBQVkU6OlNhZmVTeXNsb2c7Cj4+ICt1c2Ug
UFZFOjpUb29scyBxdyhleHRyYWN0X3BhcmFtKTsKPj4gKwo+PiArdXNlIFBNRzo6QWNjZXNzQ29u
dHJvbDsKPj4gK3VzZSBQTUc6OkF1dGg6OlBsdWdpbjsKPj4gK3VzZSBQVkU6OlNjaGVtYTo6QXV0
aDsKPj4gKwo+PiArbXkgJGRvbWFpbmNvbmZpZ2ZpbGUgPSAicmVhbG1zLmNmZyI7Cj4+ICsKPj4g
K3VzZSBiYXNlIHF3KFBWRTo6UkVTVEhhbmRsZXIpOwo+PiArCj4+ICtfX1BBQ0tBR0VfXy0+cmVn
aXN0ZXJfbWV0aG9kICh7Cj4+ICsgICAgbmFtZSA9PiAnaW5kZXgnLAo+PiArICAgIHBhdGggPT4g
JycsCj4+ICsgICAgbWV0aG9kID0+ICdHRVQnLAo+PiArICAgIGRlc2NyaXB0aW9uID0+ICJBdXRo
ZW50aWNhdGlvbiBkb21haW4gaW5kZXguIiwKPiAKPiBhbmQgaGVyZSBpdCBpcyBzdGlsbCBhbiBh
dXRoZW50aWNhdGlvbiBkb21haW4gOykKPiAKPj4gKyAgICBwZXJtaXNzaW9ucyA9PiB7Cj4+ICsJ
ZGVzY3JpcHRpb24gPT4gIkFueW9uZSBjYW4gYWNjZXNzIHRoYXQsIGJlY2F1c2Ugd2UgbmVlZCB0
aGF0IGxpc3QgZm9yIHRoZSBsb2dpbiBib3ggKGJlZm9yZSB0aGUgdXNlciBpcyBhdXRoZW50aWNh
dGVkKS4iLAo+PiArCXVzZXIgPT4gJ3dvcmxkJywKPj4gKyAgICB9LAo+PiArICAgIHBhcmFtZXRl
cnMgPT4gewo+PiArCWFkZGl0aW9uYWxQcm9wZXJ0aWVzID0+IDAsCj4+ICsJcHJvcGVydGllcyA9
PiB7fSwKPj4gKyAgICB9LAo+PiArICAgIHJldHVybnMgPT4gewo+PiArCXR5cGUgPT4gJ2FycmF5
JywKPj4gKwlpdGVtcyA9PiB7Cj4+ICsJICAgIHR5cGUgPT4gIm9iamVjdCIsCj4+ICsJICAgIHBy
b3BlcnRpZXMgPT4gewo+PiArCQlyZWFsbSA9PiB7IHR5cGUgPT4gJ3N0cmluZycgfSwKPiAKPiBl
dmVuIHRob3VnaCBpdCByZXR1cm5zIHJlYWxtcwo+IAo+PiArCQl0eXBlID0+IHsgdHlwZSA9PiAn
c3RyaW5nJyB9LAo+PiArCQl0ZmEgPT4gewo+PiArCQkgICAgZGVzY3JpcHRpb24gPT4gIlR3by1m
YWN0b3IgYXV0aGVudGljYXRpb24gcHJvdmlkZXIuIiwKPj4gKwkJICAgIHR5cGUgPT4gJ3N0cmlu
ZycsCj4+ICsJCSAgICBlbnVtID0+IFsgJ3l1YmljbycsICdvYXRoJyBdLAo+PiArCQkgICAgb3B0
aW9uYWwgPT4gMSwKPj4gKwkJfSwKPj4gKwkJY29tbWVudCA9PiB7Cj4+ICsJCSAgICBkZXNjcmlw
dGlvbiA9PiAiQSBjb21tZW50LiBUaGUgR1VJIHVzZSB0aGlzIHRleHQgd2hlbiB5b3Ugc2VsZWN0
IGEgZG9tYWluIChSZWFsbSkgb24gdGhlIGxvZ2luIHdpbmRvdy4iLAo+PiArCQkgICAgdHlwZSA9
PiAnc3RyaW5nJywKPj4gKwkJICAgIG9wdGlvbmFsID0+IDEsCj4+ICsJCX0sCj4+ICsJICAgIH0s
Cj4+ICsJfSwKPj4gKwlsaW5rcyA9PiBbIHsgcmVsID0+ICdjaGlsZCcsIGhyZWYgPT4gIntyZWFs
bX0iIH0gXSwKPj4gKyAgICB9LAo+PiArICAgIGNvZGUgPT4gc3ViIHsKPj4gKwlteSAoJHBhcmFt
KSA9IEBfOwo+PiArCj4+ICsJbXkgJHJlcyA9IFtdOwo+PiArCj4+ICsJbXkgJGNmZyA9IFBWRTo6
SU5vdGlmeTo6cmVhZF9maWxlKCRkb21haW5jb25maWdmaWxlKTsKPj4gKwlteSAkaWRzID0gJGNm
Zy0+e2lkc307Cj4+ICsKPj4gKwlmb3IgbXkgJHJlYWxtIChrZXlzICUkaWRzKSB7Cj4+ICsJICAg
IG15ICRkID0gJGlkcy0+eyRyZWFsbX07Cj4+ICsJICAgIG15ICRlbnRyeSA9IHsgcmVhbG0gPT4g
JHJlYWxtLCB0eXBlID0+ICRkLT57dHlwZX0gfTsKPj4gKwkgICAgJGVudHJ5LT57Y29tbWVudH0g
PSAkZC0+e2NvbW1lbnR9IGlmICRkLT57Y29tbWVudH07Cj4+ICsJICAgICRlbnRyeS0+e2RlZmF1
bHR9ID0gMSBpZiAkZC0+e2RlZmF1bHR9Owo+PiArCSAgICBpZiAoJGQtPnt0ZmF9ICYmIChteSAk
dGZhX2NmZyA9IFBWRTo6U2NoZW1hOjpBdXRoOjpwYXJzZV90ZmFfY29uZmlnKCRkLT57dGZhfSkp
KSB7Cj4+ICsJCSRlbnRyeS0+e3RmYX0gPSAkdGZhX2NmZy0+e3R5cGV9Owo+PiArCSAgICB9Cj4+
ICsJICAgIHB1c2ggQCRyZXMsICRlbnRyeTsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gJHJlczsK
Pj4gKyAgICB9fSk7Cj4+ICsKPj4gK19fUEFDS0FHRV9fLT5yZWdpc3Rlcl9tZXRob2QgKHsKPj4g
KyAgICBuYW1lID0+ICdjcmVhdGUnLAo+PiArICAgIHByb3RlY3RlZCA9PiAxLAo+PiArICAgIHBh
dGggPT4gJycsCj4+ICsgICAgbWV0aG9kID0+ICdQT1NUJywKPj4gKyAgICBwZXJtaXNzaW9ucyA9
PiB7IGNoZWNrID0+IFsgJ2FkbWluJyBdIH0sCj4+ICsgICAgZGVzY3JpcHRpb24gPT4gIkFkZCBh
biBhdXRoZW50aWNhdGlvbiBzZXJ2ZXIuIiwKPj4gKyAgICBwYXJhbWV0ZXJzID0+IFBNRzo6QXV0
aDo6UGx1Z2luLT5jcmVhdGVTY2hlbWEoMCksCj4+ICsgICAgcmV0dXJucyA9PiB7IHR5cGUgPT4g
J251bGwnIH0sCj4+ICsgICAgY29kZSA9PiBzdWIgewo+PiArCW15ICgkcGFyYW0pID0gQF87Cj4+
ICsKPj4gKwkjIGFsd2F5cyBleHRyYWN0LCBhZGQgaXQgd2l0aCBob29rCj4+ICsJbXkgJHBhc3N3
b3JkID0gZXh0cmFjdF9wYXJhbSgkcGFyYW0sICdwYXNzd29yZCcpOwo+PiArCj4+ICsJUE1HOjpB
dXRoOjpQbHVnaW46OmxvY2tfZG9tYWluX2NvbmZpZygKPj4gKwkgICAgc3ViIHsKPj4gKwkJbXkg
JGNmZyA9IFBWRTo6SU5vdGlmeTo6cmVhZF9maWxlKCRkb21haW5jb25maWdmaWxlKTsKPj4gKwkJ
bXkgJGlkcyA9ICRjZmctPntpZHN9Owo+PiArCj4+ICsJCW15ICRyZWFsbSA9IGV4dHJhY3RfcGFy
YW0oJHBhcmFtLCAncmVhbG0nKTsKPj4gKwkJUE1HOjpBdXRoOjpQbHVnaW46OnBtZ192ZXJpZnlf
cmVhbG0oJHJlYWxtKTsKPj4gKwkJbXkgJHR5cGUgPSAkcGFyYW0tPnt0eXBlfTsKPj4gKwkJbXkg
JGNoZWNrX2Nvbm5lY3Rpb24gPSBleHRyYWN0X3BhcmFtKCRwYXJhbSwgJ2NoZWNrLWNvbm5lY3Rp
b24nKTsKPj4gKwo+PiArCQlkaWUgImRvbWFpbiAnJHJlYWxtJyBhbHJlYWR5IGV4aXN0c1xuIgo+
PiArCQkgICAgaWYgJGlkcy0+eyRyZWFsbX07Cj4+ICsKPj4gKwkJZGllICJ1bmFibGUgdG8gdXNl
IHJlc2VydmVkIG5hbWUgJyRyZWFsbSdcbiIKPj4gKwkJICAgIGlmICgkcmVhbG0gZXEgJ3BhbScg
fHwgJHJlYWxtIGVxICdwbWcnKTsKPj4gKwo+PiArCQlkaWUgInVuYWJsZSB0byBjcmVhdGUgYnVp
bHRpbiB0eXBlICckdHlwZSdcbiIKPj4gKwkJICAgIGlmICgkdHlwZSBlcSAncGFtJyB8fCAkdHlw
ZSBlcSAncG1nJyk7Cj4+ICsKPj4gKwkJbXkgJHBsdWdpbiA9IFBNRzo6QXV0aDo6UGx1Z2luLT5s
b29rdXAoJHR5cGUpOwo+PiArCQlteSAkY29uZmlnID0gJHBsdWdpbi0+Y2hlY2tfY29uZmlnKCRy
ZWFsbSwgJHBhcmFtLCAxLCAxKTsKPj4gKwo+PiArCQlpZiAoJGNvbmZpZy0+e2RlZmF1bHR9KSB7
Cj4+ICsJCSAgICBmb3IgbXkgJHIgKGtleXMgJSRpZHMpIHsKPj4gKwkJCWRlbGV0ZSAkaWRzLT57
JHJ9LT57ZGVmYXVsdH07Cj4+ICsJCSAgICB9Cj4+ICsJCX0KPj4gKwo+PiArCQkkaWRzLT57JHJl
YWxtfSA9ICRjb25maWc7Cj4+ICsKPj4gKwkJbXkgJG9wdHMgPSAkcGx1Z2luLT5vcHRpb25zKCk7
Cj4+ICsJCWlmIChkZWZpbmVkKCRwYXNzd29yZCkgJiYgIWRlZmluZWQoJG9wdHMtPntwYXNzd29y
ZH0pKSB7Cj4+ICsJCSAgICAkcGFzc3dvcmQgPSB1bmRlZjsKPj4gKwkJICAgIHdhcm4gImlnbm9y
aW5nIHBhc3N3b3JkIHBhcmFtZXRlciI7Cj4+ICsJCX0KPj4gKwkJJHBsdWdpbi0+b25fYWRkX2hv
b2soJHJlYWxtLCAkY29uZmlnLCBwYXNzd29yZCA9PiAkcGFzc3dvcmQpOwo+PiArCj4+ICsJCVBW
RTo6SU5vdGlmeTo6d3JpdGVfZmlsZSgkZG9tYWluY29uZmlnZmlsZSwgJGNmZyk7Cj4+ICsJICAg
IH0sCj4+ICsJICAgICJhZGQgYXV0aCBzZXJ2ZXIgZmFpbGVkIiwKPj4gKwkpOwo+PiArCXJldHVy
biB1bmRlZjsKPj4gKyAgICB9fSk7Cj4+ICsKPj4gK19fUEFDS0FHRV9fLT5yZWdpc3Rlcl9tZXRo
b2QgKHsKPj4gKyAgICBuYW1lID0+ICd1cGRhdGUnLAo+PiArICAgIHBhdGggPT4gJ3tyZWFsbX0n
LAo+PiArICAgIG1ldGhvZCA9PiAnUFVUJywKPj4gKyAgICBwZXJtaXNzaW9ucyA9PiB7IGNoZWNr
ID0+IFsgJ2FkbWluJyBdIH0sCj4+ICsgICAgZGVzY3JpcHRpb24gPT4gIlVwZGF0ZSBhdXRoZW50
aWNhdGlvbiBzZXJ2ZXIgc2V0dGluZ3MuIiwKPj4gKyAgICBwcm90ZWN0ZWQgPT4gMSwKPj4gKyAg
ICBwYXJhbWV0ZXJzID0+IFBNRzo6QXV0aDo6UGx1Z2luLT51cGRhdGVTY2hlbWEoMCksCj4+ICsg
ICAgcmV0dXJucyA9PiB7IHR5cGUgPT4gJ251bGwnIH0sCj4+ICsgICAgY29kZSA9PiBzdWIgewo+
PiArCW15ICgkcGFyYW0pID0gQF87Cj4+ICsKPj4gKwkjIGFsd2F5cyBleHRyYWN0LCB1cGRhdGUg
aW4gaG9vawo+PiArCW15ICRwYXNzd29yZCA9IGV4dHJhY3RfcGFyYW0oJHBhcmFtLCAncGFzc3dv
cmQnKTsKPj4gKwo+PiArCVBNRzo6QXV0aDo6UGx1Z2luOjpsb2NrX2RvbWFpbl9jb25maWcoCj4+
ICsJICAgIHN1YiB7Cj4+ICsJCW15ICRjZmcgPSBQVkU6OklOb3RpZnk6OnJlYWRfZmlsZSgkZG9t
YWluY29uZmlnZmlsZSk7Cj4+ICsJCW15ICRpZHMgPSAkY2ZnLT57aWRzfTsKPj4gKwo+PiArCQlt
eSAkZGlnZXN0ID0gZXh0cmFjdF9wYXJhbSgkcGFyYW0sICdkaWdlc3QnKTsKPj4gKwkJUFZFOjpT
ZWN0aW9uQ29uZmlnOjphc3NlcnRfaWZfbW9kaWZpZWQoJGNmZywgJGRpZ2VzdCk7Cj4+ICsKPj4g
KwkJbXkgJHJlYWxtID0gZXh0cmFjdF9wYXJhbSgkcGFyYW0sICdyZWFsbScpOwo+PiArCQlteSAk
dHlwZSA9ICRpZHMtPnskcmVhbG19LT57dHlwZX07Cj4+ICsJCW15ICRjaGVja19jb25uZWN0aW9u
ID0gZXh0cmFjdF9wYXJhbSgkcGFyYW0sICdjaGVjay1jb25uZWN0aW9uJyk7Cj4+ICsKPj4gKwkJ
ZGllICJkb21haW4gJyRyZWFsbScgZG9lcyBub3QgZXhpc3RcbiIKPj4gKwkJICAgIGlmICEkaWRz
LT57JHJlYWxtfTsKPj4gKwo+PiArCQlteSAkZGVsZXRlX3N0ciA9IGV4dHJhY3RfcGFyYW0oJHBh
cmFtLCAnZGVsZXRlJyk7Cj4+ICsJCWRpZSAibm8gb3B0aW9ucyBzcGVjaWZpZWRcbiIKPj4gKwkJ
ICAgIGlmICEkZGVsZXRlX3N0ciAmJiAhc2NhbGFyKGtleXMgJSRwYXJhbSkgJiYgIWRlZmluZWQo
JHBhc3N3b3JkKTsKPj4gKwo+PiArCQlteSAkZGVsZXRlX3B3ID0gMDsKPj4gKwkJZm9yIG15ICRv
cHQgKFBWRTo6VG9vbHM6OnNwbGl0X2xpc3QoJGRlbGV0ZV9zdHIpKSB7Cj4+ICsJCSAgICBkZWxl
dGUgJGlkcy0+eyRyZWFsbX0tPnskb3B0fTsKPj4gKwkJICAgICRkZWxldGVfcHcgPSAxIGlmICRv
cHQgZXEgJ3Bhc3N3b3JkJzsKPj4gKwkJfQo+PiArCj4+ICsJCW15ICRwbHVnaW4gPSBQTUc6OkF1
dGg6OlBsdWdpbi0+bG9va3VwKCR0eXBlKTsKPj4gKwkJbXkgJGNvbmZpZyA9ICRwbHVnaW4tPmNo
ZWNrX2NvbmZpZygkcmVhbG0sICRwYXJhbSwgMCwgMSk7Cj4+ICsKPj4gKwkJaWYgKCRjb25maWct
PntkZWZhdWx0fSkgewo+PiArCQkgICAgZm9yIG15ICRyIChrZXlzICUkaWRzKSB7Cj4+ICsJCQlk
ZWxldGUgJGlkcy0+eyRyfS0+e2RlZmF1bHR9Owo+PiArCQkgICAgfQo+PiArCQl9Cj4+ICsKPj4g
KwkJZm9yIG15ICRwIChrZXlzICUkY29uZmlnKSB7Cj4+ICsJCSAgICAkaWRzLT57JHJlYWxtfS0+
eyRwfSA9ICRjb25maWctPnskcH07Cj4+ICsJCX0KPj4gKwo+PiArCQlteSAkb3B0cyA9ICRwbHVn
aW4tPm9wdGlvbnMoKTsKPj4gKwkJaWYgKCRkZWxldGVfcHcgfHwgZGVmaW5lZCgkcGFzc3dvcmQp
KSB7Cj4+ICsJCSAgICAkcGx1Z2luLT5vbl91cGRhdGVfaG9vaygkcmVhbG0sICRjb25maWcsIHBh
c3N3b3JkID0+ICRwYXNzd29yZCk7Cj4+ICsJCX0gZWxzZSB7Cj4+ICsJCSAgICAkcGx1Z2luLT5v
bl91cGRhdGVfaG9vaygkcmVhbG0sICRjb25maWcpOwo+PiArCQl9Cj4+ICsKPj4gKwkJUFZFOjpJ
Tm90aWZ5Ojp3cml0ZV9maWxlKCRkb21haW5jb25maWdmaWxlLCAkY2ZnKTsKPj4gKwkgICAgfSwK
Pj4gKwkgICAgInVwZGF0ZSBhdXRoIHNlcnZlciBmYWlsZWQiCj4+ICsJKTsKPj4gKwlyZXR1cm4g
dW5kZWY7Cj4+ICsgICAgfX0pOwo+PiArCj4+ICsjIGZpeG1lOiByZXR1cm4gZm9ybWF0IQo+PiAr
X19QQUNLQUdFX18tPnJlZ2lzdGVyX21ldGhvZCAoewo+PiArICAgIG5hbWUgPT4gJ3JlYWQnLAo+
PiArICAgIHBhdGggPT4gJ3tyZWFsbX0nLAo+PiArICAgIG1ldGhvZCA9PiAnR0VUJywKPj4gKyAg
ICBkZXNjcmlwdGlvbiA9PiAiR2V0IGF1dGggc2VydmVyIGNvbmZpZ3VyYXRpb24uIiwKPj4gKyAg
ICBwZXJtaXNzaW9ucyA9PiB7IGNoZWNrID0+IFsgJ2FkbWluJywgJ3FtYW5hZ2VyJywgJ2F1ZGl0
JyBdIH0sCj4+ICsgICAgcGFyYW1ldGVycyA9PiB7Cj4+ICsJYWRkaXRpb25hbFByb3BlcnRpZXMg
PT4gMCwKPj4gKwlwcm9wZXJ0aWVzID0+IHsKPj4gKwkgICAgcmVhbG0gPT4gIGdldF9zdGFuZGFy
ZF9vcHRpb24oJ3JlYWxtJyksCj4+ICsJfSwKPj4gKyAgICB9LAo+PiArICAgIHJldHVybnMgPT4g
e30sCj4+ICsgICAgY29kZSA9PiBzdWIgewo+PiArCW15ICgkcGFyYW0pID0gQF87Cj4+ICsKPj4g
KwlteSAkY2ZnID0gUFZFOjpJTm90aWZ5OjpyZWFkX2ZpbGUoJGRvbWFpbmNvbmZpZ2ZpbGUpOwo+
PiArCj4+ICsJbXkgJHJlYWxtID0gJHBhcmFtLT57cmVhbG19Owo+PiArCj4+ICsJbXkgJGRhdGEg
PSAkY2ZnLT57aWRzfS0+eyRyZWFsbX07Cj4+ICsJZGllICJkb21haW4gJyRyZWFsbScgZG9lcyBu
b3QgZXhpc3RcbiIgaWYgISRkYXRhOwo+PiArCj4+ICsJbXkgJHR5cGUgPSAkZGF0YS0+e3R5cGV9
Owo+PiArCj4+ICsJJGRhdGEtPntkaWdlc3R9ID0gJGNmZy0+e2RpZ2VzdH07Cj4+ICsKPj4gKwly
ZXR1cm4gJGRhdGE7Cj4+ICsgICAgfX0pOwo+PiArCj4+ICsKPj4gK19fUEFDS0FHRV9fLT5yZWdp
c3Rlcl9tZXRob2QgKHsKPj4gKyAgICBuYW1lID0+ICdkZWxldGUnLAo+PiArICAgIHBhdGggPT4g
J3tyZWFsbX0nLAo+PiArICAgIG1ldGhvZCA9PiAnREVMRVRFJywKPj4gKyAgICBwZXJtaXNzaW9u
cyA9PiB7IGNoZWNrID0+IFsgJ2FkbWluJyBdIH0sCj4+ICsgICAgZGVzY3JpcHRpb24gPT4gIkRl
bGV0ZSBhbiBhdXRoZW50aWNhdGlvbiBzZXJ2ZXIuIiwKPj4gKyAgICBwcm90ZWN0ZWQgPT4gMSwK
Pj4gKyAgICBwYXJhbWV0ZXJzID0+IHsKPj4gKwlhZGRpdGlvbmFsUHJvcGVydGllcyA9PiAwLAo+
PiArCXByb3BlcnRpZXMgPT4gewo+PiArCSAgICByZWFsbSA9PiAgZ2V0X3N0YW5kYXJkX29wdGlv
bigncmVhbG0nKSwKPj4gKwl9Cj4+ICsgICAgfSwKPj4gKyAgICByZXR1cm5zID0+IHsgdHlwZSA9
PiAnbnVsbCcgfSwKPj4gKyAgICBjb2RlID0+IHN1YiB7Cj4+ICsJbXkgKCRwYXJhbSkgPSBAXzsK
Pj4gKwo+PiArCVBNRzo6QXV0aDo6UGx1Z2luOjpsb2NrX2RvbWFpbl9jb25maWcoCj4+ICsJICAg
IHN1YiB7Cj4+ICsJCW15ICRjZmcgPSBQVkU6OklOb3RpZnk6OnJlYWRfZmlsZSgkZG9tYWluY29u
ZmlnZmlsZSk7Cj4+ICsJCW15ICRpZHMgPSAkY2ZnLT57aWRzfTsKPj4gKwkJbXkgJHJlYWxtID0g
JHBhcmFtLT57cmVhbG19Owo+PiArCj4+ICsJCWRpZSAiYXV0aGVudGljYXRpb24gZG9tYWluICck
cmVhbG0nIGRvZXMgbm90IGV4aXN0XG4iIGlmICEkaWRzLT57JHJlYWxtfTsKPj4gKwo+PiArCQlt
eSAkcGx1Z2luID0gUE1HOjpBdXRoOjpQbHVnaW4tPmxvb2t1cCgkaWRzLT57JHJlYWxtfS0+e3R5
cGV9KTsKPj4gKwo+PiArCQkkcGx1Z2luLT5vbl9kZWxldGVfaG9vaygkcmVhbG0sICRpZHMtPnsk
cmVhbG19KTsKPj4gKwo+PiArCQlkZWxldGUgJGlkcy0+eyRyZWFsbX07Cj4+ICsKPj4gKwkJUFZF
OjpJTm90aWZ5Ojp3cml0ZV9maWxlKCRkb21haW5jb25maWdmaWxlLCAkY2ZnKTsKPj4gKwkgICAg
fSwKPj4gKwkgICAgImRlbGV0ZSBhdXRoIHNlcnZlciBmYWlsZWQiLAo+PiArCSk7Cj4+ICsJcmV0
dXJuIHVuZGVmOwo+PiArICAgIH19KTsKPj4gKwo+PiArMTsKPj4gLS0gCj4+IDIuMzkuNQo+Pgo+
Pgo+Pgo+PiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+
PiBwbWctZGV2ZWwgbWFpbGluZyBsaXN0Cj4+IHBtZy1kZXZlbEBsaXN0cy5wcm94bW94LmNvbQo+
PiBodHRwczovL2xpc3RzLnByb3htb3guY29tL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby9wbWct
ZGV2ZWwKCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K
cG1nLWRldmVsIG1haWxpbmcgbGlzdApwbWctZGV2ZWxAbGlzdHMucHJveG1veC5jb20KaHR0cHM6
Ly9saXN0cy5wcm94bW94LmNvbS9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vcG1nLWRldmVsCg==