@pipeline-builder/pipeline-events 3.4.68 → 3.4.70
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/lib/index.js +54 -20
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -16,12 +16,12 @@ async function loadCodePipeline() {
|
|
|
16
16
|
*
|
|
17
17
|
* Authentication:
|
|
18
18
|
* - PLATFORM_TOKEN env var (preferred — no Secrets Manager call)
|
|
19
|
-
* - PLATFORM_SECRET_NAME env var → reads
|
|
19
|
+
* - PLATFORM_SECRET_NAME env var → reads the JWT (password) from Secrets Manager
|
|
20
20
|
*
|
|
21
21
|
* Environment variables:
|
|
22
22
|
* - PLATFORM_BASE_URL — Base URL of the platform
|
|
23
23
|
* - PLATFORM_TOKEN — JWT token (set directly, or)
|
|
24
|
-
* - PLATFORM_SECRET_NAME — Secrets Manager secret containing {
|
|
24
|
+
* - PLATFORM_SECRET_NAME — Secrets Manager secret containing { password: <JWT> }
|
|
25
25
|
*/
|
|
26
26
|
const log = {
|
|
27
27
|
info: (msg, data) => console.log(JSON.stringify({ level: 'INFO', message: msg, data, ts: new Date().toISOString() })),
|
|
@@ -39,7 +39,11 @@ const log = {
|
|
|
39
39
|
// "not yet registered" (skip).
|
|
40
40
|
const PIPELINE_EVENT_ID_TAG = 'PIPELINE_EVENT_ID';
|
|
41
41
|
const clientsByRegion = new Map();
|
|
42
|
-
|
|
42
|
+
// tag=null is a negative cache (resolved-but-untagged); `ts` lets negatives
|
|
43
|
+
// expire so a pipeline tagged AFTER its first event becomes resolvable without
|
|
44
|
+
// recycling the warm container. Positive results stay cached for the lifetime.
|
|
45
|
+
const eventIdByArn = new Map();
|
|
46
|
+
const NEG_CACHE_TTL_MS = 5 * 60 * 1000;
|
|
43
47
|
async function pipelineClient(region) {
|
|
44
48
|
let client = clientsByRegion.get(region);
|
|
45
49
|
if (!client) {
|
|
@@ -56,8 +60,12 @@ async function pipelineClient(region) {
|
|
|
56
60
|
* dropping every event.
|
|
57
61
|
*/
|
|
58
62
|
async function resolvePipelineEventId(arn, region) {
|
|
59
|
-
|
|
60
|
-
|
|
63
|
+
const cached = eventIdByArn.get(arn);
|
|
64
|
+
// Serve a positive hit for the container lifetime; serve a negative hit only
|
|
65
|
+
// 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;
|
|
68
|
+
}
|
|
61
69
|
try {
|
|
62
70
|
const client = await pipelineClient(region);
|
|
63
71
|
const { ListTagsForResourceCommand } = await loadCodePipeline();
|
|
@@ -65,7 +73,7 @@ async function resolvePipelineEventId(arn, region) {
|
|
|
65
73
|
const tag = out.tags?.find(t => t.key === PIPELINE_EVENT_ID_TAG)?.value ?? null;
|
|
66
74
|
if (!tag)
|
|
67
75
|
log.warn('Pipeline missing PIPELINE_EVENT_ID tag — skipping (register it?)', { arn });
|
|
68
|
-
eventIdByArn.set(arn, tag);
|
|
76
|
+
eventIdByArn.set(arn, { tag, ts: Date.now() });
|
|
69
77
|
return tag;
|
|
70
78
|
}
|
|
71
79
|
catch (err) {
|
|
@@ -101,10 +109,14 @@ async function getAuthToken() {
|
|
|
101
109
|
if (!response.SecretString)
|
|
102
110
|
throw new Error(`Secret "${secretName}" is empty`);
|
|
103
111
|
const secret = JSON.parse(response.SecretString);
|
|
104
|
-
|
|
105
|
-
|
|
112
|
+
// store-token writes the JWT in `password` (the canonical field — also used by
|
|
113
|
+
// CodeBuild secretsManagerCredentials, the plugin-lookup Lambda, and token-renew).
|
|
114
|
+
// Accept legacy `accessToken` as a fallback.
|
|
115
|
+
const token = secret.password || secret.accessToken;
|
|
116
|
+
if (!token) {
|
|
117
|
+
throw new Error('Secret missing JWT (password) — run "pipeline-manager store-token" to generate');
|
|
106
118
|
}
|
|
107
|
-
cachedToken =
|
|
119
|
+
cachedToken = token;
|
|
108
120
|
log.info('Using stored JWT token from Secrets Manager');
|
|
109
121
|
return cachedToken;
|
|
110
122
|
}
|
|
@@ -117,13 +129,28 @@ function classifyEvent(detailType) {
|
|
|
117
129
|
return { eventType: 'STAGE', eventSource: 'codepipeline' };
|
|
118
130
|
if (detailType.includes('Action Execution'))
|
|
119
131
|
return { eventType: 'ACTION', eventSource: 'codepipeline' };
|
|
132
|
+
// CodeBuild "Build State" events identify a build *project*, not a pipeline, so
|
|
133
|
+
// parseRecord drops them on the `eventSource !== 'codepipeline'` check below —
|
|
134
|
+
// the 'BUILD' eventType is never persisted here (plugin BUILD events are
|
|
135
|
+
// recorded directly by the plugin service). The 'codebuild' source is what
|
|
136
|
+
// routes the drop; keep this branch only for that.
|
|
120
137
|
if (detailType.includes('Build State'))
|
|
121
138
|
return { eventType: 'BUILD', eventSource: 'codebuild' };
|
|
122
139
|
return { eventType: 'PIPELINE', eventSource: 'codepipeline' };
|
|
123
140
|
}
|
|
124
141
|
/** Parse + resolve one record to a reportable event, or null to skip it. */
|
|
125
142
|
async function parseRecord(record) {
|
|
126
|
-
|
|
143
|
+
let event;
|
|
144
|
+
// A malformed body is a dead message (retrying won't help) — log + skip it so
|
|
145
|
+
// it can't fail the whole batch. Resolution errors below (e.g. AccessDenied)
|
|
146
|
+
// are NOT caught here: those are transient/infra and must propagate to retry.
|
|
147
|
+
try {
|
|
148
|
+
event = JSON.parse(record.body);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
log.warn('Skipping SQS record with unparseable body', { messageId: record.messageId, error: String(err) });
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
127
154
|
const { eventType, eventSource } = classifyEvent(event['detail-type']);
|
|
128
155
|
const detail = { ...event.detail };
|
|
129
156
|
// The raw account never needs to leave AWS now — drop it from the payload.
|
|
@@ -187,24 +214,31 @@ export const handler = async (event) => {
|
|
|
187
214
|
const baseUrl = process.env.PLATFORM_BASE_URL;
|
|
188
215
|
if (!baseUrl)
|
|
189
216
|
throw new Error('PLATFORM_BASE_URL environment variable is required');
|
|
190
|
-
// Parse + resolve all records (tag lookups run concurrently); drop
|
|
217
|
+
// Parse + resolve all records (tag lookups run concurrently); drop intentional
|
|
218
|
+
// skips (null). A malformed record BODY is handled inside parseRecord (logged +
|
|
219
|
+
// skipped) so one bad message can't fail the whole batch — while genuine infra
|
|
220
|
+
// errors (e.g. AccessDenied on the tag lookup) still propagate so a missing IAM
|
|
221
|
+
// grant surfaces and SQS retries the batch.
|
|
191
222
|
const events = (await Promise.all(event.Records.map(parseRecord)))
|
|
192
223
|
.filter((e) => e !== null);
|
|
193
224
|
if (events.length === 0) {
|
|
194
225
|
log.info('No resolvable CodePipeline events in batch');
|
|
195
226
|
return;
|
|
196
227
|
}
|
|
197
|
-
//
|
|
198
|
-
|
|
199
|
-
//
|
|
200
|
-
const
|
|
228
|
+
// POST batch to reporting service. On a 401/403 the cached JWT has likely
|
|
229
|
+
// expired — drop it, re-fetch, and retry ONCE so an expired token doesn't
|
|
230
|
+
// permanently brick a warm container.
|
|
231
|
+
const post = (token) => fetch(`${baseUrl}/api/reports/events`, {
|
|
201
232
|
method: 'POST',
|
|
202
|
-
headers: {
|
|
203
|
-
'Content-Type': 'application/json',
|
|
204
|
-
'Authorization': `Bearer ${token}`,
|
|
205
|
-
},
|
|
233
|
+
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` },
|
|
206
234
|
body: JSON.stringify({ events }),
|
|
207
235
|
});
|
|
236
|
+
let res = await post(await getAuthToken());
|
|
237
|
+
if (res.status === 401 || res.status === 403) {
|
|
238
|
+
log.warn('Reporting API auth failed; refreshing token and retrying once', { status: res.status });
|
|
239
|
+
cachedToken = null;
|
|
240
|
+
res = await post(await getAuthToken());
|
|
241
|
+
}
|
|
208
242
|
if (!res.ok) {
|
|
209
243
|
const body = await res.text().catch(() => '');
|
|
210
244
|
log.error(`Reporting API returned ${res.status}`, { body });
|
|
@@ -213,4 +247,4 @@ export const handler = async (event) => {
|
|
|
213
247
|
const result = await res.json();
|
|
214
248
|
log.info(`Ingested ${events.length} events`, { inserted: result.data });
|
|
215
249
|
};
|
|
216
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQWU5RixJQUFJLGVBQStDLENBQUM7QUFDcEQsS0FBSyxVQUFVLGdCQUFnQjtJQUM3QixJQUFJLENBQUMsZUFBZTtRQUFFLGVBQWUsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQWtDLENBQUM7SUFDeEgsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE1BQU0sR0FBRyxHQUFHO0lBQ1YsSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksS0FBSyxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7Q0FDNUksQ0FBQztBQUVGLDREQUE0RDtBQUM1RCxpRkFBaUY7QUFDakYsaUZBQWlGO0FBQ2pGLHlFQUF5RTtBQUN6RSx3REFBd0Q7QUFDeEQsRUFBRTtBQUNGLGtGQUFrRjtBQUNsRiw2RUFBNkU7QUFDN0UsK0JBQStCO0FBRS9CLE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLENBQUM7QUFDbEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7QUFDbEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUMsQ0FBQyxnREFBZ0Q7QUFFdkcsS0FBSyxVQUFVLGNBQWMsQ0FBQyxNQUFjO0lBQzFDLElBQUksTUFBTSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxFQUFFLGtCQUFrQixFQUFFLEdBQUcsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hELE1BQU0sR0FBRyxJQUFJLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM1QyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsS0FBSyxVQUFVLHNCQUFzQixDQUFDLEdBQVcsRUFBRSxNQUFjO0lBQy9ELElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFFLENBQUM7SUFDekQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsTUFBTSxFQUFFLDBCQUEwQixFQUFFLEdBQUcsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLDBCQUEwQixDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUsscUJBQXFCLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxHQUFHO1lBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxrRUFBa0UsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDaEcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0IsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxHQUFJLEdBQXlCLEVBQUUsSUFBSSxDQUFDO1FBQzlDLElBQUksSUFBSSxLQUFLLHVCQUF1QixFQUFFLENBQUM7WUFDckMsNkVBQTZFO1lBQzdFLEdBQUcsQ0FBQyxLQUFLLENBQUMscUZBQXFGLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkgsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBQ0QsR0FBRyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELDJEQUEyRDtBQUUzRCxJQUFJLFdBQVcsR0FBa0IsSUFBSSxDQUFDO0FBRXRDLEtBQUssVUFBVSxZQUFZO0lBQ3pCLElBQUksV0FBVztRQUFFLE9BQU8sV0FBVyxDQUFDO0lBRXBDLDJEQUEyRDtJQUMzRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDL0IsV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1FBQ3pDLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUNsRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsMkRBQTJEO0lBQzNELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7SUFDcEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUVBQXlFLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLHFCQUFxQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV4RixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVk7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsVUFBVSxZQUFZLENBQUMsQ0FBQztJQUUvRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQTJCLENBQUM7SUFDM0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVELFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQ2pDLEdBQUcsQ0FBQyxJQUFJLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUN4RCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBc0JELGtGQUFrRjtBQUNsRixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUUvQixTQUFTLGFBQWEsQ0FBQyxVQUFrQjtJQUN2QyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7UUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUM7SUFDN0csSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO1FBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxDQUFDO0lBQ3ZHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsQ0FBQztJQUN6RyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ2hHLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLEtBQUssVUFBVSxXQUFXLENBQUMsTUFBaUI7SUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQU9uQyxDQUFDO0lBRUYsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDdkUsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNuQywyRUFBMkU7SUFDM0UsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBRXRCLDZFQUE2RTtJQUM3RSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSxJQUFJLFdBQVcsS0FBSyxjQUFjLEVBQUUsQ0FBQztRQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0csT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFFBQThCLENBQUM7SUFDM0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLEdBQUcsQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQztRQUNoRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUseUVBQXlFO0lBQ3pFLE1BQU0sR0FBRyxHQUFHLHdCQUF3QixLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksWUFBWSxFQUFFLENBQUM7SUFDcEYsTUFBTSxVQUFVLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25FLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxpQ0FBaUM7SUFFL0QsTUFBTSxTQUFTLEdBQUksTUFBTSxDQUFDLFlBQVksQ0FBWSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDakUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQWUsQ0FBQztJQUVyQyxJQUFJLFVBQThCLENBQUM7SUFDbkMsSUFBSSxXQUErQixDQUFDO0lBRXBDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLFNBQVMsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUM3QixNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzRSxJQUFJLEVBQUUsSUFBSSxDQUFDO2dCQUFFLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQzlFLDRCQUE0QjtJQUM1QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQTJELENBQUM7SUFDcEcsTUFBTSxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUN2RCxNQUFNLFlBQVksR0FBRyxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQztRQUNyQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRWQsT0FBTztRQUNMLFVBQVU7UUFDVixXQUFXO1FBQ1gsU0FBUztRQUNULE1BQU0sRUFBRSxLQUFLO1FBQ2IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQXVCO1FBQ3pELFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBMkI7UUFDN0MsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUE0QjtRQUMvQyxZQUFZO1FBQ1osU0FBUztRQUNULFdBQVc7UUFDWCxVQUFVO1FBQ1YsTUFBTTtLQUNQLENBQUM7QUFDSixDQUFDO0FBRUQsMkRBQTJEO0FBRTNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBZSxFQUFpQixFQUFFO0lBQzlELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7SUFDOUMsSUFBSSxDQUFDLE9BQU87UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7SUFFcEYsMEVBQTBFO0lBQzFFLE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDL0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFvQixFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQy9DLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDdkQsT0FBTztJQUNULENBQUM7SUFFRCxlQUFlO0lBQ2YsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLEVBQUUsQ0FBQztJQUVuQyxrQ0FBa0M7SUFDbEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxPQUFPLHFCQUFxQixFQUFFO1FBQ3ZELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFO1lBQ1AsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQyxlQUFlLEVBQUUsVUFBVSxLQUFLLEVBQUU7U0FDbkM7UUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0tBQ2pDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUMsR0FBRyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUE2QixDQUFDO0lBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxNQUFNLENBQUMsTUFBTSxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDMUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEdldFNlY3JldFZhbHVlQ29tbWFuZCwgU2VjcmV0c01hbmFnZXJDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgU1FTRXZlbnQsIFNRU1JlY29yZCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG4vLyBBV1MgTGFtYmRhJ3MgTm9kZSBydW50aW1lIGJ1bmRsZXMgQGF3cy1zZGsgdjMsIHNvIHRoZSBDb2RlUGlwZWxpbmUgY2xpZW50IGlzXG4vLyBsb2FkZWQgbGF6aWx5IHZpYSBkeW5hbWljIGltcG9ydCgpIOKAlCBhIHN0YXRpYyB3b3Jrc3BhY2UgZGVwZW5kZW5jeSBvblxuLy8gQGF3cy1zZGsvY2xpZW50LWNvZGVwaXBlbGluZSB3b3VsZCBwZXJ0dXJiIHRoZSBzaGFyZWQgQGF3cy1zZGsgdmVyc2lvbiB0cmVlXG4vLyBhbmQgYnJlYWsgb3RoZXIgcGFja2FnZXMnIHR5cGluZ3MuIFRoZSBkeW5hbWljIGltcG9ydCBrZWVwcyBpdCBvdXQgb2YgdGhlXG4vLyBzdGF0aWMgZ3JhcGggd2hpbGUgc3RheWluZyBFU00tY29ycmVjdCAobm8gYHJlcXVpcmVgIGluIGEgdHlwZTptb2R1bGUgcGFja2FnZSlcbi8vIGFuZCBtb2NrYWJsZS4gTWluaW1hbCBsb2NhbCB0eXBlcyBrZWVwIHRoZSBjYWxsIHNpdGVzIHR5cGUtY2hlY2tlZC5cbmludGVyZmFjZSBMaXN0VGFnc091dHB1dCB7IHRhZ3M/OiBBcnJheTx7IGtleT86IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfT4gfVxuaW50ZXJmYWNlIENvZGVQaXBlbGluZUNsaWVudExpa2UgeyBzZW5kKGNvbW1hbmQ6IHVua25vd24pOiBQcm9taXNlPExpc3RUYWdzT3V0cHV0PiB9XG5pbnRlcmZhY2UgQ29kZVBpcGVsaW5lTW9kdWxlIHtcbiAgQ29kZVBpcGVsaW5lQ2xpZW50OiBuZXcgKGNvbmZpZzogeyByZWdpb246IHN0cmluZyB9KSA9PiBDb2RlUGlwZWxpbmVDbGllbnRMaWtlO1xuICBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZDogbmV3IChpbnB1dDogeyByZXNvdXJjZUFybjogc3RyaW5nIH0pID0+IHVua25vd247XG59XG5sZXQgY29kZXBpcGVsaW5lTW9kOiBDb2RlUGlwZWxpbmVNb2R1bGUgfCB1bmRlZmluZWQ7XG5hc3luYyBmdW5jdGlvbiBsb2FkQ29kZVBpcGVsaW5lKCk6IFByb21pc2U8Q29kZVBpcGVsaW5lTW9kdWxlPiB7XG4gIGlmICghY29kZXBpcGVsaW5lTW9kKSBjb2RlcGlwZWxpbmVNb2QgPSAoYXdhaXQgaW1wb3J0KCdAYXdzLXNkay9jbGllbnQtY29kZXBpcGVsaW5lJykpIGFzIHVua25vd24gYXMgQ29kZVBpcGVsaW5lTW9kdWxlO1xuICByZXR1cm4gY29kZXBpcGVsaW5lTW9kO1xufVxuXG4vKipcbiAqIFBpcGVsaW5lIGV2ZW50IGluZ2VzdGlvbiBMYW1iZGEgaGFuZGxlci5cbiAqXG4gKiBSZWNlaXZlcyBDb2RlUGlwZWxpbmUvQ29kZUJ1aWxkIGV2ZW50cyBmcm9tIFNRUyAoc291cmNlZCBieSBFdmVudEJyaWRnZSksXG4gKiBwYXJzZXMgdGhlbSBpbnRvIGEgbm9ybWFsaXplZCBmb3JtYXQsIGFuZCBQT1NUcyB0aGVtIHRvIHRoZSByZXBvcnRpbmcgc2VydmljZVxuICogdmlhIFBMQVRGT1JNX0JBU0VfVVJMLlxuICpcbiAqIEF1dGhlbnRpY2F0aW9uOlxuICogLSBQTEFURk9STV9UT0tFTiBlbnYgdmFyIChwcmVmZXJyZWQg4oCUIG5vIFNlY3JldHMgTWFuYWdlciBjYWxsKVxuICogLSBQTEFURk9STV9TRUNSRVRfTkFNRSBlbnYgdmFyIOKGkiByZWFkcyBhY2Nlc3NUb2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlclxuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gUExBVEZPUk1fQkFTRV9VUkwg4oCUIEJhc2UgVVJMIG9mIHRoZSBwbGF0Zm9ybVxuICogLSBQTEFURk9STV9UT0tFTiDigJQgSldUIHRva2VuIChzZXQgZGlyZWN0bHksIG9yKVxuICogLSBQTEFURk9STV9TRUNSRVRfTkFNRSDigJQgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIHsgYWNjZXNzVG9rZW4gfVxuICovXG5cbmNvbnN0IGxvZyA9IHtcbiAgaW5mbzogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0lORk8nLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxuICB3YXJuOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnV0FSTicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIGVycm9yOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdFUlJPUicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG59O1xuXG4vLyDilIDilIAgUElQRUxJTkVfRVZFTlRfSUQgcmVzb2x1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBpcGVsaW5lcyBhcmUgdGFnZ2VkIGBQSVBFTElORV9FVkVOVF9JRD08cGlwZWxpbmVJZD5gIGF0IENESyBzeW50aC4gV2UgcmVzb2x2ZVxuLy8gdGhhdCB0YWcgZnJvbSB0aGUgbGl2ZSBDb2RlUGlwZWxpbmUgKHJlZ2lvbi1hd2FyZSkgYW5kIHJlcG9ydCBhZ2FpbnN0IHRoZSBpZCDigJRcbi8vIHRoZSBBUk4vYWNjb3VudCBuZXZlciBsZWF2ZSBBV1MsIHNvIHRoZXJlJ3Mgbm8gbWFza2luZy4gQ2FjaGVkIHBlciBBUk5cbi8vICh3YXJtLWNvbnRhaW5lcikgdG8gYXZvaWQgaGFtbWVyaW5nIHRoZSBMaXN0VGFncyBBUEkuXG4vL1xuLy8gUmVxdWlyZXMgdGhlIExhbWJkYSBleGVjdXRpb24gcm9sZSB0byBhbGxvdyBgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2VgLlxuLy8gQWNjZXNzRGVuaWVkIGlzIGEgY29uZmlnIGVycm9yIChhbGVydCBsb3VkbHkpOyBhIG1pc3NpbmcgdGFnIGlzIHRyZWF0ZWQgYXNcbi8vIFwibm90IHlldCByZWdpc3RlcmVkXCIgKHNraXApLlxuXG5jb25zdCBQSVBFTElORV9FVkVOVF9JRF9UQUcgPSAnUElQRUxJTkVfRVZFTlRfSUQnO1xuY29uc3QgY2xpZW50c0J5UmVnaW9uID0gbmV3IE1hcDxzdHJpbmcsIENvZGVQaXBlbGluZUNsaWVudExpa2U+KCk7XG5jb25zdCBldmVudElkQnlBcm4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTsgLy8gbnVsbCA9IHJlc29sdmVkLWJ1dC11bnRhZ2dlZCAobmVnYXRpdmUgY2FjaGUpXG5cbmFzeW5jIGZ1bmN0aW9uIHBpcGVsaW5lQ2xpZW50KHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxDb2RlUGlwZWxpbmVDbGllbnRMaWtlPiB7XG4gIGxldCBjbGllbnQgPSBjbGllbnRzQnlSZWdpb24uZ2V0KHJlZ2lvbik7XG4gIGlmICghY2xpZW50KSB7XG4gICAgY29uc3QgeyBDb2RlUGlwZWxpbmVDbGllbnQgfSA9IGF3YWl0IGxvYWRDb2RlUGlwZWxpbmUoKTtcbiAgICBjbGllbnQgPSBuZXcgQ29kZVBpcGVsaW5lQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIGNsaWVudHNCeVJlZ2lvbi5zZXQocmVnaW9uLCBjbGllbnQpO1xuICB9XG4gIHJldHVybiBjbGllbnQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIENvZGVQaXBlbGluZSdzIFBJUEVMSU5FX0VWRU5UX0lEIHRhZyDihpIgdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQuXG4gKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgcGlwZWxpbmUgaGFzIG5vIHN1Y2ggdGFnICh1bnJlZ2lzdGVyZWQpLiBUaHJvd3Mgb25cbiAqIEFjY2Vzc0RlbmllZCBzbyBhIG1pc3NpbmcgSUFNIGdyYW50IHN1cmZhY2VzIGxvdWRseSBpbnN0ZWFkIG9mIHNpbGVudGx5XG4gKiBkcm9wcGluZyBldmVyeSBldmVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBpcGVsaW5lRXZlbnRJZChhcm46IHN0cmluZywgcmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgaWYgKGV2ZW50SWRCeUFybi5oYXMoYXJuKSkgcmV0dXJuIGV2ZW50SWRCeUFybi5nZXQoYXJuKSE7XG4gIHRyeSB7XG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgcGlwZWxpbmVDbGllbnQocmVnaW9uKTtcbiAgICBjb25zdCB7IExpc3RUYWdzRm9yUmVzb3VyY2VDb21tYW5kIH0gPSBhd2FpdCBsb2FkQ29kZVBpcGVsaW5lKCk7XG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IExpc3RUYWdzRm9yUmVzb3VyY2VDb21tYW5kKHsgcmVzb3VyY2VBcm46IGFybiB9KSk7XG4gICAgY29uc3QgdGFnID0gb3V0LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gUElQRUxJTkVfRVZFTlRfSURfVEFHKT8udmFsdWUgPz8gbnVsbDtcbiAgICBpZiAoIXRhZykgbG9nLndhcm4oJ1BpcGVsaW5lIG1pc3NpbmcgUElQRUxJTkVfRVZFTlRfSUQgdGFnIOKAlCBza2lwcGluZyAocmVnaXN0ZXIgaXQ/KScsIHsgYXJuIH0pO1xuICAgIGV2ZW50SWRCeUFybi5zZXQoYXJuLCB0YWcpO1xuICAgIHJldHVybiB0YWc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IG5hbWUgPSAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZTtcbiAgICBpZiAobmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicpIHtcbiAgICAgIC8vIERvbid0IGNhY2hlIOKAlCB0aGlzIGlzIGEgZml4YWJsZSBtaXNjb25maWcsIG5vdCBhIHByb3BlcnR5IG9mIHRoZSBwaXBlbGluZS5cbiAgICAgIGxvZy5lcnJvcignQWNjZXNzRGVuaWVkIGNhbGxpbmcgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2Ug4oCUIGdyYW50IGl0IHRvIHRoZSBMYW1iZGEgcm9sZScsIHsgYXJuLCBlcnJvcjogbmFtZSB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBQSVBFTElORV9FVkVOVF9JRCB0YWcnLCB7IGFybiwgZXJyb3I6IG5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSAIEF1dGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmxldCBjYWNoZWRUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dGhUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY2FjaGVkVG9rZW4pIHJldHVybiBjYWNoZWRUb2tlbjtcblxuICAvLyBQYXRoIDE6IFBMQVRGT1JNX1RPS0VOIGVudiB2YXIgKG5vIFNlY3JldHMgTWFuYWdlciBjYWxsKVxuICBpZiAocHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pIHtcbiAgICBjYWNoZWRUb2tlbiA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOO1xuICAgIGxvZy5pbmZvKCdVc2luZyBQTEFURk9STV9UT0tFTiBmcm9tIGVudmlyb25tZW50Jyk7XG4gICAgcmV0dXJuIGNhY2hlZFRva2VuO1xuICB9XG5cbiAgLy8gUGF0aCAyOiBQTEFURk9STV9TRUNSRVRfTkFNRSDihpIgcmVhZCBmcm9tIFNlY3JldHMgTWFuYWdlclxuICBjb25zdCBzZWNyZXROYW1lID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUU7XG4gIGlmICghc2VjcmV0TmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fVE9LRU4gb3IgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBGZXRjaGluZyB0b2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlcjogJHtzZWNyZXROYW1lfWApO1xuICBjb25zdCBjbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KSk7XG5cbiAgaWYgKCFyZXNwb25zZS5TZWNyZXRTdHJpbmcpIHRocm93IG5ldyBFcnJvcihgU2VjcmV0IFwiJHtzZWNyZXROYW1lfVwiIGlzIGVtcHR5YCk7XG5cbiAgY29uc3Qgc2VjcmV0ID0gSlNPTi5wYXJzZShyZXNwb25zZS5TZWNyZXRTdHJpbmcpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGlmICghc2VjcmV0LmFjY2Vzc1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZWNyZXQgbWlzc2luZyBhY2Nlc3NUb2tlbiDigJQgcnVuIFwicGlwZWxpbmUtbWFuYWdlciBzdG9yZS10b2tlblwiIHRvIGdlbmVyYXRlJyk7XG4gIH1cblxuICBjYWNoZWRUb2tlbiA9IHNlY3JldC5hY2Nlc3NUb2tlbjtcbiAgbG9nLmluZm8oJ1VzaW5nIHN0b3JlZCBKV1QgdG9rZW4gZnJvbSBTZWNyZXRzIE1hbmFnZXInKTtcbiAgcmV0dXJuIGNhY2hlZFRva2VuO1xufVxuXG4vLyDilIDilIDilIAgRXZlbnQgUGFyc2luZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIFBhcnNlZEV2ZW50IHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiwgZnJvbSBhbiBBY3Rpb24gZXZlbnQnc1xuICAgKiAgYGV4ZWN1dGlvbi1yZXN1bHQuZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnlgLiBUaGUgbG9nIFVSTCArIGVycm9yLWNvZGVcbiAgICogIHN0YXkgaW4gYGRldGFpbGAgZm9yIGRyaWxsLWRvd24uICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgZGV0YWlsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENhcCBvbiB0aGUgc3RvcmVkIGZhaWx1cmUgc3VtbWFyeSDigJQgQ29kZUJ1aWxkL0RlcGxveSBzdW1tYXJpZXMgY2FuIGJlIGxvbmcuICovXG5jb25zdCBNQVhfRVJST1JfTUVTU0FHRSA9IDQwMDA7XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5RXZlbnQoZGV0YWlsVHlwZTogc3RyaW5nKTogeyBldmVudFR5cGU6IHN0cmluZzsgZXZlbnRTb3VyY2U6IHN0cmluZyB9IHtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ1BpcGVsaW5lIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdQSVBFTElORScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnU3RhZ2UgRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ1NUQUdFJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdBY3Rpb24gRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ0FDVElPTicsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnQnVpbGQgU3RhdGUnKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnQlVJTEQnLCBldmVudFNvdXJjZTogJ2NvZGVidWlsZCcgfTtcbiAgcmV0dXJuIHsgZXZlbnRUeXBlOiAnUElQRUxJTkUnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbn1cblxuLyoqIFBhcnNlICsgcmVzb2x2ZSBvbmUgcmVjb3JkIHRvIGEgcmVwb3J0YWJsZSBldmVudCwgb3IgbnVsbCB0byBza2lwIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcGFyc2VSZWNvcmQocmVjb3JkOiBTUVNSZWNvcmQpOiBQcm9taXNlPFBhcnNlZEV2ZW50IHwgbnVsbD4ge1xuICBjb25zdCBldmVudCA9IEpTT04ucGFyc2UocmVjb3JkLmJvZHkpIGFzIHtcbiAgICAnZGV0YWlsLXR5cGUnOiBzdHJpbmc7XG4gICAgJ3NvdXJjZSc6IHN0cmluZztcbiAgICAnZGV0YWlsJzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgJ3RpbWUnOiBzdHJpbmc7XG4gICAgJ3JlZ2lvbic6IHN0cmluZztcbiAgICAnYWNjb3VudCc6IHN0cmluZztcbiAgfTtcblxuICBjb25zdCB7IGV2ZW50VHlwZSwgZXZlbnRTb3VyY2UgfSA9IGNsYXNzaWZ5RXZlbnQoZXZlbnRbJ2RldGFpbC10eXBlJ10pO1xuICBjb25zdCBkZXRhaWwgPSB7IC4uLmV2ZW50LmRldGFpbCB9O1xuICAvLyBUaGUgcmF3IGFjY291bnQgbmV2ZXIgbmVlZHMgdG8gbGVhdmUgQVdTIG5vdyDigJQgZHJvcCBpdCBmcm9tIHRoZSBwYXlsb2FkLlxuICBkZWxldGUgZGV0YWlsLmFjY291bnQ7XG5cbiAgLy8gQ29kZUJ1aWxkIFwiQnVpbGQgU3RhdGVcIiBldmVudHMgaWRlbnRpZnkgYSBidWlsZCAqcHJvamVjdCosIG5vdCBhIHBpcGVsaW5lLFxuICAvLyBhbmQgYSBwcm9qZWN0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIHBpcGVsaW5lcyDigJQgdGhlcmUncyBubyBjbGVhbiAxOjEgbWFwcGluZ1xuICAvLyB0byBhIFBJUEVMSU5FX0VWRU5UX0lELCBzbyBza2lwIHRoZW0gKHRoZXkgd2VyZSBlZmZlY3RpdmVseSBkcm9wcGVkIGJlZm9yZVxuICAvLyB0b28sIHNpbmNlIGRldGFpbC5waXBlbGluZSB3YXMgdW5kZWZpbmVkIGFuZCBuZXZlciBtYXRjaGVkIHRoZSByZWdpc3RyeSkuXG4gIGlmIChldmVudFNvdXJjZSAhPT0gJ2NvZGVwaXBlbGluZScpIHtcbiAgICBsb2cud2FybignU2tpcHBpbmcgbm9uLUNvZGVQaXBlbGluZSBldmVudCAobm8gcGlwZWxpbmUgdGFnIHRvIHJlc29sdmUpJywgeyBkZXRhaWxUeXBlOiBldmVudFsnZGV0YWlsLXR5cGUnXSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBpcGVsaW5lTmFtZSA9IGRldGFpbC5waXBlbGluZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmICghcGlwZWxpbmVOYW1lKSB7XG4gICAgbG9nLndhcm4oJ0NvZGVQaXBlbGluZSBldmVudCBtaXNzaW5nIHBpcGVsaW5lIG5hbWUg4oCUIHNraXBwaW5nJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSBwaXBlbGluZSdzIFBJUEVMSU5FX0VWRU5UX0lEIHRhZyAoPSBwbGF0Zm9ybSBwaXBlbGluZUlkKS4gVGhlXG4gIC8vIEFSTiBpcyBvbmx5IGEgdHJhbnNpZW50IGhhbmRsZSBmb3IgdGhlIHRhZyBsb29rdXA7IGl0IGlzIG5ldmVyIHN0b3JlZC5cbiAgY29uc3QgYXJuID0gYGFybjphd3M6Y29kZXBpcGVsaW5lOiR7ZXZlbnQucmVnaW9ufToke2V2ZW50LmFjY291bnR9OiR7cGlwZWxpbmVOYW1lfWA7XG4gIGNvbnN0IHBpcGVsaW5lSWQgPSBhd2FpdCByZXNvbHZlUGlwZWxpbmVFdmVudElkKGFybiwgZXZlbnQucmVnaW9uKTtcbiAgaWYgKCFwaXBlbGluZUlkKSByZXR1cm4gbnVsbDsgLy8gdW50YWdnZWQgLyB1bnJlZ2lzdGVyZWQg4oaSIHNraXBcblxuICBjb25zdCBzdGFydGVkQXQgPSAoZGV0YWlsWydzdGFydC10aW1lJ10gYXMgc3RyaW5nKSB8fCBldmVudC50aW1lO1xuICBjb25zdCBzdGF0ZSA9IGRldGFpbC5zdGF0ZSBhcyBzdHJpbmc7XG5cbiAgbGV0IGR1cmF0aW9uTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGNvbXBsZXRlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKFsnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcsICdTVE9QUEVEJ10uaW5jbHVkZXMoc3RhdGUpKSB7XG4gICAgY29tcGxldGVkQXQgPSBldmVudC50aW1lO1xuICAgIGlmIChzdGFydGVkQXQgJiYgY29tcGxldGVkQXQpIHtcbiAgICAgIGNvbnN0IG1zID0gbmV3IERhdGUoY29tcGxldGVkQXQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHN0YXJ0ZWRBdCkuZ2V0VGltZSgpO1xuICAgICAgaWYgKG1zID49IDApIGR1cmF0aW9uTXMgPSBtcztcbiAgICB9XG4gIH1cblxuICAvLyBQcm9tb3RlIHRoZSBmYWlsdXJlIHJlYXNvbiB0byBhIHR5cGVkIGZpZWxkLiBPbiBBY3Rpb24gZXZlbnRzIEFXUyBwdXRzIHRoZVxuICAvLyBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IChhbmQgYSBsb2cgVVJMICsgZXJyb3ItY29kZSwgd2hpY2ggc3RheSBpbiBgZGV0YWlsYClcbiAgLy8gdW5kZXIgYGV4ZWN1dGlvbi1yZXN1bHRgLlxuICBjb25zdCByZXN1bHQgPSBkZXRhaWxbJ2V4ZWN1dGlvbi1yZXN1bHQnXSBhcyB7ICdleHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeSc/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN1bW1hcnkgPSByZXN1bHQ/LlsnZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnknXTtcbiAgY29uc3QgZXJyb3JNZXNzYWdlID0gdHlwZW9mIHN1bW1hcnkgPT09ICdzdHJpbmcnICYmIHN1bW1hcnkubGVuZ3RoID4gMFxuICAgID8gc3VtbWFyeS5zbGljZSgwLCBNQVhfRVJST1JfTUVTU0FHRSlcbiAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIHBpcGVsaW5lSWQsXG4gICAgZXZlbnRTb3VyY2UsXG4gICAgZXZlbnRUeXBlLFxuICAgIHN0YXR1czogc3RhdGUsXG4gICAgZXhlY3V0aW9uSWQ6IGRldGFpbFsnZXhlY3V0aW9uLWlkJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN0YWdlTmFtZTogZGV0YWlsLnN0YWdlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBhY3Rpb25OYW1lOiBkZXRhaWwuYWN0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgc3RhcnRlZEF0LFxuICAgIGNvbXBsZXRlZEF0LFxuICAgIGR1cmF0aW9uTXMsXG4gICAgZGV0YWlsLFxuICB9O1xufVxuXG4vLyDilIDilIDilIAgSGFuZGxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IFNRU0V2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGJhc2VVcmwgPSBwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTDtcbiAgaWYgKCFiYXNlVXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1BMQVRGT1JNX0JBU0VfVVJMIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG5cbiAgLy8gUGFyc2UgKyByZXNvbHZlIGFsbCByZWNvcmRzICh0YWcgbG9va3VwcyBydW4gY29uY3VycmVudGx5KTsgZHJvcCBza2lwcy5cbiAgY29uc3QgZXZlbnRzID0gKGF3YWl0IFByb21pc2UuYWxsKGV2ZW50LlJlY29yZHMubWFwKHBhcnNlUmVjb3JkKSkpXG4gICAgLmZpbHRlcigoZSk6IGUgaXMgUGFyc2VkRXZlbnQgPT4gZSAhPT0gbnVsbCk7XG4gIGlmIChldmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nLmluZm8oJ05vIHJlc29sdmFibGUgQ29kZVBpcGVsaW5lIGV2ZW50cyBpbiBiYXRjaCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEF1dGhlbnRpY2F0ZVxuICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldEF1dGhUb2tlbigpO1xuXG4gIC8vIFBPU1QgYmF0Y2ggdG8gcmVwb3J0aW5nIHNlcnZpY2VcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vYXBpL3JlcG9ydHMvZXZlbnRzYCwge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBldmVudHMgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICAgIGxvZy5lcnJvcihgUmVwb3J0aW5nIEFQSSByZXR1cm5lZCAke3Jlcy5zdGF0dXN9YCwgeyBib2R5IH0pO1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVwb3J0aW5nIEFQSSBmYWlsZWQ6ICR7cmVzLnN0YXR1c31gKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxvZy5pbmZvKGBJbmdlc3RlZCAke2V2ZW50cy5sZW5ndGh9IGV2ZW50c2AsIHsgaW5zZXJ0ZWQ6IHJlc3VsdC5kYXRhIH0pO1xufTtcbiJdfQ==
|
|
250
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQWU5RixJQUFJLGVBQStDLENBQUM7QUFDcEQsS0FBSyxVQUFVLGdCQUFnQjtJQUM3QixJQUFJLENBQUMsZUFBZTtRQUFFLGVBQWUsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQWtDLENBQUM7SUFDeEgsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE1BQU0sR0FBRyxHQUFHO0lBQ1YsSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksS0FBSyxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxP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RyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBNkIsQ0FBQztJQUMzRCxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksTUFBTSxDQUFDLE1BQU0sU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsIFNlY3JldHNNYW5hZ2VyQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7IFNRU0V2ZW50LCBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcblxuLy8gQVdTIExhbWJkYSdzIE5vZGUgcnVudGltZSBidW5kbGVzIEBhd3Mtc2RrIHYzLCBzbyB0aGUgQ29kZVBpcGVsaW5lIGNsaWVudCBpc1xuLy8gbG9hZGVkIGxhemlseSB2aWEgZHluYW1pYyBpbXBvcnQoKSDigJQgYSBzdGF0aWMgd29ya3NwYWNlIGRlcGVuZGVuY3kgb25cbi8vIEBhd3Mtc2RrL2NsaWVudC1jb2RlcGlwZWxpbmUgd291bGQgcGVydHVyYiB0aGUgc2hhcmVkIEBhd3Mtc2RrIHZlcnNpb24gdHJlZVxuLy8gYW5kIGJyZWFrIG90aGVyIHBhY2thZ2VzJyB0eXBpbmdzLiBUaGUgZHluYW1pYyBpbXBvcnQga2VlcHMgaXQgb3V0IG9mIHRoZVxuLy8gc3RhdGljIGdyYXBoIHdoaWxlIHN0YXlpbmcgRVNNLWNvcnJlY3QgKG5vIGByZXF1aXJlYCBpbiBhIHR5cGU6bW9kdWxlIHBhY2thZ2UpXG4vLyBhbmQgbW9ja2FibGUuIE1pbmltYWwgbG9jYWwgdHlwZXMga2VlcCB0aGUgY2FsbCBzaXRlcyB0eXBlLWNoZWNrZWQuXG5pbnRlcmZhY2UgTGlzdFRhZ3NPdXRwdXQgeyB0YWdzPzogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIH0+IH1cbmludGVyZmFjZSBDb2RlUGlwZWxpbmVDbGllbnRMaWtlIHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTxMaXN0VGFnc091dHB1dD4gfVxuaW50ZXJmYWNlIENvZGVQaXBlbGluZU1vZHVsZSB7XG4gIENvZGVQaXBlbGluZUNsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gQ29kZVBpcGVsaW5lQ2xpZW50TGlrZTtcbiAgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgcmVzb3VyY2VBcm46IHN0cmluZyB9KSA9PiB1bmtub3duO1xufVxubGV0IGNvZGVwaXBlbGluZU1vZDogQ29kZVBpcGVsaW5lTW9kdWxlIHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gbG9hZENvZGVQaXBlbGluZSgpOiBQcm9taXNlPENvZGVQaXBlbGluZU1vZHVsZT4ge1xuICBpZiAoIWNvZGVwaXBlbGluZU1vZCkgY29kZXBpcGVsaW5lTW9kID0gKGF3YWl0IGltcG9ydCgnQGF3cy1zZGsvY2xpZW50LWNvZGVwaXBlbGluZScpKSBhcyB1bmtub3duIGFzIENvZGVQaXBlbGluZU1vZHVsZTtcbiAgcmV0dXJuIGNvZGVwaXBlbGluZU1vZDtcbn1cblxuLyoqXG4gKiBQaXBlbGluZSBldmVudCBpbmdlc3Rpb24gTGFtYmRhIGhhbmRsZXIuXG4gKlxuICogUmVjZWl2ZXMgQ29kZVBpcGVsaW5lL0NvZGVCdWlsZCBldmVudHMgZnJvbSBTUVMgKHNvdXJjZWQgYnkgRXZlbnRCcmlkZ2UpLFxuICogcGFyc2VzIHRoZW0gaW50byBhIG5vcm1hbGl6ZWQgZm9ybWF0LCBhbmQgUE9TVHMgdGhlbSB0byB0aGUgcmVwb3J0aW5nIHNlcnZpY2VcbiAqIHZpYSBQTEFURk9STV9CQVNFX1VSTC5cbiAqXG4gKiBBdXRoZW50aWNhdGlvbjpcbiAqIC0gUExBVEZPUk1fVE9LRU4gZW52IHZhciAocHJlZmVycmVkIOKAlCBubyBTZWNyZXRzIE1hbmFnZXIgY2FsbClcbiAqIC0gUExBVEZPUk1fU0VDUkVUX05BTUUgZW52IHZhciDihpIgcmVhZHMgdGhlIEpXVCAocGFzc3dvcmQpIGZyb20gU2VjcmV0cyBNYW5hZ2VyXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBQTEFURk9STV9CQVNFX1VSTCDigJQgQmFzZSBVUkwgb2YgdGhlIHBsYXRmb3JtXG4gKiAtIFBMQVRGT1JNX1RPS0VOIOKAlCBKV1QgdG9rZW4gKHNldCBkaXJlY3RseSwgb3IpXG4gKiAtIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIOKAlCBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGNvbnRhaW5pbmcgeyBwYXNzd29yZDogPEpXVD4gfVxuICovXG5cbmNvbnN0IGxvZyA9IHtcbiAgaW5mbzogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0lORk8nLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxuICB3YXJuOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnV0FSTicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIGVycm9yOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdFUlJPUicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG59O1xuXG4vLyDilIDilIAgUElQRUxJTkVfRVZFTlRfSUQgcmVzb2x1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBpcGVsaW5lcyBhcmUgdGFnZ2VkIGBQSVBFTElORV9FVkVOVF9JRD08cGlwZWxpbmVJZD5gIGF0IENESyBzeW50aC4gV2UgcmVzb2x2ZVxuLy8gdGhhdCB0YWcgZnJvbSB0aGUgbGl2ZSBDb2RlUGlwZWxpbmUgKHJlZ2lvbi1hd2FyZSkgYW5kIHJlcG9ydCBhZ2FpbnN0IHRoZSBpZCDigJRcbi8vIHRoZSBBUk4vYWNjb3VudCBuZXZlciBsZWF2ZSBBV1MsIHNvIHRoZXJlJ3Mgbm8gbWFza2luZy4gQ2FjaGVkIHBlciBBUk5cbi8vICh3YXJtLWNvbnRhaW5lcikgdG8gYXZvaWQgaGFtbWVyaW5nIHRoZSBMaXN0VGFncyBBUEkuXG4vL1xuLy8gUmVxdWlyZXMgdGhlIExhbWJkYSBleGVjdXRpb24gcm9sZSB0byBhbGxvdyBgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2VgLlxuLy8gQWNjZXNzRGVuaWVkIGlzIGEgY29uZmlnIGVycm9yIChhbGVydCBsb3VkbHkpOyBhIG1pc3NpbmcgdGFnIGlzIHRyZWF0ZWQgYXNcbi8vIFwibm90IHlldCByZWdpc3RlcmVkXCIgKHNraXApLlxuXG5jb25zdCBQSVBFTElORV9FVkVOVF9JRF9UQUcgPSAnUElQRUxJTkVfRVZFTlRfSUQnO1xuY29uc3QgY2xpZW50c0J5UmVnaW9uID0gbmV3IE1hcDxzdHJpbmcsIENvZGVQaXBlbGluZUNsaWVudExpa2U+KCk7XG4vLyB0YWc9bnVsbCBpcyBhIG5lZ2F0aXZlIGNhY2hlIChyZXNvbHZlZC1idXQtdW50YWdnZWQpOyBgdHNgIGxldHMgbmVnYXRpdmVzXG4vLyBleHBpcmUgc28gYSBwaXBlbGluZSB0YWdnZWQgQUZURVIgaXRzIGZpcnN0IGV2ZW50IGJlY29tZXMgcmVzb2x2YWJsZSB3aXRob3V0XG4vLyByZWN5Y2xpbmcgdGhlIHdhcm0gY29udGFpbmVyLiBQb3NpdGl2ZSByZXN1bHRzIHN0YXkgY2FjaGVkIGZvciB0aGUgbGlmZXRpbWUuXG5jb25zdCBldmVudElkQnlBcm4gPSBuZXcgTWFwPHN0cmluZywgeyB0YWc6IHN0cmluZyB8IG51bGw7IHRzOiBudW1iZXIgfT4oKTtcbmNvbnN0IE5FR19DQUNIRV9UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG5hc3luYyBmdW5jdGlvbiBwaXBlbGluZUNsaWVudChyZWdpb246IHN0cmluZyk6IFByb21pc2U8Q29kZVBpcGVsaW5lQ2xpZW50TGlrZT4ge1xuICBsZXQgY2xpZW50ID0gY2xpZW50c0J5UmVnaW9uLmdldChyZWdpb24pO1xuICBpZiAoIWNsaWVudCkge1xuICAgIGNvbnN0IHsgQ29kZVBpcGVsaW5lQ2xpZW50IH0gPSBhd2FpdCBsb2FkQ29kZVBpcGVsaW5lKCk7XG4gICAgY2xpZW50ID0gbmV3IENvZGVQaXBlbGluZUNsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBjbGllbnRzQnlSZWdpb24uc2V0KHJlZ2lvbiwgY2xpZW50KTtcbiAgfVxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBDb2RlUGlwZWxpbmUncyBQSVBFTElORV9FVkVOVF9JRCB0YWcg4oaSIHRoZSBwbGF0Zm9ybSBwaXBlbGluZUlkLlxuICogUmV0dXJucyBudWxsIHdoZW4gdGhlIHBpcGVsaW5lIGhhcyBubyBzdWNoIHRhZyAodW5yZWdpc3RlcmVkKS4gVGhyb3dzIG9uXG4gKiBBY2Nlc3NEZW5pZWQgc28gYSBtaXNzaW5nIElBTSBncmFudCBzdXJmYWNlcyBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseVxuICogZHJvcHBpbmcgZXZlcnkgZXZlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQaXBlbGluZUV2ZW50SWQoYXJuOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGV2ZW50SWRCeUFybi5nZXQoYXJuKTtcbiAgLy8gU2VydmUgYSBwb3NpdGl2ZSBoaXQgZm9yIHRoZSBjb250YWluZXIgbGlmZXRpbWU7IHNlcnZlIGEgbmVnYXRpdmUgaGl0IG9ubHlcbiAgLy8gdW50aWwgaXQgZXhwaXJlcyAodGhlbiByZS1yZXNvbHZlLCBpbiBjYXNlIHRoZSBwaXBlbGluZSB3YXMgc2luY2UgdGFnZ2VkKS5cbiAgaWYgKGNhY2hlZCAmJiAoY2FjaGVkLnRhZyAhPT0gbnVsbCB8fCBEYXRlLm5vdygpIC0gY2FjaGVkLnRzIDwgTkVHX0NBQ0hFX1RUTF9NUykpIHtcbiAgICByZXR1cm4gY2FjaGVkLnRhZztcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHBpcGVsaW5lQ2xpZW50KHJlZ2lvbik7XG4gICAgY29uc3QgeyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCB9ID0gYXdhaXQgbG9hZENvZGVQaXBlbGluZSgpO1xuICAgIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCh7IHJlc291cmNlQXJuOiBhcm4gfSkpO1xuICAgIGNvbnN0IHRhZyA9IG91dC50YWdzPy5maW5kKHQgPT4gdC5rZXkgPT09IFBJUEVMSU5FX0VWRU5UX0lEX1RBRyk/LnZhbHVlID8/IG51bGw7XG4gICAgaWYgKCF0YWcpIGxvZy53YXJuKCdQaXBlbGluZSBtaXNzaW5nIFBJUEVMSU5FX0VWRU5UX0lEIHRhZyDigJQgc2tpcHBpbmcgKHJlZ2lzdGVyIGl0PyknLCB7IGFybiB9KTtcbiAgICBldmVudElkQnlBcm4uc2V0KGFybiwgeyB0YWcsIHRzOiBEYXRlLm5vdygpIH0pO1xuICAgIHJldHVybiB0YWc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IG5hbWUgPSAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZTtcbiAgICBpZiAobmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicpIHtcbiAgICAgIC8vIERvbid0IGNhY2hlIOKAlCB0aGlzIGlzIGEgZml4YWJsZSBtaXNjb25maWcsIG5vdCBhIHByb3BlcnR5IG9mIHRoZSBwaXBlbGluZS5cbiAgICAgIGxvZy5lcnJvcignQWNjZXNzRGVuaWVkIGNhbGxpbmcgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2Ug4oCUIGdyYW50IGl0IHRvIHRoZSBMYW1iZGEgcm9sZScsIHsgYXJuLCBlcnJvcjogbmFtZSB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBQSVBFTElORV9FVkVOVF9JRCB0YWcnLCB7IGFybiwgZXJyb3I6IG5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSAIEF1dGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmxldCBjYWNoZWRUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dGhUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY2FjaGVkVG9rZW4pIHJldHVybiBjYWNoZWRUb2tlbjtcblxuICAvLyBQYXRoIDE6IFBMQVRGT1JNX1RPS0VOIGVudiB2YXIgKG5vIFNlY3JldHMgTWFuYWdlciBjYWxsKVxuICBpZiAocHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pIHtcbiAgICBjYWNoZWRUb2tlbiA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOO1xuICAgIGxvZy5pbmZvKCdVc2luZyBQTEFURk9STV9UT0tFTiBmcm9tIGVudmlyb25tZW50Jyk7XG4gICAgcmV0dXJuIGNhY2hlZFRva2VuO1xuICB9XG5cbiAgLy8gUGF0aCAyOiBQTEFURk9STV9TRUNSRVRfTkFNRSDihpIgcmVhZCBmcm9tIFNlY3JldHMgTWFuYWdlclxuICBjb25zdCBzZWNyZXROYW1lID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUU7XG4gIGlmICghc2VjcmV0TmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fVE9LRU4gb3IgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBGZXRjaGluZyB0b2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlcjogJHtzZWNyZXROYW1lfWApO1xuICBjb25zdCBjbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KSk7XG5cbiAgaWYgKCFyZXNwb25zZS5TZWNyZXRTdHJpbmcpIHRocm93IG5ldyBFcnJvcihgU2VjcmV0IFwiJHtzZWNyZXROYW1lfVwiIGlzIGVtcHR5YCk7XG5cbiAgY29uc3Qgc2VjcmV0ID0gSlNPTi5wYXJzZShyZXNwb25zZS5TZWNyZXRTdHJpbmcpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8vIHN0b3JlLXRva2VuIHdyaXRlcyB0aGUgSldUIGluIGBwYXNzd29yZGAgKHRoZSBjYW5vbmljYWwgZmllbGQg4oCUIGFsc28gdXNlZCBieVxuICAvLyBDb2RlQnVpbGQgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFscywgdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhLCBhbmQgdG9rZW4tcmVuZXcpLlxuICAvLyBBY2NlcHQgbGVnYWN5IGBhY2Nlc3NUb2tlbmAgYXMgYSBmYWxsYmFjay5cbiAgY29uc3QgdG9rZW4gPSBzZWNyZXQucGFzc3dvcmQgfHwgc2VjcmV0LmFjY2Vzc1Rva2VuO1xuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZWNyZXQgbWlzc2luZyBKV1QgKHBhc3N3b3JkKSDigJQgcnVuIFwicGlwZWxpbmUtbWFuYWdlciBzdG9yZS10b2tlblwiIHRvIGdlbmVyYXRlJyk7XG4gIH1cblxuICBjYWNoZWRUb2tlbiA9IHRva2VuO1xuICBsb2cuaW5mbygnVXNpbmcgc3RvcmVkIEpXVCB0b2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlcicpO1xuICByZXR1cm4gY2FjaGVkVG9rZW47XG59XG5cbi8vIOKUgOKUgOKUgCBFdmVudCBQYXJzaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgUGFyc2VkRXZlbnQge1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIGV2ZW50U291cmNlOiBzdHJpbmc7XG4gIGV2ZW50VHlwZTogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbiAgZXhlY3V0aW9uSWQ/OiBzdHJpbmc7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgYWN0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGZhaWx1cmUgcmVhc29uLCBmcm9tIGFuIEFjdGlvbiBldmVudCdzXG4gICAqICBgZXhlY3V0aW9uLXJlc3VsdC5leHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeWAuIFRoZSBsb2cgVVJMICsgZXJyb3ItY29kZVxuICAgKiAgc3RheSBpbiBgZGV0YWlsYCBmb3IgZHJpbGwtZG93bi4gKi9cbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG4gIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICBkZXRhaWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogQ2FwIG9uIHRoZSBzdG9yZWQgZmFpbHVyZSBzdW1tYXJ5IOKAlCBDb2RlQnVpbGQvRGVwbG95IHN1bW1hcmllcyBjYW4gYmUgbG9uZy4gKi9cbmNvbnN0IE1BWF9FUlJPUl9NRVNTQUdFID0gNDAwMDtcblxuZnVuY3Rpb24gY2xhc3NpZnlFdmVudChkZXRhaWxUeXBlOiBzdHJpbmcpOiB7IGV2ZW50VHlwZTogc3RyaW5nOyBldmVudFNvdXJjZTogc3RyaW5nIH0ge1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnUGlwZWxpbmUgRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ1BJUEVMSU5FJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdTdGFnZSBFeGVjdXRpb24nKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnU1RBR0UnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ0FjdGlvbiBFeGVjdXRpb24nKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnQUNUSU9OJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIC8vIENvZGVCdWlsZCBcIkJ1aWxkIFN0YXRlXCIgZXZlbnRzIGlkZW50aWZ5IGEgYnVpbGQgKnByb2plY3QqLCBub3QgYSBwaXBlbGluZSwgc29cbiAgLy8gcGFyc2VSZWNvcmQgZHJvcHMgdGhlbSBvbiB0aGUgYGV2ZW50U291cmNlICE9PSAnY29kZXBpcGVsaW5lJ2AgY2hlY2sgYmVsb3cg4oCUXG4gIC8vIHRoZSAnQlVJTEQnIGV2ZW50VHlwZSBpcyBuZXZlciBwZXJzaXN0ZWQgaGVyZSAocGx1Z2luIEJVSUxEIGV2ZW50cyBhcmVcbiAgLy8gcmVjb3JkZWQgZGlyZWN0bHkgYnkgdGhlIHBsdWdpbiBzZXJ2aWNlKS4gVGhlICdjb2RlYnVpbGQnIHNvdXJjZSBpcyB3aGF0XG4gIC8vIHJvdXRlcyB0aGUgZHJvcDsga2VlcCB0aGlzIGJyYW5jaCBvbmx5IGZvciB0aGF0LlxuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnQnVpbGQgU3RhdGUnKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnQlVJTEQnLCBldmVudFNvdXJjZTogJ2NvZGVidWlsZCcgfTtcbiAgcmV0dXJuIHsgZXZlbnRUeXBlOiAnUElQRUxJTkUnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbn1cblxuLyoqIFBhcnNlICsgcmVzb2x2ZSBvbmUgcmVjb3JkIHRvIGEgcmVwb3J0YWJsZSBldmVudCwgb3IgbnVsbCB0byBza2lwIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcGFyc2VSZWNvcmQocmVjb3JkOiBTUVNSZWNvcmQpOiBQcm9taXNlPFBhcnNlZEV2ZW50IHwgbnVsbD4ge1xuICBsZXQgZXZlbnQ6IHtcbiAgICAnZGV0YWlsLXR5cGUnOiBzdHJpbmc7XG4gICAgJ3NvdXJjZSc6IHN0cmluZztcbiAgICAnZGV0YWlsJzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgJ3RpbWUnOiBzdHJpbmc7XG4gICAgJ3JlZ2lvbic6IHN0cmluZztcbiAgICAnYWNjb3VudCc6IHN0cmluZztcbiAgfTtcbiAgLy8gQSBtYWxmb3JtZWQgYm9keSBpcyBhIGRlYWQgbWVzc2FnZSAocmV0cnlpbmcgd29uJ3QgaGVscCkg4oCUIGxvZyArIHNraXAgaXQgc29cbiAgLy8gaXQgY2FuJ3QgZmFpbCB0aGUgd2hvbGUgYmF0Y2guIFJlc29sdXRpb24gZXJyb3JzIGJlbG93IChlLmcuIEFjY2Vzc0RlbmllZClcbiAgLy8gYXJlIE5PVCBjYXVnaHQgaGVyZTogdGhvc2UgYXJlIHRyYW5zaWVudC9pbmZyYSBhbmQgbXVzdCBwcm9wYWdhdGUgdG8gcmV0cnkuXG4gIHRyeSB7XG4gICAgZXZlbnQgPSBKU09OLnBhcnNlKHJlY29yZC5ib2R5KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ1NraXBwaW5nIFNRUyByZWNvcmQgd2l0aCB1bnBhcnNlYWJsZSBib2R5JywgeyBtZXNzYWdlSWQ6IHJlY29yZC5tZXNzYWdlSWQsIGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgZXZlbnRUeXBlLCBldmVudFNvdXJjZSB9ID0gY2xhc3NpZnlFdmVudChldmVudFsnZGV0YWlsLXR5cGUnXSk7XG4gIGNvbnN0IGRldGFpbCA9IHsgLi4uZXZlbnQuZGV0YWlsIH07XG4gIC8vIFRoZSByYXcgYWNjb3VudCBuZXZlciBuZWVkcyB0byBsZWF2ZSBBV1Mgbm93IOKAlCBkcm9wIGl0IGZyb20gdGhlIHBheWxvYWQuXG4gIGRlbGV0ZSBkZXRhaWwuYWNjb3VudDtcblxuICAvLyBDb2RlQnVpbGQgXCJCdWlsZCBTdGF0ZVwiIGV2ZW50cyBpZGVudGlmeSBhIGJ1aWxkICpwcm9qZWN0Kiwgbm90IGEgcGlwZWxpbmUsXG4gIC8vIGFuZCBhIHByb2plY3QgY2FuIGJlIHNoYXJlZCBhY3Jvc3MgcGlwZWxpbmVzIOKAlCB0aGVyZSdzIG5vIGNsZWFuIDE6MSBtYXBwaW5nXG4gIC8vIHRvIGEgUElQRUxJTkVfRVZFTlRfSUQsIHNvIHNraXAgdGhlbSAodGhleSB3ZXJlIGVmZmVjdGl2ZWx5IGRyb3BwZWQgYmVmb3JlXG4gIC8vIHRvbywgc2luY2UgZGV0YWlsLnBpcGVsaW5lIHdhcyB1bmRlZmluZWQgYW5kIG5ldmVyIG1hdGNoZWQgdGhlIHJlZ2lzdHJ5KS5cbiAgaWYgKGV2ZW50U291cmNlICE9PSAnY29kZXBpcGVsaW5lJykge1xuICAgIGxvZy53YXJuKCdTa2lwcGluZyBub24tQ29kZVBpcGVsaW5lIGV2ZW50IChubyBwaXBlbGluZSB0YWcgdG8gcmVzb2x2ZSknLCB7IGRldGFpbFR5cGU6IGV2ZW50WydkZXRhaWwtdHlwZSddIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGlwZWxpbmVOYW1lID0gZGV0YWlsLnBpcGVsaW5lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKCFwaXBlbGluZU5hbWUpIHtcbiAgICBsb2cud2FybignQ29kZVBpcGVsaW5lIGV2ZW50IG1pc3NpbmcgcGlwZWxpbmUgbmFtZSDigJQgc2tpcHBpbmcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFJlc29sdmUgdGhlIHBpcGVsaW5lJ3MgUElQRUxJTkVfRVZFTlRfSUQgdGFnICg9IHBsYXRmb3JtIHBpcGVsaW5lSWQpLiBUaGVcbiAgLy8gQVJOIGlzIG9ubHkgYSB0cmFuc2llbnQgaGFuZGxlIGZvciB0aGUgdGFnIGxvb2t1cDsgaXQgaXMgbmV2ZXIgc3RvcmVkLlxuICBjb25zdCBhcm4gPSBgYXJuOmF3czpjb2RlcGlwZWxpbmU6JHtldmVudC5yZWdpb259OiR7ZXZlbnQuYWNjb3VudH06JHtwaXBlbGluZU5hbWV9YDtcbiAgY29uc3QgcGlwZWxpbmVJZCA9IGF3YWl0IHJlc29sdmVQaXBlbGluZUV2ZW50SWQoYXJuLCBldmVudC5yZWdpb24pO1xuICBpZiAoIXBpcGVsaW5lSWQpIHJldHVybiBudWxsOyAvLyB1bnRhZ2dlZCAvIHVucmVnaXN0ZXJlZCDihpIgc2tpcFxuXG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IChkZXRhaWxbJ3N0YXJ0LXRpbWUnXSBhcyBzdHJpbmcpIHx8IGV2ZW50LnRpbWU7XG4gIGNvbnN0IHN0YXRlID0gZGV0YWlsLnN0YXRlIGFzIHN0cmluZztcblxuICBsZXQgZHVyYXRpb25NczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgY29tcGxldGVkQXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoWydTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJywgJ1NUT1BQRUQnXS5pbmNsdWRlcyhzdGF0ZSkpIHtcbiAgICBjb21wbGV0ZWRBdCA9IGV2ZW50LnRpbWU7XG4gICAgaWYgKHN0YXJ0ZWRBdCAmJiBjb21wbGV0ZWRBdCkge1xuICAgICAgY29uc3QgbXMgPSBuZXcgRGF0ZShjb21wbGV0ZWRBdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoc3RhcnRlZEF0KS5nZXRUaW1lKCk7XG4gICAgICBpZiAobXMgPj0gMCkgZHVyYXRpb25NcyA9IG1zO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByb21vdGUgdGhlIGZhaWx1cmUgcmVhc29uIHRvIGEgdHlwZWQgZmllbGQuIE9uIEFjdGlvbiBldmVudHMgQVdTIHB1dHMgdGhlXG4gIC8vIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgKGFuZCBhIGxvZyBVUkwgKyBlcnJvci1jb2RlLCB3aGljaCBzdGF5IGluIGBkZXRhaWxgKVxuICAvLyB1bmRlciBgZXhlY3V0aW9uLXJlc3VsdGAuXG4gIGNvbnN0IHJlc3VsdCA9IGRldGFpbFsnZXhlY3V0aW9uLXJlc3VsdCddIGFzIHsgJ2V4dGVybmFsLWV4ZWN1dGlvbi1zdW1tYXJ5Jz86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3VtbWFyeSA9IHJlc3VsdD8uWydleHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeSddO1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPSB0eXBlb2Ygc3VtbWFyeSA9PT0gJ3N0cmluZycgJiYgc3VtbWFyeS5sZW5ndGggPiAwXG4gICAgPyBzdW1tYXJ5LnNsaWNlKDAsIE1BWF9FUlJPUl9NRVNTQUdFKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgcGlwZWxpbmVJZCxcbiAgICBldmVudFNvdXJjZSxcbiAgICBldmVudFR5cGUsXG4gICAgc3RhdHVzOiBzdGF0ZSxcbiAgICBleGVjdXRpb25JZDogZGV0YWlsWydleGVjdXRpb24taWQnXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3RhZ2VOYW1lOiBkZXRhaWwuc3RhZ2UgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGFjdGlvbk5hbWU6IGRldGFpbC5hY3Rpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGVycm9yTWVzc2FnZSxcbiAgICBzdGFydGVkQXQsXG4gICAgY29tcGxldGVkQXQsXG4gICAgZHVyYXRpb25NcyxcbiAgICBkZXRhaWwsXG4gIH07XG59XG5cbi8vIOKUgOKUgOKUgCBIYW5kbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChldmVudDogU1FTRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgYmFzZVVybCA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX0JBU0VfVVJMO1xuICBpZiAoIWJhc2VVcmwpIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fQkFTRV9VUkwgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcblxuICAvLyBQYXJzZSArIHJlc29sdmUgYWxsIHJlY29yZHMgKHRhZyBsb29rdXBzIHJ1biBjb25jdXJyZW50bHkpOyBkcm9wIGludGVudGlvbmFsXG4gIC8vIHNraXBzIChudWxsKS4gQSBtYWxmb3JtZWQgcmVjb3JkIEJPRFkgaXMgaGFuZGxlZCBpbnNpZGUgcGFyc2VSZWNvcmQgKGxvZ2dlZCArXG4gIC8vIHNraXBwZWQpIHNvIG9uZSBiYWQgbWVzc2FnZSBjYW4ndCBmYWlsIHRoZSB3aG9sZSBiYXRjaCDigJQgd2hpbGUgZ2VudWluZSBpbmZyYVxuICAvLyBlcnJvcnMgKGUuZy4gQWNjZXNzRGVuaWVkIG9uIHRoZSB0YWcgbG9va3VwKSBzdGlsbCBwcm9wYWdhdGUgc28gYSBtaXNzaW5nIElBTVxuICAvLyBncmFudCBzdXJmYWNlcyBhbmQgU1FTIHJldHJpZXMgdGhlIGJhdGNoLlxuICBjb25zdCBldmVudHMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoZXZlbnQuUmVjb3Jkcy5tYXAocGFyc2VSZWNvcmQpKSlcbiAgICAuZmlsdGVyKChlKTogZSBpcyBQYXJzZWRFdmVudCA9PiBlICE9PSBudWxsKTtcbiAgaWYgKGV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBsb2cuaW5mbygnTm8gcmVzb2x2YWJsZSBDb2RlUGlwZWxpbmUgZXZlbnRzIGluIGJhdGNoJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUE9TVCBiYXRjaCB0byByZXBvcnRpbmcgc2VydmljZS4gT24gYSA0MDEvNDAzIHRoZSBjYWNoZWQgSldUIGhhcyBsaWtlbHlcbiAgLy8gZXhwaXJlZCDigJQgZHJvcCBpdCwgcmUtZmV0Y2gsIGFuZCByZXRyeSBPTkNFIHNvIGFuIGV4cGlyZWQgdG9rZW4gZG9lc24ndFxuICAvLyBwZXJtYW5lbnRseSBicmljayBhIHdhcm0gY29udGFpbmVyLlxuICBjb25zdCBwb3N0ID0gKHRva2VuOiBzdHJpbmcpID0+IGZldGNoKGAke2Jhc2VVcmx9L2FwaS9yZXBvcnRzL2V2ZW50c2AsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGV2ZW50cyB9KSxcbiAgfSk7XG4gIGxldCByZXMgPSBhd2FpdCBwb3N0KGF3YWl0IGdldEF1dGhUb2tlbigpKTtcbiAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICBsb2cud2FybignUmVwb3J0aW5nIEFQSSBhdXRoIGZhaWxlZDsgcmVmcmVzaGluZyB0b2tlbiBhbmQgcmV0cnlpbmcgb25jZScsIHsgc3RhdHVzOiByZXMuc3RhdHVzIH0pO1xuICAgIGNhY2hlZFRva2VuID0gbnVsbDtcbiAgICByZXMgPSBhd2FpdCBwb3N0KGF3YWl0IGdldEF1dGhUb2tlbigpKTtcbiAgfVxuXG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICAgIGxvZy5lcnJvcihgUmVwb3J0aW5nIEFQSSByZXR1cm5lZCAke3Jlcy5zdGF0dXN9YCwgeyBib2R5IH0pO1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVwb3J0aW5nIEFQSSBmYWlsZWQ6ICR7cmVzLnN0YXR1c31gKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxvZy5pbmZvKGBJbmdlc3RlZCAke2V2ZW50cy5sZW5ndGh9IGV2ZW50c2AsIHsgaW5zZXJ0ZWQ6IHJlc3VsdC5kYXRhIH0pO1xufTtcbiJdfQ==
|