badmfck-api-server 2.7.9 → 2.8.0
Sign up to get free protection for your applications and to get access to all the features.
@@ -29,6 +29,7 @@ export declare class MysqlAdapter implements IDBAdapter {
|
|
29
29
|
failReportFileStreamName: string | null;
|
30
30
|
failReportLastAccessTime: number;
|
31
31
|
poolConnections: number;
|
32
|
+
acquiredPoolConnections: number;
|
32
33
|
constructor(options: DBAdapterOptions);
|
33
34
|
init(): Promise<void>;
|
34
35
|
setupTimers(): void;
|
@@ -27,6 +27,7 @@ class MysqlAdapter {
|
|
27
27
|
failReportFileStreamName = null;
|
28
28
|
failReportLastAccessTime = 0;
|
29
29
|
poolConnections = 0;
|
30
|
+
acquiredPoolConnections = 0;
|
30
31
|
constructor(options) {
|
31
32
|
this.options = options;
|
32
33
|
if (this.options.host.startsWith("_"))
|
@@ -78,11 +79,8 @@ class MysqlAdapter {
|
|
78
79
|
if (Date.now() - this.lastSuccessQueryTime > this.pingInterval) {
|
79
80
|
if (!this.pool)
|
80
81
|
return;
|
81
|
-
for (let i = 0; i < this.options.connectionLimit; i++)
|
82
|
+
for (let i = 0; i < this.options.connectionLimit; i++)
|
82
83
|
this.query({ query: "SELECT 1 @NOLIMIT" });
|
83
|
-
if (this.options.debug)
|
84
|
-
console.log("Ping mysql on each connection in pool");
|
85
|
-
}
|
86
84
|
}
|
87
85
|
}, 1000 * 30);
|
88
86
|
setInterval(() => {
|
@@ -126,13 +124,19 @@ class MysqlAdapter {
|
|
126
124
|
(0, LogService_1.logCrit)("MysqlAdapter", "Can't connect to MYSQL! " + e);
|
127
125
|
return false;
|
128
126
|
}
|
127
|
+
this.poolConnections = 0;
|
128
|
+
this.acquiredPoolConnections = 0;
|
129
129
|
this.pool?.on('connection', (connection) => {
|
130
130
|
if (this.options.debug)
|
131
131
|
(0, LogService_1.logInfo)("MysqlAdapter", "pool -> connection created, total:" + this.poolConnections++);
|
132
132
|
});
|
133
133
|
this.pool?.on('acquire', (connection) => {
|
134
|
+
if (this.options.debug)
|
135
|
+
(0, LogService_1.logInfo)("MysqlAdapter", "pool -> connection acquire, total:" + this.acquiredPoolConnections++);
|
134
136
|
});
|
135
137
|
this.pool?.on('release', (connection) => {
|
138
|
+
if (this.options.debug)
|
139
|
+
(0, LogService_1.logInfo)("MysqlAdapter", "pool -> connection release, total:" + this.acquiredPoolConnections--);
|
136
140
|
});
|
137
141
|
this.pool?.on('enqueue', () => {
|
138
142
|
if (this.options.debug)
|
@@ -140,28 +144,17 @@ class MysqlAdapter {
|
|
140
144
|
});
|
141
145
|
if (this.options.debug)
|
142
146
|
console.log("Check mysql connection");
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
(0, LogService_1.logInfo)("MysqlAdapter", "Connected to MYSQL!");
|
150
|
-
resolve(true);
|
151
|
-
}
|
152
|
-
else
|
153
|
-
resolve(false);
|
154
|
-
}
|
155
|
-
catch (e) {
|
156
|
-
(0, LogService_1.logCrit)("MysqlAdapter", "Can't connect to MYSQL! " + e);
|
157
|
-
resolve(false);
|
158
|
-
}
|
159
|
-
});
|
147
|
+
const res = await this.query({ query: "SELECT 1 @NOLIMIT" });
|
148
|
+
if (res.error) {
|
149
|
+
(0, LogService_1.logCrit)("MysqlAdapter", "pool -> check connection livenes was failed: " + res.error.message);
|
150
|
+
return false;
|
151
|
+
}
|
152
|
+
return true;
|
160
153
|
}
|
161
154
|
async query(request) {
|
162
155
|
const query = this.prepareQuery(request);
|
163
156
|
if (!this.pool) {
|
164
|
-
(0, LogService_1.logError)("${MysqlAdapter.js}", "No pool");
|
157
|
+
(0, LogService_1.logError)("${MysqlAdapter.js}", "No pool created, can't execute query");
|
165
158
|
const error = {
|
166
159
|
code: "NO_POOL",
|
167
160
|
errno: 100000,
|
@@ -209,7 +202,8 @@ class MysqlAdapter {
|
|
209
202
|
if (this.options.debug)
|
210
203
|
(0, LogService_1.logInfo)("Execute query:", query);
|
211
204
|
const result = await conn.query(query);
|
212
|
-
|
205
|
+
console.log(result);
|
206
|
+
if (!request.transactionID)
|
213
207
|
this.finalizeConnection(conn);
|
214
208
|
return {
|
215
209
|
data: result[0],
|
@@ -217,8 +211,12 @@ class MysqlAdapter {
|
|
217
211
|
};
|
218
212
|
}
|
219
213
|
catch (e) {
|
220
|
-
if (request.transactionID)
|
214
|
+
if (!request.transactionID)
|
221
215
|
this.finalizeConnection(conn);
|
216
|
+
if (request.transactionID && request.throwable) {
|
217
|
+
this.rollbackTransaction(this.transactions.find(i => i.id === request.transactionID));
|
218
|
+
this.finalizeConnection(conn);
|
219
|
+
}
|
222
220
|
const error = this.createMysqlQueryError(e);
|
223
221
|
if (request.throwable)
|
224
222
|
throw { ...DefaultErrors_1.default.DB_ERROR, details: error.message, stack: error };
|
@@ -250,6 +248,8 @@ class MysqlAdapter {
|
|
250
248
|
try {
|
251
249
|
conn.release();
|
252
250
|
conn.removeAllListeners();
|
251
|
+
if (this.options.debug)
|
252
|
+
console.log("Release connection: ", conn.threadId);
|
253
253
|
}
|
254
254
|
catch (e) {
|
255
255
|
(0, LogService_1.logCrit)("MysqlAdapter", `Can't release connection: ${e}`);
|
@@ -468,4 +468,4 @@ const decrypt = (encrypted) => {
|
|
468
468
|
return null;
|
469
469
|
}
|
470
470
|
};
|
471
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXlzcWxBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaVNlcnZlci9kYi9NeXNxbEFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsNkRBQW1DO0FBQ25DLDRDQUFvQjtBQUNwQiw4Q0FBMkQ7QUFDM0QsZ0ZBQXdEO0FBQ3hELGdEQUF3QjtBQUN4QixtQ0FBc0Q7QUFVdEQsTUFBYSxZQUFZO0lBQ3JCLE9BQU8sQ0FBa0I7SUFDekIsY0FBYyxHQUFTLEtBQUssQ0FBQztJQUU3QixtQkFBbUIsR0FBQyxJQUFJLEdBQUMsQ0FBQyxDQUFDO0lBQzNCLFlBQVksR0FBQyxLQUFLLENBQUM7SUFDbkIsSUFBSSxHQUFpQixJQUFJLENBQUM7SUFDMUIsU0FBUyxDQUFJO0lBRWIsT0FBTyxHQUFDLEVBQUUsQ0FBQztJQUNYLE1BQU0sQ0FBQyxpQkFBaUIsR0FBQyxDQUFDLENBQUM7SUFDM0IsWUFBWSxHQUFnQixFQUFFLENBQUE7SUFFOUIsc0JBQXNCLEdBQUcsSUFBSSxHQUFDLEVBQUUsR0FBQyxDQUFDLENBQUM7SUFDbkMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLFlBQVksR0FBRyxJQUFJLEdBQUMsRUFBRSxHQUFDLENBQUMsQ0FBQztJQUV6QixvQkFBb0IsR0FBcUIsSUFBSSxDQUFDO0lBQzlDLHdCQUF3QixHQUFhLElBQUksQ0FBQztJQUMxQyx3QkFBd0IsR0FBUSxDQUFDLENBQUM7SUFFbEMsZUFBZSxHQUFRLENBQUMsQ0FBQztJQUV6QixZQUFZLE9BQXdCO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUMsT0FBTyxDQUFDO1FBR3BCLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxD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QUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzdELFNBQVMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sU0FBUyxDQUFDO0tBQ3BCO0lBQUEsT0FBTSxDQUFDLEVBQUM7UUFDTCxPQUFPLElBQUksQ0FBQztLQUNmO0FBQ0gsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREJBZGFwdGVyT3B0aW9ucywgSURCRXJyb3IsIElEQlF1ZXJ5LCBJREJRdWVyeUZpZWxkLCBJREJSZXN1bHQgfSBmcm9tIFwiLi4vREJTZXJ2aWNlXCI7XG5pbXBvcnQgeyBJREJBZGFwdGVyLCB9IGZyb20gXCIuL0lEQkFkYXB0ZXJcIjtcbmltcG9ydCBteXNxbCBmcm9tICdteXNxbDIvcHJvbWlzZSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgbG9nSW5mbywgbG9nQ3JpdCwgbG9nRXJyb3IgfSBmcm9tIFwiLi4vTG9nU2VydmljZVwiO1xuaW1wb3J0IERlZmF1bHRFcnJvcnMgZnJvbSBcIi4uL3N0cnVjdHVyZXMvRGVmYXVsdEVycm9yc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGNyZWF0ZUhhc2gsIGNyZWF0ZURlY2lwaGVyaXYgfSBmcm9tIFwiY3J5cHRvXCI7XG5cbmludGVyZmFjZSBJVHJhbnNhY3Rpb257XG4gICAgaWQ6bnVtYmVyXG4gICAgdGltZXN0YW1wOm51bWJlcixcbiAgICBjb25uOm15c3FsLlBvb2xDb25uZWN0aW9uLFxuICAgIHF1ZXJpZXM6e3NxbDpzdHJpbmcsc3RhdHVzOnN0cmluZ31bXVxufVxuXG5cbmV4cG9ydCBjbGFzcyBNeXNxbEFkYXB0ZXIgaW1wbGVtZW50cyBJREJBZGFwdGVye1xuICAgIG9wdGlvbnM6REJBZGFwdGVyT3B0aW9ucztcbiAgICBzZXJ2aWNlU3RhcnRlZDpib29sZWFuPWZhbHNlO1xuXG4gICAgcmVjb25uZWN0aW9uVGltZW91dD0xMDAwKjM7XG4gICAgcmVjb25uZWN0aW5nPWZhbHNlO1xuICAgIHBvb2w6bXlzcWwuUG9vbHxudWxsPW51bGw7XG4gICAgdGltZW91dElEOmFueVxuICAgICAgICBcbiAgICBxdWVyaWVzPVtdOyAvLyBUT0RPOiBTVE9SRSBRVUVSSUVTIFNFTlRTIEJFRk9SRSBUSEUgU0VSVklDRSBJUyBTVEFSVEVEIVxuICAgIHN0YXRpYyBuZXh0VHJhbnNhY3Rpb25JRD0xO1xuICAgIHRyYW5zYWN0aW9uczpJVHJhbnNhY3Rpb25bXT1bXVxuICAgIFxuICAgIG1heFRyYW5zYWN0aW9uV2FpdFRpbWUgPSAxMDAwKjYwKjE7IC8vIDEgbWluIGFuZCBkZXRlbGV0ZSB0cmFuc2FjdGlvblxuICAgIGxhc3RTdWNjZXNzUXVlcnlUaW1lID0gMDtcbiAgICBwaW5nSW50ZXJ2YWwgPSAxMDAwKjYwKjI7IC8vIGVhY2ggMiBtaW5cbiAgICBcbiAgICBmYWlsUmVwb3J0RmlsZVN0cmVhbTpmcy5Xcml0ZVN0cmVhbXxudWxsPW51bGw7XG4gICAgZmFpbFJlcG9ydEZpbGVTdHJlYW1OYW1lOnN0cmluZ3xudWxsPW51bGw7XG4gICAgZmFpbFJlcG9ydExhc3RBY2Nlc3NUaW1lOm51bWJlcj0wO1xuXG4gICAgcG9vbENvbm5lY3Rpb25zOm51bWJlcj0wO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczpEQkFkYXB0ZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucz1vcHRpb25zO1xuXG4gICAgICAgICAvLyBkZWNyeXB0IHdoZW4gbmVlZGVkXG4gICAgICAgICBpZih0aGlzLm9wdGlvbnMuaG9zdC5zdGFydHNXaXRoKFwiX1wiKSlcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ob3N0ID0gZGVjcnlwdCh0aGlzLm9wdGlvbnMuaG9zdC5zdWJzdHJpbmcoMSkpID8/IHRoaXMub3B0aW9ucy5ob3N0XG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy51c2VyLnN0YXJ0c1dpdGgoXCJfXCIpKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnVzZXIgPSBkZWNyeXB0KHRoaXMub3B0aW9ucy51c2VyLnN1YnN0cmluZygxKSkgPz8gdGhpcy5vcHRpb25zLnVzZXJcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLmRhdGFiYXNlLnN0YXJ0c1dpdGgoXCJfXCIpKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRhdGFiYXNlID0gZGVjcnlwdCh0aGlzLm9wdGlvbnMuZGF0YWJhc2Uuc3Vic3RyaW5nKDEpKSA/PyB0aGlzLm9wdGlvbnMuZGF0YWJhc2VcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnBhc3N3b3JkLnN0YXJ0c1dpdGgoXCJfXCIpKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhc3N3b3JkID0gZGVjcnlwdCh0aGlzLm9wdGlvbnMucGFzc3dvcmQuc3Vic3RyaW5nKDEpKSA/PyB0aGlzLm9wdGlvbnMucGFzc3dvcmRcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgICAgIC8vIENyZWF0ZSBmaWxlIGZvciB0cmFuc2FjdGlvbiBwb3JibGVtIHJlcG9ydFxuICAgICAgICBpZih0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyKXtcbiAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICBpZighZnMuZXhpc3RzU3luYyh0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyKSlcbiAgICAgICAgICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIpO1xuICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXI9dW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCJNeXNxbEFkYXB0ZXJcIixcIkNhbid0IGNyZWF0ZSB0cmFuc2FjdGlvbiBmYWlsIHJlcG9ydCBkaXJcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gc2V0dXAgcHJvY2VzcyBleGl0IGhhbmRsZXJzIGludGVycnVwdCAoY3RybCtjKVxuICAgICAgICB0aGlzLnNlcnZpY2VTdGFydGVkPWZhbHNlO1xuICAgICAgICBsZXQgcG9vbENyZWF0ZWQ6Ym9vbGVhbiA9IGZhbHNlO1xuICAgICAgICB3aGlsZSghcG9vbENyZWF0ZWQpe1xuICAgICAgICAgICAgcG9vbENyZWF0ZWQgPSBhd2FpdCB0aGlzLnJlY3JlYXRlUG9vbCgpO1xuICAgICAgICAgICAgaWYoIXBvb2xDcmVhdGVkKXtcbiAgICAgICAgICAgICAgICBsb2dDcml0KFwiTXlzcWxBZGFwdGVyXCIsXCJDYW4ndCBjb25uZWN0IHRvIE1ZU1FMISBSZXRyeWluZyBpbiAzIHNlY29uZHMuLi5cIilcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PnNldFRpbWVvdXQocmVzb2x2ZSwzMDAwKSkgLy8gc2xlZXAgMyBzZWNvbmRzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldHVwVGltZXJzKCk7XG4gICAgfVxuXG4gICAgc2V0dXBUaW1lcnMoKXtcblxuICAgICAgICAvLyBIYW5kbGUgaGFuZ2luZyB0cmFuc2FjdGlvbnNcbiAgICAgICAgc2V0SW50ZXJ2YWwoKCk9PntcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gY2hlY2sgdHJhbnNhY3Rpb25zXG4gICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLnRyYW5zYWN0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkSURzOm51bWJlcltdPVtdO1xuXG4gICAgICAgICAgICBmb3IobGV0IGkgb2YgdGhpcy50cmFuc2FjdGlvbnMpe1xuICAgICAgICAgICAgICAgIGlmKG5vdy1pLnRpbWVzdGFtcD50aGlzLm1heFRyYW5zYWN0aW9uV2FpdFRpbWUpe1xuICAgICAgICAgICAgICAgICAgICBsb2dFcnJvcihcIlJlbGVhc2UgdHJhbnNhY3Rpb24gY29ubmVjdGlvbiBkdWUgdG8gdGltZW91dFwiKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvbGxiYWNrVHJhbnNhY3Rpb24oaSx0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZElEcy5wdXNoKGkuaWQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHRoaXMudHJhbnNhY3Rpb25zLmZpbHRlcihpPT4hcmVtb3ZlZElEcy5pbmNsdWRlcyhpLmlkKSlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnICYmIGNvdW50LXRoaXMudHJhbnNhY3Rpb25zLmxlbmd0aD4wKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmVtb3ZlZDogXCIsY291bnQtdGhpcy50cmFuc2FjdGlvbnMubGVuZ3RoKVxuXG4gICAgICAgICAgICAvLyBQSU5HIFNFUlZFUlxuICAgICAgICAgICAgaWYoRGF0ZS5ub3coKS10aGlzLmxhc3RTdWNjZXNzUXVlcnlUaW1lPnRoaXMucGluZ0ludGVydmFsKXtcbiAgICAgICAgICAgICAgICBpZighdGhpcy5wb29sKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gRE8gUElOR1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaSA9MDtpPHRoaXMub3B0aW9ucy5jb25uZWN0aW9uTGltaXQ7aSsrKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeSh7cXVlcnk6XCJTRUxFQ1QgMSBATk9MSU1JVFwifSlcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJQaW5nIG15c3FsIG9uIGVhY2ggY29ubmVjdGlvbiBpbiBwb29sXCIpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfSwxMDAwKjMwKVxuICAgICAgICBcblxuICAgICAgICBzZXRJbnRlcnZhbCgoKT0+e1xuICAgICAgICAgICAgaWYoIXRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gYWZ0ZXIgMTUgbWluIG9mIGluYWN0aXZpdHksIGNsb3NlIGZpbGVcbiAgICAgICAgICAgIGlmKERhdGUubm93KCktdGhpcy5mYWlsUmVwb3J0TGFzdEFjY2Vzc1RpbWU+MTAwMCo2MCoxNSl7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbS5lbmQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtPW51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSwxMDAwKjYwKjUpXG4gICAgfVxuXG4gICAgLyoqIENyZWF0ZSBjb25uZWN0aW9uIHBvb2wgKi9cbiAgICBhc3luYyByZWNyZWF0ZVBvb2woKTpQcm9taXNlPGJvb2xlYW4+e1xuXG4gICAgICAgIGNvbnN0IG9wdCA9IHtcbiAgICAgICAgICAgIGhvc3Q6IHRoaXMub3B0aW9ucy5ob3N0XG4gICAgICAgICAgICAsdXNlcjogdGhpcy5vcHRpb25zLnVzZXJcbiAgICAgICAgICAgICxwYXNzd29yZDogdGhpcy5vcHRpb25zLnBhc3N3b3JkXG4gICAgICAgICAgICAsZGF0YWJhc2U6IHRoaXMub3B0aW9ucy5kYXRhYmFzZVxuICAgICAgICAgICAgLHBvcnQ6IHRoaXMub3B0aW9ucy5wb3J0XG4gICAgICAgICAgICAsY29ubmVjdGlvbkxpbWl0OiB0aGlzLm9wdGlvbnMuY29ubmVjdGlvbkxpbWl0XG4gICAgICAgICAgICAscXVldWVMaW1pdDogdGhpcy5vcHRpb25zLnF1ZXVlTGltaXQgPz8gNTBcbiAgICAgICAgICAgICxtdWx0aXBsZVN0YXRlbWVudHM6IHRydWVcblxuICAgICAgICAgICAgLGVuYWJsZUtlZXBBbGl2ZTp0cnVlXG4gICAgICAgICAgICAsa2VlcEFsaXZlSW5pdGlhbERlbGF5OjMqMTAwMFxuICAgICAgICAgICAgLy8sbWF4SWRsZTowXG4gICAgICAgICAgICAsaWRsZVRpbWVvdXQ6MTAwMCo2MCo1XG4gICAgICAgIH1cblxuICAgICAgICBsb2dJbmZvKFwiJHtNeXNxbEFkYXB0ZXIuanN9XCIsXCJDb25uZWN0aW5nIHRvIG15c3FsOiBcXG4gXCIrSlNPTi5zdHJpbmdpZnkoey4uLm9wdCxwYXNzd29yZDpcIioqKipcIn0sbnVsbCxcIlxcdFwiKSlcbiAgICBcbiAgICAgICAgaWYodGhpcy5wb29sKXtcbiAgICAgICAgICAgIHRoaXMucG9vbC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRyeXthd2FpdCB0aGlzLnBvb2wuZW5kKCk7fWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCJNeXNxbEFkYXB0ZXJcIixcIkNhbid0IGNsb3NlIE1ZU1FMIHBvb2whIFwiK2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvb2wgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgXG4gICAgICAgIC8vIEtlZXAgYWxpdmUgcGFja2V0cyBzaG91bGQgYmUgc2VudFxuICAgICAgICAvKmVuYWJsZUtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAgLy8gV2Ugc2hvdWxkIHN0YXJ0IHNlbmRpbmcgdGhlbSBlYXJseVxuICAgICAgICBrZWVwQWxpdmVJbml0aWFsRGVsYXk6IDMgKiAxMDAwLCAvLyAzIHNlY29uZHNcbiAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCBpZGxlIGNvbm5lY3Rpb25zLCBidXQgaXQncyBub3QgbWFuZGF0b3J5IGZvciB0aGUgZml4IHRvIHdvcmssIGl0IHNlZW1zXG4gICAgICAgIG1heElkbGU6IDAsXG4gICAgICAgIC8vIElkbGUgdGltZW91dCBtdWNoIGxhcmdlciB0aGFuIGtlZXAgYWxpdmUgZGVsYXkgYW5kIG11Y2ggc21hbGxlciB0aGFuIE15U1FMJ3MgdGltZW91dCBzZXR0aW5nXG4gICAgICAgIGlkbGVUaW1lb3V0OiA1ICogNjAgKiAxMDAwIC8vIDUgbWludXRlc1xuICAgICAgICAqL1xuXG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIHRoaXMucG9vbCA9bXlzcWwuY3JlYXRlUG9vbChvcHQpO1xuICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICBsb2dDcml0KFwiTXlzcWxBZGFwdGVyXCIsXCJDYW4ndCBjb25uZWN0IHRvIE1ZU1FMISBcIitlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgXG4gICAgICAgIC8vIFRPRE8gd2F0Y2ggZm9yIGZyZWUgcG9vbCBjb25uZWN0aW9uc1xuXG4gICAgICAgIHRoaXMucG9vbD8ub24oJ2Nvbm5lY3Rpb24nLCAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgIGxvZ0luZm8oXCJNeXNxbEFkYXB0ZXJcIixcInBvb2wgLT4gY29ubmVjdGlvbiBjcmVhdGVkLCB0b3RhbDpcIit0aGlzLnBvb2xDb25uZWN0aW9ucysrKVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb29sPy5vbignYWNxdWlyZScsIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAvKmlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBsb2dJbmZvKFwiTXlzcWxBZGFwdGVyXCIsXCJNWVNRTCBDT05ORUNUSU9OIEFDUVVJUkVEXCIpKi9cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5wb29sPy5vbigncmVsZWFzZScsIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAvKmlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBsb2dJbmZvKFwiTXlzcWxBZGFwdGVyXCIsXCJNWVNRTCBDT05ORUNUSU9OIFJFTEVBU0VEXCIpKi9cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5wb29sPy5vbignZW5xdWV1ZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBsb2dJbmZvKFwiTXlzcWxBZGFwdGVyXCIsXCJwb29sIC0+IHdhaXRpbmcgZm9yIGF2YWlsYWJsZSBjb25uZWN0aW9uXCIpXG4gICAgICAgIH0pXG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBjb25uZWN0aW9uXG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2hlY2sgbXlzcWwgY29ubmVjdGlvblwiKVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSxfKT0+e1xuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbm4gPSBhd2FpdCB0aGlzLnBvb2w/LmdldENvbm5lY3Rpb24oKVxuICAgICAgICAgICAgICAgIGlmKGNvbm4pe1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb25uLnF1ZXJ5KFwiU0VMRUNUIDFcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbm4/LnJlbGVhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nSW5mbyhcIk15c3FsQWRhcHRlclwiLFwiQ29ubmVjdGVkIHRvIE1ZU1FMIVwiKVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICAgICAgfWVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICBsb2dDcml0KFwiTXlzcWxBZGFwdGVyXCIsXCJDYW4ndCBjb25uZWN0IHRvIE1ZU1FMISBcIitlKVxuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIHF1ZXJ5KHJlcXVlc3Q6IElEQlF1ZXJ5KTogUHJvbWlzZTxJREJSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLnByZXBhcmVRdWVyeShyZXF1ZXN0KTtcblxuICAgICAgICAvLyBDaGVjayBwb29sXG4gICAgICAgIGlmKCF0aGlzLnBvb2wpe1xuICAgICAgICAgICAgbG9nRXJyb3IoXCIke015c3FsQWRhcHRlci5qc31cIixcIk5vIHBvb2xcIilcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0ge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiTk9fUE9PTFwiLFxuICAgICAgICAgICAgICAgIGVycm5vOiAxMDAwMDAsXG4gICAgICAgICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgICAgICAgICAgc3FsOiBxdWVyeSxcbiAgICAgICAgICAgICAgICBuYW1lOlwiTk9fUE9PTFwiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6XCJNeXNxbCBwb29sIG5vdCBjcmVhdGVkXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihyZXF1ZXN0LnRocm93YWJsZSlcbiAgICAgICAgICAgICAgICB0aHJvdyB7Li4uRGVmYXVsdEVycm9ycy5EQl9FUlJPUixkZXRhaWxzOmVycm9yLm1lc3NhZ2Usc3RhY2s6ZXJyb3J9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTpudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOmVycm9yLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0cnl7XG4gICAgICAgICAgICAvLyBnZXQgY29ubmVjdGlvblxuICAgICAgICAgICAgbGV0IGNvbm46bXlzcWwuUG9vbENvbm5lY3Rpb258bnVsbD1udWxsXG4gICAgICAgICAgICBpZihyZXF1ZXN0LnRyYW5zYWN0aW9uSUQgJiYgcmVxdWVzdC50cmFuc2FjdGlvbklEPjApe1xuICAgICAgICAgICAgICAgIGNvbm4gPSB0aGlzLnRyYW5zYWN0aW9ucy5maW5kKGk9PmkuaWQ9PT1yZXF1ZXN0LnRyYW5zYWN0aW9uSUQpPy5jb25uID8/IG51bGw7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkV4ZWN1dGUgcXVlcnkgb24gdHJhbnNhY3Rpb246IFwiLGNvbm4/LnRocmVhZElkKVxuICAgICAgICAgICAgfWVsc2VcbiAgICAgICAgICAgICAgICBjb25uID0gYXdhaXQgdGhpcy5wb29sLmdldENvbm5lY3Rpb24oKTtcbiAgICAgICAgXG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuZGVidWcpXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFeGVjdXRlIHF1ZXJ5XCIsY29ubj8udGhyZWFkSWQpXG4gICAgICAgIFxuICAgICAgICAgICAgLy8gaWYgY29ubmVjdGlvbiBub3QgY3JlYXRlZFxuICAgICAgICAgICAgaWYoIWNvbm4pe1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsQWRhcHRlci5qc31cIixgTm8gY29ubmVjdGlvbiBjcmVhdGVkIWApXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFwiTk9fQ09OTlwiLFxuICAgICAgICAgICAgICAgICAgICBlcnJubzogMTAwMDAxLFxuICAgICAgICAgICAgICAgICAgICBmYXRhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3FsOiBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTpcIk5PX0NPTk5cIixcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTpcIk15c3FsIHBvb2wgY2FudCBnZXQgY29ubmVjdGlvblwiLFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKHJlcXVlc3QudGhyb3dhYmxlKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyB7Li4uRGVmYXVsdEVycm9ycy5EQl9FUlJPUixkZXRhaWxzOmVycm9yLm1lc3NhZ2Usc3RhY2s6ZXJyb3J9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTpudWxsLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcixcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuZGVidWcpXG4gICAgICAgICAgICAgICAgICAgIGxvZ0luZm8oXCJFeGVjdXRlIHF1ZXJ5OlwiLHF1ZXJ5KVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29ubi5xdWVyeShxdWVyeSk7XG5cbiAgICAgICAgICAgICAgICAvLyBJRiBDT05ORUNUSU9OIE5PVCBJTiBUUkFOU0FDVElPTiFcbiAgICAgICAgICAgICAgICBpZihyZXF1ZXN0LnRyYW5zYWN0aW9uSUQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluYWxpemVDb25uZWN0aW9uKGNvbm4pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTpyZXN1bHRbMF0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOm51bGxcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1jYXRjaChlKXtcblxuICAgICAgICAgICAgICAgIGlmKHJlcXVlc3QudHJhbnNhY3Rpb25JRClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5hbGl6ZUNvbm5lY3Rpb24oY29ubik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZU15c3FsUXVlcnlFcnJvcihlKTtcbiAgICAgICAgICAgICAgICBpZihyZXF1ZXN0LnRocm93YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgey4uLkRlZmF1bHRFcnJvcnMuREJfRVJST1IsZGV0YWlsczplcnJvci5tZXNzYWdlLHN0YWNrOmVycm9yfVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6bnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6dGhpcy5jcmVhdGVNeXNxbFF1ZXJ5RXJyb3IoZSksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbG9nQ3JpdChcIk15c3FsQWRhcHRlclwiLGBFcnJvciB3aGVuIGV4ZWN1dGluZyBxdWVyeTogJHtlfWApXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0ge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiRVhFQ19FUlJPUlwiLFxuICAgICAgICAgICAgICAgIGVycm5vOiAxMDAwMDIsXG4gICAgICAgICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgICAgICAgICAgc3FsOiBxdWVyeSxcbiAgICAgICAgICAgICAgICBuYW1lOlwiRVhFQ1VUSU9OX0VSUk9SXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTplK1wiXCIsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKHJlcXVlc3QudGhyb3dhYmxlKVxuICAgICAgICAgICAgICAgIHRocm93IHsuLi5EZWZhdWx0RXJyb3JzLkRCX0VSUk9SLGRldGFpbHM6ZXJyb3IubWVzc2FnZSxzdGFjazplcnJvcn1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOm51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3IsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZmluYWxpemVDb25uZWN0aW9uKGNvbm46bXlzcWwuUG9vbENvbm5lY3Rpb24pe1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICBjb25uLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIGNvbm4ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGxvZ0NyaXQoXCJNeXNxbEFkYXB0ZXJcIixgQ2FuJ3QgcmVsZWFzZSBjb25uZWN0aW9uOiAke2V9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByZXBhcmVRdWVyeShyZXF1ZXN0OiBJREJRdWVyeSk6c3RyaW5ne1xuXG4gICAgICAgIGxldCBxdWVyeSA9IHJlcXVlc3QucXVlcnk7XG4gICAgICAgIGxldCBmaWVsZHMgPSByZXF1ZXN0LmZpZWxkcztcblxuICAgICAgICBpZihmaWVsZHMpe1xuICAgICAgICAgICAgZm9yKGxldCBpIGluIGZpZWxkcyl7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZHNbaV07XG4gICAgICAgICAgICAgICAgaWYodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgICAgICBmaWVsZHNbaV09e3ZhbHVlOnZhbHVlLHN5c3RlbTpmYWxzZX1cbiAgICAgICAgICAgICAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZih2YWx1ZT09PW51bGwpXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkc1tpXT17dmFsdWU6bnVsbCxzeXN0ZW06dHJ1ZX1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQ9IE15c3FsQWRhcHRlci5wcmVwYXJlUXVlcnlGaWVsZFZhbHVlKHZhbHVlIGFzIElEQlF1ZXJ5RmllbGQpO1xuXG4gICAgICAgICAgICAgICAgLy8gdG9kbyBjcmVhdGUgcmVnZXggdG8gcmVwbGFjZSBhbGxcbiAgICAgICAgICAgICAgICBxdWVyeT1xdWVyeS5yZXBsYWNlQWxsKFwiQFwiK25hbWUscGFyc2VkK1wiXCIpIFxuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgY29uc3QgdG1wID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYodG1wLmluZGV4T2YoXCJzZWxlY3RcIik9PT0wICYmIHRtcC5pbmRleE9mKFwibGltaXRcIik9PT0tMSlcbiAgICAgICAgICAgIHF1ZXJ5Kz1cIiBMSU1JVCAxMDBcIlxuICAgICAgICAgICAgXG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZUFsbChcIkBOT0xJTUlUXCIsXCJcIilcbiAgICBcbiAgICAgICAgaWYocXVlcnkuaW5kZXhPZihcIkBmaWVsZHNcIikhPT0tMSl7XG4gICAgICAgICAgICAgICAgbGV0IGluc2VydEZpZWxkTmFtZXM9W11cbiAgICAgICAgICAgICAgICBsZXQgaW5zZXJ0RmllbGRWYWx1ZXM9W11cbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gZmllbGRzKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGYgPSBmaWVsZHNbaV0gYXMgSURCUXVlcnlGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYoZi5pZ25vcmVJbkluc2VydClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZighZi5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydEZpZWxkTmFtZXMucHVzaCgnYCcrKGYubmFtZStcIlwiKS5yZXBsYWNlQWxsKFwiYFwiLCcnKS5yZXBsYWNlQWxsKCdcXFwiJyxcIlwiKS5yZXBsYWNlQWxsKCdcXCcnLFwiXCIpKydgJylcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0RmllbGRWYWx1ZXMucHVzaChmLl9wYXJzZWRWYWx1ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgcXVlcnk9cXVlcnlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJ0BmaWVsZHMnLGluc2VydEZpZWxkTmFtZXMuam9pbihcIixcIikpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCdAdmFsdWVzJyxpbnNlcnRGaWVsZFZhbHVlcy5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIGlmKHF1ZXJ5LmluZGV4T2YoXCJAaW5zZXJ0XCIpIT09LTEpe1xuICAgICAgICAgICAgICAgIGxldCBvbmluc2VydE5hbWVzPVtdXG4gICAgICAgICAgICAgICAgbGV0IG9uaW5zZXJ0VmFsdWVzPVtdXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIGZpZWxkcyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmID0gZmllbGRzW2ldIGFzIElEQlF1ZXJ5RmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmKGYuaWdub3JlSW5JbnNlcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgb25pbnNlcnROYW1lcy5wdXNoKChmLm5hbWUrXCJcIikucmVwbGFjZUFsbChcImBcIiwnJykucmVwbGFjZUFsbCgnXFxcIicsXCJcIikucmVwbGFjZUFsbCgnXFwnJyxcIlwiKSlcbiAgICAgICAgICAgICAgICAgICAgb25pbnNlcnRWYWx1ZXMucHVzaChmLl9wYXJzZWRWYWx1ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlQWxsKFwiQGluc2VydFwiLGAoJHtvbmluc2VydE5hbWVzLmpvaW4oXCIsXCIpfSkgVkFMVUVTICgke29uaW5zZXJ0VmFsdWVzLmpvaW4oXCIsXCIpfSlgKVxuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgaWYocXVlcnkuaW5kZXhPZihcIkBvbnVwZGF0ZVwiKSE9PS0xKXtcbiAgICAgICAgICAgICAgICBsZXQgb25VcGRhdGU9W11cbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gZmllbGRzKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGYgPSBmaWVsZHNbaV0gYXMgSURCUXVlcnlGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYoZi5pZ25vcmVJblVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBvblVwZGF0ZS5wdXNoKCdgJysoZi5uYW1lK1wiXCIpLnJlcGxhY2VBbGwoXCJgXCIsJycpLnJlcGxhY2VBbGwoJ1xcXCInLFwiXCIpLnJlcGxhY2VBbGwoJ1xcJycsXCJcIikrJ2AgPSAnK2YuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2VBbGwoXCJAb251cGRhdGVcIixvblVwZGF0ZS5qb2luKFwiICwgXCIpKVxuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgaWYocXVlcnkuaW5kZXhPZignQG9uZHVwbGljYXRlJykhPT0tMSl7XG4gICAgICAgICAgICAgICAgbGV0IG9uRHVwbGljYXRlPVtdO1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBmaWVsZHMpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgZiA9IGZpZWxkc1tpXSBhcyBJREJRdWVyeUZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZighZi51c2VJblJlcGxhY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgb25EdXBsaWNhdGUucHVzaCgnYCcrKGYubmFtZStcIlwiKS5yZXBsYWNlQWxsKFwiYFwiLCcnKS5yZXBsYWNlQWxsKCdcXFwiJyxcIlwiKS5yZXBsYWNlQWxsKCdcXCcnLFwiXCIpKydgID0gJytmLl9wYXJzZWRWYWx1ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlQWxsKFwiQG9uZHVwbGljYXRlXCIsb25EdXBsaWNhdGUuam9pbihcIiAsIFwiKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gIHF1ZXJ5O1xuICAgIH1cblxuICAgIC8qKiBQcmVwYXJlIGZpZWxkIHZhbHVlICovXG4gICAgc3RhdGljIHByZXBhcmVRdWVyeUZpZWxkVmFsdWUoZmllbGQ6SURCUXVlcnlGaWVsZCk6c3RyaW5nfG51bWJlcnxib29sZWFufG51bGx8dW5kZWZpbmVke1xuICAgICAgICBsZXQgdmFsdWUgPSBmaWVsZC52YWx1ZTtcbiAgICAgICAgbGV0IHN5c3RlbSA9IGZpZWxkLnN5c3RlbTtcblxuICAgICAgICBpZih2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIFwiTlVMTFwiXG5cbiAgICAgICAgaWYoIXN5c3RlbSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoJ1wiJywnXFxcXFwiJyk7XG4gICAgICAgICAgICBcbiAgICAgICAgZmllbGQuX19wYXJzZWRWYWx1ZT12YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlIGFzIGFueTtcbiAgICB9XG5cbiAgICBwcmVwYXJlQ291bnRRdWVyeShxdWVyeTpzdHJpbmcpOnN0cmluZ3tcbiAgICAgICAgbGV0IGNvdW50UXVlcnkgPSBxdWVyeTtcblxuICAgICAgICAvLyBSRU1PVkUgTElNSVRcbiAgICAgICAgaWYoY291bnRRdWVyeS5pbmRleE9mKFwiTElNSVRcIik9PT0tMSlcbiAgICAgICAgICAgIGNvdW50UXVlcnkgPSBjb3VudFF1ZXJ5LnN1YnN0cmluZygwLGNvdW50UXVlcnkuaW5kZXhPZihcIkxJTUlUXCIpKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJFTU9WRSBPUkRFUiBcbiAgICAgICAgaWYoY291bnRRdWVyeS5pbmRleE9mKFwiT1JERVJcIikhPT0tMSlcbiAgICAgICAgICAgIGNvdW50UXVlcnkgPSBjb3VudFF1ZXJ5LnN1YnN0cmluZygwLGNvdW50UXVlcnkuaW5kZXhPZihcIk9SREVSXCIpKVxuXG4gICAgICAgIC8vVE9ETzogUkVNT1ZFIEpPSU5TXG5cbiAgICAgICAgY291bnRRdWVyeSA9IGNvdW50UXVlcnkuc3Vic3RyaW5nKGNvdW50UXVlcnkuaW5kZXhPZihcIkZST01cIikpO1xuICAgICAgICBcblxuICAgICAgICBjb3VudFF1ZXJ5ID0gXCJTRUxFQ1QgQ09VTlQoMSkgYXMgYGNvdW50YCBcIitjb3VudFF1ZXJ5XG4gICAgICAgIHJldHVybiBjb3VudFF1ZXJ5O1xuICAgIH1cblxuXG4gICAgLy8gVFJBTlNBQ1RJT05TXG4gICAgYXN5bmMgY29tbWl0KHRyeDpJVHJhbnNhY3Rpb24pOlByb21pc2U8SURCRXJyb3J8bnVsbD57XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIGF3YWl0IHRyeC5jb25uLmNvbW1pdCgpO1xuICAgICAgICAgICAgLy9hd2FpdCB0cnguY29ubi5xdWVyeShcIkNPTU1JVFwiKTtcbiAgICAgICAgICAgIHRyeC5jb25uLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgdHJ4LmNvbm4ucmVsZWFzZSgpO1xuICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJvbGxiYWNrVHJhbnNhY3Rpb24odHJ4KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU15c3FsUXVlcnlFcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblxuICAgIGFzeW5jIHJvbGxiYWNrVHJhbnNhY3Rpb24odHJ4OklUcmFuc2FjdGlvbixkb25Ob3RSZW1vdmU/OmJvb2xlYW4pOlByb21pc2U8SURCRXJyb3J8bnVsbD57XG4gICAgICAgIGxldCBlcnI9bnVsbDtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJSb2xsYmFjayBzdGFydGVkXCIsdHJ4LmNvbm4udGhyZWFkSWQpXG4gICAgICAgICAgICBhd2FpdCB0cnguY29ubi5yb2xsYmFjaygpO1xuICAgICAgICAgICAgYXdhaXQgdHJ4LmNvbm4uY29tbWl0KCk7XG4gICAgICAgICAgICAvL2F3YWl0IHRyeC5jb25uLnF1ZXJ5KFwiUk9MTEJBQ0tcIik7XG4gICAgICAgICAgICB0cnguY29ubi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRyeC5jb25uLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIGlmKCFkb25Ob3RSZW1vdmUpXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9ucy5maWx0ZXIoaT0+aS5pZCE9PXRyeC5pZCk7XG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuZGVidWcpXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJSb2xsYmFjayBjb21wbGV0ZVwiLHRyeC5jb25uLnRocmVhZElkKVxuICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICBsb2dDcml0KFwiTXlzcWxBZGFwdGVyXCIsXCJDYW4ndCByb2xsYmFjayB0cmFuc2FjdGlvblwiLHRyeC5xdWVyaWVzKVxuICAgICAgICAgICAgZXJyID0gdGhpcy5jcmVhdGVNeXNxbFF1ZXJ5RXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0b3JlVHJhbnNhY3Rpb25Bc1Byb2JsZW0odHJ4LFwicm9sbGJhY2tcIilcblxuICAgICAgICByZXR1cm4gZXJyO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogRmluaXNoIHNlcnZpY2VcbiAgICAgKi9cbiAgICBhc3luYyBmaW5pc2goKXtcbiAgICAgICAgY29uc29sZS5sb2coXCJGaW5pc2hpbmcgbXlzcWwgc2VydmljZVwiKVxuICAgICAgICBmb3IobGV0IGkgb2YgdGhpcy50cmFuc2FjdGlvbnMpXG4gICAgICAgICAgICB0aGlzLnJvbGxiYWNrVHJhbnNhY3Rpb24oaSk7XG5cbiAgICAgICAgaWYodGhpcy5wb29sKXtcbiAgICAgICAgICAgIHRyeXthd2FpdCB0aGlzLnBvb2wuZW5kKCk7fWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCJNeXNxbEFkYXB0ZXJcIixcIkNhbid0IGNsb3NlIE1ZU1FMIHBvb2whXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtKVxuICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbS5lbmQoKTtcbiAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbT1udWxsO1xuICAgIH1cblxuICAgIGNyZWF0ZU15c3FsUXVlcnlFcnJvcihlcnI6YW55LHRocm93YWJsZT86Ym9vbGVhbik6SURCRXJyb3J7XG4gICAgICAgIGlmKGVyciAmJiAgdHlwZW9mIGVycj09PVwib2JqZWN0XCIgJiYgXCJjb2RlXCIgaW4gZXJyICYmIFwiZXJybm9cIiBpbiBlcnIgJiYgXCJzcWxcIiBpbiBlcnIgJiYgXCJuYW1lXCIgaW4gZXJyICYmIFwibWVzc2FnZVwiIGluIGVycil7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBlcnIuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgZXJybm86IGVyci5lcnJubyxcbiAgICAgICAgICAgICAgICAgICAgc3FsOiBlcnIuc3FsLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOmVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOmVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBmYXRhbDpmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJRVUVSWV9FUlJcIixcbiAgICAgICAgICAgICAgICBlcnJubzogMTAwMDAyLFxuICAgICAgICAgICAgICAgIGZhdGFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNxbDogXCJubyBxdWVyeVwiLFxuICAgICAgICAgICAgICAgIG5hbWU6XCJRVUVSWV9FUlJcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOlwiRXJyb3I6IFwiKyhlcnIpP2VycjpcIlwiLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc3RvcmVUcmFuc2FjdGlvbkFzUHJvYmxlbSh0cng6SVRyYW5zYWN0aW9uLG1lc3NhZ2U6c3RyaW5nKXtcbiAgICBcbiAgICAgICAgaWYoIXRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnQgJiYgIXRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIpe1xuICAgICAgICAgICAgbG9nQ3JpdChcIk15c3FsQWRhcHRlclwiLFwiQ2FuJ3QgcmVwb3J0IGZhaWxlZCB0cmFuc2FjdGlvbiwgbm8gcmVwb3J0IGZ1bmN0aW9uOiB0cmFuc2FjdGlvbkZhaWxSZXBvcnQgaW4gb3B0aW9ucywgYW5kIHRyYW5zYWN0aW9uRmFpbFJlcG9ydERpciBpc250IHNldFwiKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydERpcil7XG4gICAgICAgICAgICBjb25zdCB5eXltbWRkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLDEwKS5yZXBsYWNlQWxsKFwiLVwiLFwiXCIpO1xuXG4gICAgICAgICAgICAvL3N0b3JlIHRyYW5zYWN0aW9uXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBwYXRoLnJlc29sdmUodGhpcy5vcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydERpcix5eXltbWRkK1wiLmpzb25cIik7XG4gICAgICAgICAgICBpZih0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtKXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtTmFtZSE9PWZpbGUpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtPW51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmKHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW1OYW1lKXtcbiAgICAgICAgICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0oZmlsZSx7ZmxhZ3M6J2EnfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbU5hbWU9ZmlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3RvcmUgdHJhbnNhY3Rpb24gZmFpbCByZXBvcnQ6IFwiLGZpbGUsdHJ4LnF1ZXJpZXMsbWVzc2FnZSlcblxuICAgICAgICAgICAgaWYoIXRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0pXG4gICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZpbGUse2ZsYWdzOidhJ30pO1xuXG4gICAgICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtLndyaXRlKEpTT04uc3RyaW5naWZ5KHtxdWVyaWVzOnRyeC5xdWVyaWVzLHRpbWU6dHJ4LnRpbWVzdGFtcCxkYXRlLG1lc3NhZ2V9KStcIlxcbn1FT0J7XFxuXCIsZXJyPT57XG4gICAgICAgICAgICAgICAgaWYoZXJyKVxuICAgICAgICAgICAgICAgICAgICBsb2dDcml0KFwiTXlzcWxBZGFwdGVyXCIsXCJDYW4ndCB3cml0ZSB0byB0cmFuc2FjdGlvbiBmYWlsIHJlcG9ydCBmaWxlXCIpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBsb2dJbmZvKFwiTXlzcWxBZGFwdGVyXCIsXCJUcmFuc2FjdGlvbiBmYWlsIHJlcG9ydCBzdG9yZWRcIilcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmZhaWxSZXBvcnRMYXN0QWNjZXNzVGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIFxuICAgICAgICBpZih0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0KVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydCh0cngsbWVzc2FnZSk7XG4gICAgfVxufVxuXG5cblxuY29uc3Qgc2VjcmV0X2tleT1cIkFLTFdrYWp3JV4mZGd3cWh3Izk4NDUzaTIzYmZrMjNybjJrbmtuZ2xyZ2plaXRcIlxuY29uc3Qgc2VjcmV0X2l2PVwicnRoYWRyZmsyM3JuMmtuIypGTktBQGd0NDRkZjN0c2xyZ2ojIyFpdFwiXG5cbi8vIEdlbmVyYXRlIHNlY3JldCBoYXNoIHdpdGggY3J5cHRvIHRvIHVzZSBmb3IgZW5jcnlwdGlvblxuY29uc3Qga2V5ID0gY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNlY3JldF9rZXkpLmRpZ2VzdCgnaGV4Jykuc3Vic3RyaW5nKDAsIDMyKVxuY29uc3QgaXYgPSBjcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc2VjcmV0X2l2KS5kaWdlc3QoJ2hleCcpLnN1YnN0cmluZygwLCAxNilcblxuY29uc3QgZGVjcnlwdCA9KGVuY3J5cHRlZDpzdHJpbmcpOnN0cmluZ3xudWxsPT57XG4gIHRyeXtcbiAgICAgIGVuY3J5cHRlZCA9IEJ1ZmZlci5mcm9tKGVuY3J5cHRlZCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdiaW5hcnknKTtcbiAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3JlYXRlRGVjaXBoZXJpdignYWVzLTI1Ni1jYmMnLCBrZXksIGl2KTtcbiAgICAgIGxldCBkZWNyeXB0ZWQgPSBkZWNpcGhlci51cGRhdGUoZW5jcnlwdGVkLCAnYmluYXJ5JywgJ3V0ZjgnKTtcbiAgICAgIGRlY3J5cHRlZCArPSBkZWNpcGhlci5maW5hbCgndXRmOCcpO1xuICAgICAgcmV0dXJuIGRlY3J5cHRlZDtcbiAgfWNhdGNoKGUpe1xuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn0iXX0=
|
471
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXlzcWxBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaVNlcnZlci9kYi9NeXNxbEFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsNkRBQW1DO0FBQ25DLDRDQUFvQjtBQUNwQiw4Q0FBMkQ7QUFDM0QsZ0ZBQXdEO0FBQ3hELGdEQUF3QjtBQUN4QixtQ0FBc0Q7QUFVdEQsTUFBYSxZQUFZO0lBQ3JCLE9BQU8sQ0FBa0I7SUFDekIsY0FBYyxHQUFTLEtBQUssQ0FBQztJQUU3QixtQkFBbUIsR0FBQyxJQUFJLEdBQUMsQ0FBQyxDQUFDO0lBQzNCLFlBQVksR0FBQyxLQUFLLENBQUM7SUFDbkIsSUFBSSxHQUFpQixJQUFJLENBQUM7SUFDMUIsU0FBUyxDQUFJO0lBRWIsT0FBTyxHQUFDLEVBQUUsQ0FBQztJQUNYLE1BQU0sQ0FBQyxpQkFBaUIsR0FBQyxDQUFDLENBQUM7SUFDM0IsWUFBWSxHQUFnQixFQUFFLENBQUE7SUFFOUIsc0JBQXNCLEdBQUcsSUFBSSxHQUFDLEVBQUUsR0FBQyxDQUFDLENBQUM7SUFDbkMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLFlBQVksR0FBRyxJQUFJLEdBQUMsRUFBRSxHQUFDLENBQUMsQ0FBQztJQUV6QixvQkFBb0IsR0FBcUIsSUFBSSxDQUFDO0lBQzlDLHdCQUF3QixHQUFhLElBQUksQ0FBQztJQUMxQyx3QkFBd0IsR0FBUSxDQUFDLENBQUM7SUFFbEMsZUFBZSxHQUFRLENBQUMsQ0FBQztJQUN6Qix1QkFBdUIsR0FBUSxDQUFDLENBQUM7SUFFakMsWUFBWSxPQUF3QjtRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFDLE9BQU8sQ0FBQztRQUdwQixJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FB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LENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUNsRixNQUFNLEVBQUUsR0FBRyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBRWhGLE1BQU0sT0FBTyxHQUFFLENBQUMsU0FBZ0IsRUFBYSxFQUFFO0lBQzdDLElBQUc7UUFDQyxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sUUFBUSxHQUFHLElBQUEseUJBQWdCLEVBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0QsU0FBUyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsT0FBTyxTQUFTLENBQUM7S0FDcEI7SUFBQSxPQUFNLENBQUMsRUFBQztRQUNMLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7QUFDSCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEQkFkYXB0ZXJPcHRpb25zLCBJREJFcnJvciwgSURCUXVlcnksIElEQlF1ZXJ5RmllbGQsIElEQlJlc3VsdCB9IGZyb20gXCIuLi9EQlNlcnZpY2VcIjtcbmltcG9ydCB7IElEQkFkYXB0ZXIsIH0gZnJvbSBcIi4vSURCQWRhcHRlclwiO1xuaW1wb3J0IG15c3FsIGZyb20gJ215c3FsMi9wcm9taXNlJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBsb2dJbmZvLCBsb2dDcml0LCBsb2dFcnJvciB9IGZyb20gXCIuLi9Mb2dTZXJ2aWNlXCI7XG5pbXBvcnQgRGVmYXVsdEVycm9ycyBmcm9tIFwiLi4vc3RydWN0dXJlcy9EZWZhdWx0RXJyb3JzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCwgY3JlYXRlRGVjaXBoZXJpdiB9IGZyb20gXCJjcnlwdG9cIjtcblxuaW50ZXJmYWNlIElUcmFuc2FjdGlvbntcbiAgICBpZDpudW1iZXJcbiAgICB0aW1lc3RhbXA6bnVtYmVyLFxuICAgIGNvbm46bXlzcWwuUG9vbENvbm5lY3Rpb24sXG4gICAgcXVlcmllczp7c3FsOnN0cmluZyxzdGF0dXM6c3RyaW5nfVtdXG59XG5cblxuZXhwb3J0IGNsYXNzIE15c3FsQWRhcHRlciBpbXBsZW1lbnRzIElEQkFkYXB0ZXJ7XG4gICAgb3B0aW9uczpEQkFkYXB0ZXJPcHRpb25zO1xuICAgIHNlcnZpY2VTdGFydGVkOmJvb2xlYW49ZmFsc2U7XG5cbiAgICByZWNvbm5lY3Rpb25UaW1lb3V0PTEwMDAqMztcbiAgICByZWNvbm5lY3Rpbmc9ZmFsc2U7XG4gICAgcG9vbDpteXNxbC5Qb29sfG51bGw9bnVsbDtcbiAgICB0aW1lb3V0SUQ6YW55XG4gICAgICAgIFxuICAgIHF1ZXJpZXM9W107IC8vIFRPRE86IFNUT1JFIFFVRVJJRVMgU0VOVFMgQkVGT1JFIFRIRSBTRVJWSUNFIElTIFNUQVJURUQhXG4gICAgc3RhdGljIG5leHRUcmFuc2FjdGlvbklEPTE7XG4gICAgdHJhbnNhY3Rpb25zOklUcmFuc2FjdGlvbltdPVtdXG4gICAgXG4gICAgbWF4VHJhbnNhY3Rpb25XYWl0VGltZSA9IDEwMDAqNjAqMTsgLy8gMSBtaW4gYW5kIGRldGVsZXRlIHRyYW5zYWN0aW9uXG4gICAgbGFzdFN1Y2Nlc3NRdWVyeVRpbWUgPSAwO1xuICAgIHBpbmdJbnRlcnZhbCA9IDEwMDAqNjAqMjsgLy8gZWFjaCAyIG1pblxuICAgIFxuICAgIGZhaWxSZXBvcnRGaWxlU3RyZWFtOmZzLldyaXRlU3RyZWFtfG51bGw9bnVsbDtcbiAgICBmYWlsUmVwb3J0RmlsZVN0cmVhbU5hbWU6c3RyaW5nfG51bGw9bnVsbDtcbiAgICBmYWlsUmVwb3J0TGFzdEFjY2Vzc1RpbWU6bnVtYmVyPTA7XG5cbiAgICBwb29sQ29ubmVjdGlvbnM6bnVtYmVyPTA7XG4gICAgYWNxdWlyZWRQb29sQ29ubmVjdGlvbnM6bnVtYmVyPTA7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOkRCQWRhcHRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zPW9wdGlvbnM7XG5cbiAgICAgICAgIC8vIGRlY3J5cHQgd2hlbiBuZWVkZWRcbiAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5ob3N0LnN0YXJ0c1dpdGgoXCJfXCIpKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhvc3QgPSBkZWNyeXB0KHRoaXMub3B0aW9ucy5ob3N0LnN1YnN0cmluZygxKSkgPz8gdGhpcy5vcHRpb25zLmhvc3RcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnVzZXIuc3RhcnRzV2l0aChcIl9cIikpXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudXNlciA9IGRlY3J5cHQodGhpcy5vcHRpb25zLnVzZXIuc3Vic3RyaW5nKDEpKSA/PyB0aGlzLm9wdGlvbnMudXNlclxuICAgICAgICBpZih0aGlzLm9wdGlvbnMuZGF0YWJhc2Uuc3RhcnRzV2l0aChcIl9cIikpXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZGF0YWJhc2UgPSBkZWNyeXB0KHRoaXMub3B0aW9ucy5kYXRhYmFzZS5zdWJzdHJpbmcoMSkpID8/IHRoaXMub3B0aW9ucy5kYXRhYmFzZVxuICAgICAgICBpZih0aGlzLm9wdGlvbnMucGFzc3dvcmQuc3RhcnRzV2l0aChcIl9cIikpXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucGFzc3dvcmQgPSBkZWNyeXB0KHRoaXMub3B0aW9ucy5wYXNzd29yZC5zdWJzdHJpbmcoMSkpID8/IHRoaXMub3B0aW9ucy5wYXNzd29yZFxuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGZpbGUgZm9yIHRyYW5zYWN0aW9uIHBvcmJsZW0gcmVwb3J0XG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIpe1xuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIGlmKCFmcy5leGlzdHNTeW5jKHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIpKVxuICAgICAgICAgICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5vcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydERpcik7XG4gICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydERpcj11bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbG9nQ3JpdChcIk15c3FsQWRhcHRlclwiLFwiQ2FuJ3QgY3JlYXRlIHRyYW5zYWN0aW9uIGZhaWwgcmVwb3J0IGRpclwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBzZXR1cCBwcm9jZXNzIGV4aXQgaGFuZGxlcnMgaW50ZXJydXB0IChjdHJsK2MpXG4gICAgICAgIHRoaXMuc2VydmljZVN0YXJ0ZWQ9ZmFsc2U7XG4gICAgICAgIGxldCBwb29sQ3JlYXRlZDpib29sZWFuID0gZmFsc2U7XG4gICAgICAgIHdoaWxlKCFwb29sQ3JlYXRlZCl7XG4gICAgICAgICAgICBwb29sQ3JlYXRlZCA9IGF3YWl0IHRoaXMucmVjcmVhdGVQb29sKCk7XG4gICAgICAgICAgICBpZighcG9vbENyZWF0ZWQpe1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCJNeXNxbEFkYXB0ZXJcIixcIkNhbid0IGNvbm5lY3QgdG8gTVlTUUwhIFJldHJ5aW5nIGluIDMgc2Vjb25kcy4uLlwiKVxuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKT0+c2V0VGltZW91dChyZXNvbHZlLDMwMDApKSAvLyBzbGVlcCAzIHNlY29uZHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0dXBUaW1lcnMoKTtcbiAgICB9XG5cbiAgICBzZXR1cFRpbWVycygpe1xuXG4gICAgICAgIC8vIEhhbmRsZSBoYW5naW5nIHRyYW5zYWN0aW9uc1xuICAgICAgICBzZXRJbnRlcnZhbCgoKT0+e1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBjaGVjayB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMudHJhbnNhY3Rpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRJRHM6bnVtYmVyW109W107XG5cbiAgICAgICAgICAgIGZvcihsZXQgaSBvZiB0aGlzLnRyYW5zYWN0aW9ucyl7XG4gICAgICAgICAgICAgICAgaWYobm93LWkudGltZXN0YW1wPnRoaXMubWF4VHJhbnNhY3Rpb25XYWl0VGltZSl7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0Vycm9yKFwiUmVsZWFzZSB0cmFuc2FjdGlvbiBjb25uZWN0aW9uIGR1ZSB0byB0aW1lb3V0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbihpLHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVkSURzLnB1c2goaS5pZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbnMuZmlsdGVyKGk9PiFyZW1vdmVkSURzLmluY2x1ZGVzKGkuaWQpKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuZGVidWcgJiYgY291bnQtdGhpcy50cmFuc2FjdGlvbnMubGVuZ3RoPjApXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJSZW1vdmVkOiBcIixjb3VudC10aGlzLnRyYW5zYWN0aW9ucy5sZW5ndGgpXG5cbiAgICAgICAgICAgIC8vIFBJTkcgU0VSVkVSXG4gICAgICAgICAgICBpZihEYXRlLm5vdygpLXRoaXMubGFzdFN1Y2Nlc3NRdWVyeVRpbWU+dGhpcy5waW5nSW50ZXJ2YWwpe1xuICAgICAgICAgICAgICAgIGlmKCF0aGlzLnBvb2wpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgPTA7aTx0aGlzLm9wdGlvbnMuY29ubmVjdGlvbkxpbWl0O2krKylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeSh7cXVlcnk6XCJTRUxFQ1QgMSBATk9MSU1JVFwifSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICB9LDEwMDAqMzApXG4gICAgICAgIFxuXG4gICAgICAgIHNldEludGVydmFsKCgpPT57XG4gICAgICAgICAgICBpZighdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBhZnRlciAxNSBtaW4gb2YgaW5hY3Rpdml0eSwgY2xvc2UgZmlsZVxuICAgICAgICAgICAgaWYoRGF0ZS5ub3coKS10aGlzLmZhaWxSZXBvcnRMYXN0QWNjZXNzVGltZT4xMDAwKjYwKjE1KXtcbiAgICAgICAgICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtLmVuZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW09bnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LDEwMDAqNjAqNSlcbiAgICB9XG5cbiAgICAvKiogQ3JlYXRlIGNvbm5lY3Rpb24gcG9vbCAqL1xuICAgIGFzeW5jIHJlY3JlYXRlUG9vbCgpOlByb21pc2U8Ym9vbGVhbj57XG5cbiAgICAgICAgY29uc3Qgb3B0ID0ge1xuICAgICAgICAgICAgaG9zdDogdGhpcy5vcHRpb25zLmhvc3RcbiAgICAgICAgICAgICx1c2VyOiB0aGlzLm9wdGlvbnMudXNlclxuICAgICAgICAgICAgLHBhc3N3b3JkOiB0aGlzLm9wdGlvbnMucGFzc3dvcmRcbiAgICAgICAgICAgICxkYXRhYmFzZTogdGhpcy5vcHRpb25zLmRhdGFiYXNlXG4gICAgICAgICAgICAscG9ydDogdGhpcy5vcHRpb25zLnBvcnRcbiAgICAgICAgICAgICxjb25uZWN0aW9uTGltaXQ6IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uTGltaXRcbiAgICAgICAgICAgICxxdWV1ZUxpbWl0OiB0aGlzLm9wdGlvbnMucXVldWVMaW1pdCA/PyA1MFxuICAgICAgICAgICAgLG11bHRpcGxlU3RhdGVtZW50czogdHJ1ZVxuXG4gICAgICAgICAgICAsZW5hYmxlS2VlcEFsaXZlOnRydWVcbiAgICAgICAgICAgICxrZWVwQWxpdmVJbml0aWFsRGVsYXk6MyoxMDAwXG4gICAgICAgICAgICAvLyxtYXhJZGxlOjBcbiAgICAgICAgICAgICxpZGxlVGltZW91dDoxMDAwKjYwKjVcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ0luZm8oXCIke015c3FsQWRhcHRlci5qc31cIixcIkNvbm5lY3RpbmcgdG8gbXlzcWw6IFxcbiBcIitKU09OLnN0cmluZ2lmeSh7Li4ub3B0LHBhc3N3b3JkOlwiKioqKlwifSxudWxsLFwiXFx0XCIpKVxuICAgIFxuICAgICAgICBpZih0aGlzLnBvb2wpe1xuICAgICAgICAgICAgdGhpcy5wb29sLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgdHJ5e2F3YWl0IHRoaXMucG9vbC5lbmQoKTt9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgbG9nQ3JpdChcIk15c3FsQWRhcHRlclwiLFwiQ2FuJ3QgY2xvc2UgTVlTUUwgcG9vbCEgXCIrZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucG9vbCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBcbiAgICAgICAgLy8gS2VlcCBhbGl2ZSBwYWNrZXRzIHNob3VsZCBiZSBzZW50XG4gICAgICAgIC8qZW5hYmxlS2VlcEFsaXZlOiB0cnVlLFxuICAgICAgICAvLyBXZSBzaG91bGQgc3RhcnQgc2VuZGluZyB0aGVtIGVhcmx5XG4gICAgICAgIGtlZXBBbGl2ZUluaXRpYWxEZWxheTogMyAqIDEwMDAsIC8vIDMgc2Vjb25kc1xuICAgICAgICAvLyBXZSBkb24ndCB3YW50IGlkbGUgY29ubmVjdGlvbnMsIGJ1dCBpdCdzIG5vdCBtYW5kYXRvcnkgZm9yIHRoZSBmaXggdG8gd29yaywgaXQgc2VlbXNcbiAgICAgICAgbWF4SWRsZTogMCxcbiAgICAgICAgLy8gSWRsZSB0aW1lb3V0IG11Y2ggbGFyZ2VyIHRoYW4ga2VlcCBhbGl2ZSBkZWxheSBhbmQgbXVjaCBzbWFsbGVyIHRoYW4gTXlTUUwncyB0aW1lb3V0IHNldHRpbmdcbiAgICAgICAgaWRsZVRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgLy8gNSBtaW51dGVzXG4gICAgICAgICovXG5cbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgdGhpcy5wb29sID1teXNxbC5jcmVhdGVQb29sKG9wdCk7XG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGxvZ0NyaXQoXCJNeXNxbEFkYXB0ZXJcIixcIkNhbid0IGNvbm5lY3QgdG8gTVlTUUwhIFwiK2UpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBcbiAgICAgICAgLy8gVE9ETyB3YXRjaCBmb3IgZnJlZSBwb29sIGNvbm5lY3Rpb25zXG4gICAgICAgIHRoaXMucG9vbENvbm5lY3Rpb25zID0gMDtcbiAgICAgICAgdGhpcy5hY3F1aXJlZFBvb2xDb25uZWN0aW9ucyA9IDA7XG4gICAgICAgIHRoaXMucG9vbD8ub24oJ2Nvbm5lY3Rpb24nLCAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgIGxvZ0luZm8oXCJNeXNxbEFkYXB0ZXJcIixcInBvb2wgLT4gY29ubmVjdGlvbiBjcmVhdGVkLCB0b3RhbDpcIit0aGlzLnBvb2xDb25uZWN0aW9ucysrKVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb29sPy5vbignYWNxdWlyZScsIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuZGVidWcpXG4gICAgICAgICAgICAgICAgbG9nSW5mbyhcIk15c3FsQWRhcHRlclwiLFwicG9vbCAtPiBjb25uZWN0aW9uIGFjcXVpcmUsIHRvdGFsOlwiK3RoaXMuYWNxdWlyZWRQb29sQ29ubmVjdGlvbnMrKylcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5wb29sPy5vbigncmVsZWFzZScsIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuZGVidWcpXG4gICAgICAgICAgICAgICAgbG9nSW5mbyhcIk15c3FsQWRhcHRlclwiLFwicG9vbCAtPiBjb25uZWN0aW9uIHJlbGVhc2UsIHRvdGFsOlwiK3RoaXMuYWNxdWlyZWRQb29sQ29ubmVjdGlvbnMtLSlcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5wb29sPy5vbignZW5xdWV1ZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBsb2dJbmZvKFwiTXlzcWxBZGFwdGVyXCIsXCJwb29sIC0+IHdhaXRpbmcgZm9yIGF2YWlsYWJsZSBjb25uZWN0aW9uXCIpXG4gICAgICAgIH0pXG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBjb25uZWN0aW9uXG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2hlY2sgbXlzcWwgY29ubmVjdGlvblwiKVxuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnkoe3F1ZXJ5OlwiU0VMRUNUIDEgQE5PTElNSVRcIn0pO1xuICAgICAgICBcbiAgICAgICAgaWYocmVzLmVycm9yKXtcbiAgICAgICAgICAgIGxvZ0NyaXQoXCJNeXNxbEFkYXB0ZXJcIixcInBvb2wgLT4gY2hlY2sgY29ubmVjdGlvbiBsaXZlbmVzIHdhcyBmYWlsZWQ6IFwiK3Jlcy5lcnJvci5tZXNzYWdlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgcXVlcnkocmVxdWVzdDogSURCUXVlcnkpOiBQcm9taXNlPElEQlJlc3VsdD4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMucHJlcGFyZVF1ZXJ5KHJlcXVlc3QpO1xuXG4gICAgICAgIC8vIENoZWNrIHBvb2xcbiAgICAgICAgaWYoIXRoaXMucG9vbCl7XG4gICAgICAgICAgICBsb2dFcnJvcihcIiR7TXlzcWxBZGFwdGVyLmpzfVwiLFwiTm8gcG9vbCBjcmVhdGVkLCBjYW4ndCBleGVjdXRlIHF1ZXJ5XCIpXG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcIk5PX1BPT0xcIixcbiAgICAgICAgICAgICAgICBlcnJubzogMTAwMDAwLFxuICAgICAgICAgICAgICAgIGZhdGFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNxbDogcXVlcnksXG4gICAgICAgICAgICAgICAgbmFtZTpcIk5PX1BPT0xcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOlwiTXlzcWwgcG9vbCBub3QgY3JlYXRlZFwiLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYocmVxdWVzdC50aHJvd2FibGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgey4uLkRlZmF1bHRFcnJvcnMuREJfRVJST1IsZGV0YWlsczplcnJvci5tZXNzYWdlLHN0YWNrOmVycm9yfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6bnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjplcnJvcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgLy8gZ2V0IGNvbm5lY3Rpb25cbiAgICAgICAgICAgIGxldCBjb25uOm15c3FsLlBvb2xDb25uZWN0aW9ufG51bGw9bnVsbFxuICAgICAgICAgICAgaWYocmVxdWVzdC50cmFuc2FjdGlvbklEICYmIHJlcXVlc3QudHJhbnNhY3Rpb25JRD4wKXtcbiAgICAgICAgICAgICAgICBjb25uID0gdGhpcy50cmFuc2FjdGlvbnMuZmluZChpPT5pLmlkPT09cmVxdWVzdC50cmFuc2FjdGlvbklEKT8uY29ubiA/PyBudWxsO1xuICAgICAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFeGVjdXRlIHF1ZXJ5IG9uIHRyYW5zYWN0aW9uOiBcIixjb25uPy50aHJlYWRJZClcbiAgICAgICAgICAgIH1lbHNlXG4gICAgICAgICAgICAgICAgY29ubiA9IGF3YWl0IHRoaXMucG9vbC5nZXRDb25uZWN0aW9uKCk7XG4gICAgICAgIFxuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXhlY3V0ZSBxdWVyeVwiLGNvbm4/LnRocmVhZElkKVxuICAgICAgICBcbiAgICAgICAgICAgIC8vIGlmIGNvbm5lY3Rpb24gbm90IGNyZWF0ZWRcbiAgICAgICAgICAgIGlmKCFjb25uKXtcbiAgICAgICAgICAgICAgICBsb2dDcml0KFwiJHtNeXNxbEFkYXB0ZXIuanN9XCIsYE5vIGNvbm5lY3Rpb24gY3JlYXRlZCFgKVxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBcIk5PX0NPTk5cIixcbiAgICAgICAgICAgICAgICAgICAgZXJybm86IDEwMDAwMSxcbiAgICAgICAgICAgICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNxbDogcXVlcnksXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6XCJOT19DT05OXCIsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6XCJNeXNxbCBwb29sIGNhbnQgZ2V0IGNvbm5lY3Rpb25cIixcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZihyZXF1ZXN0LnRocm93YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgey4uLkRlZmF1bHRFcnJvcnMuREJfRVJST1IsZGV0YWlsczplcnJvci5tZXNzYWdlLHN0YWNrOmVycm9yfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6bnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3IsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgICAgICBsb2dJbmZvKFwiRXhlY3V0ZSBxdWVyeTpcIixxdWVyeSlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbm4ucXVlcnkocXVlcnkpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJRiBDT05ORUNUSU9OIE5PVCBJTiBUUkFOU0FDVElPTiFcbiAgICAgICAgICAgICAgICBpZighcmVxdWVzdC50cmFuc2FjdGlvbklEKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmFsaXplQ29ubmVjdGlvbihjb25uKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6cmVzdWx0WzBdLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjpudWxsXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9Y2F0Y2goZSl7XG5cbiAgICAgICAgICAgICAgICBpZighcmVxdWVzdC50cmFuc2FjdGlvbklEKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmFsaXplQ29ubmVjdGlvbihjb25uKTtcblxuICAgICAgICAgICAgICAgIGlmKHJlcXVlc3QudHJhbnNhY3Rpb25JRCAmJiByZXF1ZXN0LnRocm93YWJsZSl7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIHJvbGxiYWNrLCBpZiB0cmFuc2FjdGlvbiB3YXMgZmFpbGVkICYgdGhyb3dhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbih0aGlzLnRyYW5zYWN0aW9ucy5maW5kKGk9PmkuaWQ9PT1yZXF1ZXN0LnRyYW5zYWN0aW9uSUQpIGFzIElUcmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluYWxpemVDb25uZWN0aW9uKGNvbm4pOyAvLyB1bm5lY2Vzc2FyeSwgYnV0IGp1c3QgaW4gY2FzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlTXlzcWxRdWVyeUVycm9yKGUpO1xuICAgICAgICAgICAgICAgIGlmKHJlcXVlc3QudGhyb3dhYmxlKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyB7Li4uRGVmYXVsdEVycm9ycy5EQl9FUlJPUixkZXRhaWxzOmVycm9yLm1lc3NhZ2Usc3RhY2s6ZXJyb3J9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTpudWxsLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjp0aGlzLmNyZWF0ZU15c3FsUXVlcnlFcnJvcihlKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsb2dDcml0KFwiTXlzcWxBZGFwdGVyXCIsYEVycm9yIHdoZW4gZXhlY3V0aW5nIHF1ZXJ5OiAke2V9YClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJFWEVDX0VSUk9SXCIsXG4gICAgICAgICAgICAgICAgZXJybm86IDEwMDAwMixcbiAgICAgICAgICAgICAgICBmYXRhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzcWw6IHF1ZXJ5LFxuICAgICAgICAgICAgICAgIG5hbWU6XCJFWEVDVVRJT05fRVJST1JcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOmUrXCJcIixcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYocmVxdWVzdC50aHJvd2FibGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgey4uLkRlZmF1bHRFcnJvcnMuREJfRVJST1IsZGV0YWlsczplcnJvci5tZXNzYWdlLHN0YWNrOmVycm9yfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6bnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjplcnJvcixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmaW5hbGl6ZUNvbm5lY3Rpb24oY29ubjpteXNxbC5Qb29sQ29ubmVjdGlvbil7XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIGNvbm4ucmVsZWFzZSgpO1xuICAgICAgICAgICAgY29ubi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJlbGVhc2UgY29ubmVjdGlvbjogXCIsY29ubi50aHJlYWRJZClcbiAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgbG9nQ3JpdChcIk15c3FsQWRhcHRlclwiLGBDYW4ndCByZWxlYXNlIGNvbm5lY3Rpb246ICR7ZX1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJlcGFyZVF1ZXJ5KHJlcXVlc3Q6IElEQlF1ZXJ5KTpzdHJpbmd7XG5cbiAgICAgICAgbGV0IHF1ZXJ5ID0gcmVxdWVzdC5xdWVyeTtcbiAgICAgICAgbGV0IGZpZWxkcyA9IHJlcXVlc3QuZmllbGRzO1xuXG4gICAgICAgIGlmKGZpZWxkcyl7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZmllbGRzKXtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkc1tpXTtcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkc1tpXT17dmFsdWU6dmFsdWUsc3lzdGVtOmZhbHNlfVxuICAgICAgICAgICAgICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmKHZhbHVlPT09bnVsbClcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzW2ldPXt2YWx1ZTpudWxsLHN5c3RlbTp0cnVlfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZD0gTXlzcWxBZGFwdGVyLnByZXBhcmVRdWVyeUZpZWxkVmFsdWUodmFsdWUgYXMgSURCUXVlcnlGaWVsZCk7XG5cbiAgICAgICAgICAgICAgICAvLyB0b2RvIGNyZWF0ZSByZWdleCB0byByZXBsYWNlIGFsbFxuICAgICAgICAgICAgICAgIHF1ZXJ5PXF1ZXJ5LnJlcGxhY2VBbGwoXCJAXCIrbmFtZSxwYXJzZWQrXCJcIikgXG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIFxuICAgICAgICBjb25zdCB0bXAgPSBxdWVyeS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZih0bXAuaW5kZXhPZihcInNlbGVjdFwiKT09PTAgJiYgdG1wLmluZGV4T2YoXCJsaW1pdFwiKT09PS0xKVxuICAgICAgICAgICAgcXVlcnkrPVwiIExJTUlUIDEwMFwiXG4gICAgICAgICAgICBcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlQWxsKFwiQE5PTElNSVRcIixcIlwiKVxuICAgIFxuICAgICAgICBpZihxdWVyeS5pbmRleE9mKFwiQGZpZWxkc1wiKSE9PS0xKXtcbiAgICAgICAgICAgICAgICBsZXQgaW5zZXJ0RmllbGROYW1lcz1bXVxuICAgICAgICAgICAgICAgIGxldCBpbnNlcnRGaWVsZFZhbHVlcz1bXVxuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBmaWVsZHMpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgZiA9IGZpZWxkc1tpXSBhcyBJREJRdWVyeUZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZihmLmlnbm9yZUluSW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFmLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0RmllbGROYW1lcy5wdXNoKCdgJysoZi5uYW1lK1wiXCIpLnJlcGxhY2VBbGwoXCJgXCIsJycpLnJlcGxhY2VBbGwoJ1xcXCInLFwiXCIpLnJlcGxhY2VBbGwoJ1xcJycsXCJcIikrJ2AnKVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRGaWVsZFZhbHVlcy5wdXNoKGYuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICBxdWVyeT1xdWVyeVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnQGZpZWxkcycsaW5zZXJ0RmllbGROYW1lcy5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJ0B2YWx1ZXMnLGluc2VydEZpZWxkVmFsdWVzLmpvaW4oXCIsXCIpKVxuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgaWYocXVlcnkuaW5kZXhPZihcIkBpbnNlcnRcIikhPT0tMSl7XG4gICAgICAgICAgICAgICAgbGV0IG9uaW5zZXJ0TmFtZXM9W11cbiAgICAgICAgICAgICAgICBsZXQgb25pbnNlcnRWYWx1ZXM9W11cbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gZmllbGRzKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGYgPSBmaWVsZHNbaV0gYXMgSURCUXVlcnlGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYoZi5pZ25vcmVJbkluc2VydClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBvbmluc2VydE5hbWVzLnB1c2goKGYubmFtZStcIlwiKS5yZXBsYWNlQWxsKFwiYFwiLCcnKS5yZXBsYWNlQWxsKCdcXFwiJyxcIlwiKS5yZXBsYWNlQWxsKCdcXCcnLFwiXCIpKVxuICAgICAgICAgICAgICAgICAgICBvbmluc2VydFZhbHVlcy5wdXNoKGYuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2VBbGwoXCJAaW5zZXJ0XCIsYCgke29uaW5zZXJ0TmFtZXMuam9pbihcIixcIil9KSBWQUxVRVMgKCR7b25pbnNlcnRWYWx1ZXMuam9pbihcIixcIil9KWApXG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpZihxdWVyeS5pbmRleE9mKFwiQG9udXBkYXRlXCIpIT09LTEpe1xuICAgICAgICAgICAgICAgIGxldCBvblVwZGF0ZT1bXVxuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBmaWVsZHMpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgZiA9IGZpZWxkc1tpXSBhcyBJREJRdWVyeUZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZihmLmlnbm9yZUluVXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIG9uVXBkYXRlLnB1c2goJ2AnKyhmLm5hbWUrXCJcIikucmVwbGFjZUFsbChcImBcIiwnJykucmVwbGFjZUFsbCgnXFxcIicsXCJcIikucmVwbGFjZUFsbCgnXFwnJyxcIlwiKSsnYCA9ICcrZi5fcGFyc2VkVmFsdWUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZUFsbChcIkBvbnVwZGF0ZVwiLG9uVXBkYXRlLmpvaW4oXCIgLCBcIikpXG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpZihxdWVyeS5pbmRleE9mKCdAb25kdXBsaWNhdGUnKSE9PS0xKXtcbiAgICAgICAgICAgICAgICBsZXQgb25EdXBsaWNhdGU9W107XG4gICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIGZpZWxkcyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmID0gZmllbGRzW2ldIGFzIElEQlF1ZXJ5RmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFmLnVzZUluUmVwbGFjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBvbkR1cGxpY2F0ZS5wdXNoKCdgJysoZi5uYW1lK1wiXCIpLnJlcGxhY2VBbGwoXCJgXCIsJycpLnJlcGxhY2VBbGwoJ1xcXCInLFwiXCIpLnJlcGxhY2VBbGwoJ1xcJycsXCJcIikrJ2AgPSAnK2YuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2VBbGwoXCJAb25kdXBsaWNhdGVcIixvbkR1cGxpY2F0ZS5qb2luKFwiICwgXCIpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiAgcXVlcnk7XG4gICAgfVxuXG4gICAgLyoqIFByZXBhcmUgZmllbGQgdmFsdWUgKi9cbiAgICBzdGF0aWMgcHJlcGFyZVF1ZXJ5RmllbGRWYWx1ZShmaWVsZDpJREJRdWVyeUZpZWxkKTpzdHJpbmd8bnVtYmVyfGJvb2xlYW58bnVsbHx1bmRlZmluZWR7XG4gICAgICAgIGxldCB2YWx1ZSA9IGZpZWxkLnZhbHVlO1xuICAgICAgICBsZXQgc3lzdGVtID0gZmllbGQuc3lzdGVtO1xuXG4gICAgICAgIGlmKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gXCJOVUxMXCJcblxuICAgICAgICBpZighc3lzdGVtICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZUFsbCgnXCInLCdcXFxcXCInKTtcbiAgICAgICAgICAgIFxuICAgICAgICBmaWVsZC5fX3BhcnNlZFZhbHVlPXZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWUgYXMgYW55O1xuICAgIH1cblxuICAgIHByZXBhcmVDb3VudFF1ZXJ5KHF1ZXJ5OnN0cmluZyk6c3RyaW5ne1xuICAgICAgICBsZXQgY291bnRRdWVyeSA9IHF1ZXJ5O1xuXG4gICAgICAgIC8vIFJFTU9WRSBMSU1JVFxuICAgICAgICBpZihjb3VudFF1ZXJ5LmluZGV4T2YoXCJMSU1JVFwiKT09PS0xKVxuICAgICAgICAgICAgY291bnRRdWVyeSA9IGNvdW50UXVlcnkuc3Vic3RyaW5nKDAsY291bnRRdWVyeS5pbmRleE9mKFwiTElNSVRcIikpO1xuICAgICAgICBcbiAgICAgICAgLy8gUkVNT1ZFIE9SREVSIFxuICAgICAgICBpZihjb3VudFF1ZXJ5LmluZGV4T2YoXCJPUkRFUlwiKSE9PS0xKVxuICAgICAgICAgICAgY291bnRRdWVyeSA9IGNvdW50UXVlcnkuc3Vic3RyaW5nKDAsY291bnRRdWVyeS5pbmRleE9mKFwiT1JERVJcIikpXG5cbiAgICAgICAgLy9UT0RPOiBSRU1PVkUgSk9JTlNcblxuICAgICAgICBjb3VudFF1ZXJ5ID0gY291bnRRdWVyeS5zdWJzdHJpbmcoY291bnRRdWVyeS5pbmRleE9mKFwiRlJPTVwiKSk7XG4gICAgICAgIFxuXG4gICAgICAgIGNvdW50UXVlcnkgPSBcIlNFTEVDVCBDT1VOVCgxKSBhcyBgY291bnRgIFwiK2NvdW50UXVlcnlcbiAgICAgICAgcmV0dXJuIGNvdW50UXVlcnk7XG4gICAgfVxuXG5cbiAgICAvLyBUUkFOU0FDVElPTlNcbiAgICBhc3luYyBjb21taXQodHJ4OklUcmFuc2FjdGlvbik6UHJvbWlzZTxJREJFcnJvcnxudWxsPntcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgYXdhaXQgdHJ4LmNvbm4uY29tbWl0KCk7XG4gICAgICAgICAgICAvL2F3YWl0IHRyeC5jb25uLnF1ZXJ5KFwiQ09NTUlUXCIpO1xuICAgICAgICAgICAgdHJ4LmNvbm4ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICB0cnguY29ubi5yZWxlYXNlKCk7XG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbih0cngpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTXlzcWxRdWVyeUVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuXG4gICAgYXN5bmMgcm9sbGJhY2tUcmFuc2FjdGlvbih0cng6SVRyYW5zYWN0aW9uLGRvbk5vdFJlbW92ZT86Ym9vbGVhbik6UHJvbWlzZTxJREJFcnJvcnxudWxsPntcbiAgICAgICAgbGV0IGVycj1udWxsO1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJvbGxiYWNrIHN0YXJ0ZWRcIix0cnguY29ubi50aHJlYWRJZClcbiAgICAgICAgICAgIGF3YWl0IHRyeC5jb25uLnJvbGxiYWNrKCk7XG4gICAgICAgICAgICBhd2FpdCB0cnguY29ubi5jb21taXQoKTtcbiAgICAgICAgICAgIHRyeC5jb25uLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgdHJ4LmNvbm4ucmVsZWFzZSgpO1xuICAgICAgICAgICAgaWYoIWRvbk5vdFJlbW92ZSlcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHRoaXMudHJhbnNhY3Rpb25zLmZpbHRlcihpPT5pLmlkIT09dHJ4LmlkKTtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJvbGxiYWNrIGNvbXBsZXRlXCIsdHJ4LmNvbm4udGhyZWFkSWQpXG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGxvZ0NyaXQoXCJNeXNxbEFkYXB0ZXJcIixcIkNhbid0IHJvbGxiYWNrIHRyYW5zYWN0aW9uXCIsdHJ4LnF1ZXJpZXMpXG4gICAgICAgICAgICBlcnIgPSB0aGlzLmNyZWF0ZU15c3FsUXVlcnlFcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3JlVHJhbnNhY3Rpb25Bc1Byb2JsZW0odHJ4LFwicm9sbGJhY2tcIilcbiAgICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEZpbmlzaCBzZXJ2aWNlXG4gICAgICovXG4gICAgYXN5bmMgZmluaXNoKCl7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiRmluaXNoaW5nIG15c3FsIHNlcnZpY2VcIilcbiAgICAgICAgZm9yKGxldCBpIG9mIHRoaXMudHJhbnNhY3Rpb25zKVxuICAgICAgICAgICAgdGhpcy5yb2xsYmFja1RyYW5zYWN0aW9uKGkpO1xuXG4gICAgICAgIGlmKHRoaXMucG9vbCl7XG4gICAgICAgICAgICB0cnl7YXdhaXQgdGhpcy5wb29sLmVuZCgpO31jYXRjaChlKXtcbiAgICAgICAgICAgICAgICBsb2dDcml0KFwiTXlzcWxBZGFwdGVyXCIsXCJDYW4ndCBjbG9zZSBNWVNRTCBwb29sIVwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbSlcbiAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0uZW5kKCk7XG4gICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW09bnVsbDtcbiAgICB9XG5cbiAgICBjcmVhdGVNeXNxbFF1ZXJ5RXJyb3IoZXJyOmFueSx0aHJvd2FibGU/OmJvb2xlYW4pOklEQkVycm9ye1xuICAgICAgICBpZihlcnIgJiYgIHR5cGVvZiBlcnI9PT1cIm9iamVjdFwiICYmIFwiY29kZVwiIGluIGVyciAmJiBcImVycm5vXCIgaW4gZXJyICYmIFwic3FsXCIgaW4gZXJyICYmIFwibmFtZVwiIGluIGVyciAmJiBcIm1lc3NhZ2VcIiBpbiBlcnIpe1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogZXJyLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGVycm5vOiBlcnIuZXJybm8sXG4gICAgICAgICAgICAgICAgICAgIHNxbDogZXJyLnNxbCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTplcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTplcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgZmF0YWw6ZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiUVVFUllfRVJSXCIsXG4gICAgICAgICAgICAgICAgZXJybm86IDEwMDAwMixcbiAgICAgICAgICAgICAgICBmYXRhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzcWw6IFwibm8gcXVlcnlcIixcbiAgICAgICAgICAgICAgICBuYW1lOlwiUVVFUllfRVJSXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcIkVycm9yOiBcIisoZXJyKT9lcnI6XCJcIixcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHN0b3JlVHJhbnNhY3Rpb25Bc1Byb2JsZW0odHJ4OklUcmFuc2FjdGlvbixtZXNzYWdlOnN0cmluZyl7XG4gICAgXG4gICAgICAgIGlmKCF0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0ICYmICF0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyKXtcbiAgICAgICAgICAgIGxvZ0NyaXQoXCJNeXNxbEFkYXB0ZXJcIixcIkNhbid0IHJlcG9ydCBmYWlsZWQgdHJhbnNhY3Rpb24sIG5vIHJlcG9ydCBmdW5jdGlvbjogdHJhbnNhY3Rpb25GYWlsUmVwb3J0IGluIG9wdGlvbnMsIGFuZCB0cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIgaXNudCBzZXRcIilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIpe1xuICAgICAgICAgICAgY29uc3QgeXl5bW1kZCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwxMCkucmVwbGFjZUFsbChcIi1cIixcIlwiKTtcblxuICAgICAgICAgICAgLy9zdG9yZSB0cmFuc2FjdGlvblxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIseXl5bW1kZCtcIi5qc29uXCIpO1xuICAgICAgICAgICAgaWYodGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbSl7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbU5hbWUhPT1maWxlKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbS5lbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbT1udWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZih0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtTmFtZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZpbGUse2ZsYWdzOidhJ30pO1xuICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW1OYW1lPWZpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlN0b3JlIHRyYW5zYWN0aW9uIGZhaWwgcmVwb3J0OiBcIixmaWxlLHRyeC5xdWVyaWVzLG1lc3NhZ2UpXG5cbiAgICAgICAgICAgIGlmKCF0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtKVxuICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShmaWxlLHtmbGFnczonYSd9KTtcblxuICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbS53cml0ZShKU09OLnN0cmluZ2lmeSh7cXVlcmllczp0cngucXVlcmllcyx0aW1lOnRyeC50aW1lc3RhbXAsZGF0ZSxtZXNzYWdlfSkrXCJcXG59RU9Ce1xcblwiLGVycj0+e1xuICAgICAgICAgICAgICAgIGlmKGVycilcbiAgICAgICAgICAgICAgICAgICAgbG9nQ3JpdChcIk15c3FsQWRhcHRlclwiLFwiQ2FuJ3Qgd3JpdGUgdG8gdHJhbnNhY3Rpb24gZmFpbCByZXBvcnQgZmlsZVwiKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgbG9nSW5mbyhcIk15c3FsQWRhcHRlclwiLFwiVHJhbnNhY3Rpb24gZmFpbCByZXBvcnQgc3RvcmVkXCIpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0TGFzdEFjY2Vzc1RpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIH1cblxuICAgICAgICBcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydClcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnQodHJ4LG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuXG5cbmNvbnN0IHNlY3JldF9rZXk9XCJBS0xXa2FqdyVeJmRnd3FodyM5ODQ1M2kyM2JmazIzcm4ya25rbmdscmdqZWl0XCJcbmNvbnN0IHNlY3JldF9pdj1cInJ0aGFkcmZrMjNybjJrbiMqRk5LQUBndDQ0ZGYzdHNscmdqIyMhaXRcIlxuXG4vLyBHZW5lcmF0ZSBzZWNyZXQgaGFzaCB3aXRoIGNyeXB0byB0byB1c2UgZm9yIGVuY3J5cHRpb25cbmNvbnN0IGtleSA9IGNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzZWNyZXRfa2V5KS5kaWdlc3QoJ2hleCcpLnN1YnN0cmluZygwLCAzMilcbmNvbnN0IGl2ID0gY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNlY3JldF9pdikuZGlnZXN0KCdoZXgnKS5zdWJzdHJpbmcoMCwgMTYpXG5cbmNvbnN0IGRlY3J5cHQgPShlbmNyeXB0ZWQ6c3RyaW5nKTpzdHJpbmd8bnVsbD0+e1xuICB0cnl7XG4gICAgICBlbmNyeXB0ZWQgPSBCdWZmZXIuZnJvbShlbmNyeXB0ZWQsICdiYXNlNjQnKS50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgICBjb25zdCBkZWNpcGhlciA9IGNyZWF0ZURlY2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywga2V5LCBpdik7XG4gICAgICBsZXQgZGVjcnlwdGVkID0gZGVjaXBoZXIudXBkYXRlKGVuY3J5cHRlZCwgJ2JpbmFyeScsICd1dGY4Jyk7XG4gICAgICBkZWNyeXB0ZWQgKz0gZGVjaXBoZXIuZmluYWwoJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBkZWNyeXB0ZWQ7XG4gIH1jYXRjaChlKXtcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59Il19
|