@omujs/omu 0.9.32 → 0.9.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +70 -0
- package/dist/dts/api/asset/extension.d.ts +3 -3
- package/dist/dts/api/asset/index.d.ts +1 -1
- package/dist/dts/api/dashboard/extension.d.ts +13 -3
- package/dist/dts/api/dashboard/handler.d.ts +2 -1
- package/dist/dts/api/dashboard/index.d.ts +1 -1
- package/dist/dts/api/http/extension.d.ts +2 -135
- package/dist/dts/api/http/http.d.ts +36 -0
- package/dist/dts/api/http/websocket.d.ts +123 -0
- package/dist/dts/api/permission/extension.d.ts +1 -0
- package/dist/dts/index.d.ts +1 -3
- package/dist/dts/version.d.ts +2 -1
- package/dist/esm/api/asset/extension.js +43 -18
- package/dist/esm/api/asset/index.js +42 -17
- package/dist/esm/api/dashboard/extension.js +17 -13
- package/dist/esm/api/dashboard/index.js +17 -13
- package/dist/esm/api/endpoint/extension.js +3 -3
- package/dist/esm/api/extension.js +3 -3
- package/dist/esm/api/http/extension.js +262 -277
- package/dist/esm/api/http/http.js +442 -0
- package/dist/esm/api/http/index.js +262 -165
- package/dist/esm/api/http/websocket.js +220 -0
- package/dist/esm/api/i18n/extension.js +3 -3
- package/dist/esm/api/i18n/index.js +3 -3
- package/dist/esm/api/index.js +3 -3
- package/dist/esm/api/logger/extension.js +3 -3
- package/dist/esm/api/logger/index.js +3 -3
- package/dist/esm/api/permission/extension.js +6 -3
- package/dist/esm/api/plugin/extension.js +3 -3
- package/dist/esm/api/plugin/index.js +3 -3
- package/dist/esm/api/registry/extension.js +3 -3
- package/dist/esm/api/registry/index.js +3 -3
- package/dist/esm/api/server/extension.js +3 -3
- package/dist/esm/api/server/index.js +3 -3
- package/dist/esm/api/session/extension.js +3 -3
- package/dist/esm/api/session/index.js +3 -3
- package/dist/esm/api/signal/extension.js +3 -3
- package/dist/esm/api/table/extension.js +3 -3
- package/dist/esm/api/table/index.js +3 -3
- package/dist/esm/index.js +319 -189
- package/dist/esm/network/index.js +3 -3
- package/dist/esm/network/network.js +3 -3
- package/dist/esm/omu.js +318 -186
- package/dist/esm/version.js +5 -3
- package/package.json +1 -1
- package/src/api/asset/extension.ts +46 -12
- package/src/api/asset/index.ts +1 -2
- package/src/api/dashboard/extension.ts +29 -13
- package/src/api/dashboard/handler.ts +2 -1
- package/src/api/dashboard/index.ts +2 -0
- package/src/api/extension.ts +1 -1
- package/src/api/http/extension.ts +13 -364
- package/src/api/http/http.ts +79 -0
- package/src/api/http/websocket.ts +283 -0
- package/src/api/permission/extension.ts +4 -0
- package/src/index.ts +3 -5
- package/src/version.ts +2 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -831,17 +831,11 @@ class ExtensionType extends Identifier {
|
|
|
831
831
|
this.create = create;
|
|
832
832
|
}
|
|
833
833
|
key() {
|
|
834
|
-
return this.name;
|
|
834
|
+
return new Identifier("ext", this.name).key();
|
|
835
835
|
}
|
|
836
836
|
}
|
|
837
837
|
|
|
838
|
-
// src/api/http/
|
|
839
|
-
var HTTP_EXTENSION_TYPE = new ExtensionType("http", (omu) => new HttpExtension(omu));
|
|
840
|
-
var HTTP_REQUEST_PERMISSION_ID = HTTP_EXTENSION_TYPE.join("request");
|
|
841
|
-
var REQUEST_CREATE = PacketType.createJson(HTTP_EXTENSION_TYPE, {
|
|
842
|
-
name: "request_create"
|
|
843
|
-
});
|
|
844
|
-
|
|
838
|
+
// src/api/http/http.ts
|
|
845
839
|
class DataChunk {
|
|
846
840
|
meta;
|
|
847
841
|
body;
|
|
@@ -862,6 +856,248 @@ class DataChunk {
|
|
|
862
856
|
return new DataChunk(meta, body);
|
|
863
857
|
}
|
|
864
858
|
}
|
|
859
|
+
|
|
860
|
+
class OmuResponse {
|
|
861
|
+
headers;
|
|
862
|
+
ok;
|
|
863
|
+
redirected;
|
|
864
|
+
status;
|
|
865
|
+
statusText;
|
|
866
|
+
type;
|
|
867
|
+
url;
|
|
868
|
+
body;
|
|
869
|
+
bodyUsed;
|
|
870
|
+
constructor(headers, ok, redirected, status, statusText, type, url, body, bodyUsed) {
|
|
871
|
+
this.headers = headers;
|
|
872
|
+
this.ok = ok;
|
|
873
|
+
this.redirected = redirected;
|
|
874
|
+
this.status = status;
|
|
875
|
+
this.statusText = statusText;
|
|
876
|
+
this.type = type;
|
|
877
|
+
this.url = url;
|
|
878
|
+
this.body = body;
|
|
879
|
+
this.bodyUsed = bodyUsed;
|
|
880
|
+
}
|
|
881
|
+
clone() {
|
|
882
|
+
return new OmuResponse(this.headers, this.ok, this.redirected, this.status, this.statusText, this.type, this.url, this.body, this.bodyUsed);
|
|
883
|
+
}
|
|
884
|
+
async arrayBuffer() {
|
|
885
|
+
return await new Response(this.body).arrayBuffer();
|
|
886
|
+
}
|
|
887
|
+
blob() {
|
|
888
|
+
return new Response(this.body).blob();
|
|
889
|
+
}
|
|
890
|
+
bytes() {
|
|
891
|
+
return new Response(this.body).arrayBuffer().then((buf) => new Uint8Array(buf));
|
|
892
|
+
}
|
|
893
|
+
formData() {
|
|
894
|
+
return new Response(this.body).formData();
|
|
895
|
+
}
|
|
896
|
+
json() {
|
|
897
|
+
return new Response(this.body).json();
|
|
898
|
+
}
|
|
899
|
+
text() {
|
|
900
|
+
return new Response(this.body).text();
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
// src/api/http/websocket.ts
|
|
905
|
+
var WSMsgType = {
|
|
906
|
+
CONTINUATION: 0,
|
|
907
|
+
TEXT: 1,
|
|
908
|
+
BINARY: 2,
|
|
909
|
+
PING: 9,
|
|
910
|
+
PONG: 10,
|
|
911
|
+
CLOSE: 8
|
|
912
|
+
};
|
|
913
|
+
class OmuWS {
|
|
914
|
+
addQueue;
|
|
915
|
+
dispose;
|
|
916
|
+
receiveQueue;
|
|
917
|
+
receiveResolve;
|
|
918
|
+
status;
|
|
919
|
+
constructor(addQueue, dispose, receiveQueue = [], receiveResolve = undefined, status = "connecting") {
|
|
920
|
+
this.addQueue = addQueue;
|
|
921
|
+
this.dispose = dispose;
|
|
922
|
+
this.receiveQueue = receiveQueue;
|
|
923
|
+
this.receiveResolve = receiveResolve;
|
|
924
|
+
this.status = status;
|
|
925
|
+
}
|
|
926
|
+
toWebSocket() {
|
|
927
|
+
return new OmuWebSocket(this);
|
|
928
|
+
}
|
|
929
|
+
static create(options) {
|
|
930
|
+
const ws = new OmuWS(options.addQueue, options.dispose);
|
|
931
|
+
return {
|
|
932
|
+
ws,
|
|
933
|
+
open: (response) => {
|
|
934
|
+
ws.receiveQueue.push({
|
|
935
|
+
type: "open",
|
|
936
|
+
data: response
|
|
937
|
+
});
|
|
938
|
+
ws.receiveResolve?.();
|
|
939
|
+
},
|
|
940
|
+
dispatch: (data) => {
|
|
941
|
+
if (data.meta.type === WSMsgType.BINARY) {
|
|
942
|
+
ws.receiveQueue.push({
|
|
943
|
+
type: "binary",
|
|
944
|
+
data: data.body
|
|
945
|
+
});
|
|
946
|
+
} else {
|
|
947
|
+
ws.receiveQueue.push({
|
|
948
|
+
type: "text",
|
|
949
|
+
data: textDecoder.decode(data.body)
|
|
950
|
+
});
|
|
951
|
+
}
|
|
952
|
+
ws.receiveResolve?.();
|
|
953
|
+
},
|
|
954
|
+
close: (response) => {
|
|
955
|
+
ws.receiveQueue.push({
|
|
956
|
+
type: "close",
|
|
957
|
+
data: response
|
|
958
|
+
});
|
|
959
|
+
ws.receiveResolve?.();
|
|
960
|
+
},
|
|
961
|
+
error: (response) => {
|
|
962
|
+
ws.receiveQueue.push({
|
|
963
|
+
type: "error",
|
|
964
|
+
data: response
|
|
965
|
+
});
|
|
966
|
+
ws.receiveResolve?.();
|
|
967
|
+
}
|
|
968
|
+
};
|
|
969
|
+
}
|
|
970
|
+
send(data) {
|
|
971
|
+
this.addQueue(data);
|
|
972
|
+
}
|
|
973
|
+
close(code, reason) {
|
|
974
|
+
this.dispose({ code, reason });
|
|
975
|
+
}
|
|
976
|
+
async receive() {
|
|
977
|
+
if (this.receiveResolve) {
|
|
978
|
+
throw new Error("Already receiving from another async call");
|
|
979
|
+
}
|
|
980
|
+
while (this.status !== "closed") {
|
|
981
|
+
const data = this.receiveQueue.shift();
|
|
982
|
+
if (!data) {
|
|
983
|
+
await new Promise((resolve) => this.receiveResolve = resolve);
|
|
984
|
+
continue;
|
|
985
|
+
}
|
|
986
|
+
if (data.type === "close") {
|
|
987
|
+
this.status = "closed";
|
|
988
|
+
}
|
|
989
|
+
if (data.type === "open") {
|
|
990
|
+
this.status = "open";
|
|
991
|
+
}
|
|
992
|
+
this.receiveResolve = undefined;
|
|
993
|
+
return data;
|
|
994
|
+
}
|
|
995
|
+
throw new Error("Receiving on already closed socket");
|
|
996
|
+
}
|
|
997
|
+
protocol = "";
|
|
998
|
+
url = "";
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
class OmuWebSocket {
|
|
1002
|
+
ws;
|
|
1003
|
+
eventListeners;
|
|
1004
|
+
CONNECTING = 0;
|
|
1005
|
+
OPEN = 1;
|
|
1006
|
+
CLOSING = 2;
|
|
1007
|
+
CLOSED = 3;
|
|
1008
|
+
binaryType = "blob";
|
|
1009
|
+
bufferedAmount = 0;
|
|
1010
|
+
extensions = "";
|
|
1011
|
+
onclose = null;
|
|
1012
|
+
onerror = null;
|
|
1013
|
+
onmessage = null;
|
|
1014
|
+
onopen = null;
|
|
1015
|
+
protocol = "";
|
|
1016
|
+
readyState = 0;
|
|
1017
|
+
url = "";
|
|
1018
|
+
constructor(ws, eventListeners = {
|
|
1019
|
+
close: [],
|
|
1020
|
+
error: [],
|
|
1021
|
+
message: [],
|
|
1022
|
+
open: []
|
|
1023
|
+
}) {
|
|
1024
|
+
this.ws = ws;
|
|
1025
|
+
this.eventListeners = eventListeners;
|
|
1026
|
+
this.receiveLoop();
|
|
1027
|
+
}
|
|
1028
|
+
async receiveLoop() {
|
|
1029
|
+
while (this.readyState === WebSocket.CLOSED) {
|
|
1030
|
+
const { data, type } = await this.ws.receive();
|
|
1031
|
+
switch (type) {
|
|
1032
|
+
case "close":
|
|
1033
|
+
this.dispatchEvent(new CloseEvent("close", {
|
|
1034
|
+
code: data.code,
|
|
1035
|
+
reason: data.reason ?? undefined
|
|
1036
|
+
}));
|
|
1037
|
+
break;
|
|
1038
|
+
case "open":
|
|
1039
|
+
this.url = data.url;
|
|
1040
|
+
this.protocol = data.protocol ?? "";
|
|
1041
|
+
this.dispatchEvent(new Event("open", {}));
|
|
1042
|
+
break;
|
|
1043
|
+
case "error":
|
|
1044
|
+
this.dispatchEvent(new ErrorEvent("error", {
|
|
1045
|
+
error: data.type,
|
|
1046
|
+
message: data.reason ?? undefined
|
|
1047
|
+
}));
|
|
1048
|
+
break;
|
|
1049
|
+
case "text":
|
|
1050
|
+
case "binary":
|
|
1051
|
+
this.dispatchEvent(new MessageEvent("message", {
|
|
1052
|
+
data
|
|
1053
|
+
}));
|
|
1054
|
+
break;
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
dispatchEvent(event) {
|
|
1059
|
+
const listeners = this.eventListeners[event.type];
|
|
1060
|
+
for (const listener of listeners) {
|
|
1061
|
+
listener(event);
|
|
1062
|
+
}
|
|
1063
|
+
if (event.type === "open") {
|
|
1064
|
+
this.onopen?.(event);
|
|
1065
|
+
}
|
|
1066
|
+
if (event.type === "error") {
|
|
1067
|
+
this.onerror?.(event);
|
|
1068
|
+
}
|
|
1069
|
+
if (event.type === "message") {
|
|
1070
|
+
this.onmessage?.(event);
|
|
1071
|
+
}
|
|
1072
|
+
if (event.type === "close") {
|
|
1073
|
+
this.onclose?.(event);
|
|
1074
|
+
}
|
|
1075
|
+
return true;
|
|
1076
|
+
}
|
|
1077
|
+
send(data) {
|
|
1078
|
+
this.ws.send(data);
|
|
1079
|
+
}
|
|
1080
|
+
close(code, reason) {
|
|
1081
|
+
this.ws.close(code, reason);
|
|
1082
|
+
}
|
|
1083
|
+
addEventListener(type, listener) {
|
|
1084
|
+
this.eventListeners[type].push(listener);
|
|
1085
|
+
}
|
|
1086
|
+
removeEventListener(type, listener) {
|
|
1087
|
+
const listeners = this.eventListeners[type];
|
|
1088
|
+
const index = listeners.indexOf(listener);
|
|
1089
|
+
if (index !== -1) {
|
|
1090
|
+
listeners.splice(index, 1);
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
// src/api/http/extension.ts
|
|
1096
|
+
var HTTP_EXTENSION_TYPE = new ExtensionType("http", (omu) => new HttpExtension(omu));
|
|
1097
|
+
var HTTP_REQUEST_PERMISSION_ID = HTTP_EXTENSION_TYPE.join("request");
|
|
1098
|
+
var REQUEST_CREATE = PacketType.createJson(HTTP_EXTENSION_TYPE, {
|
|
1099
|
+
name: "request_create"
|
|
1100
|
+
});
|
|
865
1101
|
var REQUEST_SEND = PacketType.createSerialized(HTTP_EXTENSION_TYPE, {
|
|
866
1102
|
name: "request_send",
|
|
867
1103
|
serializer: DataChunk
|
|
@@ -879,29 +1115,6 @@ var RESPONSE_CHUNK = PacketType.createSerialized(HTTP_EXTENSION_TYPE, {
|
|
|
879
1115
|
var RESPONSE_CLOSE = PacketType.createJson(HTTP_EXTENSION_TYPE, {
|
|
880
1116
|
name: "response_close"
|
|
881
1117
|
});
|
|
882
|
-
var WSMsgType = {
|
|
883
|
-
CONTINUATION: 0,
|
|
884
|
-
TEXT: 1,
|
|
885
|
-
BINARY: 2,
|
|
886
|
-
PING: 9,
|
|
887
|
-
PONG: 10,
|
|
888
|
-
CLOSE: 8
|
|
889
|
-
};
|
|
890
|
-
var WSCloseCode = {
|
|
891
|
-
OK: 1000,
|
|
892
|
-
GOING_AWAY: 1001,
|
|
893
|
-
PROTOCOL_ERROR: 1002,
|
|
894
|
-
UNSUPPORTED_DATA: 1003,
|
|
895
|
-
ABNORMAL_CLOSURE: 1006,
|
|
896
|
-
INVALID_TEXT: 1007,
|
|
897
|
-
POLICY_VIOLATION: 1008,
|
|
898
|
-
MESSAGE_TOO_BIG: 1009,
|
|
899
|
-
MANDATORY_EXTENSION: 1010,
|
|
900
|
-
INTERNAL_ERROR: 1011,
|
|
901
|
-
SERVICE_RESTART: 1012,
|
|
902
|
-
TRY_AGAIN_LATER: 1013,
|
|
903
|
-
BAD_GATEWAY: 1014
|
|
904
|
-
};
|
|
905
1118
|
var WEBSOCKET_CREATE = PacketType.createJson(HTTP_EXTENSION_TYPE, {
|
|
906
1119
|
name: "ws_create"
|
|
907
1120
|
});
|
|
@@ -1147,14 +1360,22 @@ class HttpExtension {
|
|
|
1147
1360
|
async ws(input, options) {
|
|
1148
1361
|
const request = new Request(input, options);
|
|
1149
1362
|
const id = this.generateId();
|
|
1150
|
-
const handle = OmuWS.create(
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1363
|
+
const handle = OmuWS.create({
|
|
1364
|
+
addQueue: (data) => {
|
|
1365
|
+
this.wsSendQueue.push({
|
|
1366
|
+
id: id.key(),
|
|
1367
|
+
data
|
|
1368
|
+
});
|
|
1369
|
+
this.wsSendWaitResolve();
|
|
1370
|
+
},
|
|
1371
|
+
dispose: (options2) => {
|
|
1372
|
+
this.omu.send(WEBSOCKET_CLOSE, {
|
|
1373
|
+
id: id.key(),
|
|
1374
|
+
code: options2.code,
|
|
1375
|
+
reason: options2.reason
|
|
1376
|
+
});
|
|
1377
|
+
delete this.wsHandles[id.key()];
|
|
1378
|
+
}
|
|
1158
1379
|
});
|
|
1159
1380
|
this.wsHandles[id.key()] = {
|
|
1160
1381
|
type: "created",
|
|
@@ -1170,238 +1391,6 @@ class HttpExtension {
|
|
|
1170
1391
|
return handle.ws;
|
|
1171
1392
|
}
|
|
1172
1393
|
}
|
|
1173
|
-
|
|
1174
|
-
class OmuResponse {
|
|
1175
|
-
headers;
|
|
1176
|
-
ok;
|
|
1177
|
-
redirected;
|
|
1178
|
-
status;
|
|
1179
|
-
statusText;
|
|
1180
|
-
type;
|
|
1181
|
-
url;
|
|
1182
|
-
body;
|
|
1183
|
-
bodyUsed;
|
|
1184
|
-
constructor(headers, ok, redirected, status, statusText, type, url, body, bodyUsed) {
|
|
1185
|
-
this.headers = headers;
|
|
1186
|
-
this.ok = ok;
|
|
1187
|
-
this.redirected = redirected;
|
|
1188
|
-
this.status = status;
|
|
1189
|
-
this.statusText = statusText;
|
|
1190
|
-
this.type = type;
|
|
1191
|
-
this.url = url;
|
|
1192
|
-
this.body = body;
|
|
1193
|
-
this.bodyUsed = bodyUsed;
|
|
1194
|
-
}
|
|
1195
|
-
clone() {
|
|
1196
|
-
return new OmuResponse(this.headers, this.ok, this.redirected, this.status, this.statusText, this.type, this.url, this.body, this.bodyUsed);
|
|
1197
|
-
}
|
|
1198
|
-
async arrayBuffer() {
|
|
1199
|
-
return await new Response(this.body).arrayBuffer();
|
|
1200
|
-
}
|
|
1201
|
-
blob() {
|
|
1202
|
-
return new Response(this.body).blob();
|
|
1203
|
-
}
|
|
1204
|
-
bytes() {
|
|
1205
|
-
return new Response(this.body).arrayBuffer().then((buf) => new Uint8Array(buf));
|
|
1206
|
-
}
|
|
1207
|
-
formData() {
|
|
1208
|
-
return new Response(this.body).formData();
|
|
1209
|
-
}
|
|
1210
|
-
json() {
|
|
1211
|
-
return new Response(this.body).json();
|
|
1212
|
-
}
|
|
1213
|
-
text() {
|
|
1214
|
-
return new Response(this.body).text();
|
|
1215
|
-
}
|
|
1216
|
-
}
|
|
1217
|
-
|
|
1218
|
-
class OmuWS {
|
|
1219
|
-
omu;
|
|
1220
|
-
id;
|
|
1221
|
-
addQueue;
|
|
1222
|
-
dispose;
|
|
1223
|
-
receiveQueue;
|
|
1224
|
-
receiveResolve;
|
|
1225
|
-
status;
|
|
1226
|
-
constructor(omu, id, addQueue, dispose, receiveQueue = [], receiveResolve = undefined, status = "connecting") {
|
|
1227
|
-
this.omu = omu;
|
|
1228
|
-
this.id = id;
|
|
1229
|
-
this.addQueue = addQueue;
|
|
1230
|
-
this.dispose = dispose;
|
|
1231
|
-
this.receiveQueue = receiveQueue;
|
|
1232
|
-
this.receiveResolve = receiveResolve;
|
|
1233
|
-
this.status = status;
|
|
1234
|
-
}
|
|
1235
|
-
static create(omu, id, addQueue, dispose) {
|
|
1236
|
-
const ws = new OmuWS(omu, id, addQueue, dispose);
|
|
1237
|
-
return {
|
|
1238
|
-
ws,
|
|
1239
|
-
open: (response) => {
|
|
1240
|
-
ws.receiveQueue.push({
|
|
1241
|
-
type: "open",
|
|
1242
|
-
data: response
|
|
1243
|
-
});
|
|
1244
|
-
ws.receiveResolve?.();
|
|
1245
|
-
},
|
|
1246
|
-
dispatch: (data) => {
|
|
1247
|
-
if (data.meta.type === WSMsgType.BINARY) {
|
|
1248
|
-
ws.receiveQueue.push({
|
|
1249
|
-
type: "binary",
|
|
1250
|
-
data: data.body
|
|
1251
|
-
});
|
|
1252
|
-
} else {
|
|
1253
|
-
ws.receiveQueue.push({
|
|
1254
|
-
type: "text",
|
|
1255
|
-
data: textDecoder.decode(data.body)
|
|
1256
|
-
});
|
|
1257
|
-
}
|
|
1258
|
-
ws.receiveResolve?.();
|
|
1259
|
-
},
|
|
1260
|
-
close: (response) => {
|
|
1261
|
-
ws.receiveQueue.push({
|
|
1262
|
-
type: "close",
|
|
1263
|
-
data: response
|
|
1264
|
-
});
|
|
1265
|
-
ws.receiveResolve?.();
|
|
1266
|
-
},
|
|
1267
|
-
error: (response) => {
|
|
1268
|
-
ws.receiveQueue.push({
|
|
1269
|
-
type: "error",
|
|
1270
|
-
data: response
|
|
1271
|
-
});
|
|
1272
|
-
ws.receiveResolve?.();
|
|
1273
|
-
}
|
|
1274
|
-
};
|
|
1275
|
-
}
|
|
1276
|
-
send(data) {
|
|
1277
|
-
this.addQueue(data);
|
|
1278
|
-
}
|
|
1279
|
-
close(code, reason) {
|
|
1280
|
-
this.omu.send(WEBSOCKET_CLOSE, {
|
|
1281
|
-
id: this.id.key(),
|
|
1282
|
-
code,
|
|
1283
|
-
reason
|
|
1284
|
-
});
|
|
1285
|
-
this.dispose();
|
|
1286
|
-
}
|
|
1287
|
-
async receive() {
|
|
1288
|
-
if (this.receiveResolve) {
|
|
1289
|
-
throw new Error("Already receiving from another async call");
|
|
1290
|
-
}
|
|
1291
|
-
while (this.status !== "closed") {
|
|
1292
|
-
const data = this.receiveQueue.shift();
|
|
1293
|
-
if (!data) {
|
|
1294
|
-
await new Promise((resolve) => this.receiveResolve = resolve);
|
|
1295
|
-
continue;
|
|
1296
|
-
}
|
|
1297
|
-
if (data.type === "close") {
|
|
1298
|
-
this.status = "closed";
|
|
1299
|
-
}
|
|
1300
|
-
if (data.type === "open") {
|
|
1301
|
-
this.status = "open";
|
|
1302
|
-
}
|
|
1303
|
-
this.receiveResolve = undefined;
|
|
1304
|
-
return data;
|
|
1305
|
-
}
|
|
1306
|
-
throw new Error("Receiving on already closed socket");
|
|
1307
|
-
}
|
|
1308
|
-
protocol = "";
|
|
1309
|
-
url = "";
|
|
1310
|
-
}
|
|
1311
|
-
|
|
1312
|
-
class OmuWebSocket {
|
|
1313
|
-
ws;
|
|
1314
|
-
eventListeners;
|
|
1315
|
-
CONNECTING = 0;
|
|
1316
|
-
OPEN = 1;
|
|
1317
|
-
CLOSING = 2;
|
|
1318
|
-
CLOSED = 3;
|
|
1319
|
-
binaryType = "blob";
|
|
1320
|
-
bufferedAmount = 0;
|
|
1321
|
-
extensions = "";
|
|
1322
|
-
onclose = null;
|
|
1323
|
-
onerror = null;
|
|
1324
|
-
onmessage = null;
|
|
1325
|
-
onopen = null;
|
|
1326
|
-
protocol = "";
|
|
1327
|
-
readyState = 0;
|
|
1328
|
-
url = "";
|
|
1329
|
-
constructor(ws, eventListeners = {
|
|
1330
|
-
close: [],
|
|
1331
|
-
error: [],
|
|
1332
|
-
message: [],
|
|
1333
|
-
open: []
|
|
1334
|
-
}) {
|
|
1335
|
-
this.ws = ws;
|
|
1336
|
-
this.eventListeners = eventListeners;
|
|
1337
|
-
this.receiveLoop();
|
|
1338
|
-
}
|
|
1339
|
-
async receiveLoop() {
|
|
1340
|
-
while (this.readyState === WebSocket.CLOSED) {
|
|
1341
|
-
const { data, type } = await this.ws.receive();
|
|
1342
|
-
switch (type) {
|
|
1343
|
-
case "close":
|
|
1344
|
-
this.dispatchEvent(new CloseEvent("close", {
|
|
1345
|
-
code: data.code,
|
|
1346
|
-
reason: data.reason ?? undefined
|
|
1347
|
-
}));
|
|
1348
|
-
break;
|
|
1349
|
-
case "open":
|
|
1350
|
-
this.url = data.url;
|
|
1351
|
-
this.protocol = data.protocol ?? "";
|
|
1352
|
-
this.dispatchEvent(new Event("open", {}));
|
|
1353
|
-
break;
|
|
1354
|
-
case "error":
|
|
1355
|
-
this.dispatchEvent(new ErrorEvent("error", {
|
|
1356
|
-
error: data.type,
|
|
1357
|
-
message: data.reason ?? undefined
|
|
1358
|
-
}));
|
|
1359
|
-
break;
|
|
1360
|
-
case "text":
|
|
1361
|
-
case "binary":
|
|
1362
|
-
this.dispatchEvent(new MessageEvent("message", {
|
|
1363
|
-
data
|
|
1364
|
-
}));
|
|
1365
|
-
break;
|
|
1366
|
-
}
|
|
1367
|
-
}
|
|
1368
|
-
}
|
|
1369
|
-
dispatchEvent(event) {
|
|
1370
|
-
const listeners = this.eventListeners[event.type];
|
|
1371
|
-
for (const listener of listeners) {
|
|
1372
|
-
listener(event);
|
|
1373
|
-
}
|
|
1374
|
-
if (event.type === "open") {
|
|
1375
|
-
this.onopen?.(event);
|
|
1376
|
-
}
|
|
1377
|
-
if (event.type === "error") {
|
|
1378
|
-
this.onerror?.(event);
|
|
1379
|
-
}
|
|
1380
|
-
if (event.type === "message") {
|
|
1381
|
-
this.onmessage?.(event);
|
|
1382
|
-
}
|
|
1383
|
-
if (event.type === "close") {
|
|
1384
|
-
this.onclose?.(event);
|
|
1385
|
-
}
|
|
1386
|
-
return true;
|
|
1387
|
-
}
|
|
1388
|
-
send(data) {
|
|
1389
|
-
this.ws.send(data);
|
|
1390
|
-
}
|
|
1391
|
-
close(code, reason) {
|
|
1392
|
-
this.ws.close(code, reason);
|
|
1393
|
-
}
|
|
1394
|
-
addEventListener(type, listener) {
|
|
1395
|
-
this.eventListeners[type].push(listener);
|
|
1396
|
-
}
|
|
1397
|
-
removeEventListener(type, listener) {
|
|
1398
|
-
const listeners = this.eventListeners[type];
|
|
1399
|
-
const index = listeners.indexOf(listener);
|
|
1400
|
-
if (index !== -1) {
|
|
1401
|
-
listeners.splice(index, 1);
|
|
1402
|
-
}
|
|
1403
|
-
}
|
|
1404
|
-
}
|
|
1405
1394
|
async function toUint8Array(data) {
|
|
1406
1395
|
if (typeof data === "string") {
|
|
1407
1396
|
return textEncoder.encode(data);
|
|
@@ -1413,14 +1402,10 @@ async function toUint8Array(data) {
|
|
|
1413
1402
|
}
|
|
1414
1403
|
}
|
|
1415
1404
|
export {
|
|
1416
|
-
WSMsgType,
|
|
1417
|
-
WSCloseCode,
|
|
1418
|
-
OmuWebSocket,
|
|
1419
|
-
OmuWS,
|
|
1420
1405
|
HttpExtension,
|
|
1421
1406
|
HTTP_REQUEST_PERMISSION_ID,
|
|
1422
1407
|
HTTP_EXTENSION_TYPE
|
|
1423
1408
|
};
|
|
1424
1409
|
|
|
1425
|
-
//# debugId=
|
|
1426
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnN0LnRzIiwgIi4uLy4uL3NyYy9pZGVudGlmaWVyLnRzIiwgIi4uLy4uL3NyYy9hcHAudHMiLCAiLi4vLi4vc3JjL3NlcmlhbGl6ZS9zZXJpYWxpemVyLnRzIiwgIi4uLy4uL3NyYy9zZXJpYWxpemUvYnl0ZWJ1ZmZlci50cyIsICIuLi8uLi9zcmMvbmV0d29yay9wYWNrZXQvcGFja2V0LnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMudHMiLCAiLi4vLi4vc3JjL2FwaS9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9odHRwL2V4dGVuc2lvbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJleHBvcnQgY29uc3QgdGV4dEVuY29kZXI6IFRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5leHBvcnQgY29uc3QgdGV4dERlY29kZXI6IFRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4iLAogICAgImltcG9ydCB0eXBlIHsgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4vYXBwJztcblxuY29uc3QgTkFNRVNQQUNFX1JFR0VYID0gL14oXFwuW14vOi5dfFtcXHctXSkrJC87XG5jb25zdCBOQU1FX1JFR0VYID0gL15bXi86XSskLztcblxuZXhwb3J0IHR5cGUgSW50b0lkID0gSWRlbnRpZmllciB8IHN0cmluZyB8IEV4dGVuc2lvblR5cGUgfCBBcHA7XG5cbmV4cG9ydCBjbGFzcyBJZGVudGlmaWVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZ1tdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgICAgICAuLi5wYXRoOiBzdHJpbmdbXVxuICAgICkge1xuICAgICAgICBJZGVudGlmaWVyLnZhbGlkYXRlKG5hbWVzcGFjZSwgcGF0aCk7XG4gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllci5rZXkoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKGpzb246IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tSnNvbihqc29uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb20oaWQ6IEludG9JZCk6IElkZW50aWZpZXIge1xuICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQgaW5zdGFuY2VvZiBBcHApIHtcbiAgICAgICAgICAgIHJldHVybiBpZC5pZDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tS2V5KGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBpbmZlclxuICAgICAgICAgICAgLy8gVml0ZSBkb2VzIG5vdCBwcmVzZXJ2ZSBjbGFzcyBpbmZvcm1hdGlvbiB3aGVuIGltcG9ydGluZyBmcm9tIGRpZmZlcmVudCBwYWNrYWdlc1xuICAgICAgICAgICAgY29uc3QgaWRDYXN0ZWQgPSBpZCBhcyB7IG5hbWVzcGFjZTogc3RyaW5nOyBwYXRoOiBzdHJpbmdbXSB9O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiBpZENhc3RlZC5uYW1lc3BhY2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpZENhc3RlZC5wYXRoKSAmJlxuICAgICAgICAgICAgICAgIGlkQ2FzdGVkLnBhdGguZXZlcnkoKHApID0+IHR5cGVvZiBwID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihpZENhc3RlZC5uYW1lc3BhY2UsIC4uLmlkQ2FzdGVkLnBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaWRXaXRoSWQgPSBpZCBhcyB7IGlkOiBJbnRvSWQgfCB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWRXaXRoSWQuaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbShpZFdpdGhJZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IHRvIElkZW50aWZpZXI6ICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21PcHRpb25hbChpZDogSW50b0lkIHwgdW5kZWZpbmVkIHwgbnVsbCk6IElkZW50aWZpZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tKGlkKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGUobmFtZXNwYWNlOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghbmFtZXNwYWNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbmFtZXNwYWNlOiBOYW1lc3BhY2UgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGF0aDogUGF0aCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5hbWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU5BTUVTUEFDRV9SRUdFWC50ZXN0KG5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuYW1lc3BhY2U6IE5hbWVzcGFjZSBtdXN0IG1hdGNoICR7TkFNRVNQQUNFX1JFR0VYfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBwYXRoKSB7XG4gICAgICAgICAgICBpZiAoIU5BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXRoOiBOYW1lIG11c3QgbWF0Y2ggJHtOQU1FX1JFR0VYfSBidXQgZ290ICR7bmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmb3JtYXQobmFtZXNwYWNlOiBzdHJpbmcsIC4uLnBhdGg6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgSWRlbnRpZmllci52YWxpZGF0ZShuYW1lc3BhY2UsIHBhdGgpO1xuICAgICAgICByZXR1cm4gYCR7bmFtZXNwYWNlfToke3BhdGguam9pbignLycpfWA7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21LZXkoa2V5OiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0ga2V5LmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKHNlcGFyYXRvciA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXk6IE5vIHNlcGFyYXRvciBmb3VuZCBpbiAke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoJzonLCBzZXBhcmF0b3IgKyAxKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXk6IE11bHRpcGxlIHNlcGFyYXRvcnMgZm91bmQgaW4gJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID0ga2V5LnNsaWNlKDAsIHNlcGFyYXRvcik7XG4gICAgICAgIGNvbnN0IHBhdGggPSBrZXkuc2xpY2Uoc2VwYXJhdG9yICsgMSk7XG4gICAgICAgIGlmICghbmFtZXNwYWNlIHx8ICFwYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5OiBOYW1lc3BhY2UgYW5kIHBhdGggY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKG5hbWVzcGFjZSwgLi4ucGF0aC5zcGxpdCgnLycpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VcmwodXJsOiBzdHJpbmcgfCBVUkwpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICBjb25zdCBuYW1lc3BhY2UgPSBJZGVudGlmaWVyLm5hbWVzcGFjZUZyb21VcmwocGFyc2VkVXJsLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXRoID0gcGFyc2VkVXJsLnBhdGhuYW1lLnNsaWNlKDEpLnNwbGl0KCcvJyk7XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcihuYW1lc3BhY2UsIC4uLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbmFtZXNwYWNlRnJvbVVybCh1cmw6IHN0cmluZyB8IFVSTCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlZC5ob3N0bmFtZS5zcGxpdCgnLicpLnJldmVyc2UoKS5qb2luKCcuJyk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXkoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpzb24oanNvbjogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb21LZXkoanNvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGtleSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mb3JtYXQodGhpcy5uYW1lc3BhY2UsIC4uLnRoaXMucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWwob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5KCkgPT09IG90aGVyLmtleSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc05hbWVzcGFjZUVxdWFsKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZSA9PT0gb3RoZXIubmFtZXNwYWNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1N1YnBhdGhPZihvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5uYW1lc3BhY2UgIT09IG90aGVyLm5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhdGgubGVuZ3RoIDwgb3RoZXIucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG90aGVyLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhdGhbaV0gIT09IG90aGVyLnBhdGhbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW4oLi4ucGF0aDogc3RyaW5nW10pOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKHRoaXMubmFtZXNwYWNlLCAuLi50aGlzLnBhdGgsIC4uLnBhdGgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJNYXA8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFwOiBNYXA8c3RyaW5nLCBUPiA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZW50cmllcz86IEl0ZXJhYmxlPFtJZGVudGlmaWVyLCBUXT4sXG4gICAgKSB7XG4gICAgICAgIGlmICghZW50cmllcykgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChpZC5rZXkoKSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoaWRlbnRpZmllcjogSWRlbnRpZmllciwgdmFsdWU6IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0KGlkZW50aWZpZXIua2V5KCksIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLmhhcyhpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuZGVsZXRlKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMubWFwLmtleXMoKSkge1xuICAgICAgICAgICAgeWllbGQgSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHVibGljICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0lkZW50aWZpZXIsIFRdPiB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMubWFwLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW0lkZW50aWZpZXIuZnJvbUtleShrZXkpLCB2YWx1ZV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgVF0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJTZXQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQuc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKGlkZW50aWZpZXI6IElkZW50aWZpZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQuYWRkKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQuaGFzKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5kZWxldGUoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqa2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPElkZW50aWZpZXI+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5zZXQua2V5cygpKSB7XG4gICAgICAgICAgICB5aWVsZCBJZGVudGlmaWVyLmZyb21LZXkoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxJZGVudGlmaWVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgSWRlbnRpZmllcl0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5zZXQua2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gSWRlbnRpZmllci5mcm9tS2V5KGtleSk7XG4gICAgICAgICAgICB5aWVsZCBbaWRlbnRpZmllciwgaWRlbnRpZmllcl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgSWRlbnRpZmllcl0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciwgSW50b0lkIH0gZnJvbSAnLi9pZGVudGlmaWVyJztcbmltcG9ydCB0eXBlIHsgTG9jYWxlIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vbG9jYWxlLmpzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxpemVkVGV4dCB9IGZyb20gJy4vbG9jYWxpemF0aW9uL2xvY2FsaXphdGlvbi5qcyc7XG5cbmV4cG9ydCB0eXBlIEFwcE1ldGFkYXRhID0ge1xuICAgIGxvY2FsZTogTG9jYWxlO1xuICAgIG5hbWU/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGljb24/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGRlc2NyaXB0aW9uPzogTG9jYWxpemVkVGV4dDtcbiAgICBpbWFnZT86IExvY2FsaXplZFRleHQ7XG4gICAgc2l0ZT86IExvY2FsaXplZFRleHQ7XG4gICAgcmVwb3NpdG9yeT86IExvY2FsaXplZFRleHQ7XG4gICAgYXV0aG9ycz86IExvY2FsaXplZFRleHQ7XG4gICAgbGljZW5zZT86IExvY2FsaXplZFRleHQ7XG4gICAgdGFncz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgQXBwVHlwZSA9ICdhcHAnIHwgJ3NlcnZpY2UnIHwgJ3JlbW90ZScgfCAncGx1Z2luJyB8ICdkYXNoYm9hcmQnO1xuXG5leHBvcnQgdHlwZSBEZXBlbmRlbmN5U3BlY2lmaWVyID0ge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBpbmRleD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFwcEpzb24gPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBBcHBUeXBlO1xuICAgIHBhcmVudF9pZD86IHN0cmluZztcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xufTtcblxuZXhwb3J0IGNsYXNzIEFwcCB7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyO1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBBcHBUeXBlO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXJlbnRJZD86IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHVybD86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBEZXBlbmRlbmN5U3BlY2lmaWVyIHwgc3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBJbnRvSWQsIG9wdGlvbnM6IHtcbiAgICAgICAgdHlwZT86IEFwcFR5cGU7XG4gICAgICAgIHBhcmVudElkPzogSW50b0lkO1xuICAgICAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgICAgICB1cmw/OiBzdHJpbmc7XG4gICAgICAgIG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgICAgIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5pZCA9IElkZW50aWZpZXIuZnJvbShpZCk7XG4gICAgICAgIHRoaXMucGFyZW50SWQgPSBJZGVudGlmaWVyLmZyb21PcHRpb25hbChvcHRpb25zLnBhcmVudElkKTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uO1xuICAgICAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICAgICAgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlID8/ICdhcHAnO1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG9wdGlvbnMuZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoaW5mbzogQXBwSnNvbik6IEFwcCB7XG4gICAgICAgIGNvbnN0IGlkID0gSWRlbnRpZmllci5mcm9tS2V5KGluZm8uaWQpO1xuICAgICAgICByZXR1cm4gbmV3IEFwcChpZCwge1xuICAgICAgICAgICAgcGFyZW50SWQ6IElkZW50aWZpZXIuZnJvbU9wdGlvbmFsKGluZm8ucGFyZW50X2lkKSxcbiAgICAgICAgICAgIHZlcnNpb246IGluZm8udmVyc2lvbixcbiAgICAgICAgICAgIHVybDogaW5mby51cmwsXG4gICAgICAgICAgICB0eXBlOiBpbmZvLnR5cGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogaW5mby5tZXRhZGF0YSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogaW5mby5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IEFwcCk6IEFwcEpzb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGRhdGEuaWQua2V5KCksXG4gICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICBwYXJlbnRfaWQ6IGRhdGEucGFyZW50SWQ/LmtleSgpLFxuICAgICAgICAgICAgdmVyc2lvbjogZGF0YS52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBkYXRhLnVybCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBkYXRhLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBkYXRhLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgam9pbiguLi5wYXRoczogc3RyaW5nW10pOiBBcHAge1xuICAgICAgICByZXR1cm4gbmV3IEFwcCh0aGlzLmlkLmpvaW4oLi4ucGF0aHMpLCB7XG4gICAgICAgICAgICBwYXJlbnRJZDogdGhpcy5wYXJlbnRJZCxcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogdGhpcy5kZXBlbmRlbmNpZXMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIsIHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vY29uc3QuanMnO1xuXG5leHBvcnQgdHlwZSBKc29uVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkIHwgeyBba2V5IGluIG5ldmVyXT86IEpzb25UeXBlIH0gfCBKc29uVHlwZVtdO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZTxULCBEPiB7XG4gICAgc2VyaWFsaXplKGRhdGE6IFQpOiBEO1xuICAgIGRlc2VyaWFsaXplKGRhdGE6IEQpOiBUO1xufVxuXG5leHBvcnQgY2xhc3MgU2VyaWFsaXplcjxULCBEPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBzZXJpYWxpemU6IChkYXRhOiBUKSA9PiBELFxuICAgICAgICBwdWJsaWMgZGVzZXJpYWxpemU6IChkYXRhOiBEKSA9PiBULFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG9mPFQsIEQ+KHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBEPik6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oc2VyaWFsaXplci5zZXJpYWxpemUsIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcGlwZTxULCBSLCBEPihzZXIxOiBTZXJpYWxpemFibGU8VCwgUj4sIHNlcjI6IFNlcmlhbGl6YWJsZTxSLCBEPik6IFNlcmlhbGl6YWJsZTxULCBEPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBEPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXIyLnNlcmlhbGl6ZShzZXIxLnNlcmlhbGl6ZShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gc2VyMS5kZXNlcmlhbGl6ZShzZXIyLmRlc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRyYW5zZm9ybTxUPihmdW5jOiAodmFsdWU6IFQpID0+IFQpOiBTZXJpYWxpemVyPFQsIFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFQ+KFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBub29wPFQ+KCk6IFNlcmlhbGl6ZXI8VCwgVD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWVsZDxcbiAgICAgICAgSyBleHRlbmRzIGtleW9mIEQsXG4gICAgICAgIFIsXG4gICAgPihcbiAgICAgICAga2V5OiBLLFxuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8RFtLXSwgUj4sXG4gICAgKTogU2VyaWFsaXplcjxcbiAgICAgICAgVCxcbiAgICAgICAgeyBbUCBpbiBrZXlvZiBEXTogUCBleHRlbmRzIEsgPyBSIDogRFtQXSB9XG4gICAgPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxcbiAgICAgICAgICAgIFQsXG4gICAgICAgICAgICB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH1cbiAgICAgICAgPihcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnNlcmlhbGl6ZWQsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBzZXJpYWxpemVyLnNlcmlhbGl6ZShzZXJpYWxpemVkW2tleV0pLFxuICAgICAgICAgICAgICAgIH0gYXMgeyBbUCBpbiBrZXlvZiBEXTogUCBleHRlbmRzIEsgPyBSIDogRFtQXSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzZXJpYWxpemUoe1xuICAgICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBba2V5XTogc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkYXRhW2tleV0gYXMgUiksXG4gICAgICAgICAgICAgICAgfSBhcyBEKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGpzb248VCBleHRlbmRzIEpzb25UeXBlPigpOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0pzb24oKTogU2VyaWFsaXplcjxULCBVaW50OEFycmF5PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBVaW50OEFycmF5PihcbiAgICAgICAgICAgIChkYXRhKSA9PiB0ZXh0RW5jb2Rlci5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodGhpcy5zZXJpYWxpemUoZGF0YSkpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShKU09OLnBhcnNlKHRleHQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvQXJyYXkoKTogU2VyaWFsaXplcjxUW10sIERbXT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VFtdLCBEW10+KFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEubWFwKChpdGVtKSA9PiB0aGlzLnNlcmlhbGl6ZShpdGVtKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuZGVzZXJpYWxpemUoaXRlbSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b01hcCgpOiBTZXJpYWxpemVyPE1hcDxzdHJpbmcsIFQ+LCBNYXA8c3RyaW5nLCBEPj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8TWFwPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIEQ+PihcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIEQ+KCk7XG4gICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoa2V5LCB0aGlzLnNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHRoaXMuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFsbGJhY2soZmFsbGJhY2s6IFQpOiBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRoaXMuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZhbGxiYWNrTWFwKGZhbGxiYWNrOiAoZGF0YTogRCwgZXJyb3I6IHVua25vd24pID0+IFQpOiBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRoaXMuc2VyaWFsaXplKGRhdGEpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2soZGF0YSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHBpcGU8RT4oc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPEQsIEU+KTogU2VyaWFsaXplcjxULCBFPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBFPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLnNlcmlhbGl6ZShkYXRhKSksXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB7IHRleHREZWNvZGVyLCB0ZXh0RW5jb2RlciB9IGZyb20gJy4uL2NvbnN0LmpzJztcbmltcG9ydCB7IEpzb25UeXBlIH0gZnJvbSAnLi9zZXJpYWxpemVyLmpzJztcblxuZXhwb3J0IGNsYXNzIEZsYWdzIHtcbiAgICBwcml2YXRlIHZhbHVlOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBsZW5ndGg6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgdmFsdWU/OiBudW1iZXI7IGxlbmd0aD86IG51bWJlciB9KSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRpb25zLnZhbHVlID8/IDA7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0aW9ucy5sZW5ndGggPz8gMzI7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSAmICgxIDw8IHBvc2l0aW9uKSkgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSAmICgxIDw8IHBvc2l0aW9uKSkgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGlmU2V0PFQ+KHBvc2l0aW9uOiBudW1iZXIsIGNhbGxiYWNrOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLmhhcyhwb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChwb3NpdGlvbjogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgfD0gMSA8PCBwb3NpdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgJj0gfigxIDw8IHBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZSh3cml0ZXI6IEJ5dGVXcml0ZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYml0cyA9IG5ldyBVaW50OEFycmF5KCh0aGlzLmxlbmd0aCArIDcpIC8gOCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYml0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYml0c1tpXSA9ICh0aGlzLnZhbHVlID4+IChpICogOCkpICYgMHhmZjtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGUoYml0cyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWFkKHJlYWRlcjogQnl0ZVJlYWRlciwgbGVuZ3RoOiBudW1iZXIpOiBGbGFncyB7XG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKGxlbmd0aCArIDcpIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZSB8PSByZWFkZXIucmVhZFVpbnQ4KCkgPDwgKGkgKiA4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZsYWdzKHsgdmFsdWUsIGxlbmd0aCB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRGbG9hdDE2KGRhdGFWaWV3OiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHNpZ24gPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDgwMDApID8gLTEgOiAxO1xuICAgIGNvbnN0IGV4cG9uZW50ID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHg3YzAwKSA+PiAxMDtcbiAgICBjb25zdCBtYW50aXNzYSA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4MDNmZik7XG4gICAgaWYgKGV4cG9uZW50ID09PSAwICYmIG1hbnRpc3NhID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IDB4MWYpIHtcbiAgICAgICAgcmV0dXJuIG1hbnRpc3NhID09PSAwID8gSW5maW5pdHkgKiBzaWduIDogTmFOO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBvbmVudCA9IGV4cG9uZW50IC0gMTU7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNYW50aXNzYSA9IG1hbnRpc3NhIC8gMTAyNDtcbiAgICAgICAgcmV0dXJuIHNpZ24gKiBNYXRoLnBvdygyLCBub3JtYWxpemVkRXhwb25lbnQpICogKDEgKyBub3JtYWxpemVkTWFudGlzc2EpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdDE2KGRhdGFWaWV3OiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2lnbiA9IHZhbHVlIDwgMCA/IDEgOiAwO1xuICAgIHZhbHVlID0gTWF0aC5hYnModmFsdWUpO1xuICAgIGlmICghaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDB4N2MwMCB8IChzaWduIDw8IDE1KSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhwb25lbnQgPSBNYXRoLmZsb29yKE1hdGgubG9nMih2YWx1ZSkpO1xuICAgIGNvbnN0IG1hbnRpc3NhID0gdmFsdWUgLyBNYXRoLnBvdygyLCBleHBvbmVudCkgLSAxO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBvbmVudCA9IGV4cG9uZW50ICsgMTU7XG4gICAgY29uc3Qgbm9ybWFsaXplZE1hbnRpc3NhID0gTWF0aC5yb3VuZChtYW50aXNzYSAqIDEwMjQpO1xuICAgIGlmIChub3JtYWxpemVkRXhwb25lbnQgPD0gMCkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCBzaWduIDw8IDE1KTtcbiAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRFeHBvbmVudCA+PSAweDFmKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDB4N2MwMCB8IChzaWduIDw8IDE1KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgKHNpZ24gPDwgMTUpIHwgKG5vcm1hbGl6ZWRFeHBvbmVudCA8PCAxMCkgfCBub3JtYWxpemVkTWFudGlzc2EpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVXcml0ZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgYnVmZmVyOiBBcnJheUJ1ZmZlcjtcbiAgICBwcml2YXRlIG9mZnNldCA9IDA7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoaW5pdD86IEFycmF5QnVmZmVyLCBvZmZzZXQ/OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQgPz8gMDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBpbml0ID8/IG5ldyBBcnJheUJ1ZmZlcigxMDI0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVWludDhBcnJheShidWZmZXI6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICB1aW50OEFycmF5LnNldChuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlV3JpdGVyKGFycmF5QnVmZmVyLCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhbGxvY2F0ZShsZW5ndGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vZmZzZXQgKyBsZW5ndGggPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdCeXRlTGVuZ3RoID0gTWF0aC5tYXgodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCAqIDIsIHRoaXMub2Zmc2V0ICsgbGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihuZXdCeXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KG5ld0J1ZmZlcikuc2V0KG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyKSk7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ld0J1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGRhdGE6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbG9jYXRlKGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIpLnNldChkYXRhLCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVCb29sZWFuKHZhbHVlOiBib29sZWFuKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50OCh0aGlzLm9mZnNldCwgdmFsdWUgPyAxIDogMCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDgodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDE2KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgyKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQxNih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQxNih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50NjQodmFsdWU6IGJpZ2ludCk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDgpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEJpZ0ludDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ2NCh2YWx1ZTogYmlnaW50KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoOCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0QmlnVWludDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVMRUIxMjgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICAvLyBVbnNpZ25lZCBMRUIxMjhcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh2YWx1ZSA+IDB4N2YpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCAodmFsdWUgJiAweDdmKSB8IDB4ODApO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgICAgIHZhbHVlID4+PSA3O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsIHZhbHVlICYgMHg3Zik7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB3cml0ZUZsb2F0MTYodGhpcy5kYXRhVmlldywgdGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0RmxvYXQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDY0KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRGbG9hdDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ4QXJyYXkodmFsdWU6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVVMRUIxMjgodmFsdWUuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMud3JpdGUodmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVTdHJpbmcodmFsdWU6IHN0cmluZyk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlVWludDhBcnJheSh0ZXh0RW5jb2Rlci5lbmNvZGUodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSlNPTih2YWx1ZTogSnNvblR5cGUpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbGFncyhmbGFnczogRmxhZ3MpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgZmxhZ3Mud3JpdGUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlciwgMCwgdGhpcy5vZmZzZXQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVSZWFkZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgb2Zmc2V0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoZGF0YTogRGF0YVZpZXcpIHtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IGRhdGE7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkoYnVmZmVyOiBVaW50OEFycmF5KTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgdWludDhBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21BcnJheUJ1ZmZlcihidWZmZXI6IEFycmF5QnVmZmVyKTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBmcm9tQmxvYihibG9iOiBCbG9iKTogUHJvbWlzZTxCeXRlUmVhZGVyPiB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpO1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWQoc2l6ZTogbnVtYmVyKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpemUgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIHNpemUgPiB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgVWludDhBcnJheSh0aGlzLmRhdGFWaWV3LmJ1ZmZlciwgdGhpcy5vZmZzZXQsIHNpemUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBzaXplO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRCb29sZWFuKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50OCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50NjQoKTogYmlnaW50IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEJpZ0ludDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDY0KCk6IGJpZ2ludCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRCaWdVaW50NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVTEVCMTI4KCk6IG51bWJlciB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExFQjEyOFxuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICBsZXQgc2hpZnQgPSAwO1xuICAgICAgICBsZXQgYnl0ZTogbnVtYmVyO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ5dGUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB2YWx1ZSB8PSAoYnl0ZSAmIDBiMDExMTExMTEpIDw8IHNoaWZ0O1xuICAgICAgICAgICAgc2hpZnQgKz0gNztcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoKGJ5dGUgJiAwYjEwMDAwMDAwKSAhPT0gMCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkRmxvYXQxNih0aGlzLmRhdGFWaWV3LCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEZsb2F0MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDY0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRGbG9hdDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDhBcnJheSgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yZWFkVUxFQjEyOCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkKGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYnl0ZUFycmF5ID0gdGhpcy5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVBcnJheSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRKU09OPFQgZXh0ZW5kcyBKc29uVHlwZT4oKTogVCB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMucmVhZFN0cmluZygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsYWdzKGxlbmd0aDogbnVtYmVyKTogRmxhZ3Mge1xuICAgICAgICByZXR1cm4gRmxhZ3MucmVhZCh0aGlzLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCAhPT0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEpzb25UeXBlLCB0eXBlIFNlcmlhbGl6YWJsZSwgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCB0eXBlIFBhY2tldERhdGEgPSB7XG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGRhdGE6IFVpbnQ4QXJyYXk7XG59O1xuXG5leHBvcnQgdHlwZSBQYWNrZXQ8VCA9IHVua25vd24+ID0ge1xuICAgIHJlYWRvbmx5IHR5cGU6IFBhY2tldFR5cGU8VD47XG4gICAgcmVhZG9ubHkgZGF0YTogVDtcbn07XG5cbmV4cG9ydCBjbGFzcyBQYWNrZXRUeXBlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgbmV3KGRhdGE6IFQpOiBQYWNrZXQ8VD4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogdGhpcyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBtYXRjaChwYWNrZXQ6IFBhY2tldCk6IHBhY2tldCBpcyBQYWNrZXQ8VD4ge1xuICAgICAgICByZXR1cm4gcGFja2V0LnR5cGUgPT09IHRoaXM7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZUpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KGlkZW50aWZpZXI6IElkZW50aWZpZXIsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc2VyaWFsaXplcixcbiAgICB9OiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgc2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxULCBEPjtcbiAgICB9KTogUGFja2V0VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFja2V0VHlwZTxUPihcbiAgICAgICAgICAgIGlkZW50aWZpZXIuam9pbihuYW1lKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxULCBELCBVaW50OEFycmF5PihzZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpLCBTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8VD4oaWRlbnRpZmllcjogSWRlbnRpZmllciwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgfSk6IFBhY2tldFR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhY2tldFR5cGUoXG4gICAgICAgICAgICBpZGVudGlmaWVyLmpvaW4obmFtZSksXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBcHBKc29uIH0gZnJvbSAnLi4vLi4vYXBwLmpzJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplL3NlcmlhbGl6ZXIuanMnO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4vcGFja2V0LmpzJztcblxuY29uc3QgSURFTlRJRklFUiA9IG5ldyBJZGVudGlmaWVyKCdjb3JlJywgJ3BhY2tldCcpO1xuXG50eXBlIFByb3RvY29sSW5mbyA9IHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG59O1xuXG50eXBlIFJTQU51bWJlcnMgPSB7XG4gICAgZTogc3RyaW5nO1xuICAgIG46IHN0cmluZztcbn07XG5cbnR5cGUgRW5jcnlwdGlvblJlcXVlc3QgPSB7XG4gICAga2luZDogJ3YxJztcbiAgICByc2E6IFJTQU51bWJlcnM7XG59O1xuXG50eXBlIEVuY3J5cHRpb25SZXNwb25zZSA9IHtcbiAgICBraW5kOiAndjEnO1xuICAgIHJzYTogUlNBTnVtYmVycztcbiAgICBhZXM6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNlcnZlck1ldGEgPSB7XG4gICAgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVxdWVzdCB8IG51bGw7XG4gICAgaGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxudHlwZSBDb25uZWN0UGFja2V0SnNvbiA9IHtcbiAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG59O1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdFBhY2tldCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICAgIHB1YmxpYyByZWFkb25seSB0b2tlbjogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVzcG9uc2UgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczoge1xuICAgICAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgICAgICBhcHA6IEFwcDtcbiAgICAgICAgdG9rZW46IHN0cmluZztcbiAgICAgICAgZW5jcnlwdGlvbj86IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG4gICAgfSkge1xuICAgICAgICB0aGlzLnByb3RvY29sID0gb3B0aW9ucy5wcm90b2NvbDtcbiAgICAgICAgdGhpcy5hcHAgPSBvcHRpb25zLmFwcDtcbiAgICAgICAgdGhpcy50b2tlbiA9IG9wdGlvbnMudG9rZW47XG4gICAgICAgIHRoaXMuZW5jcnlwdGlvbiA9IG9wdGlvbnMuZW5jcnlwdGlvbiA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogQ29ubmVjdFBhY2tldEpzb24pOiBDb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0UGFja2V0KHtcbiAgICAgICAgICAgIHByb3RvY29sOiBkYXRhLnByb3RvY29sLFxuICAgICAgICAgICAgYXBwOiBBcHAuZGVzZXJpYWxpemUoZGF0YS5hcHApLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogZGF0YS5lbmNyeXB0aW9uLFxuICAgICAgICAgICAgdG9rZW46IGRhdGEudG9rZW4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IENvbm5lY3RQYWNrZXQpOiBDb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcm90b2NvbDogZGF0YS5wcm90b2NvbCxcbiAgICAgICAgICAgIGFwcDogQXBwLnNlcmlhbGl6ZShkYXRhLmFwcCksXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBkYXRhLmVuY3J5cHRpb24sXG4gICAgICAgICAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBlbnVtIERpc2Nvbm5lY3RUeXBlIHtcbiAgICBJTlZBTElEX1RPS0VOID0gJ2ludmFsaWRfdG9rZW4nLFxuICAgIElOVkFMSURfT1JJR0lOID0gJ2ludmFsaWRfb3JpZ2luJyxcbiAgICBJTlZBTElEX1ZFUlNJT04gPSAnaW52YWxpZF92ZXJzaW9uJyxcbiAgICBJTlZBTElEX1BBQ0tFVF9UWVBFID0gJ2ludmFsaWRfcGFja2V0X3R5cGUnLFxuICAgIElOVkFMSURfUEFDS0VUX0RBVEEgPSAnaW52YWxpZF9wYWNrZXRfZGF0YScsXG4gICAgSU5WQUxJRF9QQUNLRVQgPSAnaW52YWxpZF9wYWNrZXQnLFxuICAgIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsX2Vycm9yJyxcbiAgICBBTk9USEVSX0NPTk5FQ1RJT04gPSAnYW5vdGhlcl9jb25uZWN0aW9uJyxcbiAgICBQRVJNSVNTSU9OX0RFTklFRCA9ICdwZXJtaXNzaW9uX2RlbmllZCcsXG4gICAgQVBQX1JFTU9WRUQgPSAnYXBwX3JlbW92ZWQnLFxuICAgIFNFUlZFUl9SRVNUQVJUID0gJ3NlcnZlcl9yZXN0YXJ0JyxcbiAgICBTSFVURE9XTiA9ICdzaHV0ZG93bicsXG4gICAgQ0xPU0UgPSAnY2xvc2UnLFxufVxuXG50eXBlIERpc2Nvbm5lY3RQYWNrZXRKc29uID0ge1xuICAgIHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgIG1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG59O1xuXG5leHBvcnQgY2xhc3MgRGlzY29ubmVjdFBhY2tldCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgIHB1YmxpYyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczoge1xuICAgICAgICB0eXBlOiBEaXNjb25uZWN0VHlwZTtcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZyB8IG51bGw7XG4gICAgfSkge1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXQpOiBEaXNjb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSnNvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogRGlzY29ubmVjdFBhY2tldEpzb24pOiBEaXNjb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIERpc2Nvbm5lY3RQYWNrZXQuZnJvbUpzb24oZGF0YSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21Kc29uKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXRKc29uKTogRGlzY29ubmVjdFBhY2tldCB7XG4gICAgICAgIHJldHVybiBuZXcgRGlzY29ubmVjdFBhY2tldCh7XG4gICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRvSnNvbigpOiBEaXNjb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUEFDS0VUX1RZUEVTOiB7XG4gICAgU0VSVkVSX01FVEE6IFBhY2tldFR5cGU8U2VydmVyTWV0YT47XG4gICAgQ09OTkVDVDogUGFja2V0VHlwZTxDb25uZWN0UGFja2V0PjtcbiAgICBESVNDT05ORUNUOiBQYWNrZXRUeXBlPERpc2Nvbm5lY3RQYWNrZXQ+O1xuICAgIFRPS0VOOiBQYWNrZXRUeXBlPHN0cmluZz47XG4gICAgUkVBRFk6IFBhY2tldFR5cGU8dW5kZWZpbmVkPjtcbiAgICBFTkNSWVBURURfUEFDS0VUOiBQYWNrZXRUeXBlPFVpbnQ4QXJyYXk+O1xufSA9IHtcbiAgICBTRVJWRVJfTUVUQTogUGFja2V0VHlwZS5jcmVhdGVKc29uPFNlcnZlck1ldGE+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3NlcnZlcl9tZXRhJyxcbiAgICB9KSxcbiAgICBDT05ORUNUOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248Q29ubmVjdFBhY2tldD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnY29ubmVjdCcsXG4gICAgICAgIHNlcmlhbGl6ZXI6IENvbm5lY3RQYWNrZXQsXG4gICAgfSksXG4gICAgRElTQ09OTkVDVDogUGFja2V0VHlwZS5jcmVhdGVKc29uPERpc2Nvbm5lY3RQYWNrZXQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ2Rpc2Nvbm5lY3QnLFxuICAgICAgICBzZXJpYWxpemVyOiBEaXNjb25uZWN0UGFja2V0LFxuICAgIH0pLFxuICAgIFRPS0VOOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248c3RyaW5nPihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICd0b2tlbicsXG4gICAgfSksXG4gICAgUkVBRFk6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjx1bmRlZmluZWQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3JlYWR5JyxcbiAgICB9KSxcbiAgICBFTkNSWVBURURfUEFDS0VUOiBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VWludDhBcnJheT4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnZScsXG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcCgpLFxuICAgIH0pLFxufTtcbiIsCiAgICAiaW1wb3J0IHsgSWRlbnRpZmllciB9IGZyb20gJy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vb211JztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRlbnNpb24ge1xuICAgIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU7XG59XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25UeXBlPFQgZXh0ZW5kcyBFeHRlbnNpb24gPSBFeHRlbnNpb24+IGV4dGVuZHMgSWRlbnRpZmllciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjcmVhdGU6IChvbXU6IE9tdSkgPT4gVCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoJ2V4dCcsIG5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBrZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG59XG4iLAogICAgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IHRleHREZWNvZGVyLCB0ZXh0RW5jb2RlciB9IGZyb20gJy4uLy4uL2NvbnN0JztcbmltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tICcuLi8uLi9uZXR3b3JrL3BhY2tldCc7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi8uLi9vbXUnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciwgSnNvblR5cGUgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uLCBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uJztcblxuZXhwb3J0IGNvbnN0IEhUVFBfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8SHR0cEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnaHR0cCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgSHR0cEV4dGVuc2lvbihvbXUpLFxuKTtcblxuZXhwb3J0IGNvbnN0IEhUVFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gSFRUUF9FWFRFTlNJT05fVFlQRS5qb2luKCdyZXF1ZXN0Jyk7XG5cbnR5cGUgUmVxdWVzdEhhbmRsZSA9IHtcbiAgICBpZDogc3RyaW5nO1xufTtcblxudHlwZSBIdHRwUmVxdWVzdCA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgaGVhZGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIG1ldGhvZDogc3RyaW5nO1xuICAgIHJlZGlyZWN0OiBSZXF1ZXN0UmVkaXJlY3Q7XG4gICAgdXJsOiBzdHJpbmc7XG59O1xuXG5jb25zdCBSRVFVRVNUX0NSRUFURSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVxdWVzdD4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1ZXN0X2NyZWF0ZScsXG59KTtcblxuY2xhc3MgRGF0YUNodW5rPFQgZXh0ZW5kcyBKc29uVHlwZT4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YTogVCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvZHk6IFVpbnQ4QXJyYXksXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplPFQgZXh0ZW5kcyBKc29uVHlwZT4oZGF0YTogRGF0YUNodW5rPFQ+KTogVWludDhBcnJheSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZUpTT04oZGF0YS5tZXRhKTtcbiAgICAgICAgd3JpdGVyLndyaXRlVWludDhBcnJheShkYXRhLmJvZHkpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemU8VCBleHRlbmRzIEpzb25UeXBlPihkYXRhOiBVaW50OEFycmF5KTogRGF0YUNodW5rPFQ+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gQnl0ZVJlYWRlci5mcm9tVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgY29uc3QgbWV0YSA9IHJlYWRlci5yZWFkSlNPTjxUPigpO1xuICAgICAgICBjb25zdCBib2R5ID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YUNodW5rKG1ldGEsIGJvZHkpO1xuICAgIH1cbn1cblxuY29uc3QgUkVRVUVTVF9TRU5EID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPERhdGFDaHVuazxSZXF1ZXN0SGFuZGxlPj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1ZXN0X3NlbmQnLFxuICAgIHNlcmlhbGl6ZXI6IERhdGFDaHVuayxcbn0pO1xuXG50eXBlIEh0dHBSZXF1ZXN0Q2xvc2UgPSBSZXF1ZXN0SGFuZGxlO1xuXG5jb25zdCBSRVFVRVNUX0NMT1NFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXF1ZXN0Q2xvc2U+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVxdWVzdF9jbG9zZScsXG59KTtcblxudHlwZSBIdHRwUmVzcG9uc2UgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIGhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICBzdGF0dXNUZXh0OiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgaGlzdG9yeTogSHR0cFJlc3BvbnNlW107XG4gICAgcmVkaXJlY3RlZDogYm9vbGVhbjtcbn07XG5cbmNvbnN0IFJFU1BPTlNFX0NSRUFURSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVzcG9uc2U+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVzcG9uc2VfY3JlYXRlJyxcbn0pO1xuXG5jb25zdCBSRVNQT05TRV9DSFVOSyA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxEYXRhQ2h1bms8UmVxdWVzdEhhbmRsZT4+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVzcG9uc2VfY2h1bmsnLFxuICAgIHNlcmlhbGl6ZXI6IERhdGFDaHVuayxcbn0pO1xuXG5jb25zdCBSRVNQT05TRV9DTE9TRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxSZXF1ZXN0SGFuZGxlPihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3Jlc3BvbnNlX2Nsb3NlJyxcbn0pO1xuXG50eXBlIEhhbmRsZVN0YXRlUmVjZWl2aW5nID0ge1xuICAgIHR5cGU6ICdyZWNlaXZpbmcnO1xuICAgIHJlY2VpdmUoZGF0YTogVWludDhBcnJheSk6IHZvaWQ7XG4gICAgY2xvc2UoKTogdm9pZDtcbn07XG5cbnR5cGUgSGFuZGxlU3RhdGVDcmVhdGVkID0ge1xuICAgIHR5cGU6ICdjcmVhdGVkJztcbiAgICBzZXRSZXNwb25zZShyZXNwb25zZTogSHR0cFJlc3BvbnNlKTogdm9pZDtcbn07XG5cbnR5cGUgSGFuZGxlU3RhdGUgPSBIYW5kbGVTdGF0ZUNyZWF0ZWQgfCBIYW5kbGVTdGF0ZVJlY2VpdmluZztcblxudHlwZSBXU0RhdGEgPSBzdHJpbmcgfCBBcnJheUJ1ZmZlckxpa2UgfCBCbG9iIHwgQXJyYXlCdWZmZXJWaWV3O1xuXG5leHBvcnQgY29uc3QgV1NNc2dUeXBlID0ge1xuICAgIENPTlRJTlVBVElPTjogMHgwLFxuICAgIFRFWFQ6IDB4MSxcbiAgICBCSU5BUlk6IDB4MixcbiAgICBQSU5HOiAweDksXG4gICAgUE9ORzogMHhBLFxuICAgIENMT1NFOiAweDgsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgV1NDbG9zZUNvZGUgPSB7XG4gICAgT0s6IDEwMDAsXG4gICAgR09JTkdfQVdBWTogMTAwMSxcbiAgICBQUk9UT0NPTF9FUlJPUjogMTAwMixcbiAgICBVTlNVUFBPUlRFRF9EQVRBOiAxMDAzLFxuICAgIEFCTk9STUFMX0NMT1NVUkU6IDEwMDYsXG4gICAgSU5WQUxJRF9URVhUOiAxMDA3LFxuICAgIFBPTElDWV9WSU9MQVRJT046IDEwMDgsXG4gICAgTUVTU0FHRV9UT09fQklHOiAxMDA5LFxuICAgIE1BTkRBVE9SWV9FWFRFTlNJT046IDEwMTAsXG4gICAgSU5URVJOQUxfRVJST1I6IDEwMTEsXG4gICAgU0VSVklDRV9SRVNUQVJUOiAxMDEyLFxuICAgIFRSWV9BR0FJTl9MQVRFUjogMTAxMyxcbiAgICBCQURfR0FURVdBWTogMTAxNCxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgV2ViU29ja2V0T3BlbiA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsO1xufTtcbnR5cGUgV2ViU29ja2V0Q2xvc2UgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIGNvZGU/OiBudW1iZXI7XG4gICAgcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbnR5cGUgV2ViU29ja2V0SGFuZGxlID0ge1xuICAgIHdzOiBPbXVXUztcbiAgICBvcGVuOiAocmVzcG9uc2U6IFdlYlNvY2tldE9wZW4pID0+IHZvaWQ7XG4gICAgZGlzcGF0Y2g6IChkYXRhOiBEYXRhQ2h1bms8V1NEYXRhTWV0YT4pID0+IHZvaWQ7XG4gICAgY2xvc2U6IChyZXNwb25zZTogV2ViU29ja2V0Q2xvc2UpID0+IHZvaWQ7XG4gICAgZXJyb3I6IChyZXNwb25zZTogV2ViU29ja2V0RXJyb3IpID0+IHZvaWQ7XG59O1xuXG50eXBlIFdTRGF0YU1ldGEgPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOlxuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuVEVYVFxuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuQklOQVJZXG4gICAgICAgIHwgdHlwZW9mIFdTTXNnVHlwZS5QSU5HXG4gICAgICAgIHwgdHlwZW9mIFdTTXNnVHlwZS5QT05HO1xufTtcblxudHlwZSBXU0hhbmRsZVN0YXRlID0ge1xuICAgIHR5cGU6ICdjcmVhdGVkJyB8ICdyZWNlaXZpbmcnO1xuICAgIGhhbmRsZTogV2ViU29ja2V0SGFuZGxlO1xufTtcblxuY29uc3QgV0VCU09DS0VUX0NSRUFURSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxIdHRwUmVxdWVzdD4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19jcmVhdGUnLFxufSk7XG5cbmNvbnN0IFdFQlNPQ0tFVF9PUEVOID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFdlYlNvY2tldE9wZW4+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3Nfb3BlbicsXG59KTtcblxuY29uc3QgV0VCU09DS0VUX0RBVEEgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RGF0YUNodW5rPFdTRGF0YU1ldGE+PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dzX2RhdGEnLFxuICAgIHNlcmlhbGl6ZXI6IERhdGFDaHVuayxcbn0pO1xuXG5jb25zdCBXRUJTT0NLRVRfQ0xPU0UgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248V2ViU29ja2V0Q2xvc2U+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3NfY2xvc2UnLFxufSk7XG5cbnR5cGUgV2ViU29ja2V0RXJyb3IgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIHR5cGU6ICdDb25uZWN0aW9uUmVmdXNlZCc7XG4gICAgcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IFdFQlNPQ0tFVF9FUlJPUiA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxXZWJTb2NrZXRFcnJvcj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19lcnJvcicsXG59KTtcblxuZnVuY3Rpb24gY3JlYXRlRnV0dXJlPFQ+KCk6IHtcbiAgICBwcm9taXNlOiBQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgICByZWplY3Q6IChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkO1xufSB7XG4gICAgbGV0IHJlc29sdmU6ICgodmFsdWU6IFQpID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCByZWplY3Q6ICgocmVhc29uPzogdW5rbm93bikgPT4gdm9pZCkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXMsIHJlaikgPT4ge1xuICAgICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgICByZWplY3QgPSByZWo7XG4gICAgfSk7XG4gICAgaWYgKCFyZXNvbHZlIHx8ICFyZWplY3QpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBmdXR1cmUnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9taXNlLFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZWplY3QsXG4gICAgfTtcbn1cblxudHlwZSBXU1NlbmRUYXNrID0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZGF0YTogV1NEYXRhO1xufTtcblxuZXhwb3J0IGNsYXNzIEh0dHBFeHRlbnNpb24gaW1wbGVtZW50cyBFeHRlbnNpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBFeHRlbnNpb25UeXBlPEV4dGVuc2lvbj4gPSBIVFRQX0VYVEVOU0lPTl9UWVBFO1xuICAgIHByaXZhdGUgcmVxdWVzdENvdW50OiBudW1iZXIgPSAwO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwSGFuZGxlczogUmVjb3JkPHN0cmluZywgSGFuZGxlU3RhdGUgfCB1bmRlZmluZWQ+ID0ge307XG4gICAgcHJpdmF0ZSByZWFkb25seSB3c0hhbmRsZXM6IFJlY29yZDxzdHJpbmcsIFdTSGFuZGxlU3RhdGU+ID0ge307XG4gICAgcHJpdmF0ZSByZWFkb25seSB3c1NlbmRRdWV1ZTogV1NTZW5kVGFza1tdID0gW107XG4gICAgcHJpdmF0ZSB3c1NlbmRXYWl0UmVzb2x2ZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb211OiBPbXUsXG4gICAgKSB7XG4gICAgICAgIG9tdS5uZXR3b3JrLnJlZ2lzdGVyUGFja2V0KFxuICAgICAgICAgICAgUkVRVUVTVF9DUkVBVEUsXG4gICAgICAgICAgICBSRVFVRVNUX1NFTkQsXG4gICAgICAgICAgICBSRVFVRVNUX0NMT1NFLFxuICAgICAgICAgICAgUkVTUE9OU0VfQ1JFQVRFLFxuICAgICAgICAgICAgUkVTUE9OU0VfQ0hVTkssXG4gICAgICAgICAgICBSRVNQT05TRV9DTE9TRSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9DTE9TRSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9DUkVBVEUsXG4gICAgICAgICAgICBXRUJTT0NLRVRfREFUQSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9PUEVOLFxuICAgICAgICAgICAgV0VCU09DS0VUX0VSUk9SLFxuICAgICAgICApO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFJFU1BPTlNFX0NSRUFURSwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5odHRwSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgYWxyZWFkeSBoYW5kbGVkIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5zZXRSZXNwb25zZShwYWNrZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRVNQT05TRV9DSFVOSywgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5odHRwSGFuZGxlc1twYWNrZXQubWV0YS5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gcmVxdWVzdCcsIHBhY2tldC5tZXRhLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdyZWNlaXZpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCBjaHVuayBmb3Igbm9uLXJlY2VpdmluZyByZXF1ZXN0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5yZWNlaXZlKHBhY2tldC5ib2R5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoUkVTUE9OU0VfQ0xPU0UsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biByZXF1ZXN0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdyZWNlaXZpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCBjaHVuayBmb3Igbm9uLXJlY2VpdmluZyByZXF1ZXN0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9PUEVOLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHNvY2tldCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhbmRsZS50eXBlICE9PSAnY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciBhbHJlYWR5IGhhbmRsZWQgc29ja2V0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuaGFuZGxlLm9wZW4ocGFja2V0KTtcbiAgICAgICAgICAgIGhhbmRsZS50eXBlID0gJ3JlY2VpdmluZyc7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9EQVRBLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQubWV0YS5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gc29ja2V0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ3JlY2VpdmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIGNodW5rIGZvciBub24tcmVjZWl2aW5nIHNvY2tldCcsIHBhY2tldC5tZXRhLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGUuaGFuZGxlLmRpc3BhdGNoKHBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9DTE9TRSwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy53c0hhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBzb2NrZXQnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUuY2xvc2UocGFja2V0KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFdFQlNPQ0tFVF9FUlJPUiwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy53c0hhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBzb2NrZXQnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUuZXJyb3IocGFja2V0KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUuZXZlbnQucmVhZHkubGlzdGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3NTZW5kTG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHdzU2VuZExvb3AoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLm9tdS5ydW5uaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBzZW5kID0gdGhpcy53c1NlbmRRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHNlbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheSA9IGF3YWl0IHRvVWludDhBcnJheShzZW5kLmRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2Ygc2VuZC5kYXRhID09PSAnc3RyaW5nJyA/IFdTTXNnVHlwZS5URVhUIDogV1NNc2dUeXBlLkJJTkFSWTtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFdFQlNPQ0tFVF9EQVRBLCBuZXcgRGF0YUNodW5rKHsgaWQ6IHNlbmQuaWQsIHR5cGUgfSwgYXJyYXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53c1NlbmRXYWl0UmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlSGVhZGVycyhyZXF1ZXN0OiBSZXF1ZXN0LCBpbml0PzogUmVxdWVzdEluaXQpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBjb25zdCBrZXlzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IHNldCA9IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG93ZXJLZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsS2V5ID0ga2V5c1tsb3dlcktleV07XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxLZXkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgaGVhZGVyc1tvcmlnaW5hbEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGtleXNbbG93ZXJLZXldID0ga2V5O1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGluaXQ/LmhlYWRlcnMpIHtcbiAgICAgICAgICAgIGlmIChpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaW5pdC5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGluaXQuaGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBpbml0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gaW5pdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaW5pdC5oZWFkZXJzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIHNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUlkKCk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5vbXUuYXBwLmlkLmpvaW4oYCR7cGVyZm9ybWFuY2UudGltZU9yaWdpbn0tJHt0aGlzLnJlcXVlc3RDb3VudCsrfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0KGlucHV0OiBzdHJpbmcgfCBVUkwgfCBnbG9iYWxUaGlzLlJlcXVlc3QsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8eyByZXNwb25zZTogSHR0cFJlc3BvbnNlOyBzdHJlYW06IFJlYWRhYmxlU3RyZWFtIH0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdlbmVyYXRlSWQoKS5rZXkoKTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVRVNUX0NSRUFURSwge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMuZ2VuZXJhdGVIZWFkZXJzKHJlcXVlc3QsIGluaXQpLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmJvZHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IHJlcXVlc3QuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoUkVRVUVTVF9TRU5ELCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGE6IHsgaWQgfSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub211LnNlbmQoUkVRVUVTVF9DTE9TRSwgeyBpZCB9KTtcbiAgICAgICAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VGdXR1cmUgPSBjcmVhdGVGdXR1cmU8SHR0cFJlc3BvbnNlPigpO1xuICAgICAgICBsZXQgY2h1bmtFdmVudCA9IGNyZWF0ZUZ1dHVyZTxib29sZWFuPigpO1xuICAgICAgICBjb25zdCBzZXRSZXNwb25zZSA9IChyZXNwb25zZTogSHR0cFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMuaHR0cEhhbmRsZXNbaWRdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNlaXZpbmcnLFxuICAgICAgICAgICAgICAgIHJlY2VpdmUoZGF0YTogVWludDhBcnJheTxBcnJheUJ1ZmZlckxpa2U+KSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua0V2ZW50LnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rRXZlbnQgPSBjcmVhdGVGdXR1cmU8Ym9vbGVhbj4oKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNsb3NlKCkge1xuICAgICAgICAgICAgICAgICAgICBjaHVua0V2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmh0dHBIYW5kbGVzW2lkXSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGVkJyxcbiAgICAgICAgICAgIHNldFJlc3BvbnNlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlRnV0dXJlLnByb21pc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIHN0cmVhbTogbmV3IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+KHtcbiAgICAgICAgICAgICAgICBhc3luYyBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChhd2FpdCBjaHVua0V2ZW50LnByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gY2h1bmtzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNodW5rKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2goaW5wdXQ6IHN0cmluZyB8IFVSTCB8IGdsb2JhbFRoaXMuUmVxdWVzdCwgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxPbXVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCB7IHJlc3BvbnNlLCBzdHJlYW0gfSA9IGF3YWl0IHRoaXMucmVxdWVzdChpbnB1dCwgaW5pdCk7XG4gICAgICAgIHJldHVybiBuZXcgT211UmVzcG9uc2UoXG4gICAgICAgICAgICBuZXcgSGVhZGVycyhyZXNwb25zZS5oZWFkZXIpLFxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXMgPCAzMDAsXG4gICAgICAgICAgICByZXNwb25zZS5yZWRpcmVjdGVkLFxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICdiYXNpYycsXG4gICAgICAgICAgICByZXNwb25zZS51cmwsXG4gICAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd3MoaW5wdXQ6IHN0cmluZyB8IFVSTCB8IGdsb2JhbFRoaXMuUmVxdWVzdCwgb3B0aW9ucz86IHtcbiAgICAgICAgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgICBhdXRvY2xvc2U/OiBib29sZWFuO1xuICAgICAgICBhdXRvcGluZz86IGJvb2xlYW47XG4gICAgICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIH0pOiBQcm9taXNlPE9tdVdTPiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZW5lcmF0ZUlkKCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IE9tdVdTLmNyZWF0ZShcbiAgICAgICAgICAgIHRoaXMub211LFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud3NTZW5kUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBpZC5rZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLndzU2VuZFdhaXRSZXNvbHZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLndzSGFuZGxlc1tpZC5rZXkoKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLndzSGFuZGxlc1tpZC5rZXkoKV0gPSB7XG4gICAgICAgICAgICB0eXBlOiAnY3JlYXRlZCcsXG4gICAgICAgICAgICBoYW5kbGUsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub211LnNlbmQoV0VCU09DS0VUX0NSRUFURSwge1xuICAgICAgICAgICAgaWQ6IGlkLmtleSgpLFxuICAgICAgICAgICAgaGVhZGVyOiB0aGlzLmdlbmVyYXRlSGVhZGVycyhyZXF1ZXN0LCBvcHRpb25zKSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaGFuZGxlLndzO1xuICAgIH1cbn1cblxuY2xhc3MgT211UmVzcG9uc2UgaW1wbGVtZW50cyBSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgb2s6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZWRpcmVjdGVkOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXNUZXh0OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBSZXNwb25zZVR5cGUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvZHk6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+PiB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5VXNlZDogYm9vbGVhbixcbiAgICApIHt9XG5cbiAgICBjbG9uZSgpOiBPbXVSZXNwb25zZSB7XG4gICAgICAgIHJldHVybiBuZXcgT211UmVzcG9uc2UoXG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICB0aGlzLm9rLFxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdGVkLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RleHQsXG4gICAgICAgICAgICB0aGlzLnR5cGUsXG4gICAgICAgICAgICB0aGlzLnVybCxcbiAgICAgICAgICAgIHRoaXMuYm9keSxcbiAgICAgICAgICAgIHRoaXMuYm9keVVzZWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIGFzeW5jIGFycmF5QnVmZmVyKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCk7XG4gICAgfVxuICAgIGJsb2IoKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS5ibG9iKCk7XG4gICAgfVxuICAgIGJ5dGVzKCk6IFByb21pc2U8VWludDhBcnJheTxBcnJheUJ1ZmZlcj4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCkudGhlbigoYnVmKSA9PiBuZXcgVWludDhBcnJheShidWYpKTtcbiAgICB9XG4gICAgZm9ybURhdGEoKTogUHJvbWlzZTxGb3JtRGF0YT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuZm9ybURhdGEoKTtcbiAgICB9XG4gICAganNvbigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuanNvbigpO1xuICAgIH1cbiAgICB0ZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS50ZXh0KCk7XG4gICAgfVxufVxuXG50eXBlIEV2ZW50TGlzdGVuZXJNYXA8VD4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06ICgoZXZlbnQ6IFRbS10pID0+IHVua25vd24pW11cbn07XG5cbmV4cG9ydCB0eXBlIFdTTXNnID0ge1xuICAgIHR5cGU6ICdvcGVuJztcbiAgICBkYXRhOiBXZWJTb2NrZXRPcGVuO1xufSB8IHtcbiAgICB0eXBlOiAnZXJyb3InO1xuICAgIGRhdGE6IFdlYlNvY2tldEVycm9yO1xufSB8IHtcbiAgICB0eXBlOiAndGV4dCc7XG4gICAgZGF0YTogc3RyaW5nO1xufSB8IHtcbiAgICB0eXBlOiAnYmluYXJ5JztcbiAgICBkYXRhOiBVaW50OEFycmF5O1xufSB8IHtcbiAgICB0eXBlOiAnY2xvc2UnO1xuICAgIGRhdGE6IFdlYlNvY2tldENsb3NlO1xufTtcblxuZXhwb3J0IGNsYXNzIE9tdVdTIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9tdTogT211LFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBhZGRRdWV1ZTogKGRhdGE6IFdTRGF0YSkgPT4gdm9pZCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2U6ICgpID0+IHZvaWQsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSByZWNlaXZlUXVldWU6IFdTTXNnW10gPSBbXSxcbiAgICAgICAgcHJpdmF0ZSByZWNlaXZlUmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgICAgICBwcml2YXRlIHN0YXR1czogJ2Nvbm5lY3RpbmcnIHwgJ29wZW4nIHwgJ2Nsb3NlZCcgPSAnY29ubmVjdGluZycsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKG9tdTogT211LCBpZDogSWRlbnRpZmllciwgYWRkUXVldWU6IChkYXRhOiBXU0RhdGEpID0+IHZvaWQsIGRpc3Bvc2U6ICgpID0+IHZvaWQpOiBXZWJTb2NrZXRIYW5kbGUge1xuICAgICAgICBjb25zdCB3cyA9IG5ldyBPbXVXUyhvbXUsIGlkLCBhZGRRdWV1ZSwgZGlzcG9zZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3cyxcbiAgICAgICAgICAgIG9wZW46IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29wZW4nLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcGF0Y2g6IChkYXRhOiBEYXRhQ2h1bms8V1NEYXRhTWV0YT4pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5tZXRhLnR5cGUgPT09IFdTTXNnVHlwZS5CSU5BUlkpIHtcbiAgICAgICAgICAgICAgICAgICAgd3MucmVjZWl2ZVF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2JpbmFyeScsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLmJvZHksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRleHREZWNvZGVyLmRlY29kZShkYXRhLmJvZHkpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVJlc29sdmU/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsb3NlOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjbG9zZScsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kKGRhdGE6IFdTRGF0YSk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZFF1ZXVlKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChXRUJTT0NLRVRfQ0xPU0UsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLmtleSgpLFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWNlaXZlKCk6IFByb21pc2U8V1NNc2c+IHtcbiAgICAgICAgaWYgKHRoaXMucmVjZWl2ZVJlc29sdmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxyZWFkeSByZWNlaXZpbmcgZnJvbSBhbm90aGVyIGFzeW5jIGNhbGwnKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5zdGF0dXMgIT09ICdjbG9zZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZWNlaXZlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB0aGlzLnJlY2VpdmVSZXNvbHZlID0gcmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnY2xvc2VkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdvcGVuJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ29wZW4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWNlaXZlUmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2aW5nIG9uIGFscmVhZHkgY2xvc2VkIHNvY2tldCcpO1xuICAgIH1cblxuICAgIHByb3RvY29sOiBzdHJpbmcgPSAnJztcbiAgICB1cmw6IHN0cmluZyA9ICcnO1xufVxuXG5leHBvcnQgY2xhc3MgT211V2ViU29ja2V0IGltcGxlbWVudHMgV2ViU29ja2V0IHtcbiAgICBwdWJsaWMgQ09OTkVDVElORyA9IDAgYXMgY29uc3Q7XG4gICAgcHVibGljIE9QRU4gPSAxIGFzIGNvbnN0O1xuICAgIHB1YmxpYyBDTE9TSU5HID0gMiBhcyBjb25zdDtcbiAgICBwdWJsaWMgQ0xPU0VEID0gMyBhcyBjb25zdDtcblxuICAgIGJpbmFyeVR5cGU6IEJpbmFyeVR5cGUgPSAnYmxvYic7XG4gICAgYnVmZmVyZWRBbW91bnQ6IG51bWJlciA9IDA7XG4gICAgZXh0ZW5zaW9uczogc3RyaW5nID0gJyc7XG4gICAgb25jbG9zZTogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBDbG9zZUV2ZW50KSA9PiBhbnkpIHwgbnVsbCA9IG51bGw7XG4gICAgb25lcnJvcjogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBFdmVudCkgPT4gYW55KSB8IG51bGwgPSBudWxsO1xuICAgIG9ubWVzc2FnZTogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBNZXNzYWdlRXZlbnQpID0+IGFueSkgfCBudWxsID0gbnVsbDtcbiAgICBvbm9wZW46ICgodGhpczogV2ViU29ja2V0LCBldjogRXZlbnQpID0+IGFueSkgfCBudWxsID0gbnVsbDtcbiAgICBwcm90b2NvbDogc3RyaW5nID0gJyc7XG4gICAgcmVhZHlTdGF0ZTogMCB8IDIgfCAxIHwgMyA9IDA7XG4gICAgdXJsOiBzdHJpbmcgPSAnJztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd3M6IE9tdVdTLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50TGlzdGVuZXJzOiBFdmVudExpc3RlbmVyTWFwPFdlYlNvY2tldEV2ZW50TWFwPiA9IHtcbiAgICAgICAgICAgIGNsb3NlOiBbXSxcbiAgICAgICAgICAgIGVycm9yOiBbXSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IFtdLFxuICAgICAgICAgICAgb3BlbjogW10sXG4gICAgICAgIH0sXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVjZWl2ZUxvb3AoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlY2VpdmVMb29wKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ0xPU0VEKSB7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIHR5cGUgfSA9IGF3YWl0IHRoaXMud3MucmVjZWl2ZSgpO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IENsb3NlRXZlbnQoJ2Nsb3NlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogZGF0YS5jb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBkYXRhLnJlYXNvbiA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnb3Blbic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBkYXRhLnByb3RvY29sID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdvcGVuJywge30pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEVycm9yRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEucmVhc29uID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgICAgICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IE1lc3NhZ2VFdmVudCgnbWVzc2FnZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50LnR5cGVdO1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnb3BlbicpIHtcbiAgICAgICAgICAgIHRoaXMub25vcGVuPy4oZXZlbnQgYXMgTWVzc2FnZUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGhpcy5vbmVycm9yPy4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgIHRoaXMub25tZXNzYWdlPy4oZXZlbnQgYXMgTWVzc2FnZUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgICAgICAgdGhpcy5vbmNsb3NlPy4oZXZlbnQgYXMgQ2xvc2VFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc2VuZChkYXRhOiBzdHJpbmcgfCBBcnJheUJ1ZmZlckxpa2UgfCBCbG9iIHwgQXJyYXlCdWZmZXJWaWV3KTogdm9pZCB7XG4gICAgICAgIHRoaXMud3Muc2VuZChkYXRhKTtcbiAgICB9XG5cbiAgICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cy5jbG9zZShjb2RlLCByZWFzb24pO1xuICAgIH1cblxuICAgIGFkZEV2ZW50TGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIFdlYlNvY2tldEV2ZW50TWFwPih0eXBlOiBLLCBsaXN0ZW5lcjogKHRoaXM6IFdlYlNvY2tldCwgZXY6IFdlYlNvY2tldEV2ZW50TWFwW0tdKSA9PiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyc1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICByZW1vdmVFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBXZWJTb2NrZXRFdmVudE1hcD4odHlwZTogSywgbGlzdGVuZXI6ICh0aGlzOiBXZWJTb2NrZXQsIGV2OiBXZWJTb2NrZXRFdmVudE1hcFtLXSkgPT4gYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnNbdHlwZV07XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdG9VaW50OEFycmF5KGRhdGE6IHN0cmluZyB8IEFycmF5QnVmZmVyTGlrZSB8IEJsb2IgfCBBcnJheUJ1ZmZlclZpZXcpOiBQcm9taXNlPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXJMaWtlPj4ge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRleHRFbmNvZGVyLmVuY29kZShkYXRhKTtcbiAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZGF0YS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhIGFzIEFycmF5QnVmZmVyTGlrZSk7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O0FBQUEsRUFHckIsS0FBSyxDQUFDLE1BQWUsUUFBdUI7QUFBQSxJQUN4QyxLQUFLLEdBQUcsTUFBTSxNQUFNLE1BQU07QUFBQTtBQUFBLEVBRzlCLGdCQUFtRCxDQUFDLE1BQVMsVUFBb0U7QUFBQSxJQUM3SCxLQUFLLGVBQWUsTUFBTSxLQUFLLFFBQVE7QUFBQTtBQUFBLEVBRzNDLG1CQUFzRCxDQUFDLE1BQVMsVUFBb0U7QUFBQSxJQUNoSSxNQUFNLFlBQVksS0FBSyxlQUFlO0FBQUEsSUFDdEMsTUFBTSxRQUFRLFVBQVUsUUFBUSxRQUFRO0FBQUEsSUFDeEMsSUFBSSxVQUFVLElBQUk7QUFBQSxNQUNkLFVBQVUsT0FBTyxPQUFPLENBQUM7QUFBQSxJQUM3QjtBQUFBO0FBRVI7QUFFQSxlQUFlLFlBQVksQ0FBQyxNQUErRjtBQUFBLEVBQ3ZILElBQUksT0FBTyxTQUFTLFVBQVU7QUFBQSxJQUMxQixPQUFPLFlBQVksT0FBTyxJQUFJO0FBQUEsRUFDbEMsRUFBTyxTQUFJLGdCQUFnQixNQUFNO0FBQUEsSUFDN0IsTUFBTSxjQUFjLE1BQU0sS0FBSyxZQUFZO0FBQUEsSUFDM0MsT0FBTyxJQUFJLFdBQVcsV0FBVztBQUFBLEVBQ3JDLEVBQU87QUFBQSxJQUNILE9BQU8sSUFBSSxXQUFXLElBQXVCO0FBQUE7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkRDNkE5Rjc4RTQ1RDNCRUI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
1410
|
+
//# debugId=71FB2632BCF8A03A64756E2164756E21
|
|
1411
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnN0LnRzIiwgIi4uLy4uL3NyYy9pZGVudGlmaWVyLnRzIiwgIi4uLy4uL3NyYy9hcHAudHMiLCAiLi4vLi4vc3JjL3NlcmlhbGl6ZS9zZXJpYWxpemVyLnRzIiwgIi4uLy4uL3NyYy9zZXJpYWxpemUvYnl0ZWJ1ZmZlci50cyIsICIuLi8uLi9zcmMvbmV0d29yay9wYWNrZXQvcGFja2V0LnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMudHMiLCAiLi4vLi4vc3JjL2FwaS9leHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL2FwaS9odHRwL2h0dHAudHMiLCAiLi4vLi4vc3JjL2FwaS9odHRwL3dlYnNvY2tldC50cyIsICIuLi8uLi9zcmMvYXBpL2h0dHAvZXh0ZW5zaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImV4cG9ydCBjb25zdCB0ZXh0RW5jb2RlcjogVGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmV4cG9ydCBjb25zdCB0ZXh0RGVjb2RlcjogVGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSAnLi9hcHAnO1xuXG5jb25zdCBOQU1FU1BBQ0VfUkVHRVggPSAvXihcXC5bXi86Ll18W1xcdy1dKSskLztcbmNvbnN0IE5BTUVfUkVHRVggPSAvXlteLzpdKyQvO1xuXG5leHBvcnQgdHlwZSBJbnRvSWQgPSBJZGVudGlmaWVyIHwgc3RyaW5nIHwgRXh0ZW5zaW9uVHlwZSB8IEFwcDtcblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXIge1xuICAgIHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgICAgIC4uLnBhdGg6IHN0cmluZ1tdXG4gICAgKSB7XG4gICAgICAgIElkZW50aWZpZXIudmFsaWRhdGUobmFtZXNwYWNlLCBwYXRoKTtcbiAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpZGVudGlmaWVyLmtleSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoanNvbjogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb21Kc29uKGpzb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbShpZDogSW50b0lkKTogSWRlbnRpZmllciB7XG4gICAgICAgIGlmIChpZCBpbnN0YW5jZW9mIElkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfSBlbHNlIGlmIChpZCBpbnN0YW5jZW9mIEFwcCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkLmlkO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb21LZXkoaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIGluZmVyXG4gICAgICAgICAgICAvLyBWaXRlIGRvZXMgbm90IHByZXNlcnZlIGNsYXNzIGluZm9ybWF0aW9uIHdoZW4gaW1wb3J0aW5nIGZyb20gZGlmZmVyZW50IHBhY2thZ2VzXG4gICAgICAgICAgICBjb25zdCBpZENhc3RlZCA9IGlkIGFzIHsgbmFtZXNwYWNlOiBzdHJpbmc7IHBhdGg6IHN0cmluZ1tdIH07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdHlwZW9mIGlkQ2FzdGVkLm5hbWVzcGFjZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGlkQ2FzdGVkLnBhdGgpICYmXG4gICAgICAgICAgICAgICAgaWRDYXN0ZWQucGF0aC5ldmVyeSgocCkgPT4gdHlwZW9mIHAgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKGlkQ2FzdGVkLm5hbWVzcGFjZSwgLi4uaWRDYXN0ZWQucGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpZFdpdGhJZCA9IGlkIGFzIHsgaWQ6IEludG9JZCB8IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZFdpdGhJZC5pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tKGlkV2l0aElkLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgdG8gSWRlbnRpZmllcjogJHtpZH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbU9wdGlvbmFsKGlkOiBJbnRvSWQgfCB1bmRlZmluZWQgfCBudWxsKTogSWRlbnRpZmllciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb20oaWQpO1xuICAgIH1cblxuICAgIHN0YXRpYyB2YWxpZGF0ZShuYW1lc3BhY2U6IHN0cmluZywgcGF0aDogc3RyaW5nW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBuYW1lc3BhY2U6IE5hbWVzcGFjZSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXRoOiBQYXRoIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbmFtZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghTkFNRVNQQUNFX1JFR0VYLnRlc3QobmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG5hbWVzcGFjZTogTmFtZXNwYWNlIG11c3QgbWF0Y2ggJHtOQU1FU1BBQ0VfUkVHRVh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIHBhdGgpIHtcbiAgICAgICAgICAgIGlmICghTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhdGg6IE5hbWUgbXVzdCBtYXRjaCAke05BTUVfUkVHRVh9IGJ1dCBnb3QgJHtuYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZvcm1hdChuYW1lc3BhY2U6IHN0cmluZywgLi4ucGF0aDogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgICBJZGVudGlmaWVyLnZhbGlkYXRlKG5hbWVzcGFjZSwgcGF0aCk7XG4gICAgICAgIHJldHVybiBgJHtuYW1lc3BhY2V9OiR7cGF0aC5qb2luKCcvJyl9YDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUtleShrZXk6IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSBrZXkuaW5kZXhPZignOicpO1xuICAgICAgICBpZiAoc2VwYXJhdG9yID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleTogTm8gc2VwYXJhdG9yIGZvdW5kIGluICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkuaW5kZXhPZignOicsIHNlcGFyYXRvciArIDEpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleTogTXVsdGlwbGUgc2VwYXJhdG9ycyBmb3VuZCBpbiAke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYW1lc3BhY2UgPSBrZXkuc2xpY2UoMCwgc2VwYXJhdG9yKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IGtleS5zbGljZShzZXBhcmF0b3IgKyAxKTtcbiAgICAgICAgaWYgKCFuYW1lc3BhY2UgfHwgIXBhdGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBrZXk6IE5hbWVzcGFjZSBhbmQgcGF0aCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIobmFtZXNwYWNlLCAuLi5wYXRoLnNwbGl0KCcvJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVybCh1cmw6IHN0cmluZyB8IFVSTCk6IElkZW50aWZpZXIge1xuICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCk7XG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IElkZW50aWZpZXIubmFtZXNwYWNlRnJvbVVybChwYXJzZWRVcmwuaHJlZik7XG4gICAgICAgIGNvbnN0IHBhdGggPSBwYXJzZWRVcmwucGF0aG5hbWUuc2xpY2UoMSkuc3BsaXQoJy8nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKG5hbWVzcGFjZSwgLi4ucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBuYW1lc3BhY2VGcm9tVXJsKHVybDogc3RyaW5nIHwgVVJMKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICByZXR1cm4gcGFyc2VkLmhvc3RuYW1lLnNwbGl0KCcuJykucmV2ZXJzZSgpLmpvaW4oJy4nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9Kc29uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSnNvbihqc29uOiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbUtleShqc29uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZvcm1hdCh0aGlzLm5hbWVzcGFjZSwgLi4udGhpcy5wYXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFcXVhbChvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXkoKSA9PT0gb3RoZXIua2V5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzTmFtZXNwYWNlRXF1YWwob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlID09PSBvdGhlci5uYW1lc3BhY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU3VicGF0aE9mKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLm5hbWVzcGFjZSAhPT0gb3RoZXIubmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGF0aC5sZW5ndGggPCBvdGhlci5wYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3RoZXIucGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMucGF0aFtpXSAhPT0gb3RoZXIucGF0aFtpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgam9pbiguLi5wYXRoOiBzdHJpbmdbXSk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIodGhpcy5uYW1lc3BhY2UsIC4uLnRoaXMucGF0aCwgLi4ucGF0aCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpZmllck1hcDxUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXA6IE1hcDxzdHJpbmcsIFQ+ID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbnRyaWVzPzogSXRlcmFibGU8W0lkZW50aWZpZXIsIFRdPixcbiAgICApIHtcbiAgICAgICAgaWYgKCFlbnRyaWVzKSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgW2lkLCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KGlkLmtleSgpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLnNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChpZGVudGlmaWVyOiBJZGVudGlmaWVyLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcC5zZXQoaWRlbnRpZmllci5rZXkoKSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuaGFzKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcC5kZWxldGUoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcC5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqa2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPElkZW50aWZpZXI+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5tYXAua2V5cygpKSB7XG4gICAgICAgICAgICB5aWVsZCBJZGVudGlmaWVyLmZyb21LZXkoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC52YWx1ZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgVF0+IHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5tYXAuZW50cmllcygpKSB7XG4gICAgICAgICAgICB5aWVsZCBbSWRlbnRpZmllci5mcm9tS2V5KGtleSksIHZhbHVlXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFtJZGVudGlmaWVyLCBUXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpZmllclNldCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gICAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldC5zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGQoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5hZGQoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldC5oYXMoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0LmRlbGV0ZShpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0LmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljICprZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SWRlbnRpZmllcj4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLnNldC5rZXlzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIElkZW50aWZpZXIuZnJvbUtleShrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPElkZW50aWZpZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtJZGVudGlmaWVyLCBJZGVudGlmaWVyXT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLnNldC5rZXlzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBJZGVudGlmaWVyLmZyb21LZXkoa2V5KTtcbiAgICAgICAgICAgIHlpZWxkIFtpZGVudGlmaWVyLCBpZGVudGlmaWVyXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFtJZGVudGlmaWVyLCBJZGVudGlmaWVyXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGUgfSBmcm9tICcuL2xvY2FsaXphdGlvbi9sb2NhbGUuanMnO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgQXBwTWV0YWRhdGEgPSB7XG4gICAgbG9jYWxlOiBMb2NhbGU7XG4gICAgbmFtZT86IExvY2FsaXplZFRleHQ7XG4gICAgaWNvbj86IExvY2FsaXplZFRleHQ7XG4gICAgZGVzY3JpcHRpb24/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGltYWdlPzogTG9jYWxpemVkVGV4dDtcbiAgICBzaXRlPzogTG9jYWxpemVkVGV4dDtcbiAgICByZXBvc2l0b3J5PzogTG9jYWxpemVkVGV4dDtcbiAgICBhdXRob3JzPzogTG9jYWxpemVkVGV4dDtcbiAgICBsaWNlbnNlPzogTG9jYWxpemVkVGV4dDtcbiAgICB0YWdzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBBcHBUeXBlID0gJ2FwcCcgfCAnc2VydmljZScgfCAncmVtb3RlJyB8ICdwbHVnaW4nIHwgJ2Rhc2hib2FyZCc7XG5cbmV4cG9ydCB0eXBlIERlcGVuZGVuY3lTcGVjaWZpZXIgPSB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICAgIGluZGV4Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQXBwSnNvbiA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IEFwcFR5cGU7XG4gICAgcGFyZW50X2lkPzogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG59O1xuXG5leHBvcnQgY2xhc3MgQXBwIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEFwcFR5cGU7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhcmVudElkPzogSWRlbnRpZmllcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgIHB1YmxpYyByZWFkb25seSBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IEludG9JZCwgb3B0aW9uczoge1xuICAgICAgICB0eXBlPzogQXBwVHlwZTtcbiAgICAgICAgcGFyZW50SWQ/OiBJbnRvSWQ7XG4gICAgICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgICAgIHVybD86IHN0cmluZztcbiAgICAgICAgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICAgICAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG4gICAgfSkge1xuICAgICAgICB0aGlzLmlkID0gSWRlbnRpZmllci5mcm9tKGlkKTtcbiAgICAgICAgdGhpcy5wYXJlbnRJZCA9IElkZW50aWZpZXIuZnJvbU9wdGlvbmFsKG9wdGlvbnMucGFyZW50SWQpO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBvcHRpb25zLnZlcnNpb247XG4gICAgICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmw7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhO1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgPz8gJ2FwcCc7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gb3B0aW9ucy5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpbmZvOiBBcHBKc29uKTogQXBwIHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkoaW5mby5pZCk7XG4gICAgICAgIHJldHVybiBuZXcgQXBwKGlkLCB7XG4gICAgICAgICAgICBwYXJlbnRJZDogSWRlbnRpZmllci5mcm9tT3B0aW9uYWwoaW5mby5wYXJlbnRfaWQpLFxuICAgICAgICAgICAgdmVyc2lvbjogaW5mby52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBpbmZvLnVybCxcbiAgICAgICAgICAgIHR5cGU6IGluZm8udHlwZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBpbmZvLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBpbmZvLmRlcGVuZGVuY2llcyA/PyB7fSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogQXBwKTogQXBwSnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogZGF0YS5pZC5rZXkoKSxcbiAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgIHBhcmVudF9pZDogZGF0YS5wYXJlbnRJZD8ua2V5KCksXG4gICAgICAgICAgICB2ZXJzaW9uOiBkYXRhLnZlcnNpb24sXG4gICAgICAgICAgICB1cmw6IGRhdGEudXJsLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXM6IGRhdGEuZGVwZW5kZW5jaWVzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luKC4uLnBhdGhzOiBzdHJpbmdbXSk6IEFwcCB7XG4gICAgICAgIHJldHVybiBuZXcgQXBwKHRoaXMuaWQuam9pbiguLi5wYXRocyksIHtcbiAgICAgICAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiB0aGlzLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi9jb25zdC5qcyc7XG5cbmV4cG9ydCB0eXBlIEpzb25UeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQgfCB7IFtrZXkgaW4gbmV2ZXJdPzogSnNvblR5cGUgfSB8IEpzb25UeXBlW107XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICBzZXJpYWxpemUoZGF0YTogVCk6IEQ7XG4gICAgZGVzZXJpYWxpemUoZGF0YTogRCk6IFQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHNlcmlhbGl6ZTogKGRhdGE6IFQpID0+IEQsXG4gICAgICAgIHB1YmxpYyBkZXNlcmlhbGl6ZTogKGRhdGE6IEQpID0+IFQsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgb2Y8VCwgRD4oc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIEQ+KTogU2VyaWFsaXplcjxULCBEPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBEPihzZXJpYWxpemVyLnNlcmlhbGl6ZSwgc2VyaWFsaXplci5kZXNlcmlhbGl6ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwaXBlPFQsIFIsIEQ+KHNlcjE6IFNlcmlhbGl6YWJsZTxULCBSPiwgc2VyMjogU2VyaWFsaXphYmxlPFIsIEQ+KTogU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcjIuc2VyaWFsaXplKHNlcjEuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXIxLmRlc2VyaWFsaXplKHNlcjIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdHJhbnNmb3JtPFQ+KGZ1bmM6ICh2YWx1ZTogVCkgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgVD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVD4oXG4gICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vb3A8VD4oKTogU2VyaWFsaXplcjxULCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBUPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkPFxuICAgICAgICBLIGV4dGVuZHMga2V5b2YgRCxcbiAgICAgICAgUixcbiAgICA+KFxuICAgICAgICBrZXk6IEssXG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxEW0tdLCBSPixcbiAgICApOiBTZXJpYWxpemVyPFxuICAgICAgICBULFxuICAgICAgICB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH1cbiAgICA+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFxuICAgICAgICAgICAgVCxcbiAgICAgICAgICAgIHsgW1AgaW4ga2V5b2YgRF06IFAgZXh0ZW5kcyBLID8gUiA6IERbUF0gfVxuICAgICAgICA+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemUoZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2VyaWFsaXplZCxcbiAgICAgICAgICAgICAgICAgICAgW2tleV06IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHNlcmlhbGl6ZWRba2V5XSksXG4gICAgICAgICAgICAgICAgfSBhcyB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGFba2V5XSBhcyBSKSxcbiAgICAgICAgICAgICAgICB9IGFzIEQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMganNvbjxUIGV4dGVuZHMgSnNvblR5cGU+KCk6IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGV4dEVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeSh0aGlzLnNlcmlhbGl6ZShkYXRhKSkpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BcnJheSgpOiBTZXJpYWxpemVyPFRbXSwgRFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxUW10sIERbXT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuc2VyaWFsaXplKGl0ZW0pKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLm1hcCgoaXRlbSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShpdGVtKSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvTWFwKCk6IFNlcmlhbGl6ZXI8TWFwPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIEQ+PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxNYXA8c3RyaW5nLCBUPiwgTWFwPHN0cmluZywgRD4+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgRD4oKTtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHRoaXMuc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgdGhpcy5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmYWxsYmFjayhmYWxsYmFjazogVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFsbGJhY2tNYXAoZmFsbGJhY2s6IChkYXRhOiBELCBlcnJvcjogdW5rbm93bikgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjayhkYXRhLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGlwZTxFPihzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8RCwgRT4pOiBTZXJpYWxpemVyPFQsIEU+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEU+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB0aGlzLmRlc2VyaWFsaXplKHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIsIHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vY29uc3QuanMnO1xuaW1wb3J0IHsgSnNvblR5cGUgfSBmcm9tICcuL3NlcmlhbGl6ZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgRmxhZ3Mge1xuICAgIHByaXZhdGUgdmFsdWU6IG51bWJlcjtcbiAgICBwcml2YXRlIGxlbmd0aDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogeyB2YWx1ZT86IG51bWJlcjsgbGVuZ3RoPzogbnVtYmVyIH0pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9wdGlvbnMudmFsdWUgPz8gMDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRpb25zLmxlbmd0aCA/PyAzMjtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBvc2l0aW9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlICYgKDEgPDwgcG9zaXRpb24pKSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KHBvc2l0aW9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlICYgKDEgPDwgcG9zaXRpb24pKSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaWZTZXQ8VD4ocG9zaXRpb246IG51bWJlciwgY2FsbGJhY2s6ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzKHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KHBvc2l0aW9uOiBudW1iZXIsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSB8PSAxIDw8IHBvc2l0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSAmPSB+KDEgPDwgcG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKHdyaXRlcjogQnl0ZVdyaXRlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBiaXRzID0gbmV3IFVpbnQ4QXJyYXkoKHRoaXMubGVuZ3RoICsgNykgLyA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBiaXRzW2ldID0gKHRoaXMudmFsdWUgPj4gKGkgKiA4KSkgJiAweGZmO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci53cml0ZShiaXRzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWQocmVhZGVyOiBCeXRlUmVhZGVyLCBsZW5ndGg6IG51bWJlcik6IEZsYWdzIHtcbiAgICAgICAgbGV0IHZhbHVlID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAobGVuZ3RoICsgNykgLyA4OyBpKyspIHtcbiAgICAgICAgICAgIHZhbHVlIHw9IHJlYWRlci5yZWFkVWludDgoKSA8PCAoaSAqIDgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRmxhZ3MoeyB2YWx1ZSwgbGVuZ3RoIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVhZEZsb2F0MTYoZGF0YVZpZXc6IERhdGFWaWV3LCBvZmZzZXQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc2lnbiA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4ODAwMCkgPyAtMSA6IDE7XG4gICAgY29uc3QgZXhwb25lbnQgPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDdjMDApID4+IDEwO1xuICAgIGNvbnN0IG1hbnRpc3NhID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHgwM2ZmKTtcbiAgICBpZiAoZXhwb25lbnQgPT09IDAgJiYgbWFudGlzc2EgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChleHBvbmVudCA9PT0gMHgxZikge1xuICAgICAgICByZXR1cm4gbWFudGlzc2EgPT09IDAgPyBJbmZpbml0eSAqIHNpZ24gOiBOYU47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEV4cG9uZW50ID0gZXhwb25lbnQgLSAxNTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE1hbnRpc3NhID0gbWFudGlzc2EgLyAxMDI0O1xuICAgICAgICByZXR1cm4gc2lnbiAqIE1hdGgucG93KDIsIG5vcm1hbGl6ZWRFeHBvbmVudCkgKiAoMSArIG5vcm1hbGl6ZWRNYW50aXNzYSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0MTYoZGF0YVZpZXc6IERhdGFWaWV3LCBvZmZzZXQ6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaWduID0gdmFsdWUgPCAwID8gMSA6IDA7XG4gICAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSk7XG4gICAgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMHg3YzAwIHwgKHNpZ24gPDwgMTUpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHBvbmVudCA9IE1hdGguZmxvb3IoTWF0aC5sb2cyKHZhbHVlKSk7XG4gICAgY29uc3QgbWFudGlzc2EgPSB2YWx1ZSAvIE1hdGgucG93KDIsIGV4cG9uZW50KSAtIDE7XG4gICAgY29uc3Qgbm9ybWFsaXplZEV4cG9uZW50ID0gZXhwb25lbnQgKyAxNTtcbiAgICBjb25zdCBub3JtYWxpemVkTWFudGlzc2EgPSBNYXRoLnJvdW5kKG1hbnRpc3NhICogMTAyNCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRFeHBvbmVudCA8PSAwKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIHNpZ24gPDwgMTUpO1xuICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZEV4cG9uZW50ID49IDB4MWYpIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMHg3YzAwIHwgKHNpZ24gPDwgMTUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCAoc2lnbiA8PCAxNSkgfCAobm9ybWFsaXplZEV4cG9uZW50IDw8IDEwKSB8IG5vcm1hbGl6ZWRNYW50aXNzYSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQnl0ZVdyaXRlciB7XG4gICAgcHJpdmF0ZSBkYXRhVmlldzogRGF0YVZpZXc7XG4gICAgcHJpdmF0ZSBidWZmZXI6IEFycmF5QnVmZmVyO1xuICAgIHByaXZhdGUgb2Zmc2V0ID0gMDtcbiAgICBwcml2YXRlIGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihpbml0PzogQXJyYXlCdWZmZXIsIG9mZnNldD86IG51bWJlcikge1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldCA/PyAwO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGluaXQgPz8gbmV3IEFycmF5QnVmZmVyKDEwMjQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmZmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21VaW50OEFycmF5KGJ1ZmZlcjogVWludDhBcnJheSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgIHVpbnQ4QXJyYXkuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVXcml0ZXIoYXJyYXlCdWZmZXIsIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFsbG9jYXRlKGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIGxlbmd0aCA+IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0J5dGVMZW5ndGggPSBNYXRoLm1heCh0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoICogMiwgdGhpcy5vZmZzZXQgKyBsZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgbmV3QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKG5ld0J5dGVMZW5ndGgpO1xuICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkobmV3QnVmZmVyKS5zZXQobmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIpKTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3QnVmZmVyO1xuICAgICAgICAgICAgdGhpcy5kYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUoZGF0YTogVWludDhBcnJheSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgYWxyZWFkeSBmaW5pc2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoZGF0YS5sZW5ndGgpO1xuICAgICAgICBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlcikuc2V0KGRhdGEsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUJvb2xlYW4odmFsdWU6IGJvb2xlYW4pOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSA/IDEgOiAwKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50OCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50OCh0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50OCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDE2KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQxNih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMik7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDE2KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50MzIodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQ2NCh2YWx1ZTogYmlnaW50KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoOCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0QmlnSW50NjQodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDY0KHZhbHVlOiBiaWdpbnQpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg4KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRCaWdVaW50NjQodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVUxFQjEyOCh2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExFQjEyOFxuICAgICAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHZhbHVlID4gMHg3Zikge1xuICAgICAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsICh2YWx1ZSAmIDB4N2YpIHwgMHg4MCk7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICAgICAgdmFsdWUgPj49IDc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgxKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50OCh0aGlzLm9mZnNldCwgdmFsdWUgJiAweDdmKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQxNih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMik7XG4gICAgICAgIHdyaXRlRmxvYXQxNih0aGlzLmRhdGFWaWV3LCB0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRGbG9hdDMyKHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0NjQodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDQpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEZsb2F0NjQodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDhBcnJheSh2YWx1ZTogVWludDhBcnJheSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlVUxFQjEyOCh2YWx1ZS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgdGhpcy53cml0ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVN0cmluZyh2YWx1ZTogc3RyaW5nKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMud3JpdGVVaW50OEFycmF5KHRleHRFbmNvZGVyLmVuY29kZSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVKU09OKHZhbHVlOiBKc29uVHlwZSk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsYWdzKGZsYWdzOiBGbGFncyk6IEJ5dGVXcml0ZXIge1xuICAgICAgICBmbGFncy53cml0ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmlzaCgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLCAwLCB0aGlzLm9mZnNldCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQnl0ZVJlYWRlciB7XG4gICAgcHJpdmF0ZSBkYXRhVmlldzogRGF0YVZpZXc7XG4gICAgcHJpdmF0ZSBvZmZzZXQ6IG51bWJlcjtcbiAgICBwcml2YXRlIGZpbmlzaGVkOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihkYXRhOiBEYXRhVmlldykge1xuICAgICAgICB0aGlzLmRhdGFWaWV3ID0gZGF0YTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVWludDhBcnJheShidWZmZXI6IFVpbnQ4QXJyYXkpOiBCeXRlUmVhZGVyIHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICB1aW50OEFycmF5LnNldChuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVSZWFkZXIoZGF0YVZpZXcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUFycmF5QnVmZmVyKGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBCeXRlUmVhZGVyIHtcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGZyb21CbG9iKGJsb2I6IEJsb2IpOiBQcm9taXNlPEJ5dGVSZWFkZXI+IHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBibG9iLmFycmF5QnVmZmVyKCk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZChzaXplOiBudW1iZXIpOiBVaW50OEFycmF5IHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2l6ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2l6ZSBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0ICsgc2l6ZSA+IHRoaXMuZGF0YVZpZXcuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YVZpZXcuYnVmZmVyLCB0aGlzLm9mZnNldCwgc2l6ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IHNpemU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEJvb2xlYW4oKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50OCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQ4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRVaW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDE2KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDE2KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRVaW50MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQ2NCgpOiBiaWdpbnQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0QmlnSW50NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50NjQoKTogYmlnaW50IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEJpZ1VpbnQ2NCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVMRUIxMjgoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gVW5zaWduZWQgTEVCMTI4XG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICAgIGxldCBzaGlmdCA9IDA7XG4gICAgICAgIGxldCBieXRlOiBudW1iZXI7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCA+PSB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnl0ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgICAgIHZhbHVlIHw9IChieXRlICYgMGIwMTExMTExMSkgPDwgc2hpZnQ7XG4gICAgICAgICAgICBzaGlmdCArPSA3O1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICgoYnl0ZSAmIDBiMTAwMDAwMDApICE9PSAwKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRmxvYXQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYWRGbG9hdDE2KHRoaXMuZGF0YVZpZXcsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRmxvYXQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0RmxvYXQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0NjQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEZsb2F0NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50OEFycmF5KCk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnJlYWRVTEVCMTI4KCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWQobGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFN0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBieXRlQXJyYXkgPSB0aGlzLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZUFycmF5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEpTT048VCBleHRlbmRzIEpzb25UeXBlPigpOiBUIHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5yZWFkU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRmxhZ3MobGVuZ3RoOiBudW1iZXIpOiBGbGFncyB7XG4gICAgICAgIHJldHVybiBGbGFncy5yZWFkKHRoaXMsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmlzaCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0ICE9PSB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSWRlbnRpZmllciB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgSnNvblR5cGUsIHR5cGUgU2VyaWFsaXphYmxlLCBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcblxuZXhwb3J0IHR5cGUgUGFja2V0RGF0YSA9IHtcbiAgICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZGF0YTogVWludDhBcnJheTtcbn07XG5cbmV4cG9ydCB0eXBlIFBhY2tldDxUID0gdW5rbm93bj4gPSB7XG4gICAgcmVhZG9ubHkgdHlwZTogUGFja2V0VHlwZTxUPjtcbiAgICByZWFkb25seSBkYXRhOiBUO1xufTtcblxuZXhwb3J0IGNsYXNzIFBhY2tldFR5cGU8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBuZXcoZGF0YTogVCk6IFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIG1hdGNoKHBhY2tldDogUGFja2V0KTogcGFja2V0IGlzIFBhY2tldDxUPiB7XG4gICAgICAgIHJldHVybiBwYWNrZXQudHlwZSA9PT0gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlSnNvbjxULCBEIGV4dGVuZHMgSnNvblR5cGUgPSBKc29uVHlwZT4oaWRlbnRpZmllcjogSWRlbnRpZmllciwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBzZXJpYWxpemVyPzogU2VyaWFsaXphYmxlPFQsIEQ+O1xuICAgIH0pOiBQYWNrZXRUeXBlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWNrZXRUeXBlPFQ+KFxuICAgICAgICAgICAgaWRlbnRpZmllci5qb2luKG5hbWUpLFxuICAgICAgICAgICAgU2VyaWFsaXplci5waXBlPFQsIEQsIFVpbnQ4QXJyYXk+KHNlcmlhbGl6ZXIgPz8gU2VyaWFsaXplci5ub29wKCksIFNlcmlhbGl6ZXIuanNvbigpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlU2VyaWFsaXplZDxUPihpZGVudGlmaWVyOiBJZGVudGlmaWVyLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgfToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxULCBVaW50OEFycmF5PjtcbiAgICB9KTogUGFja2V0VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFja2V0VHlwZShcbiAgICAgICAgICAgIGlkZW50aWZpZXIuam9pbihuYW1lKSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFwcEpzb24gfSBmcm9tICcuLi8uLi9hcHAuanMnO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSAnLi4vLi4vYXBwLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tICcuLi8uLi9zZXJpYWxpemUvc2VyaWFsaXplci5qcyc7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi9wYWNrZXQuanMnO1xuXG5jb25zdCBJREVOVElGSUVSID0gbmV3IElkZW50aWZpZXIoJ2NvcmUnLCAncGFja2V0Jyk7XG5cbnR5cGUgUHJvdG9jb2xJbmZvID0ge1xuICAgIHZlcnNpb246IHN0cmluZztcbn07XG5cbnR5cGUgUlNBTnVtYmVycyA9IHtcbiAgICBlOiBzdHJpbmc7XG4gICAgbjogc3RyaW5nO1xufTtcblxudHlwZSBFbmNyeXB0aW9uUmVxdWVzdCA9IHtcbiAgICBraW5kOiAndjEnO1xuICAgIHJzYTogUlNBTnVtYmVycztcbn07XG5cbnR5cGUgRW5jcnlwdGlvblJlc3BvbnNlID0ge1xuICAgIGtpbmQ6ICd2MSc7XG4gICAgcnNhOiBSU0FOdW1iZXJzO1xuICAgIGFlczogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2VydmVyTWV0YSA9IHtcbiAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgIGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXF1ZXN0IHwgbnVsbDtcbiAgICBoYXNoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59O1xuXG50eXBlIENvbm5lY3RQYWNrZXRKc29uID0ge1xuICAgIHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgYXBwOiBBcHBKc29uO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gICAgZW5jcnlwdGlvbjogRW5jcnlwdGlvblJlc3BvbnNlIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25uZWN0UGFja2V0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXBwOiBBcHA7XG4gICAgcHVibGljIHJlYWRvbmx5IHRva2VuOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7XG4gICAgICAgIHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgICAgIGFwcDogQXBwO1xuICAgICAgICB0b2tlbjogc3RyaW5nO1xuICAgICAgICBlbmNyeXB0aW9uPzogRW5jcnlwdGlvblJlc3BvbnNlIHwgbnVsbDtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMucHJvdG9jb2wgPSBvcHRpb25zLnByb3RvY29sO1xuICAgICAgICB0aGlzLmFwcCA9IG9wdGlvbnMuYXBwO1xuICAgICAgICB0aGlzLnRva2VuID0gb3B0aW9ucy50b2tlbjtcbiAgICAgICAgdGhpcy5lbmNyeXB0aW9uID0gb3B0aW9ucy5lbmNyeXB0aW9uID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBDb25uZWN0UGFja2V0SnNvbik6IENvbm5lY3RQYWNrZXQge1xuICAgICAgICByZXR1cm4gbmV3IENvbm5lY3RQYWNrZXQoe1xuICAgICAgICAgICAgcHJvdG9jb2w6IGRhdGEucHJvdG9jb2wsXG4gICAgICAgICAgICBhcHA6IEFwcC5kZXNlcmlhbGl6ZShkYXRhLmFwcCksXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBkYXRhLmVuY3J5cHRpb24sXG4gICAgICAgICAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogQ29ubmVjdFBhY2tldCk6IENvbm5lY3RQYWNrZXRKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByb3RvY29sOiBkYXRhLnByb3RvY29sLFxuICAgICAgICAgICAgYXBwOiBBcHAuc2VyaWFsaXplKGRhdGEuYXBwKSxcbiAgICAgICAgICAgIGVuY3J5cHRpb246IGRhdGEuZW5jcnlwdGlvbixcbiAgICAgICAgICAgIHRva2VuOiBkYXRhLnRva2VuLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gRGlzY29ubmVjdFR5cGUge1xuICAgIElOVkFMSURfVE9LRU4gPSAnaW52YWxpZF90b2tlbicsXG4gICAgSU5WQUxJRF9PUklHSU4gPSAnaW52YWxpZF9vcmlnaW4nLFxuICAgIElOVkFMSURfVkVSU0lPTiA9ICdpbnZhbGlkX3ZlcnNpb24nLFxuICAgIElOVkFMSURfUEFDS0VUX1RZUEUgPSAnaW52YWxpZF9wYWNrZXRfdHlwZScsXG4gICAgSU5WQUxJRF9QQUNLRVRfREFUQSA9ICdpbnZhbGlkX3BhY2tldF9kYXRhJyxcbiAgICBJTlZBTElEX1BBQ0tFVCA9ICdpbnZhbGlkX3BhY2tldCcsXG4gICAgSU5URVJOQUxfRVJST1IgPSAnaW50ZXJuYWxfZXJyb3InLFxuICAgIEFOT1RIRVJfQ09OTkVDVElPTiA9ICdhbm90aGVyX2Nvbm5lY3Rpb24nLFxuICAgIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb25fZGVuaWVkJyxcbiAgICBBUFBfUkVNT1ZFRCA9ICdhcHBfcmVtb3ZlZCcsXG4gICAgU0VSVkVSX1JFU1RBUlQgPSAnc2VydmVyX3Jlc3RhcnQnLFxuICAgIFNIVVRET1dOID0gJ3NodXRkb3duJyxcbiAgICBDTE9TRSA9ICdjbG9zZScsXG59XG5cbnR5cGUgRGlzY29ubmVjdFBhY2tldEpzb24gPSB7XG4gICAgdHlwZTogRGlzY29ubmVjdFR5cGU7XG4gICAgbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBEaXNjb25uZWN0UGFja2V0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRGlzY29ubmVjdFR5cGU7XG4gICAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7XG4gICAgICAgIHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgICAgICBtZXNzYWdlPzogc3RyaW5nIHwgbnVsbDtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogRGlzY29ubmVjdFBhY2tldCk6IERpc2Nvbm5lY3RQYWNrZXRKc29uIHtcbiAgICAgICAgcmV0dXJuIGRhdGEudG9Kc29uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhOiBEaXNjb25uZWN0UGFja2V0SnNvbik6IERpc2Nvbm5lY3RQYWNrZXQge1xuICAgICAgICByZXR1cm4gRGlzY29ubmVjdFBhY2tldC5mcm9tSnNvbihkYXRhKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpzb24oZGF0YTogRGlzY29ubmVjdFBhY2tldEpzb24pOiBEaXNjb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBEaXNjb25uZWN0UGFja2V0KHtcbiAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdG9Kc29uKCk6IERpc2Nvbm5lY3RQYWNrZXRKc29uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBQQUNLRVRfVFlQRVM6IHtcbiAgICBTRVJWRVJfTUVUQTogUGFja2V0VHlwZTxTZXJ2ZXJNZXRhPjtcbiAgICBDT05ORUNUOiBQYWNrZXRUeXBlPENvbm5lY3RQYWNrZXQ+O1xuICAgIERJU0NPTk5FQ1Q6IFBhY2tldFR5cGU8RGlzY29ubmVjdFBhY2tldD47XG4gICAgVE9LRU46IFBhY2tldFR5cGU8c3RyaW5nPjtcbiAgICBSRUFEWTogUGFja2V0VHlwZTx1bmRlZmluZWQ+O1xuICAgIEVOQ1JZUFRFRF9QQUNLRVQ6IFBhY2tldFR5cGU8VWludDhBcnJheT47XG59ID0ge1xuICAgIFNFUlZFUl9NRVRBOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248U2VydmVyTWV0YT4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnc2VydmVyX21ldGEnLFxuICAgIH0pLFxuICAgIENPTk5FQ1Q6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxDb25uZWN0UGFja2V0PihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdjb25uZWN0JyxcbiAgICAgICAgc2VyaWFsaXplcjogQ29ubmVjdFBhY2tldCxcbiAgICB9KSxcbiAgICBESVNDT05ORUNUOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248RGlzY29ubmVjdFBhY2tldD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnZGlzY29ubmVjdCcsXG4gICAgICAgIHNlcmlhbGl6ZXI6IERpc2Nvbm5lY3RQYWNrZXQsXG4gICAgfSksXG4gICAgVE9LRU46IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxzdHJpbmc+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3Rva2VuJyxcbiAgICB9KSxcbiAgICBSRUFEWTogUGFja2V0VHlwZS5jcmVhdGVKc29uPHVuZGVmaW5lZD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAncmVhZHknLFxuICAgIH0pLFxuICAgIEVOQ1JZUFRFRF9QQUNLRVQ6IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxVaW50OEFycmF5PihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICdlJyxcbiAgICAgICAgc2VyaWFsaXplcjogU2VyaWFsaXplci5ub29wKCksXG4gICAgfSksXG59O1xuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBPbXUgfSBmcm9tICcuLi9vbXUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuc2lvbiB7XG4gICAgcmVhZG9ubHkgdHlwZTogRXh0ZW5zaW9uVHlwZTtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvblR5cGU8VCBleHRlbmRzIEV4dGVuc2lvbiA9IEV4dGVuc2lvbj4gZXh0ZW5kcyBJZGVudGlmaWVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZTogKG9tdTogT211KSA9PiBULFxuICAgICkge1xuICAgICAgICBzdXBlcignZXh0JywgbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGtleSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIoJ2V4dCcsIHRoaXMubmFtZSkua2V5KCk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBCeXRlUmVhZGVyLCBCeXRlV3JpdGVyLCBKc29uVHlwZSB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RIYW5kbGUgPSB7XG4gICAgaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEh0dHBSZXF1ZXN0ID0gUmVxdWVzdEhhbmRsZSAmIHtcbiAgICBoZWFkZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgbWV0aG9kOiBzdHJpbmc7XG4gICAgcmVkaXJlY3Q6IFJlcXVlc3RSZWRpcmVjdDtcbiAgICB1cmw6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBEYXRhQ2h1bms8VCBleHRlbmRzIEpzb25UeXBlPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBtZXRhOiBULFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYm9keTogVWludDhBcnJheSxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemU8VCBleHRlbmRzIEpzb25UeXBlPihkYXRhOiBEYXRhQ2h1bms8VD4pOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ5dGVXcml0ZXIoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlSlNPTihkYXRhLm1ldGEpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGRhdGEuYm9keSk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZTxUIGV4dGVuZHMgSnNvblR5cGU+KGRhdGE6IFVpbnQ4QXJyYXkpOiBEYXRhQ2h1bms8VD4ge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21VaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBjb25zdCBtZXRhID0gcmVhZGVyLnJlYWRKU09OPFQ+KCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhQ2h1bmsobWV0YSwgYm9keSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgT211UmVzcG9uc2UgaW1wbGVtZW50cyBSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgb2s6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZWRpcmVjdGVkOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXNUZXh0OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBSZXNwb25zZVR5cGUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvZHk6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+PiB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5VXNlZDogYm9vbGVhbixcbiAgICApIHt9XG5cbiAgICBjbG9uZSgpOiBPbXVSZXNwb25zZSB7XG4gICAgICAgIHJldHVybiBuZXcgT211UmVzcG9uc2UoXG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICB0aGlzLm9rLFxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdGVkLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RleHQsXG4gICAgICAgICAgICB0aGlzLnR5cGUsXG4gICAgICAgICAgICB0aGlzLnVybCxcbiAgICAgICAgICAgIHRoaXMuYm9keSxcbiAgICAgICAgICAgIHRoaXMuYm9keVVzZWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIGFzeW5jIGFycmF5QnVmZmVyKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCk7XG4gICAgfVxuICAgIGJsb2IoKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS5ibG9iKCk7XG4gICAgfVxuICAgIGJ5dGVzKCk6IFByb21pc2U8VWludDhBcnJheTxBcnJheUJ1ZmZlcj4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLmJvZHkpLmFycmF5QnVmZmVyKCkudGhlbigoYnVmKSA9PiBuZXcgVWludDhBcnJheShidWYpKTtcbiAgICB9XG4gICAgZm9ybURhdGEoKTogUHJvbWlzZTxGb3JtRGF0YT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuZm9ybURhdGEoKTtcbiAgICB9XG4gICAganNvbigpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuYm9keSkuanNvbigpO1xuICAgIH1cbiAgICB0ZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5ib2R5KS50ZXh0KCk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciB9IGZyb20gJy4uLy4uL2NvbnN0JztcbmltcG9ydCB7IERhdGFDaHVuaywgUmVxdWVzdEhhbmRsZSB9IGZyb20gJy4vaHR0cCc7XG5cbmV4cG9ydCB0eXBlIFdTRGF0YSA9IHN0cmluZyB8IEFycmF5QnVmZmVyTGlrZSB8IEJsb2IgfCBBcnJheUJ1ZmZlclZpZXc7XG5cbmV4cG9ydCBjb25zdCBXU01zZ1R5cGUgPSB7XG4gICAgQ09OVElOVUFUSU9OOiAweDAsXG4gICAgVEVYVDogMHgxLFxuICAgIEJJTkFSWTogMHgyLFxuICAgIFBJTkc6IDB4OSxcbiAgICBQT05HOiAweEEsXG4gICAgQ0xPU0U6IDB4OCxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBXU0Nsb3NlQ29kZSA9IHtcbiAgICBPSzogMTAwMCxcbiAgICBHT0lOR19BV0FZOiAxMDAxLFxuICAgIFBST1RPQ09MX0VSUk9SOiAxMDAyLFxuICAgIFVOU1VQUE9SVEVEX0RBVEE6IDEwMDMsXG4gICAgQUJOT1JNQUxfQ0xPU1VSRTogMTAwNixcbiAgICBJTlZBTElEX1RFWFQ6IDEwMDcsXG4gICAgUE9MSUNZX1ZJT0xBVElPTjogMTAwOCxcbiAgICBNRVNTQUdFX1RPT19CSUc6IDEwMDksXG4gICAgTUFOREFUT1JZX0VYVEVOU0lPTjogMTAxMCxcbiAgICBJTlRFUk5BTF9FUlJPUjogMTAxMSxcbiAgICBTRVJWSUNFX1JFU1RBUlQ6IDEwMTIsXG4gICAgVFJZX0FHQUlOX0xBVEVSOiAxMDEzLFxuICAgIEJBRF9HQVRFV0FZOiAxMDE0LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0T3BlbiA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsO1xufTtcbmV4cG9ydCB0eXBlIFdlYlNvY2tldENsb3NlID0gUmVxdWVzdEhhbmRsZSAmIHtcbiAgICBjb2RlPzogbnVtYmVyO1xuICAgIHJlYXNvbj86IHN0cmluZyB8IG51bGw7XG59O1xuZXhwb3J0IHR5cGUgV2ViU29ja2V0RXJyb3IgPSBSZXF1ZXN0SGFuZGxlICYge1xuICAgIHR5cGU6ICdDb25uZWN0aW9uUmVmdXNlZCc7XG4gICAgcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIEV2ZW50TGlzdGVuZXJNYXA8VD4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06ICgoZXZlbnQ6IFRbS10pID0+IHVua25vd24pW11cbn07XG5cbmV4cG9ydCB0eXBlIFdTTXNnID0ge1xuICAgIHR5cGU6ICdvcGVuJztcbiAgICBkYXRhOiBXZWJTb2NrZXRPcGVuO1xufSB8IHtcbiAgICB0eXBlOiAnZXJyb3InO1xuICAgIGRhdGE6IFdlYlNvY2tldEVycm9yO1xufSB8IHtcbiAgICB0eXBlOiAndGV4dCc7XG4gICAgZGF0YTogc3RyaW5nO1xufSB8IHtcbiAgICB0eXBlOiAnYmluYXJ5JztcbiAgICBkYXRhOiBVaW50OEFycmF5O1xufSB8IHtcbiAgICB0eXBlOiAnY2xvc2UnO1xuICAgIGRhdGE6IFdlYlNvY2tldENsb3NlO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0SGFuZGxlID0ge1xuICAgIHdzOiBPbXVXUztcbiAgICBvcGVuOiAocmVzcG9uc2U6IFdlYlNvY2tldE9wZW4pID0+IHZvaWQ7XG4gICAgZGlzcGF0Y2g6IChkYXRhOiBEYXRhQ2h1bms8V1NEYXRhTWV0YT4pID0+IHZvaWQ7XG4gICAgY2xvc2U6IChyZXNwb25zZTogV2ViU29ja2V0Q2xvc2UpID0+IHZvaWQ7XG4gICAgZXJyb3I6IChyZXNwb25zZTogV2ViU29ja2V0RXJyb3IpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBXU0RhdGFNZXRhID0ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTpcbiAgICAgICAgfCB0eXBlb2YgV1NNc2dUeXBlLlRFWFRcbiAgICAgICAgfCB0eXBlb2YgV1NNc2dUeXBlLkJJTkFSWVxuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuUElOR1xuICAgICAgICB8IHR5cGVvZiBXU01zZ1R5cGUuUE9ORztcbn07XG5cbmV4cG9ydCB0eXBlIFdTSGFuZGxlU3RhdGUgPSB7XG4gICAgdHlwZTogJ2NyZWF0ZWQnIHwgJ3JlY2VpdmluZyc7XG4gICAgaGFuZGxlOiBXZWJTb2NrZXRIYW5kbGU7XG59O1xuXG50eXBlIFdTT3B0aW9ucyA9IHtcbiAgICBhZGRRdWV1ZTogKGRhdGE6IFdTRGF0YSkgPT4gdm9pZDtcbiAgICBkaXNwb3NlKG9wdGlvbnM6IHtcbiAgICAgICAgY29kZT86IG51bWJlcjtcbiAgICAgICAgcmVhc29uPzogc3RyaW5nO1xuICAgIH0pOiB2b2lkO1xufTtcblxuZXhwb3J0IGNsYXNzIE9tdVdTIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFkZFF1ZXVlOiAoZGF0YTogV1NEYXRhKSA9PiB2b2lkLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcG9zZTogKG9wdGlvbnM6IHsgY29kZT86IG51bWJlcjsgcmVhc29uPzogc3RyaW5nIH0pID0+IHZvaWQsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSByZWNlaXZlUXVldWU6IFdTTXNnW10gPSBbXSxcbiAgICAgICAgcHJpdmF0ZSByZWNlaXZlUmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgICAgICBwcml2YXRlIHN0YXR1czogJ2Nvbm5lY3RpbmcnIHwgJ29wZW4nIHwgJ2Nsb3NlZCcgPSAnY29ubmVjdGluZycsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyB0b1dlYlNvY2tldCgpOiBPbXVXZWJTb2NrZXQge1xuICAgICAgICByZXR1cm4gbmV3IE9tdVdlYlNvY2tldCh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBXU09wdGlvbnMpOiBXZWJTb2NrZXRIYW5kbGUge1xuICAgICAgICBjb25zdCB3cyA9IG5ldyBPbXVXUyhvcHRpb25zLmFkZFF1ZXVlLCBvcHRpb25zLmRpc3Bvc2UpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd3MsXG4gICAgICAgICAgICBvcGVuOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvcGVuJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVJlc29sdmU/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BhdGNoOiAoZGF0YTogRGF0YUNodW5rPFdTRGF0YU1ldGE+KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEubWV0YS50eXBlID09PSBXU01zZ1R5cGUuQklOQVJZKSB7XG4gICAgICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdiaW5hcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YS5ib2R5LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0ZXh0RGVjb2Rlci5kZWNvZGUoZGF0YS5ib2R5KSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZTogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2xvc2UnLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3cy5yZWNlaXZlUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHdzLnJlY2VpdmVRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd3MucmVjZWl2ZVJlc29sdmU/LigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZChkYXRhOiBXU0RhdGEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRRdWV1ZShkYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2UoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcG9zZSh7IGNvZGUsIHJlYXNvbiB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVjZWl2ZSgpOiBQcm9taXNlPFdTTXNnPiB7XG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVSZXNvbHZlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FscmVhZHkgcmVjZWl2aW5nIGZyb20gYW5vdGhlciBhc3luYyBjYWxsJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhdHVzICE9PSAnY2xvc2VkJykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVjZWl2ZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gdGhpcy5yZWNlaXZlUmVzb2x2ZSA9IHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ2Nsb3NlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnb3BlbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdvcGVuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZVJlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2VpdmluZyBvbiBhbHJlYWR5IGNsb3NlZCBzb2NrZXQnKTtcbiAgICB9XG5cbiAgICBwcm90b2NvbDogc3RyaW5nID0gJyc7XG4gICAgdXJsOiBzdHJpbmcgPSAnJztcbn1cblxuZXhwb3J0IGNsYXNzIE9tdVdlYlNvY2tldCBpbXBsZW1lbnRzIFdlYlNvY2tldCB7XG4gICAgcHVibGljIENPTk5FQ1RJTkcgPSAwIGFzIGNvbnN0O1xuICAgIHB1YmxpYyBPUEVOID0gMSBhcyBjb25zdDtcbiAgICBwdWJsaWMgQ0xPU0lORyA9IDIgYXMgY29uc3Q7XG4gICAgcHVibGljIENMT1NFRCA9IDMgYXMgY29uc3Q7XG5cbiAgICBiaW5hcnlUeXBlOiBCaW5hcnlUeXBlID0gJ2Jsb2InO1xuICAgIGJ1ZmZlcmVkQW1vdW50OiBudW1iZXIgPSAwO1xuICAgIGV4dGVuc2lvbnM6IHN0cmluZyA9ICcnO1xuICAgIG9uY2xvc2U6ICgodGhpczogV2ViU29ja2V0LCBldjogQ2xvc2VFdmVudCkgPT4gdW5rbm93bikgfCBudWxsID0gbnVsbDtcbiAgICBvbmVycm9yOiAoKHRoaXM6IFdlYlNvY2tldCwgZXY6IEV2ZW50KSA9PiB1bmtub3duKSB8IG51bGwgPSBudWxsO1xuICAgIG9ubWVzc2FnZTogKCh0aGlzOiBXZWJTb2NrZXQsIGV2OiBNZXNzYWdlRXZlbnQpID0+IHVua25vd24pIHwgbnVsbCA9IG51bGw7XG4gICAgb25vcGVuOiAoKHRoaXM6IFdlYlNvY2tldCwgZXY6IEV2ZW50KSA9PiB1bmtub3duKSB8IG51bGwgPSBudWxsO1xuICAgIHByb3RvY29sOiBzdHJpbmcgPSAnJztcbiAgICByZWFkeVN0YXRlOiAwIHwgMiB8IDEgfCAzID0gMDtcbiAgICB1cmw6IHN0cmluZyA9ICcnO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSB3czogT211V1MsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRMaXN0ZW5lcnM6IEV2ZW50TGlzdGVuZXJNYXA8V2ViU29ja2V0RXZlbnRNYXA+ID0ge1xuICAgICAgICAgICAgY2xvc2U6IFtdLFxuICAgICAgICAgICAgZXJyb3I6IFtdLFxuICAgICAgICAgICAgbWVzc2FnZTogW10sXG4gICAgICAgICAgICBvcGVuOiBbXSxcbiAgICAgICAgfSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWNlaXZlTG9vcCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVjZWl2ZUxvb3AoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgdHlwZSB9ID0gYXdhaXQgdGhpcy53cy5yZWNlaXZlKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ2xvc2VFdmVudCgnY2xvc2UnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBkYXRhLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGRhdGEucmVhc29uID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdvcGVuJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cmwgPSBkYXRhLnVybDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IGRhdGEucHJvdG9jb2wgPz8gJyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ29wZW4nLCB7fSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXJyb3JFdmVudCgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZGF0YS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5yZWFzb24gPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgTWVzc2FnZUV2ZW50KCdtZXNzYWdlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZlbnQudHlwZV07XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdvcGVuJykge1xuICAgICAgICAgICAgdGhpcy5vbm9wZW4/LihldmVudCBhcyBNZXNzYWdlRXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICB0aGlzLm9uZXJyb3I/LihldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2U/LihldmVudCBhcyBNZXNzYWdlRXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgICAgICAgICB0aGlzLm9uY2xvc2U/LihldmVudCBhcyBDbG9zZUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZW5kKGRhdGE6IHN0cmluZyB8IEFycmF5QnVmZmVyTGlrZSB8IEJsb2IgfCBBcnJheUJ1ZmZlclZpZXcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cy5zZW5kKGRhdGEpO1xuICAgIH1cblxuICAgIGNsb3NlKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLndzLmNsb3NlKGNvZGUsIHJlYXNvbik7XG4gICAgfVxuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0RXZlbnRNYXA+KHR5cGU6IEssIGxpc3RlbmVyOiAodGhpczogV2ViU29ja2V0LCBldjogV2ViU29ja2V0RXZlbnRNYXBbS10pID0+IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyc1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICByZW1vdmVFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBXZWJTb2NrZXRFdmVudE1hcD4odHlwZTogSywgbGlzdGVuZXI6ICh0aGlzOiBXZWJTb2NrZXQsIGV2OiBXZWJTb2NrZXRFdmVudE1hcFtLXSkgPT4gdW5rbm93bik6IHZvaWQge1xuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW3R5cGVdO1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLAogICAgIlxuaW1wb3J0IHsgdGV4dEVuY29kZXIgfSBmcm9tICcuLi8uLi9jb25zdCc7XG5pbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBQYWNrZXRUeXBlIH0gZnJvbSAnLi4vLi4vbmV0d29yay9wYWNrZXQnO1xuaW1wb3J0IHsgT211IH0gZnJvbSAnLi4vLi4vb211JztcbmltcG9ydCB7IEV4dGVuc2lvbiwgRXh0ZW5zaW9uVHlwZSB9IGZyb20gJy4uL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBEYXRhQ2h1bmssIEh0dHBSZXF1ZXN0LCBPbXVSZXNwb25zZSwgUmVxdWVzdEhhbmRsZSB9IGZyb20gJy4vaHR0cCc7XG5pbXBvcnQgeyBPbXVXUywgV2ViU29ja2V0Q2xvc2UsIFdlYlNvY2tldEVycm9yLCBXZWJTb2NrZXRPcGVuLCBXU0RhdGEsIFdTRGF0YU1ldGEsIFdTSGFuZGxlU3RhdGUsIFdTTXNnVHlwZSB9IGZyb20gJy4vd2Vic29ja2V0JztcblxuZXhwb3J0IGNvbnN0IEhUVFBfRVhURU5TSU9OX1RZUEU6IEV4dGVuc2lvblR5cGU8SHR0cEV4dGVuc2lvbj4gPSBuZXcgRXh0ZW5zaW9uVHlwZShcbiAgICAnaHR0cCcsXG4gICAgKG9tdTogT211KSA9PiBuZXcgSHR0cEV4dGVuc2lvbihvbXUpLFxuKTtcblxuZXhwb3J0IGNvbnN0IEhUVFBfUkVRVUVTVF9QRVJNSVNTSU9OX0lEOiBJZGVudGlmaWVyID0gSFRUUF9FWFRFTlNJT05fVFlQRS5qb2luKCdyZXF1ZXN0Jyk7XG5cbmNvbnN0IFJFUVVFU1RfQ1JFQVRFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXF1ZXN0PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlcXVlc3RfY3JlYXRlJyxcbn0pO1xuXG5jb25zdCBSRVFVRVNUX1NFTkQgPSBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8RGF0YUNodW5rPFJlcXVlc3RIYW5kbGU+PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3JlcXVlc3Rfc2VuZCcsXG4gICAgc2VyaWFsaXplcjogRGF0YUNodW5rLFxufSk7XG5cbnR5cGUgSHR0cFJlcXVlc3RDbG9zZSA9IFJlcXVlc3RIYW5kbGU7XG5cbmNvbnN0IFJFUVVFU1RfQ0xPU0UgPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248SHR0cFJlcXVlc3RDbG9zZT4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXF1ZXN0X2Nsb3NlJyxcbn0pO1xuXG50eXBlIEh0dHBSZXNwb25zZSA9IFJlcXVlc3RIYW5kbGUgJiB7XG4gICAgaGVhZGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHN0YXR1czogbnVtYmVyO1xuICAgIHN0YXR1c1RleHQ6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICBoaXN0b3J5OiBIdHRwUmVzcG9uc2VbXTtcbiAgICByZWRpcmVjdGVkOiBib29sZWFuO1xufTtcblxuY29uc3QgUkVTUE9OU0VfQ1JFQVRFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXNwb25zZT4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXNwb25zZV9jcmVhdGUnLFxufSk7XG5cbmNvbnN0IFJFU1BPTlNFX0NIVU5LID0gUGFja2V0VHlwZS5jcmVhdGVTZXJpYWxpemVkPERhdGFDaHVuazxSZXF1ZXN0SGFuZGxlPj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICdyZXNwb25zZV9jaHVuaycsXG4gICAgc2VyaWFsaXplcjogRGF0YUNodW5rLFxufSk7XG5cbmNvbnN0IFJFU1BPTlNFX0NMT1NFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFJlcXVlc3RIYW5kbGU+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAncmVzcG9uc2VfY2xvc2UnLFxufSk7XG5cbnR5cGUgSGFuZGxlU3RhdGVSZWNlaXZpbmcgPSB7XG4gICAgdHlwZTogJ3JlY2VpdmluZyc7XG4gICAgcmVjZWl2ZShkYXRhOiBVaW50OEFycmF5KTogdm9pZDtcbiAgICBjbG9zZSgpOiB2b2lkO1xufTtcblxudHlwZSBIYW5kbGVTdGF0ZUNyZWF0ZWQgPSB7XG4gICAgdHlwZTogJ2NyZWF0ZWQnO1xuICAgIHNldFJlc3BvbnNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpOiB2b2lkO1xufTtcblxudHlwZSBIYW5kbGVTdGF0ZSA9IEhhbmRsZVN0YXRlQ3JlYXRlZCB8IEhhbmRsZVN0YXRlUmVjZWl2aW5nO1xuXG5jb25zdCBXRUJTT0NLRVRfQ1JFQVRFID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPEh0dHBSZXF1ZXN0PihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dzX2NyZWF0ZScsXG59KTtcblxuY29uc3QgV0VCU09DS0VUX09QRU4gPSBQYWNrZXRUeXBlLmNyZWF0ZUpzb248V2ViU29ja2V0T3Blbj4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19vcGVuJyxcbn0pO1xuXG5jb25zdCBXRUJTT0NLRVRfREFUQSA9IFBhY2tldFR5cGUuY3JlYXRlU2VyaWFsaXplZDxEYXRhQ2h1bms8V1NEYXRhTWV0YT4+KEhUVFBfRVhURU5TSU9OX1RZUEUsIHtcbiAgICBuYW1lOiAnd3NfZGF0YScsXG4gICAgc2VyaWFsaXplcjogRGF0YUNodW5rLFxufSk7XG5cbmNvbnN0IFdFQlNPQ0tFVF9DTE9TRSA9IFBhY2tldFR5cGUuY3JlYXRlSnNvbjxXZWJTb2NrZXRDbG9zZT4oSFRUUF9FWFRFTlNJT05fVFlQRSwge1xuICAgIG5hbWU6ICd3c19jbG9zZScsXG59KTtcblxuY29uc3QgV0VCU09DS0VUX0VSUk9SID0gUGFja2V0VHlwZS5jcmVhdGVKc29uPFdlYlNvY2tldEVycm9yPihIVFRQX0VYVEVOU0lPTl9UWVBFLCB7XG4gICAgbmFtZTogJ3dzX2Vycm9yJyxcbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVGdXR1cmU8VD4oKToge1xuICAgIHByb21pc2U6IFByb21pc2U8VD47XG4gICAgcmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB2b2lkO1xuICAgIHJlamVjdDogKHJlYXNvbj86IHVua25vd24pID0+IHZvaWQ7XG59IHtcbiAgICBsZXQgcmVzb2x2ZTogKCh2YWx1ZTogVCkgPT4gdm9pZCkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHJlamVjdDogKChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlcywgcmVqKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSByZXM7XG4gICAgICAgIHJlamVjdCA9IHJlajtcbiAgICB9KTtcbiAgICBpZiAoIXJlc29sdmUgfHwgIXJlamVjdCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGZ1dHVyZScpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2UsXG4gICAgICAgIHJlc29sdmUsXG4gICAgICAgIHJlamVjdCxcbiAgICB9O1xufVxuXG50eXBlIFdTU2VuZFRhc2sgPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBkYXRhOiBXU0RhdGE7XG59O1xuXG5leHBvcnQgY2xhc3MgSHR0cEV4dGVuc2lvbiBpbXBsZW1lbnRzIEV4dGVuc2lvbiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEV4dGVuc2lvblR5cGU8RXh0ZW5zaW9uPiA9IEhUVFBfRVhURU5TSU9OX1RZUEU7XG4gICAgcHJpdmF0ZSByZXF1ZXN0Q291bnQ6IG51bWJlciA9IDA7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHBIYW5kbGVzOiBSZWNvcmQ8c3RyaW5nLCBIYW5kbGVTdGF0ZSB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdzSGFuZGxlczogUmVjb3JkPHN0cmluZywgV1NIYW5kbGVTdGF0ZT4gPSB7fTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdzU2VuZFF1ZXVlOiBXU1NlbmRUYXNrW10gPSBbXTtcbiAgICBwcml2YXRlIHdzU2VuZFdhaXRSZXNvbHZlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvbXU6IE9tdSxcbiAgICApIHtcbiAgICAgICAgb211Lm5ldHdvcmsucmVnaXN0ZXJQYWNrZXQoXG4gICAgICAgICAgICBSRVFVRVNUX0NSRUFURSxcbiAgICAgICAgICAgIFJFUVVFU1RfU0VORCxcbiAgICAgICAgICAgIFJFUVVFU1RfQ0xPU0UsXG4gICAgICAgICAgICBSRVNQT05TRV9DUkVBVEUsXG4gICAgICAgICAgICBSRVNQT05TRV9DSFVOSyxcbiAgICAgICAgICAgIFJFU1BPTlNFX0NMT1NFLFxuICAgICAgICAgICAgV0VCU09DS0VUX0NMT1NFLFxuICAgICAgICAgICAgV0VCU09DS0VUX0NSRUFURSxcbiAgICAgICAgICAgIFdFQlNPQ0tFVF9EQVRBLFxuICAgICAgICAgICAgV0VCU09DS0VUX09QRU4sXG4gICAgICAgICAgICBXRUJTT0NLRVRfRVJST1IsXG4gICAgICAgICk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoUkVTUE9OU0VfQ1JFQVRFLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gcmVxdWVzdCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhbmRsZS50eXBlICE9PSAnY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciBhbHJlYWR5IGhhbmRsZWQgcmVxdWVzdCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLnNldFJlc3BvbnNlKHBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvbXUubmV0d29yay5hZGRQYWNrZXRIYW5kbGVyKFJFU1BPTlNFX0NIVU5LLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmh0dHBIYW5kbGVzW3BhY2tldC5tZXRhLmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biByZXF1ZXN0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ3JlY2VpdmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIGNodW5rIGZvciBub24tcmVjZWl2aW5nIHJlcXVlc3QnLCBwYWNrZXQubWV0YS5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLnJlY2VpdmUocGFja2V0LmJvZHkpO1xuICAgICAgICB9KTtcbiAgICAgICAgb211Lm5ldHdvcmsuYWRkUGFja2V0SGFuZGxlcihSRVNQT05TRV9DTE9TRSwgKHBhY2tldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5odHRwSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGUudHlwZSAhPT0gJ3JlY2VpdmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIGNodW5rIGZvciBub24tcmVjZWl2aW5nIHJlcXVlc3QnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5jbG9zZSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoV0VCU09DS0VUX09QRU4sIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud3NIYW5kbGVzW3BhY2tldC5pZF07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gc29ja2V0JywgcGFja2V0LmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFuZGxlLnR5cGUgIT09ICdjcmVhdGVkJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIGFscmVhZHkgaGFuZGxlZCBzb2NrZXQnLCBwYWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUub3BlbihwYWNrZXQpO1xuICAgICAgICAgICAgaGFuZGxlLnR5cGUgPSAncmVjZWl2aW5nJztcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoV0VCU09DS0VUX0RBVEEsIChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMud3NIYW5kbGVzW3BhY2tldC5tZXRhLmlkXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgdW5rbm93biBzb2NrZXQnLCBwYWNrZXQubWV0YS5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhbmRsZS50eXBlICE9PSAncmVjZWl2aW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgY2h1bmsgZm9yIG5vbi1yZWNlaXZpbmcgc29ja2V0JywgcGFja2V0Lm1ldGEuaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUuZGlzcGF0Y2gocGFja2V0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoV0VCU09DS0VUX0NMT1NFLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHNvY2tldCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLmhhbmRsZS5jbG9zZShwYWNrZXQpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5uZXR3b3JrLmFkZFBhY2tldEhhbmRsZXIoV0VCU09DS0VUX0VSUk9SLCAocGFja2V0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLndzSGFuZGxlc1twYWNrZXQuaWRdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY2VpdmVkIHJlc3BvbnNlIGZvciB1bmtub3duIHNvY2tldCcsIHBhY2tldC5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlLmhhbmRsZS5lcnJvcihwYWNrZXQpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaHR0cEhhbmRsZXNbcGFja2V0LmlkXTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9tdS5ldmVudC5yZWFkeS5saXN0ZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53c1NlbmRMb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgd3NTZW5kTG9vcCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMub211LnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbmQgPSB0aGlzLndzU2VuZFF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoc2VuZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5ID0gYXdhaXQgdG9VaW50OEFycmF5KHNlbmQuZGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiBzZW5kLmRhdGEgPT09ICdzdHJpbmcnID8gV1NNc2dUeXBlLlRFWFQgOiBXU01zZ1R5cGUuQklOQVJZO1xuICAgICAgICAgICAgICAgIHRoaXMub211LnNlbmQoV0VCU09DS0VUX0RBVEEsIG5ldyBEYXRhQ2h1bmsoeyBpZDogc2VuZC5pZCwgdHlwZSB9LCBhcnJheSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndzU2VuZFdhaXRSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVIZWFkZXJzKHJlcXVlc3Q6IFJlcXVlc3QsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IGtleXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgY29uc3Qgc2V0ID0gKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsb3dlcktleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxLZXkgPSBrZXlzW2xvd2VyS2V5XTtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbEtleSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzW29yaWdpbmFsS2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAga2V5c1tsb3dlcktleV0gPSBrZXk7XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW5pdD8uaGVhZGVycykge1xuICAgICAgICAgICAgaWYgKGluaXQuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBpbml0LmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5pdC5oZWFkZXJzKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGluaXQuaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICBzZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBpbml0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbml0LmhlYWRlcnNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhZGVycztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlSWQoKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiB0aGlzLm9tdS5hcHAuaWQuam9pbihgJHtwZXJmb3JtYW5jZS50aW1lT3JpZ2lufS0ke3RoaXMucmVxdWVzdENvdW50Kyt9YCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3QoaW5wdXQ6IHN0cmluZyB8IFVSTCB8IGdsb2JhbFRoaXMuUmVxdWVzdCwgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTx7IHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U7IHN0cmVhbTogUmVhZGFibGVTdHJlYW0gfT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpO1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2VuZXJhdGVJZCgpLmtleSgpO1xuICAgICAgICB0aGlzLm9tdS5zZW5kKFJFUVVFU1RfQ1JFQVRFLCB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGhlYWRlcjogdGhpcy5nZW5lcmF0ZUhlYWRlcnMocmVxdWVzdCwgaW5pdCksXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgICAgcmVkaXJlY3Q6IHJlcXVlc3QucmVkaXJlY3QsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcXVlc3QuYm9keSkge1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gcmVxdWVzdC5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVRVNUX1NFTkQsIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0YTogeyBpZCB9LFxuICAgICAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbXUuc2VuZChSRVFVRVNUX0NMT1NFLCB7IGlkIH0pO1xuICAgICAgICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgICAgICBjb25zdCByZXNwb25zZUZ1dHVyZSA9IGNyZWF0ZUZ1dHVyZTxIdHRwUmVzcG9uc2U+KCk7XG4gICAgICAgIGxldCBjaHVua0V2ZW50ID0gY3JlYXRlRnV0dXJlPGJvb2xlYW4+KCk7XG4gICAgICAgIGNvbnN0IHNldFJlc3BvbnNlID0gKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJlc3BvbnNlRnV0dXJlLnJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5odHRwSGFuZGxlc1tpZF0gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3JlY2VpdmluZycsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZShkYXRhOiBVaW50OEFycmF5PEFycmF5QnVmZmVyTGlrZT4pIHtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rRXZlbnQucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtFdmVudCA9IGNyZWF0ZUZ1dHVyZTxib29sZWFuPigpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xvc2UoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rRXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaHR0cEhhbmRsZXNbaWRdID0ge1xuICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZWQnLFxuICAgICAgICAgICAgc2V0UmVzcG9uc2UsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2VGdXR1cmUucHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgc3RyZWFtOiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgICAgICAgICAgICAgIGFzeW5jIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGF3YWl0IGNodW5rRXZlbnQucHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBjaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2h1bmspIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaChpbnB1dDogc3RyaW5nIHwgVVJMIHwgZ2xvYmFsVGhpcy5SZXF1ZXN0LCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPE9tdVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHsgcmVzcG9uc2UsIHN0cmVhbSB9ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBPbXVSZXNwb25zZShcbiAgICAgICAgICAgIG5ldyBIZWFkZXJzKHJlc3BvbnNlLmhlYWRlciksXG4gICAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCxcbiAgICAgICAgICAgIHJlc3BvbnNlLnJlZGlyZWN0ZWQsXG4gICAgICAgICAgICByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgICAgJ2Jhc2ljJyxcbiAgICAgICAgICAgIHJlc3BvbnNlLnVybCxcbiAgICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB3cyhpbnB1dDogc3RyaW5nIHwgVVJMIHwgZ2xvYmFsVGhpcy5SZXF1ZXN0LCBvcHRpb25zPzoge1xuICAgICAgICBtZXRob2Q/OiBzdHJpbmc7XG4gICAgICAgIGF1dG9jbG9zZT86IGJvb2xlYW47XG4gICAgICAgIGF1dG9waW5nPzogYm9vbGVhbjtcbiAgICAgICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgfSk6IFByb21pc2U8T211V1M+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdlbmVyYXRlSWQoKTtcbiAgICAgICAgY29uc3QgaGFuZGxlID0gT211V1MuY3JlYXRlKHtcbiAgICAgICAgICAgIGFkZFF1ZXVlOiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud3NTZW5kUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBpZC5rZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLndzU2VuZFdhaXRSZXNvbHZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcG9zZTogKG9wdGlvbnM6IHsgY29kZT86IG51bWJlcjsgcmVhc29uPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9tdS5zZW5kKFdFQlNPQ0tFVF9DTE9TRSwge1xuICAgICAgICAgICAgICAgICAgICBpZDogaWQua2V5KCksXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IG9wdGlvbnMuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBvcHRpb25zLnJlYXNvbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy53c0hhbmRsZXNbaWQua2V5KCldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMud3NIYW5kbGVzW2lkLmtleSgpXSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGVkJyxcbiAgICAgICAgICAgIGhhbmRsZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbXUuc2VuZChXRUJTT0NLRVRfQ1JFQVRFLCB7XG4gICAgICAgICAgICBpZDogaWQua2V5KCksXG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMuZ2VuZXJhdGVIZWFkZXJzKHJlcXVlc3QsIG9wdGlvbnMpLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBoYW5kbGUud3M7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0b1VpbnQ4QXJyYXkoZGF0YTogc3RyaW5nIHwgQXJyYXlCdWZmZXJMaWtlIHwgQmxvYiB8IEFycmF5QnVmZmVyVmlldyk6IFByb21pc2U8VWludDhBcnJheTxBcnJheUJ1ZmZlckxpa2U+PiB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdGV4dEVuY29kZXIuZW5jb2RlKGRhdGEpO1xuICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBkYXRhLmFycmF5QnVmZmVyKCk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEgYXMgQXJyYXlCdWZmZXJMaWtlKTtcbiAgICB9XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOztBQUFPLElBQU0sY0FBMkIsSUFBSTtBQUNyQyxJQUFNLGNBQTJCLElBQUk7OztBQ0U1QyxJQUFNLGtCQUFrQjtBQUN4QixJQUFNLGFBQWE7QUFBQTtBQUlaLE1BQU0sV0FBVztBQUFBLEVBQ0o7QUFBQSxFQUNBO0FBQUEsRUFFaEIsV0FBVyxDQUNQLGNBQ0csTUFDTDtBQUFB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QzNELE9BQU8sSUFBSSxZQUNQLElBQUksUUFBUSxTQUFTLE1BQU0sR0FDM0IsU0FBUyxVQUFVLE9BQU8sU0FBUyxTQUFTLEtBQzVDLFNBQVMsWUFDVCxTQUFTLFFBQ1QsU0FBUyxZQUNULFNBQ0EsU0FBUyxLQUNULFFBQ0EsS0FDSjtBQUFBO0FBQUEsT0FHUyxHQUFFLENBQUMsT0FBMEMsU0FNdkM7QUFBQSxJQUNmLE1BQU0sVUFBVSxJQUFJLFFBQVEsT0FBTyxPQUFPO0FBQUEsSUFDMUMsTUFBTSxLQUFLLEtBQUssV0FBVztBQUFBLElBQzNCLE1BQU0sU0FBUyxNQUFNLE9BQU87QUFBQSxNQUN4QixVQUFVLENBQUMsU0FBUztBQUFBLFFBQ2hCLEtBQUssWUFBWSxLQUFLO0FBQUEsVUFDbEIsSUFBSSxHQUFHLElBQUk7QUFBQSxVQUNYO0FBQUEsUUFDSixDQUFDO0FBQUEsUUFDRCxLQUFLLGtCQUFrQjtBQUFBO0FBQUEsTUFFM0IsU0FBUyxDQUFDLGFBQWdEO0FBQUEsUUFDdEQsS0FBSyxJQUFJLEtBQUssaUJBQWlCO0FBQUEsVUFDM0IsSUFBSSxHQUFHLElBQUk7QUFBQSxVQUNYLE1BQU0sU0FBUTtBQUFBLFVBQ2QsUUFBUSxTQUFRO0FBQUEsUUFDcEIsQ0FBQztBQUFBLFFBQ0QsT0FBTyxLQUFLLFVBQVUsR0FBRyxJQUFJO0FBQUE7QUFBQSxJQUVyQyxDQUFDO0FBQUEsSUFDRCxLQUFLLFVBQVUsR0FBRyxJQUFJLEtBQUs7QUFBQSxNQUN2QixNQUFNO0FBQUEsTUFDTjtBQUFBLElBQ0o7QUFBQSxJQUNBLEtBQUssSUFBSSxLQUFLLGtCQUFrQjtBQUFBLE1BQzVCLElBQUksR0FBRyxJQUFJO0FBQUEsTUFDWCxRQUFRLEtBQUssZ0JBQWdCLFNBQVMsT0FBTztBQUFBLE1BQzdDLFFBQVEsUUFBUTtBQUFBLE1BQ2hCLFVBQVUsUUFBUTtBQUFBLE1BQ2xCLEtBQUssUUFBUTtBQUFBLElBQ2pCLENBQUM7QUFBQSxJQUNELE9BQU8sT0FBTztBQUFBO0FBRXRCO0FBRUEsZUFBZSxZQUFZLENBQUMsTUFBK0Y7QUFBQSxFQUN2SCxJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsSUFDMUIsT0FBTyxZQUFZLE9BQU8sSUFBSTtBQUFBLEVBQ2xDLEVBQU8sU0FBSSxnQkFBZ0IsTUFBTTtBQUFBLElBQzdCLE1BQU0sY0FBYyxNQUFNLEtBQUssWUFBWTtBQUFBLElBQzNDLE9BQU8sSUFBSSxXQUFXLFdBQVc7QUFBQSxFQUNyQyxFQUFPO0FBQUEsSUFDSCxPQUFPLElBQUksV0FBVyxJQUF1QjtBQUFBO0FBQUE7IiwKICAiZGVidWdJZCI6ICI3MUZCMjYzMkJDRjhBMDNBNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|