@pipeline-builder/pipeline-events 3.4.77 → 3.4.78

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.
Files changed (2) hide show
  1. package/lib/index.js +56 -15
  2. package/package.json +1 -1
package/lib/index.js CHANGED
@@ -38,11 +38,16 @@ const log = {
38
38
  // AccessDenied is a config error (alert loudly); a missing tag is treated as
39
39
  // "not yet registered" (skip).
40
40
  const PIPELINE_EVENT_ID_TAG = 'PIPELINE_EVENT_ID';
41
+ // Optional deploy-environment tag (set by pipeline-core when a pipeline declares
42
+ // an `environment`). Read from the SAME ListTags response as PIPELINE_EVENT_ID so
43
+ // it can be attributed to CodePipeline events for DORA deploy metrics. Absent on
44
+ // legacy pipelines → left undefined (NULL downstream).
45
+ const ENVIRONMENT_TAG = 'Environment';
41
46
  const clientsByRegion = new Map();
42
- // tag=null is a negative cache (resolved-but-untagged); `ts` lets negatives
47
+ // pipelineId=null is a negative cache (resolved-but-untagged); `ts` lets negatives
43
48
  // expire so a pipeline tagged AFTER its first event becomes resolvable without
44
49
  // recycling the warm container. Positive results stay cached for the lifetime.
45
- const eventIdByArn = new Map();
50
+ const resolvedByArn = new Map();
46
51
  const NEG_CACHE_TTL_MS = 5 * 60 * 1000;
47
52
  async function pipelineClient(region) {
48
53
  let client = clientsByRegion.get(region);
@@ -54,27 +59,30 @@ async function pipelineClient(region) {
54
59
  return client;
55
60
  }
56
61
  /**
57
- * Resolve a CodePipeline's PIPELINE_EVENT_ID tag → the platform pipelineId.
58
- * Returns null when the pipeline has no such tag (unregistered). Throws on
62
+ * Resolve a CodePipeline's tags → the platform pipelineId (PIPELINE_EVENT_ID)
63
+ * plus the optional deploy `environment` (Environment tag). `pipelineId` is null
64
+ * when the pipeline has no PIPELINE_EVENT_ID tag (unregistered). Throws on
59
65
  * AccessDenied so a missing IAM grant surfaces loudly instead of silently
60
66
  * dropping every event.
61
67
  */
62
- async function resolvePipelineEventId(arn, region) {
63
- const cached = eventIdByArn.get(arn);
68
+ async function resolvePipeline(arn, region) {
69
+ const cached = resolvedByArn.get(arn);
64
70
  // Serve a positive hit for the container lifetime; serve a negative hit only
65
71
  // until it expires (then re-resolve, in case the pipeline was since tagged).
66
- if (cached && (cached.tag !== null || Date.now() - cached.ts < NEG_CACHE_TTL_MS)) {
67
- return cached.tag;
72
+ if (cached && (cached.pipelineId !== null || Date.now() - cached.ts < NEG_CACHE_TTL_MS)) {
73
+ return { pipelineId: cached.pipelineId, ...(cached.environment && { environment: cached.environment }) };
68
74
  }
69
75
  try {
70
76
  const client = await pipelineClient(region);
71
77
  const { ListTagsForResourceCommand } = await loadCodePipeline();
72
78
  const out = await client.send(new ListTagsForResourceCommand({ resourceArn: arn }));
73
- const tag = out.tags?.find(t => t.key === PIPELINE_EVENT_ID_TAG)?.value ?? null;
74
- if (!tag)
79
+ const pipelineId = out.tags?.find(t => t.key === PIPELINE_EVENT_ID_TAG)?.value ?? null;
80
+ const envTag = out.tags?.find(t => t.key === ENVIRONMENT_TAG)?.value;
81
+ const environment = typeof envTag === 'string' && envTag.length > 0 ? envTag.slice(0, MAX_ATTR) : undefined;
82
+ if (!pipelineId)
75
83
  log.warn('Pipeline missing PIPELINE_EVENT_ID tag — skipping (register it?)', { arn });
76
- eventIdByArn.set(arn, { tag, ts: Date.now() });
77
- return tag;
84
+ resolvedByArn.set(arn, { pipelineId, environment, ts: Date.now() });
85
+ return { pipelineId, ...(environment && { environment }) };
78
86
  }
79
87
  catch (err) {
80
88
  const name = err?.name;
@@ -84,7 +92,7 @@ async function resolvePipelineEventId(arn, region) {
84
92
  throw err;
85
93
  }
86
94
  log.error('Failed to resolve PIPELINE_EVENT_ID tag', { arn, error: name ?? String(err) });
87
- return null;
95
+ return { pipelineId: null };
88
96
  }
89
97
  }
90
98
  // ─── Auth ───────────────────────────────────────────────
@@ -121,6 +129,33 @@ async function getAuthToken() {
121
129
  }
122
130
  /** Cap on the stored failure summary — CodeBuild/Deploy summaries can be long. */
123
131
  const MAX_ERROR_MESSAGE = 4000;
132
+ /** Cap on commit/ref/environment fields — the ingest contract allows max 255. */
133
+ const MAX_ATTR = 255;
134
+ /** First non-empty string among the candidates, capped to the ingest max. */
135
+ function firstAttr(...vals) {
136
+ for (const v of vals) {
137
+ if (typeof v === 'string' && v.length > 0)
138
+ return v.slice(0, MAX_ATTR);
139
+ }
140
+ return undefined;
141
+ }
142
+ /**
143
+ * Best-effort extraction of the source commit id + ref from a CodePipeline event
144
+ * detail. CodePipeline surfaces the source revision under a few shapes depending
145
+ * on the event type / source-action; we check the known ones and leave the fields
146
+ * undefined when none are present (legacy/back-compat — NULL downstream). Never
147
+ * pulls an ARN/account id: only revision/branch string fields are read.
148
+ */
149
+ function extractCommit(detail) {
150
+ // `source-revisions` (kebab, EventBridge) / `sourceRevisions` (camel) — first entry.
151
+ const revs = (detail['source-revisions'] ?? detail.sourceRevisions);
152
+ const firstRev = Array.isArray(revs) ? revs[0] : undefined;
153
+ // On source actions the revision id can also ride on `execution-result`.
154
+ const execResult = detail['execution-result'];
155
+ const commitSha = firstAttr(detail.commitId, detail.revisionId, firstRev?.revisionId, execResult?.revisionId);
156
+ const commitRef = firstAttr(detail.commitRef, detail.branch, detail.sourceBranch, firstRev?.branchName, firstRev?.branch);
157
+ return { ...(commitSha && { commitSha }), ...(commitRef && { commitRef }) };
158
+ }
124
159
  function classifyEvent(detailType) {
125
160
  if (detailType.includes('Pipeline Execution'))
126
161
  return { eventType: 'PIPELINE', eventSource: 'codepipeline' };
@@ -170,7 +205,7 @@ async function parseRecord(record) {
170
205
  // Resolve the pipeline's PIPELINE_EVENT_ID tag (= platform pipelineId). The
171
206
  // ARN is only a transient handle for the tag lookup; it is never stored.
172
207
  const arn = `arn:aws:codepipeline:${event.region}:${event.account}:${pipelineName}`;
173
- const pipelineId = await resolvePipelineEventId(arn, event.region);
208
+ const { pipelineId, environment } = await resolvePipeline(arn, event.region);
174
209
  if (!pipelineId)
175
210
  return null; // untagged / unregistered → skip
176
211
  const startedAt = detail['start-time'] || event.time;
@@ -193,6 +228,9 @@ async function parseRecord(record) {
193
228
  const errorMessage = typeof summary === 'string' && summary.length > 0
194
229
  ? summary.slice(0, MAX_ERROR_MESSAGE)
195
230
  : undefined;
231
+ // DORA deploy attribution — all optional/back-compat: omitted (undefined) when
232
+ // the event/pipeline doesn't carry them, so legacy pipelines report as before.
233
+ const { commitSha, commitRef } = extractCommit(detail);
196
234
  return {
197
235
  pipelineId,
198
236
  eventSource,
@@ -205,6 +243,9 @@ async function parseRecord(record) {
205
243
  startedAt,
206
244
  completedAt,
207
245
  durationMs,
246
+ ...(commitSha && { commitSha }),
247
+ ...(commitRef && { commitRef }),
248
+ ...(environment && { environment }),
208
249
  detail,
209
250
  };
210
251
  }
@@ -246,4 +287,4 @@ export const handler = async (event) => {
246
287
  const result = await res.json();
247
288
  log.info(`Ingested ${events.length} events`, { inserted: result.data });
248
289
  };
249
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQWU5RixJQUFJLGVBQStDLENBQUM7QUFDcEQsS0FBSyxVQUFVLGdCQUFnQjtJQUM3QixJQUFJLENBQUMsZUFBZTtRQUFFLGVBQWUsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQWtDLENBQUM7SUFDeEgsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE1BQU0sR0FBRyxHQUFHO0lBQ1YsSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksS0FBSyxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxP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Q0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBNkIsQ0FBQztJQUMzRCxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksTUFBTSxDQUFDLE1BQU0sU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsIFNlY3JldHNNYW5hZ2VyQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7IFNRU0V2ZW50LCBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcblxuLy8gQVdTIExhbWJkYSdzIE5vZGUgcnVudGltZSBidW5kbGVzIEBhd3Mtc2RrIHYzLCBzbyB0aGUgQ29kZVBpcGVsaW5lIGNsaWVudCBpc1xuLy8gbG9hZGVkIGxhemlseSB2aWEgZHluYW1pYyBpbXBvcnQoKSDigJQgYSBzdGF0aWMgd29ya3NwYWNlIGRlcGVuZGVuY3kgb25cbi8vIEBhd3Mtc2RrL2NsaWVudC1jb2RlcGlwZWxpbmUgd291bGQgcGVydHVyYiB0aGUgc2hhcmVkIEBhd3Mtc2RrIHZlcnNpb24gdHJlZVxuLy8gYW5kIGJyZWFrIG90aGVyIHBhY2thZ2VzJyB0eXBpbmdzLiBUaGUgZHluYW1pYyBpbXBvcnQga2VlcHMgaXQgb3V0IG9mIHRoZVxuLy8gc3RhdGljIGdyYXBoIHdoaWxlIHN0YXlpbmcgRVNNLWNvcnJlY3QgKG5vIGByZXF1aXJlYCBpbiBhIHR5cGU6bW9kdWxlIHBhY2thZ2UpXG4vLyBhbmQgbW9ja2FibGUuIE1pbmltYWwgbG9jYWwgdHlwZXMga2VlcCB0aGUgY2FsbCBzaXRlcyB0eXBlLWNoZWNrZWQuXG5pbnRlcmZhY2UgTGlzdFRhZ3NPdXRwdXQgeyB0YWdzPzogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIH0+IH1cbmludGVyZmFjZSBDb2RlUGlwZWxpbmVDbGllbnRMaWtlIHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTxMaXN0VGFnc091dHB1dD4gfVxuaW50ZXJmYWNlIENvZGVQaXBlbGluZU1vZHVsZSB7XG4gIENvZGVQaXBlbGluZUNsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gQ29kZVBpcGVsaW5lQ2xpZW50TGlrZTtcbiAgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgcmVzb3VyY2VBcm46IHN0cmluZyB9KSA9PiB1bmtub3duO1xufVxubGV0IGNvZGVwaXBlbGluZU1vZDogQ29kZVBpcGVsaW5lTW9kdWxlIHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gbG9hZENvZGVQaXBlbGluZSgpOiBQcm9taXNlPENvZGVQaXBlbGluZU1vZHVsZT4ge1xuICBpZiAoIWNvZGVwaXBlbGluZU1vZCkgY29kZXBpcGVsaW5lTW9kID0gKGF3YWl0IGltcG9ydCgnQGF3cy1zZGsvY2xpZW50LWNvZGVwaXBlbGluZScpKSBhcyB1bmtub3duIGFzIENvZGVQaXBlbGluZU1vZHVsZTtcbiAgcmV0dXJuIGNvZGVwaXBlbGluZU1vZDtcbn1cblxuLyoqXG4gKiBQaXBlbGluZSBldmVudCBpbmdlc3Rpb24gTGFtYmRhIGhhbmRsZXIuXG4gKlxuICogUmVjZWl2ZXMgQ29kZVBpcGVsaW5lL0NvZGVCdWlsZCBldmVudHMgZnJvbSBTUVMgKHNvdXJjZWQgYnkgRXZlbnRCcmlkZ2UpLFxuICogcGFyc2VzIHRoZW0gaW50byBhIG5vcm1hbGl6ZWQgZm9ybWF0LCBhbmQgUE9TVHMgdGhlbSB0byB0aGUgcmVwb3J0aW5nIHNlcnZpY2VcbiAqIHZpYSBQTEFURk9STV9CQVNFX1VSTC5cbiAqXG4gKiBBdXRoZW50aWNhdGlvbjpcbiAqIC0gUExBVEZPUk1fVE9LRU4gZW52IHZhciAocHJlZmVycmVkIOKAlCBubyBTZWNyZXRzIE1hbmFnZXIgY2FsbClcbiAqIC0gUExBVEZPUk1fU0VDUkVUX05BTUUgZW52IHZhciDihpIgcmVhZHMgdGhlIEpXVCAocGFzc3dvcmQpIGZyb20gU2VjcmV0cyBNYW5hZ2VyXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBQTEFURk9STV9CQVNFX1VSTCDigJQgQmFzZSBVUkwgb2YgdGhlIHBsYXRmb3JtXG4gKiAtIFBMQVRGT1JNX1RPS0VOIOKAlCBKV1QgdG9rZW4gKHNldCBkaXJlY3RseSwgb3IpXG4gKiAtIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIOKAlCBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGNvbnRhaW5pbmcgeyBwYXNzd29yZDogPEpXVD4gfVxuICovXG5cbmNvbnN0IGxvZyA9IHtcbiAgaW5mbzogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0lORk8nLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxuICB3YXJuOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnV0FSTicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIGVycm9yOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdFUlJPUicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG59O1xuXG4vLyDilIDilIAgUElQRUxJTkVfRVZFTlRfSUQgcmVzb2x1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBpcGVsaW5lcyBhcmUgdGFnZ2VkIGBQSVBFTElORV9FVkVOVF9JRD08cGlwZWxpbmVJZD5gIGF0IENESyBzeW50aC4gV2UgcmVzb2x2ZVxuLy8gdGhhdCB0YWcgZnJvbSB0aGUgbGl2ZSBDb2RlUGlwZWxpbmUgKHJlZ2lvbi1hd2FyZSkgYW5kIHJlcG9ydCBhZ2FpbnN0IHRoZSBpZCDigJRcbi8vIHRoZSBBUk4vYWNjb3VudCBuZXZlciBsZWF2ZSBBV1MsIHNvIHRoZXJlJ3Mgbm8gbWFza2luZy4gQ2FjaGVkIHBlciBBUk5cbi8vICh3YXJtLWNvbnRhaW5lcikgdG8gYXZvaWQgaGFtbWVyaW5nIHRoZSBMaXN0VGFncyBBUEkuXG4vL1xuLy8gUmVxdWlyZXMgdGhlIExhbWJkYSBleGVjdXRpb24gcm9sZSB0byBhbGxvdyBgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2VgLlxuLy8gQWNjZXNzRGVuaWVkIGlzIGEgY29uZmlnIGVycm9yIChhbGVydCBsb3VkbHkpOyBhIG1pc3NpbmcgdGFnIGlzIHRyZWF0ZWQgYXNcbi8vIFwibm90IHlldCByZWdpc3RlcmVkXCIgKHNraXApLlxuXG5jb25zdCBQSVBFTElORV9FVkVOVF9JRF9UQUcgPSAnUElQRUxJTkVfRVZFTlRfSUQnO1xuY29uc3QgY2xpZW50c0J5UmVnaW9uID0gbmV3IE1hcDxzdHJpbmcsIENvZGVQaXBlbGluZUNsaWVudExpa2U+KCk7XG4vLyB0YWc9bnVsbCBpcyBhIG5lZ2F0aXZlIGNhY2hlIChyZXNvbHZlZC1idXQtdW50YWdnZWQpOyBgdHNgIGxldHMgbmVnYXRpdmVzXG4vLyBleHBpcmUgc28gYSBwaXBlbGluZSB0YWdnZWQgQUZURVIgaXRzIGZpcnN0IGV2ZW50IGJlY29tZXMgcmVzb2x2YWJsZSB3aXRob3V0XG4vLyByZWN5Y2xpbmcgdGhlIHdhcm0gY29udGFpbmVyLiBQb3NpdGl2ZSByZXN1bHRzIHN0YXkgY2FjaGVkIGZvciB0aGUgbGlmZXRpbWUuXG5jb25zdCBldmVudElkQnlBcm4gPSBuZXcgTWFwPHN0cmluZywgeyB0YWc6IHN0cmluZyB8IG51bGw7IHRzOiBudW1iZXIgfT4oKTtcbmNvbnN0IE5FR19DQUNIRV9UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG5hc3luYyBmdW5jdGlvbiBwaXBlbGluZUNsaWVudChyZWdpb246IHN0cmluZyk6IFByb21pc2U8Q29kZVBpcGVsaW5lQ2xpZW50TGlrZT4ge1xuICBsZXQgY2xpZW50ID0gY2xpZW50c0J5UmVnaW9uLmdldChyZWdpb24pO1xuICBpZiAoIWNsaWVudCkge1xuICAgIGNvbnN0IHsgQ29kZVBpcGVsaW5lQ2xpZW50IH0gPSBhd2FpdCBsb2FkQ29kZVBpcGVsaW5lKCk7XG4gICAgY2xpZW50ID0gbmV3IENvZGVQaXBlbGluZUNsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBjbGllbnRzQnlSZWdpb24uc2V0KHJlZ2lvbiwgY2xpZW50KTtcbiAgfVxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBDb2RlUGlwZWxpbmUncyBQSVBFTElORV9FVkVOVF9JRCB0YWcg4oaSIHRoZSBwbGF0Zm9ybSBwaXBlbGluZUlkLlxuICogUmV0dXJucyBudWxsIHdoZW4gdGhlIHBpcGVsaW5lIGhhcyBubyBzdWNoIHRhZyAodW5yZWdpc3RlcmVkKS4gVGhyb3dzIG9uXG4gKiBBY2Nlc3NEZW5pZWQgc28gYSBtaXNzaW5nIElBTSBncmFudCBzdXJmYWNlcyBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseVxuICogZHJvcHBpbmcgZXZlcnkgZXZlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQaXBlbGluZUV2ZW50SWQoYXJuOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGV2ZW50SWRCeUFybi5nZXQoYXJuKTtcbiAgLy8gU2VydmUgYSBwb3NpdGl2ZSBoaXQgZm9yIHRoZSBjb250YWluZXIgbGlmZXRpbWU7IHNlcnZlIGEgbmVnYXRpdmUgaGl0IG9ubHlcbiAgLy8gdW50aWwgaXQgZXhwaXJlcyAodGhlbiByZS1yZXNvbHZlLCBpbiBjYXNlIHRoZSBwaXBlbGluZSB3YXMgc2luY2UgdGFnZ2VkKS5cbiAgaWYgKGNhY2hlZCAmJiAoY2FjaGVkLnRhZyAhPT0gbnVsbCB8fCBEYXRlLm5vdygpIC0gY2FjaGVkLnRzIDwgTkVHX0NBQ0hFX1RUTF9NUykpIHtcbiAgICByZXR1cm4gY2FjaGVkLnRhZztcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHBpcGVsaW5lQ2xpZW50KHJlZ2lvbik7XG4gICAgY29uc3QgeyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCB9ID0gYXdhaXQgbG9hZENvZGVQaXBlbGluZSgpO1xuICAgIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCh7IHJlc291cmNlQXJuOiBhcm4gfSkpO1xuICAgIGNvbnN0IHRhZyA9IG91dC50YWdzPy5maW5kKHQgPT4gdC5rZXkgPT09IFBJUEVMSU5FX0VWRU5UX0lEX1RBRyk/LnZhbHVlID8/IG51bGw7XG4gICAgaWYgKCF0YWcpIGxvZy53YXJuKCdQaXBlbGluZSBtaXNzaW5nIFBJUEVMSU5FX0VWRU5UX0lEIHRhZyDigJQgc2tpcHBpbmcgKHJlZ2lzdGVyIGl0PyknLCB7IGFybiB9KTtcbiAgICBldmVudElkQnlBcm4uc2V0KGFybiwgeyB0YWcsIHRzOiBEYXRlLm5vdygpIH0pO1xuICAgIHJldHVybiB0YWc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IG5hbWUgPSAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZTtcbiAgICBpZiAobmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicpIHtcbiAgICAgIC8vIERvbid0IGNhY2hlIOKAlCB0aGlzIGlzIGEgZml4YWJsZSBtaXNjb25maWcsIG5vdCBhIHByb3BlcnR5IG9mIHRoZSBwaXBlbGluZS5cbiAgICAgIGxvZy5lcnJvcignQWNjZXNzRGVuaWVkIGNhbGxpbmcgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2Ug4oCUIGdyYW50IGl0IHRvIHRoZSBMYW1iZGEgcm9sZScsIHsgYXJuLCBlcnJvcjogbmFtZSB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBQSVBFTElORV9FVkVOVF9JRCB0YWcnLCB7IGFybiwgZXJyb3I6IG5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSAIEF1dGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmxldCBjYWNoZWRUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dGhUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY2FjaGVkVG9rZW4pIHJldHVybiBjYWNoZWRUb2tlbjtcblxuICAvLyBQYXRoIDE6IFBMQVRGT1JNX1RPS0VOIGVudiB2YXIgKG5vIFNlY3JldHMgTWFuYWdlciBjYWxsKVxuICBpZiAocHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pIHtcbiAgICBjYWNoZWRUb2tlbiA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOO1xuICAgIGxvZy5pbmZvKCdVc2luZyBQTEFURk9STV9UT0tFTiBmcm9tIGVudmlyb25tZW50Jyk7XG4gICAgcmV0dXJuIGNhY2hlZFRva2VuO1xuICB9XG5cbiAgLy8gUGF0aCAyOiBQTEFURk9STV9TRUNSRVRfTkFNRSDihpIgcmVhZCBmcm9tIFNlY3JldHMgTWFuYWdlclxuICBjb25zdCBzZWNyZXROYW1lID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUU7XG4gIGlmICghc2VjcmV0TmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fVE9LRU4gb3IgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBGZXRjaGluZyB0b2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlcjogJHtzZWNyZXROYW1lfWApO1xuICBjb25zdCBjbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KSk7XG5cbiAgaWYgKCFyZXNwb25zZS5TZWNyZXRTdHJpbmcpIHRocm93IG5ldyBFcnJvcihgU2VjcmV0IFwiJHtzZWNyZXROYW1lfVwiIGlzIGVtcHR5YCk7XG5cbiAgY29uc3Qgc2VjcmV0ID0gSlNPTi5wYXJzZShyZXNwb25zZS5TZWNyZXRTdHJpbmcpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8vIHN0b3JlLXRva2VuIHdyaXRlcyB0aGUgSldUIGluIGBwYXNzd29yZGAgKHRoZSBjYW5vbmljYWwgZmllbGQg4oCUIGFsc28gdXNlZCBieVxuICAvLyBDb2RlQnVpbGQgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFscywgdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhLCBhbmQgdG9rZW4tcmVuZXcpLlxuICBjb25zdCB0b2tlbiA9IHNlY3JldC5wYXNzd29yZDtcbiAgaWYgKCF0b2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcignU2VjcmV0IG1pc3NpbmcgSldUIChwYXNzd29yZCkg4oCUIHJ1biBcInBpcGVsaW5lLW1hbmFnZXIgc3RvcmUtdG9rZW5cIiB0byBnZW5lcmF0ZScpO1xuICB9XG5cbiAgY2FjaGVkVG9rZW4gPSB0b2tlbjtcbiAgbG9nLmluZm8oJ1VzaW5nIHN0b3JlZCBKV1QgdG9rZW4gZnJvbSBTZWNyZXRzIE1hbmFnZXInKTtcbiAgcmV0dXJuIGNhY2hlZFRva2VuO1xufVxuXG4vLyDilIDilIDilIAgRXZlbnQgUGFyc2luZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIFBhcnNlZEV2ZW50IHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiwgZnJvbSBhbiBBY3Rpb24gZXZlbnQnc1xuICAgKiAgYGV4ZWN1dGlvbi1yZXN1bHQuZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnlgLiBUaGUgbG9nIFVSTCArIGVycm9yLWNvZGVcbiAgICogIHN0YXkgaW4gYGRldGFpbGAgZm9yIGRyaWxsLWRvd24uICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgZGV0YWlsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENhcCBvbiB0aGUgc3RvcmVkIGZhaWx1cmUgc3VtbWFyeSDigJQgQ29kZUJ1aWxkL0RlcGxveSBzdW1tYXJpZXMgY2FuIGJlIGxvbmcuICovXG5jb25zdCBNQVhfRVJST1JfTUVTU0FHRSA9IDQwMDA7XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5RXZlbnQoZGV0YWlsVHlwZTogc3RyaW5nKTogeyBldmVudFR5cGU6IHN0cmluZzsgZXZlbnRTb3VyY2U6IHN0cmluZyB9IHtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ1BpcGVsaW5lIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdQSVBFTElORScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnU3RhZ2UgRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ1NUQUdFJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdBY3Rpb24gRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ0FDVElPTicsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICAvLyBDb2RlQnVpbGQgXCJCdWlsZCBTdGF0ZVwiIGV2ZW50cyBpZGVudGlmeSBhIGJ1aWxkICpwcm9qZWN0Kiwgbm90IGEgcGlwZWxpbmUsIHNvXG4gIC8vIHBhcnNlUmVjb3JkIGRyb3BzIHRoZW0gb24gdGhlIGBldmVudFNvdXJjZSAhPT0gJ2NvZGVwaXBlbGluZSdgIGNoZWNrIGJlbG93IOKAlFxuICAvLyB0aGUgJ0JVSUxEJyBldmVudFR5cGUgaXMgbmV2ZXIgcGVyc2lzdGVkIGhlcmUgKHBsdWdpbiBCVUlMRCBldmVudHMgYXJlXG4gIC8vIHJlY29yZGVkIGRpcmVjdGx5IGJ5IHRoZSBwbHVnaW4gc2VydmljZSkuIFRoZSAnY29kZWJ1aWxkJyBzb3VyY2UgaXMgd2hhdFxuICAvLyByb3V0ZXMgdGhlIGRyb3A7IGtlZXAgdGhpcyBicmFuY2ggb25seSBmb3IgdGhhdC5cbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ0J1aWxkIFN0YXRlJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ0JVSUxEJywgZXZlbnRTb3VyY2U6ICdjb2RlYnVpbGQnIH07XG4gIHJldHVybiB7IGV2ZW50VHlwZTogJ1BJUEVMSU5FJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG59XG5cbi8qKiBQYXJzZSArIHJlc29sdmUgb25lIHJlY29yZCB0byBhIHJlcG9ydGFibGUgZXZlbnQsIG9yIG51bGwgdG8gc2tpcCBpdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlUmVjb3JkKHJlY29yZDogU1FTUmVjb3JkKTogUHJvbWlzZTxQYXJzZWRFdmVudCB8IG51bGw+IHtcbiAgbGV0IGV2ZW50OiB7XG4gICAgJ2RldGFpbC10eXBlJzogc3RyaW5nO1xuICAgICdzb3VyY2UnOiBzdHJpbmc7XG4gICAgJ2RldGFpbCc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICd0aW1lJzogc3RyaW5nO1xuICAgICdyZWdpb24nOiBzdHJpbmc7XG4gICAgJ2FjY291bnQnOiBzdHJpbmc7XG4gIH07XG4gIC8vIEEgbWFsZm9ybWVkIGJvZHkgaXMgYSBkZWFkIG1lc3NhZ2UgKHJldHJ5aW5nIHdvbid0IGhlbHApIOKAlCBsb2cgKyBza2lwIGl0IHNvXG4gIC8vIGl0IGNhbid0IGZhaWwgdGhlIHdob2xlIGJhdGNoLiBSZXNvbHV0aW9uIGVycm9ycyBiZWxvdyAoZS5nLiBBY2Nlc3NEZW5pZWQpXG4gIC8vIGFyZSBOT1QgY2F1Z2h0IGhlcmU6IHRob3NlIGFyZSB0cmFuc2llbnQvaW5mcmEgYW5kIG11c3QgcHJvcGFnYXRlIHRvIHJldHJ5LlxuICB0cnkge1xuICAgIGV2ZW50ID0gSlNPTi5wYXJzZShyZWNvcmQuYm9keSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdTa2lwcGluZyBTUVMgcmVjb3JkIHdpdGggdW5wYXJzZWFibGUgYm9keScsIHsgbWVzc2FnZUlkOiByZWNvcmQubWVzc2FnZUlkLCBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IGV2ZW50VHlwZSwgZXZlbnRTb3VyY2UgfSA9IGNsYXNzaWZ5RXZlbnQoZXZlbnRbJ2RldGFpbC10eXBlJ10pO1xuICBjb25zdCBkZXRhaWwgPSB7IC4uLmV2ZW50LmRldGFpbCB9O1xuICAvLyBUaGUgcmF3IGFjY291bnQgbmV2ZXIgbmVlZHMgdG8gbGVhdmUgQVdTIG5vdyDigJQgZHJvcCBpdCBmcm9tIHRoZSBwYXlsb2FkLlxuICBkZWxldGUgZGV0YWlsLmFjY291bnQ7XG5cbiAgLy8gQ29kZUJ1aWxkIFwiQnVpbGQgU3RhdGVcIiBldmVudHMgaWRlbnRpZnkgYSBidWlsZCAqcHJvamVjdCosIG5vdCBhIHBpcGVsaW5lLFxuICAvLyBhbmQgYSBwcm9qZWN0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIHBpcGVsaW5lcyDigJQgdGhlcmUncyBubyBjbGVhbiAxOjEgbWFwcGluZ1xuICAvLyB0byBhIFBJUEVMSU5FX0VWRU5UX0lELCBzbyBza2lwIHRoZW0gKHRoZXkgd2VyZSBlZmZlY3RpdmVseSBkcm9wcGVkIGJlZm9yZVxuICAvLyB0b28sIHNpbmNlIGRldGFpbC5waXBlbGluZSB3YXMgdW5kZWZpbmVkIGFuZCBuZXZlciBtYXRjaGVkIHRoZSByZWdpc3RyeSkuXG4gIGlmIChldmVudFNvdXJjZSAhPT0gJ2NvZGVwaXBlbGluZScpIHtcbiAgICBsb2cud2FybignU2tpcHBpbmcgbm9uLUNvZGVQaXBlbGluZSBldmVudCAobm8gcGlwZWxpbmUgdGFnIHRvIHJlc29sdmUpJywgeyBkZXRhaWxUeXBlOiBldmVudFsnZGV0YWlsLXR5cGUnXSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBpcGVsaW5lTmFtZSA9IGRldGFpbC5waXBlbGluZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmICghcGlwZWxpbmVOYW1lKSB7XG4gICAgbG9nLndhcm4oJ0NvZGVQaXBlbGluZSBldmVudCBtaXNzaW5nIHBpcGVsaW5lIG5hbWUg4oCUIHNraXBwaW5nJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSBwaXBlbGluZSdzIFBJUEVMSU5FX0VWRU5UX0lEIHRhZyAoPSBwbGF0Zm9ybSBwaXBlbGluZUlkKS4gVGhlXG4gIC8vIEFSTiBpcyBvbmx5IGEgdHJhbnNpZW50IGhhbmRsZSBmb3IgdGhlIHRhZyBsb29rdXA7IGl0IGlzIG5ldmVyIHN0b3JlZC5cbiAgY29uc3QgYXJuID0gYGFybjphd3M6Y29kZXBpcGVsaW5lOiR7ZXZlbnQucmVnaW9ufToke2V2ZW50LmFjY291bnR9OiR7cGlwZWxpbmVOYW1lfWA7XG4gIGNvbnN0IHBpcGVsaW5lSWQgPSBhd2FpdCByZXNvbHZlUGlwZWxpbmVFdmVudElkKGFybiwgZXZlbnQucmVnaW9uKTtcbiAgaWYgKCFwaXBlbGluZUlkKSByZXR1cm4gbnVsbDsgLy8gdW50YWdnZWQgLyB1bnJlZ2lzdGVyZWQg4oaSIHNraXBcblxuICBjb25zdCBzdGFydGVkQXQgPSAoZGV0YWlsWydzdGFydC10aW1lJ10gYXMgc3RyaW5nKSB8fCBldmVudC50aW1lO1xuICBjb25zdCBzdGF0ZSA9IGRldGFpbC5zdGF0ZSBhcyBzdHJpbmc7XG5cbiAgbGV0IGR1cmF0aW9uTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGNvbXBsZXRlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKFsnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcsICdTVE9QUEVEJ10uaW5jbHVkZXMoc3RhdGUpKSB7XG4gICAgY29tcGxldGVkQXQgPSBldmVudC50aW1lO1xuICAgIGlmIChzdGFydGVkQXQgJiYgY29tcGxldGVkQXQpIHtcbiAgICAgIGNvbnN0IG1zID0gbmV3IERhdGUoY29tcGxldGVkQXQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHN0YXJ0ZWRBdCkuZ2V0VGltZSgpO1xuICAgICAgaWYgKG1zID49IDApIGR1cmF0aW9uTXMgPSBtcztcbiAgICB9XG4gIH1cblxuICAvLyBQcm9tb3RlIHRoZSBmYWlsdXJlIHJlYXNvbiB0byBhIHR5cGVkIGZpZWxkLiBPbiBBY3Rpb24gZXZlbnRzIEFXUyBwdXRzIHRoZVxuICAvLyBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IChhbmQgYSBsb2cgVVJMICsgZXJyb3ItY29kZSwgd2hpY2ggc3RheSBpbiBgZGV0YWlsYClcbiAgLy8gdW5kZXIgYGV4ZWN1dGlvbi1yZXN1bHRgLlxuICBjb25zdCByZXN1bHQgPSBkZXRhaWxbJ2V4ZWN1dGlvbi1yZXN1bHQnXSBhcyB7ICdleHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeSc/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN1bW1hcnkgPSByZXN1bHQ/LlsnZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnknXTtcbiAgY29uc3QgZXJyb3JNZXNzYWdlID0gdHlwZW9mIHN1bW1hcnkgPT09ICdzdHJpbmcnICYmIHN1bW1hcnkubGVuZ3RoID4gMFxuICAgID8gc3VtbWFyeS5zbGljZSgwLCBNQVhfRVJST1JfTUVTU0FHRSlcbiAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIHBpcGVsaW5lSWQsXG4gICAgZXZlbnRTb3VyY2UsXG4gICAgZXZlbnRUeXBlLFxuICAgIHN0YXR1czogc3RhdGUsXG4gICAgZXhlY3V0aW9uSWQ6IGRldGFpbFsnZXhlY3V0aW9uLWlkJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN0YWdlTmFtZTogZGV0YWlsLnN0YWdlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBhY3Rpb25OYW1lOiBkZXRhaWwuYWN0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgc3RhcnRlZEF0LFxuICAgIGNvbXBsZXRlZEF0LFxuICAgIGR1cmF0aW9uTXMsXG4gICAgZGV0YWlsLFxuICB9O1xufVxuXG4vLyDilIDilIDilIAgSGFuZGxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IFNRU0V2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGJhc2VVcmwgPSBwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTDtcbiAgaWYgKCFiYXNlVXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1BMQVRGT1JNX0JBU0VfVVJMIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG5cbiAgLy8gUGFyc2UgKyByZXNvbHZlIGFsbCByZWNvcmRzICh0YWcgbG9va3VwcyBydW4gY29uY3VycmVudGx5KTsgZHJvcCBpbnRlbnRpb25hbFxuICAvLyBza2lwcyAobnVsbCkuIEEgbWFsZm9ybWVkIHJlY29yZCBCT0RZIGlzIGhhbmRsZWQgaW5zaWRlIHBhcnNlUmVjb3JkIChsb2dnZWQgK1xuICAvLyBza2lwcGVkKSBzbyBvbmUgYmFkIG1lc3NhZ2UgY2FuJ3QgZmFpbCB0aGUgd2hvbGUgYmF0Y2gg4oCUIHdoaWxlIGdlbnVpbmUgaW5mcmFcbiAgLy8gZXJyb3JzIChlLmcuIEFjY2Vzc0RlbmllZCBvbiB0aGUgdGFnIGxvb2t1cCkgc3RpbGwgcHJvcGFnYXRlIHNvIGEgbWlzc2luZyBJQU1cbiAgLy8gZ3JhbnQgc3VyZmFjZXMgYW5kIFNRUyByZXRyaWVzIHRoZSBiYXRjaC5cbiAgY29uc3QgZXZlbnRzID0gKGF3YWl0IFByb21pc2UuYWxsKGV2ZW50LlJlY29yZHMubWFwKHBhcnNlUmVjb3JkKSkpXG4gICAgLmZpbHRlcigoZSk6IGUgaXMgUGFyc2VkRXZlbnQgPT4gZSAhPT0gbnVsbCk7XG4gIGlmIChldmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nLmluZm8oJ05vIHJlc29sdmFibGUgQ29kZVBpcGVsaW5lIGV2ZW50cyBpbiBiYXRjaCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFBPU1QgYmF0Y2ggdG8gcmVwb3J0aW5nIHNlcnZpY2UuIE9uIGEgNDAxLzQwMyB0aGUgY2FjaGVkIEpXVCBoYXMgbGlrZWx5XG4gIC8vIGV4cGlyZWQg4oCUIGRyb3AgaXQsIHJlLWZldGNoLCBhbmQgcmV0cnkgT05DRSBzbyBhbiBleHBpcmVkIHRva2VuIGRvZXNuJ3RcbiAgLy8gcGVybWFuZW50bHkgYnJpY2sgYSB3YXJtIGNvbnRhaW5lci5cbiAgY29uc3QgcG9zdCA9ICh0b2tlbjogc3RyaW5nKSA9PiBmZXRjaChgJHtiYXNlVXJsfS9hcGkvcmVwb3J0cy9ldmVudHNgLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBldmVudHMgfSksXG4gIH0pO1xuICBsZXQgcmVzID0gYXdhaXQgcG9zdChhd2FpdCBnZXRBdXRoVG9rZW4oKSk7XG4gIGlmIChyZXMuc3RhdHVzID09PSA0MDEgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgbG9nLndhcm4oJ1JlcG9ydGluZyBBUEkgYXV0aCBmYWlsZWQ7IHJlZnJlc2hpbmcgdG9rZW4gYW5kIHJldHJ5aW5nIG9uY2UnLCB7IHN0YXR1czogcmVzLnN0YXR1cyB9KTtcbiAgICBjYWNoZWRUb2tlbiA9IG51bGw7XG4gICAgcmVzID0gYXdhaXQgcG9zdChhd2FpdCBnZXRBdXRoVG9rZW4oKSk7XG4gIH1cblxuICBpZiAoIXJlcy5vaykge1xuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpLmNhdGNoKCgpID0+ICcnKTtcbiAgICBsb2cuZXJyb3IoYFJlcG9ydGluZyBBUEkgcmV0dXJuZWQgJHtyZXMuc3RhdHVzfWAsIHsgYm9keSB9KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcG9ydGluZyBBUEkgZmFpbGVkOiAke3Jlcy5zdGF0dXN9YCk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXMuanNvbigpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBsb2cuaW5mbyhgSW5nZXN0ZWQgJHtldmVudHMubGVuZ3RofSBldmVudHNgLCB7IGluc2VydGVkOiByZXN1bHQuZGF0YSB9KTtcbn07XG4iXX0=
290
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQWU5RixJQUFJLGVBQStDLENBQUM7QUFDcEQsS0FBSyxVQUFVLGdCQUFnQjtJQUM3QixJQUFJLENBQUMsZUFBZTtRQUFFLGVBQWUsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQWtDLENBQUM7SUFDeEgsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE1BQU0sR0FBRyxHQUFHO0lBQ1YsSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksS0FBSyxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxP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NkIsQ0FBQztJQUMzRCxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksTUFBTSxDQUFDLE1BQU0sU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsIFNlY3JldHNNYW5hZ2VyQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7IFNRU0V2ZW50LCBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcblxuLy8gQVdTIExhbWJkYSdzIE5vZGUgcnVudGltZSBidW5kbGVzIEBhd3Mtc2RrIHYzLCBzbyB0aGUgQ29kZVBpcGVsaW5lIGNsaWVudCBpc1xuLy8gbG9hZGVkIGxhemlseSB2aWEgZHluYW1pYyBpbXBvcnQoKSDigJQgYSBzdGF0aWMgd29ya3NwYWNlIGRlcGVuZGVuY3kgb25cbi8vIEBhd3Mtc2RrL2NsaWVudC1jb2RlcGlwZWxpbmUgd291bGQgcGVydHVyYiB0aGUgc2hhcmVkIEBhd3Mtc2RrIHZlcnNpb24gdHJlZVxuLy8gYW5kIGJyZWFrIG90aGVyIHBhY2thZ2VzJyB0eXBpbmdzLiBUaGUgZHluYW1pYyBpbXBvcnQga2VlcHMgaXQgb3V0IG9mIHRoZVxuLy8gc3RhdGljIGdyYXBoIHdoaWxlIHN0YXlpbmcgRVNNLWNvcnJlY3QgKG5vIGByZXF1aXJlYCBpbiBhIHR5cGU6bW9kdWxlIHBhY2thZ2UpXG4vLyBhbmQgbW9ja2FibGUuIE1pbmltYWwgbG9jYWwgdHlwZXMga2VlcCB0aGUgY2FsbCBzaXRlcyB0eXBlLWNoZWNrZWQuXG5pbnRlcmZhY2UgTGlzdFRhZ3NPdXRwdXQgeyB0YWdzPzogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIH0+IH1cbmludGVyZmFjZSBDb2RlUGlwZWxpbmVDbGllbnRMaWtlIHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTxMaXN0VGFnc091dHB1dD4gfVxuaW50ZXJmYWNlIENvZGVQaXBlbGluZU1vZHVsZSB7XG4gIENvZGVQaXBlbGluZUNsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gQ29kZVBpcGVsaW5lQ2xpZW50TGlrZTtcbiAgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgcmVzb3VyY2VBcm46IHN0cmluZyB9KSA9PiB1bmtub3duO1xufVxubGV0IGNvZGVwaXBlbGluZU1vZDogQ29kZVBpcGVsaW5lTW9kdWxlIHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gbG9hZENvZGVQaXBlbGluZSgpOiBQcm9taXNlPENvZGVQaXBlbGluZU1vZHVsZT4ge1xuICBpZiAoIWNvZGVwaXBlbGluZU1vZCkgY29kZXBpcGVsaW5lTW9kID0gKGF3YWl0IGltcG9ydCgnQGF3cy1zZGsvY2xpZW50LWNvZGVwaXBlbGluZScpKSBhcyB1bmtub3duIGFzIENvZGVQaXBlbGluZU1vZHVsZTtcbiAgcmV0dXJuIGNvZGVwaXBlbGluZU1vZDtcbn1cblxuLyoqXG4gKiBQaXBlbGluZSBldmVudCBpbmdlc3Rpb24gTGFtYmRhIGhhbmRsZXIuXG4gKlxuICogUmVjZWl2ZXMgQ29kZVBpcGVsaW5lL0NvZGVCdWlsZCBldmVudHMgZnJvbSBTUVMgKHNvdXJjZWQgYnkgRXZlbnRCcmlkZ2UpLFxuICogcGFyc2VzIHRoZW0gaW50byBhIG5vcm1hbGl6ZWQgZm9ybWF0LCBhbmQgUE9TVHMgdGhlbSB0byB0aGUgcmVwb3J0aW5nIHNlcnZpY2VcbiAqIHZpYSBQTEFURk9STV9CQVNFX1VSTC5cbiAqXG4gKiBBdXRoZW50aWNhdGlvbjpcbiAqIC0gUExBVEZPUk1fVE9LRU4gZW52IHZhciAocHJlZmVycmVkIOKAlCBubyBTZWNyZXRzIE1hbmFnZXIgY2FsbClcbiAqIC0gUExBVEZPUk1fU0VDUkVUX05BTUUgZW52IHZhciDihpIgcmVhZHMgdGhlIEpXVCAocGFzc3dvcmQpIGZyb20gU2VjcmV0cyBNYW5hZ2VyXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBQTEFURk9STV9CQVNFX1VSTCDigJQgQmFzZSBVUkwgb2YgdGhlIHBsYXRmb3JtXG4gKiAtIFBMQVRGT1JNX1RPS0VOIOKAlCBKV1QgdG9rZW4gKHNldCBkaXJlY3RseSwgb3IpXG4gKiAtIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIOKAlCBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGNvbnRhaW5pbmcgeyBwYXNzd29yZDogPEpXVD4gfVxuICovXG5cbmNvbnN0IGxvZyA9IHtcbiAgaW5mbzogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0lORk8nLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxuICB3YXJuOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnV0FSTicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIGVycm9yOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdFUlJPUicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG59O1xuXG4vLyDilIDilIAgUElQRUxJTkVfRVZFTlRfSUQgcmVzb2x1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBpcGVsaW5lcyBhcmUgdGFnZ2VkIGBQSVBFTElORV9FVkVOVF9JRD08cGlwZWxpbmVJZD5gIGF0IENESyBzeW50aC4gV2UgcmVzb2x2ZVxuLy8gdGhhdCB0YWcgZnJvbSB0aGUgbGl2ZSBDb2RlUGlwZWxpbmUgKHJlZ2lvbi1hd2FyZSkgYW5kIHJlcG9ydCBhZ2FpbnN0IHRoZSBpZCDigJRcbi8vIHRoZSBBUk4vYWNjb3VudCBuZXZlciBsZWF2ZSBBV1MsIHNvIHRoZXJlJ3Mgbm8gbWFza2luZy4gQ2FjaGVkIHBlciBBUk5cbi8vICh3YXJtLWNvbnRhaW5lcikgdG8gYXZvaWQgaGFtbWVyaW5nIHRoZSBMaXN0VGFncyBBUEkuXG4vL1xuLy8gUmVxdWlyZXMgdGhlIExhbWJkYSBleGVjdXRpb24gcm9sZSB0byBhbGxvdyBgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2VgLlxuLy8gQWNjZXNzRGVuaWVkIGlzIGEgY29uZmlnIGVycm9yIChhbGVydCBsb3VkbHkpOyBhIG1pc3NpbmcgdGFnIGlzIHRyZWF0ZWQgYXNcbi8vIFwibm90IHlldCByZWdpc3RlcmVkXCIgKHNraXApLlxuXG5jb25zdCBQSVBFTElORV9FVkVOVF9JRF9UQUcgPSAnUElQRUxJTkVfRVZFTlRfSUQnO1xuLy8gT3B0aW9uYWwgZGVwbG95LWVudmlyb25tZW50IHRhZyAoc2V0IGJ5IHBpcGVsaW5lLWNvcmUgd2hlbiBhIHBpcGVsaW5lIGRlY2xhcmVzXG4vLyBhbiBgZW52aXJvbm1lbnRgKS4gUmVhZCBmcm9tIHRoZSBTQU1FIExpc3RUYWdzIHJlc3BvbnNlIGFzIFBJUEVMSU5FX0VWRU5UX0lEIHNvXG4vLyBpdCBjYW4gYmUgYXR0cmlidXRlZCB0byBDb2RlUGlwZWxpbmUgZXZlbnRzIGZvciBET1JBIGRlcGxveSBtZXRyaWNzLiBBYnNlbnQgb25cbi8vIGxlZ2FjeSBwaXBlbGluZXMg4oaSIGxlZnQgdW5kZWZpbmVkIChOVUxMIGRvd25zdHJlYW0pLlxuY29uc3QgRU5WSVJPTk1FTlRfVEFHID0gJ0Vudmlyb25tZW50JztcbmNvbnN0IGNsaWVudHNCeVJlZ2lvbiA9IG5ldyBNYXA8c3RyaW5nLCBDb2RlUGlwZWxpbmVDbGllbnRMaWtlPigpO1xuLy8gcGlwZWxpbmVJZD1udWxsIGlzIGEgbmVnYXRpdmUgY2FjaGUgKHJlc29sdmVkLWJ1dC11bnRhZ2dlZCk7IGB0c2AgbGV0cyBuZWdhdGl2ZXNcbi8vIGV4cGlyZSBzbyBhIHBpcGVsaW5lIHRhZ2dlZCBBRlRFUiBpdHMgZmlyc3QgZXZlbnQgYmVjb21lcyByZXNvbHZhYmxlIHdpdGhvdXRcbi8vIHJlY3ljbGluZyB0aGUgd2FybSBjb250YWluZXIuIFBvc2l0aXZlIHJlc3VsdHMgc3RheSBjYWNoZWQgZm9yIHRoZSBsaWZldGltZS5cbmNvbnN0IHJlc29sdmVkQnlBcm4gPSBuZXcgTWFwPHN0cmluZywgeyBwaXBlbGluZUlkOiBzdHJpbmcgfCBudWxsOyBlbnZpcm9ubWVudD86IHN0cmluZzsgdHM6IG51bWJlciB9PigpO1xuY29uc3QgTkVHX0NBQ0hFX1RUTF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKiBSZXNvbHZlZCBwaXBlbGluZSBtZXRhZGF0YSByZWFkIGZyb20gdGhlIENvZGVQaXBlbGluZSByZXNvdXJjZSB0YWdzLiAqL1xuaW50ZXJmYWNlIFJlc29sdmVkUGlwZWxpbmUge1xuICAvKiogUGxhdGZvcm0gcGlwZWxpbmVJZCAoUElQRUxJTkVfRVZFTlRfSUQgdGFnKTsgbnVsbCB3aGVuIHVudGFnZ2VkL3VucmVnaXN0ZXJlZC4gKi9cbiAgcGlwZWxpbmVJZDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIERlcGxveSBlbnZpcm9ubWVudCAoRW52aXJvbm1lbnQgdGFnKTsgdW5kZWZpbmVkIHdoZW4gdGhlIHBpcGVsaW5lIGhhcyBub25lLiAqL1xuICBlbnZpcm9ubWVudD86IHN0cmluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGlwZWxpbmVDbGllbnQocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPENvZGVQaXBlbGluZUNsaWVudExpa2U+IHtcbiAgbGV0IGNsaWVudCA9IGNsaWVudHNCeVJlZ2lvbi5nZXQocmVnaW9uKTtcbiAgaWYgKCFjbGllbnQpIHtcbiAgICBjb25zdCB7IENvZGVQaXBlbGluZUNsaWVudCB9ID0gYXdhaXQgbG9hZENvZGVQaXBlbGluZSgpO1xuICAgIGNsaWVudCA9IG5ldyBDb2RlUGlwZWxpbmVDbGllbnQoeyByZWdpb24gfSk7XG4gICAgY2xpZW50c0J5UmVnaW9uLnNldChyZWdpb24sIGNsaWVudCk7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgQ29kZVBpcGVsaW5lJ3MgdGFncyDihpIgdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQgKFBJUEVMSU5FX0VWRU5UX0lEKVxuICogcGx1cyB0aGUgb3B0aW9uYWwgZGVwbG95IGBlbnZpcm9ubWVudGAgKEVudmlyb25tZW50IHRhZykuIGBwaXBlbGluZUlkYCBpcyBudWxsXG4gKiB3aGVuIHRoZSBwaXBlbGluZSBoYXMgbm8gUElQRUxJTkVfRVZFTlRfSUQgdGFnICh1bnJlZ2lzdGVyZWQpLiBUaHJvd3Mgb25cbiAqIEFjY2Vzc0RlbmllZCBzbyBhIG1pc3NpbmcgSUFNIGdyYW50IHN1cmZhY2VzIGxvdWRseSBpbnN0ZWFkIG9mIHNpbGVudGx5XG4gKiBkcm9wcGluZyBldmVyeSBldmVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBpcGVsaW5lKGFybjogc3RyaW5nLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8UmVzb2x2ZWRQaXBlbGluZT4ge1xuICBjb25zdCBjYWNoZWQgPSByZXNvbHZlZEJ5QXJuLmdldChhcm4pO1xuICAvLyBTZXJ2ZSBhIHBvc2l0aXZlIGhpdCBmb3IgdGhlIGNvbnRhaW5lciBsaWZldGltZTsgc2VydmUgYSBuZWdhdGl2ZSBoaXQgb25seVxuICAvLyB1bnRpbCBpdCBleHBpcmVzICh0aGVuIHJlLXJlc29sdmUsIGluIGNhc2UgdGhlIHBpcGVsaW5lIHdhcyBzaW5jZSB0YWdnZWQpLlxuICBpZiAoY2FjaGVkICYmIChjYWNoZWQucGlwZWxpbmVJZCAhPT0gbnVsbCB8fCBEYXRlLm5vdygpIC0gY2FjaGVkLnRzIDwgTkVHX0NBQ0hFX1RUTF9NUykpIHtcbiAgICByZXR1cm4geyBwaXBlbGluZUlkOiBjYWNoZWQucGlwZWxpbmVJZCwgLi4uKGNhY2hlZC5lbnZpcm9ubWVudCAmJiB7IGVudmlyb25tZW50OiBjYWNoZWQuZW52aXJvbm1lbnQgfSkgfTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHBpcGVsaW5lQ2xpZW50KHJlZ2lvbik7XG4gICAgY29uc3QgeyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCB9ID0gYXdhaXQgbG9hZENvZGVQaXBlbGluZSgpO1xuICAgIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCh7IHJlc291cmNlQXJuOiBhcm4gfSkpO1xuICAgIGNvbnN0IHBpcGVsaW5lSWQgPSBvdXQudGFncz8uZmluZCh0ID0+IHQua2V5ID09PSBQSVBFTElORV9FVkVOVF9JRF9UQUcpPy52YWx1ZSA/PyBudWxsO1xuICAgIGNvbnN0IGVudlRhZyA9IG91dC50YWdzPy5maW5kKHQgPT4gdC5rZXkgPT09IEVOVklST05NRU5UX1RBRyk/LnZhbHVlO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID0gdHlwZW9mIGVudlRhZyA9PT0gJ3N0cmluZycgJiYgZW52VGFnLmxlbmd0aCA+IDAgPyBlbnZUYWcuc2xpY2UoMCwgTUFYX0FUVFIpIDogdW5kZWZpbmVkO1xuICAgIGlmICghcGlwZWxpbmVJZCkgbG9nLndhcm4oJ1BpcGVsaW5lIG1pc3NpbmcgUElQRUxJTkVfRVZFTlRfSUQgdGFnIOKAlCBza2lwcGluZyAocmVnaXN0ZXIgaXQ/KScsIHsgYXJuIH0pO1xuICAgIHJlc29sdmVkQnlBcm4uc2V0KGFybiwgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCwgdHM6IERhdGUubm93KCkgfSk7XG4gICAgcmV0dXJuIHsgcGlwZWxpbmVJZCwgLi4uKGVudmlyb25tZW50ICYmIHsgZW52aXJvbm1lbnQgfSkgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc3QgbmFtZSA9IChlcnIgYXMgeyBuYW1lPzogc3RyaW5nIH0pPy5uYW1lO1xuICAgIGlmIChuYW1lID09PSAnQWNjZXNzRGVuaWVkRXhjZXB0aW9uJykge1xuICAgICAgLy8gRG9uJ3QgY2FjaGUg4oCUIHRoaXMgaXMgYSBmaXhhYmxlIG1pc2NvbmZpZywgbm90IGEgcHJvcGVydHkgb2YgdGhlIHBpcGVsaW5lLlxuICAgICAgbG9nLmVycm9yKCdBY2Nlc3NEZW5pZWQgY2FsbGluZyBjb2RlcGlwZWxpbmU6TGlzdFRhZ3NGb3JSZXNvdXJjZSDigJQgZ3JhbnQgaXQgdG8gdGhlIExhbWJkYSByb2xlJywgeyBhcm4sIGVycm9yOiBuYW1lIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIFBJUEVMSU5FX0VWRU5UX0lEIHRhZycsIHsgYXJuLCBlcnJvcjogbmFtZSA/PyBTdHJpbmcoZXJyKSB9KTtcbiAgICByZXR1cm4geyBwaXBlbGluZUlkOiBudWxsIH07XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSAIEF1dGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmxldCBjYWNoZWRUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dGhUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY2FjaGVkVG9rZW4pIHJldHVybiBjYWNoZWRUb2tlbjtcblxuICAvLyBQYXRoIDE6IFBMQVRGT1JNX1RPS0VOIGVudiB2YXIgKG5vIFNlY3JldHMgTWFuYWdlciBjYWxsKVxuICBpZiAocHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pIHtcbiAgICBjYWNoZWRUb2tlbiA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOO1xuICAgIGxvZy5pbmZvKCdVc2luZyBQTEFURk9STV9UT0tFTiBmcm9tIGVudmlyb25tZW50Jyk7XG4gICAgcmV0dXJuIGNhY2hlZFRva2VuO1xuICB9XG5cbiAgLy8gUGF0aCAyOiBQTEFURk9STV9TRUNSRVRfTkFNRSDihpIgcmVhZCBmcm9tIFNlY3JldHMgTWFuYWdlclxuICBjb25zdCBzZWNyZXROYW1lID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUU7XG4gIGlmICghc2VjcmV0TmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fVE9LRU4gb3IgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBGZXRjaGluZyB0b2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlcjogJHtzZWNyZXROYW1lfWApO1xuICBjb25zdCBjbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KSk7XG5cbiAgaWYgKCFyZXNwb25zZS5TZWNyZXRTdHJpbmcpIHRocm93IG5ldyBFcnJvcihgU2VjcmV0IFwiJHtzZWNyZXROYW1lfVwiIGlzIGVtcHR5YCk7XG5cbiAgY29uc3Qgc2VjcmV0ID0gSlNPTi5wYXJzZShyZXNwb25zZS5TZWNyZXRTdHJpbmcpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8vIHN0b3JlLXRva2VuIHdyaXRlcyB0aGUgSldUIGluIGBwYXNzd29yZGAgKHRoZSBjYW5vbmljYWwgZmllbGQg4oCUIGFsc28gdXNlZCBieVxuICAvLyBDb2RlQnVpbGQgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFscywgdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhLCBhbmQgdG9rZW4tcmVuZXcpLlxuICBjb25zdCB0b2tlbiA9IHNlY3JldC5wYXNzd29yZDtcbiAgaWYgKCF0b2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcignU2VjcmV0IG1pc3NpbmcgSldUIChwYXNzd29yZCkg4oCUIHJ1biBcInBpcGVsaW5lLW1hbmFnZXIgc3RvcmUtdG9rZW5cIiB0byBnZW5lcmF0ZScpO1xuICB9XG5cbiAgY2FjaGVkVG9rZW4gPSB0b2tlbjtcbiAgbG9nLmluZm8oJ1VzaW5nIHN0b3JlZCBKV1QgdG9rZW4gZnJvbSBTZWNyZXRzIE1hbmFnZXInKTtcbiAgcmV0dXJuIGNhY2hlZFRva2VuO1xufVxuXG4vLyDilIDilIDilIAgRXZlbnQgUGFyc2luZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIFBhcnNlZEV2ZW50IHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiwgZnJvbSBhbiBBY3Rpb24gZXZlbnQnc1xuICAgKiAgYGV4ZWN1dGlvbi1yZXN1bHQuZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnlgLiBUaGUgbG9nIFVSTCArIGVycm9yLWNvZGVcbiAgICogIHN0YXkgaW4gYGRldGFpbGAgZm9yIGRyaWxsLWRvd24uICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdGhlIGV2ZW50XG4gICAqICBjYXJyaWVzIG5vIHNvdXJjZSByZXZpc2lvbiDigJQgbGVnYWN5L2JhY2stY29tcGF0OiBzdG9yZWQgTlVMTCBkb3duc3RyZWFtLiAqL1xuICBjb21taXRTaGE/OiBzdHJpbmc7XG4gIC8qKiBTb3VyY2UgYnJhbmNoL3JlZiAoRE9SQSBkZXBsb3kgYXR0cmlidXRpb24pLiBVbmRlZmluZWQgd2hlbiB1bmF2YWlsYWJsZS4gKi9cbiAgY29tbWl0UmVmPzogc3RyaW5nO1xuICAvKiogRGVwbG95IGVudmlyb25tZW50IGZyb20gdGhlIHBpcGVsaW5lJ3MgRW52aXJvbm1lbnQgdGFnLiBVbmRlZmluZWQgd2hlbiB0aGVcbiAgICogIHBpcGVsaW5lIGRlY2xhcmVzIG5vbmUg4oCUIGxlZ2FjeS9iYWNrLWNvbXBhdDogc3RvcmVkIE5VTEwgZG93bnN0cmVhbS4gKi9cbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIGRldGFpbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKiBDYXAgb24gdGhlIHN0b3JlZCBmYWlsdXJlIHN1bW1hcnkg4oCUIENvZGVCdWlsZC9EZXBsb3kgc3VtbWFyaWVzIGNhbiBiZSBsb25nLiAqL1xuY29uc3QgTUFYX0VSUk9SX01FU1NBR0UgPSA0MDAwO1xuLyoqIENhcCBvbiBjb21taXQvcmVmL2Vudmlyb25tZW50IGZpZWxkcyDigJQgdGhlIGluZ2VzdCBjb250cmFjdCBhbGxvd3MgbWF4IDI1NS4gKi9cbmNvbnN0IE1BWF9BVFRSID0gMjU1O1xuXG4vKiogRmlyc3Qgbm9uLWVtcHR5IHN0cmluZyBhbW9uZyB0aGUgY2FuZGlkYXRlcywgY2FwcGVkIHRvIHRoZSBpbmdlc3QgbWF4LiAqL1xuZnVuY3Rpb24gZmlyc3RBdHRyKC4uLnZhbHM6IHVua25vd25bXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgdiBvZiB2YWxzKSB7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA+IDApIHJldHVybiB2LnNsaWNlKDAsIE1BWF9BVFRSKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEJlc3QtZWZmb3J0IGV4dHJhY3Rpb24gb2YgdGhlIHNvdXJjZSBjb21taXQgaWQgKyByZWYgZnJvbSBhIENvZGVQaXBlbGluZSBldmVudFxuICogZGV0YWlsLiBDb2RlUGlwZWxpbmUgc3VyZmFjZXMgdGhlIHNvdXJjZSByZXZpc2lvbiB1bmRlciBhIGZldyBzaGFwZXMgZGVwZW5kaW5nXG4gKiBvbiB0aGUgZXZlbnQgdHlwZSAvIHNvdXJjZS1hY3Rpb247IHdlIGNoZWNrIHRoZSBrbm93biBvbmVzIGFuZCBsZWF2ZSB0aGUgZmllbGRzXG4gKiB1bmRlZmluZWQgd2hlbiBub25lIGFyZSBwcmVzZW50IChsZWdhY3kvYmFjay1jb21wYXQg4oCUIE5VTEwgZG93bnN0cmVhbSkuIE5ldmVyXG4gKiBwdWxscyBhbiBBUk4vYWNjb3VudCBpZDogb25seSByZXZpc2lvbi9icmFuY2ggc3RyaW5nIGZpZWxkcyBhcmUgcmVhZC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENvbW1pdChkZXRhaWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogeyBjb21taXRTaGE/OiBzdHJpbmc7IGNvbW1pdFJlZj86IHN0cmluZyB9IHtcbiAgLy8gYHNvdXJjZS1yZXZpc2lvbnNgIChrZWJhYiwgRXZlbnRCcmlkZ2UpIC8gYHNvdXJjZVJldmlzaW9uc2AgKGNhbWVsKSDigJQgZmlyc3QgZW50cnkuXG4gIGNvbnN0IHJldnMgPSAoZGV0YWlsWydzb3VyY2UtcmV2aXNpb25zJ10gPz8gZGV0YWlsLnNvdXJjZVJldmlzaW9ucykgYXNcbiAgICB8IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZmlyc3RSZXYgPSBBcnJheS5pc0FycmF5KHJldnMpID8gcmV2c1swXSA6IHVuZGVmaW5lZDtcbiAgLy8gT24gc291cmNlIGFjdGlvbnMgdGhlIHJldmlzaW9uIGlkIGNhbiBhbHNvIHJpZGUgb24gYGV4ZWN1dGlvbi1yZXN1bHRgLlxuICBjb25zdCBleGVjUmVzdWx0ID0gZGV0YWlsWydleGVjdXRpb24tcmVzdWx0J10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY29tbWl0U2hhID0gZmlyc3RBdHRyKFxuICAgIGRldGFpbC5jb21taXRJZCxcbiAgICBkZXRhaWwucmV2aXNpb25JZCxcbiAgICBmaXJzdFJldj8ucmV2aXNpb25JZCxcbiAgICBleGVjUmVzdWx0Py5yZXZpc2lvbklkLFxuICApO1xuICBjb25zdCBjb21taXRSZWYgPSBmaXJzdEF0dHIoXG4gICAgZGV0YWlsLmNvbW1pdFJlZixcbiAgICBkZXRhaWwuYnJhbmNoLFxuICAgIGRldGFpbC5zb3VyY2VCcmFuY2gsXG4gICAgZmlyc3RSZXY/LmJyYW5jaE5hbWUsXG4gICAgZmlyc3RSZXY/LmJyYW5jaCxcbiAgKTtcblxuICByZXR1cm4geyAuLi4oY29tbWl0U2hhICYmIHsgY29tbWl0U2hhIH0pLCAuLi4oY29tbWl0UmVmICYmIHsgY29tbWl0UmVmIH0pIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5RXZlbnQoZGV0YWlsVHlwZTogc3RyaW5nKTogeyBldmVudFR5cGU6IHN0cmluZzsgZXZlbnRTb3VyY2U6IHN0cmluZyB9IHtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ1BpcGVsaW5lIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdQSVBFTElORScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnU3RhZ2UgRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ1NUQUdFJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdBY3Rpb24gRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ0FDVElPTicsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICAvLyBDb2RlQnVpbGQgXCJCdWlsZCBTdGF0ZVwiIGV2ZW50cyBpZGVudGlmeSBhIGJ1aWxkICpwcm9qZWN0Kiwgbm90IGEgcGlwZWxpbmUsIHNvXG4gIC8vIHBhcnNlUmVjb3JkIGRyb3BzIHRoZW0gb24gdGhlIGBldmVudFNvdXJjZSAhPT0gJ2NvZGVwaXBlbGluZSdgIGNoZWNrIGJlbG93IOKAlFxuICAvLyB0aGUgJ0JVSUxEJyBldmVudFR5cGUgaXMgbmV2ZXIgcGVyc2lzdGVkIGhlcmUgKHBsdWdpbiBCVUlMRCBldmVudHMgYXJlXG4gIC8vIHJlY29yZGVkIGRpcmVjdGx5IGJ5IHRoZSBwbHVnaW4gc2VydmljZSkuIFRoZSAnY29kZWJ1aWxkJyBzb3VyY2UgaXMgd2hhdFxuICAvLyByb3V0ZXMgdGhlIGRyb3A7IGtlZXAgdGhpcyBicmFuY2ggb25seSBmb3IgdGhhdC5cbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ0J1aWxkIFN0YXRlJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ0JVSUxEJywgZXZlbnRTb3VyY2U6ICdjb2RlYnVpbGQnIH07XG4gIHJldHVybiB7IGV2ZW50VHlwZTogJ1BJUEVMSU5FJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG59XG5cbi8qKiBQYXJzZSArIHJlc29sdmUgb25lIHJlY29yZCB0byBhIHJlcG9ydGFibGUgZXZlbnQsIG9yIG51bGwgdG8gc2tpcCBpdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlUmVjb3JkKHJlY29yZDogU1FTUmVjb3JkKTogUHJvbWlzZTxQYXJzZWRFdmVudCB8IG51bGw+IHtcbiAgbGV0IGV2ZW50OiB7XG4gICAgJ2RldGFpbC10eXBlJzogc3RyaW5nO1xuICAgICdzb3VyY2UnOiBzdHJpbmc7XG4gICAgJ2RldGFpbCc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICd0aW1lJzogc3RyaW5nO1xuICAgICdyZWdpb24nOiBzdHJpbmc7XG4gICAgJ2FjY291bnQnOiBzdHJpbmc7XG4gIH07XG4gIC8vIEEgbWFsZm9ybWVkIGJvZHkgaXMgYSBkZWFkIG1lc3NhZ2UgKHJldHJ5aW5nIHdvbid0IGhlbHApIOKAlCBsb2cgKyBza2lwIGl0IHNvXG4gIC8vIGl0IGNhbid0IGZhaWwgdGhlIHdob2xlIGJhdGNoLiBSZXNvbHV0aW9uIGVycm9ycyBiZWxvdyAoZS5nLiBBY2Nlc3NEZW5pZWQpXG4gIC8vIGFyZSBOT1QgY2F1Z2h0IGhlcmU6IHRob3NlIGFyZSB0cmFuc2llbnQvaW5mcmEgYW5kIG11c3QgcHJvcGFnYXRlIHRvIHJldHJ5LlxuICB0cnkge1xuICAgIGV2ZW50ID0gSlNPTi5wYXJzZShyZWNvcmQuYm9keSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdTa2lwcGluZyBTUVMgcmVjb3JkIHdpdGggdW5wYXJzZWFibGUgYm9keScsIHsgbWVzc2FnZUlkOiByZWNvcmQubWVzc2FnZUlkLCBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IGV2ZW50VHlwZSwgZXZlbnRTb3VyY2UgfSA9IGNsYXNzaWZ5RXZlbnQoZXZlbnRbJ2RldGFpbC10eXBlJ10pO1xuICBjb25zdCBkZXRhaWwgPSB7IC4uLmV2ZW50LmRldGFpbCB9O1xuICAvLyBUaGUgcmF3IGFjY291bnQgbmV2ZXIgbmVlZHMgdG8gbGVhdmUgQVdTIG5vdyDigJQgZHJvcCBpdCBmcm9tIHRoZSBwYXlsb2FkLlxuICBkZWxldGUgZGV0YWlsLmFjY291bnQ7XG5cbiAgLy8gQ29kZUJ1aWxkIFwiQnVpbGQgU3RhdGVcIiBldmVudHMgaWRlbnRpZnkgYSBidWlsZCAqcHJvamVjdCosIG5vdCBhIHBpcGVsaW5lLFxuICAvLyBhbmQgYSBwcm9qZWN0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIHBpcGVsaW5lcyDigJQgdGhlcmUncyBubyBjbGVhbiAxOjEgbWFwcGluZ1xuICAvLyB0byBhIFBJUEVMSU5FX0VWRU5UX0lELCBzbyBza2lwIHRoZW0gKHRoZXkgd2VyZSBlZmZlY3RpdmVseSBkcm9wcGVkIGJlZm9yZVxuICAvLyB0b28sIHNpbmNlIGRldGFpbC5waXBlbGluZSB3YXMgdW5kZWZpbmVkIGFuZCBuZXZlciBtYXRjaGVkIHRoZSByZWdpc3RyeSkuXG4gIGlmIChldmVudFNvdXJjZSAhPT0gJ2NvZGVwaXBlbGluZScpIHtcbiAgICBsb2cud2FybignU2tpcHBpbmcgbm9uLUNvZGVQaXBlbGluZSBldmVudCAobm8gcGlwZWxpbmUgdGFnIHRvIHJlc29sdmUpJywgeyBkZXRhaWxUeXBlOiBldmVudFsnZGV0YWlsLXR5cGUnXSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBpcGVsaW5lTmFtZSA9IGRldGFpbC5waXBlbGluZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmICghcGlwZWxpbmVOYW1lKSB7XG4gICAgbG9nLndhcm4oJ0NvZGVQaXBlbGluZSBldmVudCBtaXNzaW5nIHBpcGVsaW5lIG5hbWUg4oCUIHNraXBwaW5nJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSBwaXBlbGluZSdzIFBJUEVMSU5FX0VWRU5UX0lEIHRhZyAoPSBwbGF0Zm9ybSBwaXBlbGluZUlkKS4gVGhlXG4gIC8vIEFSTiBpcyBvbmx5IGEgdHJhbnNpZW50IGhhbmRsZSBmb3IgdGhlIHRhZyBsb29rdXA7IGl0IGlzIG5ldmVyIHN0b3JlZC5cbiAgY29uc3QgYXJuID0gYGFybjphd3M6Y29kZXBpcGVsaW5lOiR7ZXZlbnQucmVnaW9ufToke2V2ZW50LmFjY291bnR9OiR7cGlwZWxpbmVOYW1lfWA7XG4gIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQgfSA9IGF3YWl0IHJlc29sdmVQaXBlbGluZShhcm4sIGV2ZW50LnJlZ2lvbik7XG4gIGlmICghcGlwZWxpbmVJZCkgcmV0dXJuIG51bGw7IC8vIHVudGFnZ2VkIC8gdW5yZWdpc3RlcmVkIOKGkiBza2lwXG5cbiAgY29uc3Qgc3RhcnRlZEF0ID0gKGRldGFpbFsnc3RhcnQtdGltZSddIGFzIHN0cmluZykgfHwgZXZlbnQudGltZTtcbiAgY29uc3Qgc3RhdGUgPSBkZXRhaWwuc3RhdGUgYXMgc3RyaW5nO1xuXG4gIGxldCBkdXJhdGlvbk1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBjb21wbGV0ZWRBdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChbJ1NVQ0NFRURFRCcsICdGQUlMRUQnLCAnQ0FOQ0VMRUQnLCAnU1RPUFBFRCddLmluY2x1ZGVzKHN0YXRlKSkge1xuICAgIGNvbXBsZXRlZEF0ID0gZXZlbnQudGltZTtcbiAgICBpZiAoc3RhcnRlZEF0ICYmIGNvbXBsZXRlZEF0KSB7XG4gICAgICBjb25zdCBtcyA9IG5ldyBEYXRlKGNvbXBsZXRlZEF0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShzdGFydGVkQXQpLmdldFRpbWUoKTtcbiAgICAgIGlmIChtcyA+PSAwKSBkdXJhdGlvbk1zID0gbXM7XG4gICAgfVxuICB9XG5cbiAgLy8gUHJvbW90ZSB0aGUgZmFpbHVyZSByZWFzb24gdG8gYSB0eXBlZCBmaWVsZC4gT24gQWN0aW9uIGV2ZW50cyBBV1MgcHV0cyB0aGVcbiAgLy8gaHVtYW4tcmVhZGFibGUgc3VtbWFyeSAoYW5kIGEgbG9nIFVSTCArIGVycm9yLWNvZGUsIHdoaWNoIHN0YXkgaW4gYGRldGFpbGApXG4gIC8vIHVuZGVyIGBleGVjdXRpb24tcmVzdWx0YC5cbiAgY29uc3QgcmVzdWx0ID0gZGV0YWlsWydleGVjdXRpb24tcmVzdWx0J10gYXMgeyAnZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnknPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdW1tYXJ5ID0gcmVzdWx0Py5bJ2V4dGVybmFsLWV4ZWN1dGlvbi1zdW1tYXJ5J107XG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IHR5cGVvZiBzdW1tYXJ5ID09PSAnc3RyaW5nJyAmJiBzdW1tYXJ5Lmxlbmd0aCA+IDBcbiAgICA/IHN1bW1hcnkuc2xpY2UoMCwgTUFYX0VSUk9SX01FU1NBR0UpXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgLy8gRE9SQSBkZXBsb3kgYXR0cmlidXRpb24g4oCUIGFsbCBvcHRpb25hbC9iYWNrLWNvbXBhdDogb21pdHRlZCAodW5kZWZpbmVkKSB3aGVuXG4gIC8vIHRoZSBldmVudC9waXBlbGluZSBkb2Vzbid0IGNhcnJ5IHRoZW0sIHNvIGxlZ2FjeSBwaXBlbGluZXMgcmVwb3J0IGFzIGJlZm9yZS5cbiAgY29uc3QgeyBjb21taXRTaGEsIGNvbW1pdFJlZiB9ID0gZXh0cmFjdENvbW1pdChkZXRhaWwpO1xuXG4gIHJldHVybiB7XG4gICAgcGlwZWxpbmVJZCxcbiAgICBldmVudFNvdXJjZSxcbiAgICBldmVudFR5cGUsXG4gICAgc3RhdHVzOiBzdGF0ZSxcbiAgICBleGVjdXRpb25JZDogZGV0YWlsWydleGVjdXRpb24taWQnXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3RhZ2VOYW1lOiBkZXRhaWwuc3RhZ2UgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGFjdGlvbk5hbWU6IGRldGFpbC5hY3Rpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGVycm9yTWVzc2FnZSxcbiAgICBzdGFydGVkQXQsXG4gICAgY29tcGxldGVkQXQsXG4gICAgZHVyYXRpb25NcyxcbiAgICAuLi4oY29tbWl0U2hhICYmIHsgY29tbWl0U2hhIH0pLFxuICAgIC4uLihjb21taXRSZWYgJiYgeyBjb21taXRSZWYgfSksXG4gICAgLi4uKGVudmlyb25tZW50ICYmIHsgZW52aXJvbm1lbnQgfSksXG4gICAgZGV0YWlsLFxuICB9O1xufVxuXG4vLyDilIDilIDilIAgSGFuZGxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IFNRU0V2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGJhc2VVcmwgPSBwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTDtcbiAgaWYgKCFiYXNlVXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1BMQVRGT1JNX0JBU0VfVVJMIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG5cbiAgLy8gUGFyc2UgKyByZXNvbHZlIGFsbCByZWNvcmRzICh0YWcgbG9va3VwcyBydW4gY29uY3VycmVudGx5KTsgZHJvcCBpbnRlbnRpb25hbFxuICAvLyBza2lwcyAobnVsbCkuIEEgbWFsZm9ybWVkIHJlY29yZCBCT0RZIGlzIGhhbmRsZWQgaW5zaWRlIHBhcnNlUmVjb3JkIChsb2dnZWQgK1xuICAvLyBza2lwcGVkKSBzbyBvbmUgYmFkIG1lc3NhZ2UgY2FuJ3QgZmFpbCB0aGUgd2hvbGUgYmF0Y2gg4oCUIHdoaWxlIGdlbnVpbmUgaW5mcmFcbiAgLy8gZXJyb3JzIChlLmcuIEFjY2Vzc0RlbmllZCBvbiB0aGUgdGFnIGxvb2t1cCkgc3RpbGwgcHJvcGFnYXRlIHNvIGEgbWlzc2luZyBJQU1cbiAgLy8gZ3JhbnQgc3VyZmFjZXMgYW5kIFNRUyByZXRyaWVzIHRoZSBiYXRjaC5cbiAgY29uc3QgZXZlbnRzID0gKGF3YWl0IFByb21pc2UuYWxsKGV2ZW50LlJlY29yZHMubWFwKHBhcnNlUmVjb3JkKSkpXG4gICAgLmZpbHRlcigoZSk6IGUgaXMgUGFyc2VkRXZlbnQgPT4gZSAhPT0gbnVsbCk7XG4gIGlmIChldmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nLmluZm8oJ05vIHJlc29sdmFibGUgQ29kZVBpcGVsaW5lIGV2ZW50cyBpbiBiYXRjaCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFBPU1QgYmF0Y2ggdG8gcmVwb3J0aW5nIHNlcnZpY2UuIE9uIGEgNDAxLzQwMyB0aGUgY2FjaGVkIEpXVCBoYXMgbGlrZWx5XG4gIC8vIGV4cGlyZWQg4oCUIGRyb3AgaXQsIHJlLWZldGNoLCBhbmQgcmV0cnkgT05DRSBzbyBhbiBleHBpcmVkIHRva2VuIGRvZXNuJ3RcbiAgLy8gcGVybWFuZW50bHkgYnJpY2sgYSB3YXJtIGNvbnRhaW5lci5cbiAgY29uc3QgcG9zdCA9ICh0b2tlbjogc3RyaW5nKSA9PiBmZXRjaChgJHtiYXNlVXJsfS9hcGkvcmVwb3J0cy9ldmVudHNgLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBldmVudHMgfSksXG4gIH0pO1xuICBsZXQgcmVzID0gYXdhaXQgcG9zdChhd2FpdCBnZXRBdXRoVG9rZW4oKSk7XG4gIGlmIChyZXMuc3RhdHVzID09PSA0MDEgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgbG9nLndhcm4oJ1JlcG9ydGluZyBBUEkgYXV0aCBmYWlsZWQ7IHJlZnJlc2hpbmcgdG9rZW4gYW5kIHJldHJ5aW5nIG9uY2UnLCB7IHN0YXR1czogcmVzLnN0YXR1cyB9KTtcbiAgICBjYWNoZWRUb2tlbiA9IG51bGw7XG4gICAgcmVzID0gYXdhaXQgcG9zdChhd2FpdCBnZXRBdXRoVG9rZW4oKSk7XG4gIH1cblxuICBpZiAoIXJlcy5vaykge1xuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpLmNhdGNoKCgpID0+ICcnKTtcbiAgICBsb2cuZXJyb3IoYFJlcG9ydGluZyBBUEkgcmV0dXJuZWQgJHtyZXMuc3RhdHVzfWAsIHsgYm9keSB9KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcG9ydGluZyBBUEkgZmFpbGVkOiAke3Jlcy5zdGF0dXN9YCk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXMuanNvbigpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBsb2cuaW5mbyhgSW5nZXN0ZWQgJHtldmVudHMubGVuZ3RofSBldmVudHNgLCB7IGluc2VydGVkOiByZXN1bHQuZGF0YSB9KTtcbn07XG4iXX0=
package/package.json CHANGED
@@ -76,7 +76,7 @@
76
76
  "access": "public",
77
77
  "registry": "https://registry.npmjs.org/"
78
78
  },
79
- "version": "3.4.77",
79
+ "version": "3.4.78",
80
80
  "bugs": {
81
81
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
82
82
  },