Re: Download Dialog
artur <[email protected]> Mon, 05 Apr 2010 17:00:04 +0200
| Newsgroups | gmane.network.freenet.frost.devel |
|---|---|
| Message-ID | <[email protected]> |
This is a multi-part message in MIME format.
--------------020906060900040108030705
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
Hi,
another path,..
Am 05.04.2010 12:06, schrieb artur:
> Hi,
>
> Am 04.04.2010 23:29, schrieb artur:
>> Hi,
>>
>> I found some time to do some more coding,.. here are the results:
>>
>> When adding a new downloads from a post (keys or attachments) a dialog
>> will open, where the items can be attributed (currently download dir and
>> priority). This dialog also states if the file has already been
>> downloaded (download tracking) or if a file with the same name already
>> exists in the download target directory.
>>
>> This patch also enables the tracking from which post / board a download
>> was originated. Combined with a new setting (when enabled) the download
>> directory will default to a subdirectory of the default download
>> directory with the board name. If the target download directory does not
>> already exist, it will be created.
>>
>>
>> I attach the langres.properties file, too, because it is not part of the
>> patch.
>> (Can someone remove the octetstream property of this file? Since it is
>> no longer needed for svn...)
>>
>> The patch is against the new trunk...
>>
>
> I have added 3 Buttons to the Dialog, to easy remove all item from the
> list that:
> - Match already downloaded files by Key
> - Match already downloaded files by Name
> - A File already exist in the target dir with the same name.
>
New patch includes a new dialog to manage the tracked downloads.
You can reach it under the options menu. There you can add and remove
keys from the track download storage.
Cheers
artur
--------------020906060900040108030705
Content-Type: text/plain;
name="DownloadDialog.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="DownloadDialog.patch"
SW5kZXg6IHNvdXJjZS9mcm9zdC9maWxlVHJhbnNmZXIvZG93bmxvYWQvRG93bmxvYWRNYW5h
Z2VyLmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzb3VyY2UvZnJvc3QvZmlsZVRyYW5zZmVy
L2Rvd25sb2FkL0Rvd25sb2FkTWFuYWdlci5qYXZhCShyZXZpc2lvbiAzMTkyKQ0KKysrIHNv
dXJjZS9mcm9zdC9maWxlVHJhbnNmZXIvZG93bmxvYWQvRG93bmxvYWRNYW5hZ2VyLmphdmEJ
KHdvcmtpbmcgY29weSkNCkBAIC00NDEsNyArNDQxLDcgQEANCiAgICAgICAgICAgICBpZigg
Q29yZS5mcm9zdFNldHRpbmdzLmdldEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNzLlRSQUNLX0RP
V05MT0FEU19FTkFCTEVEKSAmJiAhZG93bmxvYWRJdGVtLmlzVHJhY2tlZCgpICkgewogICAg
ICAgICAgICAgICAgIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSB0cmFja0Rvd25sb2FkS2V5
c1N0b3JhZ2UgPSBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UuaW5zdCgpOwogICAgICAgICAg
ICAgICAgIHRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5zdG9yZUl0ZW0oIAotICAgICAgICAg
ICAgICAgICAgICBuZXcgVHJhY2tEb3dubG9hZEtleXMoIGRvd25sb2FkSXRlbS5nZXRLZXko
KSwgZG93bmxvYWRJdGVtLmdldEZpbGVuYW1lKCksICIiLCBkb3dubG9hZEl0ZW0uZ2V0Rmls
ZVNpemUoKSwgZG93bmxvYWRJdGVtLmdldERvd25sb2FkRmluaXNoZWRNaWxsaXMoKSApCisg
ICAgICAgICAgICAgICAgICAgIG5ldyBUcmFja0Rvd25sb2FkS2V5cyggZG93bmxvYWRJdGVt
LmdldEtleSgpLCBkb3dubG9hZEl0ZW0uZ2V0RmlsZW5hbWUoKSwgZG93bmxvYWRJdGVtLmdl
dEFzc29jaWF0ZWRCb2FyZE5hbWUoKSwgZG93bmxvYWRJdGVtLmdldEZpbGVTaXplKCksIGRv
d25sb2FkSXRlbS5nZXREb3dubG9hZEZpbmlzaGVkTWlsbGlzKCkgKQogICAgICAgICAgICAg
ICAgICk7CiAgICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldFRyYWNrZWQodHJ1ZSk7
CiAgICAgICAgICAgICB9CkluZGV4OiBzb3VyY2UvZnJvc3QvZmlsZVRyYW5zZmVyL2Rvd25s
b2FkL0Rvd25sb2FkTW9kZWwuamF2YQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIHNvdXJjZS9mcm9z
dC9maWxlVHJhbnNmZXIvZG93bmxvYWQvRG93bmxvYWRNb2RlbC5qYXZhCShyZXZpc2lvbiAz
MTkyKQ0KKysrIHNvdXJjZS9mcm9zdC9maWxlVHJhbnNmZXIvZG93bmxvYWQvRG93bmxvYWRN
b2RlbC5qYXZhCSh3b3JraW5nIGNvcHkpDQpAQCAtNTcsNyArNTcsNyBAQA0KICAgICAgICAg
CS8vIE9ubHkgY2hlY2sgaWYgdGhlIGZpbGUgaXMgbm90IGxpbmdlcmluZyBhcm91bmQgaW4g
ZmluaXNoZWQgc3RhdGUuLi4KICAgICAgICAgCWlmKCAhIGl0ZW1Ub0FkZC5pc1RyYWNrZWQo
KSApewogCSAgICAgICAgICAgIGZpbmFsIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSB0cmFj
a0Rvd25sb2FkS2V5c1N0b3JhZ2UgPSBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UuaW5zdCgp
OwotCSAgICAgICAgICAgIGlmKCB0cmFja0Rvd25sb2FkS2V5c1N0b3JhZ2Uuc2VhcmNoSXRl
bSggaXRlbVRvQWRkLmdldEtleSgpICkgKSB7CisJICAgICAgICAgICAgaWYoIHRyYWNrRG93
bmxvYWRLZXlzU3RvcmFnZS5zZWFyY2hJdGVtS2V5KCBpdGVtVG9BZGQuZ2V0S2V5KCkgKSAp
IHsKIAkgICAgICAgICAgICAJZmluYWwgTGFuZ3VhZ2UgbGFuZ3VhZ2UgPSBMYW5ndWFnZS5n
ZXRJbnN0YW5jZSgpOwogCiAJICAgICAgICAgICAgCS8vIEFzayBpZiB0byBkb3dubG9hZCBh
Z2FpbgpAQCAtNzMsNDggKzczLDQ4IEBADQogICAgICAgICB9CiAKICAgICAgICAgZm9yIChp
bnQgeCA9IDA7IHggPCBnZXRJdGVtQ291bnQoKTsgeCsrKSB7Ci0JCQlmaW5hbCBGcm9zdERv
d25sb2FkSXRlbSBpdGVtID0gKEZyb3N0RG93bmxvYWRJdGVtKSBnZXRJdGVtQXQoeCk7Ci0g
ICAgICAgICAgICBmaW5hbCBGcm9zdEZpbGVMaXN0RmlsZU9iamVjdCBmbGYgPSBpdGVtLmdl
dEZpbGVMaXN0RmlsZU9iamVjdCgpOyAvLyBtYXliZSBudWxsIG9mIG1hbnVhbGx5IGFkZGVk
CisgICAgICAgIAlmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVtID0gKEZyb3N0RG93bmxv
YWRJdGVtKSBnZXRJdGVtQXQoeCk7CisgICAgICAgIAlmaW5hbCBGcm9zdEZpbGVMaXN0Rmls
ZU9iamVjdCBmbGYgPSBpdGVtLmdldEZpbGVMaXN0RmlsZU9iamVjdCgpOyAvLyBtYXliZSBu
dWxsIG9mIG1hbnVhbGx5IGFkZGVkCiAKLSAgICAgICAgICAgIGlmKCBmbGZUb0FkZCAhPSBu
dWxsICYmIGZsZiAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIGlmKCBmbGZUb0FkZC5n
ZXRTaGEoKS5lcXVhbHMoZmxmLmdldFNoYSgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAg
Ly8gYWxyZWFkeSBpbiBtb2RlbCAoY29tcGFyZWQgYnkgU0hBKQotICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQor
ICAgICAgICAJaWYoIGZsZlRvQWRkICE9IG51bGwgJiYgZmxmICE9IG51bGwgKSB7CisgICAg
ICAgIAkJaWYoIGZsZlRvQWRkLmdldFNoYSgpLmVxdWFscyhmbGYuZ2V0U2hhKCkpICkgewor
ICAgICAgICAJCQkvLyBhbHJlYWR5IGluIG1vZGVsIChjb21wYXJlZCBieSBTSEEpCisgICAg
ICAgIAkJCXJldHVybiBmYWxzZTsKKyAgICAgICAgCQl9CisgICAgICAgIAl9CiAKLSAgICAg
ICAgICAgIC8vIEZJWE1FOiAwLjc6IGlmIHdlIGFkZCBhIG5ldyB1cmkgY2hrL25hbWUgYWxz
byBjaGVjayBpZiB3ZSBhbHJlYWR5IGRvd25sb2FkIGNoayEKLSAgICAgICAgICAgIC8vIFBy
b2JsZW06IHdoYXQgaWYgQ0hLIGlzIHdyb25nLCB0aGVuIHdlIGhhdmUgdG8gYWRkIGNoay9u
YW1lLiBCdXQgaW4gdGhlIHJldmVyc2UgY2FzZQotICAgICAgICAgICAgLy8gICAgICAgICAg
d2UgYWRkIGNoay9uYW1lIGFuZCBuYW1lIGdldHMgc3RyaXBwZWQgYmVjYXVzZSBub2RlIHJl
cG9ydHMgcmM9MTEsIHRoZW4gd2UgaGF2ZSAyIHdpdGggc2FtZQotICAgICAgICAgICAgLy8g
ICAgICAgICAgY2hrISA9PT4gaWYgbm9kZSByZXBvcnRzIDExIHRoZW4gY2hlY2sgaWYgd2Ug
aGF2ZSBhbHJlYWR5IHNhbWUgcGxhaW4gY2hrLgorICAgICAgICAJLy8gRklYTUU6IDAuNzog
aWYgd2UgYWRkIGEgbmV3IHVyaSBjaGsvbmFtZSBhbHNvIGNoZWNrIGlmIHdlIGFscmVhZHkg
ZG93bmxvYWQgY2hrIQorICAgICAgICAJLy8gUHJvYmxlbTogd2hhdCBpZiBDSEsgaXMgd3Jv
bmcsIHRoZW4gd2UgaGF2ZSB0byBhZGQgY2hrL25hbWUuIEJ1dCBpbiB0aGUgcmV2ZXJzZSBj
YXNlCisgICAgICAgIAkvLyAgICAgICAgICB3ZSBhZGQgY2hrL25hbWUgYW5kIG5hbWUgZ2V0
cyBzdHJpcHBlZCBiZWNhdXNlIG5vZGUgcmVwb3J0cyByYz0xMSwgdGhlbiB3ZSBoYXZlIDIg
d2l0aCBzYW1lCisgICAgICAgIAkvLyAgICAgICAgICBjaGshID09PiBpZiBub2RlIHJlcG9y
dHMgMTEgdGhlbiBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgc2FtZSBwbGFpbiBjaGsuCiAK
LQkJCWlmIChpdGVtVG9BZGQuZ2V0S2V5KCkgIT0gbnVsbAotCQkJCSYmIGl0ZW0uZ2V0S2V5
KCkgIT0gbnVsbAotCQkJCSYmIGl0ZW0uZ2V0S2V5KCkuZXF1YWxzKGl0ZW1Ub0FkZC5nZXRL
ZXkoKSkpCi0gICAgICAgICAgICB7Ci0JCQkJLy8gYWxyZWFkeSBpbiBtb2RlbCAoY29tcGFy
ZWQgYnkga2V5KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KKyAgICAgICAgCWlmIChpdGVt
VG9BZGQuZ2V0S2V5KCkgIT0gbnVsbAorICAgICAgICAJCQkmJiBpdGVtLmdldEtleSgpICE9
IG51bGwKKyAgICAgICAgCQkJJiYgaXRlbS5nZXRLZXkoKS5lcXVhbHMoaXRlbVRvQWRkLmdl
dEtleSgpKSkKKyAgICAgICAgCXsKKyAgICAgICAgCQkvLyBhbHJlYWR5IGluIG1vZGVsIChj
b21wYXJlZCBieSBrZXkpCisgICAgICAgIAkJcmV0dXJuIGZhbHNlOworICAgICAgICAJfQog
Ci0gICAgICAgICAgICAvLyBGSVhNRTogYWxzbyBjaGVjayBkb3dubG9hZGRpciBmb3Igc2Ft
ZSBmaWxlbmFtZSBhbmQgYnVpbGQgbmV3IG5hbWUKLSAgICAgICAgICAgIGlmIChpdGVtLmdl
dEZpbGVuYW1lKCkuZXF1YWxzKGl0ZW1Ub0FkZC5nZXRGaWxlbmFtZSgpKSkgewotCQkJCS8v
IHNhbWUgbmFtZSwgYnV0IGRpZmZlcmVudCBrZXkuIC0gcmVuYW1lIHF1aXRlbHkKLQkJCQlp
bnQgY250ID0gMjsKLQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQlmaW5hbCBTdHJpbmcgbmV4
dE5ld05hbWUgPSBpdGVtVG9BZGQuZ2V0RmlsZW5hbWUoKSArICJfIiArIGNudDsKLQkJCQkJ
aXRlbVRvQWRkLnNldEZpbGVOYW1lKG5leHROZXdOYW1lKTsKLQkJCQkJaWYgKGFkZERvd25s
b2FkSXRlbShpdGVtVG9BZGQpID09IHRydWUpIHsKLQkJCQkJCS8vIGFkZGVkIHRvIG1vZGVs
Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQljbnQrKzsKLQkJCQl9Ci0JCQkJ
Ly8gd2Ugc2hvdWxkIG5ldmVyIGNvbWUgaGVyZQotCQkJfQotCQl9Ci0JCS8vIG5vdCBpbiBt
b2RlbCwgYWRkCi0JCWFkZEl0ZW0oaXRlbVRvQWRkKTsKLQkJcmV0dXJuIHRydWU7CisgICAg
ICAgIAkvLyBGSVhNRTogYWxzbyBjaGVjayBkb3dubG9hZGRpciBmb3Igc2FtZSBmaWxlbmFt
ZSBhbmQgYnVpbGQgbmV3IG5hbWUKKyAgICAgICAgCWlmIChpdGVtLmdldEZpbGVuYW1lKCku
ZXF1YWxzKGl0ZW1Ub0FkZC5nZXRGaWxlbmFtZSgpKSkgeworICAgICAgICAJCS8vIHNhbWUg
bmFtZSwgYnV0IGRpZmZlcmVudCBrZXkuIC0gcmVuYW1lIHF1aXRlbHkKKyAgICAgICAgCQlp
bnQgY250ID0gMjsKKyAgICAgICAgCQl3aGlsZSAodHJ1ZSkgeworICAgICAgICAJCQlmaW5h
bCBTdHJpbmcgbmV4dE5ld05hbWUgPSBpdGVtVG9BZGQuZ2V0RmlsZW5hbWUoKSArICJfIiAr
IGNudDsKKyAgICAgICAgCQkJaXRlbVRvQWRkLnNldEZpbGVOYW1lKG5leHROZXdOYW1lKTsK
KyAgICAgICAgCQkJaWYgKGFkZERvd25sb2FkSXRlbShpdGVtVG9BZGQpID09IHRydWUpIHsK
KyAgICAgICAgCQkJCS8vIGFkZGVkIHRvIG1vZGVsCisgICAgICAgIAkJCQlyZXR1cm4gdHJ1
ZTsKKyAgICAgICAgCQkJfQorICAgICAgICAJCQljbnQrKzsKKyAgICAgICAgCQl9CisgICAg
ICAgIAkJLy8gd2Ugc2hvdWxkIG5ldmVyIGNvbWUgaGVyZQorICAgICAgICAJfQorICAgICAg
ICB9CisgICAgICAgIC8vIG5vdCBpbiBtb2RlbCwgYWRkCisgICAgICAgIGFkZEl0ZW0oaXRl
bVRvQWRkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAJfQogCiAgICAgcHVibGljIHZvaWQg
YWRkRXh0ZXJuYWxJdGVtKGZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGkpIHsKSW5kZXg6IHNv
dXJjZS9mcm9zdC9maWxlVHJhbnNmZXIvZG93bmxvYWQvRnJvc3REb3dubG9hZEl0ZW0uamF2
YQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQ0KLS0tIHNvdXJjZS9mcm9zdC9maWxlVHJhbnNmZXIvZG93bmxv
YWQvRnJvc3REb3dubG9hZEl0ZW0uamF2YQkocmV2aXNpb24gMzE5MikNCisrKyBzb3VyY2Uv
ZnJvc3QvZmlsZVRyYW5zZmVyL2Rvd25sb2FkL0Zyb3N0RG93bmxvYWRJdGVtLmphdmEJKHdv
cmtpbmcgY29weSkNCkBAIC0zNDEsOCArMzQxLDEzIEBADQogICAgICAgICByZXR1cm4gZG93
bmxvYWREaXI7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0RG93bmxvYWREaXIoZmlu
YWwgU3RyaW5nIGRpcikgewotICAgIAlkb3dubG9hZERpciA9IEZpbGVBY2Nlc3MuYXBwZW5k
U2VwYXJhdG9yKGRpcik7CisgICAgcHVibGljIGJvb2xlYW4gc2V0RG93bmxvYWREaXIoZmlu
YWwgU3RyaW5nIGRpcikgeworICAgIAlTdHJpbmcgZGlyTmFtZSA9IEZpbGVBY2Nlc3MuYXBw
ZW5kU2VwYXJhdG9yKGRpcik7CisgICAgCWlmKCBGaWxlQWNjZXNzLmNyZWF0ZURpcihuZXcg
amF2YS5pby5GaWxlKGRpck5hbWUpKSApIHsKKyAgICAJCWRvd25sb2FkRGlyID0gZGlyTmFt
ZTsKKyAgICAJCXJldHVybiB0cnVlOworICAgIAl9CisgICAgCXJldHVybiBmYWxzZTsKICAg
ICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZVByZWZpeChmaW5hbCBTdHJpbmcg
bmV3UHJlZml4KSB7CkluZGV4OiBzb3VyY2UvZnJvc3QvZ3VpL0FkZE5ld0Rvd25sb2Fkc0Rp
YWxvZy5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc291cmNlL2Zyb3N0L2d1aS9BZGROZXdE
b3dubG9hZHNEaWFsb2cuamF2YQkocmV2aXNpb24gMCkNCisrKyBzb3VyY2UvZnJvc3QvZ3Vp
L0FkZE5ld0Rvd25sb2Fkc0RpYWxvZy5qYXZhCShyZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSw0
MDUgQEANCisvKgorICBBZGROZXdEb3dubG9hZHNEaWFsb2cuamF2YSAvIEZyb3N0CisgIENv
cHlyaWdodCAoQykgMjAxMCAgRnJvc3QgUHJvamVjdCA8anRjZnJvc3Quc291cmNlZm9yZ2Uu
bmV0PgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBw
cm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggdGhp
cyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5k
YXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgor
Ki8KK3BhY2thZ2UgZnJvc3QuZ3VpOworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0
OworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5B
Y3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OworaW1wb3J0
IGphdmEuYXd0LmV2ZW50Lk1vdXNlTGlzdGVuZXI7CitpbXBvcnQgamF2YS51dGlsLkxpbmtl
ZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zd2luZy5C
b3JkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnN3aW5nLkJveDsKK2ltcG9ydCBqYXZheC5z
d2luZy5Cb3hMYXlvdXQ7CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBq
YXZheC5zd2luZy5KRmlsZUNob29zZXI7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwor
aW1wb3J0IGphdmF4LnN3aW5nLkpNZW51OworaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51SXRl
bTsKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlNj
cm9sbFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsOworaW1w
b3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKKworaW1wb3J0IGZyb3N0LkNvcmU7
CitpbXBvcnQgZnJvc3QuU2V0dGluZ3NDbGFzczsKK2ltcG9ydCBmcm9zdC5maWxlVHJhbnNm
ZXIuZG93bmxvYWQuRnJvc3REb3dubG9hZEl0ZW07CitpbXBvcnQgZnJvc3QuZ3VpLm1vZGVs
LkFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWw7CitpbXBvcnQgZnJvc3QuZ3VpLm1vZGVsLlRh
YmxlTWVtYmVyOworaW1wb3J0IGZyb3N0LnN0b3JhZ2UucGVyc3QuVHJhY2tEb3dubG9hZEtl
eXNTdG9yYWdlOworaW1wb3J0IGZyb3N0LnV0aWwuZ3VpLkpTa2lubmFibGVQb3B1cE1lbnU7
CitpbXBvcnQgZnJvc3QudXRpbC5ndWkudHJhbnNsYXRpb24uTGFuZ3VhZ2U7CisKK3B1Ymxp
YyBjbGFzcyBBZGROZXdEb3dubG9hZHNEaWFsb2cgZXh0ZW5kcyBqYXZheC5zd2luZy5KRGlh
bG9nIHsKKworCXByaXZhdGUgZmluYWwgTGFuZ3VhZ2UgbGFuZ3VhZ2U7CisJcHJpdmF0ZSBm
aW5hbCBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UgdHJhY2tEb3dubG9hZEtleXNTdG9yYWdl
OworCisJcHJpdmF0ZSBBZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsIGFkZE5ld0Rvd25sb2Fk
c1RhYmxlTW9kZWw7CisJcHJpdmF0ZSBTb3J0ZWRUYWJsZSBhZGROZXdEb3dubG9hZHNUYWJs
ZTsKKwlwcml2YXRlIEpCdXR0b24gcmVtb3ZlQWxyZWFkeURvd25sb2FkZWRCdXR0b247CisJ
cHJpdmF0ZSBKQnV0dG9uIHJlbW92ZUFscmVhZHlFeGlzdHNCdXR0b247CisJcHJpdmF0ZSBK
QnV0dG9uIG9rQnV0dG9uOworCXByaXZhdGUgSkJ1dHRvbiBjYW5jZWxCdXR0b247CisJcHJp
dmF0ZSBKU2tpbm5hYmxlUG9wdXBNZW51IHRhYmxlUG9wdXBNZW51OworCQorCXByaXZhdGUg
Ym9vbGVhbiBhZGREb3dubG9hZHM7IAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBz
ZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwlwdWJsaWMgQWRkTmV3RG93bmxvYWRzRGlhbG9n
KEpGcmFtZSBmcmFtZSwgTGlzdDxGcm9zdERvd25sb2FkSXRlbT4gZnJvc3REb3dubG9hZEl0
ZW1MaXN0KSB7CisJCXN1cGVyKGZyYW1lKTsKKwkJc2V0TW9kYWwodHJ1ZSk7CisJCWFkZERv
d25sb2FkcyA9IGZhbHNlOworCQlsYW5ndWFnZSA9IExhbmd1YWdlLmdldEluc3RhbmNlKCk7
CisJCXRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSA9IFRyYWNrRG93bmxvYWRLZXlzU3RvcmFn
ZS5pbnN0KCk7CisJCQorCQlzZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3Rh
bnRzLkRJU1BPU0VfT05fQ0xPU0UpOworCisJCWluaXRHVUkoKTsKKwl9CisJCisJcHJpdmF0
ZSB2b2lkIGluaXRHVUkoKSB7CisJCXRyeSB7CisJCQlzZXRUaXRsZShsYW5ndWFnZS5nZXRT
dHJpbmcoIkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy50aXRsZSIpKTsKKwkJCXNldFNpemUoODAw
LCA1MDApOworCQkJdGhpcy5zZXRSZXNpemFibGUodHJ1ZSk7CisKKwkJCS8vIFJlbW92ZSBh
bHJlYWR5IERvd25sb2FkZWQgQnV0dG9uCisJCQlyZW1vdmVBbHJlYWR5RG93bmxvYWRlZEJ1
dHRvbiA9IG5ldyBKQnV0dG9uKGxhbmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRz
RGlhbG9nLmJ1dHRvbi5yZW1vdmVBbHJlYWR5RG93bmxvYWRlZEJ1dHRvbiIpKTsKKwkJCXJl
bW92ZUFscmVhZHlEb3dubG9hZGVkQnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdlLmdl
dFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLmJ1dHRvblRvb2x0aXAucmVtb3ZlQWxy
ZWFkeURvd25sb2FkZWRCdXR0b24iKSk7CisJCQlyZW1vdmVBbHJlYWR5RG93bmxvYWRlZEJ1
dHRvbi5hZGRBY3Rpb25MaXN0ZW5lciggbmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3Rl
bmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25F
dmVudCBlKSB7CisJCQkJCXJlbW92ZUFscmVhZHlEb3dubG9hZGVkQnV0dG9uX2FjdGlvblBl
cmZvcm1lZChlKTsKKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJLy8gUmVtb3ZlIGFscmVhZHkg
ZXhpc3RzIEJ1dHRvbgorCQkJcmVtb3ZlQWxyZWFkeUV4aXN0c0J1dHRvbiA9IG5ldyBKQnV0
dG9uKGxhbmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLmJ1dHRvbi5y
ZW1vdmVBbHJlYWR5RXhpc3RzQnV0dG9uIikpOworCQkJcmVtb3ZlQWxyZWFkeUV4aXN0c0J1
dHRvbi5zZXRUb29sVGlwVGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5ld0Rvd25sb2Fk
c0RpYWxvZy5idXR0b25Ub29sdGlwLnJlbW92ZUFscmVhZHlFeGlzdHNCdXR0b24iKSk7CisJ
CQlyZW1vdmVBbHJlYWR5RXhpc3RzQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKCBuZXcgamF2
YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgYWN0aW9u
UGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsKKwkJCQkJcmVtb3ZlQWxyZWFkeUV4
aXN0c0J1dHRvbl9hY3Rpb25QZXJmb3JtZWQoZSk7CisJCQkJfSAKKwkJCX0pOworCQkJCisJ
CQkvLyBPSyBCdXR0b24KKwkJCW9rQnV0dG9uID0gbmV3IEpCdXR0b24obGFuZ3VhZ2UuZ2V0
U3RyaW5nKCJDb21tb24ub2siKSk7CisJCQlva0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcigg
bmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lk
IGFjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7CisJCQkJCWFkZERvd25s
b2FkcyA9IHRydWU7CisJCQkJCWRpc3Bvc2UoKTsKKwkJCQl9IAorCQkJfSk7CisJCQkKKwkJ
CS8vIENhbmNlbCBCdXR0b24KKwkJCWNhbmNlbEJ1dHRvbiA9IG5ldyBKQnV0dG9uKGxhbmd1
YWdlLmdldFN0cmluZygiQ29tbW9uLmNhbmNlbCIpKTsKKwkJCWNhbmNlbEJ1dHRvbi5hZGRB
Y3Rpb25MaXN0ZW5lciggbmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgewor
CQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7
CisJCQkJCWFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuY2xlYXJEYXRhTW9kZWwoKTsKKwkJ
CQkJZGlzcG9zZSgpOworCQkJCX0gCisJCQl9KTsKKworCQkJLy8gQnV0dG9uIHJvdworCQkJ
ZmluYWwgSlBhbmVsIGJ1dHRvbnNQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91
dCgpKTsKKwkJCWJ1dHRvbnNQYW5lbC5zZXRMYXlvdXQoIG5ldyBCb3hMYXlvdXQoIGJ1dHRv
bnNQYW5lbCwgQm94TGF5b3V0LlhfQVhJUyApKTsKKworCQkJYnV0dG9uc1BhbmVsLmFkZCgg
cmVtb3ZlQWxyZWFkeURvd25sb2FkZWRCdXR0b24gKTsKKwkJCWJ1dHRvbnNQYW5lbC5hZGQo
Qm94LmNyZWF0ZVJpZ2lkQXJlYShuZXcgRGltZW5zaW9uKDEwLDMpKSk7CisJCQlidXR0b25z
UGFuZWwuYWRkKCByZW1vdmVBbHJlYWR5RXhpc3RzQnV0dG9uICk7CisJCQlidXR0b25zUGFu
ZWwuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVuc2lvbigxMCwzKSkpOworCisJ
CQlidXR0b25zUGFuZWwuYWRkKCBCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSApOworCisJ
CQlidXR0b25zUGFuZWwuYWRkKCBjYW5jZWxCdXR0b24gKTsKKwkJCWJ1dHRvbnNQYW5lbC5h
ZGQoQm94LmNyZWF0ZVJpZ2lkQXJlYShuZXcgRGltZW5zaW9uKDEwLDMpKSk7CisJCQlidXR0
b25zUGFuZWwuYWRkKCBva0J1dHRvbiApOworCQkJYnV0dG9uc1BhbmVsLnNldEJvcmRlcihC
b3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDEwLDAsMCwwKSk7CisKKwkJCS8vIERv
d25sb2FkIFRhYmxlCisJCQlhZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsID0gbmV3IEFkZE5l
d0Rvd25sb2Fkc1RhYmxlTW9kZWwoKTsKKwkJCWFkZE5ld0Rvd25sb2Fkc1RhYmxlID0gbmV3
IFNvcnRlZFRhYmxlKCBhZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsICk7CisJCQlhZGROZXdE
b3dubG9hZHNUYWJsZS5zZXRSb3dTZWxlY3Rpb25BbGxvd2VkKHRydWUpOworCQkJYWRkTmV3
RG93bmxvYWRzVGFibGUuc2V0U2VsZWN0aW9uTW9kZSggTGlzdFNlbGVjdGlvbk1vZGVsLk1V
TFRJUExFX0lOVEVSVkFMX1NFTEVDVElPTiApOworCQkJYWRkTmV3RG93bmxvYWRzVGFibGUu
c2V0Um93SGVpZ2h0KDE4KTsKKwkJCWZpbmFsIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSBu
ZXcgSlNjcm9sbFBhbmUoYWRkTmV3RG93bmxvYWRzVGFibGUpOworCQkJc2Nyb2xsUGFuZS5z
ZXRXaGVlbFNjcm9sbGluZ0VuYWJsZWQodHJ1ZSk7CisKKwkJCS8vIG1haW4gcGFuZWwKKwkJ
CWZpbmFsIEpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQo
KSk7CisJCQltYWluUGFuZWwuYWRkKCBzY3JvbGxQYW5lLCBCb3JkZXJMYXlvdXQuQ0VOVEVS
ICk7CisJCQltYWluUGFuZWwuYWRkKCBidXR0b25zUGFuZWwsIEJvcmRlckxheW91dC5TT1VU
SCApOworCQkJbWFpblBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5
Qm9yZGVyKDUsNyw3LDcpKTsKKworCQkJdGhpcy5nZXRDb250ZW50UGFuZSgpLnNldExheW91
dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQkJdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZCht
YWluUGFuZWwsIG51bGwpOworCisJCQl0aGlzLmluaXRQb3B1cE1lbnUoKTsKKworCQl9IGNh
dGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0K
KworCXB1YmxpYyBMaXN0PEZyb3N0RG93bmxvYWRJdGVtPiBzdGFydERpYWxvZyhMaXN0PEZy
b3N0RG93bmxvYWRJdGVtPiBmb3JzdERvd25sb2FkSXRtZUxpc3QpIHsKKwkJLy8gbG9hZCBk
YXRhIGludG8gdGFibGUKKwkJdGhpcy5sb2FkTmV3RG93bmxvYWRzSW50b1RhYmxlKGZvcnN0
RG93bmxvYWRJdG1lTGlzdCk7CisJCQorCQkvLyBkaXNwbGF5IHRhYmxlCisJCXNldFZpc2li
bGUodHJ1ZSk7IC8vIGJsb2NraW5nIQorCQkKKwkJLy8gcmV0dXJuIGl0ZW1zIGluIHRhYmxl
CisJCWZvcnN0RG93bmxvYWRJdG1lTGlzdCA9IG5ldyBMaW5rZWRMaXN0PEZyb3N0RG93bmxv
YWRJdGVtPigpOworCQlpZiggYWRkRG93bmxvYWRzICkgeworCQkJaW50IG51bWJlck9mUm93
cyA9IGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93Q291bnQoKTsKKwkJCWZvcigg
aW50IGluZGV4UG9zID0gMDsgaW5kZXhQb3MgPCBudW1iZXJPZlJvd3M7IGluZGV4UG9zKysp
IHsKKwkJCQlmaW5hbCBBZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlciByb3cgPSAoQWRkTmV3
RG93bmxvYWRzVGFibGVNZW1iZXIpIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93
KGluZGV4UG9zKTsKKwkJCQlmb3JzdERvd25sb2FkSXRtZUxpc3QuYWRkKCByb3cuZ2V0RG93
bmxvYWRJdGVtKCkgKTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIGZvcnN0RG93bmxvYWRJ
dG1lTGlzdDsKKwl9CisKKwlwcml2YXRlIHZvaWQgbG9hZE5ld0Rvd25sb2Fkc0ludG9UYWJs
ZShMaXN0PEZyb3N0RG93bmxvYWRJdGVtPiBmb3JzdERvd25sb2FkSXRtZUxpc3QpIHsKKwkJ
dGhpcy5hZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsLmNsZWFyRGF0YU1vZGVsKCk7CisJCWZv
ciggRnJvc3REb3dubG9hZEl0ZW0gZnJvRG93bmxvYWRJdGVtIDogZm9yc3REb3dubG9hZEl0
bWVMaXN0KSB7CisJCQlmaW5hbCBBZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlciBhZGROZXdE
b3dubG9hZHNUYWJsZU1lbWJlciA9IG5ldyBBZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlcihm
cm9Eb3dubG9hZEl0ZW0pOworCQkJdGhpcy5hZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsLmFk
ZFJvdyhhZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlcik7CisJCX0KKwl9CisKKwlwcml2YXRl
IHZvaWQgaW5pdFBvcHVwTWVudSgpIHsKKwkJdGFibGVQb3B1cE1lbnUgPSBuZXcgSlNraW5u
YWJsZVBvcHVwTWVudSgpOworCQkKKwkJLy8gQ2hhbmdlIERvd25sb2FkIERpcmVjdG9yeQor
CQlmaW5hbCBKTWVudUl0ZW0gY2hhbmdlRG93bmxvYWREaXIgPSBuZXcgSk1lbnVJdGVtKGxh
bmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLmJ1dHRvbi5jaGFuZ2VE
b3dubG9hZERpciIpKTsKKwkJY2hhbmdlRG93bmxvYWREaXIuYWRkQWN0aW9uTGlzdGVuZXIo
IG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lk
IGFjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBhY3Rpb25FdmVudCkgeworCQkJ
CWNoYW5nZURvd25sb2FkRGlyX2FjdGlvblBlcmZvcm1lZChhY3Rpb25FdmVudCk7CisJCQl9
IAorCQl9KTsKKworCQkvLyBSZW1vdmUgaXRlbSBmcm9tIGxpc3QKKwkJZmluYWwgSk1lbnVJ
dGVtIHJlbW92ZURvd25sb2FkID0gbmV3IEpNZW51SXRlbShsYW5ndWFnZS5nZXRTdHJpbmco
IkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy5idXR0b24ucmVtb3ZlRG93bmxvYWQiKSk7CisJCXJl
bW92ZURvd25sb2FkLmFkZEFjdGlvbkxpc3RlbmVyKCBuZXcgamF2YS5hd3QuZXZlbnQuQWN0
aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoZmluYWwg
QWN0aW9uRXZlbnQgYWN0aW9uRXZlbnQpIHsKKwkJCQlyZW1vdmVEb3dubG9hZF9hY3Rpb25Q
ZXJmb3JtZWQoYWN0aW9uRXZlbnQpOworCQkJfSAKKwkJfSk7CisJCQorCQkvLyBDaGFuZ2Ug
UHJpb3JpdHkKKwkJSk1lbnUgY2hhbmdlUHJpb3JpdHlNZW51ID0gbmV3IEpNZW51KGxhbmd1
YWdlLmdldFN0cmluZygiQ29tbW9uLnByaW9yaXR5LmNoYW5nZVByaW9yaXR5IikpOworCQlm
aW5hbCBpbnQgbnVtYmVyT2ZQcmlvcml0aWVzID0gNzsKKwkJSk1lbnVJdGVtW10gcHJpb0l0
ZW1MaXN0ID0gbmV3IEpNZW51SXRlbVtudW1iZXJPZlByaW9yaXRpZXNdOworCQkKKwkJZm9y
KGludCBpID0gMDsgaSA8IG51bWJlck9mUHJpb3JpdGllczsgaSsrKSB7CisJCQlmaW5hbCBp
bnQgcHJpb3JpdHkgPSBpOworCQkJcHJpb0l0ZW1MaXN0W3ByaW9yaXR5XSA9IG5ldyBKTWVu
dUl0ZW0obGFuZ3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24ucHJpb3JpdHkucHJpb3JpdHkiICsg
cHJpb3JpdHkpKTsKKwkJCWNoYW5nZVByaW9yaXR5TWVudS5hZGQocHJpb0l0ZW1MaXN0W3By
aW9yaXR5XSk7CisJCQlwcmlvSXRlbUxpc3RbcHJpb3JpdHldLmFkZEFjdGlvbkxpc3RlbmVy
KG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9p
ZCBhY3Rpb25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgYWN0aW9uRXZlbnQpIHsKKwkJ
CQkJY2hhbmdlUHJpb3JpdHlfYWN0aW9uUGVyZm9ybWVkKGFjdGlvbkV2ZW50LCBwcmlvcml0
eSk7CisJCQkJfSAKKwkJCX0pOworCQl9CisJCQorCQkvLyBDb21wb3NlIHBvcHVwIG1lbnUK
KwkJdGFibGVQb3B1cE1lbnUuYWRkKGNoYW5nZURvd25sb2FkRGlyKTsKKwkJdGFibGVQb3B1
cE1lbnUuYWRkU2VwYXJhdG9yKCk7CisJCXRhYmxlUG9wdXBNZW51LmFkZChyZW1vdmVEb3du
bG9hZCk7CisJCXRhYmxlUG9wdXBNZW51LmFkZFNlcGFyYXRvcigpOworCQl0YWJsZVBvcHVw
TWVudS5hZGQoY2hhbmdlUHJpb3JpdHlNZW51KTsKKworCQl0aGlzLmFkZE5ld0Rvd25sb2Fk
c1RhYmxlLmFkZE1vdXNlTGlzdGVuZXIobmV3IFRhYmxlUG9wdXBNZW51TW91c2VMaXN0ZW5l
cigpKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHJlbW92ZUFscmVhZHlEb3dubG9hZGVkQnV0
dG9uX2FjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBhY3Rpb25FdmVudCkgewor
CQlpbnQgbnVtYmVyT2ZSb3dzID0gYWRkTmV3RG93bmxvYWRzVGFibGVNb2RlbC5nZXRSb3dD
b3VudCgpOworCQlmb3IoIGludCBpbmRleFBvcyA9IG51bWJlck9mUm93cyAtMTsgaW5kZXhQ
b3MgPj0gMDsgaW5kZXhQb3MtLSkgeworCQkJZmluYWwgQWRkTmV3RG93bmxvYWRzVGFibGVN
ZW1iZXIgYWRkTmV3RG93bmxvYWRzVGFibGVNZW1iZXIgPSAKKwkJCQkoQWRkTmV3RG93bmxv
YWRzVGFibGVNZW1iZXIpIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93KGluZGV4
UG9zKTsKKwkJCWlmKCB0cmFja0Rvd25sb2FkS2V5c1N0b3JhZ2Uuc2VhcmNoSXRlbUtleSgg
YWRkTmV3RG93bmxvYWRzVGFibGVNZW1iZXIuZ2V0RG93bmxvYWRJdGVtKCkuZ2V0S2V5KCkg
KSApIHsKKwkJCQlhZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsLmRlbGV0ZVJvdyhhZGROZXdE
b3dubG9hZHNUYWJsZU1lbWJlcik7CisJCQl9CisJCX0KKwkJYWRkTmV3RG93bmxvYWRzVGFi
bGUuY2xlYXJTZWxlY3Rpb24oKTsKKwl9CisJCQorCXByaXZhdGUgdm9pZCByZW1vdmVBbHJl
YWR5RXhpc3RzQnV0dG9uX2FjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBhY3Rp
b25FdmVudCkgeworCQlpbnQgbnVtYmVyT2ZSb3dzID0gYWRkTmV3RG93bmxvYWRzVGFibGVN
b2RlbC5nZXRSb3dDb3VudCgpOworCQlmb3IoIGludCBpbmRleFBvcyA9IG51bWJlck9mUm93
cyAtMTsgaW5kZXhQb3MgPj0gMDsgaW5kZXhQb3MtLSkgeworCQkJZmluYWwgQWRkTmV3RG93
bmxvYWRzVGFibGVNZW1iZXIgYWRkTmV3RG93bmxvYWRzVGFibGVNZW1iZXIgPSAKKwkJCQko
QWRkTmV3RG93bmxvYWRzVGFibGVNZW1iZXIpIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwu
Z2V0Um93KGluZGV4UG9zKTsKKwkJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGZyb3N0RG93
bmxvYWRJdGVtID0gYWRkTmV3RG93bmxvYWRzVGFibGVNZW1iZXIuZ2V0RG93bmxvYWRJdGVt
KCk7CisJCQlpZihuZXcgamF2YS5pby5GaWxlKGZyb3N0RG93bmxvYWRJdGVtLmdldERvd25s
b2FkRGlyKCkgKyBmcm9zdERvd25sb2FkSXRlbS5nZXRGaWxlbmFtZSgpKS5leGlzdHMoKSAp
IHsKKwkJCQlhZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsLmRlbGV0ZVJvdyhhZGROZXdEb3du
bG9hZHNUYWJsZU1lbWJlcik7CisJCQl9CisJCX0KKwkJYWRkTmV3RG93bmxvYWRzVGFibGUu
Y2xlYXJTZWxlY3Rpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hhbmdlRG93bmxvYWRE
aXJfYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGFjdGlvbkV2ZW50KSB7CisJ
CWZpbmFsIGludFtdIHNlbGVjdGVkUm93cyA9IGFkZE5ld0Rvd25sb2Fkc1RhYmxlLmdldFNl
bGVjdGVkUm93cygpOworCQkKKwkJaWYoIHNlbGVjdGVkUm93cy5sZW5ndGggPiAwICkgewor
CQkJLy8gT3BlbiBjaG9vc2UgRGlyZWN0b3J5IGRpYWxvZworCQkJSkZpbGVDaG9vc2VyIGNo
b29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7IAorCQkJY2hvb3Nlci5zZXRDdXJyZW50RGly
ZWN0b3J5KAorCQkJCQluZXcgamF2YS5pby5GaWxlKAorCQkJCQkJCUNvcmUuZnJvc3RTZXR0
aW5ncy5nZXREZWZhdWx0VmFsdWUoU2V0dGluZ3NDbGFzcy5ESVJfRE9XTkxPQUQpCisJCQkJ
CSkKKwkJCSk7CisJCQljaG9vc2VyLnNldERpYWxvZ1RpdGxlKGxhbmd1YWdlLmdldFN0cmlu
ZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLmNoYW5nZURpckRpYWxvZy50aXRsZSIpKTsKKwkJ
CWNob29zZXIuc2V0RmlsZVNlbGVjdGlvbk1vZGUoSkZpbGVDaG9vc2VyLkRJUkVDVE9SSUVT
X09OTFkpOworCQkJY2hvb3Nlci5zZXRBY2NlcHRBbGxGaWxlRmlsdGVyVXNlZChmYWxzZSk7
CisJCQlpZiAoY2hvb3Nlci5zaG93T3BlbkRpYWxvZyh0aGlzKSAhPSBKRmlsZUNob29zZXIu
QVBQUk9WRV9PUFRJT04pIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCS8vIFNldCBu
ZXcgZGlyIGZvciBzZWxlY3RlZCBpdGVtcworCQkJZm9yKCBpbnQgcm93SW5kZXggOiBzZWxl
Y3RlZFJvd3MgKSB7CisJCQkJaWYoIHJvd0luZGV4ID49IGFkZE5ld0Rvd25sb2Fkc1RhYmxl
LmdldFJvd0NvdW50KCkgKSB7CisJCQkJCWNvbnRpbnVlOyAvLyBwYXJhbm9pYQorCQkJCX0K
KwkJCQkKKwkJCQkvLyBhZGQgdGhlIGJvYXJkKHMpIHRvIGJvYXJkIHRyZWUgYW5kIHJlbW92
ZSBpdCBmcm9tIHRhYmxlCisJCQkJZmluYWwgQWRkTmV3RG93bmxvYWRzVGFibGVNZW1iZXIg
cm93ID0gKEFkZE5ld0Rvd25sb2Fkc1RhYmxlTWVtYmVyKSBhZGROZXdEb3dubG9hZHNUYWJs
ZU1vZGVsLmdldFJvdyhyb3dJbmRleCk7CisJCQkJcm93LmdldERvd25sb2FkSXRlbSgpLnNl
dERvd25sb2FkRGlyKGNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCkudG9TdHJpbmcoKSk7CisJ
CQkJcm93LnVwZGF0ZUNvbW1lbnQoKTsKKwkJCX0KKwkJCWFkZE5ld0Rvd25sb2Fkc1RhYmxl
LmNsZWFyU2VsZWN0aW9uKCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHJlbW92ZURv
d25sb2FkX2FjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7CisJCWZpbmFs
IGludFtdIHNlbGVjdGVkUm93cyA9IGFkZE5ld0Rvd25sb2Fkc1RhYmxlLmdldFNlbGVjdGVk
Um93cygpOworCisJCWlmKCBzZWxlY3RlZFJvd3MubGVuZ3RoID4gMCApIHsKKwkJCWZvcigg
aW50IHogPSBzZWxlY3RlZFJvd3MubGVuZ3RoIC0gMTsgeiA+IC0xOyB6LS0gKSB7CisJCQkJ
ZmluYWwgaW50IHJvd0l4ID0gc2VsZWN0ZWRSb3dzW3pdOworCisJCQkJaWYoIHJvd0l4ID49
IGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93Q291bnQoKSApIHsKKwkJCQkJY29u
dGludWU7IC8vIHBhcmFub2lhCisJCQkJfQorCisJCQkJZmluYWwgQWRkTmV3RG93bmxvYWRz
VGFibGVNZW1iZXIgcm93ID0gKEFkZE5ld0Rvd25sb2Fkc1RhYmxlTWVtYmVyKSBhZGROZXdE
b3dubG9hZHNUYWJsZU1vZGVsLmdldFJvdyhyb3dJeCk7CisJCQkJYWRkTmV3RG93bmxvYWRz
VGFibGVNb2RlbC5kZWxldGVSb3cocm93KTsKKwkJCX0KKwkJCWFkZE5ld0Rvd25sb2Fkc1Rh
YmxlLmNsZWFyU2VsZWN0aW9uKCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNoYW5n
ZVByaW9yaXR5X2FjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlLCBmaW5hbCBp
bnQgcHJpb3JpdHkpIHsKKwkJZmluYWwgaW50W10gc2VsZWN0ZWRSb3dzID0gYWRkTmV3RG93
bmxvYWRzVGFibGUuZ2V0U2VsZWN0ZWRSb3dzKCk7CisKKwkJaWYoIHNlbGVjdGVkUm93cy5s
ZW5ndGggPiAwICkgeworCQkJZm9yKCBpbnQgeiA9IHNlbGVjdGVkUm93cy5sZW5ndGggLSAx
OyB6ID4gLTE7IHotLSApIHsKKwkJCQlmaW5hbCBpbnQgcm93SXggPSBzZWxlY3RlZFJvd3Nb
el07CisKKwkJCQlpZiggcm93SXggPj0gYWRkTmV3RG93bmxvYWRzVGFibGVNb2RlbC5nZXRS
b3dDb3VudCgpICkgeworCQkJCQljb250aW51ZTsgLy8gcGFyYW5vaWEKKwkJCQl9CisKKwkJ
CQlmaW5hbCBBZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlciByb3cgPSAoQWRkTmV3RG93bmxv
YWRzVGFibGVNZW1iZXIpIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93KHJvd0l4
KTsKKwkJCQlyb3cuZ2V0RG93bmxvYWRJdGVtKCkuc2V0UHJpb3JpdHkocHJpb3JpdHkpOwor
CQkJfQorCQkJYWRkTmV3RG93bmxvYWRzVGFibGUuY2xlYXJTZWxlY3Rpb24oKTsKKwkJfQor
CX0KKworCWNsYXNzIEFkZE5ld0Rvd25sb2Fkc1RhYmxlTWVtYmVyIGltcGxlbWVudHMgVGFi
bGVNZW1iZXIgeworCisJCUZyb3N0RG93bmxvYWRJdGVtIGZyb3N0RG93bmxvYWRJdGVtOwor
CQlTdHJpbmcgY29tbWVudDsKKworCQlwdWJsaWMgQWRkTmV3RG93bmxvYWRzVGFibGVNZW1i
ZXIoZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZnJvc3REb3dubG9hZEl0ZW0peworCQkJdGhp
cy5mcm9zdERvd25sb2FkSXRlbSA9IGZyb3N0RG93bmxvYWRJdGVtOworCQl9CisKKwkJcHVi
bGljIE9iamVjdCBnZXRWYWx1ZUF0KGZpbmFsIGludCBjb2x1bW4pIHsKKwkJCXN3aXRjaCgg
Y29sdW1uICkgeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0dXJuIGZyb3N0RG93bmxvYWRJdGVt
LmdldEZpbGVuYW1lKCk7CisJCQkJY2FzZSAxOgorCQkJCQlyZXR1cm4gZnJvc3REb3dubG9h
ZEl0ZW0uZ2V0S2V5KCk7CisJCQkJY2FzZSAyOgorCQkJCQlpZiggZnJvc3REb3dubG9hZEl0
ZW0uZ2V0UHJpb3JpdHkoKSA9PSAtMSApIHsKKwkJCQkJCWZyb3N0RG93bmxvYWRJdGVtLnNl
dFByaW9yaXR5KCBDb3JlLmZyb3N0U2V0dGluZ3MuZ2V0SW50VmFsdWUoU2V0dGluZ3NDbGFz
cy5GQ1AyX0RFRkFVTFRfUFJJT19GSUxFX0RPV05MT0FEICkpOworCQkJCQl9CisJCQkJCVN0
cmluZyBwcmlvID0gIkNvbW1vbi5wcmlvcml0eS5wcmlvcml0eSIgKyBmcm9zdERvd25sb2Fk
SXRlbS5nZXRQcmlvcml0eSgpOworCQkJCQlyZXR1cm4gbGFuZ3VhZ2UuZ2V0U3RyaW5nKHBy
aW8pOworCQkJCWNhc2UgMzoKKwkJCQkJcmV0dXJuIGZyb3N0RG93bmxvYWRJdGVtLmdldERv
d25sb2FkRGlyKCk7CisJCQkJY2FzZSA0OgorCQkJCQlpZihjb21tZW50ID09IG51bGwpewor
CQkJCQkJdGhpcy51cGRhdGVDb21tZW50KCk7CisJCQkJCX0KKwkJCQkJcmV0dXJuIGNvbW1l
bnQ7CisJCQkJZGVmYXVsdCA6CisJCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJV
bmtub3duIENvbHVtbiBwb3MiKTsKKwkJCX0KKwkJfQorCQkKKwkJcHVibGljIHZvaWQgdXBk
YXRlQ29tbWVudCgpIHsKKwkJCS8vIEhhcyB0aGlzIGtleSBhbHJlYWR5IGJlZW4gZG93bmxv
YWRlZD8KKwkJCWlmKCB0cmFja0Rvd25sb2FkS2V5c1N0b3JhZ2Uuc2VhcmNoSXRlbUtleSgg
ZnJvc3REb3dubG9hZEl0ZW0uZ2V0S2V5KCkgKSApIHsKKwkJCQljb21tZW50ID0gbGFuZ3Vh
Z2UuZ2V0U3RyaW5nKCJBZGROZXdEb3dubG9hZHNEaWFsb2cudGFibGUuYWxyZWFkeURvd25s
b2FkZWQiKTsKKwkJCX0gZWxzZSBpZihuZXcgamF2YS5pby5GaWxlKGZyb3N0RG93bmxvYWRJ
dGVtLmdldERvd25sb2FkRGlyKCkgKyBmcm9zdERvd25sb2FkSXRlbS5nZXRGaWxlbmFtZSgp
KS5leGlzdHMoKSApIHsKKwkJCQljb21tZW50ID0gbGFuZ3VhZ2UuZ2V0U3RyaW5nKCJBZGRO
ZXdEb3dubG9hZHNEaWFsb2cudGFibGUuYWxyZWFkeUV4aXN0cyIpOworCQkJfSBlbHNlIHsK
KwkJCQljb21tZW50ID0gIiI7CisJCQl9CisJCX0KKworCQlwdWJsaWMgaW50IGNvbXBhcmVU
byhmaW5hbCBUYWJsZU1lbWJlciBhbk90aGVyLCBmaW5hbCBpbnQgdGFibGVDb2x1bUluZGV4
KSB7CisJCQlmaW5hbCBTdHJpbmcgYzEgPSAoU3RyaW5nKSBnZXRWYWx1ZUF0KHRhYmxlQ29s
dW1JbmRleCk7CisJCQlmaW5hbCBTdHJpbmcgYzIgPSAoU3RyaW5nKSBhbk90aGVyLmdldFZh
bHVlQXQodGFibGVDb2x1bUluZGV4KTsKKwkJCXJldHVybiBjMS5jb21wYXJlVG9JZ25vcmVD
YXNlKGMyKTsKKwkJfQorCQkKKwkJcHVibGljIEZyb3N0RG93bmxvYWRJdGVtIGdldERvd25s
b2FkSXRlbSgpeworCQkJcmV0dXJuIGZyb3N0RG93bmxvYWRJdGVtOworCQl9CisJfQorCisJ
Y2xhc3MgVGFibGVQb3B1cE1lbnVNb3VzZUxpc3RlbmVyIGltcGxlbWVudHMgTW91c2VMaXN0
ZW5lciB7CisJCXB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoZmluYWwgTW91c2VFdmVudCBl
dmVudCkgeworCQkJbWF5YmVTaG93UG9wdXAoZXZlbnQpOworCQl9CisJCXB1YmxpYyB2b2lk
IG1vdXNlUHJlc3NlZChmaW5hbCBNb3VzZUV2ZW50IGV2ZW50KSB7CisJCQltYXliZVNob3dQ
b3B1cChldmVudCk7CisJCX0KKwkJcHVibGljIHZvaWQgbW91c2VDbGlja2VkKGZpbmFsIE1v
dXNlRXZlbnQgZXZlbnQpIHt9CisJCXB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChmaW5hbCBN
b3VzZUV2ZW50IGV2ZW50KSB7fQorCQlwdWJsaWMgdm9pZCBtb3VzZUV4aXRlZChmaW5hbCBN
b3VzZUV2ZW50IGV2ZW50KSB7fQorCisJCXByb3RlY3RlZCB2b2lkIG1heWJlU2hvd1BvcHVw
KGZpbmFsIE1vdXNlRXZlbnQgZSkgeworCQkJaWYoIGUuaXNQb3B1cFRyaWdnZXIoKSApIHsK
KwkJCQlpZiggYWRkTmV3RG93bmxvYWRzVGFibGUuZ2V0U2VsZWN0ZWRSb3dDb3VudCgpID4g
MCApIHsKKwkJCQkJLy8gZG9uJ3Qgc2hvdyBtZW51IGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQK
KwkJCQkJdGFibGVQb3B1cE1lbnUuc2hvdyhhZGROZXdEb3dubG9hZHNUYWJsZSwgZS5nZXRY
KCksIGUuZ2V0WSgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CkluZGV4OiBzb3VyY2Uv
ZnJvc3QvZ3VpL01hbmFnZVRyYWNrZWREb3dubG9hZHMuamF2YQ0KPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K
LS0tIHNvdXJjZS9mcm9zdC9ndWkvTWFuYWdlVHJhY2tlZERvd25sb2Fkcy5qYXZhCShyZXZp
c2lvbiAwKQ0KKysrIHNvdXJjZS9mcm9zdC9ndWkvTWFuYWdlVHJhY2tlZERvd25sb2Fkcy5q
YXZhCShyZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSwzNTcgQEANCisvKgorICBNYW5hZ2VUcmFj
a2VkRG93bmxvYWRzLmphdmEgLyBGcm9zdAorICBDb3B5cmlnaHQgKEMpIDIwMTAgIEZyb3N0
IFByb2plY3QgPGp0Y2Zyb3N0LnNvdXJjZWZvcmdlLm5ldD4KKworICBUaGlzIHByb2dyYW0g
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIgdmVyc2lvbiAyIG9mCisgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJD
SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0
aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKwor
ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0
ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBB
dmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCitwYWNrYWdlIGZyb3N0Lmd1aTsK
KworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkRp
bWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBq
YXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNl
TGlzdGVuZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZh
LmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2
YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNl
cHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklu
cHV0U3RyZWFtUmVhZGVyOworCitpbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsK
K2ltcG9ydCBqYXZheC5zd2luZy5Cb3g7CitpbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0
OworaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247CitpbXBvcnQgamF2YXguc3dpbmcuSkZp
bGVDaG9vc2VyOworaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKK2ltcG9ydCBqYXZheC5z
d2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSk1lbnVJdGVtOworaW1wb3J0IGph
dmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKK2lt
cG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOworaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RT
ZWxlY3Rpb25Nb2RlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7CisK
K2ltcG9ydCBmcm9zdC5Db3JlOworaW1wb3J0IGZyb3N0LlNldHRpbmdzQ2xhc3M7CitpbXBv
cnQgZnJvc3QuZmNwLkZyZWVuZXRLZXlzOworaW1wb3J0IGZyb3N0Lmd1aS5tb2RlbC5UYWJs
ZU1lbWJlcjsKK2ltcG9ydCBmcm9zdC5ndWkubW9kZWwuVHJhY2tlZERvd25sb2Fkc01vZGVs
OworaW1wb3J0IGZyb3N0LnN0b3JhZ2UucGVyc3QuVHJhY2tEb3dubG9hZEtleXM7CitpbXBv
cnQgZnJvc3Quc3RvcmFnZS5wZXJzdC5UcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2U7CitpbXBv
cnQgZnJvc3QudXRpbC5EYXRlRnVuOworaW1wb3J0IGZyb3N0LnV0aWwuZ3VpLkpTa2lubmFi
bGVQb3B1cE1lbnU7CitpbXBvcnQgZnJvc3QudXRpbC5ndWkudHJhbnNsYXRpb24uTGFuZ3Vh
Z2U7CisKK3B1YmxpYyBjbGFzcyBNYW5hZ2VUcmFja2VkRG93bmxvYWRzIGV4dGVuZHMgamF2
YXguc3dpbmcuSkRpYWxvZyB7CisJcHJpdmF0ZSBmaW5hbCBMYW5ndWFnZSBsYW5ndWFnZTsK
Kwlwcml2YXRlIGZpbmFsIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSB0cmFja0Rvd25sb2Fk
S2V5c1N0b3JhZ2U7CisJCisJcHJpdmF0ZSBUcmFja2VkRG93bmxvYWRzTW9kZWwgdHJhY2tl
ZERvd25sb2Fkc01vZGVsOworCXByaXZhdGUgU29ydGVkVGFibGUgdHJhY2tlZERvd25sb2Fk
c1RhYmxlOworCQorCXByaXZhdGUgSlRleHRGaWVsZCBtYXhBZ2VUZXh0RmllbGQ7CisJcHJp
dmF0ZSBKQnV0dG9uIG1heEFnZUJ1dHRvbjsKKwlwcml2YXRlIEpCdXR0b24gYWRkS2V5c0J1
dHRvbjsKKwlwcml2YXRlIEpCdXR0b24gY2xvc2VCdXR0b247CisJCisJcHJpdmF0ZSBKU2tp
bm5hYmxlUG9wdXBNZW51IHRhYmxlUG9wdXBNZW51OworCQorCXByaXZhdGUgc3RhdGljIGZp
bmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJcHVibGljIE1hbmFnZVRyYWNr
ZWREb3dubG9hZHMoSkZyYW1lIGZyYW1lKSB7CisJCXN1cGVyKGZyYW1lKTsKKwkJc2V0TW9k
YWwodHJ1ZSk7CisJCWxhbmd1YWdlID0gTGFuZ3VhZ2UuZ2V0SW5zdGFuY2UoKTsKKwkJdHJh
Y2tEb3dubG9hZEtleXNTdG9yYWdlID0gVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlLmluc3Qo
KTsKKwkJCisJCXNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRElT
UE9TRV9PTl9DTE9TRSk7CisKKwkJaW5pdEdVSSgpOworCX0KKwkKKwlwcml2YXRlIHZvaWQg
aW5pdEdVSSgpIHsKKwkJdHJ5IHsKKwkJCXNldFRpdGxlKGxhbmd1YWdlLmdldFN0cmluZygi
TWFuYWdlRG93bmxvYWRUcmFja2luZ0RpYWxvZy50aXRsZSIpKTsKKwkJCXNldFNpemUoODAw
LCA2MDApOworCQkJdGhpcy5zZXRSZXNpemFibGUodHJ1ZSk7CisJCQkKKwkJCS8vIE1heCBB
Z2UKKwkJCUpMYWJlbCBtYXhBZ2VMYWJlbCA9IG5ldyBKTGFiZWwobGFuZ3VhZ2UuZ2V0U3Ry
aW5nKCJNYW5hZ2VEb3dubG9hZFRyYWNraW5nRGlhbG9nLmJ1dHRvbi5tYXhBZ2UiKSk7CisJ
CQltYXhBZ2VUZXh0RmllbGQgPSBuZXcgSlRleHRGaWVsZCg2KTsKKwkJCW1heEFnZVRleHRG
aWVsZC5zZXRUZXh0KCIxMDAiKTsKKwkJCW1heEFnZVRleHRGaWVsZC5zZXRNYXhpbXVtU2l6
ZShuZXcgRGltZW5zaW9uKDMwLDIwKSk7CisJCQltYXhBZ2VCdXR0b24gPSBuZXcgSkJ1dHRv
bihsYW5ndWFnZS5nZXRTdHJpbmcoIk1hbmFnZURvd25sb2FkVHJhY2tpbmdEaWFsb2cuYnV0
dG9uLm1heEFnZUJ1dHRvbiIpKTsKKwkJCW1heEFnZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5l
ciggbmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2
b2lkIGFjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7CisJCQkJCW1heEFn
ZUJ1dHRvbl9hY3Rpb25QZXJmb3JtZWQoZSk7CisJCQkJfQorCQkJfSk7CisJCQltYXhBZ2VC
dXR0b24uc2V0VG9vbFRpcFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNYW5hZ2VEb3dubG9h
ZFRyYWNraW5nRGlhbG9nLmJ1dHRvblRvb2x0aXAubWF4QWdlQnV0dG9uIikpOworCQkJCisJ
CQkvLyBMb2FkIGZpbGVzCisJCQlhZGRLZXlzQnV0dG9uID0gbmV3IEpCdXR0b24obGFuZ3Vh
Z2UuZ2V0U3RyaW5nKCJNYW5hZ2VEb3dubG9hZFRyYWNraW5nRGlhbG9nLmJ1dHRvbi5hZGRL
ZXlzIikpOworCQkJYWRkS2V5c0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lciggbmV3IGphdmEu
YXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBl
cmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7CisJCQkJCWFkZEtleXNCdXR0b25fYWN0
aW9uUGVyZm9ybWVkKGUpOworCQkJCX0gCisJCQl9KTsKKwkJCWFkZEtleXNCdXR0b24uc2V0
VG9vbFRpcFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNYW5hZ2VEb3dubG9hZFRyYWNraW5n
RGlhbG9nLmJ1dHRvblRvb2x0aXAuYWRkS2V5cyIpKTsKKworCQkJLy8gQ2xvc2UgQnV0dG9u
CisJCQljbG9zZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKGxhbmd1YWdlLmdldFN0cmluZygiQ29t
bW9uLmNsb3NlIikpOworCQkJY2xvc2VCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIoIG5ldyBq
YXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rp
b25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgeworCQkJCQlkaXNwb3NlKCk7CisJ
CQkJfSAKKwkJCX0pOworCQkJCisJCQkvLyBCdXR0b24gcm93CisJCQlmaW5hbCBKUGFuZWwg
YnV0dG9uc1BhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQkJYnV0
dG9uc1BhbmVsLnNldExheW91dCggbmV3IEJveExheW91dCggYnV0dG9uc1BhbmVsLCBCb3hM
YXlvdXQuWF9BWElTICkpOworCisJCQlidXR0b25zUGFuZWwuYWRkKCBtYXhBZ2VMYWJlbCAp
OworCQkJYnV0dG9uc1BhbmVsLmFkZChCb3guY3JlYXRlUmlnaWRBcmVhKG5ldyBEaW1lbnNp
b24oMTAsMykpKTsKKwkJCWJ1dHRvbnNQYW5lbC5hZGQoIG1heEFnZVRleHRGaWVsZCApOwor
CQkJYnV0dG9uc1BhbmVsLmFkZChCb3guY3JlYXRlUmlnaWRBcmVhKG5ldyBEaW1lbnNpb24o
MTAsMykpKTsKKwkJCWJ1dHRvbnNQYW5lbC5hZGQoIG1heEFnZUJ1dHRvbiApOworCQkJCisJ
CQlidXR0b25zUGFuZWwuYWRkKCBCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSApOworCQkJ
CisJCQlidXR0b25zUGFuZWwuYWRkKCBhZGRLZXlzQnV0dG9uICk7CisJCQlidXR0b25zUGFu
ZWwuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVuc2lvbigyMCwzKSkpOworCQkJ
YnV0dG9uc1BhbmVsLmFkZCggY2xvc2VCdXR0b24gKTsKKworCQkJLy8gRG93bmxvYWQgVGFi
bGUKKwkJCXRyYWNrZWREb3dubG9hZHNNb2RlbCA9IG5ldyBUcmFja2VkRG93bmxvYWRzTW9k
ZWwoKTsKKwkJCXRyYWNrZWREb3dubG9hZHNUYWJsZSA9IG5ldyBTb3J0ZWRUYWJsZSggdHJh
Y2tlZERvd25sb2Fkc01vZGVsICk7CisJCQl0cmFja2VkRG93bmxvYWRzVGFibGUuc2V0Um93
U2VsZWN0aW9uQWxsb3dlZCh0cnVlKTsKKwkJCXRyYWNrZWREb3dubG9hZHNUYWJsZS5zZXRT
ZWxlY3Rpb25Nb2RlKCBMaXN0U2VsZWN0aW9uTW9kZWwuTVVMVElQTEVfSU5URVJWQUxfU0VM
RUNUSU9OICk7CisJCQl0cmFja2VkRG93bmxvYWRzVGFibGUuc2V0Um93SGVpZ2h0KDE4KTsK
KwkJCWZpbmFsIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUodHJh
Y2tlZERvd25sb2Fkc1RhYmxlKTsKKwkJCXNjcm9sbFBhbmUuc2V0V2hlZWxTY3JvbGxpbmdF
bmFibGVkKHRydWUpOworCisJCQkvLyBtYWluIHBhbmVsCisJCQlmaW5hbCBKUGFuZWwgbWFp
blBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQkJbWFpblBhbmVs
LmFkZCggc2Nyb2xsUGFuZSwgQm9yZGVyTGF5b3V0LkNFTlRFUiApOworCQkJbWFpblBhbmVs
LnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDUsNyw3LDcpKTsK
KworCQkJdGhpcy5nZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0
KCkpOworCQkJbWFpblBhbmVsLmFkZCggYnV0dG9uc1BhbmVsLCBCb3JkZXJMYXlvdXQuU09V
VEggKTsKKwkJCXRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQobWFpblBhbmVsLCBudWxsKTsK
KworCQkJdGhpcy5pbml0UG9wdXBNZW51KCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7
CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBp
bml0UG9wdXBNZW51KCkgeworCQl0YWJsZVBvcHVwTWVudSA9IG5ldyBKU2tpbm5hYmxlUG9w
dXBNZW51KCk7CisJCQorCQkvLyByZW1vdmUKKwkJZmluYWwgSk1lbnVJdGVtIHJlbW92ZU1l
bnVJdGVtID0gbmV3IEpNZW51SXRlbShsYW5ndWFnZS5nZXRTdHJpbmcoIk1hbmFnZURvd25s
b2FkVHJhY2tpbmdEaWFsb2cuYnV0dG9uLnJlbW92ZSIpKTsKKwkJcmVtb3ZlTWVudUl0ZW0u
YWRkQWN0aW9uTGlzdGVuZXIoIG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigp
IHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBh
Y3Rpb25FdmVudCkgeworCQkJCXJlbW92ZU1lbnVJdGVtX2FjdGlvblBlcmZvcm1lZChhY3Rp
b25FdmVudCk7CisJCQl9IAorCQl9KTsKKwkJCisJCS8vIHJlbW92ZSBhbGwgZnJvbSBzYW1l
IEJvYXJkCisJCWZpbmFsIEpNZW51SXRlbSByZW1vdmVTYW1lQm9hcmRNZW51SXRlbSA9IG5l
dyBKTWVudUl0ZW0obGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNYW5hZ2VEb3dubG9hZFRyYWNraW5n
RGlhbG9nLmJ1dHRvbi5yZW1vdmVTYW1lQm9hcmQiKSk7CisJCXJlbW92ZVNhbWVCb2FyZE1l
bnVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKCBuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlz
dGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoZmluYWwgQWN0aW9u
RXZlbnQgYWN0aW9uRXZlbnQpIHsKKwkJCQlyZW1vdmVTYW1lQm9hcmRNZW51SXRlbV9hY3Rp
b25QZXJmb3JtZWQoYWN0aW9uRXZlbnQpOworCQkJfSAKKwkJfSk7CisKKwkJLy8gQ29tcG9z
ZSBwb3B1cCBtZW51CisJCXRhYmxlUG9wdXBNZW51LmFkZChyZW1vdmVNZW51SXRlbSk7CisJ
CXRhYmxlUG9wdXBNZW51LmFkZFNlcGFyYXRvcigpOworCQl0YWJsZVBvcHVwTWVudS5hZGQo
cmVtb3ZlU2FtZUJvYXJkTWVudUl0ZW0pOworCisJCXRoaXMudHJhY2tlZERvd25sb2Fkc1Rh
YmxlLmFkZE1vdXNlTGlzdGVuZXIobmV3IFRhYmxlUG9wdXBNZW51TW91c2VMaXN0ZW5lcigp
KTsKKwl9CisJCisJcHVibGljIHZvaWQgc3RhcnREaWFsb2coKSB7CisJCXRoaXMubG9hZFRy
YWNrZWREb3dubG9hZHNJbnRvVGFibGUoKTsKKwkJCisJCXNldFZpc2libGUodHJ1ZSk7IC8v
IGJsb2NraW5nIQorCX0KKwkKKwlwcml2YXRlIHZvaWQgbG9hZFRyYWNrZWREb3dubG9hZHNJ
bnRvVGFibGUoKSB7CisJCXRoaXMudHJhY2tlZERvd25sb2Fkc01vZGVsLmNsZWFyRGF0YU1v
ZGVsKCk7CisJCWZvciggVHJhY2tEb3dubG9hZEtleXMgdHJhY2tEb3dubG9hZGtleSA6IHRy
YWNrRG93bmxvYWRLZXlzU3RvcmFnZS5nZXREb3dubG9hZEtleUxpc3QoKSkgeworCQkJVHJh
Y2tlZERvd25sb2FkVGFibGVNZW1iZXIgdHJhY2tlZERvd25sb2FkVGFibGVNZW1iZXIgPSBu
ZXcgVHJhY2tlZERvd25sb2FkVGFibGVNZW1iZXIodHJhY2tEb3dubG9hZGtleSk7CisJCQl0
aGlzLnRyYWNrZWREb3dubG9hZHNNb2RlbC5hZGRSb3codHJhY2tlZERvd25sb2FkVGFibGVN
ZW1iZXIpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCByZW1vdmVNZW51SXRlbV9hY3Rp
b25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgeworCQlmaW5hbCBpbnRbXSBzZWxl
Y3RlZFJvd3MgPSB0cmFja2VkRG93bmxvYWRzVGFibGUuZ2V0U2VsZWN0ZWRSb3dzKCk7CisK
KwkJaWYoIHNlbGVjdGVkUm93cy5sZW5ndGggPiAwICkgeworCQkJZm9yKCBpbnQgeiA9IHNl
bGVjdGVkUm93cy5sZW5ndGggLSAxOyB6ID4gLTE7IHotLSApIHsKKwkJCQlmaW5hbCBpbnQg
cm93SXggPSBzZWxlY3RlZFJvd3Nbel07CisKKwkJCQlpZiggcm93SXggPj0gdHJhY2tlZERv
d25sb2Fkc01vZGVsLmdldFJvd0NvdW50KCkgKSB7CisJCQkJCWNvbnRpbnVlOyAvLyBwYXJh
bm9pYQorCQkJCX0KKworCQkJCWZpbmFsIFRyYWNrZWREb3dubG9hZFRhYmxlTWVtYmVyIHJv
dyA9IChUcmFja2VkRG93bmxvYWRUYWJsZU1lbWJlcikgdHJhY2tlZERvd25sb2Fkc01vZGVs
LmdldFJvdyhyb3dJeCk7CisJCQkJdHJhY2tEb3dubG9hZEtleXNTdG9yYWdlLnJlbW92ZUl0
ZW1CeUtleShyb3cuZ2V0VHJhY2tEb3dubG9hZEtleXMoKS5nZXRDaGtLZXkoKSk7CisJCQkJ
dHJhY2tlZERvd25sb2Fkc01vZGVsLmRlbGV0ZVJvdyhyb3cpOworCQkJfQorCQkJdHJhY2tl
ZERvd25sb2Fkc1RhYmxlLmNsZWFyU2VsZWN0aW9uKCk7CisJCX0KKwl9CisKKwlwcml2YXRl
IHZvaWQgcmVtb3ZlU2FtZUJvYXJkTWVudUl0ZW1fYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFj
dGlvbkV2ZW50IGUpIHsKKwkJZmluYWwgaW50IHNlbGVjdGVkUm93SWR4ID0gdHJhY2tlZERv
d25sb2Fkc1RhYmxlLmdldFNlbGVjdGVkUm93KCk7CisJCWlmKCBzZWxlY3RlZFJvd0lkeCA8
IDAgfHwgc2VsZWN0ZWRSb3dJZHggPj0gdHJhY2tlZERvd25sb2Fkc01vZGVsLmdldFJvd0Nv
dW50KCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlmaW5hbCBUcmFja2VkRG93bmxvYWRUYWJs
ZU1lbWJlciBzZWxlY3RlZFJvdyA9IChUcmFja2VkRG93bmxvYWRUYWJsZU1lbWJlcikgdHJh
Y2tlZERvd25sb2Fkc01vZGVsLmdldFJvdyhzZWxlY3RlZFJvd0lkeCk7CisJCWlmKCBzZWxl
Y3RlZFJvdyA9PSBudWxsICkgeworCQkJcmV0dXJuOworCQl9CisJCWZpbmFsIFN0cmluZyBi
b2FyZE5hbWUgPSBzZWxlY3RlZFJvdy5nZXRUcmFja0Rvd25sb2FkS2V5cygpLmdldEJvYXJk
TmFtZSgpOworCQkKKwkJZm9yKCBpbnQgeiA9IHRyYWNrZWREb3dubG9hZHNNb2RlbC5nZXRS
b3dDb3VudCgpIC0xIDsgeiA+PSAwOyB6LS0pIHsKKwkJCWZpbmFsIFRyYWNrZWREb3dubG9h
ZFRhYmxlTWVtYmVyIHJvdyA9IChUcmFja2VkRG93bmxvYWRUYWJsZU1lbWJlcikgdHJhY2tl
ZERvd25sb2Fkc01vZGVsLmdldFJvdyh6KTsKKwkJCWlmKCBib2FyZE5hbWUuY29tcGFyZVRv
KHJvdy5nZXRUcmFja0Rvd25sb2FkS2V5cygpLmdldEJvYXJkTmFtZSgpKSA9PSAwICkgewor
CQkJCXRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5yZW1vdmVJdGVtQnlLZXkocm93LmdldFRy
YWNrRG93bmxvYWRLZXlzKCkuZ2V0Q2hrS2V5KCkpOworCQkJCXRyYWNrZWREb3dubG9hZHNN
b2RlbC5kZWxldGVSb3cocm93KTsKKwkJCX0KKwkJfQorCQl0cmFja2VkRG93bmxvYWRzVGFi
bGUuY2xlYXJTZWxlY3Rpb24oKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZEtleXNCdXR0
b25fYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsKKwkJLy8gT3BlbiBj
aG9vc2UgRGlyZWN0b3J5IGRpYWxvZworCQlKRmlsZUNob29zZXIgZmlsZUNob29zZXIgPSBu
ZXcgSkZpbGVDaG9vc2VyKCk7IAorCQlmaWxlQ2hvb3Nlci5zZXRDdXJyZW50RGlyZWN0b3J5
KAorCQkJbmV3IGphdmEuaW8uRmlsZSgKKwkJCQlDb3JlLmZyb3N0U2V0dGluZ3MuZ2V0RGVm
YXVsdFZhbHVlKFNldHRpbmdzQ2xhc3MuRElSX0RPV05MT0FEKQorCQkJKQorCQkpOworCQlm
aWxlQ2hvb3Nlci5zZXREaWFsb2dUaXRsZShsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5ld0Rv
d25sb2Fkc0RpYWxvZy5jaGFuZ2VEaXJEaWFsb2cudGl0bGUiKSk7CisJCWZpbGVDaG9vc2Vy
LnNldEZpbGVTZWxlY3Rpb25Nb2RlKEpGaWxlQ2hvb3Nlci5GSUxFU19PTkxZKTsKKwkJZmls
ZUNob29zZXIuc2V0QWNjZXB0QWxsRmlsZUZpbHRlclVzZWQoZmFsc2UpOworCQlpZiAoZmls
ZUNob29zZXIuc2hvd09wZW5EaWFsb2codGhpcykgIT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVf
T1BUSU9OKSB7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCXRyeSB7CisJCQlGaWxlIHNlbGVj
dGVkRmlsZSA9ZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7CisJCQlGaWxlSW5wdXRT
dHJlYW0gZmlsZUlucHV0U3RyZW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNlbGVjdGVkRmls
ZSk7CisJCQlEYXRhSW5wdXRTdHJlYW0gZGF0YUlucHV0U3RyZWFtID0gbmV3IERhdGFJbnB1
dFN0cmVhbShmaWxlSW5wdXRTdHJlbSk7CisJCQlCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJl
YWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZGF0YUlu
cHV0U3RyZWFtKSk7CisJCQlTdHJpbmcgc3RyTGluZTsKKwkJCXdoaWxlICgoc3RyTGluZSA9
IGJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpICAgeworCQkJCWlmKCBzdHJM
aW5lLnN0YXJ0c1dpdGgoIkNIS0AiKSAmJiBGcmVlbmV0S2V5cy5pc1ZhbGlkS2V5KHN0ckxp
bmUpICkgeworCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBzdHJMaW5lLnN1YnN0cmluZyhzdHJM
aW5lLmxhc3RJbmRleE9mKCIvIikrMSk7CisJCQkJCXRyYWNrRG93bmxvYWRLZXlzU3RvcmFn
ZS5zdG9yZUl0ZW0obmV3IFRyYWNrRG93bmxvYWRLZXlzKHN0ckxpbmUsIGZpbGVOYW1lLCAi
Iiwgc2VsZWN0ZWRGaWxlLmxlbmd0aCgpLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkp
OworCQkJCX0KKwkJCX0KKwkJfWNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewor
CQkJZXgucHJpbnRTdGFja1RyYWNlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7
CisJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlsb2FkVHJhY2tlZERvd25sb2Fk
c0ludG9UYWJsZSgpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgbWF4QWdlQnV0dG9uX2FjdGlv
blBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7CisJCWludCBtYXhfYWdlID0gNDsK
KwkJdHJ5IHsKKwkJCW1heF9hZ2UgPSBJbnRlZ2VyLnBhcnNlSW50KHRoaXMubWF4QWdlVGV4
dEZpZWxkLmdldFRleHQoKSk7CisJCX0gY2F0Y2goIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBl
eCApIHsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYoIG1heF9hZ2UgPCAwKSB7CisJCQly
ZXR1cm47CisJCX0KKwkJCisJCXRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5jbGVhbnVwVGFi
bGUobWF4X2FnZSk7CisJCWxvYWRUcmFja2VkRG93bmxvYWRzSW50b1RhYmxlKCk7CisJfSAK
KwkKKwljbGFzcyBUcmFja2VkRG93bmxvYWRUYWJsZU1lbWJlciBpbXBsZW1lbnRzIFRhYmxl
TWVtYmVyIHsKKworCQlUcmFja0Rvd25sb2FkS2V5cyB0cmFja0Rvd25sb2FkS2V5OworCQlT
dHJpbmcgY29tbWVudDsKKworCQlwdWJsaWMgVHJhY2tlZERvd25sb2FkVGFibGVNZW1iZXIo
ZmluYWwgVHJhY2tEb3dubG9hZEtleXMgdHJhY2tEb3dubG9hZGtleSl7CisJCQl0aGlzLnRy
YWNrRG93bmxvYWRLZXkgPSB0cmFja0Rvd25sb2Fka2V5OworCQl9CisKKwkJcHVibGljIE9i
amVjdCBnZXRWYWx1ZUF0KGZpbmFsIGludCBjb2x1bW4pIHsKKwkJCXN3aXRjaCggY29sdW1u
ICkgeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0dXJuIHRyYWNrRG93bmxvYWRLZXkuZ2V0Rmls
ZU5hbWUoKTsKKwkJCQljYXNlIDE6CisJCQkJCXJldHVybiB0cmFja0Rvd25sb2FkS2V5Lmdl
dENoa0tleSgpOworCQkJCWNhc2UgMjoKKwkJCQkJcmV0dXJuIHRyYWNrRG93bmxvYWRLZXku
Z2V0Qm9hcmROYW1lKCk7CisJCQkJY2FzZSAzOgorCQkJCQlyZXR1cm4gdHJhY2tEb3dubG9h
ZEtleS5nZXRGaWxlU2l6ZSgpOworCQkJCWNhc2UgNDoKKwkJCQkJbG9uZyBkYXRlID0gdHJh
Y2tEb3dubG9hZEtleS5nZXREb3dubG9hZEZpbmlzaGVkVGltZSgpOworCQkJCQlyZXR1cm4g
bmV3IFN0cmluZ0J1aWxkZXIoKQorCQkJCQkuYXBwZW5kKERhdGVGdW4uRk9STUFUX0RBVEVf
VklTSUJMRS5wcmludChkYXRlKSkKKwkJCQkJLmFwcGVuZCgiIC0gIikKKwkJCQkJLmFwcGVu
ZChEYXRlRnVuLkZPUk1BVF9USU1FX1ZJU0lCTEUucHJpbnQoZGF0ZSkpCisJCQkJCS50b1N0
cmluZygpOworCQkJCWRlZmF1bHQgOgorCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlv
bigiVW5rbm93biBDb2x1bW4gcG9zIik7CisJCQl9CisJCX0KKwkJCisJCXB1YmxpYyBUcmFj
a0Rvd25sb2FkS2V5cyBnZXRUcmFja0Rvd25sb2FkS2V5cygpIHsKKwkJCXJldHVybiB0aGlz
LnRyYWNrRG93bmxvYWRLZXk7CisJCX0KKwkJCisJCXB1YmxpYyBpbnQgY29tcGFyZVRvKGZp
bmFsIFRhYmxlTWVtYmVyIGFuT3RoZXIsIGZpbmFsIGludCB0YWJsZUNvbHVtSW5kZXgpIHsK
KwkJCWZpbmFsIFN0cmluZyBjMSA9IChTdHJpbmcpIGdldFZhbHVlQXQodGFibGVDb2x1bUlu
ZGV4KTsKKwkJCWZpbmFsIFN0cmluZyBjMiA9IChTdHJpbmcpIGFuT3RoZXIuZ2V0VmFsdWVB
dCh0YWJsZUNvbHVtSW5kZXgpOworCQkJcmV0dXJuIGMxLmNvbXBhcmVUb0lnbm9yZUNhc2Uo
YzIpOworCQl9CisJfQorCQorCWNsYXNzIFRhYmxlUG9wdXBNZW51TW91c2VMaXN0ZW5lciBp
bXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIgeworCQlwdWJsaWMgdm9pZCBtb3VzZVJlbGVhc2Vk
KGZpbmFsIE1vdXNlRXZlbnQgZXZlbnQpIHsKKwkJCW1heWJlU2hvd1BvcHVwKGV2ZW50KTsK
KwkJfQorCQlwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoZmluYWwgTW91c2VFdmVudCBldmVu
dCkgeworCQkJbWF5YmVTaG93UG9wdXAoZXZlbnQpOworCQl9CisJCXB1YmxpYyB2b2lkIG1v
dXNlQ2xpY2tlZChmaW5hbCBNb3VzZUV2ZW50IGV2ZW50KSB7fQorCQlwdWJsaWMgdm9pZCBt
b3VzZUVudGVyZWQoZmluYWwgTW91c2VFdmVudCBldmVudCkge30KKwkJcHVibGljIHZvaWQg
bW91c2VFeGl0ZWQoZmluYWwgTW91c2VFdmVudCBldmVudCkge30KKworCQlwcm90ZWN0ZWQg
dm9pZCBtYXliZVNob3dQb3B1cChmaW5hbCBNb3VzZUV2ZW50IGUpIHsKKwkJCWlmKCBlLmlz
UG9wdXBUcmlnZ2VyKCkgKSB7CisJCQkJaWYoIHRyYWNrZWREb3dubG9hZHNUYWJsZS5nZXRT
ZWxlY3RlZFJvd0NvdW50KCkgPiAwICkgeworCQkJCQkvLyBkb24ndCBzaG93IG1lbnUgaWYg
bm90aGluZyBpcyBzZWxlY3RlZAorCQkJCQl0YWJsZVBvcHVwTWVudS5zaG93KHRyYWNrZWRE
b3dubG9hZHNUYWJsZSwgZS5nZXRYKCksIGUuZ2V0WSgpKTsKKwkJCQl9CisJCQl9CisJCX0K
Kwl9Cit9CkluZGV4OiBzb3VyY2UvZnJvc3QvZ3VpL21vZGVsL0FkZE5ld0Rvd25sb2Fkc1Rh
YmxlTW9kZWwuamF2YQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIHNvdXJjZS9mcm9zdC9ndWkvbW9k
ZWwvQWRkTmV3RG93bmxvYWRzVGFibGVNb2RlbC5qYXZhCShyZXZpc2lvbiAwKQ0KKysrIHNv
dXJjZS9mcm9zdC9ndWkvbW9kZWwvQWRkTmV3RG93bmxvYWRzVGFibGVNb2RlbC5qYXZhCShy
ZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSw3MiBAQA0KKy8qCisgIEFkZE5ld0Rvd25sb2Fkc1Rh
YmxlTW9kZWwuamF2YSAvIEZyb3N0CisgIENvcHlyaWdodCAoQykgMjAxMCAgRnJvc3QgUHJv
amVjdCA8anRjZnJvc3Quc291cmNlZm9yZ2UubmV0PgorCisgIFRoaXMgcHJvZ3JhbSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
YXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
ciB2ZXJzaW9uIDIgb2YKKyAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBH
TlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlCisgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRv
IHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwg
Q2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KK3BhY2thZ2UgZnJvc3QuZ3VpLm1vZGVs
OworCitpbXBvcnQgZnJvc3QudXRpbC5ndWkudHJhbnNsYXRpb24uTGFuZ3VhZ2U7CisKK3B1
YmxpYyBjbGFzcyBBZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsIGV4dGVuZHMgU29ydGVkVGFi
bGVNb2RlbHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQg
PSAxTDsKKworCXByaXZhdGUgTGFuZ3VhZ2UgbGFuZ3VhZ2UgPSBudWxsOworCisJcHJvdGVj
dGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29sdW1uTmFtZXNbXSA9IG5ldyBTdHJpbmdbNV07
CisKKwlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIENsYXNzPD8+IGNvbHVtbkNsYXNzZXNbXSA9
ICB7CisJCVN0cmluZy5jbGFzcywKKwkJU3RyaW5nLmNsYXNzLAorCQlTdHJpbmcuY2xhc3Ms
CisJCVN0cmluZy5jbGFzcywKKwkJU3RyaW5nLmNsYXNzCisJfTsKKworCXB1YmxpYyBBZGRO
ZXdEb3dubG9hZHNUYWJsZU1vZGVsKCkgeworCQlzdXBlcigpOworCQlsYW5ndWFnZSA9IExh
bmd1YWdlLmdldEluc3RhbmNlKCk7CisJCXJlZnJlc2hMYW5ndWFnZSgpOworCX0KKworCXBy
aXZhdGUgdm9pZCByZWZyZXNoTGFuZ3VhZ2UoKSB7CisJCWNvbHVtbk5hbWVzWzBdID0gbGFu
Z3VhZ2UuZ2V0U3RyaW5nKCJBZGROZXdEb3dubG9hZHNEaWFsb2cudGFibGUubmFtZSIpOwor
CQljb2x1bW5OYW1lc1sxXSA9IGxhbmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRz
RGlhbG9nLnRhYmxlLmtleSIpOworCQljb2x1bW5OYW1lc1syXSA9IGxhbmd1YWdlLmdldFN0
cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLnRhYmxlLnByaW9yaXR5Iik7CisJCWNvbHVt
bk5hbWVzWzNdID0gbGFuZ3VhZ2UuZ2V0U3RyaW5nKCJBZGROZXdEb3dubG9hZHNEaWFsb2cu
dGFibGUuZG93bmxvYWREaXIiKTsKKwkJY29sdW1uTmFtZXNbNF0gPSBsYW5ndWFnZS5nZXRT
dHJpbmcoIkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy50YWJsZS5jb21tZW50Iik7CisJfQorCisJ
cHVibGljIGJvb2xlYW4gaXNDZWxsRWRpdGFibGUoaW50IHJvdywgaW50IGNvbCkgeworCQly
ZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBj
b2x1bW4pIHsKKwkJaWYoIGNvbHVtbiA+PSAwICYmIGNvbHVtbiA8IGNvbHVtbk5hbWVzLmxl
bmd0aCApCisJCQlyZXR1cm4gY29sdW1uTmFtZXNbY29sdW1uXTsKKwkJcmV0dXJuIG51bGw7
CisJfQorCisJcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsKKwkJcmV0dXJuIGNvbHVt
bk5hbWVzLmxlbmd0aDsKKwl9CisKKwlwdWJsaWMgQ2xhc3M8Pz4gZ2V0Q29sdW1uQ2xhc3Mo
aW50IGNvbHVtbikgeworCQlpZiggY29sdW1uID49IDAgJiYgY29sdW1uIDwgY29sdW1uQ2xh
c3Nlcy5sZW5ndGggKQorCQkJcmV0dXJuIGNvbHVtbkNsYXNzZXNbY29sdW1uXTsKKwkJcmV0
dXJuIG51bGw7CisJfQorCit9CkluZGV4OiBzb3VyY2UvZnJvc3QvZ3VpL21vZGVsL1RyYWNr
ZWREb3dubG9hZHNNb2RlbC5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc291cmNlL2Zyb3N0
L2d1aS9tb2RlbC9UcmFja2VkRG93bmxvYWRzTW9kZWwuamF2YQkocmV2aXNpb24gMCkNCisr
KyBzb3VyY2UvZnJvc3QvZ3VpL21vZGVsL1RyYWNrZWREb3dubG9hZHNNb2RlbC5qYXZhCShy
ZXZpc2lvbiAwKQ0KQEAgLTAsMCArMSw3MSBAQA0KKy8qCisgIFRyYWNrZWREb3dubG9hZHNN
b2RlbC5qYXZhIC8gRnJvc3QKKyAgQ29weXJpZ2h0IChDKSAyMDEwICBGcm9zdCBQcm9qZWN0
IDxqdGNmcm9zdC5zb3VyY2Vmb3JnZS5uZXQ+CisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwor
ICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl
cnNpb24gMiBvZgorICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQor
ICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhl
IEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1i
cmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworcGFja2FnZSBmcm9zdC5ndWkubW9kZWw7CisK
K2ltcG9ydCBmcm9zdC51dGlsLmd1aS50cmFuc2xhdGlvbi5MYW5ndWFnZTsKKworcHVibGlj
IGNsYXNzIFRyYWNrZWREb3dubG9hZHNNb2RlbCBleHRlbmRzIFNvcnRlZFRhYmxlTW9kZWwg
eworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwor
CisJcHJpdmF0ZSBMYW5ndWFnZSBsYW5ndWFnZSA9IG51bGw7CisKKwlwcm90ZWN0ZWQgZmlu
YWwgc3RhdGljIFN0cmluZyBjb2x1bW5OYW1lc1tdID0gbmV3IFN0cmluZ1s1XTsKKworCXBy
b3RlY3RlZCBmaW5hbCBzdGF0aWMgQ2xhc3M8Pz4gY29sdW1uQ2xhc3Nlc1tdID0gIHsKKwkJ
U3RyaW5nLmNsYXNzLAorCQlTdHJpbmcuY2xhc3MsCisJCVN0cmluZy5jbGFzcywKKwkJU3Ry
aW5nLmNsYXNzLAorCQlTdHJpbmcuY2xhc3MKKwl9OworCisJcHVibGljIFRyYWNrZWREb3du
bG9hZHNNb2RlbCgpIHsKKwkJc3VwZXIoKTsKKwkJbGFuZ3VhZ2UgPSBMYW5ndWFnZS5nZXRJ
bnN0YW5jZSgpOworCQlyZWZyZXNoTGFuZ3VhZ2UoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQg
cmVmcmVzaExhbmd1YWdlKCkgeworCQljb2x1bW5OYW1lc1swXSA9IGxhbmd1YWdlLmdldFN0
cmluZygiTWFuYWdlRG93bmxvYWRUcmFja2luZ0RpYWxvZy50YWJsZS5uYW1lIik7CisJCWNv
bHVtbk5hbWVzWzFdID0gbGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNYW5hZ2VEb3dubG9hZFRyYWNr
aW5nRGlhbG9nLnRhYmxlLmtleSIpOworCQljb2x1bW5OYW1lc1syXSA9IGxhbmd1YWdlLmdl
dFN0cmluZygiTWFuYWdlRG93bmxvYWRUcmFja2luZ0RpYWxvZy50YWJsZS5ib2FyZCIpOwor
CQljb2x1bW5OYW1lc1szXSA9IGxhbmd1YWdlLmdldFN0cmluZygiTWFuYWdlRG93bmxvYWRU
cmFja2luZ0RpYWxvZy50YWJsZS5zaXplIik7CisJCWNvbHVtbk5hbWVzWzRdID0gbGFuZ3Vh
Z2UuZ2V0U3RyaW5nKCJNYW5hZ2VEb3dubG9hZFRyYWNraW5nRGlhbG9nLnRhYmxlLmZpbmlz
aGVkIik7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNDZWxsRWRpdGFibGUoaW50IHJvdywg
aW50IGNvbCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRD
b2x1bW5OYW1lKGludCBjb2x1bW4pIHsKKwkJaWYoIGNvbHVtbiA+PSAwICYmIGNvbHVtbiA8
IGNvbHVtbk5hbWVzLmxlbmd0aCApCisJCQlyZXR1cm4gY29sdW1uTmFtZXNbY29sdW1uXTsK
KwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsK
KwkJcmV0dXJuIGNvbHVtbk5hbWVzLmxlbmd0aDsKKwl9CisKKwlwdWJsaWMgQ2xhc3M8Pz4g
Z2V0Q29sdW1uQ2xhc3MoaW50IGNvbHVtbikgeworCQlpZiggY29sdW1uID49IDAgJiYgY29s
dW1uIDwgY29sdW1uQ2xhc3Nlcy5sZW5ndGggKQorCQkJcmV0dXJuIGNvbHVtbkNsYXNzZXNb
Y29sdW1uXTsKKwkJcmV0dXJuIG51bGw7CisJfQorfQpJbmRleDogc291cmNlL2Zyb3N0L2d1
aS9wcmVmZXJlbmNlcy9Eb3dubG9hZFBhbmVsLmphdmENCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBz
b3VyY2UvZnJvc3QvZ3VpL3ByZWZlcmVuY2VzL0Rvd25sb2FkUGFuZWwuamF2YQkocmV2aXNp
b24gMzE5MikNCisrKyBzb3VyY2UvZnJvc3QvZ3VpL3ByZWZlcmVuY2VzL0Rvd25sb2FkUGFu
ZWwuamF2YQkod29ya2luZyBjb3B5KQ0KQEAgLTYyLDYgKzYyLDggQEANCiAgICAgcHJpdmF0
ZSBmaW5hbCBKQ2hlY2tCb3ggbG9nRG93bmxvYWRzQ2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94
KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBKQ2hlY2tCb3ggdHJhY2tEb3dubG9hZHNDaGVja0Jv
eCA9IG5ldyBKQ2hlY2tCb3goKTsKIAorICAgIHByaXZhdGUgZmluYWwgSkNoZWNrQm94IHVz
ZUJvYXJkbmFtZURvd25sb2FkU3ViZm9sZGVyQ2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCk7
CisKICAgICBwcml2YXRlIGZpbmFsIEpMYWJlbCB3YWl0VGltZUxhYmVsID0gbmV3IEpMYWJl
bCgpOwogICAgIHByaXZhdGUgZmluYWwgSlRleHRGaWVsZCB3YWl0VGltZVRleHRGaWVsZCA9
IG5ldyBKVGV4dEZpZWxkKDYpOwogCkBAIC0xOTIsNiArMTk0LDEzIEBADQogICAgICAgICBj
b25zdHJhaW50cy5ncmlkeCA9IDA7CiAgICAgICAgIGNvbnN0cmFpbnRzLmdyaWR3aWR0aCA9
IDM7CiAgICAgICAgIGNvbnN0cmFpbnRzLmluc2V0cyA9IGluc2V0czA1NTU7CisgICAgICAg
IGNvbnN0cmFpbnRzLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7Cisg
ICAgICAgIGFkZCh1c2VCb2FyZG5hbWVEb3dubG9hZFN1YmZvbGRlckNoZWNrQm94LCBjb25z
dHJhaW50cyk7CisKKyAgICAgICAgY29uc3RyYWludHMuZ3JpZHkrKzsKKyAgICAgICAgY29u
c3RyYWludHMuZ3JpZHggPSAwOworICAgICAgICBjb25zdHJhaW50cy5ncmlkd2lkdGggPSAz
OworICAgICAgICBjb25zdHJhaW50cy5pbnNldHMgPSBpbnNldHMwNTU1OwogICAgICAgICBh
ZGQoZW5mb3JjZUZyb3N0UHJpb3JpdHlGaWxlRG93bmxvYWQsIGNvbnN0cmFpbnRzKTsKIAog
ICAgICAgICBjb25zdHJhaW50cy5ncmlkeSsrOwpAQCAtMjI5LDYgKzIzOCw3IEBADQogICAg
ICAgICB3YWl0VGltZVRleHRGaWVsZC5zZXRUZXh0KCIiICsgc2V0dGluZ3MuZ2V0SW50VmFs
dWUoU2V0dGluZ3NDbGFzcy5ET1dOTE9BRF9XQUlUVElNRSkpOwogICAgICAgICBsb2dEb3du
bG9hZHNDaGVja0JveC5zZXRTZWxlY3RlZChzZXR0aW5ncy5nZXRCb29sVmFsdWUoU2V0dGlu
Z3NDbGFzcy5MT0dfRE9XTkxPQURTX0VOQUJMRUQpKTsKICAgICAgICAgdHJhY2tEb3dubG9h
ZHNDaGVja0JveC5zZXRTZWxlY3RlZChzZXR0aW5ncy5nZXRCb29sVmFsdWUoU2V0dGluZ3ND
bGFzcy5UUkFDS19ET1dOTE9BRFNfRU5BQkxFRCkpOworICAgICAgICB1c2VCb2FyZG5hbWVE
b3dubG9hZFN1YmZvbGRlckNoZWNrQm94LnNldFNlbGVjdGVkKHNldHRpbmdzLmdldEJvb2xW
YWx1ZShTZXR0aW5nc0NsYXNzLlVTRV9CT0FSRE5BTUVfRE9XTkxPQURfU1VCRk9MREVSX0VO
QUJMRUQpKTsKICAgICAgICAgcHJpb3JpdHlUZXh0RmllbGQuc2V0VGV4dChzZXR0aW5ncy5n
ZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkZDUDJfREVGQVVMVF9QUklPX0ZJTEVfRE9XTkxPQUQp
KTsKICAgICAgICAgZW5mb3JjZUZyb3N0UHJpb3JpdHlGaWxlRG93bmxvYWQuc2V0U2VsZWN0
ZWQoc2V0dGluZ3MuZ2V0Qm9vbFZhbHVlKFNldHRpbmdzQ2xhc3MuRkNQMl9FTkZPUkNFX0ZS
T1NUX1BSSU9fRklMRV9ET1dOTE9BRCkpOwogICAgICAgICBleGVjVGV4dEZpZWxkLnNldFRl
eHQoc2V0dGluZ3MuZ2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5FWEVDX09OX0RPV05MT0FEKSk7
CkBAIC0yNDYsNiArMjU2LDggQEANCiAKICAgICAgICAgbG9nRG93bmxvYWRzQ2hlY2tCb3gu
c2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIk9wdGlvbnMuZG93bmxvYWRzLmxvZ0Rvd25s
b2FkcyIpKTsKICAgICAgICAgdHJhY2tEb3dubG9hZHNDaGVja0JveC5zZXRUZXh0KGxhbmd1
YWdlLmdldFN0cmluZygiT3B0aW9ucy5kb3dubG9hZHMudHJhY2tEb3dubG9hZHMiKSk7Cisg
ICAgICAgIAorICAgICAgICB1c2VCb2FyZG5hbWVEb3dubG9hZFN1YmZvbGRlckNoZWNrQm94
LnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJPcHRpb25zLmRvd25sb2Fkcy51c2VCb2Fy
ZG5hbWVEb3dubG9hZFN1YmZvbGRlciIpKTsKIAogICAgICAgICBkaXJlY3RvcnlMYWJlbC5z
ZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiT3B0aW9ucy5kb3dubG9hZHMuZG93bmxvYWRE
aXJlY3RvcnkiKSk7CiAgICAgICAgIGJyb3dzZURpcmVjdG9yeUJ1dHRvbi5zZXRUZXh0KGxh
bmd1YWdlLmdldFN0cmluZygiQ29tbW9uLmJyb3dzZSIpICsgIi4uLiIpOwpAQCAtMjc3LDYg
KzI4OSw3IEBADQogCiAgICAgICAgIHNldHRpbmdzLnNldFZhbHVlKFNldHRpbmdzQ2xhc3Mu
TE9HX0RPV05MT0FEU19FTkFCTEVELCBsb2dEb3dubG9hZHNDaGVja0JveC5pc1NlbGVjdGVk
KCkpOwogICAgICAgICBzZXR0aW5ncy5zZXRWYWx1ZShTZXR0aW5nc0NsYXNzLlRSQUNLX0RP
V05MT0FEU19FTkFCTEVELCB0cmFja0Rvd25sb2Fkc0NoZWNrQm94LmlzU2VsZWN0ZWQoKSk7
CisgICAgICAgIHNldHRpbmdzLnNldFZhbHVlKFNldHRpbmdzQ2xhc3MuVVNFX0JPQVJETkFN
RV9ET1dOTE9BRF9TVUJGT0xERVJfRU5BQkxFRCwgdXNlQm9hcmRuYW1lRG93bmxvYWRTdWJm
b2xkZXJDaGVja0JveC5pc1NlbGVjdGVkKCkpOwogICAgICAgICBzZXR0aW5ncy5zZXRWYWx1
ZShTZXR0aW5nc0NsYXNzLkZDUDJfREVGQVVMVF9QUklPX0ZJTEVfRE9XTkxPQUQsIHByaW9y
aXR5VGV4dEZpZWxkLmdldFRleHQoKSk7CiAgICAgICAgIHNldHRpbmdzLnNldFZhbHVlKFNl
dHRpbmdzQ2xhc3MuRkNQMl9FTkZPUkNFX0ZST1NUX1BSSU9fRklMRV9ET1dOTE9BRCwgZW5m
b3JjZUZyb3N0UHJpb3JpdHlGaWxlRG93bmxvYWQuaXNTZWxlY3RlZCgpKTsKIApJbmRleDog
c291cmNlL2Zyb3N0L01haW5GcmFtZS5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc291cmNl
L2Zyb3N0L01haW5GcmFtZS5qYXZhCShyZXZpc2lvbiAzMTkyKQ0KKysrIHNvdXJjZS9mcm9z
dC9NYWluRnJhbWUuamF2YQkod29ya2luZyBjb3B5KQ0KQEAgLTEwNCw2ICsxMDQsNyBAQA0K
ICAgICBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBvcHRpb25zUHJlZmVyZW5jZXNNZW51SXRl
bSA9IG5ldyBKTWVudUl0ZW0oKTsKICAgICBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBvcHRp
b25zTWFuYWdlTG9jYWxJZGVudGl0aWVzTWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CiAg
ICAgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gb3B0aW9uc01hbmFnZUlkZW50aXRpZXNNZW51
SXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKyAgICBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBv
cHRpb25zTWFuYWdlVHJhY2tlZERvd25sb2Fkc01lbnVJdGVtID0gbmV3IEpNZW51SXRlbSgp
OwogCiAgICAgLy9QbHVnaW4gTWVudQogICAgIHByaXZhdGUgZmluYWwgSk1lbnUgcGx1Z2lu
TWVudSA9IG5ldyBKTWVudSgpOwpAQCAtMjY1LDYgKzI2Niw3IEBADQogICAgICAgICAgICAg
ZmlsZVN0YXRpc3RpY3NNZW51SXRlbS5zZXRJY29uKE1pc2NUb29sa2l0LmdldFNjYWxlZElt
YWdlKCIvZGF0YS90b29sYmFyL3gtb2ZmaWNlLXNwcmVhZHNoZWV0LnBuZyIsIDE2LCAxNikp
OwogICAgICAgICAgICAgbG9va0FuZEZlZWxNZW51LnNldEljb24oTWlzY1Rvb2xraXQuZ2V0
U2NhbGVkSW1hZ2UoIi9kYXRhL3Rvb2xiYXIvcHJlZmVyZW5jZXMtZGVza3RvcC10aGVtZS5w
bmciLCAxNiwgMTYpKTsKICAgICAgICAgICAgIG9wdGlvbnNNYW5hZ2VJZGVudGl0aWVzTWVu
dUl0ZW0uc2V0SWNvbihNaXNjVG9vbGtpdC5nZXRTY2FsZWRJbWFnZSgiL2RhdGEvdG9vbGJh
ci9ncm91cC5wbmciLCAxNiwgMTYpKTsKKyAgICAgICAgICAgIC8vb3B0aW9uc01hbmFnZVRy
YWNrZWREb3dubG9hZHNNZW51SXRlbS5zZXRJY29uKE1pc2NUb29sa2l0LmdldFNjYWxlZElt
YWdlKCIvZGF0YS90b29sYmFyL2ZpbGVsaXN0LnBuZyIsIDE2LCAxNikpOwogICAgICAgICAg
ICAgb3B0aW9uc01hbmFnZUxvY2FsSWRlbnRpdGllc01lbnVJdGVtLnNldEljb24oTWlzY1Rv
b2xraXQuZ2V0U2NhbGVkSW1hZ2UoIi9kYXRhL3Rvb2xiYXIvdXNlci5wbmciLCAxNiwgMTYp
KTsKICAgICAgICAgICAgIG9wdGlvbnNQcmVmZXJlbmNlc01lbnVJdGVtLnNldEljb24oTWlz
Y1Rvb2xraXQuZ2V0U2NhbGVkSW1hZ2UoIi9kYXRhL3Rvb2xiYXIvcHJlZmVyZW5jZXMtc3lz
dGVtLnBuZyIsIDE2LCAxNikpOwogICAgICAgICAgICAgaGVscEFib3V0TWVudUl0ZW0uc2V0
SWNvbihNaXNjVG9vbGtpdC5nZXRTY2FsZWRJbWFnZSgiL2RhdGEvdG9vbGJhci9hd2FyZF9z
dGFyX3NpbHZlcl8zLnBuZyIsIDE2LCAxNikpOwpAQCAtMjk2LDYgKzI5OCwxMSBAQA0KICAg
ICAgICAgICAgICAgICAgICAgb3B0aW9uc01hbmFnZUlkZW50aXRpZXNNZW51SXRlbV9hY3Rp
b25QZXJmb3JtZWQoZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7Cisg
ICAgICAgICAgICBvcHRpb25zTWFuYWdlVHJhY2tlZERvd25sb2Fkc01lbnVJdGVtLmFkZEFj
dGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIAlwdWJs
aWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgeworICAgICAg
ICAgICAgCQlvcHRpb25zTWFuYWdlVHJhY2tlZERvd25sb2Fkc01lbnVJdGVtX2FjdGlvblBl
cmZvcm1lZChlKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICB9KTsKICAgICAgICAg
ICAgIHBsdWdpblRyYW5zbGF0ZU1lbnVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rp
b25MaXN0ZW5lcigpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJm
b3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgewogICAgICAgICAgICAgICAgIAlnZXRUcmFu
c2xhdGlvbkRpYWxvZygpLnNldFZpc2libGUodHJ1ZSk7CkBAIC0zMzgsNiArMzQ1LDcgQEAN
CiAgICAgICAgICAgICAvLyBPcHRpb25zIE1lbnUKICAgICAgICAgICAgIG9wdGlvbnNNZW51
LmFkZChvcHRpb25zTWFuYWdlTG9jYWxJZGVudGl0aWVzTWVudUl0ZW0pOwogICAgICAgICAg
ICAgb3B0aW9uc01lbnUuYWRkKG9wdGlvbnNNYW5hZ2VJZGVudGl0aWVzTWVudUl0ZW0pOwor
ICAgICAgICAgICAgb3B0aW9uc01lbnUuYWRkKG9wdGlvbnNNYW5hZ2VUcmFja2VkRG93bmxv
YWRzTWVudUl0ZW0pOwogICAgICAgICAgICAgb3B0aW9uc01lbnUuYWRkU2VwYXJhdG9yKCk7
CiAgICAgICAgICAgICBvcHRpb25zTWVudS5hZGQoIGxvb2tBbmRGZWVsTWVudSApOwogICAg
ICAgICAgICAgb3B0aW9uc01lbnUuYWRkU2VwYXJhdG9yKCk7CkBAIC02OTUsNiArNzAzLDEw
IEBADQogICAgICAgICBuZXcgSWRlbnRpdGllc0Jyb3dzZXIodGhpcykuc3RhcnREaWFsb2co
KTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgb3B0aW9uc01hbmFnZVRyYWNrZWREb3du
bG9hZHNNZW51SXRlbV9hY3Rpb25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgewor
ICAgIAluZXcgTWFuYWdlVHJhY2tlZERvd25sb2Fkcyh0aGlzKS5zdGFydERpYWxvZygpOwor
ICAgIH0KKwogICAgIC8qKgogICAgICAqIFJlZnJlc2ggdGhlIHRleHRzIGluIE1haW5GcmFt
ZSB3aXRoIG5ldyBsYW5ndWFnZS4KICAgICAgKi8KQEAgLTc5OSw2ICs4MTEsNyBAQA0KICAg
ICAgICAgb3B0aW9uc1ByZWZlcmVuY2VzTWVudUl0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRT
dHJpbmcoIk1haW5GcmFtZS5tZW51Lm9wdGlvbnMucHJlZmVyZW5jZXMiKSk7CiAgICAgICAg
IG9wdGlvbnNNYW5hZ2VMb2NhbElkZW50aXRpZXNNZW51SXRlbS5zZXRUZXh0KGxhbmd1YWdl
LmdldFN0cmluZygiTWFpbkZyYW1lLm1lbnUub3B0aW9ucy5tYW5hZ2VMb2NhbElkZW50aXRp
ZXMiKSk7CiAgICAgICAgIG9wdGlvbnNNYW5hZ2VJZGVudGl0aWVzTWVudUl0ZW0uc2V0VGV4
dChsYW5ndWFnZS5nZXRTdHJpbmcoIk1haW5GcmFtZS5tZW51Lm9wdGlvbnMubWFuYWdlSWRl
bnRpdGllcyIpKTsKKyAgICAgICAgb3B0aW9uc01hbmFnZVRyYWNrZWREb3dubG9hZHNNZW51
SXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiTWFpbkZyYW1lLm1lbnUub3B0aW9u
cy5tYW5hZ2VUcmFja2VkRG93bmxvYWRzIikpOwogICAgICAgICBwbHVnaW5NZW51LnNldFRl
eHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNYWluRnJhbWUubWVudS5wbHVnaW5zIikpOwogICAg
ICAgICBwbHVnaW5UcmFuc2xhdGVNZW51SXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmlu
ZygiTWFpbkZyYW1lLm1lbnUucGx1Z2lucy50cmFuc2xhdGVGcm9zdCIpKTsKICAgICAgICAg
bGFuZ3VhZ2VNZW51LnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNYWluRnJhbWUubWVu
dS5sYW5ndWFnZSIpKTsKSW5kZXg6IHNvdXJjZS9mcm9zdC9tZXNzYWdpbmcvZnJvc3QvZ3Vp
L01lc3NhZ2VUZXh0UGFuZS5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc291cmNlL2Zyb3N0
L21lc3NhZ2luZy9mcm9zdC9ndWkvTWVzc2FnZVRleHRQYW5lLmphdmEJKHJldmlzaW9uIDMx
OTIpDQorKysgc291cmNlL2Zyb3N0L21lc3NhZ2luZy9mcm9zdC9ndWkvTWVzc2FnZVRleHRQ
YW5lLmphdmEJKHdvcmtpbmcgY29weSkNCkBAIC03MjksOCArNzI5LDE4IEBADQogICAgICAg
ICAgKi8KICAgICAgICAgcHJpdmF0ZSB2b2lkIGRvd25sb2FkQXR0YWNobWVudHMoKSB7CiAg
ICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxGaWxlQXR0YWNobWVudD4gaXQgPSBnZXRJdGVt
cygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIExpc3Q8RnJvc3RE
b3dubG9hZEl0ZW0+IGZyb3N0RG93bmxvYWRJdGVtTGlzdCA9IG5ldyBMaW5rZWRMaXN0PEZy
b3N0RG93bmxvYWRJdGVtPigpOworICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEZyb3N0
RG93bmxvYWRJdGVtPiBmcm9zdERvd25sb2FkSXRlbUtleU1hcCA9IG5ldyBIYXNoTWFwPFN0
cmluZywgRnJvc3REb3dubG9hZEl0ZW0+KCk7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmlu
ZywgRnJvc3REb3dubG9hZEl0ZW0+IGZyb3N0RG93bmxvYWRJdGVtTmFtZU1hcCA9IG5ldyBI
YXNoTWFwPFN0cmluZywgRnJvc3REb3dubG9hZEl0ZW0+KCk7CisgICAgICAgICAgICAKICAg
ICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgICAgICBmaW5h
bCBGaWxlQXR0YWNobWVudCBmYSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICBpZiggZnJvc3REb3dubG9hZEl0ZW1LZXlNYXAuY29udGFpbnNLZXko
ZmEuZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICAJCWNvbnRpbnVlOworICAgICAgICAgICAg
CX0KKyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUg
PSBmYS5nZXRGaWxlbmFtZSgpOwogICAgICAgICAgICAgICAgIC8vIG1heWJlIGNvbnZlcnQg
aHRtbCBjb2RlcyAoZS5nLiAlMmMgLT4gLCApCiAgICAgICAgICAgICAgICAgaWYoIGZpbGVu
YW1lLmluZGV4T2YoIiUiKSA+IDAgKSB7CkBAIC03NDAsMTIgKzc1MCwzNCBAQA0KICAgICAg
ICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCAiRGVjb2RlIG9m
IEhUTUwgY29kZSBmYWlsZWQiLCBleCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0g
ZGxJdGVtID0gbmV3IEZyb3N0RG93bmxvYWRJdGVtKAotICAgICAgICAgICAgICAgICAgICAg
ICAgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYS5nZXRLZXkoKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGZhLmdldEZpbGVTaXplKCkpOwotICAgICAgICAgICAg
ICAgIGdldERvd25sb2FkTW9kZWwoKS5hZGREb3dubG9hZEl0ZW0oZGxJdGVtKTsKKyAgICAg
ICAgICAgICAgICBpZiggZnJvc3REb3dubG9hZEl0ZW1OYW1lTWFwLmNvbnRhaW5zS2V5KGZp
bGVuYW1lKSkgeworICAgICAgICAgICAgICAgIAljb250aW51ZTsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZnJvc3REd29u
bG9hZEl0ZW0gPSBuZXcgRnJvc3REb3dubG9hZEl0ZW0oCisJICAgICAgICAgICAgICAgIGZp
bGVuYW1lLAorCSAgICAgICAgICAgICAgICBmYS5nZXRLZXkoKSwKKwkgICAgICAgICAgICAg
ICAgZmEuZ2V0RmlsZVNpemUoKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgZnJvc3REd29ubG9hZEl0ZW0uc2V0QXNzb2NpYXRlZE1l
c3NhZ2VJZChzZWxlY3RlZE1lc3NhZ2UuZ2V0TWVzc2FnZUlkKCkpOworICAgICAgICAgICAg
ICAgIGZyb3N0RHdvbmxvYWRJdGVtLnNldEFzc29jaWF0ZWRCb2FyZE5hbWUoc2VsZWN0ZWRN
ZXNzYWdlLmdldEJvYXJkKCkuZ2V0Qm9hcmRGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgICAg
ICBpZiggQ29yZS5mcm9zdFNldHRpbmdzLmdldEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNzLlVT
RV9CT0FSRE5BTUVfRE9XTkxPQURfU1VCRk9MREVSX0VOQUJMRUQpICl7CisgICAgICAgICAg
ICAgICAgCWZyb3N0RHdvbmxvYWRJdGVtLnNldERvd25sb2FkRGlyKGZyb3N0RHdvbmxvYWRJ
dGVtLmdldERvd25sb2FkRGlyKCkuY29uY2F0KGZyb3N0RHdvbmxvYWRJdGVtLmdldEFzc29j
aWF0ZWRCb2FyZE5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBmcm9zdERvd25sb2FkSXRlbUxpc3QuYWRkKCBmcm9zdER3b25sb2FkSXRlbSApOworICAg
ICAgICAgICAgICAgIGZyb3N0RG93bmxvYWRJdGVtS2V5TWFwLnB1dChmYS5nZXRLZXkoKSwg
ZnJvc3REd29ubG9hZEl0ZW0pOworICAgICAgICAgICAgICAgIGZyb3N0RG93bmxvYWRJdGVt
TmFtZU1hcC5wdXQoZmlsZW5hbWUsIGZyb3N0RHdvbmxvYWRJdGVtKTsKICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZnJvc3REb3dubG9hZEl0ZW1LZXlNYXAu
Y2xlYXIoKTsKKyAgICAgICAgICAgIGZyb3N0RG93bmxvYWRJdGVtTmFtZU1hcC5jbGVhcigp
OworICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBBZGROZXdEb3dubG9hZHNEaWFs
b2cgYWRkTmV3RG93bmxvYWRzRGlhbG9nID0gbmV3IEFkZE5ld0Rvd25sb2Fkc0RpYWxvZyht
YWluRnJhbWUsIGZyb3N0RG93bmxvYWRJdGVtTGlzdCk7CisgICAgICAgICAgICBmcm9zdERv
d25sb2FkSXRlbUxpc3QgPSBhZGROZXdEb3dubG9hZHNEaWFsb2cuc3RhcnREaWFsb2coZnJv
c3REb3dubG9hZEl0ZW1MaXN0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKGZp
bmFsIEZyb3N0RG93bmxvYWRJdGVtIGZyb3N0RG93bmxvYWRJdGVtIDogZnJvc3REb3dubG9h
ZEl0ZW1MaXN0ICkgeworICAgICAgICAgICAgCWdldERvd25sb2FkTW9kZWwoKS5hZGREb3du
bG9hZEl0ZW0oZnJvc3REb3dubG9hZEl0ZW0pOworICAgICAgICAgICAgfQogICAgICAgICB9
CiAKICAgICAgICAgLyoqCkBAIC04ODIsMTIgKzkxNCwxOSBAQA0KICAgICAgICAgICAgIGlm
KCBpdGVtcyA9PSBudWxsICkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgTGlzdDxGcm9zdERvd25sb2FkSXRl
bT4gZnJvc3REb3dubG9hZEl0ZW1MaXN0ID0gbmV3IExpbmtlZExpc3Q8RnJvc3REb3dubG9h
ZEl0ZW0+KCk7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRnJvc3REb3dubG9hZEl0
ZW0+IGZyb3N0RG93bmxvYWRJdGVtS2V5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGcm9z
dERvd25sb2FkSXRlbT4oKTsKKyAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBGcm9zdERv
d25sb2FkSXRlbT4gZnJvc3REb3dubG9hZEl0ZW1OYW1lTWFwID0gbmV3IEhhc2hNYXA8U3Ry
aW5nLCBGcm9zdERvd25sb2FkSXRlbT4oKTsKIAotICAgICAgICAgICAgZm9yKCBmaW5hbCBT
dHJpbmcgaXRlbSA6IGl0ZW1zICkgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXk7Ci0g
ICAgICAgICAgICAgICAgLy8gMC43OiB1c2Uga2V5L2ZpbGVuYW1lCi0gICAgICAgICAgICAg
ICAga2V5ID0gaXRlbTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGl0ZW0uc3Vi
c3RyaW5nKGl0ZW0ubGFzdEluZGV4T2YoIi8iKSsxKTsKKyAgICAgICAgICAgIGZvciggZmlu
YWwgU3RyaW5nIGtleSA6IGl0ZW1zICkgeworICAgICAgICAgICAgCWlmKCBmcm9zdERvd25s
b2FkSXRlbUtleU1hcC5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAJCWNvbnRp
bnVlOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkKKworICAgICAgICAgICAgCQor
ICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0ga2V5LnN1YnN0cmluZyhrZXkubGFzdElu
ZGV4T2YoIi8iKSsxKTsKICAgICAgICAgICAgICAgICAvLyBtYXliZSBjb252ZXJ0IGh0bWwg
Y29kZXMgKGUuZy4gJTJjIC0+ICwgKQogICAgICAgICAgICAgICAgIGlmKCBuYW1lLmluZGV4
T2YoIiUiKSA+IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CkBAIC04OTYsOSAr
OTM1LDI5IEBADQogICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5T
RVZFUkUsICJEZWNvZGUgb2YgSFRNTCBjb2RlIGZhaWxlZCIsIGV4KTsKICAgICAgICAgICAg
ICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBG
cm9zdERvd25sb2FkSXRlbSBkbEl0ZW0gPSBuZXcgRnJvc3REb3dubG9hZEl0ZW0obmFtZSwg
a2V5KTsKLSAgICAgICAgICAgICAgICBnZXREb3dubG9hZE1vZGVsKCkuYWRkRG93bmxvYWRJ
dGVtKGRsSXRlbSk7CisgICAgICAgICAgICAgICAgaWYoIGZyb3N0RG93bmxvYWRJdGVtTmFt
ZU1hcC5jb250YWluc0tleShuYW1lKSkgeworICAgICAgICAgICAgICAgIAljb250aW51ZTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
RnJvc3REb3dubG9hZEl0ZW0gZnJvc3REd29ubG9hZEl0ZW0gPSBuZXcgRnJvc3REb3dubG9h
ZEl0ZW0obmFtZSwga2V5KTsKKyAgICAgICAgICAgICAgICBmcm9zdER3b25sb2FkSXRlbS5z
ZXRBc3NvY2lhdGVkTWVzc2FnZUlkKHNlbGVjdGVkTWVzc2FnZS5nZXRNZXNzYWdlSWQoKSk7
CisgICAgICAgICAgICAgICAgZnJvc3REd29ubG9hZEl0ZW0uc2V0QXNzb2NpYXRlZEJvYXJk
TmFtZShzZWxlY3RlZE1lc3NhZ2UuZ2V0Qm9hcmQoKS5nZXRCb2FyZEZpbGVuYW1lKCkpOwor
ICAgICAgICAgICAgICAgIGlmKCBDb3JlLmZyb3N0U2V0dGluZ3MuZ2V0Qm9vbFZhbHVlKFNl
dHRpbmdzQ2xhc3MuVVNFX0JPQVJETkFNRV9ET1dOTE9BRF9TVUJGT0xERVJfRU5BQkxFRCkg
KXsKKyAgICAgICAgICAgICAgICAJZnJvc3REd29ubG9hZEl0ZW0uc2V0RG93bmxvYWREaXIo
ZnJvc3REd29ubG9hZEl0ZW0uZ2V0RG93bmxvYWREaXIoKS5jb25jYXQoZnJvc3REd29ubG9h
ZEl0ZW0uZ2V0QXNzb2NpYXRlZEJvYXJkTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIGZyb3N0RG93bmxvYWRJdGVtTGlzdC5hZGQoIGZyb3N0RHdvbmxv
YWRJdGVtICk7CisgICAgICAgICAgICAgICAgZnJvc3REb3dubG9hZEl0ZW1LZXlNYXAucHV0
KGtleSwgZnJvc3REd29ubG9hZEl0ZW0pOworICAgICAgICAgICAgICAgIGZyb3N0RG93bmxv
YWRJdGVtTmFtZU1hcC5wdXQobmFtZSwgZnJvc3REd29ubG9hZEl0ZW0pOwogICAgICAgICAg
ICAgfQorICAgICAgICAgICAgZnJvc3REb3dubG9hZEl0ZW1LZXlNYXAuY2xlYXIoKTsKKyAg
ICAgICAgICAgIGZyb3N0RG93bmxvYWRJdGVtTmFtZU1hcC5jbGVhcigpOworICAgICAgICAg
ICAgCisgICAgICAgICAgICBmaW5hbCBBZGROZXdEb3dubG9hZHNEaWFsb2cgYWRkTmV3RG93
bmxvYWRzRGlhbG9nID0gbmV3IEFkZE5ld0Rvd25sb2Fkc0RpYWxvZyhtYWluRnJhbWUsIGZy
b3N0RG93bmxvYWRJdGVtTGlzdCk7CisgICAgICAgICAgICBmcm9zdERvd25sb2FkSXRlbUxp
c3QgPSBhZGROZXdEb3dubG9hZHNEaWFsb2cuc3RhcnREaWFsb2coZnJvc3REb3dubG9hZEl0
ZW1MaXN0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKGZpbmFsIEZyb3N0RG93
bmxvYWRJdGVtIGZyb3N0RG93bmxvYWRJdGVtIDogZnJvc3REb3dubG9hZEl0ZW1MaXN0ICkg
eworICAgICAgICAgICAgCWdldERvd25sb2FkTW9kZWwoKS5hZGREb3dubG9hZEl0ZW0oZnJv
c3REb3dubG9hZEl0ZW0pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAg
cHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0SXRlbXMoZmluYWwgYm9vbGVhbiBnZXRBbGwpIHsK
SW5kZXg6IHNvdXJjZS9mcm9zdC9TZXR0aW5nc0NsYXNzLmphdmENCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBzb3VyY2UvZnJvc3QvU2V0dGluZ3NDbGFzcy5qYXZhCShyZXZpc2lvbiAzMTkyKQ0K
KysrIHNvdXJjZS9mcm9zdC9TZXR0aW5nc0NsYXNzLmphdmEJKHdvcmtpbmcgY29weSkNCkBA
IC0yODEsNiArMjgxLDggQEANCiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBU
UkFDS19ET1dOTE9BRFNfRU5BQkxFRCA9ICJ0cmFja0Rvd25sb2FkcyI7CiAKKyAgICBwdWJs
aWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQk9BUkROQU1FX0RPV05MT0FEX1NVQkZPTERF
Ul9FTkFCTEVEID0gInVzZUJvYXJkbmFtZURvd25sb2FkU3ViZm9sZGVyIjsKKwogICAgIHB1
YmxpYyBTZXR0aW5nc0NsYXNzKCkgewogICAgICAgICBzZXR0aW5nc0hhc2ggPSBuZXcgSGFz
aHRhYmxlPFN0cmluZyxPYmplY3Q+KCk7CiAgICAgICAgIC8vIHRoZSBGSVggY29uZmlnLmRp
cgpAQCAtMTA0OCw2ICsxMDUwLDcgQEANCiAgICAgICAgIGRlZmF1bHRzLnB1dChMT0dfRE9X
TkxPQURTX0VOQUJMRUQsICJmYWxzZSIpOwogICAgICAgICBkZWZhdWx0cy5wdXQoTE9HX1VQ
TE9BRFNfRU5BQkxFRCwgImZhbHNlIik7CiAgICAgICAgIGRlZmF1bHRzLnB1dChUUkFDS19E
T1dOTE9BRFNfRU5BQkxFRCwgImZhbHNlIik7CisgICAgICAgIGRlZmF1bHRzLnB1dChVU0Vf
Qk9BUkROQU1FX0RPV05MT0FEX1NVQkZPTERFUl9FTkFCTEVELCAiZmFsc2UiKTsKIAogCiAg
ICAgICAgIGRlZmF1bHRzLnB1dChDT05GSVJNX01BUktfQUxMX01TR1NfUkVBRCwgInRydWUi
KTsKSW5kZXg6IHNvdXJjZS9mcm9zdC9zdG9yYWdlL3BlcnN0L1RyYWNrRG93bmxvYWRLZXlz
LmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzb3VyY2UvZnJvc3Qvc3RvcmFnZS9wZXJzdC9U
cmFja0Rvd25sb2FkS2V5cy5qYXZhCShyZXZpc2lvbiAzMTkyKQ0KKysrIHNvdXJjZS9mcm9z
dC9zdG9yYWdlL3BlcnN0L1RyYWNrRG93bmxvYWRLZXlzLmphdmEJKHdvcmtpbmcgY29weSkN
CkBAIC0xLDc3ICswLDAgQEANCi0vKg0KLSBUcmFja0Rvd25sb2FkS2V5cy5qYXZhIC8gRnJv
c3QNCi0gQ29weXJpZ2h0IChDKSAyMDEwICBGcm9zdCBQcm9qZWN0IDxqdGNmcm9zdC5zb3Vy
Y2Vmb3JnZS5uZXQ+DQotDQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCi0gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMNCi0gcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YNCi0g
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQot
DQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLA0KLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VDQotIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCi0NCi0gWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCi0gYWxv
bmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh
cmUNCi0gRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAy
MTM5LCBVU0EuDQotKi8NCi1wYWNrYWdlIGZyb3N0LnN0b3JhZ2UucGVyc3Q7DQotDQotaW1w
b3J0IG9yZy5nYXJyZXQucGVyc3QuKjsNCi0NCi0vKioNCi0gKiBSZXByZXNlbnRzIHRoZSBp
dGVtIGZvciB0aGUgVHJhY2tEb3dubG9hZEtleXMuDQotICovDQotcHVibGljIGNsYXNzIFRy
YWNrRG93bmxvYWRLZXlzIGV4dGVuZHMgUGVyc2lzdGVudCB7DQotDQotCXByaXZhdGUgU3Ry
aW5nIGNoa0tleTsNCi0JcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7DQotCXByaXZhdGUgU3Ry
aW5nIGJvYXJkTmFtZTsNCi0gICAgcHJpdmF0ZSBsb25nIGZpbGVTaXplOyANCi0JcHJpdmF0
ZSBsb25nIGRvd25sb2FkRmluaXNoZWRUaW1lOyAvLyB3aGVuIHdhcyB0aGlzIGRvd25sb2Fk
IGZpbmlzaGVkDQotDQotICAgIC8vIHVzZWQgYnkgcGVyc3QNCi0gICAgcHVibGljIFRyYWNr
RG93bmxvYWRLZXlzKCkge30NCi0gICAgDQotICAgIHB1YmxpYyBUcmFja0Rvd25sb2FkS2V5
cyhmaW5hbCBTdHJpbmcgY2hrS2V5LCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUsIA0KLSAgICAJ
CWZpbmFsIFN0cmluZyBib2FyZE5hbWUsIGxvbmcgZmlsZVNpemUsIGxvbmcgZG93bmxvYWRG
aW5pc2hlZFRpbWUpIHsNCi0gICAgICAgIHRoaXMuY2hrS2V5ID0gY2hrS2V5Ow0KLSAgICAg
ICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOw0KLSAgICAgICAgdGhpcy5ib2FyZE5hbWUg
PSBib2FyZE5hbWU7DQotICAgICAgICB0aGlzLmZpbGVTaXplID0gZmlsZVNpemU7DQotICAg
ICAgICB0aGlzLmRvd25sb2FkRmluaXNoZWRUaW1lID0gZG93bmxvYWRGaW5pc2hlZFRpbWU7
DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBUcmFja0Rvd25sb2FkS2V5cyhmaW5hbCBU
cmFja0Rvd25sb2FkS2V5cyB0cmFja0Rvd25sb2FkS2V5KSB7DQotICAgICAgICB0aGlzLmNo
a0tleSA9IHRyYWNrRG93bmxvYWRLZXkuY2hrS2V5Ow0KLSAgICAgICAgdGhpcy5maWxlTmFt
ZSA9IHRyYWNrRG93bmxvYWRLZXkuZmlsZU5hbWU7DQotICAgICAgICB0aGlzLmJvYXJkTmFt
ZSA9IHRyYWNrRG93bmxvYWRLZXkuYm9hcmROYW1lOw0KLSAgICAgICAgdGhpcy5maWxlU2l6
ZSA9IHRyYWNrRG93bmxvYWRLZXkuZmlsZVNpemU7DQotICAgICAgICB0aGlzLmRvd25sb2Fk
RmluaXNoZWRUaW1lID0gdHJhY2tEb3dubG9hZEtleS5kb3dubG9hZEZpbmlzaGVkVGltZTsN
Ci0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoa0tleSgpIHsNCi0gICAgICAg
IHJldHVybiBjaGtLZXk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0
RmlsZU5hbWUoKSB7DQotICAgICAgICByZXR1cm4gZmlsZU5hbWU7DQotICAgIH0NCi0gICAg
DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm9hcmROYW1lKCkgew0KLQkJcmV0dXJuIGJvYXJk
TmFtZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgbG9uZyBnZXRGaWxlU2l6ZSgpIHsNCi0JCXJldHVy
biBmaWxlU2l6ZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRDaGtLZXkoU3RyaW5nIGNo
a0tleSkgew0KLQkJdGhpcy5jaGtLZXkgPSBjaGtLZXk7DQotCX0NCi0NCi0JcHVibGljIGxv
bmcgZ2V0RG93bmxvYWRGaW5pc2hlZFRpbWUoKSB7DQotICAgICAgICByZXR1cm4gZG93bmxv
YWRGaW5pc2hlZFRpbWU7DQotICAgIH0NCi19DQpJbmRleDogc291cmNlL2Zyb3N0L3N0b3Jh
Z2UvcGVyc3QvVHJhY2tEb3dubG9hZEtleXMuamF2YQ0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIHNv
dXJjZS9mcm9zdC9zdG9yYWdlL3BlcnN0L1RyYWNrRG93bmxvYWRLZXlzLmphdmEJKHJldmlz
aW9uIDApDQorKysgc291cmNlL2Zyb3N0L3N0b3JhZ2UvcGVyc3QvVHJhY2tEb3dubG9hZEtl
eXMuamF2YQkocmV2aXNpb24gMzE5MikNCkBAIC0wLDAgKzEsNzcgQEANCisvKg0KKyBUcmFj
a0Rvd25sb2FkS2V5cy5qYXZhIC8gRnJvc3QNCisgQ29weXJpZ2h0IChDKSAyMDEwICBGcm9z
dCBQcm9qZWN0IDxqdGNmcm9zdC5zb3VyY2Vmb3JnZS5uZXQ+DQorDQorIFRoaXMgcHJvZ3Jh
bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCisg
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgYXMNCisgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlciB2ZXJzaW9uIDIgb2YNCisgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uDQorDQorIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNl
ZSB0aGUgR05VDQorIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4N
CisNCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy
YWwgUHVibGljIExpY2Vuc2UNCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwg
d3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1h
c3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuDQorICovDQorcGFja2FnZSBmcm9z
dC5zdG9yYWdlLnBlcnN0Ow0KKw0KK2ltcG9ydCBvcmcuZ2FycmV0LnBlcnN0Lio7DQorDQor
LyoqDQorICogUmVwcmVzZW50cyB0aGUgaXRlbSBmb3IgdGhlIFRyYWNrRG93bmxvYWRLZXku
DQorICovDQorcHVibGljIGNsYXNzIFRyYWNrRG93bmxvYWRLZXlzIGV4dGVuZHMgUGVyc2lz
dGVudCB7DQorDQorCXByaXZhdGUgU3RyaW5nIGNoa0tleTsNCisJcHJpdmF0ZSBTdHJpbmcg
ZmlsZU5hbWU7DQorCXByaXZhdGUgU3RyaW5nIGJvYXJkTmFtZTsNCisJcHJpdmF0ZSBsb25n
IGZpbGVTaXplOyANCisJcHJpdmF0ZSBsb25nIGRvd25sb2FkRmluaXNoZWRUaW1lOyAvLyB3
aGVuIHdhcyB0aGlzIGRvd25sb2FkIGZpbmlzaGVkDQorDQorCS8vIHVzZWQgYnkgcGVyc3QN
CisJcHVibGljIFRyYWNrRG93bmxvYWRLZXlzKCkge30NCisNCisJcHVibGljIFRyYWNrRG93
bmxvYWRLZXlzKGZpbmFsIFN0cmluZyBjaGtLZXksIGZpbmFsIFN0cmluZyBmaWxlTmFtZSwg
DQorCQlmaW5hbCBTdHJpbmcgYm9hcmROYW1lLCBsb25nIGZpbGVTaXplLCBsb25nIGRvd25s
b2FkRmluaXNoZWRUaW1lKSB7DQorCQl0aGlzLmNoa0tleSA9IGNoa0tleTsNCisJCXRoaXMu
ZmlsZU5hbWUgPSBmaWxlTmFtZTsNCisJCXRoaXMuYm9hcmROYW1lID0gYm9hcmROYW1lOw0K
KwkJdGhpcy5maWxlU2l6ZSA9IGZpbGVTaXplOw0KKwkJdGhpcy5kb3dubG9hZEZpbmlzaGVk
VGltZSA9IGRvd25sb2FkRmluaXNoZWRUaW1lOw0KKwl9DQorDQorCXB1YmxpYyBUcmFja0Rv
d25sb2FkS2V5cyhmaW5hbCBUcmFja0Rvd25sb2FkS2V5cyB0cmFja0Rvd25sb2FkS2V5KSB7
DQorCQl0aGlzLmNoa0tleSA9IHRyYWNrRG93bmxvYWRLZXkuY2hrS2V5Ow0KKwkJdGhpcy5m
aWxlTmFtZSA9IHRyYWNrRG93bmxvYWRLZXkuZmlsZU5hbWU7DQorCQl0aGlzLmJvYXJkTmFt
ZSA9IHRyYWNrRG93bmxvYWRLZXkuYm9hcmROYW1lOw0KKwkJdGhpcy5maWxlU2l6ZSA9IHRy
YWNrRG93bmxvYWRLZXkuZmlsZVNpemU7DQorCQl0aGlzLmRvd25sb2FkRmluaXNoZWRUaW1l
ID0gdHJhY2tEb3dubG9hZEtleS5kb3dubG9hZEZpbmlzaGVkVGltZTsNCisJfQ0KKw0KKwlw
dWJsaWMgU3RyaW5nIGdldENoa0tleSgpIHsNCisJCXJldHVybiBjaGtLZXk7DQorCX0NCisN
CisJcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsNCisJCXJldHVybiBmaWxlTmFtZTsN
CisJfQ0KKw0KKwlwdWJsaWMgU3RyaW5nIGdldEJvYXJkTmFtZSgpIHsNCisJCXJldHVybiBi
b2FyZE5hbWU7DQorCX0NCisNCisJcHVibGljIGxvbmcgZ2V0RmlsZVNpemUoKSB7DQorCQly
ZXR1cm4gZmlsZVNpemU7DQorCX0NCisNCisJcHVibGljIHZvaWQgc2V0Q2hrS2V5KFN0cmlu
ZyBjaGtLZXkpIHsNCisJCXRoaXMuY2hrS2V5ID0gY2hrS2V5Ow0KKwl9DQorDQorCXB1Ymxp
YyBsb25nIGdldERvd25sb2FkRmluaXNoZWRUaW1lKCkgew0KKwkJcmV0dXJuIGRvd25sb2Fk
RmluaXNoZWRUaW1lOw0KKwl9DQorfQ0KSW5kZXg6IHNvdXJjZS9mcm9zdC9zdG9yYWdlL3Bl
cnN0L1RyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5qYXZhDQo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0g
c291cmNlL2Zyb3N0L3N0b3JhZ2UvcGVyc3QvVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlLmph
dmEJKHJldmlzaW9uIDMxOTIpDQorKysgc291cmNlL2Zyb3N0L3N0b3JhZ2UvcGVyc3QvVHJh
Y2tEb3dubG9hZEtleXNTdG9yYWdlLmphdmEJKHdvcmtpbmcgY29weSkNCkBAIC0xNSwxMTEg
KzE1LDEyMiBAQA0KICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFt
OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogICBGb3VuZGF0aW9uLCBJ
bmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4NCi0qLw0KKyAq
Lw0KIHBhY2thZ2UgZnJvc3Quc3RvcmFnZS5wZXJzdDsNCiANCiBpbXBvcnQgamF2YS51dGls
Lio7DQogDQoraW1wb3J0IG9yZy5nYXJyZXQucGVyc3QuSW5kZXg7DQorDQogaW1wb3J0IGZy
b3N0Lio7DQogaW1wb3J0IGZyb3N0LnN0b3JhZ2UuKjsNCiANCiBwdWJsaWMgY2xhc3MgVHJh
Y2tEb3dubG9hZEtleXNTdG9yYWdlIGV4dGVuZHMgQWJzdHJhY3RGcm9zdFN0b3JhZ2UgaW1w
bGVtZW50cyBFeGl0U2F2YWJsZSB7DQogDQotICAgIHByaXZhdGUgVHJhY2tEb3dubG9hZEtl
eXNTdG9yYWdlUm9vdCBzdG9yYWdlUm9vdCA9IG51bGw7DQorCXByaXZhdGUgVHJhY2tEb3du
bG9hZEtleXNTdG9yYWdlUm9vdCBzdG9yYWdlUm9vdCA9IG51bGw7DQogDQotICAgIHByaXZh
dGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SQUdFX0ZJTEVOQU1FID0gIlRyYWNrRG93bmxv
YWRLZXlzLmRicyI7DQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SQUdFX0ZJ
TEVOQU1FID0gIlRyYWNrRG93bmxvYWRLZXlzLmRicyI7DQogDQotICAgIHByaXZhdGUgc3Rh
dGljIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSBpbnN0YW5jZSA9IG5ldyBUcmFja0Rvd25s
b2FkS2V5c1N0b3JhZ2UoKTsNCisJcHJpdmF0ZSBzdGF0aWMgVHJhY2tEb3dubG9hZEtleXNT
dG9yYWdlIGluc3RhbmNlID0gbmV3IFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSgpOw0KIA0K
LSAgICBwcm90ZWN0ZWQgVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlKCkgew0KLSAgICAgICAg
c3VwZXIoKTsNCi0gICAgfQ0KKwlwcm90ZWN0ZWQgVHJhY2tEb3dubG9hZEtleXNTdG9yYWdl
KCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KIA0KLSAgICBwdWJsaWMgc3RhdGljIFRyYWNrRG93
bmxvYWRLZXlzU3RvcmFnZSBpbnN0KCkgew0KLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOw0K
LSAgICB9DQorCXB1YmxpYyBzdGF0aWMgVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlIGluc3Qo
KSB7DQorCQlyZXR1cm4gaW5zdGFuY2U7DQorCX0NCiANCi0gICAgcHJpdmF0ZSBib29sZWFu
IGFkZFRvSW5kaWNlcyhmaW5hbCBUcmFja0Rvd25sb2FkS2V5cyB0cmFja0Rvd25sb2FkS2V5
cykgew0KLSAgICAJU3lzdGVtLm91dC5wcmludCgiREVCVUc6IFRyYWNrRG93bmxvYWRLZXlz
U3RvcmFnZS5hZGRUb0luZGljZXM6ICIpOw0KLSAgICAJU3lzdGVtLm91dC5wcmludGxuKHRy
YWNrRG93bmxvYWRLZXlzLmdldENoa0tleSgpKTsNCi0gICAgICAgIHJldHVybiBzdG9yYWdl
Um9vdC5kb3dubG9hZEtleUxpc3QucHV0KHRyYWNrRG93bmxvYWRLZXlzLmdldENoa0tleSgp
LCB0cmFja0Rvd25sb2FkS2V5cyk7DQotICAgIH0NCisJcHJpdmF0ZSBib29sZWFuIGFkZFRv
SW5kaWNlcyhmaW5hbCBUcmFja0Rvd25sb2FkS2V5cyB0cmFja0Rvd25sb2FkS2V5cykgew0K
KwkJcmV0dXJuIHN0b3JhZ2VSb290LmRvd25sb2FkS2V5TGlzdC5wdXQodHJhY2tEb3dubG9h
ZEtleXMuZ2V0Q2hrS2V5KCksIHRyYWNrRG93bmxvYWRLZXlzKTsNCisJfQ0KIA0KLSAgICBw
dWJsaWMgdm9pZCBzdG9yZUl0ZW0oZmluYWwgVHJhY2tEb3dubG9hZEtleXMgdHJhY2tEb3du
bG9hZEtleXMpIHsNCi0gICAgICAgIGlmKCBnZXRTdG9yYWdlKCkgPT0gbnVsbCApIHsNCi0g
ICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBpZiggdHJhY2tEb3du
bG9hZEtleXMuZ2V0U3RvcmFnZSgpID09IG51bGwgKSB7DQotICAgICAgICAJdHJhY2tEb3du
bG9hZEtleXMubWFrZVBlcnNpc3RlbnQoZ2V0U3RvcmFnZSgpKTsNCi0gICAgICAgICAgICBh
ZGRUb0luZGljZXModHJhY2tEb3dubG9hZEtleXMpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0g
ICAgICAgIAl0cmFja0Rvd25sb2FkS2V5cy5tb2RpZnkoKTsNCi0gICAgICAgIH0NCi0gICAg
fQ0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gc2VhcmNoSXRlbShmaW5hbCBTdHJpbmcg
Y2hrS2V5KSB7DQotICAgIAlTeXN0ZW0ub3V0LnByaW50KCJERUJVRzogVHJhY2tEb3dubG9h
ZEtleXNTdG9yYWdlLnNlYXJjaEl0ZW06ICIpOw0KLSAgICAJU3lzdGVtLm91dC5wcmludGxu
KGNoa0tleSk7DQotICAgIAlyZXR1cm4gKHN0b3JhZ2VSb290LmRvd25sb2FkS2V5TGlzdC5n
ZXQoY2hrS2V5KSAhPSBudWxsKTsNCi0gICAgfQ0KKwlwdWJsaWMgdm9pZCBzdG9yZUl0ZW0o
ZmluYWwgVHJhY2tEb3dubG9hZEtleXMgdHJhY2tEb3dubG9hZEtleXMpIHsNCisJCWlmKCBn
ZXRTdG9yYWdlKCkgPT0gbnVsbCApIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlpZiggdHJh
Y2tEb3dubG9hZEtleXMuZ2V0U3RvcmFnZSgpID09IG51bGwgKSB7DQorCQkJdHJhY2tEb3du
bG9hZEtleXMubWFrZVBlcnNpc3RlbnQoZ2V0U3RvcmFnZSgpKTsNCisJCQlhZGRUb0luZGlj
ZXModHJhY2tEb3dubG9hZEtleXMpOw0KKwkJfSBlbHNlIHsNCisJCQl0cmFja0Rvd25sb2Fk
S2V5cy5tb2RpZnkoKTsNCisJCX0NCisJfQ0KIA0KLSAgICBwdWJsaWMgdm9pZCBleGl0U2F2
ZSgpIHRocm93cyBTdG9yYWdlRXhjZXB0aW9uIHsNCi0gICAgICAgIGNsb3NlKCk7DQotICAg
ICAgICBzdG9yYWdlUm9vdCA9IG51bGw7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4o
IklORk86IFRyYWNrRG93bmxvYWRLZXlTdG9yYWdlIGNsb3NlZC4iKTsNCi0gICAgfQ0KKwlw
dWJsaWMgYm9vbGVhbiBzZWFyY2hJdGVtS2V5KGZpbmFsIFN0cmluZyBjaGtLZXkpIHsNCisJ
CXJldHVybiBzdG9yYWdlUm9vdC5kb3dubG9hZEtleUxpc3QuZ2V0KGNoa0tleSkgIT0gbnVs
bDsNCisJfQ0KIA0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9y
YWdlRmlsZW5hbWUoKSB7DQotICAgICAgICByZXR1cm4gU1RPUkFHRV9GSUxFTkFNRTsNCi0g
ICAgfQ0KKwlwdWJsaWMgVHJhY2tEb3dubG9hZEtleXMgZ2V0SXRlbUJ5S2V5KGZpbmFsIFN0
cmluZyBjaGtLZXkpIHsNCisJCXJldHVybiBzdG9yYWdlUm9vdC5kb3dubG9hZEtleUxpc3Qu
Z2V0KGNoa0tleSk7DQorCX0NCisJDQorCXB1YmxpYyBUcmFja0Rvd25sb2FkS2V5cyByZW1v
dmVJdGVtQnlLZXkoZmluYWwgU3RyaW5nIGNoa0tleSkgew0KKwkJcmV0dXJuIHN0b3JhZ2VS
b290LmRvd25sb2FkS2V5TGlzdC5yZW1vdmUoY2hrS2V5KTsNCisJfQ0KIA0KLSAgICBAT3Zl
cnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gaW5pdFN0b3JhZ2UoKSB7DQotICAgICAgICBm
aW5hbCBTdHJpbmcgZGF0YWJhc2VGaWxlUGF0aCA9IGJ1aWxkU3RvcmFnZVBhdGgoZ2V0U3Rv
cmFnZUZpbGVuYW1lKCkpOyAvLyBwYXRoIHRvIHRoZSBkYXRhYmFzZSBmaWxlDQotICAgICAg
ICBmaW5hbCBsb25nIHBhZ2VQb29sU2l6ZSA9IGdldFBhZ2VQb29sU2l6ZShTZXR0aW5nc0Ns
YXNzLlBFUlNUX1BBR0VQT09MU0laRV9TSEFSRURGSUxFU0NIS0tFWVMpOw0KKwlwdWJsaWMg
dm9pZCBleGl0U2F2ZSgpIHRocm93cyBTdG9yYWdlRXhjZXB0aW9uIHsNCisJCWNsb3NlKCk7
DQorCQlzdG9yYWdlUm9vdCA9IG51bGw7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIklORk86
IFRyYWNrRG93bmxvYWRLZXlTdG9yYWdlIGNsb3NlZC4iKTsNCisJfQ0KKwkNCisJcHVibGlj
IGZpbmFsIEluZGV4PFRyYWNrRG93bmxvYWRLZXlzPiBnZXREb3dubG9hZEtleUxpc3QoKSB7
DQorCQlyZXR1cm4gc3RvcmFnZVJvb3QuZG93bmxvYWRLZXlMaXN0Ow0KKwl9DQogDQotICAg
ICAgICBvcGVuKGRhdGFiYXNlRmlsZVBhdGgsIHBhZ2VQb29sU2l6ZSwgdHJ1ZSwgdHJ1ZSwg
ZmFsc2UpOw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRTdG9yYWdlRmlsZW5h
bWUoKSB7DQorCQlyZXR1cm4gU1RPUkFHRV9GSUxFTkFNRTsNCisJfQ0KIA0KLSAgICAgICAg
c3RvcmFnZVJvb3QgPSAoVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlUm9vdClnZXRTdG9yYWdl
KCkuZ2V0Um9vdCgpOw0KLSAgICAgICAgaWYgKHN0b3JhZ2VSb290ID09IG51bGwpIHsNCi0g
ICAgICAgICAgICAvLyBTdG9yYWdlIHdhcyBub3QgaW5pdGlhbGl6ZWQgeWV0DQotICAgICAg
ICAgICAgc3RvcmFnZVJvb3QgPSBuZXcgVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlUm9vdCgp
Ow0KLSAgICAgICAgICAgIC8vIHVuaXF1ZSBpbmRleCBvZiBjaGtLZXlzDQotICAgICAgICAg
ICAgc3RvcmFnZVJvb3QuZG93bmxvYWRLZXlMaXN0ID0gZ2V0U3RvcmFnZSgpLmNyZWF0ZUlu
ZGV4KFN0cmluZy5jbGFzcywgdHJ1ZSk7DQotICAgICAgICAgICAgZ2V0U3RvcmFnZSgpLnNl
dFJvb3Qoc3RvcmFnZVJvb3QpOw0KLSAgICAgICAgICAgIGNvbW1pdCgpOyAvLyBjb21taXQg
dHJhbnNhY3Rpb24NCi0gICAgICAgIH0NCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi
SU5GTzogVHJhY2tEb3dubG9hZEtleVN0b3JhZ2UgaW5pdGlhbGl6ZWQuIik7DQotICAgICAg
ICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIERlbGV0
ZSBhbGwgZW50cmllcyB0aGF0IHdlcmUgZG93bmxvYWRlZCBtYXhEYXlzT2xkIGRheWVzIGFn
by4NCi0gICAgICogQHJldHVybiAgY291bnQgb2YgZGVsZXRlZCByb3dzDQotICAgICAqLw0K
LSAgICBwdWJsaWMgaW50IGNsZWFudXBUYWJsZShmaW5hbCBpbnQgbWF4RGF5c09sZCkgew0K
KwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaW5pdFN0b3JhZ2UoKSB7DQorCQlmaW5h
bCBTdHJpbmcgZGF0YWJhc2VGaWxlUGF0aCA9IGJ1aWxkU3RvcmFnZVBhdGgoZ2V0U3RvcmFn
ZUZpbGVuYW1lKCkpOyAvLyBwYXRoIHRvIHRoZSBkYXRhYmFzZSBmaWxlDQorCQlmaW5hbCBs
b25nIHBhZ2VQb29sU2l6ZSA9IGdldFBhZ2VQb29sU2l6ZShTZXR0aW5nc0NsYXNzLlBFUlNU
X1BBR0VQT09MU0laRV9TSEFSRURGSUxFU0NIS0tFWVMpOw0KIA0KLSAgICAgICAgZmluYWwg
bG9uZyBtaW5WYWwgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIChtYXhEYXlzT2xk
ICogMjRMICogNjBMICogNjBMICogMTAwMEwpOw0KKwkJb3BlbihkYXRhYmFzZUZpbGVQYXRo
LCBwYWdlUG9vbFNpemUsIHRydWUsIHRydWUsIGZhbHNlKTsNCiANCi0gICAgICAgIC8vIGRl
bGV0ZSBhbGwgaXRlbXMgd2l0aCBsYXN0U2VlbiA8IG1pblZhbCwgYnV0IGxhc3RTZWVuID4g
MA0KLSAgICAgICAgaW50IGRlbGV0ZWRDb3VudCA9IDA7DQorCQlzdG9yYWdlUm9vdCA9IChU
cmFja0Rvd25sb2FkS2V5c1N0b3JhZ2VSb290KWdldFN0b3JhZ2UoKS5nZXRSb290KCk7DQor
CQlpZiAoc3RvcmFnZVJvb3QgPT0gbnVsbCB8fCBzdG9yYWdlUm9vdC5kb3dubG9hZEtleUxp
c3QgPT0gbnVsbCkgew0KKwkJCS8vIFN0b3JhZ2Ugd2FzIG5vdCBpbml0aWFsaXplZCB5ZXQN
CisJCQlzdG9yYWdlUm9vdCA9IG5ldyBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2VSb290KCk7
DQorCQkJLy8gdW5pcXVlIGluZGV4IG9mIGNoa0tleXMNCisJCQlzdG9yYWdlUm9vdC5kb3du
bG9hZEtleUxpc3QgPSBnZXRTdG9yYWdlKCkuY3JlYXRlSW5kZXgoU3RyaW5nLmNsYXNzLCB0
cnVlKTsNCisJCQkNCisJCQlnZXRTdG9yYWdlKCkuc2V0Um9vdChzdG9yYWdlUm9vdCk7DQor
CQkJY29tbWl0KCk7IC8vIGNvbW1pdCB0cmFuc2FjdGlvbg0KKwkJfQ0KKwkJU3lzdGVtLm91
dC5wcmludGxuKCJJTkZPOiBUcmFja0Rvd25sb2FkS2V5U3RvcmFnZSBpbml0aWFsaXplZC4i
KTsNCisJCXJldHVybiB0cnVlOw0KKwl9DQogDQotICAgICAgICBiZWdpbkV4Y2x1c2l2ZVRo
cmVhZFRyYW5zYWN0aW9uKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGZpbmFs
IEl0ZXJhdG9yPFRyYWNrRG93bmxvYWRLZXlzPiBpID0gc3RvcmFnZVJvb3QuZG93bmxvYWRL
ZXlMaXN0Lml0ZXJhdG9yKCk7DQotICAgICAgICAgICAgd2hpbGUoaS5oYXNOZXh0KCkpIHsN
Ci0gICAgICAgICAgICAgICAgZmluYWwgVHJhY2tEb3dubG9hZEtleXMgc2ZrID0gaS5uZXh0
KCk7DQotICAgICAgICAgICAgICAgIGlmKCBzZmsuZ2V0RG93bmxvYWRGaW5pc2hlZFRpbWUo
KSA+IDAgJiYgc2ZrLmdldERvd25sb2FkRmluaXNoZWRUaW1lKCkgPCBtaW5WYWwgKSB7DQot
ICAgICAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOyAvLyByZW1vdmUgZnJvbSBpdGVyYXRl
ZCBpbmRleA0KLSAgICAgICAgICAgICAgICAgICAgc2ZrLmRlYWxsb2NhdGUoKTsgLy8gcmVt
b3ZlIGZyb20gU3RvcmFnZQ0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlZENvdW50Kys7
DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGZpbmFs
bHkgew0KLSAgICAgICAgICAgIGVuZFRocmVhZFRyYW5zYWN0aW9uKCk7DQotICAgICAgICB9
DQorCS8qKg0KKwkgKiBEZWxldGUgYWxsIGVudHJpZXMgdGhhdCB3ZXJlIGRvd25sb2FkZWQg
bWF4RGF5c09sZCBkYXllcyBhZ28uDQorCSAqIEByZXR1cm4gIGNvdW50IG9mIGRlbGV0ZWQg
cm93cw0KKwkgKi8NCisJcHVibGljIGludCBjbGVhbnVwVGFibGUoZmluYWwgaW50IG1heERh
eXNPbGQpIHsNCiANCi0gICAgICAgIHJldHVybiBkZWxldGVkQ291bnQ7DQotICAgIH0NCisJ
CWZpbmFsIGxvbmcgbWluVmFsID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSAobWF4
RGF5c09sZCAqIDI0TCAqIDYwTCAqIDYwTCAqIDEwMDBMKTsNCisNCisJCS8vIGRlbGV0ZSBh
bGwgaXRlbXMgd2l0aCBsYXN0U2VlbiA8IG1pblZhbCwgYnV0IGxhc3RTZWVuID4gMA0KKwkJ
aW50IGRlbGV0ZWRDb3VudCA9IDA7DQorDQorCQliZWdpbkV4Y2x1c2l2ZVRocmVhZFRyYW5z
YWN0aW9uKCk7DQorCQl0cnkgew0KKwkJCWZpbmFsIEl0ZXJhdG9yPFRyYWNrRG93bmxvYWRL
ZXlzPiB0cmFja0Rvd25sb2FkS2V5SXRlcmF0b3IgPSBzdG9yYWdlUm9vdC5kb3dubG9hZEtl
eUxpc3QuaXRlcmF0b3IoKTsNCisJCQl3aGlsZSh0cmFja0Rvd25sb2FkS2V5SXRlcmF0b3Iu
aGFzTmV4dCgpKSB7DQorCQkJCWZpbmFsIFRyYWNrRG93bmxvYWRLZXlzIHRyYWNrRG93bmxv
YWRLZXlzID0gdHJhY2tEb3dubG9hZEtleUl0ZXJhdG9yLm5leHQoKTsNCisJCQkJaWYoIHRy
YWNrRG93bmxvYWRLZXlzLmdldERvd25sb2FkRmluaXNoZWRUaW1lKCkgPiAwICYmIHRyYWNr
RG93bmxvYWRLZXlzLmdldERvd25sb2FkRmluaXNoZWRUaW1lKCkgPCBtaW5WYWwgKSB7DQor
CQkJCQl0cmFja0Rvd25sb2FkS2V5SXRlcmF0b3IucmVtb3ZlKCk7IC8vIHJlbW92ZSBmcm9t
IGl0ZXJhdGVkIGluZGV4DQorCQkJCQl0cmFja0Rvd25sb2FkS2V5cy5kZWFsbG9jYXRlKCk7
IC8vIHJlbW92ZSBmcm9tIFN0b3JhZ2UNCisJCQkJCWRlbGV0ZWRDb3VudCsrOw0KKwkJCQl9
DQorCQkJfQ0KKwkJfSBmaW5hbGx5IHsNCisJCQllbmRUaHJlYWRUcmFuc2FjdGlvbigpOw0K
KwkJfQ0KKw0KKwkJcmV0dXJuIGRlbGV0ZWRDb3VudDsNCisJfQ0KIH0NCkluZGV4OiBzb3Vy
Y2UvZnJvc3Qvc3RvcmFnZS9wZXJzdC9UcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2VSb290Lmph
dmENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0NCi0tLSBzb3VyY2UvZnJvc3Qvc3RvcmFnZS9wZXJzdC9UcmFj
a0Rvd25sb2FkS2V5c1N0b3JhZ2VSb290LmphdmEJKHJldmlzaW9uIDMxOTIpDQorKysgc291
cmNlL2Zyb3N0L3N0b3JhZ2UvcGVyc3QvVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlUm9vdC5q
YXZhCSh3b3JraW5nIGNvcHkpDQpAQCAtMjEsOCArMjEsOCBAQA0KIGltcG9ydCBvcmcuZ2Fy
cmV0LnBlcnN0Lio7DQogDQogcHVibGljIGNsYXNzIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFn
ZVJvb3QgZXh0ZW5kcyBQZXJzaXN0ZW50IHsNCi0gICAgDQotICAgIHB1YmxpYyBUcmFja0Rv
d25sb2FkS2V5c1N0b3JhZ2VSb290KCkge30NCi0gICAgDQotICAgIEluZGV4PFRyYWNrRG93
bmxvYWRLZXlzPiBkb3dubG9hZEtleUxpc3Q7DQorCQ0KKwlwdWJsaWMgVHJhY2tEb3dubG9h
ZEtleXNTdG9yYWdlUm9vdCgpIHt9DQorCQ0KKwlwdWJsaWMgSW5kZXg8VHJhY2tEb3dubG9h
ZEtleXM+IGRvd25sb2FkS2V5TGlzdDsNCiB9DQpJbmRleDogc291cmNlL2Zyb3N0L3V0aWwv
RmlsZUFjY2Vzcy5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc291cmNlL2Zyb3N0L3V0aWwv
RmlsZUFjY2Vzcy5qYXZhCShyZXZpc2lvbiAzMTkyKQ0KKysrIHNvdXJjZS9mcm9zdC91dGls
L0ZpbGVBY2Nlc3MuamF2YQkod29ya2luZyBjb3B5KQ0KQEAgLTQ2Niw2ICs0NjYsMjMgQEAN
CiAgICAgICAgIC8vIFRoZSBkaXJlY3RvcnkgaXMgbm93IGVtcHR5IHNvIGRlbGV0ZSBpdAog
ICAgICAgICByZXR1cm4gZGlyLmRlbGV0ZSgpOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAg
ICAqIENyZWF0ZSBnaXZlbiBkaXJlY3RvcnkKKyAgICAqLworICAgcHVibGljIHN0YXRpYyBi
b29sZWFuIGNyZWF0ZURpcihmaW5hbCBqYXZhLmlvLkZpbGUgZGlyKSB7CisgICAgICAgaWYo
IGRpci5pc0RpcmVjdG9yeSgpICkgeworICAgIAkgICByZXR1cm4gdHJ1ZTsKKyAgICAgICB9
CisgICAgICAgCisgICAgICAgaWYoIGRpci5leGlzdHMoKSkgeworICAgIAkgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgfQorICAgICAgIAorICAgICAgIHJldHVybiBkaXIubWtkaXJzKCk7
CisgICB9CisgICAgCisgICAgCiAKICAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBjb3Bp
ZXMgdGhlIGNvbnRlbnRzIG9mIG9uZSBmaWxlIHRvIGFub3RoZXIuIElmIHRoZSBkZXN0aW5h
dGlvbiBmaWxlIGRpZG4ndCBleGlzdCwgaXQgaXMgY3JlYXRlZC4gSWYKQEAgLTU4NSw4ICs2
MDIsOCBAQA0KIAogICAgIAlpZiAoIXBhdGguZW5kc1dpdGgoc2VwYXJhdG9yKSkgewogICAg
IAkJcmV0dXJuIHBhdGggKyBzZXBhcmF0b3I7Ci0JCX0KKyAgICAJfQogCi0JCXJldHVybiBw
YXRoOwotCX0KKyAgICAJcmV0dXJuIHBhdGg7CisgICAgfQogfQpJbmRleDogc291cmNlL2kx
OG4vbGFuZ3Jlcy5wcm9wZXJ0aWVzDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpDYW5ub3QgZGlzcGxheTog
ZmlsZSBtYXJrZWQgYXMgYSBiaW5hcnkgdHlwZS4NCnN2bjptaW1lLXR5cGUgPSBhcHBsaWNh
dGlvbi9vY3RldC1zdHJlYW0NCg==
--------------020906060900040108030705
Content-Type: text/plain;
name="langres.properties"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="langres.properties"
AboutBox.label.openSourceProject=Open Source Project (GPL license)
AboutBox.label.version=Version
AboutBox.text.development=Development:
AboutBox.text.miscCodeContributions=Misc code contributions:
AboutBox.text.splashScreenLogo=Splash Screen Logo:
AboutBox.text.systemTrayExecutables=System Tray Executables:
AboutBox.text.translationSupport=Translation Support:
AboutBox.text.windowsInstaller=Windows Installer:
AboutBox.title=About
AddNewDownloadsDialog.title=Add new Files to download list
AddNewDownloadsDialog.button.changeDownloadDir=Change download target directory
AddNewDownloadsDialog.button.removeDownload=Remove
AddNewDownloadsDialog.changeDirDialog.title=Change target Directory
AddNewDownloadsDialog.table.name=Name
AddNewDownloadsDialog.table.key=Key
AddNewDownloadsDialog.table.priority=Priority
AddNewDownloadsDialog.table.downloadDir=Download Directory
AddNewDownloadsDialog.table.comment=Comment
AddNewDownloadsDialog.table.alreadyDownloaded=File downloaded previously
AddNewDownloadsDialog.table.alreadyDownloadedName=File with same name downloaded previously
AddNewDownloadsDialog.table.alreadyExists=File already exists in Download Directory
AddNewDownloadsDialog.button.removeAlreadyDownloadedButton=Remove already Downloaded
AddNewDownloadsDialog.button.removeAlreadyDownloadedNameButton=Remove already Downloaded by name
AddNewDownloadsDialog.button.removeAlreadyExistsButton=Remove already exists
AddNewDownloadsDialog.buttonTooltip.removeAlreadyDownloadedButton=Remove all files from download list which have been downloaded previously, matching by key
AddNewDownloadsDialog.buttonTooltip.removeAlreadyExistsButton=Remove all files from download list where a file with the same name already exists in the destination directory
AltEdit.errorDialog.couldNotCreateMessageFile=Could not create message file for alternate editor
AltEdit.errorDialog.couldNotStartEditorUsingCommand=Could not start alternate editor using command
AltEdit.errorDialog.invalidReturnedMessageFile=The message file returned by the alternate editor is invalid.
AltEdit.errorDialog.missingPlaceholder=Configured alternate editor line must contain a '%f' as placeholder for the filename.
AltEdit.errorDialog.noAlternateEditorConfigured=No alternate editor configured.
AltEdit.errorDialogs.title=Error
AltEdit.markerLine.subject=*--- Subject line (changeable) ---*
AltEdit.markerLine.text=*--- Enter your text after this line ---*
AltEdit.textFileMessage.1=>>> This is a Frost alternate editor message file. <<<
AltEdit.textFileMessage.2=>>> You can edit the subject and add text at the end of the file. <<<
AltEdit.textFileMessage.3=>>> Don't change or delete the marker lines! <<<
Board.boardState.invalid=(INVALID, no public key, but private!)
Board.boardState.publicBoard=public board
Board.boardState.readAccess=read access
Board.boardState.writeAccess=write access
BoardInfoFrame.button.close=Close
BoardInfoFrame.button.update=Update view
BoardInfoFrame.button.updateAllBoards=Update all boards
BoardInfoFrame.button.updateSelectedBoard=Update selected boards
BoardInfoFrame.button.removeSelectedBoards=Remove selected boards
BoardInfoFrame.label.boards=Boards
BoardInfoFrame.label.messages=Messages
BoardInfoFrame.popupMenu.copyInfoToClipboard=Copy information to clipboard
BoardInfoFrame.table.board=Board
BoardInfoFrame.table.messages=Messages
BoardInfoFrame.table.messagesToday=Today
BoardInfoFrame.table.messagesFlagged=Flagged
BoardInfoFrame.table.messagesStarred=Starred
BoardInfoFrame.table.messagesUnread=Unread
BoardInfoFrame.table.lastMsgDate=Last Msg
BoardInfoFrame.table.state=State
BoardInfoFrame.title=Board information window
BoardsChooser.title=Choose boards
BoardSettings.button.generateNewKeypair=Generate new keypair
BoardSettings.generateKeyPairErrorDialog.title=Warning
BoardSettings.label.description=Description:
BoardSettings.label.enableAutomaticBoardUpdate=Enable automatic board update
BoardSettings.label.hideBadMessages=Hide messages flagged BAD
BoardSettings.label.hideCheckMessages=Hide messages flagged CHECK
BoardSettings.label.hideObserveMessages=Hide messages flagged OBSERVE
BoardSettings.label.hideUnsignedMessages=Hide unsigned messages
BoardSettings.label.maximumMessageDisplay=Number of days to display
BoardSettings.label.maximumMessageDownload=Number of days to download backwards
BoardSettings.label.no=No
BoardSettings.label.overrideDefaultSettings=Override default settings
BoardSettings.label.privateKey=Private key
BoardSettings.label.publicBoard=Public board
BoardSettings.label.publicKey=Public key
BoardSettings.label.secureBoard=Secure board
BoardSettings.label.setTo=Set to
BoardSettings.label.storeSentMessages=Save sent messages
BoardSettings.label.useDefault=Use default
BoardSettings.label.yes=Yes
BoardSettings.label.hideMessageCountDisplay=Hide messages from identities with fewer than X received messages (0 disables)
BoardSettings.looseKeysWarningDialog.body=If you set this board as public, you will lose its keys. Are you sure you want to do that?
BoardSettings.looseKeysWarningDialog.title=Set Board as Public?
BoardSettings.text.keyNotAvailable=Not available
BoardSettings.title.boardSettings=Settings for board
BoardSettings.title.folderSettings=Settings for all boards in folder
BoardTree.duplicateNewBoardNameError.body=You already have a board with name ''{0}''!\nPlease choose a new name.
BoardTree.duplicateNewBoardNameError.title=Duplicate board name
BoardTree.newFolderDialog.body=Please enter a name for the new folder
BoardTree.newFolderDialog.defaultName=newFolder
BoardTree.newFolderDialog.title=New Folder Name
BoardTree.overWriteBoardConfirmation.body=You already have a board with name ''{0}''!\nDo you really want to overwrite it?\n(This will not delete messages)
BoardTree.overWriteBoardConfirmation.title=Overwrite existing board
BoardTree.popupmenu.addNewBoard=Add new board
BoardTree.popupmenu.addNewFolder=Add new folder
BoardTree.popupmenu.board=board
BoardTree.popupmenu.Board=Board
BoardTree.popupmenu.configureSelectedBoard=Configure selected board
BoardTree.popupmenu.configureSelectedFolder=Configure selected folder
BoardTree.popupmenu.cut=Cut
BoardTree.popupmenu.Folder=Folder
BoardTree.popupmenu.folder=folder
BoardTree.popupmenu.markAllMessagesRead=Mark ALL messages read
BoardTree.popupmenu.paste=Paste
BoardTree.popupmenu.refresh=Refresh
BoardTree.popupmenu.remove=Remove
BoardTree.popupmenu.renameFolder=Rename folder
BoardTree.popupmenu.searchMessages=Search this board
BoardTree.popupmenu.sendMessage=Send message
BoardTree.popupmenu.sortFolder=Sort folder
BoardTree.removeBoardConfirmation.body=Do you really want to delete board ''{0}'' ? All messages in this board will be deleted too.
BoardTree.removeBoardConfirmation.title=Remove board ''{0}''
BoardTree.removeFolderConfirmation.body=Do you really want to delete folder ''{0}'' ?\nNOTE: Removing it will also remove all boards, folders and messages inside this folder!
BoardTree.removeFolderConfirmation.title=Remove folder ''{0}''
Common.browse=Browse
Common.cancel=Cancel
Common.copy=Copy
Common.copyToClipBoard.copyExtendedInfo=Copy extended info
Common.copyToClipBoard.copyKeysWithFilenames=Copy keys with filenames
Common.copyToClipBoard.extendedInfo.bytes=Bytes:
Common.copyToClipBoard.extendedInfo.file=File :
Common.copyToClipBoard.extendedInfo.key=Key :
Common.copyToClipBoard.extendedInfo.keyNotAvailableYet=Key not available yet
Common.copyToClipBoard=Copy to clipboard
Common.cut=Cut
Common.details=Details
Common.exit=Exit
Common.ignoreMessagesOfThisType=Ignore such messages
Common.ok=Ok
Common.close=Close
Common.paste=Paste
Common.priority.changePriority=Change priority
Common.priority.priority0=0 (maximum)
Common.priority.priority1=1
Common.priority.priority2=2
Common.priority.priority3=3 (recommended)
Common.priority.priority4=4
Common.priority.priority5=5
Common.priority.priority6=6 (pause)
Common.properties=Properties
Common.suppressConfirmationCheckbox=Show this dialog the next time
Core.init.NodeNotRunningBody=Make sure your node is running and that you have configured Freenet correctly.\nNevertheless, to allow you to read messages, Frost will startup now.\nPlease note that automatic board updates were disabled (Menu 'News')!\nDon't get confused by some error messages ;)\n
Core.init.NodeNotRunningTitle=Error - could not establish a connection to freenet node.
Core.init.TestnetWarningBody=Your freenet node runs in TESTNET mode, no anonymity is provided!
Core.init.TestnetWarningTitle=Freenet node in TESTNET mode
Core.init.UnsupportedFreenetVersionBody=Freenet version is not supported
Core.init.UnsupportedFreenetVersionTitle=Freenet version is not supported
Core.init.FileSharingEnabledBody=Filesharing is enabled. It is vulnerable to spamming and disabling it is highly recommended.\nLeaving it enabled will gradually increase the time it takes to start up Frost (due to filelist.dbs being flooded with junk) and increase both resource and bandwidth usage.\n\nIf you choose to disable it, you should exit Frost and remove filelist.dbs to free up some disk space and decrease startup times.
Core.init.FileSharingEnabledTitle=Filesharing enabled
Core.loadIdentities.ChooseName=Choose an identity name, it doesn't have to be unique\n
Core.loadIdentities.InvalidNameBody=The name is invalid, please choose another name.
Core.loadIdentities.InvalidNameTitle=Invalid identity name
DialogWithDetails.button.less=Less
DialogWithDetails.button.more=More
DownloadPane.fileTable.blocks=Blocks
DownloadPane.fileTable.enabled=Enabled
DownloadPane.fileTable.filename=Filename
DownloadPane.fileTable.isDDA.tooltip=Indicates if the file is stored by the node to the target file.
DownloadPane.fileTable.isDDA=DDA
DownloadPane.fileTable.key=Key
DownloadPane.fileTable.downloadDir=Download directory
DownloadPane.fileTable.lastReceived=Last seen
DownloadPane.fileTable.lastUploaded=Last uploaded
DownloadPane.fileTable.popupmenu.enableDownloads.disableAllDownloads=Disable all downloads
DownloadPane.fileTable.popupmenu.enableDownloads.disableSelectedDownloads=Disable selected downloads
DownloadPane.fileTable.popupmenu.enableDownloads.enableAllDownloads=Enable all downloads
DownloadPane.fileTable.popupmenu.enableDownloads.enableSelectedDownloads=Enable selected downloads
DownloadPane.fileTable.popupmenu.enableDownloads.invertEnabledStateForAllDownloads=Invert enabled state for all downloads
DownloadPane.fileTable.popupmenu.enableDownloads.invertEnabledStateForSelectedDownloads=Invert enabled state for selected downloads
DownloadPane.fileTable.popupmenu.enableDownloads=Enable downloads
DownloadPane.fileTable.popupmenu.remove.removeSelectedDownloads=Remove selected downloads
DownloadPane.fileTable.popupmenu.remove=Remove
DownloadPane.fileTable.popupmenu.removeFromGlobalQueue=Remove from global queue
DownloadPane.fileTable.popupmenu.restartSelectedDownloads=Restart selected downloads
DownloadPane.fileTable.popupmenu.retrieveDirectExternalDownloads=Retrieve direct external downloads into download directory
DownloadPane.fileTable.popupmenu.startSelectedDownloadsNow=Start selected downloads immediately
DownloadPane.fileTable.popupmenu.useThisDownloadDir=Use this download directory
DownloadPane.fileTable.popupmenu.jumpToAssociatedMessage=View associated message
DownloadPane.fileTable.priority=Priority
DownloadPane.fileTable.requested.tooltip=If an icon is shown then this file was requested in the last 24 hours by us or someone else.
DownloadPane.fileTable.requested=File requested
DownloadPane.fileTable.shared.tooltip=An icon indicates a shared file.
DownloadPane.fileTable.shared=Shared file
DownloadPane.fileTable.size=Size
DownloadPane.fileTable.state=State
DownloadPane.fileTable.states.decodingSegment=Decoding segment
DownloadPane.fileTable.states.done=Done
DownloadPane.fileTable.states.downloading=Downloading
DownloadPane.fileTable.states.failed=Failed
DownloadPane.fileTable.states.trying=Trying
DownloadPane.fileTable.states.unknown=Unknown
DownloadPane.fileTable.states.waiting=Waiting
DownloadPane.fileTable.tries=Tries
DownloadPane.invalidKeyDialog.body=Invalid freenet key: {0}
DownloadPane.invalidKeyDialog.title=Invalid key
DownloadPane.alreadyTrackedDialog.title=Key already downloaded
DownloadPane.alreadyTrackedDialog.body=The key has already been downloaded previously:\n{0}\n\nDo you want to download it again?
DownloadPane.removeFinishedDownloads=Remove finished
DownloadPane.showExternalGlobalQueueItems=Show global queue
DownloadPane.toolbar.tooltip.activateDownloading=Activate downloading
DownloadPane.toolbar.tooltip.addKeys=Quickload: enter or paste keys to download, separated by a semicolon ; or one key per line
DownloadPane.toolbar.tooltip.pasteKeys=Add keys from clipboard
DownloadPane.toolbar.tooltip.downloadPrefix=Filename prefix
DownloadPane.toolbar.tooltip.downloadDir=Default download directory for keys added through the quickload text field
DownloadPane.toolbar.tooltip.applyDownloadPrefix=Set download filename prefix for selected files
DownloadPane.toolbar.tooltip.selectDownloadDir=Browse for download directory
DownloadPane.toolbar.tooltip.createDownloadDir=Create directory
DownloadPane.toolbar.tooltip.applyDownloadDir=Set download directory for selected files
DownloadPane.toolbar.tooltip.pauseDownloading=Pause downloading
DownloadPane.toolbar.waiting=Waiting
DownloadPane.toolbar.label.downloadQuickload=Quickload
DownloadPane.toolbar.label.downloadPrefix=Prefix
DownloadPane.toolbar.label.downloadDir=Directory
DownloadPane.toolbar.downloadDirMenu.setDownloadDirTo=Set to...
FileAttachmentUploadThread.fileNotFoundError.text=The message that is currently send (maybe a send retry on next startup of Frost)\ncontains a file attachment that does not longer exist, or it is a 0 byte file!\n\nThe send of the message was aborted and the message file was deleted\nto prevent another upload try on next startup of Frost.\nFile: {0}
FileAttachmentUploadThread.fileNotFoundError.title=Unrecoverable error
FileListFileDetailsDialog.button.close=Close
FileListFileDetailsDialog.popupmenu.searchFilesOfOwner=Search for files of owner
FileListFileDetailsDialog.table.comment=Comment
FileListFileDetailsDialog.table.filename=Filename
FileListFileDetailsDialog.table.key=Key
FileListFileDetailsDialog.table.keywords=Keywords
FileListFileDetailsDialog.table.lastReceived=Last seen
FileListFileDetailsDialog.table.lastUploaded=Last upload
FileListFileDetailsDialog.table.owner=Owner
FileListFileDetailsDialog.table.rating=Rating
FileListFileDetailsDialog.table.state.never=Never
FileListFileDetailsDialog.table.state.unknown=Unknown
FileListFileDetailsDialog.table.trustState=Trust state
FileListFileDetailsDialog.title=File details
FirstStartupDialog.welcomeText.label=<html><br><font size="+2"><center><b>Welcome to Frost!</b></center></font><br><br>Frost will now connect to a Freenet 0.7 node.<br>By default Frost connects to a node on localhost<br>using the standard FCP2 darknet port: 127.0.0.1:9481</html>
FirstStartupDialog.overrideFcpHost.label=Override Freenet FCP host:port
FirstStartupDialog.title=Frost first startup
Frost.lockFileFound=This indicates that another Frost instance is already running in this directory.\nRunning Frost concurrently will cause data loss.\nIf you are REALLY SURE that Frost is not already running, delete the lockfile:\n
IdentitiesBrowser.button.cleanup.tooltip=Delete all identities without messages or files
IdentitiesBrowser.button.cleanup=Cleanup
IdentitiesBrowser.button.close=Close
IdentitiesBrowser.button.delete.tooltip.multiple=Delete selected identities
IdentitiesBrowser.button.delete.tooltip.single=Delete selected identity
IdentitiesBrowser.button.delete=Delete
IdentitiesBrowser.button.export=Export
IdentitiesBrowser.button.import=Import
IdentitiesBrowser.cleanupDialog.deleteIdentities.body=Cleanup will delete {0} unused identities.
IdentitiesBrowser.cleanupDialog.deleteIdentities.title=Cleanup identities
IdentitiesBrowser.cleanupDialog.nothingToDelete.body=There are no deletable identities.
IdentitiesBrowser.cleanupDialog.nothingToDelete.title=Cleanup identities
IdentitiesBrowser.deleteDialog.body=Delete {0} selected identities?
IdentitiesBrowser.deleteDialog.title=Delete identities
IdentitiesBrowser.exportIdentitiesConfirmXmlFileOverwrite.body=Overwite XML file ''{0}'' ?
IdentitiesBrowser.exportIdentitiesConfirmXmlFileOverwrite.title=Confirm overwrite
IdentitiesBrowser.identitiesExported.body=Exported {0} identities.
IdentitiesBrowser.identitiesExported.title=Identities exported
IdentitiesBrowser.identitiesExportFailed.body=Identities export failed.
IdentitiesBrowser.identitiesExportFailed.title=Export failed
IdentitiesBrowser.identitiesImported.body=<html>Imported {0} identities, skipped {1} duplicate identities.<br>You need to close and reopen this dialog to see the imported identities.</html>
IdentitiesBrowser.identitiesImported.title=Identities imported
IdentitiesBrowser.identitiesTable.files=Files
IdentitiesBrowser.identitiesTable.lastSeen=Last seen
IdentitiesBrowser.identitiesTable.messages=Messages
IdentitiesBrowser.identitiesTable.name=Name
IdentitiesBrowser.identitiesTable.receivedMessages=Received messages
IdentitiesBrowser.identitiesTable.state=State
IdentitiesBrowser.label.filter=Filter
IdentitiesBrowser.label.lookup=Lookup
IdentitiesBrowser.noIdentityToExport.body=No identities to export found.\nOnly GOOD, OBSERVE or BAD identities can be exported.
IdentitiesBrowser.noIdentityToExport.title=No identities to export
IdentitiesBrowser.noIdentityToImport.body=No identities to import found in XML file.
IdentitiesBrowser.noIdentityToImport.title=No identities found
IdentitiesBrowser.popupmenu.copyUniqueName=Copy unique name
IdentitiesBrowser.popupmenu.copyUniqueNameAndPublicKey=Copy unique name and public key
IdentitiesBrowser.popupmenu.exportSelectedIdentities=Export selected identities
IdentitiesBrowser.progressDialog.body=Retrieving identity information from database
IdentitiesBrowser.progressDialog.title=Retrieving identity information
IdentitiesBrowser.title=Identities Browser ({0} identities)
KnownBoardsFrame.boardsExported.body=Exported {0} known boards to XML file ''{1}''.
KnownBoardsFrame.boardsExported.title=Boards exported
KnownBoardsFrame.boardsImported.body=Loaded {0} boards from XML file ''{1}'', {2} new boards added to list.
KnownBoardsFrame.boardsImported.title=Boards imported
KnownBoardsFrame.button.actions=Actions
KnownBoardsFrame.button.addBoards=Add selected board(s)
KnownBoardsFrame.button.addBoardsToFolder=Add selected board(s) to folder
KnownBoardsFrame.button.close=Close
KnownBoardsFrame.button.export=Export
KnownBoardsFrame.button.hideBoard=Hide board name
KnownBoardsFrame.button.import=Import
KnownBoardsFrame.button.removeBoard=Remove selected board(s)
KnownBoardsFrame.button.unhideBoard=Unhide board name
KnownBoardsFrame.exportFailed.body=Export to XML file failed! Disk full?
KnownBoardsFrame.exportFailed.title=Export failed
KnownBoardsFrame.label.filter=Filter
KnownBoardsFrame.label.lookup=Lookup
KnownBoardsFrame.noBoardsImported.body=No boards found in XML file.
KnownBoardsFrame.noBoardsImported.title=No boards imported
KnownBoardsFrame.table.boardName=Boardname
KnownBoardsFrame.table.description=Description
KnownBoardsFrame.table.privateKey=Private key
KnownBoardsFrame.table.publicKey=Public key
KnownBoardsFrame.title=List of known boards
KnownBoardsFrame.tooltip.showHidden=Show hidden boards
MainFrame.dialog.renameFolder=Please enter the new name
MainFrame.menu.file.statistics=Statistics
MainFrame.menu.file=File
MainFrame.menu.help.aboutFrost=About
MainFrame.menu.help.help=Help
MainFrame.menu.help.showMemoryMonitor=Show memory monitor
MainFrame.menu.help=Help
MainFrame.menu.language.bulgarian=Bulgarian
MainFrame.menu.language.danish=Danish
MainFrame.menu.language.default=Default
MainFrame.menu.language.dutch=Dutch
MainFrame.menu.language.english=English
MainFrame.menu.language.esperanto=Esperanto
MainFrame.menu.language.french=French
MainFrame.menu.language.german=German
MainFrame.menu.language.italian=Italian
MainFrame.menu.language.japanese=Japanese
MainFrame.menu.language.polish=Polish
MainFrame.menu.language.russian=Russian
MainFrame.menu.language.spanish=Spanish
MainFrame.menu.language.swedish=Swedish
MainFrame.menu.language=Language
MainFrame.menu.news.automaticBoardUpdate=Automatic board update
MainFrame.menu.news.displayBoardInformationWindow=Display board information window
MainFrame.menu.news.displayBoardUpdateInformationMenuItem=Display board update informations
MainFrame.menu.news.displayKnownBoards=Display known boards
MainFrame.menu.news.searchMessages=Search messages
MainFrame.menu.news=News
MainFrame.menu.options.manageIdentities=Manage identities
MainFrame.menu.options.manageLocalIdentities=Manage own identities
MainFrame.menu.options.manageTrackedDownloads=Manage tracked donloaded files
MainFrame.menu.options.preferences=Preferences
MainFrame.menu.options=Options
MainFrame.menu.plugins.translateFrost=Translate Frost into another language
MainFrame.menu.plugins=Plugins
MainFrame.openCreateMessageWindows.body=Some create message windows are still open.\nDo you want to exit anyway?
MainFrame.openCreateMessageWindows.title=Discard messages
MainFrame.runningUploadsWarning.body=Some messages are still being uploaded.\nDo you want to exit anyway?
MainFrame.runningUploadsWarning.title=Uploads underway
MainFrame.statusBar.downloading=Downloading
MainFrame.statusBar.file=file
MainFrame.statusBar.fileListDownloadQueueSize=FLQ
MainFrame.statusBar.files=files
MainFrame.statusBar.selectedBoard=Selected board
MainFrame.statusBar.TOFDO=TOFDO
MainFrame.statusBar.TOFUP=TOFUP
MainFrame.statusBar.tooltip.fileListDownloadQueueSize=<html>Number of enqueued file lists to download.<br>Once all file lists are downloaded the file search finds the most current files.</html>
MainFrame.statusBar.uploading=Uploading
MainFrame.tabbedPane.downloads=Downloads
MainFrame.tabbedPane.freetalk=Freetalk
MainFrame.tabbedPane.news=News
MainFrame.tabbedPane.search=Search files
MainFrame.tabbedPane.sharing=My shared files
MainFrame.tabbedPane.uploads=Uploads
MainFrame.toolbar.tooltip.boardInformationWindow=Board Information Window
MainFrame.toolbar.tooltip.configureBoard=Configure board
MainFrame.toolbar.tooltip.displayListOfKnownBoards=Display list of known boards
MainFrame.toolbar.tooltip.minimizeToSystemTray=Minimize to System Tray
MainFrame.toolbar.tooltip.newBoard=New board
MainFrame.toolbar.tooltip.newFolder=New folder
MainFrame.toolbar.tooltip.removeBoard=Remove board
MainFrame.toolbar.tooltip.renameFolder=Rename folder
MainFrame.toolbar.tooltip.searchMessages=Search messages
MainFrameStatusBar.tooltip.tofdn=<html>Updating boards: {0}<br>Board update threads: {1}</html>
MainFrameStatusBar.tooltip.tofup=<html>Uploading messages: {0}<br>Waiting messages: {1}<br>Waiting attachments: {2}</html>
ManageLocalIdentities.button.close=Close
ManageLocalIdentities.button.createNewIdentity=Create Identity
ManageLocalIdentities.button.deleteIdentity=Delete Identity
ManageLocalIdentities.button.editSignature=Edit signature
ManageLocalIdentities.button.exportXml=Export into XML file
ManageLocalIdentities.button.importIdentity=Import from ''identities.xml''
ManageLocalIdentities.button.importXml=Import from XML file
ManageLocalIdentities.cannotDeleteLastIdentity.body=The last existing identity can not be deleted.
ManageLocalIdentities.cannotDeleteLastIdentity.title=Cannot delete last identity
ManageLocalIdentities.deleteIdentitiesSharedFilesConfirmation.body=The identity ''{0}'' shares {1} files which will be removed. Proceed?
ManageLocalIdentities.deleteIdentitiesSharedFilesConfirmation.title=Shared files for identity
ManageLocalIdentities.deleteIdentityConfirmation.body=Do you really want to delete the identity ''{0}''?
ManageLocalIdentities.deleteIdentityConfirmation.title=Confirm identity delete
ManageLocalIdentities.duplicateIdentity.body=Imported identity ''{0}'' is already in list.
ManageLocalIdentities.duplicateIdentity.title=Duplicate identity
ManageLocalIdentities.duplicateLocalIdentity.body=Imported identity ''{0}'' is already in list.
ManageLocalIdentities.duplicateLocalIdentity.title=Duplicate identity
ManageLocalIdentities.exportIdentitiesConfirmXmlFileOverwrite.body=Overwite XML file ''{0}'' ?
ManageLocalIdentities.exportIdentitiesConfirmXmlFileOverwrite.title=Confirm overwrite
ManageLocalIdentities.identitiesExported.body=Exported {0} identities.
ManageLocalIdentities.identitiesExported.title=Identities exported
ManageLocalIdentities.identitiesExportFailed.body=Identities export failed.
ManageLocalIdentities.identitiesExportFailed.title=Export failed
ManageLocalIdentities.identityImported.body=Imported identity ''{0}''.
ManageLocalIdentities.identityImported.title=Identity imported
ManageLocalidentities.listLabel=Own Identities
ManageLocalIdentities.localIdentitiesImported.body=Imported {0} identities.
ManageLocalIdentities.localIdentitiesImported.title=Identities imported
ManageLocalIdentities.noIdentityToImport.body=No identity to import found.
ManageLocalIdentities.noIdentityToImport.title=No identity found
ManageLocalIdentities.noLocalIdentityToImport.body=No identities to import found in XML file.
ManageLocalIdentities.noLocalIdentityToImport.title=No identities found
ManageLocalIdentities.privateKeyExportWarning.body=The private keys of your identities will be contained in the XML file!\nHandle this file carefully.
ManageLocalIdentities.privateKeyExportWarning.title=Private key warning
ManageLocalIdentities.title=Manage own identities
ManageLocalIdentitiesSignatureDialog.title=Edit signature for identity ''{0}''
ManageDownloadTrackingDialog.title=Manage tracked downloaded files
ManageDownloadTrackingDialog.table.name=Filename
ManageDownloadTrackingDialog.table.key=Key
ManageDownloadTrackingDialog.table.board=Board
ManageDownloadTrackingDialog.table.size=File size
ManageDownloadTrackingDialog.table.finished=download finished
ManageDownloadTrackingDialog.button.remove=Remove
ManageDownloadTrackingDialog.button.maxAge=Maximum Age (Days):
ManageDownloadTrackingDialog.button.maxAgeButton=Remove older items
ManageDownloadTrackingDialog.buttonTooltip.maxAgeButton=Remove all files which have been donloaded more than maximum age days ago
ManageDownloadTrackingDialog.button.removeSameBoard=Remove all from same board
ManageDownloadTrackingDialog.button.addKeys=Add Keys from Downloadlog
ManageDownloadTrackingDialog.buttonTooltip.addKeys=Add key from frost or fquid file download logfile
MessageFrame.attachBoard.sendPrivateKeyConfirmationDialog.body=You have the private key to board ''{0}''. Are you sure you want it attached?\nIf you choose NO, only the public key will be attached.
MessageFrame.attachBoard.sendPrivateKeyConfirmationDialog.title=Include private board key?
MessageFrame.attachmentTables.popupmenu.remove=Remove
MessageFrame.board=Board
MessageFrame.boardAttachmentTable.boardname=Boardname
MessageFrame.boardAttachmentTable.description=Description
MessageFrame.boardAttachmentTable.privateKey=Private key
MessageFrame.boardAttachmentTable.publicKey=Public key
MessageFrame.createMessage.title=Create message
MessageFrame.defaultSubjectWarning.text=Do you want to enter a subject?
MessageFrame.defaultSubjectWarning.title=No subject specified!
MessageFrame.discardMessage.text=Do you want to discard your unsent message?
MessageFrame.discardMessage.title=Discard message
MessageFrame.encryptErrorNoRecipient.body=Can't encrypt the message, no recipient choosed!
MessageFrame.encryptErrorNoRecipient.title=Encrypt error
MessageFrame.fileAttachmentTable.filename=Filename
MessageFrame.fileAttachmentTable.size=Size
MessageFrame.fileChooser.title=Choose file(s) / directory(s) to attach
MessageFrame.from=From
MessageFrame.noContentError.text=You must enter new content below the separator line!
MessageFrame.noContentError.title=No new message content!
MessageFrame.noSenderError.text=You must enter a sender name!
MessageFrame.noSenderError.title=No 'From' specified!
MessageFrame.noSubjectError.text=You must enter a subject!
MessageFrame.noSubjectError.title=No subject specified!
MessageFrame.subject=Subject
MessageFrame.textTooLargeError.text=The text of the message is too large ({0} characters, {1} allowed)!
MessageFrame.textTooLargeError.title=Message text is too large!
MessageFrame.toolbar.encryptFor=Encrypt for
MessageFrame.toolbar.tooltip.addBoardAttachments=Add Board(s)
MessageFrame.toolbar.tooltip.addFileAttachments=Add attachment(s)
MessageFrame.toolbar.tooltip.chooseSmiley=Insert smiley
MessageFrame.toolbar.tooltip.sendMessage=Send message
MessagePane.boardAttachmentTable.accessRights=Access rights
MessagePane.boardAttachmentTable.boardName=Board name
MessagePane.boardAttachmentTable.description=Description
MessagePane.boardAttachmentTable.popupmenu.addBoards=Add Board(s)
MessagePane.boardAttachmentTable.popupmenu.addBoardsToFolder=Add Board(s) to folder
MessagePane.boardAttachmentTable.popupmenu.addBoardsToKnownBoards=Add board(s) to list of known boards
MessagePane.defaultText.noBoardSelected=Select a board to view its content.
MessagePane.defaultText.noMessageSelected=Select a message to view its content.
MessagePane.defaultText.welcomeMessage=Please read this!\n\nTo use Frost, you first need to select a topic from the board information window. You can open this window with the i-button above. You can send messages and files to people using the same board. It will probably take some time until the first boards show up (press the update button).
MessagePane.fileAttachmentTable.filename=Filename
MessagePane.fileAttachmentTable.key=Key
MessagePane.fileAttachmentTable.popupmenu.downloadAttachments=Download attachment(s)
MessagePane.fileAttachmentTable.popupmenu.downloadSelectedAttachment=Download selected attachment
MessagePane.fileAttachmentTable.size=Size
MessagePane.hyperlink.popupmenu.copyAllFileKeysToClipboard=Copy all file keys to clipboard
MessagePane.hyperlink.popupmenu.copyFileKeyToClipboard=Copy file key to clipboard
MessagePane.hyperlink.popupmenu.copyFreesiteLinkToClipboard=Copy freesite link to clipboard
MessagePane.hyperlink.popupmenu.copyKeyToClipboard=Copy key to clipboard
MessagePane.hyperlink.popupmenu.downloadAllFileKeys=Download all file keys
MessagePane.hyperlink.popupmenu.downloadFileKey=Download file key
MessagePane.messageTable.date=Date
MessagePane.messageTable.from=From
MessagePane.messageTable.index=Index
MessagePane.messageTable.popupmenu.collapseAll=Collapse all
MessagePane.messageTable.popupmenu.collapseThread=Collapse thread
MessagePane.messageTable.popupmenu.deleteMessage=Delete message
MessagePane.messageTable.popupmenu.expandAll=Expand all
MessagePane.messageTable.popupmenu.expandThread=Expand thread
MessagePane.messageTable.popupmenu.markAllMessagesRead=Mark ALL messages read
MessagePane.messageTable.popupmenu.markMessageUnread=Mark message unread
MessagePane.messageTable.popupmenu.markSelectedMessagesReadItem=Mark selected messages read
MessagePane.messageTable.popupmenu.markSelectedMessagesUnreadItem=Mark selected messages unread
MessagePane.messageTable.popupmenu.markThreadRead=Mark message thread read
MessagePane.messageTable.popupmenu.setToBad=Mark user BAD
MessagePane.messageTable.popupmenu.setToCheck=Mark user CHECK
MessagePane.messageTable.popupmenu.setToGood=Mark user GOOD
MessagePane.messageTable.popupmenu.setToObserve=Mark user OBSERVE
MessagePane.messageTable.popupmenu.undeleteMessage=Undelete message
MessagePane.messageTable.sig=Sig
MessagePane.messageTable.subject=Subject
MessagePane.messageText.popupmenu.copy=Copy
MessagePane.messageText.popupmenu.saveMessageToDisk=Save message to disk
MessagePane.messageText.saveDialog.title=Save message to disk
MessagePane.messageText.downloadPrefixDialog.title=Filename prefix
MessagePane.messageText.popupmenu.downloadKeysTo=Download keys to...
MessagePane.messageText.popupmenu.browse=Browse...
MessagePane.messageText.downloadPrefixDialog.body=Enter text to prefix filenames with, or leave empty for no prefix
MessagePane.missingBoardError.text=Can't reply, the target board ''{0}'' is not in your boardlist.
MessagePane.missingBoardError.title=Error
MessagePane.missingLocalIdentityError.text=Can't reply encrypted, your identity ''{0}'' that received the original message is missing!
MessagePane.missingLocalIdentityError.title=Error
MessagePane.subjectText.popupmenu.copySubjectText=Copy subject
MessagePane.toolbar.labelAllMessageCount=Msg
MessagePane.toolbar.labelNewMessageCount=New
MessagePane.toolbar.tooltip.isSigned=This message will be sent signed
MessagePane.toolbar.tooltip.isUnsigned=This message will be sent anonymously
MessagePane.toolbar.tooltip.newMessage=New message
MessagePane.toolbar.tooltip.nextUnreadMessage=Next unread message
MessagePane.toolbar.tooltip.reply=Reply
MessagePane.toolbar.tooltip.saveMessage=Save message
MessagePane.toolbar.tooltip.setToBad=Mark user BAD
MessagePane.toolbar.tooltip.setToCheck=Mark user CHECK
MessagePane.toolbar.tooltip.setToGood=Mark user GOOD
MessagePane.toolbar.tooltip.setToObserve=Mark user OBSERVE
MessagePane.toolbar.tooltip.toggleShowHyperlinks=Toggle show keys as hyperlinks
MessagePane.toolbar.tooltip.toggleShowSmileys=Toggle show smileys
MessagePane.toolbar.tooltip.toggleShowThreads=Toggle show message threads
MessagePane.toolbar.tooltip.toggleShowUnreadOnly=Show only unread messages
MessagePane.toolbar.tooltip.toggleShowFlaggedOnly=Show only flagged messages
MessagePane.toolbar.tooltip.toggleShowStarredOnly=Show only starred messages
MessagePane.toolbar.tooltip.update=Update
MessagePane.unknownRecipientError.text=Can't reply encrypted, recipients ''{0}'' public key is missing!
MessagePane.unknownRecipientError.title=Error
MessageUploader.messageToLargeError.text=<html>The data you want to upload is too large (''{0}''), ''{1}'' is allowed.<br>This should never happen, please report this to a Frost developer!</html>
MessageUploader.messageToLargeError.title=Message is too large
MessageUploadFailedDialog.body=Frost was not able to upload your message.
MessageUploadFailedDialog.option.discardMessage=Discard message
MessageUploadFailedDialog.option.retry=Retry
MessageUploadFailedDialog.option.retryOnNextStartup=Retry on next startup
MessageUploadFailedDialog.title=Upload of message failed
MessageWindow.board=Board
MessageWindow.date=Date
MessageWindow.from=From
MessageWindow.subject=Subject
MessageWindow.to=To
MessageWindow.tooltip.reply=Reply
NewBoardDialog.add=Add Board
NewBoardDialog.description=Description (Optional). Do not put private information here:
NewBoardDialog.details=Please enter the details of the new board:
NewBoardDialog.name=Name:
NewBoardDialog.title=Add a new board
Options.boardTree=Board Tree
Options.common.days=days
Options.common.minutes=minutes
Options.common.off=Off
Options.common.on=On
Options.display.boardTree=Board Tree
Options.display.choose=Choose
Options.display.confirmMarkAllMsgsRead=Show confirmation dialog for 'Mark all messages read'
Options.display.enableAntialiasingForMessageBody=Enable antialiasing for message body
Options.display.enableMultilineSelectionsInMessageTable=Enable multiline selections in message table
Options.display.fileList=File List
Options.display.fontChooser.bold=Bold
Options.display.fontChooser.boldItalic=Bold Italic
Options.display.fontChooser.italic=Italic
Options.display.fontChooser.plain=Plain
Options.display.fontChooser.sample=Sample
Options.display.fontChooser.title=Choose a Font
Options.display.fonts=Fonts
Options.display.indicateLowReceivedMessages=Indicate low received messages for identities
Options.display.indicateLowReceivedMessagesCountLightRed=Maximum messages for LIGHTRED indicator
Options.display.indicateLowReceivedMessagesCountRed=Maximum messages for RED indicator
Options.display.messageBody=Message Body
Options.display.messageList=Message List
Options.display.preventBoardtreeReordering=Prevent board tree reordering
Options.display.refreshList=Refresh List
Options.display.saveSortStates=Save information about sorted table columns
Options.display.showBoardtreeFlaggedStarredIndicators=Show flagged/starred indicators in board tree
Options.display.showBoardUpdateCount=Show board update count for session in board tree
Options.display.showCollapsedThreads=Show collapsed message threads (default is expanded)
Options.display.expandRootChildren=Expand all replies (only root thread is collapsed)
Options.display.expandUnreadThreads=Expand unread threads
Options.display.doubleClickShowsMessage=Double clicking a message shows it in a new window
Options.display.showColoredRows=Show colored rows in tables
Options.display.showHorizontalScrollbarInMessageTable=Show horizontal scrollbar in message table
Options.display.showTooltipWithBoardDescriptionInBoardTree=Show tooltip with board description in board tree
Options.display.sortThreadRootMsgsAscending=Sort message thread root messages ascending (oldest topmost)
Options.display=Display
Options.downloads.downloadDirectory=Download directory
Options.downloads.downloadPriority=Download priority
Options.downloads.enforceFrostPriorityFileDownload=Enforce Frosts priority setting (reset external changes)
Options.downloads.filechooser.title=Select download directory
Options.downloads.logDownloads=Log successful downloads to ''localdata/Frost-Downloads.log''
Options.downloads.maximumNumberOfRetries=Maximum number of retries
Options.downloads.numberOfSimultaneousDownloads=Number of simultaneous downloads
Options.downloads.waittimeAfterEachTry=Waittime after each try
Options.downloads=Downloads
Options.downloads.trackDownloads=Warn if a file has already been downloaded previously
Options.downloads.downloadExec=Execute program on completion
Options.downloads.useBoardnameDownloadSubfolder=Save files in subfolder with name of the board
Options.expiration.archiveExpiredMessages=Archive expired messages
Options.expiration.cleanupIntervalDays=Cleanup interval
Options.expiration.cleanupNextStartup=Cleanup during next startup
Options.expiration.deleteExpiredMessages=Delete expired messages from keypool
Options.expiration.keepExpiredMessages=Keep expired messages in keypool
Options.expiration.keepFlaggedAndStarredMessages=Don't expire flagged and starred messages
Options.expiration.keepUnreadMessages=Don't expire unread messages
Options.expiration.numberOfDaysBeforeMessageExpires=Number of days before a message expires
Options.expiration.offlineFilesMaxDaysOld=Remove files from an owner after days not seen
Options.expiration.removeOfflineFilesWithKey=Also delete files from an owner when the file has a CHK key
Options.expiration=Expiration
Options.junk.hideJunkMessages=Hide JUNK messages
Options.junk.invalidSubsequentMessagesThreshold=Subsequent invalid messages threshold
Options.junk.markJunkIdentityBad=Mark identity that sent JUNK as BAD (if their current trust state is CHECK)
Options.junk.stopBoardUpdatesWhenDosed=Stop a board update when board is target of a DoS attack
Options.junk=Junk
Options.messages=Messages
Options.miscellaneous.automaticSavingInterval=Automatic saving interval
Options.miscellaneous.autoSaveLocalIdentities=Automatically backup own identities
Options.miscellaneous.compactStoragesDuringNextStartup=Compact storages during next startup
Options.miscellaneous.disableSplashscreen=Disable splashscreen
Options.miscellaneous.enableLogging=Enable logging
Options.miscellaneous.freenetFcpNode=Freenet node you have FCP access to (node:port)
Options.miscellaneous.logFileSizeLimit=Log files size limit (in KB)
Options.miscellaneous.loggingLevel=Logging level
Options.miscellaneous.logLevel.high=High
Options.miscellaneous.logLevel.low=Low
Options.miscellaneous.logLevel.medium=Medium
Options.miscellaneous.logLevel.veryHigh=Very high
Options.miscellaneous.logLevel.veryLow=Very low
Options.miscellaneous.minimizeToSystray=Always minimize to SysTray
Options.miscellaneous.showSysTrayIcon=Show SysTray icon
Options.miscellaneous.useDDA.tooltip=If enabled Frost tests if direct disk access is possible for a node
Options.miscellaneous.useDDA=Use direct disk access if possible
Options.miscellaneous.useEditorForWritingMessages=Use editor for writing messages
Options.miscellaneous.usePersistence=Use persistence and global queue for uploads and downloads
Options.miscellaneous=Miscellaneous
Options.news.1.alwaysDownloadBackload.tooltip=<html>Enabled: each board update downloads the configured days backwards<br>Disabled: the full backward download of X days is only done every 12 hours</html>
Options.news.1.alwaysDownloadBackload=Always download all days backward
Options.news.1.messageBase=Message base
Options.news.1.messageDownloadPriority=Message download priority
Options.news.1.messageUploadPriority=Message upload priority
Options.news.1.numberOfDaysToDisplay=Number of days to display
Options.news.1.numberOfDaysToDownloadBackwards=Number of days to download backwards
Options.news.1.storeSentMessages=Save sent messages
Options.news.1.useOneConnectionForMessages=Use a single connection for message transfers (requires restart of Frost)
Options.news.2.blockMessagesWithBody=Block messages with body containing (separate by ';' )
Options.news.2.blockMessagesWithSubject=Block messages with subject containing (separate by ';' )
Options.news.2.blockMessagesWithTheseBoards=Block messages with these attached boards (separate by ';' )
Options.news.2.dontAddBoardsFromTrustStates=Don't add boards to known boards list from users with trust states
Options.news.2.hideMessagesWithTrustStates=Hide messages with trust states
Options.news.2.hideMessageCount=Hide messages from identities with fewer than X received messages (0 disables)
Options.news.2.hideMessageCountExcludePrivate=Always show private messages
Options.news.2.trustState.bad=Bad
Options.news.2.trustState.check=Check
Options.news.2.trustState.none=None (unsigned)
Options.news.2.trustState.observe=Observe
Options.news.3.acceptSignatureFormatV1=Accept old signature format (disable for spam prevention)
Options.news.3.automaticBoardUpdate=Automatic board update
Options.news.3.backgroundColorIfUpdatingBoardIsNotSelected=Background color if updating board is not selected
Options.news.3.backgroundColorIfUpdatingBoardIsSelected=Background color if updating board is selected
Options.news.3.choose=Choose
Options.news.3.color=Color
Options.news.3.colorChooserDialog.title.chooseUpdatingColorOfSelectedBoards=Choose updating color of SELECTED boards
Options.news.3.colorChooserDialog.title.chooseUpdatingColorOfUnselectedBoards=Choose updating color of NON-SELECTED boards
Options.news.3.dontHandleOwnMessagesAsNew=Don't show received messages from ME as new
Options.news.3.dontShowOwnMessagesAsMe=Don't show own messages as ME
Options.news.3.minimumUpdateInterval=Minimum update interval of a board
Options.news.3.numberOfConcurrentlyUpdatingBoards=Number of concurrently updating boards
Options.news.3.showBoardUpdateVisualization=Show board update visualization
Options.news.3.showDeletedMessages=Show deleted messages
Options.news.3.silentlyRetryFailedMessages=Silently retry failed message uploads
Options.news=News
Options.search.archiveExtension=Archive Extension
Options.search.audioExtension=Audio Extension
Options.search.disableFilesharing=Disable filesharing
Options.search.documentExtension=Document Extension
Options.search.executableExtension=Executable Extension
Options.search.imageExtension=Image Extension
Options.search.maximumSearchResults=Maximum search results
Options.search.rememberSharedFileDownloaded=Remember if a shared file was downloaded
Options.search.resetHiddenFiles=Reset hidden files status
Options.search.videoExtension=Video Extension
Options.search.confirmResetHiddenFiles.title=Show all hidden files again?
Options.search.confirmResetHiddenFiles.body=Do you really want to reset the hidden state of the search files?
Options.search=Search
Options.title=Options
Options.uploads.enforceFrostPriorityFileUpload=Enforce Frosts priority setting (reset external changes)
Options.uploads.logUploads=Log manually added successful uploads to ''localdata/Frost-Uploads.log''
Options.uploads.maximumNumberOfRetries=Maximum number of retries
Options.uploads.numberOfSimultaneousUploads=Number of simultaneous uploads
Options.uploads.uploadPriority=Upload priority
Options.uploads.waittimeAfterEachTry=Waittime after each try
Options.uploads=Uploads
Options.uploads.removeNotExistingFiles=Periodically check for and remove non-existent/changed files in upload table
Options.uploads.uploadExec=Execute program on completion
Saver.AutoTask.message=Frost found an error while saving a resource and it will close itself.
Saver.AutoTask.title=Problem found.
SearchMessages.archive.searchInKeypoolAndArchive=Search in keypool and archive
SearchMessages.archive.searchOnlyInArchive=Search only in archive
SearchMessages.archive.searchOnlyInKeypool=Search only in keypool
SearchMessages.archive=Archive
SearchMessages.attachments.messageMustContainBoardAttachments=Message must contain board attachments
SearchMessages.attachments.messageMustContainFileAttachments=Message must contain file attachments
SearchMessages.attachments=Attachments
SearchMessages.boards.chooseBoards=Choose boards
SearchMessages.boards.searchFollowingBoards=Search following boards
SearchMessages.boards.searchInDisplayedBoards=Search in displayed boards
SearchMessages.boards=Boards
SearchMessages.button.close=Close
SearchMessages.button.help=Help
SearchMessages.button.openMessage=Open message
SearchMessages.button.search=Search
SearchMessages.button.stopSearch=Stop search
SearchMessages.date.searchAllDates=Search all dates
SearchMessages.date.searchBetweenDates=Search between dates
SearchMessages.date.searchInMessagesThatWouldBeDisplayed=Search in messages that would be displayed
SearchMessages.date.searchNumberOfDaysBackward=Search number of days backward
SearchMessages.date.to=to
SearchMessages.date=Date
SearchMessages.errorDialog.stopSearchBeforeClose=Please stop the search before closing the window.
SearchMessages.errorDialogs.invalidStartOrEndDate=Invalid start date or end date specified.
SearchMessages.errorDialogs.noBoardsChosen=No boards to search into were chosen.
SearchMessages.errorDialogs.noBoardsToChoose=There are no boards that could be choosed.
SearchMessages.errorDialogs.noTrustStateSelected=No trust state is selected.
SearchMessages.errorDialogs.startDateIsAfterEndDate=Start date is after end date.
SearchMessages.errorDialogs.title=Error
SearchMessages.label.results=Results
SearchMessages.label.searchResult=Search result
SearchMessages.resultTable.board=Board
SearchMessages.resultTable.date=Date
SearchMessages.resultTable.from=From
SearchMessages.resultTable.index=Index
SearchMessages.resultTable.sig=Sig
SearchMessages.resultTable.subject=Subject
SearchMessages.search.content=Content
SearchMessages.search.searchFlaggedMessagesOnly=Flagged messages
SearchMessages.search.searchPrivateMessagesOnly=Private messages
SearchMessages.search.searchRepliedMessagesOnly=Replied messages
SearchMessages.search.searchStarredMessagesOnly=Starred messages
SearchMessages.search.sender=Sender
SearchMessages.search.subject=Subject
SearchMessages.search.tooltip.caseSensitiv=Check to enable case sensitive search
SearchMessages.search=Search
SearchMessages.title=Search messages
SearchMessages.trustState.bad=Bad
SearchMessages.trustState.check=Check
SearchMessages.trustState.good=Good
SearchMessages.trustState.none=None (unsigned)
SearchMessages.trustState.observe=Observe
SearchMessages.trustState.searchAllMessages=Search all messages, no matter which trust state is set
SearchMessages.trustState.searchInMessagesThatWouldBeDisplayed=Search in messages that would be displayed
SearchMessages.trustState.searchOnlyInMessagesWithFollowingTrustState=Search only in messages with following trust state
SearchMessages.trustState.tampered=Tampered
SearchMessages.trustState=Trust state
SearchPane.fileTypes.allFiles=All files
SearchPane.fileTypes.archives=Archives
SearchPane.fileTypes.audio=Audio
SearchPane.fileTypes.documents=Documents
SearchPane.fileTypes.executables=Executables
SearchPane.fileTypes.images=Images
SearchPane.fileTypes.video=Video
SearchPane.resultTable.comment=Comment
SearchPane.resultTable.filename=Filename
SearchPane.resultTable.keywords=Keywords
SearchPane.resultTable.lastReceived=Last seen
SearchPane.resultTable.lastUploaded=Last uploaded
SearchPane.resultTable.popupmenu.downloadAllKeys=Download all keys
SearchPane.resultTable.popupmenu.downloadSelectedKeys=Download selected keys
SearchPane.resultTable.popupmenu.hideSelectedKeys=Hide selected keys
SearchPane.resultTable.rating=Rating
SearchPane.resultTable.size=Size
SearchPane.resultTable.sources.tooltip=<html>Sources for this file. An icon indicates that multiple owners provided additional informations.<br>Doubleclick in this column to show the details.</html>
SearchPane.resultTable.sources=Sources
SearchPane.resultTable.state=State
SearchPane.resultTable.states.downloaded=Downloaded
SearchPane.resultTable.states.downloading=Downloading
SearchPane.resultTable.states.offline=Offline
SearchPane.resultTable.states.sharing=Sharing
SearchPane.toolbar.comment=Comment
SearchPane.toolbar.keywords=Keywords
SearchPane.toolbar.name=Name
SearchPane.toolbar.owner=Owner
SearchPane.toolbar.searchOptions.hideFilesFromPeopleMarkedBad=Hide files from people marked BAD
SearchPane.toolbar.searchOptions.hideFilesFromPeopleMarkedCheck=Hide files from people marked CHECK
SearchPane.toolbar.searchOptions.hideFilesFromPeopleMarkedObserve=Hide files from people marked OBSERVE
SearchPane.toolbar.searchOptions.hideFilesWithoutChk=Hide files without CHK key
SearchPane.toolbar.searchOptionsButton=Options
SearchPane.toolbar.tooltip.clear=Clear textfields
SearchPane.toolbar.tooltip.search=Search
SearchPane.toolbar.tooltip.toggleMode=Toggle between simple and advanced search mode
SentMessages.confirmDeleteMessagesDialog.text=Do you want to permanently delete the {0} selected sent messages?
SentMessages.confirmDeleteMessagesDialog.title=Confirm delete
SentMessages.confirmDeleteOneMessageDialog.text=Do you want to permanently delete the selected sent message?
SentMessages.confirmDeleteOneMessageDialog.title=Confirm delete
SentMessages.folderName=Sent
SentMessages.label=Sent messages
SentMessages.table.board=Board
SentMessages.table.date=Date
SentMessages.table.from=From
SentMessages.table.popup.deleteMessage=Delete
SentMessages.table.subject=Subject
SentMessages.table.to=To
SharedFilesOwnerDialog.askForIdentity=Choose the owner identity for the new shared files
SharedFilesOwnerDialog.askIfToReplace=If file with same checksum does already exist
SharedFilesOwnerDialog.ignoreNewFile=Ignore the new file
SharedFilesOwnerDialog.replaceExistingFilePath=Set the file path to the path of the new file (owner is NOT changed!)
SharedFilesOwnerDialog.title=Choose an owner for the upload files
SharedFilesPane.filechooser.title=Select files to share
SharedFilesPane.fileTable.comment=Comment
SharedFilesPane.fileTable.filename=Filename
SharedFilesPane.fileTable.key=Key
SharedFilesPane.fileTable.keywords=Keywords
SharedFilesPane.fileTable.lastRequest=Last Request
SharedFilesPane.fileTable.lastShared=Last shared
SharedFilesPane.fileTable.lastUpload=Last upload
SharedFilesPane.fileTable.owner=Owner
SharedFilesPane.fileTable.path=Path
SharedFilesPane.fileTable.popupmenu.removeSelectedFiles=Remove selected files
SharedFilesPane.fileTable.popupmenu.uploadSelectedFiles=Upload selected files
SharedFilesPane.fileTable.rating=Rating
SharedFilesPane.fileTable.requestCount=Requests
SharedFilesPane.fileTable.size=Size
SharedFilesPane.fileTable.state.never=Never
SharedFilesPane.fileTable.state.unknown=Unknown
SharedFilesPane.fileTable.uploadCount=Uploads
SharedFilesPane.sizeChangedErrorDialog.text=The size of the choosed file is not the same as the size of the shared file.
SharedFilesPane.sizeChangedErrorDialog.title=Invalid file
SharedFilesPane.toolbar.files=Files
SharedFilesPane.toolbar.tooltip.browse=Add files to share
SmileyChooserDialog.title=Choose a smiley
Splashscreen.message.1=Initializing Mainframe..
Splashscreen.message.2=Leaving the gun..
Splashscreen.message.3=Taking the cannoli..
Splashscreen.message.4=Following the white rabbit..
Splashscreen.message.5=Engage!
StartupMessage.sharedFile.sharedFileLastModifiedChanged.text=<html>Shared file is invalid, remove or reshare the file.<br>Last modified date of shared file changed: {0}</html>
StartupMessage.sharedFile.sharedFileLastModifiedChanged.title=Invalid shared file
StartupMessage.sharedFile.sharedFileNotFound.text=<html>Shared file could not be located, remove or reshare the file.<br>Shared file not found: {0}</html>
StartupMessage.sharedFile.sharedFileNotFound.title=Invalid shared file
StartupMessage.sharedFile.sharedFileSizeChanged.text=<html>Shared file is invalid, remove or reshare the file.<br>Size of shared file changed: {0}</html>
StartupMessage.sharedFile.sharedFileSizeChanged.title=Invalid shared file
StartupMessage.uploadFile.boardsWithObsoleteKeysFound.text=<html>The board ''{0}'' has set an invalid public key whose encryption is not longer supported.<br>Remove the board or set a new public key.</html>
StartupMessage.uploadFile.boardsWithObsoleteKeysFound.title=Board has invalid public key
StartupMessage.uploadFile.uploadFileNotFound.text=<html>Upload file is invalid and was removed.<br>Upload file not found: {0}</html>
StartupMessage.uploadFile.uploadFileNotFound.title=Invalid upload file
StartupMessage.uploadFile.uploadFileSizeChanged.text=<html>Upload file is invalid and was removed.<br>Size of upload file changed: {0}</html>
StartupMessage.uploadFile.uploadFileSizeChanged.title=Invalid upload file
StatisticsDialog.button.close=Close
StatisticsDialog.label.archivedMessages=Archived messages
StatisticsDialog.label.files=Files
StatisticsDialog.label.fileSizes=File sizes
StatisticsDialog.label.identities=Identities
StatisticsDialog.label.messages=Messages
StatisticsDialog.label.sharers=Sharers
StatisticsDialog.title=Statistics
TargetFolderChooser.title=Choose a target folder
TOF.markAllReadConfirmation.board.content=Do you want to mark all messages in board ''{0}'' read?
TOF.markAllReadConfirmation.board.title=Mark all messages read
TOF.markAllReadConfirmation.folder.content=Do you want to mark all messages in all boards below folder ''{0}'' read?
TOF.markAllReadConfirmation.folder.title=Mark all messages read
UnsentMessages.confirmDeleteMessagesDialog.text=Do you want to permanently delete the {0} selected unsent messages?
UnsentMessages.confirmDeleteMessagesDialog.title=Confirm delete
UnsentMessages.confirmDeleteOneMessageDialog.text=Do you want to permanently delete the selected unsent message?
UnsentMessages.confirmDeleteOneMessageDialog.title=Confirm delete
UnsentMessages.deleteNotPossibleDialog.text=The message is currently uploading and cannot be deleted.
UnsentMessages.deleteNotPossibleDialog.title=Message upload already started
UnsentMessages.disableMessageUpload=Disable message upload
UnsentMessages.folderName=Outbox
UnsentMessages.label=Unsent messages
UnsentMessages.table.board=Board
UnsentMessages.table.from=From
UnsentMessages.table.popup.deleteMessage=Delete
UnsentMessages.table.state=State
UnsentMessages.table.stateUploading=Uploading
UnsentMessages.table.stateWaiting=Waiting
UnsentMessages.table.subject=Subject
UnsentMessages.table.timeAdded=Added
UnsentMessages.table.to=To
UploadPane.filechooser.title=Select files to upload
UploadPane.fileTable.blocks=Blocks
UploadPane.fileTable.enabled=Enabled
UploadPane.fileTable.filename=Filename
UploadPane.fileTable.key=Key
UploadPane.fileTable.path=Path
UploadPane.fileTable.popupmenu.enableUploads.disableAllUploads=Disable all uploads
UploadPane.fileTable.popupmenu.enableUploads.disableSelectedUploads=Disable selected uploads
UploadPane.fileTable.popupmenu.enableUploads.enableAllUploads=Enable all uploads
UploadPane.fileTable.popupmenu.enableUploads.enableSelectedUploads=Enable selected uploads
UploadPane.fileTable.popupmenu.enableUploads.invertEnabledStateForAllUploads=Invert enabled state for all uploads
UploadPane.fileTable.popupmenu.enableUploads.invertEnabledStateForSelectedUploads=Invert enabled state for selected uploads
UploadPane.fileTable.popupmenu.enableUploads=Enable uploads
UploadPane.fileTable.popupmenu.remove.removeSelectedFiles=Remove selected files
UploadPane.fileTable.popupmenu.remove=Remove
UploadPane.fileTable.popupmenu.removeFromGlobalQueue=Remove from global queue
UploadPane.fileTable.popupmenu.showSharedFile=Jump to shared file
UploadPane.fileTable.popupmenu.startEncodingOfSelectedFiles=Start encoding of selected files
UploadPane.fileTable.popupmenu.startSelectedUploadsNow=Start selected uploads immediately
UploadPane.fileTable.popupmenu.uploadSelectedFiles=Upload selected files
UploadPane.fileTable.priority=Priority
UploadPane.fileTable.shared.tooltip=An icon indicates a shared file.
UploadPane.fileTable.shared=Shared file
UploadPane.fileTable.size=Size
UploadPane.fileTable.state.done=Done
UploadPane.fileTable.state.encodeRequested=Encode requested
UploadPane.fileTable.state.encodingFile=Encoding file
UploadPane.fileTable.state.failed=Failed
UploadPane.fileTable.state.unknown=Unknown
UploadPane.fileTable.state.uploading=Uploading
UploadPane.fileTable.state.waiting=Waiting
UploadPane.fileTable.state=State
UploadPane.fileTable.tries=Tries
UploadPane.invalidUploadFilesRemoved.text=One or more upload files were not found or its size changed. The files are removed from upload table.
UploadPane.invalidUploadFilesRemoved.title=Invalid upload files
UploadPane.removeFinishedUploads=Remove finished
UploadPane.showExternalGlobalQueueItems=Show global queue
UploadPane.toolbar.tooltip.browse=Add files to upload
UploadPane.toolbar.waiting=Waiting
--------------020906060900040108030705
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--------------020906060900040108030705
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
Jtcfrost-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jtcfrost-devl
--------------020906060900040108030705--