@rljson/io 0.0.62 → 0.0.63
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/dist/conformance-tests/goldens/tableCfgs-1.json +3 -157
- package/dist/conformance-tests/io-conformance.spec.ts +5 -4
- package/dist/index.d.ts +2 -0
- package/dist/io-multi.d.ts +5 -4
- package/dist/io-peer-bridge.d.ts +75 -0
- package/dist/io.js +391 -52
- package/dist/io.js.map +1 -0
- package/dist/peer-socket-mock.d.ts +13 -0
- package/dist/socket.d.ts +3 -1
- package/package.json +10 -10
package/dist/io.js
CHANGED
|
@@ -608,6 +608,36 @@ class PeerSocketMock {
|
|
|
608
608
|
connected = false;
|
|
609
609
|
disconnected = true;
|
|
610
610
|
// ............................................................................
|
|
611
|
+
/**
|
|
612
|
+
* Removes a specific listener for the specified event.
|
|
613
|
+
* @param eventName - The name of the event.
|
|
614
|
+
* @param listener - The callback function to remove.
|
|
615
|
+
* @returns The PeerSocketMock instance for chaining.
|
|
616
|
+
*/
|
|
617
|
+
off(eventName, listener) {
|
|
618
|
+
const listeners = this._listenersMap.get(eventName) || [];
|
|
619
|
+
const index = listeners.indexOf(listener);
|
|
620
|
+
if (index !== -1) {
|
|
621
|
+
listeners.splice(index, 1);
|
|
622
|
+
this._listenersMap.set(eventName, listeners);
|
|
623
|
+
}
|
|
624
|
+
return this;
|
|
625
|
+
}
|
|
626
|
+
// ............................................................................
|
|
627
|
+
/**
|
|
628
|
+
* Removes all listeners for the specified event, or all listeners if no event is specified.
|
|
629
|
+
* @param eventName - (Optional) The name of the event.
|
|
630
|
+
* @returns The PeerSocketMock instance for chaining.
|
|
631
|
+
*/
|
|
632
|
+
removeAllListeners(eventName) {
|
|
633
|
+
if (eventName) {
|
|
634
|
+
this._listenersMap.delete(eventName);
|
|
635
|
+
} else {
|
|
636
|
+
this._listenersMap.clear();
|
|
637
|
+
}
|
|
638
|
+
return this;
|
|
639
|
+
}
|
|
640
|
+
// ............................................................................
|
|
611
641
|
/**
|
|
612
642
|
* Registers an event listener for the specified event.
|
|
613
643
|
* @param eventName - The name of the event to listen for.
|
|
@@ -689,7 +719,16 @@ class IoPeer {
|
|
|
689
719
|
this.isOpen = false;
|
|
690
720
|
});
|
|
691
721
|
this._socket.connect();
|
|
692
|
-
return
|
|
722
|
+
return new Promise((resolve) => {
|
|
723
|
+
if (this._socket.connected) {
|
|
724
|
+
this.isOpen = true;
|
|
725
|
+
resolve();
|
|
726
|
+
} else {
|
|
727
|
+
this._socket.on("connect", () => {
|
|
728
|
+
resolve();
|
|
729
|
+
});
|
|
730
|
+
}
|
|
731
|
+
});
|
|
693
732
|
}
|
|
694
733
|
// ...........................................................................
|
|
695
734
|
/**
|
|
@@ -698,8 +737,12 @@ class IoPeer {
|
|
|
698
737
|
*/
|
|
699
738
|
async close() {
|
|
700
739
|
if (!this._socket.connected) return;
|
|
701
|
-
|
|
702
|
-
|
|
740
|
+
return new Promise((resolve) => {
|
|
741
|
+
this._socket.on("disconnect", () => {
|
|
742
|
+
resolve();
|
|
743
|
+
});
|
|
744
|
+
this._socket.disconnect();
|
|
745
|
+
});
|
|
703
746
|
}
|
|
704
747
|
// ...........................................................................
|
|
705
748
|
/**
|
|
@@ -707,7 +750,9 @@ class IoPeer {
|
|
|
707
750
|
* @returns
|
|
708
751
|
*/
|
|
709
752
|
async isReady() {
|
|
710
|
-
|
|
753
|
+
if (!!this._socket && this._socket.connected === true) this.isOpen = true;
|
|
754
|
+
else this.isOpen = false;
|
|
755
|
+
return !!this.isOpen ? Promise.resolve() : Promise.reject();
|
|
711
756
|
}
|
|
712
757
|
// ...........................................................................
|
|
713
758
|
/**
|
|
@@ -863,12 +908,14 @@ class IoMulti {
|
|
|
863
908
|
* @returns
|
|
864
909
|
*/
|
|
865
910
|
async init() {
|
|
866
|
-
for (
|
|
867
|
-
|
|
911
|
+
for (let idx = 0; idx < this._ios.length; idx++) {
|
|
912
|
+
const { io } = this._ios[idx];
|
|
913
|
+
if (io.isOpen === false) {
|
|
868
914
|
throw new Error(
|
|
869
915
|
"All underlying Io instances must be initialized before initializing IoMulti"
|
|
870
916
|
);
|
|
871
917
|
}
|
|
918
|
+
this._ios[idx] = { ...this._ios[idx], id: `io-${idx}` };
|
|
872
919
|
}
|
|
873
920
|
this.isOpen = true;
|
|
874
921
|
return Promise.resolve();
|
|
@@ -900,10 +947,10 @@ class IoMulti {
|
|
|
900
947
|
*/
|
|
901
948
|
async dump() {
|
|
902
949
|
if (this.dumpables.length === 0) {
|
|
903
|
-
|
|
950
|
+
throw new Error("No dumpable Io available");
|
|
904
951
|
}
|
|
905
952
|
const dumps = await Promise.all(
|
|
906
|
-
this.dumpables.map((dumpable) => dumpable.dump())
|
|
953
|
+
this.dumpables.map(({ io: dumpable }) => dumpable.dump())
|
|
907
954
|
);
|
|
908
955
|
return merge(...dumps);
|
|
909
956
|
}
|
|
@@ -915,21 +962,21 @@ class IoMulti {
|
|
|
915
962
|
*/
|
|
916
963
|
async dumpTable(request) {
|
|
917
964
|
if (this.dumpables.length === 0) {
|
|
918
|
-
|
|
965
|
+
throw new Error("No dumpable Io available");
|
|
919
966
|
}
|
|
920
967
|
const dumps = [];
|
|
921
|
-
for (const dumpable of this.dumpables) {
|
|
922
|
-
|
|
923
|
-
if (tableExists) {
|
|
968
|
+
for (const { io: dumpable } of this.dumpables) {
|
|
969
|
+
try {
|
|
924
970
|
const dump = await dumpable.dumpTable(request);
|
|
925
971
|
dumps.push(dump);
|
|
972
|
+
} catch {
|
|
973
|
+
continue;
|
|
926
974
|
}
|
|
927
975
|
}
|
|
928
|
-
if (dumps.length
|
|
929
|
-
|
|
930
|
-
} else {
|
|
931
|
-
return Promise.reject(new Error(`Table "${request.table}" not found`));
|
|
976
|
+
if (dumps.length === 0) {
|
|
977
|
+
throw new Error(`Table "${request.table}" not found`);
|
|
932
978
|
}
|
|
979
|
+
return merge(...dumps);
|
|
933
980
|
}
|
|
934
981
|
// ...........................................................................
|
|
935
982
|
/**
|
|
@@ -939,15 +986,12 @@ class IoMulti {
|
|
|
939
986
|
*/
|
|
940
987
|
async contentType(request) {
|
|
941
988
|
if (this.readables.length === 0) {
|
|
942
|
-
|
|
989
|
+
throw new Error("No readable Io available");
|
|
943
990
|
}
|
|
944
|
-
for (const readable of this.readables) {
|
|
945
|
-
|
|
946
|
-
if (tableExists) {
|
|
947
|
-
return readable.contentType(request);
|
|
948
|
-
}
|
|
991
|
+
for (const { io: readable } of this.readables) {
|
|
992
|
+
return readable.contentType(request);
|
|
949
993
|
}
|
|
950
|
-
|
|
994
|
+
throw new Error(`Table "${request.table}" not found`);
|
|
951
995
|
}
|
|
952
996
|
// ...........................................................................
|
|
953
997
|
/**
|
|
@@ -957,9 +1001,10 @@ class IoMulti {
|
|
|
957
1001
|
*/
|
|
958
1002
|
async tableExists(tableKey) {
|
|
959
1003
|
if (this.readables.length === 0) {
|
|
960
|
-
|
|
1004
|
+
throw new Error("No readable Io available");
|
|
961
1005
|
}
|
|
962
|
-
for (
|
|
1006
|
+
for (let i = 0; i < this.readables.length; i++) {
|
|
1007
|
+
const readable = this.readables[i].io;
|
|
963
1008
|
const exists = await readable.tableExists(tableKey);
|
|
964
1009
|
if (exists) {
|
|
965
1010
|
return true;
|
|
@@ -975,10 +1020,10 @@ class IoMulti {
|
|
|
975
1020
|
*/
|
|
976
1021
|
createOrExtendTable(request) {
|
|
977
1022
|
if (this.writables.length === 0) {
|
|
978
|
-
|
|
1023
|
+
throw new Error("No writable Io available");
|
|
979
1024
|
}
|
|
980
1025
|
const creations = this.writables.map(
|
|
981
|
-
(writable) => writable.createOrExtendTable(request)
|
|
1026
|
+
({ io: writable }) => writable.createOrExtendTable(request)
|
|
982
1027
|
);
|
|
983
1028
|
return Promise.all(creations).then(() => Promise.resolve());
|
|
984
1029
|
}
|
|
@@ -987,12 +1032,22 @@ class IoMulti {
|
|
|
987
1032
|
* Retrieves the raw table configurations from the highest priority underlying readable Io instance.
|
|
988
1033
|
* @returns A promise that resolves to an array of table configurations.
|
|
989
1034
|
*/
|
|
990
|
-
rawTableCfgs() {
|
|
1035
|
+
async rawTableCfgs() {
|
|
991
1036
|
if (this.readables.length === 0) {
|
|
992
|
-
|
|
1037
|
+
throw new Error("No readable Io available");
|
|
1038
|
+
}
|
|
1039
|
+
const rawTableCfgs = /* @__PURE__ */ new Map();
|
|
1040
|
+
for (const { io: readable } of this.readables) {
|
|
1041
|
+
const cfgs = await readable.rawTableCfgs();
|
|
1042
|
+
if (cfgs.length > 0) {
|
|
1043
|
+
for (const tableCfg of cfgs) {
|
|
1044
|
+
if (!rawTableCfgs.has(tableCfg.key)) {
|
|
1045
|
+
rawTableCfgs.set(tableCfg.key, tableCfg);
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
993
1049
|
}
|
|
994
|
-
|
|
995
|
-
return readable.rawTableCfgs();
|
|
1050
|
+
return Array.from(rawTableCfgs.values());
|
|
996
1051
|
}
|
|
997
1052
|
// ...........................................................................
|
|
998
1053
|
/**
|
|
@@ -1002,38 +1057,85 @@ class IoMulti {
|
|
|
1002
1057
|
*/
|
|
1003
1058
|
write(request) {
|
|
1004
1059
|
if (this.writables.length === 0) {
|
|
1005
|
-
|
|
1060
|
+
throw new Error("No writable Io available");
|
|
1006
1061
|
}
|
|
1007
|
-
const writes = this.writables.map(
|
|
1062
|
+
const writes = this.writables.map(
|
|
1063
|
+
({ io: writable }) => writable.write(request)
|
|
1064
|
+
);
|
|
1008
1065
|
return Promise.all(writes).then(() => Promise.resolve());
|
|
1009
1066
|
}
|
|
1010
1067
|
// ...........................................................................
|
|
1011
1068
|
/**
|
|
1012
|
-
* Reads rows from
|
|
1069
|
+
* Reads rows from a specific table by merging rows from all underlying readable Io instances.
|
|
1013
1070
|
* @param request An object containing the table name and where clause.
|
|
1014
1071
|
* @returns A promise that resolves to the read rows.
|
|
1015
1072
|
*/
|
|
1016
1073
|
async readRows(request) {
|
|
1017
1074
|
if (this.readables.length === 0) {
|
|
1018
|
-
|
|
1075
|
+
throw new Error("No readable Io available");
|
|
1019
1076
|
}
|
|
1020
1077
|
let tableExistsAny = false;
|
|
1021
|
-
const rows =
|
|
1078
|
+
const rows = /* @__PURE__ */ new Map();
|
|
1079
|
+
let type = void 0;
|
|
1080
|
+
let readFrom = "";
|
|
1081
|
+
const errors = [];
|
|
1022
1082
|
for (const readable of this.readables) {
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
const
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1083
|
+
let tableRows = [];
|
|
1084
|
+
let tableType;
|
|
1085
|
+
try {
|
|
1086
|
+
const { [request.table]: tableData } = await readable.io.readRows(
|
|
1087
|
+
request
|
|
1088
|
+
);
|
|
1089
|
+
tableRows = tableData._data;
|
|
1090
|
+
tableType = tableData._type;
|
|
1091
|
+
tableExistsAny = true;
|
|
1092
|
+
readFrom = readable.id ?? "";
|
|
1093
|
+
} catch (e) {
|
|
1094
|
+
errors.push(e);
|
|
1095
|
+
continue;
|
|
1096
|
+
}
|
|
1097
|
+
type ??= tableType;
|
|
1098
|
+
if (tableRows.length === 0) {
|
|
1099
|
+
continue;
|
|
1031
1100
|
}
|
|
1101
|
+
for (const tableRow of tableRows) {
|
|
1102
|
+
const ref = tableRow._hash;
|
|
1103
|
+
rows.set(ref, tableRow);
|
|
1104
|
+
}
|
|
1105
|
+
break;
|
|
1032
1106
|
}
|
|
1033
1107
|
if (!tableExistsAny) {
|
|
1034
|
-
|
|
1108
|
+
if (errors.length === 0) {
|
|
1109
|
+
throw new Error(`Table "${request.table}" not found`);
|
|
1110
|
+
} else {
|
|
1111
|
+
const preciseErrors = errors.filter(
|
|
1112
|
+
(err) => !err.message.includes(`Table "${request.table}" not found`)
|
|
1113
|
+
);
|
|
1114
|
+
if (preciseErrors.length > 0) {
|
|
1115
|
+
throw preciseErrors[0];
|
|
1116
|
+
} else {
|
|
1117
|
+
throw errors[0];
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1035
1120
|
} else {
|
|
1036
|
-
|
|
1121
|
+
const rljson = {
|
|
1122
|
+
[request.table]: hip({ _data: Array.from(rows.values()), _type: type })
|
|
1123
|
+
};
|
|
1124
|
+
if (this.writables.length > 0 && rows.size > 0) {
|
|
1125
|
+
for (const writeable of this.writables) {
|
|
1126
|
+
if (writeable.id === readFrom) {
|
|
1127
|
+
continue;
|
|
1128
|
+
}
|
|
1129
|
+
try {
|
|
1130
|
+
await writeable.io.write({
|
|
1131
|
+
data: rljson
|
|
1132
|
+
});
|
|
1133
|
+
} catch {
|
|
1134
|
+
continue;
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
return rljson;
|
|
1037
1139
|
}
|
|
1038
1140
|
}
|
|
1039
1141
|
// ...........................................................................
|
|
@@ -1044,12 +1146,12 @@ class IoMulti {
|
|
|
1044
1146
|
*/
|
|
1045
1147
|
async rowCount(table) {
|
|
1046
1148
|
if (this.dumpables.length === 0) {
|
|
1047
|
-
|
|
1149
|
+
throw new Error("No dumpable Io available");
|
|
1048
1150
|
}
|
|
1049
1151
|
const dumpTable = await this.dumpTable({ table });
|
|
1050
1152
|
const tableData = dumpTable[table];
|
|
1051
1153
|
if (!tableData) {
|
|
1052
|
-
|
|
1154
|
+
throw new Error(`Table "${table}" not found`);
|
|
1053
1155
|
}
|
|
1054
1156
|
return Promise.resolve(tableData._data.length);
|
|
1055
1157
|
}
|
|
@@ -1058,21 +1160,21 @@ class IoMulti {
|
|
|
1058
1160
|
* Gets the list of underlying readable Io instances, sorted by priority.
|
|
1059
1161
|
*/
|
|
1060
1162
|
get readables() {
|
|
1061
|
-
return this._ios.filter((ioMultiIo) => ioMultiIo.read).sort((a, b) => a.priority - b.priority)
|
|
1163
|
+
return this._ios.filter((ioMultiIo) => ioMultiIo.read).sort((a, b) => a.priority - b.priority);
|
|
1062
1164
|
}
|
|
1063
1165
|
// ...........................................................................
|
|
1064
1166
|
/**
|
|
1065
1167
|
* Gets the list of underlying writable Io instances, sorted by priority.
|
|
1066
1168
|
*/
|
|
1067
1169
|
get writables() {
|
|
1068
|
-
return this._ios.filter((ioMultiIo) => ioMultiIo.write).sort((a, b) => a.priority - b.priority)
|
|
1170
|
+
return this._ios.filter((ioMultiIo) => ioMultiIo.write).sort((a, b) => a.priority - b.priority);
|
|
1069
1171
|
}
|
|
1070
1172
|
// ...........................................................................
|
|
1071
1173
|
/**
|
|
1072
1174
|
* Gets the list of underlying dumpable Io instances, sorted by priority.
|
|
1073
1175
|
*/
|
|
1074
1176
|
get dumpables() {
|
|
1075
|
-
return this._ios.filter((ioMultiIo) => ioMultiIo.dump).sort((a, b) => a.priority - b.priority)
|
|
1177
|
+
return this._ios.filter((ioMultiIo) => ioMultiIo.dump).sort((a, b) => a.priority - b.priority);
|
|
1076
1178
|
}
|
|
1077
1179
|
// ...........................................................................
|
|
1078
1180
|
static example = async () => {
|
|
@@ -1092,6 +1194,233 @@ class IoMulti {
|
|
|
1092
1194
|
return ioMulti;
|
|
1093
1195
|
};
|
|
1094
1196
|
}
|
|
1197
|
+
class IoPeerBridge {
|
|
1198
|
+
constructor(_io, _socket) {
|
|
1199
|
+
this._io = _io;
|
|
1200
|
+
this._socket = _socket;
|
|
1201
|
+
}
|
|
1202
|
+
_eventHandlers = /* @__PURE__ */ new Map();
|
|
1203
|
+
/**
|
|
1204
|
+
* Starts the bridge by setting up connection event handlers and
|
|
1205
|
+
* automatically registering all Io methods.
|
|
1206
|
+
*/
|
|
1207
|
+
start() {
|
|
1208
|
+
this._socket.on("connect", () => this._handleConnect());
|
|
1209
|
+
this._socket.on("disconnect", () => this._handleDisconnect());
|
|
1210
|
+
this._registerIoMethods();
|
|
1211
|
+
}
|
|
1212
|
+
/**
|
|
1213
|
+
* Stops the bridge by removing all event handlers.
|
|
1214
|
+
*/
|
|
1215
|
+
stop() {
|
|
1216
|
+
this._socket.off("connect", () => this._handleConnect());
|
|
1217
|
+
this._socket.off("disconnect", () => this._handleDisconnect());
|
|
1218
|
+
for (const [eventName, handler] of this._eventHandlers) {
|
|
1219
|
+
this._socket.off(eventName, handler);
|
|
1220
|
+
}
|
|
1221
|
+
this._eventHandlers.clear();
|
|
1222
|
+
}
|
|
1223
|
+
/**
|
|
1224
|
+
* Automatically registers all Io interface methods as socket event handlers.
|
|
1225
|
+
*/
|
|
1226
|
+
_registerIoMethods() {
|
|
1227
|
+
const ioMethods = [
|
|
1228
|
+
"init",
|
|
1229
|
+
"isReady",
|
|
1230
|
+
"close",
|
|
1231
|
+
"tableExists",
|
|
1232
|
+
"createOrExtendTable",
|
|
1233
|
+
"write",
|
|
1234
|
+
"readRows",
|
|
1235
|
+
"rowCount",
|
|
1236
|
+
"dumpTable",
|
|
1237
|
+
"dump",
|
|
1238
|
+
"contentType",
|
|
1239
|
+
"rawTableCfgs"
|
|
1240
|
+
];
|
|
1241
|
+
for (const methodName of ioMethods) {
|
|
1242
|
+
this.registerEvent(methodName);
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
/**
|
|
1246
|
+
* Registers a socket event to be translated to an Io method call.
|
|
1247
|
+
*
|
|
1248
|
+
* @param eventName - The socket event name (should match an Io method name)
|
|
1249
|
+
* @param ioMethodName - (Optional) The Io method name if different from eventName
|
|
1250
|
+
*/
|
|
1251
|
+
registerEvent(eventName, ioMethodName) {
|
|
1252
|
+
const methodName = ioMethodName || eventName;
|
|
1253
|
+
const handler = (...args) => {
|
|
1254
|
+
const callback = args[args.length - 1];
|
|
1255
|
+
const methodArgs = args.slice(0, -1);
|
|
1256
|
+
const ioMethod = this._io[methodName];
|
|
1257
|
+
if (typeof ioMethod !== "function") {
|
|
1258
|
+
const error = new Error(
|
|
1259
|
+
`Method "${methodName}" not found on Io instance`
|
|
1260
|
+
);
|
|
1261
|
+
if (typeof callback === "function") {
|
|
1262
|
+
callback(null, error);
|
|
1263
|
+
}
|
|
1264
|
+
return;
|
|
1265
|
+
}
|
|
1266
|
+
ioMethod.apply(this._io, methodArgs).then((result) => {
|
|
1267
|
+
if (typeof callback === "function") {
|
|
1268
|
+
callback(result, null);
|
|
1269
|
+
}
|
|
1270
|
+
}).catch((error) => {
|
|
1271
|
+
if (typeof callback === "function") {
|
|
1272
|
+
callback(null, error);
|
|
1273
|
+
}
|
|
1274
|
+
});
|
|
1275
|
+
};
|
|
1276
|
+
this._eventHandlers.set(eventName, handler);
|
|
1277
|
+
this._socket.on(eventName, handler);
|
|
1278
|
+
}
|
|
1279
|
+
/**
|
|
1280
|
+
* Registers multiple socket events at once.
|
|
1281
|
+
*
|
|
1282
|
+
* @param eventNames - Array of event names to register
|
|
1283
|
+
*/
|
|
1284
|
+
registerEvents(eventNames) {
|
|
1285
|
+
for (const eventName of eventNames) {
|
|
1286
|
+
this.registerEvent(eventName);
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
/**
|
|
1290
|
+
* Unregisters a socket event handler.
|
|
1291
|
+
*
|
|
1292
|
+
* @param eventName - The event name to unregister
|
|
1293
|
+
*/
|
|
1294
|
+
unregisterEvent(eventName) {
|
|
1295
|
+
const handler = this._eventHandlers.get(eventName);
|
|
1296
|
+
if (handler) {
|
|
1297
|
+
this._socket.off(eventName, handler);
|
|
1298
|
+
this._eventHandlers.delete(eventName);
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
/**
|
|
1302
|
+
* Emits a result back through the socket.
|
|
1303
|
+
*
|
|
1304
|
+
* @param eventName - The event name to emit
|
|
1305
|
+
* @param data - The data to send
|
|
1306
|
+
*/
|
|
1307
|
+
emitToSocket(eventName, ...data) {
|
|
1308
|
+
this._socket.emit(eventName, ...data);
|
|
1309
|
+
}
|
|
1310
|
+
/**
|
|
1311
|
+
* Calls an Io method directly and emits the result through the socket.
|
|
1312
|
+
*
|
|
1313
|
+
* @param ioMethodName - The Io method to call
|
|
1314
|
+
* @param socketEventName - The socket event to emit with the result
|
|
1315
|
+
* @param args - Arguments to pass to the Io method
|
|
1316
|
+
*/
|
|
1317
|
+
async callIoAndEmit(ioMethodName, socketEventName, ...args) {
|
|
1318
|
+
try {
|
|
1319
|
+
const ioMethod = this._io[ioMethodName];
|
|
1320
|
+
if (typeof ioMethod !== "function") {
|
|
1321
|
+
throw new Error(`Method "${ioMethodName}" not found on Io instance`);
|
|
1322
|
+
}
|
|
1323
|
+
const result = await ioMethod.apply(this._io, args);
|
|
1324
|
+
this._socket.emit(socketEventName, result, null);
|
|
1325
|
+
} catch (error) {
|
|
1326
|
+
this._socket.emit(socketEventName, null, error);
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
/* v8 ignore next -- @preserve */
|
|
1330
|
+
_handleConnect() {
|
|
1331
|
+
}
|
|
1332
|
+
/* v8 ignore next -- @preserve */
|
|
1333
|
+
_handleDisconnect() {
|
|
1334
|
+
}
|
|
1335
|
+
/**
|
|
1336
|
+
* Gets the current socket instance.
|
|
1337
|
+
*/
|
|
1338
|
+
get socket() {
|
|
1339
|
+
return this._socket;
|
|
1340
|
+
}
|
|
1341
|
+
/**
|
|
1342
|
+
* Gets the current Io instance.
|
|
1343
|
+
*/
|
|
1344
|
+
get io() {
|
|
1345
|
+
return this._io;
|
|
1346
|
+
}
|
|
1347
|
+
/**
|
|
1348
|
+
* Returns whether the socket is currently connected.
|
|
1349
|
+
*/
|
|
1350
|
+
get isConnected() {
|
|
1351
|
+
return this._socket.connected;
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
class IoServer {
|
|
1355
|
+
constructor(_io) {
|
|
1356
|
+
this._io = _io;
|
|
1357
|
+
}
|
|
1358
|
+
_sockets = [];
|
|
1359
|
+
// ...........................................................................
|
|
1360
|
+
/**
|
|
1361
|
+
* Adds a socket to the IoServer instance.
|
|
1362
|
+
* @param socket - The socket to add.
|
|
1363
|
+
*/
|
|
1364
|
+
async addSocket(socket) {
|
|
1365
|
+
await this._addTransportLayer(socket);
|
|
1366
|
+
this._sockets.push(socket);
|
|
1367
|
+
}
|
|
1368
|
+
// ...........................................................................
|
|
1369
|
+
/**
|
|
1370
|
+
* Removes a transport layer from the given socket.
|
|
1371
|
+
* @param socket - The socket to remove the transport layer from.
|
|
1372
|
+
*/
|
|
1373
|
+
removeSocket(socket) {
|
|
1374
|
+
this._sockets = this._sockets.filter((s) => s !== socket);
|
|
1375
|
+
}
|
|
1376
|
+
// ...........................................................................
|
|
1377
|
+
/**
|
|
1378
|
+
* Adds a transport layer to the given socket.
|
|
1379
|
+
* @param socket - The socket to add the transport layer to.
|
|
1380
|
+
*/
|
|
1381
|
+
async _addTransportLayer(socket) {
|
|
1382
|
+
const crud = this._generateTransportLayerCRUD(this._io);
|
|
1383
|
+
for (const [key, fn] of Object.entries(crud)) {
|
|
1384
|
+
socket.on(key, (...args) => {
|
|
1385
|
+
const cb = args[args.length - 1];
|
|
1386
|
+
fn.apply(this, args.slice(0, -1)).then((result) => {
|
|
1387
|
+
cb(result, null);
|
|
1388
|
+
}).catch((err) => {
|
|
1389
|
+
cb(null, err);
|
|
1390
|
+
});
|
|
1391
|
+
});
|
|
1392
|
+
}
|
|
1393
|
+
}
|
|
1394
|
+
// ...........................................................................
|
|
1395
|
+
/**
|
|
1396
|
+
* Creates or extends a table with the given configuration.
|
|
1397
|
+
* @param request - An object containing the table configuration.
|
|
1398
|
+
*/
|
|
1399
|
+
async createOrExtendTable(request) {
|
|
1400
|
+
return this._io.createOrExtendTable(request);
|
|
1401
|
+
}
|
|
1402
|
+
// ...........................................................................
|
|
1403
|
+
/**
|
|
1404
|
+
* Generates a transport layer object for the given Io instance.
|
|
1405
|
+
* @param io - The Io instance to generate the transport layer for.
|
|
1406
|
+
* @returns An object containing methods that correspond to the Io interface.
|
|
1407
|
+
*/
|
|
1408
|
+
_generateTransportLayerCRUD = (io) => ({
|
|
1409
|
+
init: () => io.init(),
|
|
1410
|
+
close: () => io.close(),
|
|
1411
|
+
isOpen: () => new Promise((resolve) => resolve(io.isOpen)),
|
|
1412
|
+
isReady: () => io.isReady(),
|
|
1413
|
+
dump: () => io.dump(),
|
|
1414
|
+
dumpTable: (request) => io.dumpTable(request),
|
|
1415
|
+
contentType: (request) => io.contentType(request),
|
|
1416
|
+
tableExists: (tableKey) => io.tableExists(tableKey),
|
|
1417
|
+
createOrExtendTable: (request) => this.createOrExtendTable(request),
|
|
1418
|
+
rawTableCfgs: () => io.rawTableCfgs(),
|
|
1419
|
+
write: (request) => io.write(request),
|
|
1420
|
+
readRows: (request) => io.readRows(request),
|
|
1421
|
+
rowCount: (table) => io.rowCount(table)
|
|
1422
|
+
});
|
|
1423
|
+
}
|
|
1095
1424
|
const exampleTestSetup = () => {
|
|
1096
1425
|
return {
|
|
1097
1426
|
io: new IoMem(),
|
|
@@ -1362,6 +1691,14 @@ const socketExample = () => ({
|
|
|
1362
1691
|
/* v8 ignore next -- @preserve */
|
|
1363
1692
|
emit() {
|
|
1364
1693
|
return true;
|
|
1694
|
+
},
|
|
1695
|
+
/* v8 ignore next -- @preserve */
|
|
1696
|
+
off() {
|
|
1697
|
+
return this;
|
|
1698
|
+
},
|
|
1699
|
+
/* v8 ignore next -- @preserve */
|
|
1700
|
+
removeAllListeners() {
|
|
1701
|
+
return this;
|
|
1365
1702
|
}
|
|
1366
1703
|
});
|
|
1367
1704
|
export {
|
|
@@ -1369,6 +1706,8 @@ export {
|
|
|
1369
1706
|
IoMem,
|
|
1370
1707
|
IoMulti,
|
|
1371
1708
|
IoPeer,
|
|
1709
|
+
IoPeerBridge,
|
|
1710
|
+
IoServer,
|
|
1372
1711
|
IoTools,
|
|
1373
1712
|
PeerSocketMock,
|
|
1374
1713
|
SocketMock,
|
|
@@ -1377,4 +1716,4 @@ export {
|
|
|
1377
1716
|
exampleTestSetup,
|
|
1378
1717
|
socketExample
|
|
1379
1718
|
};
|
|
1380
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby1kYi1uYW1lLW1hcHBpbmcudHMiLCIuLi9zcmMvaW8tdG9vbHMudHMiLCIuLi9zcmMvaW8tbWVtLnRzIiwiLi4vc3JjL3BlZXItc29ja2V0LW1vY2sudHMiLCIuLi9zcmMvaW8tcGVlci50cyIsIi4uL3NyYy9pby1tdWx0aS50cyIsIi4uL3NyYy9pby10ZXN0LXNldHVwLnRzIiwiLi4vc3JjL2lvLnRzIiwiLi4vc3JjL3JldmVyc2UtcmVmLnRzIiwiLi4vc3JjL3NvY2tldC1tb2NrLnRzIiwiLi4vc3JjL3NvY2tldC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuZXhwb3J0IGNsYXNzIElvRGJOYW1lTWFwcGluZyB7XG4gIC8vIFRoZSBwcmltYXJ5IGtleSBjb2x1bW4gaXMgYWx3YXlzIG5hbWVkICdfaGFzaCdcbiAgcHVibGljIHByaW1hcnlLZXlDb2x1bW46IHN0cmluZyA9ICdfaGFzaCc7XG4gIHB1YmxpYyBkYXRhU2VjdGlvbjogc3RyaW5nID0gJ19kYXRhJztcbiAgcHVibGljIHR5cGVDb2x1bW46IHN0cmluZyA9ICd0eXBlJztcbiAgcHVibGljIGtleUNvbHVtbjogc3RyaW5nID0gJ2tleSc7XG5cbiAgLy8gTmFtZXMgZm9yIHRoZSBtYWluIHRhYmxlcyBpbiB0aGUgZGF0YWJhc2VcbiAgcHVibGljIHRhYmxlTmFtZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgbWFpbjogJ3RhYmxlQ2ZncycsXG4gICAgcmV2aXNpb246ICdyZXZpc2lvbnMnLFxuICB9O1xuXG4gIC8vLyBTdWZmaXggaGFuZGxpbmcgZm9yIHRoZSBkYXRhYmFzZVxuICBwcml2YXRlIF9zdWZmaXg6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgY29sOiAnX2NvbCcsXG4gICAgdGJsOiAnX3RibCcsXG4gICAgdG1wOiAnX3RtcCcsXG4gIH07XG5cbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgLy8gYWRkIGFuZCByZW1vdmUgc3VmZml4ZXMgZm9yIHVzZSBpbiBTUUwgc3RhdGVtZW50c1xuICBwcml2YXRlIF9hZGRGaXgobmFtZTogc3RyaW5nLCBmaXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoZml4KSA/IG5hbWUgOiBuYW1lICsgZml4O1xuICB9XG5cbiAgcHVibGljIGFkZFRhYmxlU3VmZml4KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZEZpeChuYW1lLCB0aGlzLl9zdWZmaXgudGJsKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRDb2x1bW5TdWZmaXgobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkRml4KG5hbWUsIHRoaXMuX3N1ZmZpeC5jb2wpO1xuICB9XG5cbiAgcHVibGljIGFkZFRtcFN1ZmZpeChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hZGRGaXgobmFtZSwgdGhpcy5fc3VmZml4LnRtcCk7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVGaXgobmFtZTogc3RyaW5nLCBmaXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoZml4KSA/IG5hbWUuc2xpY2UoMCwgLWZpeC5sZW5ndGgpIDogbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVUYWJsZVN1ZmZpeChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9yZW1vdmVGaXgobmFtZSwgdGhpcy5fc3VmZml4LnRibCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ29sdW1uU3VmZml4KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW92ZUZpeChuYW1lLCB0aGlzLl9zdWZmaXguY29sKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVUbXBTdWZmaXgobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3ZlRml4KG5hbWUsIHRoaXMuX3N1ZmZpeC50bXApO1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG4gIHRocm93T25JbnZhbGlkVGFibGVDZmcsXG4gIHZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuZXhwb3J0IHR5cGUgSW9PYnNlcnZlciA9IChkYXRhOiBSbGpzb24pID0+IHZvaWQ7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb1Rvb2xzIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBpbyBUaGUgSW8gaW50ZXJmYWNlIHRvIHVzZVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlvOiBJbykge31cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFibGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFibGVDZmdzIHRhYmxlLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZUNmZ3NUYWJsZUNmZygpIHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGhpcDxUYWJsZUNmZz4oe1xuICAgICAgX2hhc2g6ICcnLFxuICAgICAga2V5OiAndGFibGVDZmdzJyxcbiAgICAgIHR5cGU6ICd0YWJsZUNmZ3MnLFxuICAgICAgaXNIZWFkOiBmYWxzZSxcbiAgICAgIGlzUm9vdDogZmFsc2UsXG4gICAgICBpc1NoYXJlZDogdHJ1ZSxcbiAgICAgIHByZXZpb3VzOiAnJyxcblxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAga2V5OiAnX2hhc2gnLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdIYXNoJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdSb3cgSGFzaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdrZXknLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdLZXknLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1RhYmxlIEtleScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICd0eXBlJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnVHlwZScsXG4gICAgICAgICAgdGl0bGVMb25nOiAnQ29udGVudCBUeXBlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ2lzSGVhZCcsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdJcyBIZWFkJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdJcyBIZWFkIFRhYmxlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ2lzUm9vdCcsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdJcyBSb290JyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdJcyBSb290IFRhYmxlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ2lzU2hhcmVkJyxcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgdGl0bGVTaG9ydDogJ0lzIFNoYXJlZCcsXG4gICAgICAgICAgdGl0bGVMb25nOiAnSXMgU2hhcmVkIFRhYmxlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ3ByZXZpb3VzJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnUHJldmlvdXMnLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1ByZXZpb3VzIFRhYmxlIENvbmZpZ3VyYXRpb24gSGFzaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdjb2x1bW5zJyxcbiAgICAgICAgICB0eXBlOiAnanNvbkFycmF5JyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnQ29sdW1ucycsXG4gICAgICAgICAgdGl0bGVMb25nOiAnQ29sdW1uIENvbmZpZ3VyYXRpb25zJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGFibGVDZmc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHJldmlzaW9ucyB0YWJsZS5cbiAgICovXG4gIGluaXRSZXZpc2lvbnNUYWJsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZUNmZzogVGFibGVDZmcgPSB7XG4gICAgICBrZXk6ICdyZXZpc2lvbnMnLFxuICAgICAgdHlwZTogJ3JldmlzaW9ucycsXG4gICAgICBpc0hlYWQ6IHRydWUsXG4gICAgICBpc1Jvb3Q6IHRydWUsXG4gICAgICBpc1NoYXJlZDogZmFsc2UsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ19oYXNoJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnSGFzaCcsXG4gICAgICAgICAgdGl0bGVMb25nOiAnUm93IEhhc2gnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiAndGFibGUnLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdUYWJsZScsXG4gICAgICAgICAgdGl0bGVMb25nOiAnVGFibGUgS2V5JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ3ByZWRlY2Vzc29yJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnUHJlZGVjZXNzb3InLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1ByZWRlY2Vzc29yIFJldmlzaW9uIEhhc2gnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiAnc3VjY2Vzc29yJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnU3VjY2Vzc29yJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdTdWNjZXNzb3IgUmV2aXNpb24gSGFzaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICd0aW1lc3RhbXAnLFxuICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdUaW1lc3RhbXAnLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1JldmlzaW9uIFRpbWVzdGFtcCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdpZCcsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgdGl0bGVTaG9ydDogJ0lEJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdSZXZpc2lvbiBJRCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLmlvLmNyZWF0ZU9yRXh0ZW5kVGFibGUoeyB0YWJsZUNmZyB9KTtcbiAgfTtcblxuICAvKipcbiAgICogRXhhbXBsZSBvYmplY3QgZm9yIHRlc3QgcHVycG9zZXNcbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgaW8gdG9vbHNcbiAgICovXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlvID0gYXdhaXQgSW9NZW0uZXhhbXBsZSgpO1xuICAgIGF3YWl0IGlvLmluaXQoKTtcbiAgICBhd2FpdCBpby5pc1JlYWR5KCk7XG4gICAgcmV0dXJuIG5ldyBJb1Rvb2xzKGlvKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhyb3dzIGlmIHRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdFxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZSk7XG4gICAgaWYgKCFleGlzdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgYW55IG9mIHRoZSB0YWJsZXMgaW4gcmxqc29uIGRvIG5vdCBleGlzdFxuICAgKiBAcGFyYW0gcmxqc29uIC0gVGhlIFJsanNvbiBvYmplY3QgdG8gY2hlY2tcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlc0RvTm90RXhpc3Qocmxqc29uOiBSbGpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgaXRlcmF0ZVRhYmxlcyhybGpzb24sIGFzeW5jICh0YWJsZUtleSkgPT4ge1xuICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmlvLnRhYmxlRXhpc3RzKHRhYmxlS2V5KTtcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZUtleX1cIiBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgbWlzc2luZ1RhYmxlcyA9IChlIGFzIEFycmF5PGFueT4pLm1hcCgoZSkgPT4gZS50YWJsZUtleSk7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgdGFibGVzIGRvIG5vdCBleGlzdDogJHttaXNzaW5nVGFibGVzLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGFibGUgY2ZncyBvZiBhbGwgdGFibGVzXG4gICAqIEByZXR1cm5zIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uIG9mIGFsbCB0YWJsZXNcbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICBjb25zdCB0YWJsZXMgPSBhd2FpdCB0aGlzLmlvLnJhd1RhYmxlQ2ZncygpO1xuXG4gICAgLy8gVGFrZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWFjaCB0eXBlIGtleVxuICAgIGNvbnN0IG5ld2VzdFZlcnNpb246IFJlY29yZDxUYWJsZUtleSwgVGFibGVDZmc+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IHRhYmxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgdGFibGUgPSB0YWJsZXNbaV07XG4gICAgICBjb25zdCBleGlzdGluZyA9IG5ld2VzdFZlcnNpb25bdGFibGUua2V5XTtcbiAgICAgIGlmICghZXhpc3RpbmcgfHwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGggPCB0YWJsZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBuZXdlc3RWZXJzaW9uW3RhYmxlLmtleV0gPSB0YWJsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSB0YWJsZXMgYnkga2V5XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgY29uc3QgcmVzdWx0RGF0YSA9IE9iamVjdC52YWx1ZXMobmV3ZXN0VmVyc2lvbikuc29ydCgoYSwgYikgPT4ge1xuICAgICAgaWYgKGEua2V5IDwgYi5rZXkpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGEua2V5ID4gYi5rZXkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHREYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IHdpdGggYWxsIHRhYmxlIG5hbWVzXG4gICAqL1xuICBhc3luYyBhbGxUYWJsZUtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCB0aGlzLnRhYmxlQ2ZncygpKS5tYXAoKGUpID0+IGUua2V5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB0YWJsZVxuICAgKi9cbiAgYXN5bmMgdGFibGVDZmcodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxUYWJsZUNmZz4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZ09yTnVsbCh0YWJsZSk7XG4gICAgaWYgKCF0YWJsZUNmZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlQ2ZnITtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdGFibGUgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cblxuICAgKi9cbiAgYXN5bmMgdGFibGVDZmdPck51bGwodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxUYWJsZUNmZyB8IG51bGw+IHtcbiAgICBjb25zdCB0YWJsZUNmZ3MgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZncygpO1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gdGFibGVDZmdzLmZpbmQoKGUpID0+IGUua2V5ID09PSB0YWJsZSk7XG4gICAgcmV0dXJuIHRhYmxlQ2ZnID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGNvbHVtbiBuYW1lcyBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyBhbGxDb2x1bW5LZXlzKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRhYmxlQ2ZnLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIHdoZW4gYSBjb2x1bW4gZG9lcyBub3QgZXhpc3QgaW4gYSBnaXZlbiB0YWJsZVxuICAgKiBAcGFyYW0gdGFibGUgLSBUaGUgdGFibGUgdG8gY2hlY2tcbiAgICogQHBhcmFtIGNvbHVtbnMgLSBUaGUgY29sdW1uIHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5Db2x1bW5Eb2VzTm90RXhpc3QoXG4gICAgdGFibGU6IFRhYmxlS2V5LFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGNvbHVtbikgPT4gIWNvbHVtbktleXMuaW5jbHVkZXMoY29sdW1uKSxcbiAgICApO1xuICAgIGlmIChtaXNzaW5nQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIGNvbHVtbnMgZG8gbm90IGV4aXN0IGluIHRhYmxlIFwiJHt0YWJsZX1cIjogJHttaXNzaW5nQ29sdW1ucy5qb2luKFxuICAgICAgICAgICcsICcsXG4gICAgICAgICl9LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3Mgd2hlbiBhIHRhYmxlIHVwZGF0ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRhYmxlXG4gICAqIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh1cGRhdGU6IFRhYmxlQ2ZnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlZml4ID0gYEludmFsaWQgdXBkYXRlIG9mIHRhYmxlIGFibGUgXCIke3VwZGF0ZS5rZXl9XCJgO1xuXG4gICAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyh1cGRhdGUpO1xuXG4gICAgLy8gQ2hlY2sgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHVwZGF0ZS5rZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gSGF2ZSBjb2x1bW5zIGJlZW4gZGVsZXRlZD9cbiAgICAgIGlmIChleGlzdGluZy5jb2x1bW5zLmxlbmd0aCA+IHVwZGF0ZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1uS2V5cyA9IGV4aXN0aW5nLmNvbHVtbnNcbiAgICAgICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChrZXkpID0+ICF1cGRhdGUuY29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGtleSksXG4gICAgICAgICAgKTtcbiAgICAgICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgICAgIGlmIChkZWxldGVkQ29sdW1uS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZGVsZXRlZENvbHVtbnMgPSBkZWxldGVkQ29sdW1uS2V5cy5qb2luKCcsICcpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IENvbHVtbnMgbXVzdCBub3QgYmUgZGVsZXRlZC4gYCArXG4gICAgICAgICAgICAgIGBEZWxldGVkIGNvbHVtbnM6ICR7ZGVsZXRlZENvbHVtbnN9fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYXZlIGNvbHVtbiBrZXlzIGNoYW5nZWQ/XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gdXBkYXRlLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBpZiAoYmVmb3JlICE9PSBhZnRlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIGtleXMgbXVzdCBub3QgY2hhbmdlISBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiBcIiR7YmVmb3JlfVwiIHdhcyByZW5hbWVkIGludG8gXCIke2FmdGVyfVwiLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYXZlIGNvbHVtbiB0eXBlcyBjaGFuZ2VkP1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGV4aXN0aW5nLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5jb2x1bW5zW2ldLnR5cGU7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gdXBkYXRlLmNvbHVtbnNbaV0udHlwZTtcbiAgICAgICAgaWYgKGJlZm9yZSAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiB0eXBlcyBtdXN0IG5vdCBjaGFuZ2UhIGAgK1xuICAgICAgICAgICAgICBgVHlwZSBvZiBjb2x1bW4gXCIke2NvbHVtbn1cIiB3YXMgY2hhbmdlZCBmcm9tIFwiJHtiZWZvcmV9XCIgdG8gJHthZnRlcn0uYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0aGUgZGF0YSBpbiB0aGUgdGFibGUgZG8gbm90IG1hdGNoIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcoZGF0YTogUmxqc29uKSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgYXdhaXQgaXRlcmF0ZVRhYmxlcyhkYXRhLCBhc3luYyAodGFibGVLZXkpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZUtleSk7XG4gICAgICBjb25zdCB0YWJsZSA9IGRhdGFbdGFibGVLZXldO1xuXG4gICAgICAvLyBJZ25vcmUgdGFibGVDZmdzIHRhYmxlXG4gICAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICAgIGlmICh0YWJsZS5fdHlwZSA9PT0gJ3RhYmxlQ2ZncycpIHJldHVybjtcblxuICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVSbGpzb25BZ2FpbnN0VGFibGVDZmcodGFibGUuX2RhdGEsIHRhYmxlQ2ZnKSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRhYmxlIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlIGNvbmZpZ3VyYXRpb24uXFxuXFxuRXJyb3JzOlxcbiR7ZXJyb3JzXG4gICAgICAgICAgLm1hcCgoZSkgPT4gYC0gJHtlfWApXG4gICAgICAgICAgLmpvaW4oJ1xcbicpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgZGF0YSBvZiBhIHRhYmxlIGJ5IHRoZSBoYXNoIGFuZCB1cGRhdGVzIHRoZSB0YWJsZSBoYXNoIGluIHBsYWNlXG4gICAqL1xuICBzb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0YWJsZTogVGFibGVUeXBlKTogdm9pZCB7XG4gICAgdGFibGUuX2RhdGEuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgaGFzaEEgPSBhLl9oYXNoIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGhhc2hCID0gYi5faGFzaCBhcyBzdHJpbmc7XG4gICAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICAgIGlmIChoYXNoQSA8IGhhc2hCKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgaWYgKGhhc2hBID4gaGFzaEIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwge1xuICAgICAgdXBkYXRlRXhpc3RpbmdIYXNoZXM6IGZhbHNlLFxuICAgICAgdGhyb3dPbldyb25nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IGhpcCwgaHNoIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7IElzUmVhZHkgfSBmcm9tICdAcmxqc29uL2lzLXJlYWR5JztcbmltcG9ydCB7IGNvcHksIGVxdWFscywgSnNvblZhbHVlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIENvbnRlbnRUeXBlLFxuICBpdGVyYXRlVGFibGVzU3luYyxcbiAgUmxqc29uLFxuICBUYWJsZUNmZyxcbiAgVGFibGVLZXksXG4gIFRhYmxlVHlwZSxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5pbXBvcnQgeyBJb1Rvb2xzIH0gZnJvbSAnLi9pby10b29scy50cyc7XG5pbXBvcnQgeyBJbyB9IGZyb20gJy4vaW8udHMnO1xuXG4vKipcbiAqIEluLU1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmxqc29uIElvIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvTWVtIGltcGxlbWVudHMgSW8ge1xuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gQ29uc3RydWN0b3IgJiBleGFtcGxlXG5cbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9pc09wZW4gPSBmYWxzZTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cblxuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbyA9IG5ldyBJb01lbSgpO1xuICAgIGF3YWl0IGlvLmluaXQoKTtcbiAgICByZXR1cm4gaW87XG4gIH07XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWFkeS5wcm9taXNlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIER1bXBcblxuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXAoKTtcbiAgfVxuXG4gIGFzeW5jIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXBUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBNZXRhIERhdGFcblxuICBhc3luYyBjb250ZW50VHlwZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGVudFR5cGU+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudFR5cGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUm93c1xuXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZFJvd3MocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICBpZiAoIXRhYmxlRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFibGVEYXRhLl9kYXRhLmxlbmd0aCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlIG1hbmFnZW1lbnRcbiAgYXN5bmMgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICByZXR1cm4gdGFibGUgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIGFzeW5jIHJhd1RhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICBjb25zdCB0YWJsZXMgPSB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhIGFzIFRhYmxlQ2ZnW107XG4gICAgcmV0dXJuIHRhYmxlcztcbiAgfVxuXG4gIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgLy8gUHJpdmF0ZVxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgcHJpdmF0ZSBfaW9Ub29scyE6IElvVG9vbHM7XG5cbiAgcHJpdmF0ZSBfaXNSZWFkeSA9IG5ldyBJc1JlYWR5KCk7XG4gIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX21lbTogUmxqc29uID0gaGlwKHt9IGFzIFJsanNvbik7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoKSB7XG4gICAgdGhpcy5faW9Ub29scyA9IG5ldyBJb1Rvb2xzKHRoaXMpO1xuICAgIHRoaXMuX2luaXRUYWJsZUNmZ3MoKTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy5pbml0UmV2aXNpb25zVGFibGUoKTtcbiAgICBoc2godGhpcy5fbWVtKTtcblxuICAgIHRoaXMuX2lzUmVhZHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2luaXRUYWJsZUNmZ3MgPSAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBJb1Rvb2xzLnRhYmxlQ2Znc1RhYmxlQ2ZnO1xuXG4gICAgdGhpcy5fbWVtLnRhYmxlQ2ZncyA9IGhpcCh7XG4gICAgICBfdHlwZTogJ3RhYmxlQ2ZncycsXG4gICAgICBfZGF0YTogW3RhYmxlQ2ZnXSxcbiAgICAgIF90YWJsZUNmZzogdGFibGVDZmcuX2hhc2ggYXMgc3RyaW5nLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVHbG9iYWxIYXNoKCkge1xuICAgICh0aGlzLl9tZW0gYXMgYW55KS5faGFzaCA9ICcnO1xuICAgIGhpcCh0aGlzLl9tZW0sIHtcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVUYWJsZUhhc2godGFibGVLZXk6IFRhYmxlS2V5KSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwgeyB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7XG4gICAgdGFibGVDZmc6IFRhYmxlQ2ZnO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGNvbmZpZyBpcyBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBhbiBwb3RlbnRpYWwgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZUNmZyA9IHJlcXVlc3QudGFibGVDZmc7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh0YWJsZUNmZyk7XG5cbiAgICBjb25zdCB7IGtleSB9ID0gdGFibGVDZmc7XG5cbiAgICAvLyBSZWNyZWF0ZSBoYXNoZXMgaW4gdGhlIGNhc2UgdGhlIGV4aXN0aW5nIGhhc2hlcyBhcmUgd3JvbmdcbiAgICBjb25zdCBuZXdDb25maWcgPSBoc2godGFibGVDZmcpO1xuXG4gICAgLy8gRmluZCBhbiBleGlzdGluZyB0YWJsZSBjb25maWcgd2l0aCB0aGUgc2FtZSBoYXNoXG4gICAgY29uc3QgZXhpc3RpbmdDb25maWcgPSBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRhYmxlQ2ZnT3JOdWxsKGtleSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGlmICghZXhpc3RpbmdDb25maWcpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZywga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWcsIG5ld0NvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZzogVGFibGVDZmcsIHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIC8vIFdyaXRlIHRoZSB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRoaXMuX21lbS50YWJsZUNmZ3MpO1xuXG4gICAgLy8gQ3JlYXRlIGEgdGFibGUgYW5kIHdyaXRlIGl0IGludG8gdGhlIGRhdGFiYXNlXG4gICAgY29uc3QgdGFibGU6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiBuZXdDb25maWcudHlwZSxcbiAgICAgIF9kYXRhOiBbXSxcbiAgICAgIF90YWJsZUNmZzogbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9O1xuXG4gICAgdGhpcy5fbWVtW3RhYmxlS2V5XSA/Pz0gaGlwKHRhYmxlKTtcblxuICAgIC8vIFVwZGF0ZSBoYXNoZXNcbiAgICB0aGlzLl91cGRhdGVUYWJsZUhhc2godGFibGVLZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9leHRlbmRUYWJsZShleGlzdGluZ0NvbmZpZzogVGFibGVDZmcsIG5ld0NvbmZpZzogVGFibGVDZmcpIHtcbiAgICAvLyBObyBjb2x1bW5zIGFkZGVkPyBSZXR1cm4uXG4gICAgaWYgKGV4aXN0aW5nQ29uZmlnLmNvbHVtbnMubGVuZ3RoID09PSBuZXdDb25maWcuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IHRhYmxlIGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIG5ld0NvbmZpZyA9IGhzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEucHVzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGhpcy5fbWVtLnRhYmxlQ2Zncyk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbmZpZyBvZiB0aGUgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtuZXdDb25maWcua2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgdGFibGUuX3RhYmxlQ2ZnID0gbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZztcblxuICAgIC8vIFVwZGF0ZSB0aGUgaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKG5ld0NvbmZpZy5rZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG4gIHByaXZhdGUgYXN5bmMgX2R1bXAoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gY29weSh0aGlzLl9tZW0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2R1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICBbcmVxdWVzdC50YWJsZV06IGNvcHkodGFibGUpLFxuICAgIH07XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY29udGVudFR5cGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPENvbnRlbnRUeXBlPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIHJldHVybiAodGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZSkuX3R5cGU7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFkZGVkRGF0YSA9IGhzaChyZXF1ZXN0LmRhdGEpO1xuICAgIHRoaXMuX3JlbW92ZU51bGxWYWx1ZXMoYWRkZWREYXRhKTtcbiAgICBjb25zdCB0YWJsZXMgPSBPYmplY3Qua2V5cyhhZGRlZERhdGEpO1xuICAgIGhzaChhZGRlZERhdGEpO1xuXG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJlcXVlc3QuZGF0YSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcocmVxdWVzdC5kYXRhKTtcblxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICBpZiAodGFibGUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGRUYWJsZSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuICAgICAgY29uc3QgbmV3VGFibGUgPSBhZGRlZERhdGFbdGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgICAgLy8gVGFibGUgZXhpc3RzLiBNZXJnZSBkYXRhXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3VGFibGUuX2RhdGEpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGl0ZW0uX2hhc2g7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG9sZFRhYmxlLl9kYXRhLmZpbmQoKGkpID0+IGkuX2hhc2ggPT09IGhhc2gpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIG9sZFRhYmxlLl9kYXRhLnB1c2goaXRlbSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2gob2xkVGFibGUpO1xuICAgIH1cblxuICAgIC8vIFJlY2FsYyBtYWluIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9yZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlbkNvbHVtbkRvZXNOb3RFeGlzdChcbiAgICAgIHJlcXVlc3QudGFibGUsXG4gICAgICBPYmplY3Qua2V5cyhyZXF1ZXN0LndoZXJlKSxcbiAgICApO1xuXG4gICAgLy8gUmVhZCB0YWJsZSBmcm9tIGRhdGFcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICAvLyBGaWx0ZXIgdGFibGUgZGF0YVxuICAgIGNvbnN0IHRhYmxlRGF0YUZpbHRlcmVkID0gdGFibGUuX2RhdGEuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIGluIHJlcXVlc3Qud2hlcmUpIHtcbiAgICAgICAgY29uc3QgYSA9IHJvd1tjb2x1bW5dO1xuICAgICAgICBjb25zdCBiID0gcmVxdWVzdC53aGVyZVtjb2x1bW5dO1xuICAgICAgICBpZiAoYiA9PT0gbnVsbCAmJiBhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhbiB0YWJsZVxuICAgIGNvbnN0IHRhYmxlRmlsdGVyZWQ6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiB0YWJsZS5fdHlwZSxcbiAgICAgIF9kYXRhOiB0YWJsZURhdGFGaWx0ZXJlZCxcbiAgICB9O1xuXG4gICAgdGhpcy5faW9Ub29scy5zb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0YWJsZUZpbHRlcmVkKTtcblxuICAgIGNvbnN0IHJlc3VsdDogUmxqc29uID0ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiB0YWJsZUZpbHRlcmVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgX3JlbW92ZU51bGxWYWx1ZXMocmxqc29uOiBSbGpzb24pIHtcbiAgICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sICh0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHJsanNvblt0YWJsZV0uX2RhdGE7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcm93KSB7XG4gICAgICAgICAgaWYgKHJvd1trZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgcm93W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBJbyB9IGZyb20gJy4vaW8udHMnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQudHMnO1xuXG5cbmV4cG9ydCBjbGFzcyBQZWVyU29ja2V0TW9jayBpbXBsZW1lbnRzIFNvY2tldCB7XG4gIHByaXZhdGUgX2xpc3RlbmVyc01hcDogTWFwPHN0cmluZyB8IHN5bWJvbCwgQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPj4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBjb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlzY29ubmVjdGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pbzogSW8pIHt9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmVnaXN0ZXJzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IuXG4gICAqIEBwYXJhbSBsaXN0ZW5lciAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiB0aGUgZXZlbnQgaXMgZW1pdHRlZC5cbiAgICogQHJldHVybnMgVGhlIFBlZXJTb2NrZXRNb2NrIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAgICovXG4gIG9uKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNNYXAuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVyc01hcC5zZXQoZXZlbnROYW1lLCBbXSk7XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVyc01hcC5nZXQoZXZlbnROYW1lKSEucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFNpbXVsYXRlcyBhIGNvbm5lY3Rpb24gZXZlbnQuXG4gICAqXG4gICAqIEVtaXRzIHRoZSAnY29ubmVjdCcgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICAgKi9cbiAgY29ubmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgdGhpcy5kaXNjb25uZWN0ZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc01hcC5nZXQoJ2Nvbm5lY3QnKSB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGNiIG9mIGxpc3RlbmVycykge1xuICAgICAgY2Ioe30pO1xuICAgIH1cbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogU2ltdWxhdGVzIGEgZGlzY29ubmVjdGlvbiBldmVudC5cbiAgICpcbiAgICogRW1pdHMgdGhlICdkaXNjb25uZWN0JyBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuXG4gICAqL1xuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5kaXNjb25uZWN0ZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzTWFwLmdldCgnZGlzY29ubmVjdCcpIHx8IFtdO1xuICAgIGZvciAoY29uc3QgY2Igb2YgbGlzdGVuZXJzKSB7XG4gICAgICBjYih7fSk7XG4gICAgfVxuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQsIGludm9raW5nIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgSW8gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gZW1pdC5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZW1pdChldmVudE5hbWU6IHN0cmluZyB8IHN5bWJvbCwgLi4uYXJnczogYW55W10pOiBib29sZWFuIHtcbiAgICBjb25zdCBmbiA9ICh0aGlzLl9pbyBhcyBhbnkpW2V2ZW50TmFtZV0gYXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT47XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVudCAke2V2ZW50TmFtZS50b1N0cmluZygpfSBub3Qgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IGNiID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgIGZuLmFwcGx5KHRoaXMuX2lvLCBhcmdzLnNsaWNlKDAsIC0xKSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgY2IocmVzdWx0LCBudWxsKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjYihudWxsLCBlcnIpO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQgeyBDb250ZW50VHlwZSwgUmxqc29uLCBUYWJsZUNmZywgVGFibGVLZXkgfSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcbmltcG9ydCB7IFBlZXJTb2NrZXRNb2NrIH0gZnJvbSAnLi9wZWVyLXNvY2tldC1tb2NrLnRzJztcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gJy4vc29ja2V0LnRzJztcblxuZXhwb3J0IGNsYXNzIElvUGVlciBpbXBsZW1lbnRzIElvIHtcbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc29ja2V0OiBTb2NrZXQpIHt9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKlxuICAgKiBJbml0aWFsaXplcyB0aGUgUGVlciBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBVcGRhdGUgaXNPcGVuIG9uIGNvbm5lY3QvZGlzY29ubmVjdFxuICAgIHRoaXMuX3NvY2tldC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLl9zb2NrZXQub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgLy8gQ29ubmVjdCB0aGUgc29ja2V0XG4gICAgdGhpcy5fc29ja2V0LmNvbm5lY3QoKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBQZWVyIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zXG4gICAqL1xuXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIERpc2Nvbm5lY3QgdGhlIHNvY2tldFxuICAgIGlmICghdGhpcy5fc29ja2V0LmNvbm5lY3RlZCkgcmV0dXJuO1xuICAgIHRoaXMuX3NvY2tldC5kaXNjb25uZWN0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIFBlZXIgY29ubmVjdGlvbiBpcyByZWFkeS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIGlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvY2tldC5jb25uZWN0ZWQgPyBQcm9taXNlLnJlc29sdmUoKSA6IFByb21pc2UucmVqZWN0KCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIER1bXBzIHRoZSBlbnRpcmUgZGF0YWJhc2UgY29udGVudC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGR1bXBlZCBkYXRhYmFzZSBjb250ZW50LlxuICAgKi9cbiAgYXN5bmMgZHVtcCgpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gUmVxdWVzdCBkdW1wLCByZXNvbHZlIG9uY2UgdGhlIGRhdGEgaXMgcmVjZWl2ZWQgKGFjaylcbiAgICAgIHRoaXMuX3NvY2tldC5lbWl0KCdkdW1wJywgKGRhdGE6IFJsanNvbikgPT4ge1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIER1bXBzIGEgc3BlY2lmaWMgdGFibGUgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBuYW1lIHRvIGR1bXAuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkdW1wZWQgdGFibGUgZGF0YS5cbiAgICovXG4gIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFJlcXVlc3QgZHVtcFRhYmxlLCByZXNvbHZlIG9uY2UgdGhlIGRhdGEgaXMgcmVjZWl2ZWQgKGFjaylcbiAgICAgIHRoaXMuX3NvY2tldC5lbWl0KCdkdW1wVGFibGUnLCByZXF1ZXN0LCAoZGF0YTogUmxqc29uLCBlcnJvcj86IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb250ZW50IHR5cGUgb2YgYSBzcGVjaWZpYyB0YWJsZS5cbiAgICogQHBhcmFtIHJlcXVlc3QgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRhYmxlIG5hbWUgdG8gZ2V0IHRoZSBjb250ZW50IHR5cGUgZm9yLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgdGFibGUuXG4gICAqL1xuICBjb250ZW50VHlwZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGVudFR5cGU+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gUmVxdWVzdCBjb250ZW50VHlwZSwgcmVzb2x2ZSBvbmNlIHRoZSBkYXRhIGlzIHJlY2VpdmVkIChhY2spXG4gICAgICB0aGlzLl9zb2NrZXQuZW1pdChcbiAgICAgICAgJ2NvbnRlbnRUeXBlJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgKGRhdGE6IENvbnRlbnRUeXBlLCBlcnJvcj86IEVycm9yKSA9PiB7XG4gICAgICAgICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgICAgICAgaWYgKGVycm9yKSByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzcGVjaWZpYyB0YWJsZSBleGlzdHMgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gdGFibGVLZXkgVGhlIGtleSBvZiB0aGUgdGFibGUgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdGFibGUgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICB0YWJsZUV4aXN0cyh0YWJsZUtleTogVGFibGVLZXkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8vIFJlcXVlc3QgdGFibGVFeGlzdHMsIHJlc29sdmUgb25jZSB0aGUgZGF0YSBpcyByZWNlaXZlZCAoYWNrKVxuICAgICAgdGhpcy5fc29ja2V0LmVtaXQoJ3RhYmxlRXhpc3RzJywgdGFibGVLZXksIChleGlzdHM6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgcmVzb2x2ZShleGlzdHMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIENyZWF0ZXMgb3IgZXh0ZW5kcyBhIHRhYmxlIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB0YWJsZSBpcyBjcmVhdGVkIG9yIGV4dGVuZGVkLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFJlcXVlc3QgY3JlYXRlT3JFeHRlbmRUYWJsZSwgcmVzb2x2ZSBvbmNlIHRoZSBkYXRhIGlzIHJlY2VpdmVkIChhY2spXG4gICAgICB0aGlzLl9zb2NrZXQuZW1pdChcbiAgICAgICAgJ2NyZWF0ZU9yRXh0ZW5kVGFibGUnLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICAoXz86IGJvb2xlYW4sIGVycm9yPzogRXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSByYXcgdGFibGUgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHRhYmxlIGNvbmZpZ3VyYXRpb25zLlxuICAgKi9cbiAgcmF3VGFibGVDZmdzKCk6IFByb21pc2U8VGFibGVDZmdbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gUmVxdWVzdCByYXdUYWJsZUNmZ3MsIHJlc29sdmUgb25jZSB0aGUgZGF0YSBpcyByZWNlaXZlZCAoYWNrKVxuICAgICAgdGhpcy5fc29ja2V0LmVtaXQoJ3Jhd1RhYmxlQ2ZncycsIChkYXRhOiBUYWJsZUNmZ1tdKSA9PiB7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogV3JpdGVzIGRhdGEgdG8gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGF0YSB0byB3cml0ZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZGF0YSBpcyB3cml0dGVuLlxuICAgKi9cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBSZXF1ZXN0IHdyaXRlLCByZXNvbHZlIG9uY2UgdGhlIGRhdGEgaXMgcmVjZWl2ZWQgKGFjaylcbiAgICAgIHRoaXMuX3NvY2tldC5lbWl0KCd3cml0ZScsIHJlcXVlc3QsIChfPzogYm9vbGVhbiwgZXJyb3I/OiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBSZWFkcyByb3dzIGZyb20gYSBzcGVjaWZpYyB0YWJsZSB0aGF0IG1hdGNoIHRoZSBnaXZlbiBjcml0ZXJpYS5cbiAgICogQHBhcmFtIHJlcXVlc3QgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRhYmxlIG5hbWUgYW5kIHRoZSBjcml0ZXJpYSBmb3Igc2VsZWN0aW5nIHJvd3MuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzZWxlY3RlZCByb3dzLlxuICAgKi9cbiAgcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIHwgbnVsbCB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gUmVxdWVzdCByZWFkUm93cywgcmVzb2x2ZSBvbmNlIHRoZSBkYXRhIGlzIHJlY2VpdmVkIChhY2spXG4gICAgICB0aGlzLl9zb2NrZXQuZW1pdChcbiAgICAgICAgJ3JlYWRSb3dzJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgKHJlc3VsdD86IFJsanNvbiwgZXJyb3I/OiBFcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCEpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiBhIHNwZWNpZmljIHRhYmxlLlxuICAgKiBAcGFyYW0gdGFibGUgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGNvdW50IHJvd3MgaW4uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlLlxuICAgKi9cbiAgcm93Q291bnQodGFibGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFJlcXVlc3Qgcm93Q291bnQsIHJlc29sdmUgb25jZSB0aGUgZGF0YSBpcyByZWNlaXZlZCAoYWNrKVxuICAgICAgdGhpcy5fc29ja2V0LmVtaXQoJ3Jvd0NvdW50JywgdGFibGUsIChjb3VudD86IG51bWJlciwgZXJyb3I/OiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJlc29sdmUoY291bnQhKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlvTWVtID0gYXdhaXQgSW9NZW0uZXhhbXBsZSgpO1xuICAgIGNvbnN0IHNvY2tldCA9IG5ldyBQZWVyU29ja2V0TW9jayhpb01lbSk7XG4gICAgY29uc3QgaW8gPSBuZXcgSW9QZWVyKHNvY2tldCk7XG4gICAgYXdhaXQgaW8uaW5pdCgpO1xuICAgIHJldHVybiBpbztcbiAgfTtcbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uVmFsdWUsIG1lcmdlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIENvbnRlbnRUeXBlLFxuICBSbGpzb24sXG4gIFRhYmxlQ2ZnLFxuICBUYWJsZUtleSxcbiAgVGFibGVUeXBlLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW9QZWVyIH0gZnJvbSAnLi9pby1wZWVyLnRzJztcbmltcG9ydCB7IElvIH0gZnJvbSAnLi9pby50cyc7XG5pbXBvcnQgeyBQZWVyU29ja2V0TW9jayB9IGZyb20gJy4vcGVlci1zb2NrZXQtbW9jay50cyc7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyBhbiBJbyBpbnN0YW5jZSBhbG9uZyB3aXRoIGl0cyBjYXBhYmlsaXRpZXMgYW5kIHByaW9yaXR5LlxuICovXG5leHBvcnQgdHlwZSBJb011bHRpSW8gPSB7XG4gIGlvOiBJbztcbiAgcHJpb3JpdHk6IG51bWJlcjtcbiAgcmVhZDogYm9vbGVhbjtcbiAgd3JpdGU6IGJvb2xlYW47XG4gIGR1bXA6IGJvb2xlYW47XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogTXVsdGkgSW8gaW1wbGVtZW50YXRpb24gdGhhdCBjb21iaW5lcyBtdWx0aXBsZSB1bmRlcmx5aW5nIElvIGluc3RhbmNlc1xuICogd2l0aCBkaWZmZXJlbnQgY2FwYWJpbGl0aWVzIChyZWFkLCB3cml0ZSwgZHVtcCkgYW5kIHByaW9yaXRpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb011bHRpIGltcGxlbWVudHMgSW8ge1xuICBpc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pb3M6IEFycmF5PElvTXVsdGlJbz4pIHt9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKlxuICAgKiBJbml0aWFsaXplcyBhbGwgdW5kZXJseWluZyBJbyBpbnN0YW5jZXMuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgaW9NdWx0aUlvIG9mIHRoaXMuX2lvcykge1xuICAgICAgaWYgKCFpb011bHRpSW8uaW8uaXNPcGVuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQWxsIHVuZGVybHlpbmcgSW8gaW5zdGFuY2VzIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGluaXRpYWxpemluZyBJb011bHRpJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBDbG9zZXMgYWxsIHVuZGVybHlpbmcgSW8gaW5zdGFuY2VzLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5faW9zLm1hcCgoaW9NdWx0aUlvKSA9PiBpb011bHRpSW8uaW8uY2xvc2UoKSkpO1xuXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIGFsbCB1bmRlcmx5aW5nIElvIGluc3RhbmNlcyBhcmUgcmVhZHkuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBpc1JlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuX2lvcy5tYXAoKGlvTXVsdGlJbykgPT4gaW9NdWx0aUlvLmlvLmlzUmVhZHkoKSksXG4gICAgKS50aGVuKCgpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogRHVtcHMgdGhlIGVudGlyZSBkYXRhYmFzZSBjb250ZW50IGJ5IG1lcmdpbmcgZHVtcHMgZnJvbSBhbGwgZHVtcGFibGUgdW5kZXJseWluZyBJbyBpbnN0YW5jZXMuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBkdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgaWYgKHRoaXMuZHVtcGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gZHVtcGFibGUgSW8gYXZhaWxhYmxlJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1bXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0aGlzLmR1bXBhYmxlcy5tYXAoKGR1bXBhYmxlKSA9PiBkdW1wYWJsZS5kdW1wKCkpLFxuICAgICk7XG5cbiAgICByZXR1cm4gbWVyZ2UoLi4uZHVtcHMpIGFzIFJsanNvbjtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogRHVtcHMgYSBzcGVjaWZpYyB0YWJsZSBieSBtZXJnaW5nIGR1bXBzIGZyb20gYWxsIGR1bXBhYmxlIHVuZGVybHlpbmcgSW8gaW5zdGFuY2VzIHRoYXQgY29udGFpbiB0aGUgdGFibGUuXG4gICAqIEBwYXJhbSByZXF1ZXN0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBuYW1lIHRvIGR1bXAuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkdW1wZWQgdGFibGUgZGF0YS5cbiAgICovXG4gIGFzeW5jIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgaWYgKHRoaXMuZHVtcGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gZHVtcGFibGUgSW8gYXZhaWxhYmxlJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1bXBzOiBSbGpzb25bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBkdW1wYWJsZSBvZiB0aGlzLmR1bXBhYmxlcykge1xuICAgICAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCBkdW1wYWJsZS50YWJsZUV4aXN0cyhyZXF1ZXN0LnRhYmxlKTtcbiAgICAgIGlmICh0YWJsZUV4aXN0cykge1xuICAgICAgICBjb25zdCBkdW1wID0gYXdhaXQgZHVtcGFibGUuZHVtcFRhYmxlKHJlcXVlc3QpO1xuICAgICAgICBkdW1wcy5wdXNoKGR1bXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkdW1wcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbWVyZ2UoLi4uZHVtcHMpIGFzIFJsanNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVGFibGUgXCIke3JlcXVlc3QudGFibGV9XCIgbm90IGZvdW5kYCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjb250ZW50IHR5cGUgb2YgYSBzcGVjaWZpYyB0YWJsZSBmcm9tIHRoZSBmaXJzdCB1bmRlcmx5aW5nIHJlYWRhYmxlIElvIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHRhYmxlLlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgdGFibGUgbmFtZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgdGFibGUuXG4gICAqL1xuICBhc3luYyBjb250ZW50VHlwZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGVudFR5cGU+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5yZWFkYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyByZWFkYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWFkYWJsZSBvZiB0aGlzLnJlYWRhYmxlcykge1xuICAgICAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCByZWFkYWJsZS50YWJsZUV4aXN0cyhyZXF1ZXN0LnRhYmxlKTtcbiAgICAgIC8qIHY4IGlnbm9yZSBlbHNlIC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgaWYgKHRhYmxlRXhpc3RzKSB7XG4gICAgICAgIHJldHVybiByZWFkYWJsZS5jb250ZW50VHlwZShyZXF1ZXN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVGFibGUgXCIke3JlcXVlc3QudGFibGV9XCIgbm90IGZvdW5kYCkpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzcGVjaWZpYyB0YWJsZSBleGlzdHMgaW4gYW55IG9mIHRoZSB1bmRlcmx5aW5nIHJlYWRhYmxlIElvIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHRhYmxlS2V5IFRoZSBrZXkgb2YgdGhlIHRhYmxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSB0YWJsZSBleGlzdHMgaW4gYW55IHJlYWRhYmxlIElvLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBhc3luYyB0YWJsZUV4aXN0cyh0YWJsZUtleTogVGFibGVLZXkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5yZWFkYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyByZWFkYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWFkYWJsZSBvZiB0aGlzLnJlYWRhYmxlcykge1xuICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgcmVhZGFibGUudGFibGVFeGlzdHModGFibGVLZXkpO1xuICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBDcmVhdGVzIG9yIGV4dGVuZHMgYSB0YWJsZSBpbiBhbGwgdW5kZXJseWluZyB3cml0YWJsZSBJbyBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSByZXF1ZXN0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB0YWJsZSBoYXMgYmVlbiBjcmVhdGVkIG9yIGV4dGVuZGVkIGluIGFsbCB3cml0YWJsZSBJbyBpbnN0YW5jZXMuXG4gICAqL1xuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy53cml0YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyB3cml0YWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuICAgIC8vQ3JlYXRlIG9yIGV4dGVuZCB0YWJsZSBpbiBhbGwgd3JpdGFibGVzIGluIHBhcmFsbGVsIGFuZCByZXNvbHZlIHdoZW4gYWxsIGhhdmUgY29tcGxldGVkXG4gICAgY29uc3QgY3JlYXRpb25zID0gdGhpcy53cml0YWJsZXMubWFwKCh3cml0YWJsZSkgPT5cbiAgICAgIHdyaXRhYmxlLmNyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdCksXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoY3JlYXRpb25zKS50aGVuKCgpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSByYXcgdGFibGUgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgaGlnaGVzdCBwcmlvcml0eSB1bmRlcmx5aW5nIHJlYWRhYmxlIElvIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiB0YWJsZSBjb25maWd1cmF0aW9ucy5cbiAgICovXG4gIHJhd1RhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5yZWFkYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyByZWFkYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgLy9TaW1wbGUgc3RyYXRlZ3k6IHVzZSB0aGUgaGlnaGVzdCBwcmlvcml0eSByZWFkYWJsZSBJb1xuICAgIGNvbnN0IHJlYWRhYmxlID0gdGhpcy5yZWFkYWJsZXNbMF07XG5cbiAgICByZXR1cm4gcmVhZGFibGUucmF3VGFibGVDZmdzKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFdyaXRlcyBkYXRhIHRvIGFsbCB1bmRlcmx5aW5nIHdyaXRhYmxlIElvIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHJlcXVlc3QgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGF0YSB0byB3cml0ZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRvIGFsbCB3cml0YWJsZSBJbyBpbnN0YW5jZXMuXG4gICAqL1xuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgaWYgKHRoaXMud3JpdGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gd3JpdGFibGUgSW8gYXZhaWxhYmxlJykpO1xuICAgIH1cblxuICAgIC8vIFdyaXRlIHRvIGFsbCB3cml0YWJsZXMgaW4gcGFyYWxsZWwgYW5kIHJlc29sdmUgd2hlbiBhbGwgaGF2ZSBjb21wbGV0ZWRcbiAgICBjb25zdCB3cml0ZXMgPSB0aGlzLndyaXRhYmxlcy5tYXAoKHdyaXRhYmxlKSA9PiB3cml0YWJsZS53cml0ZShyZXF1ZXN0KSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHdyaXRlcykudGhlbigoKSA9PiBQcm9taXNlLnJlc29sdmUoKSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFJlYWRzIHJvd3MgZnJvbSB0aGUgZmlyc3QgdW5kZXJseWluZyByZWFkYWJsZSBJbyBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgdGFibGUgYW5kIGhhcyBtYXRjaGluZyByb3dzLlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgdGFibGUgbmFtZSBhbmQgd2hlcmUgY2xhdXNlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVhZCByb3dzLlxuICAgKi9cbiAgYXN5bmMgcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIHwgbnVsbCB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5yZWFkYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyByZWFkYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgbGV0IHRhYmxlRXhpc3RzQW55ID0gZmFsc2U7XG4gICAgY29uc3Qgcm93czogUmxqc29uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJlYWRhYmxlIG9mIHRoaXMucmVhZGFibGVzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0YWJsZSBleGlzdHMgaW4gdGhpcyByZWFkYWJsZSBJb1xuICAgICAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCByZWFkYWJsZS50YWJsZUV4aXN0cyhyZXF1ZXN0LnRhYmxlKTtcbiAgICAgIHRhYmxlRXhpc3RzQW55ID0gdGFibGVFeGlzdHNBbnkgfHwgdGFibGVFeGlzdHM7XG5cbiAgICAgIGlmICh0YWJsZUV4aXN0cykge1xuICAgICAgICAvLyBSZWFkIHJvd3MgZnJvbSB0aGlzIHJlYWRhYmxlIElvXG4gICAgICAgIGNvbnN0IHJlYWRSb3dzID0gYXdhaXQgcmVhZGFibGUucmVhZFJvd3MocmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IHRhYmxlRGF0YTogVGFibGVUeXBlID0gcmVhZFJvd3NbcmVxdWVzdC50YWJsZV07XG4gICAgICAgIC8qIHY4IGlnbm9yZSBlbHNlIC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgICBpZiAodGFibGVEYXRhKSB7XG4gICAgICAgICAgcm93cy5wdXNoKHJlYWRSb3dzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGFibGVFeGlzdHNBbnkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFRhYmxlIFwiJHtyZXF1ZXN0LnRhYmxlfVwiIG5vdCBmb3VuZGApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1lcmdlKC4uLnJvd3MpIGFzIFJsanNvbjtcbiAgICB9XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcm93IGNvdW50IG9mIGEgc3BlY2lmaWMgdGFibGUgYnkgYWdncmVnYXRpbmcgcm93IGNvdW50cyBmcm9tIGFsbCBkdW1wYWJsZSB1bmRlcmx5aW5nIElvIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHRhYmxlIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJvdyBjb3VudCBvZiB0aGUgdGFibGUuXG4gICAqL1xuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5kdW1wYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBkdW1wYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZHVtcFRhYmxlID0gYXdhaXQgdGhpcy5kdW1wVGFibGUoeyB0YWJsZSB9KTtcbiAgICBjb25zdCB0YWJsZURhdGE6IFRhYmxlVHlwZSA9IGR1bXBUYWJsZVt0YWJsZV07XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgaWYgKCF0YWJsZURhdGEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFibGVEYXRhLl9kYXRhLmxlbmd0aCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgdW5kZXJseWluZyByZWFkYWJsZSBJbyBpbnN0YW5jZXMsIHNvcnRlZCBieSBwcmlvcml0eS5cbiAgICovXG4gIGdldCByZWFkYWJsZXMoKTogQXJyYXk8SW8+IHtcbiAgICByZXR1cm4gdGhpcy5faW9zXG4gICAgICAuZmlsdGVyKChpb011bHRpSW8pID0+IGlvTXVsdGlJby5yZWFkKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxuICAgICAgLm1hcCgoaW9NdWx0aUlvKSA9PiBpb011bHRpSW8uaW8pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHVuZGVybHlpbmcgd3JpdGFibGUgSW8gaW5zdGFuY2VzLCBzb3J0ZWQgYnkgcHJpb3JpdHkuXG4gICAqL1xuICBnZXQgd3JpdGFibGVzKCk6IEFycmF5PElvPiB7XG4gICAgcmV0dXJuIHRoaXMuX2lvc1xuICAgICAgLmZpbHRlcigoaW9NdWx0aUlvKSA9PiBpb011bHRpSW8ud3JpdGUpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHkpXG4gICAgICAubWFwKChpb011bHRpSW8pID0+IGlvTXVsdGlJby5pbyk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgdW5kZXJseWluZyBkdW1wYWJsZSBJbyBpbnN0YW5jZXMsIHNvcnRlZCBieSBwcmlvcml0eS5cbiAgICovXG4gIGdldCBkdW1wYWJsZXMoKTogQXJyYXk8SW8+IHtcbiAgICByZXR1cm4gdGhpcy5faW9zXG4gICAgICAuZmlsdGVyKChpb011bHRpSW8pID0+IGlvTXVsdGlJby5kdW1wKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxuICAgICAgLm1hcCgoaW9NdWx0aUlvKSA9PiBpb011bHRpSW8uaW8pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlvUGVlck1lbSA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpb1BlZXJNZW0uaW5pdCgpO1xuXG4gICAgY29uc3QgaW9QZWVyU29ja2V0ID0gbmV3IFBlZXJTb2NrZXRNb2NrKGlvUGVlck1lbSk7XG4gICAgY29uc3QgaW9QZWVyID0gbmV3IElvUGVlcihpb1BlZXJTb2NrZXQpO1xuICAgIGF3YWl0IGlvUGVlci5pbml0KCk7XG5cbiAgICBjb25zdCBpb01lbSA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpb01lbS5pbml0KCk7XG5cbiAgICBjb25zdCBpb3M6IEFycmF5PElvTXVsdGlJbz4gPSBbXG4gICAgICB7IGlvOiBpb1BlZXIsIHByaW9yaXR5OiAxLCByZWFkOiB0cnVlLCB3cml0ZTogZmFsc2UsIGR1bXA6IGZhbHNlIH0sXG4gICAgICB7IGlvOiBpb01lbSwgcHJpb3JpdHk6IDAsIHJlYWQ6IHRydWUsIHdyaXRlOiB0cnVlLCBkdW1wOiB0cnVlIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IGlvTXVsdGkgPSBuZXcgSW9NdWx0aShpb3MpO1xuICAgIGF3YWl0IGlvTXVsdGkuaW5pdCgpO1xuXG4gICAgcmV0dXJuIGlvTXVsdGk7XG4gIH07XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSW8sIElvTWVtIH0gZnJvbSAnLi9pbmRleC50cyc7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIElvIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGJlIHVzZWQgaW5cbiAqIGNvbmZvcm1hbmNlIHRlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElvVGVzdFNldHVwIHtcbiAgLyoqIHNldHVwIGJlZm9yZSB0aGUgc2luZ2xlIHNldHVwcyAqL1xuICBiZWZvcmVBbGw6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgYmVmb3JlRWFjaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGVhcnMgZG93biB0aGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIGFmdGVyRWFjaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKiogY2xlYW51cCBhZnRlciBhbGwgdGVzdHMgKi9cbiAgYWZ0ZXJBbGw6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBpbyBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIGluIHRoZSBjb25mb3JtYW5jZSB0ZXN0cy5cbiAgICovXG4gIGlvOiBJbztcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8vIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIElvVGVzdFNldHVwIGludGVyZmFjZVxuZXhwb3J0IGNvbnN0IGV4YW1wbGVUZXN0U2V0dXAgPSAoKTogSW9UZXN0U2V0dXAgPT4ge1xuICByZXR1cm4ge1xuICAgIGlvOiBuZXcgSW9NZW0oKSxcbiAgICBiZWZvcmVBbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhbnkgYWRkaXRpb25hbCBzZXR1cCByZXF1aXJlZCBiZWZvcmUgaW5pdC5cbiAgICAgIC8vIEN1cnJlbnRseSwgaXQgZG9lcyBub3RoaW5nLlxuICAgIH0sXG5cbiAgICBiZWZvcmVFYWNoOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBpbyBpbXBsZW1lbnRhdGlvblxuICAgIH0sXG4gICAgYWZ0ZXJFYWNoOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBUZWFyIGRvd24gdGhlIGlvIGltcGxlbWVudGF0aW9uXG4gICAgfSxcblxuICAgIGFmdGVyQWxsOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgYW55IGFkZGl0aW9uYWwgY2xlYW51cCBhZnRlciB0ZWFyRG93bi5cbiAgICB9LFxuICB9O1xufTtcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHsgQ29udGVudFR5cGUsIFJsanNvbiwgVGFibGVDZmcsIFRhYmxlS2V5IH0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgaW50ZXJmYWNlIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcblxuICAvKiogU3RhcnRzIHRoZSBpbml0aWFsaXphdGlvbiAqL1xuICBpbml0KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqIENsb3NlcyB0aGUgaW8gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogUmV0dXJucyB0cnVlIGlmIGlvIGlzIG9wZW5lZCAqL1xuICBpc09wZW46IGJvb2xlYW47XG5cbiAgLyoqIEEgcHJvbWlzZSByZXNvbHZpbmcgb25jZSB0aGUgSW8gaW50ZXJmYWNlIGlzIHJlYWR5XG4gICAqXG4gICAqIPCfkqEgVXNlIEBybGpzb24vaXMtcmVhZHlcbiAgICovXG4gIGlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gRHVtcFxuXG4gIC8qKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSBkYiBjb250ZW50IGFzIFJsanNvbiAqL1xuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPjtcblxuICAvKiogUmV0dXJucyB0aGUgZHVtcCBvZiBhIGNvbXBsZXRlIHRhYmxlICovXG4gIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gTWV0YSBEYXRhXG4gIGNvbnRlbnRUeXBlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxDb250ZW50VHlwZT47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlc1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhYmxlIGV4aXN0c1xuICAgKi9cbiAgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggYSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbmV3IGNvbHVtbnMgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyB0YWJsZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgY29sdW1ucyBhcmUgcmVtb3ZlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCB0aGUgY29sdW1uIHR5cGUgaXMgY2hhbmdlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGpzb24gc3RydWN0dXJlIHJldHVybmluZyBjdXJyZW50IHRhYmxlIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByYXdUYWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICAvKiogV3JpdGVzIFJsanNvbiBkYXRhIGludG8gdGhlIGRhdGFiYXNlICovXG4gIHdyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBSZWFkIHJvd3NcblxuICAvKiogUXVlcmllcyBhIGxpc3Qgb2Ygcm93cyAqL1xuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfCBudWxsIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBnaXZlbiB0YWJsZSAqL1xuICByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuZXhwb3J0IGNvbnN0IGV4YW1wbGVJbyA9XG4gICdDaGVja291dCBAcmxqc29uL2lvLW1lbSBmb3IgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbic7XG4iLCIvKiB2OCBpZ25vcmUgZmlsZSAtLSBAcHJlc2VydmUgKi9cbi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIEJ1ZmZldCxcbiAgQ2FrZSxcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIExheWVyLFxuICBSZWYsXG4gIFJsanNvbixcbiAgVGFibGVLZXksXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIGEgcm93IHRoYXQgcmVmZXJlbmNlcyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IHRhYmxlIHRoYXQgcmVmZXJlbmNlcyB0aGUgY2hpbGQgdGFibGVcbiAgICovXG4gIFtwYXJlbnRUYWJsZTogVGFibGVLZXldOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcmVudCByb3cgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCByb3dcbiAgICAgKi9cbiAgICBbcGFyZW50Um93OiBSZWZdOiB7XG4gICAgICAvKipcbiAgICAgICAqIERldGFpbHMgYWJvdXQgdGhlIHJlZmVyZW5jZSwgZS5nLiBhbiBhcnJheSBpbmRleCBldGMuXG4gICAgICAgKi9cbiAgICAgIGRldGFpbHM/OiBKc29uO1xuICAgIH07XG4gIH07XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcGFyZW50IHRhYmxlIHJvd3MgcmVmZXJlbmNpbmcgYSBjaGlsZCB0YWJsZSByb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZlcnNlUmVmcyB7XG4gIC8qKlxuICAgKiBUaGUgY2hpbGQgdGFibGUgd2UgbmVlZCB0aGUgcmVmZXJlbmNpbmcgcm93cyBmb3JcbiAgICovXG4gIFtjaGlsZFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IGhhc2h3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgICAqL1xuICAgIFtjaGlsZFJvdzogUmVmXTogUGFyZW50UmVmO1xuICB9O1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgKi9cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcmV2ZXJzZSByZWZlcmVuY2VzIGZvciBhIGdpdmVuIHJsanNvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGNhbGNSZXZlcnNlUmVmcyA9IChybGpzb246IFJsanNvbik6IFJldmVyc2VSZWZzID0+IHtcbiAgY29uc3QgcmVzdWx0OiBSZXZlcnNlUmVmcyA9IHt9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUHJlcGFyZSBkYXRhIHN0cnVjdHVyZVxuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChjaGlsZFRhYmxlS2V5LCB0YWJsZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkVGFibGU6IHsgW2NoaWxkUm93SGFzaDogc3RyaW5nXTogUGFyZW50UmVmIH0gPSB7fTtcbiAgICByZXN1bHRbY2hpbGRUYWJsZUtleV0gPSBjaGlsZFRhYmxlO1xuICAgIGZvciAoY29uc3QgY2hpbGRSb3cgb2YgdGFibGUuX2RhdGEpIHtcbiAgICAgIGNoaWxkVGFibGVbY2hpbGRSb3cuX2hhc2hdID0ge307XG4gICAgfVxuICB9KTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYXRlIHJldmVyc2UgcmVmZXJlbmNlc1xuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGUpID0+IHtcbiAgICAvLyBJdGVyYXRlIGFsbCByb3dzIG9mIGVhY2ggdGFibGVcbiAgICBmb3IgKGNvbnN0IHBhcmVudFRhYmxlUm93IG9mIHBhcmVudFRhYmxlLl9kYXRhKSB7XG4gICAgICAvLyBGaW5kIG91dCB3aGUgb3RoZXIgdGFibGVzICYgcm93cyBhcmUgcmVmZXJlbmNlZCBieSB0aGlzIHJvd1xuICAgICAgLy8gV3JpdGUgdGhlc2UgaW5mb3JtYXRpb24gaW50dG8gcmVzdWx0XG4gICAgICBzd2l0Y2ggKHBhcmVudFRhYmxlLl90eXBlKSB7XG4gICAgICAgIGNhc2UgJ2NvbXBvbmVudHMnOlxuICAgICAgICAgIF93cml0ZUNvbXBvbmVudFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2xheWVycyc6IHtcbiAgICAgICAgICBfd3JpdGVMYXllclJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xpY2VJZHMnOiB7XG4gICAgICAgICAgLy8gU2xpY2UgaWRzIGRvIG5vdCByZWZlcmVuY2Ugb3RoZXIgdGFibGVzXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdjYWtlcyc6IHtcbiAgICAgICAgICBfd3JpdGVDYWtlUmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdidWZmZXRzJzoge1xuICAgICAgICAgIF93cml0ZUJ1ZmZldFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogdjggaWdub3JlIGVuZCAqL1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQ29tcG9uZW50UmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBKc29uLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgcGFyZW50Q29sdW1uTmFtZSBpbiBwYXJlbnRSb3cpIHtcbiAgICBpZiAocGFyZW50Q29sdW1uTmFtZS5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50Q29sdW1uTmFtZS5lbmRzV2l0aCgnUmVmJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Q29sdW1uTmFtZS5zbGljZSgwLCAtMyk7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gcGFyZW50Um93W3BhcmVudENvbHVtbk5hbWVdIGFzIHN0cmluZztcblxuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlTGF5ZXJSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IExheWVyLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Um93LmNvbXBvbmVudHNUYWJsZTtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBzbGljZUlkIGluIHBhcmVudFJvdy5hZGQpIHtcbiAgICBpZiAoc2xpY2VJZC5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNsaWNlSGFzaCA9IHBhcmVudFJvdy5hZGRbc2xpY2VJZF0gYXMgc3RyaW5nO1xuXG4gICAgX3dyaXRlKHJlc3VsdCwgY2hpbGRUYWJsZU5hbWUsIHNsaWNlSGFzaCwgcGFyZW50VGFibGVOYW1lLCBwYXJlbnRSb3dIYXNoKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUNha2VSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IENha2UsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBsYXllciBpbiBwYXJlbnRSb3cubGF5ZXJzKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBsYXllcjtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3cubGF5ZXJzW2xheWVyXSBhcyBzdHJpbmc7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVCdWZmZXRSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IEJ1ZmZldCxcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50Um93Lml0ZW1zKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBpdGVtLnRhYmxlO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IGl0ZW0ucmVmO1xuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlID0gKFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuICBjaGlsZFRhYmxlTmFtZTogc3RyaW5nLFxuICBjaGlsZFJvd0hhc2g6IHN0cmluZyxcbiAgcGFyZW50VGFibGVOYW1lOiBzdHJpbmcsXG4gIHBhcmVudFJvd0hhc2g6IHN0cmluZyxcbikgPT4ge1xuICBjb25zdCByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZSA9IChyZXN1bHRbY2hpbGRUYWJsZU5hbWVdID8/PSB7fSk7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93ID0gKHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlW2NoaWxkUm93SGFzaF0gPz89XG4gICAge30pO1xuXG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV0gPz89IHt9O1xuICByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvd1twYXJlbnRUYWJsZU5hbWVdW3BhcmVudFJvd0hhc2hdID8/PSB7fTtcbn07XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cbi8qIHY4IGlnbm9yZSBmaWxlIC0tIEBwcmVzZXJ2ZSAqL1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQudHMnO1xuXG5leHBvcnQgY2xhc3MgU29ja2V0TW9jayBpbXBsZW1lbnRzIFNvY2tldCB7XG4gIHB1YmxpYyBjb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGRpc2Nvbm5lY3RlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBNYXA8c3RyaW5nIHwgc3ltYm9sLCBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+PiA9XG4gICAgbmV3IE1hcCgpO1xuICBwcml2YXRlIF9vbmNlTGlzdGVuZXJzOiBNYXA8XG4gICAgc3RyaW5nIHwgc3ltYm9sLFxuICAgIEFycmF5PCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD5cbiAgPiA9IG5ldyBNYXAoKTtcblxuICBjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGlzY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnKTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZW1pdCgnZGlzY29ubmVjdCcpO1xuICAgIH1cbiAgfVxuXG4gIG9uKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBbXSk7XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnROYW1lKSEucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvbmNlKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLl9vbmNlTGlzdGVuZXJzLmhhcyhldmVudE5hbWUpKSB7XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLnNldChldmVudE5hbWUsIFtdKTtcbiAgICB9XG4gICAgdGhpcy5fb25jZUxpc3RlbmVycy5nZXQoZXZlbnROYW1lKSEucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvZmYoZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIGxpc3RlbmVyPzogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAvLyBSZW1vdmUgc3BlY2lmaWMgbGlzdGVuZXJcbiAgICAgIGNvbnN0IHJlZ3VsYXJMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICBpZiAocmVndWxhckxpc3RlbmVycykge1xuICAgICAgICBjb25zdCBpbmRleCA9IHJlZ3VsYXJMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgcmVndWxhckxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uY2VMaXN0ZW5lcnMgPSB0aGlzLl9vbmNlTGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgaWYgKG9uY2VMaXN0ZW5lcnMpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBvbmNlTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIG9uY2VMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1vdmUgYWxsIGxpc3RlbmVycyBmb3IgdGhlIGV2ZW50XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGVtaXQoZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc0xpc3RlbmVycyA9IGZhbHNlO1xuXG4gICAgLy8gRW1pdCB0byByZWd1bGFyIGxpc3RlbmVyc1xuICAgIGNvbnN0IHJlZ3VsYXJMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgaWYgKHJlZ3VsYXJMaXN0ZW5lcnMgJiYgcmVndWxhckxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBoYXNMaXN0ZW5lcnMgPSB0cnVlO1xuICAgICAgLy8gQ3JlYXRlIGEgY29weSB0byBhdm9pZCBpc3N1ZXMgaWYgbGlzdGVuZXJzIGFyZSByZW1vdmVkIGR1cmluZyBlbWlzc2lvblxuICAgICAgWy4uLnJlZ3VsYXJMaXN0ZW5lcnNdLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGlzdGVuZXIoLi4uYXJncyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSW4gYSByZWFsIEV2ZW50RW1pdHRlciwgdGhpcyB3b3VsZCBiZSBoYW5kbGVkIGRpZmZlcmVudGx5XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBFcnJvciBpbiBsaXN0ZW5lciBmb3IgZXZlbnQgJHtTdHJpbmcoZXZlbnROYW1lKX06YCxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVtaXQgdG8gb25jZSBsaXN0ZW5lcnMgYW5kIHJlbW92ZSB0aGVtXG4gICAgY29uc3Qgb25jZUxpc3RlbmVycyA9IHRoaXMuX29uY2VMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgaWYgKG9uY2VMaXN0ZW5lcnMgJiYgb25jZUxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBoYXNMaXN0ZW5lcnMgPSB0cnVlO1xuICAgICAgLy8gQ3JlYXRlIGEgY29weSBhbmQgY2xlYXIgdGhlIG9yaWdpbmFsIGFycmF5XG4gICAgICBjb25zdCBsaXN0ZW5lcnNUb0NhbGwgPSBbLi4ub25jZUxpc3RlbmVyc107XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuXG4gICAgICBsaXN0ZW5lcnNUb0NhbGwuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsaXN0ZW5lciguLi5hcmdzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEVycm9yIGluIG9uY2UgbGlzdGVuZXIgZm9yIGV2ZW50ICR7U3RyaW5nKGV2ZW50TmFtZSl9OmAsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFzTGlzdGVuZXJzO1xuICB9XG5cbiAgcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50TmFtZT86IHN0cmluZyB8IHN5bWJvbCk6IHRoaXMge1xuICAgIGlmIChldmVudE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgdGhpcy5fb25jZUxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJDb3VudChldmVudE5hbWU6IHN0cmluZyB8IHN5bWJvbCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVndWxhckNvdW50ID0gdGhpcy5fbGlzdGVuZXJzLmdldChldmVudE5hbWUpPy5sZW5ndGggfHwgMDtcbiAgICBjb25zdCBvbmNlQ291bnQgPSB0aGlzLl9vbmNlTGlzdGVuZXJzLmdldChldmVudE5hbWUpPy5sZW5ndGggfHwgMDtcbiAgICByZXR1cm4gcmVndWxhckNvdW50ICsgb25jZUNvdW50O1xuICB9XG5cbiAgbGlzdGVuZXJzKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sKTogQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiB7XG4gICAgY29uc3QgcmVndWxhckxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnROYW1lKSB8fCBbXTtcbiAgICBjb25zdCBvbmNlTGlzdGVuZXJzID0gdGhpcy5fb25jZUxpc3RlbmVycy5nZXQoZXZlbnROYW1lKSB8fCBbXTtcbiAgICByZXR1cm4gWy4uLnJlZ3VsYXJMaXN0ZW5lcnMsIC4uLm9uY2VMaXN0ZW5lcnNdO1xuICB9XG5cbiAgZXZlbnROYW1lcygpOiBBcnJheTxzdHJpbmcgfCBzeW1ib2w+IHtcbiAgICBjb25zdCBhbGxFdmVudHMgPSBuZXcgU2V0KFtcbiAgICAgIC4uLnRoaXMuX2xpc3RlbmVycy5rZXlzKCksXG4gICAgICAuLi50aGlzLl9vbmNlTGlzdGVuZXJzLmtleXMoKSxcbiAgICBdKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhbGxFdmVudHMpO1xuICB9XG5cbiAgLy8gVGVzdCBoZWxwZXIgbWV0aG9kc1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICB9XG5cbiAgc2ltdWxhdGVFcnJvcihlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICB9XG5cbiAgc2ltdWxhdGVNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICB9XG5cbiAgLy8gR2V0IGludGVybmFsIHN0YXRlIGZvciB0ZXN0aW5nXG4gIGdldExpc3RlbmVycygpOiBNYXA8c3RyaW5nIHwgc3ltYm9sLCBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+PiB7XG4gICAgcmV0dXJuIG5ldyBNYXAodGhpcy5fbGlzdGVuZXJzKTtcbiAgfVxuXG4gIGdldE9uY2VMaXN0ZW5lcnMoKTogTWFwPHN0cmluZyB8IHN5bWJvbCwgQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPj4ge1xuICAgIHJldHVybiBuZXcgTWFwKHRoaXMuX29uY2VMaXN0ZW5lcnMpO1xuICB9XG59XG5cbi8vIC4uLmV4aXN0aW5nIGNvZGUuLi5cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG4vL0ludGVyZmFjZSBmb3IgYSBnZW5lcmljIFNvY2tldCwgc2ltaWxhciB0byBOb2RlLmpzIEV2ZW50RW1pdHRlclxuLy9UaGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIGFuZCBtYXkgbm90IGNvdmVyIGFsbCBmZWF0dXJlcyBvZiBhIGZ1bGwgRXZlbnRFbWl0dGVyXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldCB7XG4gIGNvbm5lY3RlZDogYm9vbGVhbjtcbiAgZGlzY29ubmVjdGVkOiBib29sZWFuO1xuICBjb25uZWN0KCk6IHZvaWQ7XG4gIGRpc2Nvbm5lY3QoKTogdm9pZDtcbiAgb24oZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzO1xuICBlbWl0KGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBzb2NrZXRFeGFtcGxlID0gKCk6IFNvY2tldCA9PiAoe1xuICBjb25uZWN0ZWQ6IGZhbHNlLFxuICBkaXNjb25uZWN0ZWQ6IHRydWUsXG4gIGNvbm5lY3QoKSB7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdjb25uZWN0Jyk7XG4gIH0sXG4gIGRpc2Nvbm5lY3QoKSB7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KCdkaXNjb25uZWN0Jyk7XG4gIH0sXG4gIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEBwcmVzZXJ2ZSAqL1xuICBvbigpIHtcbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBldmVudCBsaXN0ZW5lciByZWdpc3RyYXRpb25cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gIGVtaXQoKSB7XG4gICAgLy8gSW1wbGVtZW50YXRpb24gb2YgZXZlbnQgZW1pc3Npb25cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbn0pO1xuIl0sIm5hbWVzIjpbImUiXSwibWFwcGluZ3MiOiI7Ozs7QUFNTyxNQUFNLGdCQUFnQjtBQUFBO0FBQUEsRUFFcEIsbUJBQTJCO0FBQUEsRUFDM0IsY0FBc0I7QUFBQSxFQUN0QixhQUFxQjtBQUFBLEVBQ3JCLFlBQW9CO0FBQUE7QUFBQSxFQUdwQixhQUF3QztBQUFBLElBQzdDLE1BQU07QUFBQSxJQUNOLFVBQVU7QUFBQSxFQUFBO0FBQUE7QUFBQSxFQUlKLFVBQXFDO0FBQUEsSUFDM0MsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQyxRQUFRLE1BQWMsS0FBcUI7QUFDakQsV0FBTyxLQUFLLFNBQVMsR0FBRyxJQUFJLE9BQU8sT0FBTztBQUFBLEVBQzVDO0FBQUEsRUFFTyxlQUFlLE1BQXNCO0FBQzFDLFdBQU8sS0FBSyxRQUFRLE1BQU0sS0FBSyxRQUFRLEdBQUc7QUFBQSxFQUM1QztBQUFBLEVBRU8sZ0JBQWdCLE1BQXNCO0FBQzNDLFdBQU8sS0FBSyxRQUFRLE1BQU0sS0FBSyxRQUFRLEdBQUc7QUFBQSxFQUM1QztBQUFBLEVBRU8sYUFBYSxNQUFzQjtBQUN4QyxXQUFPLEtBQUssUUFBUSxNQUFNLEtBQUssUUFBUSxHQUFHO0FBQUEsRUFDNUM7QUFBQSxFQUVRLFdBQVcsTUFBYyxLQUFxQjtBQUNwRCxXQUFPLEtBQUssU0FBUyxHQUFHLElBQUksS0FBSyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sSUFBSTtBQUFBLEVBQzNEO0FBQUEsRUFFTyxr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
|
|
1719
|
+
//# sourceMappingURL=io.js.map
|