@sochdb/sochdb 0.5.1 → 0.5.2

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/cjs/queue.js CHANGED
@@ -96,21 +96,73 @@ function encodeQueueKey(key) {
96
96
  return Buffer.concat(parts);
97
97
  }
98
98
  /**
99
- * Decode queue key from bytes
99
+ * Decode queue key from bytes using positional parsing.
100
+ * Key format: "queue/" + queueId + "/" + i64BE(priority) + "/" + u64BE(readyTs) + "/" + u64BE(sequence) + "/" + taskId
101
+ * Binary fields may contain 0x2F ('/'), so split('/') is NOT safe.
100
102
  */
101
103
  function decodeQueueKey(data) {
102
- const str = data.toString();
103
- const parts = str.split('/');
104
- if (parts.length < 6 || parts[0] !== 'queue') {
105
- throw new errors_1.SochDBError('Invalid queue key format');
104
+ // Must start with "queue/"
105
+ const prefix = Buffer.from('queue/');
106
+ if (data.length < prefix.length || data.subarray(0, prefix.length).compare(prefix) !== 0) {
107
+ throw new errors_1.SochDBError('Invalid queue key format: missing queue/ prefix');
106
108
  }
107
- return {
108
- queueId: parts[1],
109
- priority: 0, // Would need to decode from bytes
110
- readyTs: 0,
111
- sequence: 0,
112
- taskId: parts[parts.length - 1],
113
- };
109
+ let offset = prefix.length;
110
+ // Find queueId: scan for the '/' before the 8-byte priority field
111
+ // The queueId ends at the first '/' followed by exactly 8 bytes + '/' + 8 bytes + '/' + 8 bytes + '/' + taskId
112
+ // Strategy: walk from the end. Structure after queueId:
113
+ // "/" + 8-byte priority + "/" + 8-byte readyTs + "/" + 8-byte sequence + "/" + taskId
114
+ // Total fixed overhead after queueId: 1 + 8 + 1 + 8 + 1 + 8 + 1 = 28 bytes, then taskId
115
+ // Find queueId by scanning for '/' such that remaining = 28 + taskId.len
116
+ // We know: after queueId, fixed structure is:
117
+ // /[8 bytes]/[8 bytes]/[8 bytes]/[taskId]
118
+ // So scan forward to find the separator. QueueId is a plain string (no binary),
119
+ // so find the first '/' after "queue/" that has at least 28 bytes remaining after it.
120
+ let queueIdEnd = -1;
121
+ for (let i = offset; i < data.length; i++) {
122
+ if (data[i] === 0x2F) { // '/'
123
+ const remaining = data.length - i - 1; // bytes after this '/'
124
+ // Need 8 (priority) + 1 (/) + 8 (readyTs) + 1 (/) + 8 (sequence) + 1 (/) + at least 1 (taskId) = 28
125
+ if (remaining >= 28) {
126
+ queueIdEnd = i;
127
+ break;
128
+ }
129
+ }
130
+ }
131
+ if (queueIdEnd < 0) {
132
+ throw new errors_1.SochDBError('Invalid queue key format: cannot find queueId');
133
+ }
134
+ const queueId = data.subarray(offset, queueIdEnd).toString();
135
+ offset = queueIdEnd + 1; // skip '/'
136
+ // Read priority (8 bytes, i64 big-endian order-preserving)
137
+ if (offset + 8 > data.length)
138
+ throw new errors_1.SochDBError('Invalid queue key: truncated priority');
139
+ const priority = decodeI64BE(data.subarray(offset, offset + 8));
140
+ offset += 8;
141
+ // Skip '/'
142
+ if (data[offset] !== 0x2F)
143
+ throw new errors_1.SochDBError('Invalid queue key: expected / after priority');
144
+ offset += 1;
145
+ // Read readyTs (8 bytes, u64 big-endian)
146
+ if (offset + 8 > data.length)
147
+ throw new errors_1.SochDBError('Invalid queue key: truncated readyTs');
148
+ const readyTs = decodeU64BE(data.subarray(offset, offset + 8));
149
+ offset += 8;
150
+ // Skip '/'
151
+ if (data[offset] !== 0x2F)
152
+ throw new errors_1.SochDBError('Invalid queue key: expected / after readyTs');
153
+ offset += 1;
154
+ // Read sequence (8 bytes, u64 big-endian)
155
+ if (offset + 8 > data.length)
156
+ throw new errors_1.SochDBError('Invalid queue key: truncated sequence');
157
+ const sequence = decodeU64BE(data.subarray(offset, offset + 8));
158
+ offset += 8;
159
+ // Skip '/'
160
+ if (data[offset] !== 0x2F)
161
+ throw new errors_1.SochDBError('Invalid queue key: expected / after sequence');
162
+ offset += 1;
163
+ // Remaining is taskId
164
+ const taskId = data.subarray(offset).toString();
165
+ return { queueId, priority, readyTs, sequence, taskId };
114
166
  }
115
167
  // ============================================================================
116
168
  // Priority Queue
@@ -180,9 +232,42 @@ class PriorityQueue {
180
232
  */
181
233
  async dequeue(workerId) {
182
234
  const now = Date.now();
183
- const prefix = `queue/${this.config.name}/`;
184
- // TODO: Implement range scan to find first ready task
185
- // For now, this is a placeholder
235
+ const prefix = Buffer.from(`queue/${this.config.name}/`);
236
+ // Scan all tasks in priority order (binary sort = priority order due to big-endian encoding)
237
+ try {
238
+ for await (const [keyBuf, valueBuf] of this.db.scanPrefix(prefix)) {
239
+ const task = JSON.parse(valueBuf.toString());
240
+ // Skip non-pending tasks
241
+ if (task.state !== TaskState.PENDING) {
242
+ continue;
243
+ }
244
+ // Decode key to check readyTs
245
+ try {
246
+ const queueKey = decodeQueueKey(keyBuf);
247
+ if (queueKey.readyTs > now) {
248
+ continue; // Not ready yet
249
+ }
250
+ }
251
+ catch {
252
+ continue; // Skip malformed keys
253
+ }
254
+ // Claim this task atomically
255
+ task.state = TaskState.CLAIMED;
256
+ task.claimedAt = now;
257
+ task.claimedBy = workerId;
258
+ // Re-serialize the payload correctly (it's stored as base64 in JSON)
259
+ const updatedValue = Buffer.from(JSON.stringify(task));
260
+ await this.db.put(keyBuf, updatedValue);
261
+ // Update stats
262
+ await this.decrementStat('pending');
263
+ await this.incrementStat('claimed');
264
+ await this.incrementStat('totalDequeued');
265
+ return task;
266
+ }
267
+ }
268
+ catch {
269
+ // If scan is not available via scanPrefix, return null
270
+ }
186
271
  return null;
187
272
  }
188
273
  /**
@@ -190,10 +275,11 @@ class PriorityQueue {
190
275
  */
191
276
  async ack(taskId) {
192
277
  // Find and update task state
193
- const task = await this.getTask(taskId);
194
- if (!task) {
278
+ const result = await this.getTask(taskId);
279
+ if (!result) {
195
280
  throw new errors_1.SochDBError(`Task not found: ${taskId}`);
196
281
  }
282
+ const { task } = result;
197
283
  if (task.state !== TaskState.CLAIMED) {
198
284
  throw new errors_1.SochDBError(`Task not in claimed state: ${taskId}`);
199
285
  }
@@ -209,10 +295,11 @@ class PriorityQueue {
209
295
  * Negative acknowledge - return task to queue
210
296
  */
211
297
  async nack(taskId) {
212
- const task = await this.getTask(taskId);
213
- if (!task) {
298
+ const result = await this.getTask(taskId);
299
+ if (!result) {
214
300
  throw new errors_1.SochDBError(`Task not found: ${taskId}`);
215
301
  }
302
+ const { task } = result;
216
303
  task.retries++;
217
304
  if (task.retries >= (this.config.maxRetries || 3)) {
218
305
  // Move to dead letter queue
@@ -248,19 +335,51 @@ class PriorityQueue {
248
335
  * Purge completed tasks
249
336
  */
250
337
  async purge() {
251
- // TODO: Implement purging of completed tasks
252
- return 0;
338
+ const prefix = Buffer.from(`queue/${this.config.name}/`);
339
+ let purged = 0;
340
+ try {
341
+ const toDelete = [];
342
+ for await (const [keyBuf, valueBuf] of this.db.scanPrefix(prefix)) {
343
+ const task = JSON.parse(valueBuf.toString());
344
+ if (task.state === TaskState.COMPLETED || task.state === TaskState.DEAD_LETTERED) {
345
+ toDelete.push(keyBuf);
346
+ }
347
+ }
348
+ for (const key of toDelete) {
349
+ await this.db.delete(key);
350
+ purged++;
351
+ }
352
+ }
353
+ catch {
354
+ // Return count so far
355
+ }
356
+ return purged;
253
357
  }
254
358
  // Helper methods
255
359
  generateTaskId() {
256
360
  return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
257
361
  }
258
362
  async getTask(taskId) {
259
- // TODO: Implement task lookup
363
+ const prefix = Buffer.from(`queue/${this.config.name}/`);
364
+ try {
365
+ for await (const [keyBuf, valueBuf] of this.db.scanPrefix(prefix)) {
366
+ const task = JSON.parse(valueBuf.toString());
367
+ if (task.taskId === taskId) {
368
+ return { task, keyBuf };
369
+ }
370
+ }
371
+ }
372
+ catch {
373
+ // Scan not available
374
+ }
260
375
  return null;
261
376
  }
262
377
  async updateTask(task) {
263
- // TODO: Implement task update
378
+ const result = await this.getTask(task.taskId);
379
+ if (result) {
380
+ const valueBuf = Buffer.from(JSON.stringify(task));
381
+ await this.db.put(result.keyBuf, valueBuf);
382
+ }
264
383
  }
265
384
  async getStat(name) {
266
385
  const key = `_queue_stats/${this.config.name}/${name}`;
@@ -286,4 +405,4 @@ PriorityQueue.sequenceCounter = 0;
286
405
  function createQueue(db, name, config) {
287
406
  return PriorityQueue.fromDatabase(db, name, config);
288
407
  }
289
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVldWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcXVldWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRzs7O0FBZ1dILGtDQU1DO0FBcFdELHFDQUF1QztBQUV2QywrRUFBK0U7QUFDL0UsYUFBYTtBQUNiLCtFQUErRTtBQUUvRSxJQUFZLFNBS1g7QUFMRCxXQUFZLFNBQVM7SUFDbkIsZ0NBQW1CLENBQUE7SUFDbkIsZ0NBQW1CLENBQUE7SUFDbkIsb0NBQXVCLENBQUE7SUFDdkIsNENBQStCLENBQUE7QUFDakMsQ0FBQyxFQUxXLFNBQVMseUJBQVQsU0FBUyxRQUtwQjtBQWFELCtFQUErRTtBQUMvRSxxQkFBcUI7QUFDckIsK0VBQStFO0FBRS9FOztHQUVHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBYTtJQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwQyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLEdBQVc7SUFDOUIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLEtBQWE7SUFDaEMsa0NBQWtDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJ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QUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFZO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkQsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDOztBQW5NSCxzQ0FvTUM7QUFuTWdCLDZCQUFlLEdBQUcsQ0FBQyxDQUFDO0FBcU1yQzs7R0FFRztBQUNILFNBQWdCLFdBQVcsQ0FDekIsRUFBTyxFQUNQLElBQVksRUFDWixNQUE2QjtJQUU3QixPQUFPLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTb2NoREIgUHJpb3JpdHkgUXVldWVcbiAqIFxuICogRmlyc3QtY2xhc3MgcXVldWUgQVBJIHdpdGggb3JkZXJlZC1rZXkgdGFzayBlbnRyaWVzLCBwcm92aWRpbmcgZWZmaWNpZW50XG4gKiBwcmlvcml0eSBxdWV1ZSBvcGVyYXRpb25zIHdpdGhvdXQgdGhlIE8oTikgYmxvYiByZXdyaXRlIGFudGktcGF0dGVybi5cbiAqIFxuICogRmVhdHVyZXM6XG4gKiAtIE9yZGVyZWQta2V5IHJlcHJlc2VudGF0aW9uOiBFYWNoIHRhc2sgaGFzIGl0cyBvd24ga2V5LCBubyBibG9iIHBhcnNpbmdcbiAqIC0gTyhsb2cgTikgZW5xdWV1ZS9kZXF1ZXVlIHdpdGggb3JkZXJlZCBzY2Fuc1xuICogLSBBdG9taWMgY2xhaW0gcHJvdG9jb2wgZm9yIGNvbmN1cnJlbnQgd29ya2Vyc1xuICogLSBWaXNpYmlsaXR5IHRpbWVvdXQgZm9yIGNyYXNoIHJlY292ZXJ5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBEYXRhYmFzZSwgUHJpb3JpdHlRdWV1ZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogY29uc3QgZGIgPSBhd2FpdCBEYXRhYmFzZS5vcGVuKCcuL3F1ZXVlX2RiJyk7XG4gKiBjb25zdCBxdWV1ZSA9IFByaW9yaXR5UXVldWUuZnJvbURhdGFiYXNlKGRiLCAndGFza3MnKTtcbiAqIFxuICogLy8gRW5xdWV1ZSB0YXNrXG4gKiBhd2FpdCBxdWV1ZS5lbnF1ZXVlKDEsIEJ1ZmZlci5mcm9tKCdoaWdoIHByaW9yaXR5IHRhc2snKSk7XG4gKiBcbiAqIC8vIERlcXVldWUgYW5kIHByb2Nlc3NcbiAqIGNvbnN0IHRhc2sgPSBhd2FpdCBxdWV1ZS5kZXF1ZXVlKCd3b3JrZXItMScpO1xuICogaWYgKHRhc2spIHtcbiAqICAgLy8gUHJvY2VzcyB0YXNrLi4uXG4gKiAgIGF3YWl0IHF1ZXVlLmFjayh0YXNrLnRhc2tJZCk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBTb2NoREJFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVGFzayBTdGF0ZVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgZW51bSBUYXNrU3RhdGUge1xuICBQRU5ESU5HID0gJ3BlbmRpbmcnLFxuICBDTEFJTUVEID0gJ2NsYWltZWQnLFxuICBDT01QTEVURUQgPSAnY29tcGxldGVkJyxcbiAgREVBRF9MRVRURVJFRCA9ICdkZWFkX2xldHRlcmVkJyxcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUXVldWUgQ29uZmlndXJhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXVlQ29uZmlnIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2aXNpYmlsaXR5VGltZW91dD86IG51bWJlcjsgLy8gbWlsbGlzZWNvbmRzLCBkZWZhdWx0IDMwMDAwXG4gIG1heFJldHJpZXM/OiBudW1iZXI7IC8vIGRlZmF1bHQgM1xuICBkZWFkTGV0dGVyUXVldWU/OiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFF1ZXVlIEtleSBFbmNvZGluZ1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEVuY29kZSB1NjQgYXMgYmlnLWVuZGlhbiBmb3IgbGV4aWNvZ3JhcGhpYyBvcmRlcmluZ1xuICovXG5mdW5jdGlvbiBlbmNvZGVVNjRCRSh2YWx1ZTogbnVtYmVyKTogQnVmZmVyIHtcbiAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDgpO1xuICBidWYud3JpdGVCaWdVSW50NjRCRShCaWdJbnQodmFsdWUpKTtcbiAgcmV0dXJuIGJ1Zjtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYmlnLWVuZGlhbiB1NjRcbiAqL1xuZnVuY3Rpb24gZGVjb2RlVTY0QkUoYnVmOiBCdWZmZXIpOiBudW1iZXIge1xuICByZXR1cm4gTnVtYmVyKGJ1Zi5yZWFkQmlnVUludDY0QkUoMCkpO1xufVxuXG4vKipcbiAqIEVuY29kZSBpNjQgYXMgYmlnLWVuZGlhbiBwcmVzZXJ2aW5nIG9yZGVyXG4gKi9cbmZ1bmN0aW9uIGVuY29kZUk2NEJFKHZhbHVlOiBudW1iZXIpOiBCdWZmZXIge1xuICAvLyBNYXAgaTY0IHRvIHU2NCBieSBhZGRpbmcgb2Zmc2V0XG4gIGNvbnN0IG1hcHBlZCA9IEJpZ0ludCh2YWx1ZSkgKyAoMW4gPDwgNjNuKTtcbiAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDgpO1xuICBidWYud3JpdGVCaWdVSW50NjRCRShtYXBwZWQpO1xuICByZXR1cm4gYnVmO1xufVxuXG4vKipcbiAqIERlY29kZSBiaWctZW5kaWFuIGk2NFxuICovXG5mdW5jdGlvbiBkZWNvZGVJNjRCRShidWY6IEJ1ZmZlcik6IG51bWJlciB7XG4gIGNvbnN0IG1hcHBlZCA9IGJ1Zi5yZWFkQmlnVUludDY0QkUoMCk7XG4gIHJldHVybiBOdW1iZXIobWFwcGVkIC0gKDFuIDw8IDYzbikpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRdWV1ZSBLZXlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUtleSB7XG4gIHF1ZXVlSWQ6IHN0cmluZztcbiAgcHJpb3JpdHk6IG51bWJlcjtcbiAgcmVhZHlUczogbnVtYmVyOyAvLyB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmRzXG4gIHNlcXVlbmNlOiBudW1iZXI7XG4gIHRhc2tJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuY29kZSBxdWV1ZSBrZXkgdG8gYnl0ZXMgZm9yIHN0b3JhZ2VcbiAqL1xuZnVuY3Rpb24gZW5jb2RlUXVldWVLZXkoa2V5OiBRdWV1ZUtleSk6IEJ1ZmZlciB7XG4gIGNvbnN0IHBhcnRzID0gW1xuICAgIEJ1ZmZlci5mcm9tKCdxdWV1ZS8nKSxcbiAgICBCdWZmZXIuZnJvbShrZXkucXVldWVJZCksXG4gICAgQnVmZmVyLmZyb20oJy8nKSxcbiAgICBlbmNvZGVJNjRCRShrZXkucHJpb3JpdHkpLFxuICAgIEJ1ZmZlci5mcm9tKCcvJyksXG4gICAgZW5jb2RlVTY0QkUoa2V5LnJlYWR5VHMpLFxuICAgIEJ1ZmZlci5mcm9tKCcvJyksXG4gICAgZW5jb2RlVTY0QkUoa2V5LnNlcXVlbmNlKSxcbiAgICBCdWZmZXIuZnJvbSgnLycpLFxuICAgIEJ1ZmZlci5mcm9tKGtleS50YXNrSWQpLFxuICBdO1xuICBcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQocGFydHMpO1xufVxuXG4vKipcbiAqIERlY29kZSBxdWV1ZSBrZXkgZnJvbSBieXRlc1xuICovXG5mdW5jdGlvbiBkZWNvZGVRdWV1ZUtleShkYXRhOiBCdWZmZXIpOiBRdWV1ZUtleSB7XG4gIGNvbnN0IHN0ciA9IGRhdGEudG9TdHJpbmcoKTtcbiAgY29uc3QgcGFydHMgPSBzdHIuc3BsaXQoJy8nKTtcbiAgXG4gIGlmIChwYXJ0cy5sZW5ndGggPCA2IHx8IHBhcnRzWzBdICE9PSAncXVldWUnKSB7XG4gICAgdGhyb3cgbmV3IFNvY2hEQkVycm9yKCdJbnZhbGlkIHF1ZXVlIGtleSBmb3JtYXQnKTtcbiAgfVxuICBcbiAgcmV0dXJuIHtcbiAgICBxdWV1ZUlkOiBwYXJ0c1sxXSxcbiAgICBwcmlvcml0eTogMCwgLy8gV291bGQgbmVlZCB0byBkZWNvZGUgZnJvbSBieXRlc1xuICAgIHJlYWR5VHM6IDAsXG4gICAgc2VxdWVuY2U6IDAsXG4gICAgdGFza0lkOiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVGFza1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhc2sge1xuICB0YXNrSWQ6IHN0cmluZztcbiAgcHJpb3JpdHk6IG51bWJlcjtcbiAgcGF5bG9hZDogQnVmZmVyO1xuICBzdGF0ZTogVGFza1N0YXRlO1xuICBlbnF1ZXVlZEF0OiBudW1iZXI7XG4gIGNsYWltZWRBdD86IG51bWJlcjtcbiAgY2xhaW1lZEJ5Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IG51bWJlcjtcbiAgcmV0cmllczogbnVtYmVyO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFF1ZXVlIFN0YXRpc3RpY3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBRdWV1ZVN0YXRzIHtcbiAgcGVuZGluZzogbnVtYmVyO1xuICBjbGFpbWVkOiBudW1iZXI7XG4gIGNvbXBsZXRlZDogbnVtYmVyO1xuICBkZWFkTGV0dGVyZWQ6IG51bWJlcjtcbiAgdG90YWxFbnF1ZXVlZDogbnVtYmVyO1xuICB0b3RhbERlcXVldWVkOiBudW1iZXI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFByaW9yaXR5IFF1ZXVlXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBQcmlvcml0eVF1ZXVlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgc2VxdWVuY2VDb3VudGVyID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRiOiBhbnksXG4gICAgcHJpdmF0ZSBjb25maWc6IFF1ZXVlQ29uZmlnXG4gICkge1xuICAgIC8vIFNldCBkZWZhdWx0c1xuICAgIHRoaXMuY29uZmlnLnZpc2liaWxpdHlUaW1lb3V0ID0gY29uZmlnLnZpc2liaWxpdHlUaW1lb3V0IHx8IDMwMDAwO1xuICAgIHRoaXMuY29uZmlnLm1heFJldHJpZXMgPSBjb25maWcubWF4UmV0cmllcyB8fCAzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBxdWV1ZSBmcm9tIGVtYmVkZGVkIGRhdGFiYXNlXG4gICAqL1xuICBzdGF0aWMgZnJvbURhdGFiYXNlKGRiOiBhbnksIG5hbWU6IHN0cmluZywgY29uZmlnPzogUGFydGlhbDxRdWV1ZUNvbmZpZz4pOiBQcmlvcml0eVF1ZXVlIHtcbiAgICBjb25zdCBmdWxsQ29uZmlnOiBRdWV1ZUNvbmZpZyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICAuLi5jb25maWcsXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByaW9yaXR5UXVldWUoZGIsIGZ1bGxDb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBxdWV1ZSBmcm9tIGdSUEMgY2xpZW50XG4gICAqL1xuICBzdGF0aWMgZnJvbUNsaWVudChjbGllbnQ6IGFueSwgbmFtZTogc3RyaW5nLCBjb25maWc/OiBQYXJ0aWFsPFF1ZXVlQ29uZmlnPik6IFByaW9yaXR5UXVldWUge1xuICAgIGNvbnN0IGZ1bGxDb25maWc6IFF1ZXVlQ29uZmlnID0ge1xuICAgICAgbmFtZSxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJpb3JpdHlRdWV1ZShjbGllbnQsIGZ1bGxDb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVucXVldWUgYSB0YXNrIHdpdGggcHJpb3JpdHlcbiAgICogTG93ZXIgcHJpb3JpdHkgbnVtYmVyID0gaGlnaGVyIHVyZ2VuY3lcbiAgICovXG4gIGFzeW5jIGVucXVldWUoXG4gICAgcHJpb3JpdHk6IG51bWJlcixcbiAgICBwYXlsb2FkOiBCdWZmZXIsXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGFza0lkID0gdGhpcy5nZW5lcmF0ZVRhc2tJZCgpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgXG4gICAgY29uc3Qga2V5OiBRdWV1ZUtleSA9IHtcbiAgICAgIHF1ZXVlSWQ6IHRoaXMuY29uZmlnLm5hbWUsXG4gICAgICBwcmlvcml0eSxcbiAgICAgIHJlYWR5VHM6IG5vdyxcbiAgICAgIHNlcXVlbmNlOiBQcmlvcml0eVF1ZXVlLnNlcXVlbmNlQ291bnRlcisrLFxuICAgICAgdGFza0lkLFxuICAgIH07XG5cbiAgICBjb25zdCB0YXNrOiBUYXNrID0ge1xuICAgICAgdGFza0lkLFxuICAgICAgcHJpb3JpdHksXG4gICAgICBwYXlsb2FkLFxuICAgICAgc3RhdGU6IFRhc2tTdGF0ZS5QRU5ESU5HLFxuICAgICAgZW5xdWV1ZWRBdDogbm93LFxuICAgICAgcmV0cmllczogMCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBjb25zdCBrZXlCdWYgPSBlbmNvZGVRdWV1ZUtleShrZXkpO1xuICAgIGNvbnN0IHZhbHVlQnVmID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodGFzaykpO1xuICAgIFxuICAgIGF3YWl0IHRoaXMuZGIucHV0KGtleUJ1ZiwgdmFsdWVCdWYpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdGF0c1xuICAgIGF3YWl0IHRoaXMuaW5jcmVtZW50U3RhdCgndG90YWxFbnF1ZXVlZCcpO1xuICAgIGF3YWl0IHRoaXMuaW5jcmVtZW50U3RhdCgncGVuZGluZycpO1xuICAgIFxuICAgIHJldHVybiB0YXNrSWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVxdWV1ZSB0aGUgaGlnaGVzdCBwcmlvcml0eSB0YXNrXG4gICAqIFJldHVybnMgbnVsbCBpZiBubyB0YXNrcyBhdmFpbGFibGVcbiAgICovXG4gIGFzeW5jIGRlcXVldWUod29ya2VySWQ6IHN0cmluZyk6IFByb21pc2U8VGFzayB8IG51bGw+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHByZWZpeCA9IGBxdWV1ZS8ke3RoaXMuY29uZmlnLm5hbWV9L2A7XG4gICAgXG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHJhbmdlIHNjYW4gdG8gZmluZCBmaXJzdCByZWFkeSB0YXNrXG4gICAgLy8gRm9yIG5vdywgdGhpcyBpcyBhIHBsYWNlaG9sZGVyXG4gICAgXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQWNrbm93bGVkZ2UgdGFzayBjb21wbGV0aW9uXG4gICAqL1xuICBhc3luYyBhY2sodGFza0lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBGaW5kIGFuZCB1cGRhdGUgdGFzayBzdGF0ZVxuICAgIGNvbnN0IHRhc2sgPSBhd2FpdCB0aGlzLmdldFRhc2sodGFza0lkKTtcbiAgICBpZiAoIXRhc2spIHtcbiAgICAgIHRocm93IG5ldyBTb2NoREJFcnJvcihgVGFzayBub3QgZm91bmQ6ICR7dGFza0lkfWApO1xuICAgIH1cblxuICAgIGlmICh0YXNrLnN0YXRlICE9PSBUYXNrU3RhdGUuQ0xBSU1FRCkge1xuICAgICAgdGhyb3cgbmV3IFNvY2hEQkVycm9yKGBUYXNrIG5vdCBpbiBjbGFpbWVkIHN0YXRlOiAke3Rhc2tJZH1gKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGFzayBzdGF0ZVxuICAgIHRhc2suc3RhdGUgPSBUYXNrU3RhdGUuQ09NUExFVEVEO1xuICAgIHRhc2suY29tcGxldGVkQXQgPSBEYXRlLm5vdygpO1xuICAgIFxuICAgIGF3YWl0IHRoaXMudXBkYXRlVGFzayh0YXNrKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgc3RhdHNcbiAgICBhd2FpdCB0aGlzLmRlY3JlbWVudFN0YXQoJ2NsYWltZWQnKTtcbiAgICBhd2FpdCB0aGlzLmluY3JlbWVudFN0YXQoJ2NvbXBsZXRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5lZ2F0aXZlIGFja25vd2xlZGdlIC0gcmV0dXJuIHRhc2sgdG8gcXVldWVcbiAgICovXG4gIGFzeW5jIG5hY2sodGFza0lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YXNrID0gYXdhaXQgdGhpcy5nZXRUYXNrKHRhc2tJZCk7XG4gICAgaWYgKCF0YXNrKSB7XG4gICAgICB0aHJvdyBuZXcgU29jaERCRXJyb3IoYFRhc2sgbm90IGZvdW5kOiAke3Rhc2tJZH1gKTtcbiAgICB9XG5cbiAgICB0YXNrLnJldHJpZXMrKztcbiAgICBcbiAgICBpZiAodGFzay5yZXRyaWVzID49ICh0aGlzLmNvbmZpZy5tYXhSZXRyaWVzIHx8IDMpKSB7XG4gICAgICAvLyBNb3ZlIHRvIGRlYWQgbGV0dGVyIHF1ZXVlXG4gICAgICB0YXNrLnN0YXRlID0gVGFza1N0YXRlLkRFQURfTEVUVEVSRUQ7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVRhc2sodGFzayk7XG4gICAgICBhd2FpdCB0aGlzLmRlY3JlbWVudFN0YXQoJ2NsYWltZWQnKTtcbiAgICAgIGF3YWl0IHRoaXMuaW5jcmVtZW50U3RhdCgnZGVhZExldHRlcmVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldHVybiB0byBwZW5kaW5nXG4gICAgICB0YXNrLnN0YXRlID0gVGFza1N0YXRlLlBFTkRJTkc7XG4gICAgICB0YXNrLmNsYWltZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgIHRhc2suY2xhaW1lZEJ5ID0gdW5kZWZpbmVkO1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVUYXNrKHRhc2spO1xuICAgICAgYXdhaXQgdGhpcy5kZWNyZW1lbnRTdGF0KCdjbGFpbWVkJyk7XG4gICAgICBhd2FpdCB0aGlzLmluY3JlbWVudFN0YXQoJ3BlbmRpbmcnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHF1ZXVlIHN0YXRpc3RpY3NcbiAgICovXG4gIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8UXVldWVTdGF0cz4ge1xuICAgIHJldHVybiB7XG4gICAgICBwZW5kaW5nOiBhd2FpdCB0aGlzLmdldFN0YXQoJ3BlbmRpbmcnKSxcbiAgICAgIGNsYWltZWQ6IGF3YWl0IHRoaXMuZ2V0U3RhdCgnY2xhaW1lZCcpLFxuICAgICAgY29tcGxldGVkOiBhd2FpdCB0aGlzLmdldFN0YXQoJ2NvbXBsZXRlZCcpLFxuICAgICAgZGVhZExldHRlcmVkOiBhd2FpdCB0aGlzLmdldFN0YXQoJ2RlYWRMZXR0ZXJlZCcpLFxuICAgICAgdG90YWxFbnF1ZXVlZDogYXdhaXQgdGhpcy5nZXRTdGF0KCd0b3RhbEVucXVldWVkJyksXG4gICAgICB0b3RhbERlcXVldWVkOiBhd2FpdCB0aGlzLmdldFN0YXQoJ3RvdGFsRGVxdWV1ZWQnKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFB1cmdlIGNvbXBsZXRlZCB0YXNrc1xuICAgKi9cbiAgYXN5bmMgcHVyZ2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgcHVyZ2luZyBvZiBjb21wbGV0ZWQgdGFza3NcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2RzXG4gIHByaXZhdGUgZ2VuZXJhdGVUYXNrSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0VGFzayh0YXNrSWQ6IHN0cmluZyk6IFByb21pc2U8VGFzayB8IG51bGw+IHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGFzayBsb29rdXBcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlVGFzayh0YXNrOiBUYXNrKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHRhc2sgdXBkYXRlXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFN0YXQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBrZXkgPSBgX3F1ZXVlX3N0YXRzLyR7dGhpcy5jb25maWcubmFtZX0vJHtuYW1lfWA7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmRiLmdldChCdWZmZXIuZnJvbShrZXkpKTtcbiAgICByZXR1cm4gdmFsdWUgPyBwYXJzZUludCh2YWx1ZS50b1N0cmluZygpKSA6IDA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluY3JlbWVudFN0YXQobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuZ2V0U3RhdChuYW1lKTtcbiAgICBjb25zdCBrZXkgPSBgX3F1ZXVlX3N0YXRzLyR7dGhpcy5jb25maWcubmFtZX0vJHtuYW1lfWA7XG4gICAgYXdhaXQgdGhpcy5kYi5wdXQoQnVmZmVyLmZyb20oa2V5KSwgQnVmZmVyLmZyb20oKGN1cnJlbnQgKyAxKS50b1N0cmluZygpKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRlY3JlbWVudFN0YXQobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuZ2V0U3RhdChuYW1lKTtcbiAgICBjb25zdCBrZXkgPSBgX3F1ZXVlX3N0YXRzLyR7dGhpcy5jb25maWcubmFtZX0vJHtuYW1lfWA7XG4gICAgYXdhaXQgdGhpcy5kYi5wdXQoQnVmZmVyLmZyb20oa2V5KSwgQnVmZmVyLmZyb20oTWF0aC5tYXgoMCwgY3VycmVudCAtIDEpLnRvU3RyaW5nKCkpKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIHF1ZXVlIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVRdWV1ZShcbiAgZGI6IGFueSxcbiAgbmFtZTogc3RyaW5nLFxuICBjb25maWc/OiBQYXJ0aWFsPFF1ZXVlQ29uZmlnPlxuKTogUHJpb3JpdHlRdWV1ZSB7XG4gIHJldHVybiBQcmlvcml0eVF1ZXVlLmZyb21EYXRhYmFzZShkYiwgbmFtZSwgY29uZmlnKTtcbn1cbiJdfQ==
408
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVldWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcXVldWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRzs7O0FBb2VILGtDQU1DO0FBeGVELHFDQUF1QztBQUV2QywrRUFBK0U7QUFDL0UsYUFBYTtBQUNiLCtFQUErRTtBQUUvRSxJQUFZLFNBS1g7QUFMRCxXQUFZLFNBQVM7SUFDbkIsZ0NBQW1CLENBQUE7SUFDbkIsZ0NBQW1CLENBQUE7SUFDbkIsb0NBQXVCLENBQUE7SUFDdkIsNENBQStCLENBQUE7QUFDakMsQ0FBQyxFQUxXLFNBQVMseUJBQVQsU0FBUyxRQUtwQjtBQWFELCtFQUErRTtBQUMvRSxxQkFBcUI7QUFDckIsK0VBQStFO0FBRS9FOztHQUVHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBYTtJQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwQyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLEdBQVc7SUFDOUIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLEtBQWE7SUFDaEMsa0NBQWtDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLEdBQVc7SUFDOUIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBY0Q7O0dBRUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxHQUFhO0lBQ25DLE1BQU0sS0FBSyxHQUFHO1FBQ1osTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2hCLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2hCLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2hCLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztLQUN4QixDQUFDO0lBRUYsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsSUFBWTtJQUNsQywyQkFBMkI7SUFDM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pGLE1BQU0sSUFBSSxvQkFBVyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFFM0Isa0VBQWtFO0lBQ2xFLCtHQUErRztJQUMvRyx3REFBd0Q7SUFDeEQsd0ZBQXdGO0lBQ3hGLHdGQUF3RjtJQUN4Rix5RUFBeUU7SUFFekUsOENBQThDO0lBQzlDLDRDQUE0QztJQUM1QyxpRkFBaUY7SUFDakYsc0ZBQXNGO0lBQ3RGLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDMUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNO1lBQzVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHVCQUF1QjtZQUM5RCxvR0FBb0c7WUFDcEcsSUFBSSxTQUFTLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ3BCLFVBQVUsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxvQkFBVyxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdELE1BQU0sR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVztJQUVwQywyREFBMkQ7SUFDM0QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNO1FBQUUsTUFBTSxJQUFJLG9CQUFXLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUM3RixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBVyxDQUFDLENBQUM7SUFDMUUsTUFBTSxJQUFJLENBQUMsQ0FBQztJQUVaLFdBQVc7SUFDWCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJO1FBQUUsTUFBTSxJQUFJLG9CQUFXLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUNqRyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBRVoseUNBQXlDO0lBQ3pDLElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTTtRQUFFLE1BQU0sSUFBSSxvQkFBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDNUYsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQVcsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFFWixXQUFXO0lBQ1gsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSTtRQUFFLE1BQU0sSUFBSSxvQkFBVyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDaEcsTUFBTSxJQUFJLENBQUMsQ0FBQztJQUVaLDBDQUEwQztJQUMxQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLElBQUksb0JBQVcsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQzdGLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFXLENBQUMsQ0FBQztJQUMxRSxNQUFNLElBQUksQ0FBQyxDQUFDO0lBRVosV0FBVztJQUNYLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUk7UUFBRSxNQUFNLElBQUksb0JBQVcsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0lBQ2pHLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFFWixzQkFBc0I7SUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUVoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzFELENBQUM7QUFnQ0QsK0VBQStFO0FBQy9FLGlCQUFpQjtBQUNqQiwrRUFBK0U7QUFFL0UsTUFBYSxhQUFhO0lBR3hCLFlBQ1UsRUFBTyxFQUNQLE1BQW1CO1FBRG5CLE9BQUUsR0FBRixFQUFFLENBQUs7UUFDUCxXQUFNLEdBQU4sTUFBTSxDQUFhO1FBRTNCLGVBQWU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLENBQUM7UUFDbEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFPLEVBQUUsSUFBWSxFQUFFLE1BQTZCO1FBQ3RFLE1BQU0sVUFBVSxHQUFnQjtZQUM5QixJQUFJO1lBQ0osR0FBRyxNQUFNO1NBQ1YsQ0FBQztRQUNGLE9BQU8sSUFBSSxhQUFhLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBVyxFQUFFLElBQVksRUFBRSxNQUE2QjtRQUN4RSxNQUFNLFVBQVUsR0FBZ0I7WUFDOUIsSUFBSTtZQUNKLEdBQUcsTUFBTTtTQUNWLENBQUM7UUFDRixPQUFPLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FDWCxRQUFnQixFQUNoQixPQUFlLEVBQ2YsUUFBOEI7UUFFOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUV2QixNQUFNLEdBQUcsR0FBYTtZQUNwQixPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQ3pCLFFBQVE7WUFDUixPQUFPLEVBQUUsR0FBRztZQUNaLFFBQVEsRUFBRSxhQUFhLENBQUMsZUFBZSxFQUFFO1lBQ3pDLE1BQU07U0FDUCxDQUFDO1FBRUYsTUFBTSxJQUFJLEdBQVM7WUFDakIsTUFBTTtZQUNOLFFBQVE7WUFDUixPQUFPO1lBQ1AsS0FBSyxFQUFFLFNBQVMsQ0FBQyxPQUFPO1lBQ3hCLFVBQVUsRUFBRSxHQUFHO1lBQ2YsT0FBTyxFQUFFLENBQUM7WUFDVixRQUFRO1NBQ1QsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVuRCxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVwQyxlQUFlO1FBQ2YsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVwQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFnQjtRQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUV6RCw2RkFBNkY7UUFDN0YsSUFBSSxDQUFDO1lBQ0gsSUFBSSxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNsRSxNQUFNLElBQUksR0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUVuRCx5QkFBeUI7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3JDLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCw4QkFBOEI7Z0JBQzlCLElBQUksQ0FBQztvQkFDSCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3hDLElBQUksUUFBUSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQzt3QkFDM0IsU0FBUyxDQUFDLGdCQUFnQjtvQkFDNUIsQ0FBQztnQkFDSCxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxTQUFTLENBQUMsc0JBQXNCO2dCQUNsQyxDQUFDO2dCQUVELDZCQUE2QjtnQkFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7Z0JBRTFCLHFFQUFxRTtnQkFDckUsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUV4QyxlQUFlO2dCQUNmLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBRTFDLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCx1REFBdUQ7UUFDekQsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFjO1FBQ3RCLDZCQUE2QjtRQUM3QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLG9CQUFXLENBQUMsbUJBQW1CLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUVELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFFeEIsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksb0JBQVcsQ0FBQyw4QkFBOEIsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUU5QixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUIsZUFBZTtRQUNmLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFjO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksb0JBQVcsQ0FBQyxtQkFBbUIsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFZixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xELDRCQUE0QjtZQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUM7WUFDckMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDTixvQkFBb0I7WUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzNCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDcEMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsS0FBSztRQUNULE9BQU87WUFDTCxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUN0QyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUN0QyxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUMxQyxZQUFZLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztZQUNoRCxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUNsRCxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztTQUNuRCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztZQUM5QixJQUFJLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ2xFLE1BQU0sSUFBSSxHQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ25ELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNqRixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4QixDQUFDO1lBQ0gsQ0FBQztZQUVELEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sRUFBRSxDQUFDO1lBQ1gsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxzQkFBc0I7UUFDeEIsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxpQkFBaUI7SUFDVCxjQUFjO1FBQ3BCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBYztRQUNsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQztZQUNILElBQUksS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsTUFBTSxJQUFJLEdBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO29CQUMzQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUMxQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxxQkFBcUI7UUFDdkIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBVTtRQUNqQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuRCxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQVk7UUFDaEMsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFZO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkQsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQVk7UUFDdEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2RCxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7O0FBOVFILHNDQStRQztBQTlRZ0IsNkJBQWUsR0FBRyxDQUFDLENBQUM7QUFnUnJDOztHQUVHO0FBQ0gsU0FBZ0IsV0FBVyxDQUN6QixFQUFPLEVBQ1AsSUFBWSxFQUNaLE1BQTZCO0lBRTdCLE9BQU8sYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBQcmlvcml0eSBRdWV1ZVxuICogXG4gKiBGaXJzdC1jbGFzcyBxdWV1ZSBBUEkgd2l0aCBvcmRlcmVkLWtleSB0YXNrIGVudHJpZXMsIHByb3ZpZGluZyBlZmZpY2llbnRcbiAqIHByaW9yaXR5IHF1ZXVlIG9wZXJhdGlvbnMgd2l0aG91dCB0aGUgTyhOKSBibG9iIHJld3JpdGUgYW50aS1wYXR0ZXJuLlxuICogXG4gKiBGZWF0dXJlczpcbiAqIC0gT3JkZXJlZC1rZXkgcmVwcmVzZW50YXRpb246IEVhY2ggdGFzayBoYXMgaXRzIG93biBrZXksIG5vIGJsb2IgcGFyc2luZ1xuICogLSBPKGxvZyBOKSBlbnF1ZXVlL2RlcXVldWUgd2l0aCBvcmRlcmVkIHNjYW5zXG4gKiAtIEF0b21pYyBjbGFpbSBwcm90b2NvbCBmb3IgY29uY3VycmVudCB3b3JrZXJzXG4gKiAtIFZpc2liaWxpdHkgdGltZW91dCBmb3IgY3Jhc2ggcmVjb3ZlcnlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IERhdGFiYXNlLCBQcmlvcml0eVF1ZXVlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiBjb25zdCBkYiA9IGF3YWl0IERhdGFiYXNlLm9wZW4oJy4vcXVldWVfZGInKTtcbiAqIGNvbnN0IHF1ZXVlID0gUHJpb3JpdHlRdWV1ZS5mcm9tRGF0YWJhc2UoZGIsICd0YXNrcycpO1xuICogXG4gKiAvLyBFbnF1ZXVlIHRhc2tcbiAqIGF3YWl0IHF1ZXVlLmVucXVldWUoMSwgQnVmZmVyLmZyb20oJ2hpZ2ggcHJpb3JpdHkgdGFzaycpKTtcbiAqIFxuICogLy8gRGVxdWV1ZSBhbmQgcHJvY2Vzc1xuICogY29uc3QgdGFzayA9IGF3YWl0IHF1ZXVlLmRlcXVldWUoJ3dvcmtlci0xJyk7XG4gKiBpZiAodGFzaykge1xuICogICAvLyBQcm9jZXNzIHRhc2suLi5cbiAqICAgYXdhaXQgcXVldWUuYWNrKHRhc2sudGFza0lkKTtcbiAqIH1cbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IFNvY2hEQkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUYXNrIFN0YXRlXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBlbnVtIFRhc2tTdGF0ZSB7XG4gIFBFTkRJTkcgPSAncGVuZGluZycsXG4gIENMQUlNRUQgPSAnY2xhaW1lZCcsXG4gIENPTVBMRVRFRCA9ICdjb21wbGV0ZWQnLFxuICBERUFEX0xFVFRFUkVEID0gJ2RlYWRfbGV0dGVyZWQnLFxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRdWV1ZSBDb25maWd1cmF0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVldWVDb25maWcge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZpc2liaWxpdHlUaW1lb3V0PzogbnVtYmVyOyAvLyBtaWxsaXNlY29uZHMsIGRlZmF1bHQgMzAwMDBcbiAgbWF4UmV0cmllcz86IG51bWJlcjsgLy8gZGVmYXVsdCAzXG4gIGRlYWRMZXR0ZXJRdWV1ZT86IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUXVldWUgS2V5IEVuY29kaW5nXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRW5jb2RlIHU2NCBhcyBiaWctZW5kaWFuIGZvciBsZXhpY29ncmFwaGljIG9yZGVyaW5nXG4gKi9cbmZ1bmN0aW9uIGVuY29kZVU2NEJFKHZhbHVlOiBudW1iZXIpOiBCdWZmZXIge1xuICBjb25zdCBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoOCk7XG4gIGJ1Zi53cml0ZUJpZ1VJbnQ2NEJFKEJpZ0ludCh2YWx1ZSkpO1xuICByZXR1cm4gYnVmO1xufVxuXG4vKipcbiAqIERlY29kZSBiaWctZW5kaWFuIHU2NFxuICovXG5mdW5jdGlvbiBkZWNvZGVVNjRCRShidWY6IEJ1ZmZlcik6IG51bWJlciB7XG4gIHJldHVybiBOdW1iZXIoYnVmLnJlYWRCaWdVSW50NjRCRSgwKSk7XG59XG5cbi8qKlxuICogRW5jb2RlIGk2NCBhcyBiaWctZW5kaWFuIHByZXNlcnZpbmcgb3JkZXJcbiAqL1xuZnVuY3Rpb24gZW5jb2RlSTY0QkUodmFsdWU6IG51bWJlcik6IEJ1ZmZlciB7XG4gIC8vIE1hcCBpNjQgdG8gdTY0IGJ5IGFkZGluZyBvZmZzZXRcbiAgY29uc3QgbWFwcGVkID0gQmlnSW50KHZhbHVlKSArICgxbiA8PCA2M24pO1xuICBjb25zdCBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoOCk7XG4gIGJ1Zi53cml0ZUJpZ1VJbnQ2NEJFKG1hcHBlZCk7XG4gIHJldHVybiBidWY7XG59XG5cbi8qKlxuICogRGVjb2RlIGJpZy1lbmRpYW4gaTY0XG4gKi9cbmZ1bmN0aW9uIGRlY29kZUk2NEJFKGJ1ZjogQnVmZmVyKTogbnVtYmVyIHtcbiAgY29uc3QgbWFwcGVkID0gYnVmLnJlYWRCaWdVSW50NjRCRSgwKTtcbiAgcmV0dXJuIE51bWJlcihtYXBwZWQgLSAoMW4gPDwgNjNuKSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFF1ZXVlIEtleVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXVlS2V5IHtcbiAgcXVldWVJZDogc3RyaW5nO1xuICBwcmlvcml0eTogbnVtYmVyO1xuICByZWFkeVRzOiBudW1iZXI7IC8vIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHNcbiAgc2VxdWVuY2U6IG51bWJlcjtcbiAgdGFza0lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRW5jb2RlIHF1ZXVlIGtleSB0byBieXRlcyBmb3Igc3RvcmFnZVxuICovXG5mdW5jdGlvbiBlbmNvZGVRdWV1ZUtleShrZXk6IFF1ZXVlS2V5KTogQnVmZmVyIHtcbiAgY29uc3QgcGFydHMgPSBbXG4gICAgQnVmZmVyLmZyb20oJ3F1ZXVlLycpLFxuICAgIEJ1ZmZlci5mcm9tKGtleS5xdWV1ZUlkKSxcbiAgICBCdWZmZXIuZnJvbSgnLycpLFxuICAgIGVuY29kZUk2NEJFKGtleS5wcmlvcml0eSksXG4gICAgQnVmZmVyLmZyb20oJy8nKSxcbiAgICBlbmNvZGVVNjRCRShrZXkucmVhZHlUcyksXG4gICAgQnVmZmVyLmZyb20oJy8nKSxcbiAgICBlbmNvZGVVNjRCRShrZXkuc2VxdWVuY2UpLFxuICAgIEJ1ZmZlci5mcm9tKCcvJyksXG4gICAgQnVmZmVyLmZyb20oa2V5LnRhc2tJZCksXG4gIF07XG4gIFxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChwYXJ0cyk7XG59XG5cbi8qKlxuICogRGVjb2RlIHF1ZXVlIGtleSBmcm9tIGJ5dGVzIHVzaW5nIHBvc2l0aW9uYWwgcGFyc2luZy5cbiAqIEtleSBmb3JtYXQ6IFwicXVldWUvXCIgKyBxdWV1ZUlkICsgXCIvXCIgKyBpNjRCRShwcmlvcml0eSkgKyBcIi9cIiArIHU2NEJFKHJlYWR5VHMpICsgXCIvXCIgKyB1NjRCRShzZXF1ZW5jZSkgKyBcIi9cIiArIHRhc2tJZFxuICogQmluYXJ5IGZpZWxkcyBtYXkgY29udGFpbiAweDJGICgnLycpLCBzbyBzcGxpdCgnLycpIGlzIE5PVCBzYWZlLlxuICovXG5mdW5jdGlvbiBkZWNvZGVRdWV1ZUtleShkYXRhOiBCdWZmZXIpOiBRdWV1ZUtleSB7XG4gIC8vIE11c3Qgc3RhcnQgd2l0aCBcInF1ZXVlL1wiXG4gIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKCdxdWV1ZS8nKTtcbiAgaWYgKGRhdGEubGVuZ3RoIDwgcHJlZml4Lmxlbmd0aCB8fCBkYXRhLnN1YmFycmF5KDAsIHByZWZpeC5sZW5ndGgpLmNvbXBhcmUocHJlZml4KSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBTb2NoREJFcnJvcignSW52YWxpZCBxdWV1ZSBrZXkgZm9ybWF0OiBtaXNzaW5nIHF1ZXVlLyBwcmVmaXgnKTtcbiAgfVxuXG4gIGxldCBvZmZzZXQgPSBwcmVmaXgubGVuZ3RoO1xuXG4gIC8vIEZpbmQgcXVldWVJZDogc2NhbiBmb3IgdGhlICcvJyBiZWZvcmUgdGhlIDgtYnl0ZSBwcmlvcml0eSBmaWVsZFxuICAvLyBUaGUgcXVldWVJZCBlbmRzIGF0IHRoZSBmaXJzdCAnLycgZm9sbG93ZWQgYnkgZXhhY3RseSA4IGJ5dGVzICsgJy8nICsgOCBieXRlcyArICcvJyArIDggYnl0ZXMgKyAnLycgKyB0YXNrSWRcbiAgLy8gU3RyYXRlZ3k6IHdhbGsgZnJvbSB0aGUgZW5kLiBTdHJ1Y3R1cmUgYWZ0ZXIgcXVldWVJZDpcbiAgLy8gICBcIi9cIiArIDgtYnl0ZSBwcmlvcml0eSArIFwiL1wiICsgOC1ieXRlIHJlYWR5VHMgKyBcIi9cIiArIDgtYnl0ZSBzZXF1ZW5jZSArIFwiL1wiICsgdGFza0lkXG4gIC8vIFRvdGFsIGZpeGVkIG92ZXJoZWFkIGFmdGVyIHF1ZXVlSWQ6IDEgKyA4ICsgMSArIDggKyAxICsgOCArIDEgPSAyOCBieXRlcywgdGhlbiB0YXNrSWRcbiAgLy8gRmluZCBxdWV1ZUlkIGJ5IHNjYW5uaW5nIGZvciAnLycgc3VjaCB0aGF0IHJlbWFpbmluZyA9IDI4ICsgdGFza0lkLmxlblxuXG4gIC8vIFdlIGtub3c6IGFmdGVyIHF1ZXVlSWQsIGZpeGVkIHN0cnVjdHVyZSBpczpcbiAgLy8gICAvWzggYnl0ZXNdL1s4IGJ5dGVzXS9bOCBieXRlc10vW3Rhc2tJZF1cbiAgLy8gU28gc2NhbiBmb3J3YXJkIHRvIGZpbmQgdGhlIHNlcGFyYXRvci4gUXVldWVJZCBpcyBhIHBsYWluIHN0cmluZyAobm8gYmluYXJ5KSwgXG4gIC8vIHNvIGZpbmQgdGhlIGZpcnN0ICcvJyBhZnRlciBcInF1ZXVlL1wiIHRoYXQgaGFzIGF0IGxlYXN0IDI4IGJ5dGVzIHJlbWFpbmluZyBhZnRlciBpdC5cbiAgbGV0IHF1ZXVlSWRFbmQgPSAtMTtcbiAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGF0YVtpXSA9PT0gMHgyRikgeyAvLyAnLydcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGRhdGEubGVuZ3RoIC0gaSAtIDE7IC8vIGJ5dGVzIGFmdGVyIHRoaXMgJy8nXG4gICAgICAvLyBOZWVkIDggKHByaW9yaXR5KSArIDEgKC8pICsgOCAocmVhZHlUcykgKyAxICgvKSArIDggKHNlcXVlbmNlKSArIDEgKC8pICsgYXQgbGVhc3QgMSAodGFza0lkKSA9IDI4XG4gICAgICBpZiAocmVtYWluaW5nID49IDI4KSB7XG4gICAgICAgIHF1ZXVlSWRFbmQgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocXVldWVJZEVuZCA8IDApIHtcbiAgICB0aHJvdyBuZXcgU29jaERCRXJyb3IoJ0ludmFsaWQgcXVldWUga2V5IGZvcm1hdDogY2Fubm90IGZpbmQgcXVldWVJZCcpO1xuICB9XG5cbiAgY29uc3QgcXVldWVJZCA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBxdWV1ZUlkRW5kKS50b1N0cmluZygpO1xuICBvZmZzZXQgPSBxdWV1ZUlkRW5kICsgMTsgLy8gc2tpcCAnLydcblxuICAvLyBSZWFkIHByaW9yaXR5ICg4IGJ5dGVzLCBpNjQgYmlnLWVuZGlhbiBvcmRlci1wcmVzZXJ2aW5nKVxuICBpZiAob2Zmc2V0ICsgOCA+IGRhdGEubGVuZ3RoKSB0aHJvdyBuZXcgU29jaERCRXJyb3IoJ0ludmFsaWQgcXVldWUga2V5OiB0cnVuY2F0ZWQgcHJpb3JpdHknKTtcbiAgY29uc3QgcHJpb3JpdHkgPSBkZWNvZGVJNjRCRShkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgOCkgYXMgQnVmZmVyKTtcbiAgb2Zmc2V0ICs9IDg7XG5cbiAgLy8gU2tpcCAnLydcbiAgaWYgKGRhdGFbb2Zmc2V0XSAhPT0gMHgyRikgdGhyb3cgbmV3IFNvY2hEQkVycm9yKCdJbnZhbGlkIHF1ZXVlIGtleTogZXhwZWN0ZWQgLyBhZnRlciBwcmlvcml0eScpO1xuICBvZmZzZXQgKz0gMTtcblxuICAvLyBSZWFkIHJlYWR5VHMgKDggYnl0ZXMsIHU2NCBiaWctZW5kaWFuKVxuICBpZiAob2Zmc2V0ICsgOCA+IGRhdGEubGVuZ3RoKSB0aHJvdyBuZXcgU29jaERCRXJyb3IoJ0ludmFsaWQgcXVldWUga2V5OiB0cnVuY2F0ZWQgcmVhZHlUcycpO1xuICBjb25zdCByZWFkeVRzID0gZGVjb2RlVTY0QkUoZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIDgpIGFzIEJ1ZmZlcik7XG4gIG9mZnNldCArPSA4O1xuXG4gIC8vIFNraXAgJy8nXG4gIGlmIChkYXRhW29mZnNldF0gIT09IDB4MkYpIHRocm93IG5ldyBTb2NoREJFcnJvcignSW52YWxpZCBxdWV1ZSBrZXk6IGV4cGVjdGVkIC8gYWZ0ZXIgcmVhZHlUcycpO1xuICBvZmZzZXQgKz0gMTtcblxuICAvLyBSZWFkIHNlcXVlbmNlICg4IGJ5dGVzLCB1NjQgYmlnLWVuZGlhbilcbiAgaWYgKG9mZnNldCArIDggPiBkYXRhLmxlbmd0aCkgdGhyb3cgbmV3IFNvY2hEQkVycm9yKCdJbnZhbGlkIHF1ZXVlIGtleTogdHJ1bmNhdGVkIHNlcXVlbmNlJyk7XG4gIGNvbnN0IHNlcXVlbmNlID0gZGVjb2RlVTY0QkUoZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIDgpIGFzIEJ1ZmZlcik7XG4gIG9mZnNldCArPSA4O1xuXG4gIC8vIFNraXAgJy8nXG4gIGlmIChkYXRhW29mZnNldF0gIT09IDB4MkYpIHRocm93IG5ldyBTb2NoREJFcnJvcignSW52YWxpZCBxdWV1ZSBrZXk6IGV4cGVjdGVkIC8gYWZ0ZXIgc2VxdWVuY2UnKTtcbiAgb2Zmc2V0ICs9IDE7XG5cbiAgLy8gUmVtYWluaW5nIGlzIHRhc2tJZFxuICBjb25zdCB0YXNrSWQgPSBkYXRhLnN1YmFycmF5KG9mZnNldCkudG9TdHJpbmcoKTtcblxuICByZXR1cm4geyBxdWV1ZUlkLCBwcmlvcml0eSwgcmVhZHlUcywgc2VxdWVuY2UsIHRhc2tJZCB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUYXNrXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFzayB7XG4gIHRhc2tJZDogc3RyaW5nO1xuICBwcmlvcml0eTogbnVtYmVyO1xuICBwYXlsb2FkOiBCdWZmZXI7XG4gIHN0YXRlOiBUYXNrU3RhdGU7XG4gIGVucXVldWVkQXQ6IG51bWJlcjtcbiAgY2xhaW1lZEF0PzogbnVtYmVyO1xuICBjbGFpbWVkQnk/OiBzdHJpbmc7XG4gIGNvbXBsZXRlZEF0PzogbnVtYmVyO1xuICByZXRyaWVzOiBudW1iZXI7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUXVldWUgU3RhdGlzdGljc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXVlU3RhdHMge1xuICBwZW5kaW5nOiBudW1iZXI7XG4gIGNsYWltZWQ6IG51bWJlcjtcbiAgY29tcGxldGVkOiBudW1iZXI7XG4gIGRlYWRMZXR0ZXJlZDogbnVtYmVyO1xuICB0b3RhbEVucXVldWVkOiBudW1iZXI7XG4gIHRvdGFsRGVxdWV1ZWQ6IG51bWJlcjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUHJpb3JpdHkgUXVldWVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIFByaW9yaXR5UXVldWUge1xuICBwcml2YXRlIHN0YXRpYyBzZXF1ZW5jZUNvdW50ZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGI6IGFueSxcbiAgICBwcml2YXRlIGNvbmZpZzogUXVldWVDb25maWdcbiAgKSB7XG4gICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgdGhpcy5jb25maWcudmlzaWJpbGl0eVRpbWVvdXQgPSBjb25maWcudmlzaWJpbGl0eVRpbWVvdXQgfHwgMzAwMDA7XG4gICAgdGhpcy5jb25maWcubWF4UmV0cmllcyA9IGNvbmZpZy5tYXhSZXRyaWVzIHx8IDM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHF1ZXVlIGZyb20gZW1iZWRkZWQgZGF0YWJhc2VcbiAgICovXG4gIHN0YXRpYyBmcm9tRGF0YWJhc2UoZGI6IGFueSwgbmFtZTogc3RyaW5nLCBjb25maWc/OiBQYXJ0aWFsPFF1ZXVlQ29uZmlnPik6IFByaW9yaXR5UXVldWUge1xuICAgIGNvbnN0IGZ1bGxDb25maWc6IFF1ZXVlQ29uZmlnID0ge1xuICAgICAgbmFtZSxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJpb3JpdHlRdWV1ZShkYiwgZnVsbENvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHF1ZXVlIGZyb20gZ1JQQyBjbGllbnRcbiAgICovXG4gIHN0YXRpYyBmcm9tQ2xpZW50KGNsaWVudDogYW55LCBuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFBhcnRpYWw8UXVldWVDb25maWc+KTogUHJpb3JpdHlRdWV1ZSB7XG4gICAgY29uc3QgZnVsbENvbmZpZzogUXVldWVDb25maWcgPSB7XG4gICAgICBuYW1lLFxuICAgICAgLi4uY29uZmlnLFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcmlvcml0eVF1ZXVlKGNsaWVudCwgZnVsbENvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZSBhIHRhc2sgd2l0aCBwcmlvcml0eVxuICAgKiBMb3dlciBwcmlvcml0eSBudW1iZXIgPSBoaWdoZXIgdXJnZW5jeVxuICAgKi9cbiAgYXN5bmMgZW5xdWV1ZShcbiAgICBwcmlvcml0eTogbnVtYmVyLFxuICAgIHBheWxvYWQ6IEJ1ZmZlcixcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0YXNrSWQgPSB0aGlzLmdlbmVyYXRlVGFza0lkKCk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBcbiAgICBjb25zdCBrZXk6IFF1ZXVlS2V5ID0ge1xuICAgICAgcXVldWVJZDogdGhpcy5jb25maWcubmFtZSxcbiAgICAgIHByaW9yaXR5LFxuICAgICAgcmVhZHlUczogbm93LFxuICAgICAgc2VxdWVuY2U6IFByaW9yaXR5UXVldWUuc2VxdWVuY2VDb3VudGVyKyssXG4gICAgICB0YXNrSWQsXG4gICAgfTtcblxuICAgIGNvbnN0IHRhc2s6IFRhc2sgPSB7XG4gICAgICB0YXNrSWQsXG4gICAgICBwcmlvcml0eSxcbiAgICAgIHBheWxvYWQsXG4gICAgICBzdGF0ZTogVGFza1N0YXRlLlBFTkRJTkcsXG4gICAgICBlbnF1ZXVlZEF0OiBub3csXG4gICAgICByZXRyaWVzOiAwLFxuICAgICAgbWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleUJ1ZiA9IGVuY29kZVF1ZXVlS2V5KGtleSk7XG4gICAgY29uc3QgdmFsdWVCdWYgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh0YXNrKSk7XG4gICAgXG4gICAgYXdhaXQgdGhpcy5kYi5wdXQoa2V5QnVmLCB2YWx1ZUJ1Zik7XG4gICAgXG4gICAgLy8gVXBkYXRlIHN0YXRzXG4gICAgYXdhaXQgdGhpcy5pbmNyZW1lbnRTdGF0KCd0b3RhbEVucXVldWVkJyk7XG4gICAgYXdhaXQgdGhpcy5pbmNyZW1lbnRTdGF0KCdwZW5kaW5nJyk7XG4gICAgXG4gICAgcmV0dXJuIHRhc2tJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXF1ZXVlIHRoZSBoaWdoZXN0IHByaW9yaXR5IHRhc2tcbiAgICogUmV0dXJucyBudWxsIGlmIG5vIHRhc2tzIGF2YWlsYWJsZVxuICAgKi9cbiAgYXN5bmMgZGVxdWV1ZSh3b3JrZXJJZDogc3RyaW5nKTogUHJvbWlzZTxUYXNrIHwgbnVsbD4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcHJlZml4ID0gQnVmZmVyLmZyb20oYHF1ZXVlLyR7dGhpcy5jb25maWcubmFtZX0vYCk7XG5cbiAgICAvLyBTY2FuIGFsbCB0YXNrcyBpbiBwcmlvcml0eSBvcmRlciAoYmluYXJ5IHNvcnQgPSBwcmlvcml0eSBvcmRlciBkdWUgdG8gYmlnLWVuZGlhbiBlbmNvZGluZylcbiAgICB0cnkge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBba2V5QnVmLCB2YWx1ZUJ1Zl0gb2YgdGhpcy5kYi5zY2FuUHJlZml4KHByZWZpeCkpIHtcbiAgICAgICAgY29uc3QgdGFzazogVGFzayA9IEpTT04ucGFyc2UodmFsdWVCdWYudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgLy8gU2tpcCBub24tcGVuZGluZyB0YXNrc1xuICAgICAgICBpZiAodGFzay5zdGF0ZSAhPT0gVGFza1N0YXRlLlBFTkRJTkcpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlY29kZSBrZXkgdG8gY2hlY2sgcmVhZHlUc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHF1ZXVlS2V5ID0gZGVjb2RlUXVldWVLZXkoa2V5QnVmKTtcbiAgICAgICAgICBpZiAocXVldWVLZXkucmVhZHlUcyA+IG5vdykge1xuICAgICAgICAgICAgY29udGludWU7IC8vIE5vdCByZWFkeSB5ZXRcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIG1hbGZvcm1lZCBrZXlzXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGFpbSB0aGlzIHRhc2sgYXRvbWljYWxseVxuICAgICAgICB0YXNrLnN0YXRlID0gVGFza1N0YXRlLkNMQUlNRUQ7XG4gICAgICAgIHRhc2suY2xhaW1lZEF0ID0gbm93O1xuICAgICAgICB0YXNrLmNsYWltZWRCeSA9IHdvcmtlcklkO1xuXG4gICAgICAgIC8vIFJlLXNlcmlhbGl6ZSB0aGUgcGF5bG9hZCBjb3JyZWN0bHkgKGl0J3Mgc3RvcmVkIGFzIGJhc2U2NCBpbiBKU09OKVxuICAgICAgICBjb25zdCB1cGRhdGVkVmFsdWUgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh0YXNrKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGIucHV0KGtleUJ1ZiwgdXBkYXRlZFZhbHVlKTtcblxuICAgICAgICAvLyBVcGRhdGUgc3RhdHNcbiAgICAgICAgYXdhaXQgdGhpcy5kZWNyZW1lbnRTdGF0KCdwZW5kaW5nJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5jcmVtZW50U3RhdCgnY2xhaW1lZCcpO1xuICAgICAgICBhd2FpdCB0aGlzLmluY3JlbWVudFN0YXQoJ3RvdGFsRGVxdWV1ZWQnKTtcblxuICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElmIHNjYW4gaXMgbm90IGF2YWlsYWJsZSB2aWEgc2NhblByZWZpeCwgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2tub3dsZWRnZSB0YXNrIGNvbXBsZXRpb25cbiAgICovXG4gIGFzeW5jIGFjayh0YXNrSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEZpbmQgYW5kIHVwZGF0ZSB0YXNrIHN0YXRlXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRUYXNrKHRhc2tJZCk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBTb2NoREJFcnJvcihgVGFzayBub3QgZm91bmQ6ICR7dGFza0lkfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdGFzayB9ID0gcmVzdWx0O1xuXG4gICAgaWYgKHRhc2suc3RhdGUgIT09IFRhc2tTdGF0ZS5DTEFJTUVEKSB7XG4gICAgICB0aHJvdyBuZXcgU29jaERCRXJyb3IoYFRhc2sgbm90IGluIGNsYWltZWQgc3RhdGU6ICR7dGFza0lkfWApO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0YXNrIHN0YXRlXG4gICAgdGFzay5zdGF0ZSA9IFRhc2tTdGF0ZS5DT01QTEVURUQ7XG4gICAgdGFzay5jb21wbGV0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgXG4gICAgYXdhaXQgdGhpcy51cGRhdGVUYXNrKHRhc2spO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdGF0c1xuICAgIGF3YWl0IHRoaXMuZGVjcmVtZW50U3RhdCgnY2xhaW1lZCcpO1xuICAgIGF3YWl0IHRoaXMuaW5jcmVtZW50U3RhdCgnY29tcGxldGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogTmVnYXRpdmUgYWNrbm93bGVkZ2UgLSByZXR1cm4gdGFzayB0byBxdWV1ZVxuICAgKi9cbiAgYXN5bmMgbmFjayh0YXNrSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0VGFzayh0YXNrSWQpO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgU29jaERCRXJyb3IoYFRhc2sgbm90IGZvdW5kOiAke3Rhc2tJZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRhc2sgfSA9IHJlc3VsdDtcbiAgICB0YXNrLnJldHJpZXMrKztcbiAgICBcbiAgICBpZiAodGFzay5yZXRyaWVzID49ICh0aGlzLmNvbmZpZy5tYXhSZXRyaWVzIHx8IDMpKSB7XG4gICAgICAvLyBNb3ZlIHRvIGRlYWQgbGV0dGVyIHF1ZXVlXG4gICAgICB0YXNrLnN0YXRlID0gVGFza1N0YXRlLkRFQURfTEVUVEVSRUQ7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVRhc2sodGFzayk7XG4gICAgICBhd2FpdCB0aGlzLmRlY3JlbWVudFN0YXQoJ2NsYWltZWQnKTtcbiAgICAgIGF3YWl0IHRoaXMuaW5jcmVtZW50U3RhdCgnZGVhZExldHRlcmVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldHVybiB0byBwZW5kaW5nXG4gICAgICB0YXNrLnN0YXRlID0gVGFza1N0YXRlLlBFTkRJTkc7XG4gICAgICB0YXNrLmNsYWltZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgIHRhc2suY2xhaW1lZEJ5ID0gdW5kZWZpbmVkO1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVUYXNrKHRhc2spO1xuICAgICAgYXdhaXQgdGhpcy5kZWNyZW1lbnRTdGF0KCdjbGFpbWVkJyk7XG4gICAgICBhd2FpdCB0aGlzLmluY3JlbWVudFN0YXQoJ3BlbmRpbmcnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHF1ZXVlIHN0YXRpc3RpY3NcbiAgICovXG4gIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8UXVldWVTdGF0cz4ge1xuICAgIHJldHVybiB7XG4gICAgICBwZW5kaW5nOiBhd2FpdCB0aGlzLmdldFN0YXQoJ3BlbmRpbmcnKSxcbiAgICAgIGNsYWltZWQ6IGF3YWl0IHRoaXMuZ2V0U3RhdCgnY2xhaW1lZCcpLFxuICAgICAgY29tcGxldGVkOiBhd2FpdCB0aGlzLmdldFN0YXQoJ2NvbXBsZXRlZCcpLFxuICAgICAgZGVhZExldHRlcmVkOiBhd2FpdCB0aGlzLmdldFN0YXQoJ2RlYWRMZXR0ZXJlZCcpLFxuICAgICAgdG90YWxFbnF1ZXVlZDogYXdhaXQgdGhpcy5nZXRTdGF0KCd0b3RhbEVucXVldWVkJyksXG4gICAgICB0b3RhbERlcXVldWVkOiBhd2FpdCB0aGlzLmdldFN0YXQoJ3RvdGFsRGVxdWV1ZWQnKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFB1cmdlIGNvbXBsZXRlZCB0YXNrc1xuICAgKi9cbiAgYXN5bmMgcHVyZ2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBwcmVmaXggPSBCdWZmZXIuZnJvbShgcXVldWUvJHt0aGlzLmNvbmZpZy5uYW1lfS9gKTtcbiAgICBsZXQgcHVyZ2VkID0gMDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b0RlbGV0ZTogQnVmZmVyW10gPSBbXTtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgW2tleUJ1ZiwgdmFsdWVCdWZdIG9mIHRoaXMuZGIuc2NhblByZWZpeChwcmVmaXgpKSB7XG4gICAgICAgIGNvbnN0IHRhc2s6IFRhc2sgPSBKU09OLnBhcnNlKHZhbHVlQnVmLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAodGFzay5zdGF0ZSA9PT0gVGFza1N0YXRlLkNPTVBMRVRFRCB8fCB0YXNrLnN0YXRlID09PSBUYXNrU3RhdGUuREVBRF9MRVRURVJFRCkge1xuICAgICAgICAgIHRvRGVsZXRlLnB1c2goa2V5QnVmKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiB0b0RlbGV0ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmRiLmRlbGV0ZShrZXkpO1xuICAgICAgICBwdXJnZWQrKztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFJldHVybiBjb3VudCBzbyBmYXJcbiAgICB9XG5cbiAgICByZXR1cm4gcHVyZ2VkO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZHNcbiAgcHJpdmF0ZSBnZW5lcmF0ZVRhc2tJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRUYXNrKHRhc2tJZDogc3RyaW5nKTogUHJvbWlzZTx7IHRhc2s6IFRhc2s7IGtleUJ1ZjogQnVmZmVyIH0gfCBudWxsPiB7XG4gICAgY29uc3QgcHJlZml4ID0gQnVmZmVyLmZyb20oYHF1ZXVlLyR7dGhpcy5jb25maWcubmFtZX0vYCk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBba2V5QnVmLCB2YWx1ZUJ1Zl0gb2YgdGhpcy5kYi5zY2FuUHJlZml4KHByZWZpeCkpIHtcbiAgICAgICAgY29uc3QgdGFzazogVGFzayA9IEpTT04ucGFyc2UodmFsdWVCdWYudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmICh0YXNrLnRhc2tJZCA9PT0gdGFza0lkKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdGFzaywga2V5QnVmIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFNjYW4gbm90IGF2YWlsYWJsZVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVUYXNrKHRhc2s6IFRhc2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldFRhc2sodGFzay50YXNrSWQpO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGNvbnN0IHZhbHVlQnVmID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodGFzaykpO1xuICAgICAgYXdhaXQgdGhpcy5kYi5wdXQocmVzdWx0LmtleUJ1ZiwgdmFsdWVCdWYpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0U3RhdChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGtleSA9IGBfcXVldWVfc3RhdHMvJHt0aGlzLmNvbmZpZy5uYW1lfS8ke25hbWV9YDtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuZGIuZ2V0KEJ1ZmZlci5mcm9tKGtleSkpO1xuICAgIHJldHVybiB2YWx1ZSA/IHBhcnNlSW50KHZhbHVlLnRvU3RyaW5nKCkpIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5jcmVtZW50U3RhdChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5nZXRTdGF0KG5hbWUpO1xuICAgIGNvbnN0IGtleSA9IGBfcXVldWVfc3RhdHMvJHt0aGlzLmNvbmZpZy5uYW1lfS8ke25hbWV9YDtcbiAgICBhd2FpdCB0aGlzLmRiLnB1dChCdWZmZXIuZnJvbShrZXkpLCBCdWZmZXIuZnJvbSgoY3VycmVudCArIDEpLnRvU3RyaW5nKCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVjcmVtZW50U3RhdChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5nZXRTdGF0KG5hbWUpO1xuICAgIGNvbnN0IGtleSA9IGBfcXVldWVfc3RhdHMvJHt0aGlzLmNvbmZpZy5uYW1lfS8ke25hbWV9YDtcbiAgICBhd2FpdCB0aGlzLmRiLnB1dChCdWZmZXIuZnJvbShrZXkpLCBCdWZmZXIuZnJvbShNYXRoLm1heCgwLCBjdXJyZW50IC0gMSkudG9TdHJpbmcoKSkpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcXVldWUgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVF1ZXVlKFxuICBkYjogYW55LFxuICBuYW1lOiBzdHJpbmcsXG4gIGNvbmZpZz86IFBhcnRpYWw8UXVldWVDb25maWc+XG4pOiBQcmlvcml0eVF1ZXVlIHtcbiAgcmV0dXJuIFByaW9yaXR5UXVldWUuZnJvbURhdGFiYXNlKGRiLCBuYW1lLCBjb25maWcpO1xufVxuIl19