@pipeline-builder/pipeline-data 4.3.11 → 4.3.13

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 (42) hide show
  1. package/lib/api/managed-toolchain.d.ts +195 -0
  2. package/lib/api/managed-toolchain.js +443 -0
  3. package/lib/api/public-directory.d.ts +4 -15
  4. package/lib/api/public-directory.js +1 -31
  5. package/lib/api/reporting/ingest.js +52 -12
  6. package/lib/api/reporting/stakeholder/compose.d.ts +3 -2
  7. package/lib/api/reporting/stakeholder/compose.js +1 -1
  8. package/lib/api/reporting/stakeholder/period.d.ts +5 -4
  9. package/lib/api/reporting/stakeholder/period.js +1 -1
  10. package/lib/api/reporting/stakeholder/sections.d.ts +4 -4
  11. package/lib/api/reporting/stakeholder/sections.js +1 -1
  12. package/lib/api/reporting/stakeholder/store.d.ts +3 -2
  13. package/lib/api/reporting/stakeholder/store.js +1 -1
  14. package/lib/api/reporting/toolchain-runs.d.ts +156 -0
  15. package/lib/api/reporting/toolchain-runs.js +267 -0
  16. package/lib/api/reporting/types.d.ts +20 -3
  17. package/lib/api/reporting/types.js +1 -1
  18. package/lib/api/support-cases.d.ts +50 -24
  19. package/lib/api/support-cases.js +96 -37
  20. package/lib/api/version-references.d.ts +2 -24
  21. package/lib/api/version-references.js +46 -7
  22. package/lib/core/query-filters.d.ts +6 -6
  23. package/lib/core/query-filters.js +1 -1
  24. package/lib/database/drizzle-schema.d.ts +698 -41
  25. package/lib/database/drizzle-schema.js +11 -1
  26. package/lib/database/index.d.ts +1 -1
  27. package/lib/database/index.js +2 -2
  28. package/lib/database/schema/alert.js +4 -4
  29. package/lib/database/schema/compliance.d.ts +29 -40
  30. package/lib/database/schema/compliance.js +10 -14
  31. package/lib/database/schema/ecosystem.d.ts +72 -0
  32. package/lib/database/schema/ecosystem.js +18 -2
  33. package/lib/database/schema/pipeline.d.ts +19 -0
  34. package/lib/database/schema/pipeline.js +17 -1
  35. package/lib/database/schema/reporting-stakeholder.d.ts +2 -1
  36. package/lib/database/schema/reporting-stakeholder.js +2 -27
  37. package/lib/database/schema/toolchain.d.ts +643 -0
  38. package/lib/database/schema/toolchain.js +102 -0
  39. package/lib/index.d.ts +4 -2
  40. package/lib/index.js +7 -3
  41. package/lib/testing/exports.json +39 -2
  42. package/package.json +2 -2
@@ -10,12 +10,16 @@
10
10
  * `messages` keeps carrying the conversation. These functions only ever touch
11
11
  * the workflow axis: identity, status, ownership and the response clock.
12
12
  */
13
- import { and, asc, eq, gte, inArray, isNull, lte, sql } from 'drizzle-orm';
13
+ import { LIVE_SUPPORT_CASE_STATUSES } from '@pipeline-builder/api-core';
14
+ import { and, asc, desc, eq, getTableColumns, gte, inArray, isNull, lte, sql } from 'drizzle-orm';
15
+ import { CURSOR_SORT_KEY, decodeCursor, encodeCursor, isCastableTo, keysetAfter } from './keyset-cursor.js';
14
16
  import { schema } from '../database/drizzle-schema.js';
15
17
  import { runWithTenantContext, withTenantTx } from '../database/tenancy.js';
16
- /** Statuses a case can be in. `awaiting_customer` is what stops the clock. */
17
- export const SUPPORT_CASE_STATUSES = ['open', 'awaiting_support', 'awaiting_customer', 'resolved', 'closed'];
18
- /** The statuses the staff queue asks about — the ones still on us. */
18
+ /**
19
+ * The statuses the staff queue asks about — the ones still on us. (The full set
20
+ * is api-core's `SUPPORT_CASE_STATUSES`; `awaiting_customer` is what stops the
21
+ * clock.)
22
+ */
19
23
  export const QUEUE_STATUSES = ['open', 'awaiting_support'];
20
24
  /**
21
25
  * Allocate the next per-org case number.
@@ -96,28 +100,74 @@ export async function findCaseByThread(threadId) {
96
100
  .limit(1));
97
101
  return rows[0] ?? null;
98
102
  }
103
+ /** Default and ceiling page size for the two case lists. */
104
+ export const SUPPORT_CASE_PAGE_DEFAULT = 100;
105
+ export const SUPPORT_CASE_PAGE_MAX = 1000;
106
+ function pageLimit(limit) {
107
+ const n = Math.floor(limit ?? SUPPORT_CASE_PAGE_DEFAULT);
108
+ return Number.isFinite(n) ? Math.min(Math.max(n, 1), SUPPORT_CASE_PAGE_MAX) : SUPPORT_CASE_PAGE_DEFAULT;
109
+ }
110
+ /** A decoded cursor whose id and sort text are safe to bind, or null (read from the start). */
111
+ function decodeCaseCursor(cursor) {
112
+ if (!cursor)
113
+ return null;
114
+ const decoded = decodeCursor(cursor);
115
+ return decoded && decoded.sortText !== null
116
+ && isCastableTo(schema.supportCase.id, decoded.id)
117
+ && isCastableTo(schema.supportCase.createdAt, decoded.sortText)
118
+ ? { sortText: decoded.sortText, id: decoded.id }
119
+ : null;
120
+ }
121
+ /** Fetch `limit + 1` rows (selecting the sort key as text), and cut them into a page. */
122
+ async function readPage(limit, sortKey, query) {
123
+ const rows = await query({ ...getTableColumns(schema.supportCase), [CURSOR_SORT_KEY]: sql `(${sortKey})::text` });
124
+ const hasMore = rows.length > limit;
125
+ const page = hasMore ? rows.slice(0, limit) : rows;
126
+ const cases = page.map((row) => {
127
+ const { [CURSOR_SORT_KEY]: _sort, ...rest } = row;
128
+ return rest;
129
+ });
130
+ const last = page[page.length - 1];
131
+ return {
132
+ cases,
133
+ hasMore,
134
+ ...(hasMore && last ? { nextCursor: encodeCursor(String(last[CURSOR_SORT_KEY]), String(last.id)) } : {}),
135
+ };
136
+ }
99
137
  /**
100
- * The staff queue: open cases across ALL tenants, oldest first.
101
- *
102
- * The one read with no org predicate, so it runs under sysadmin scope and is
103
- * served by the partial `support_case_queue_idx`.
104
- *
105
- * Ordered by `response_due_at` ASCENDING, NULLS LAST — soonest deadline first,
106
- * which is what "most at risk" actually means. Arrival order was the earlier
107
- * proxy for it and is a poor one: a standard case opened on Monday is owed
108
- * Wednesday's close while a priority case opened on Tuesday is owed Wednesday's
109
- * close too, so arrival order puts them in the wrong sequence whenever levels
110
- * are mixed. Cases with no deadline (an unrecognised level, or one opened while
111
- * the calendar was misconfigured) sort last rather than first, since a missing
112
- * deadline is not an urgent one; `createdAt` breaks ties so the order is stable.
138
+ * The instant a case's waiting clock reads from: `created_at` pushed forward by
139
+ * the time it spent on the customer (`awaiting_total_seconds`). Ordering by it
140
+ * ascending IS "longest waiting first" — `waitingSeconds = now − created_at −
141
+ * awaiting_total_seconds` is this instant subtracted from now — but, unlike
142
+ * waitingSeconds, it does not move with the clock, so it can be ordered on,
143
+ * LIMITed on and paged by a keyset cursor.
113
144
  */
114
- export async function listQueue(limit = 100) {
115
- return withTenantTx((tx) => tx
116
- .select()
145
+ const queueWaitAnchor = sql `(${schema.supportCase.createdAt} + make_interval(secs => ${schema.supportCase.awaitingTotalSeconds}))`;
146
+ /**
147
+ * The staff queue: open cases across ALL tenants, LONGEST WAITING first.
148
+ *
149
+ * The one read with no org predicate, so it runs under sysadmin scope; the
150
+ * partial `support_case_queue_idx` (open statuses, not deleted) bounds the rows
151
+ * it sorts.
152
+ *
153
+ * The order is the queue's displayed order — the waiting time a human acts on
154
+ * (see {@link queueWaitAnchor}) — and it is applied BEFORE the limit. It used
155
+ * to be `response_due_at` here and waitingSeconds in the route, so with more
156
+ * cases than the limit the route re-sorted a page taken on a different key and
157
+ * the longest-waiting case could be the one cut off. `id` breaks ties, so the
158
+ * order is total and the cursor stable.
159
+ */
160
+ export async function listQueue(opts = {}) {
161
+ const limit = pageLimit(opts.limit);
162
+ const after = decodeCaseCursor(opts.cursor);
163
+ return withTenantTx((tx) => readPage(limit, queueWaitAnchor, (select) => tx
164
+ .select(select)
117
165
  .from(schema.supportCase)
118
- .where(and(inArray(schema.supportCase.status, [...QUEUE_STATUSES]), isNull(schema.supportCase.deletedAt)))
119
- .orderBy(sql `${schema.supportCase.responseDueAt} ASC NULLS LAST`, asc(schema.supportCase.createdAt))
120
- .limit(limit));
166
+ .where(and(inArray(schema.supportCase.status, [...QUEUE_STATUSES]), isNull(schema.supportCase.deletedAt), ...(after
167
+ ? [sql `(${queueWaitAnchor} > ${after.sortText}::timestamptz OR (${queueWaitAnchor} = ${after.sortText}::timestamptz AND ${schema.supportCase.id} > ${after.id}))`]
168
+ : [])))
169
+ .orderBy(sql `${queueWaitAnchor} ASC`, asc(schema.supportCase.id))
170
+ .limit(limit + 1)));
121
171
  }
122
172
  /**
123
173
  * Premium cases whose response target is approaching with no first response yet.
@@ -158,14 +208,20 @@ export async function listCasesDueForPage(leadMs, limit = 100) {
158
208
  .orderBy(asc(schema.supportCase.responseDueAt))
159
209
  .limit(limit)));
160
210
  }
161
- /** An org's own cases, newest first. */
162
- export async function listOrgCases(orgId, limit = 100) {
163
- return withTenantTx((tx) => tx
164
- .select()
211
+ /**
212
+ * An org's own cases (closed ones included), newest first, one page at a time.
213
+ * `created_at DESC, id DESC` is total, so the keyset cursor neither repeats nor
214
+ * skips a case; served by `support_case_org_created_idx`.
215
+ */
216
+ export async function listOrgCases(orgId, opts = {}) {
217
+ const limit = pageLimit(opts.limit);
218
+ const after = decodeCaseCursor(opts.cursor);
219
+ return withTenantTx((tx) => readPage(limit, sql `${schema.supportCase.createdAt}`, (select) => tx
220
+ .select(select)
165
221
  .from(schema.supportCase)
166
- .where(and(eq(schema.supportCase.orgId, orgId), isNull(schema.supportCase.deletedAt)))
167
- .orderBy(sql `${schema.supportCase.createdAt} DESC`)
168
- .limit(limit));
222
+ .where(and(eq(schema.supportCase.orgId, orgId), isNull(schema.supportCase.deletedAt), ...(after ? [keysetAfter(schema.supportCase.createdAt, schema.supportCase.id, 'desc', after.sortText, after.id)] : [])))
223
+ .orderBy(desc(schema.supportCase.createdAt), desc(schema.supportCase.id))
224
+ .limit(limit + 1)));
169
225
  }
170
226
  /**
171
227
  * Stamp the first staff response, once.
@@ -334,7 +390,7 @@ export async function openCasesForContact(orgId, userId) {
334
390
  return withTenantTx((tx) => tx
335
391
  .select()
336
392
  .from(schema.supportCase)
337
- .where(and(eq(schema.supportCase.orgId, orgId), eq(schema.supportCase.tenantContact, userId), inArray(schema.supportCase.status, ['open', 'awaiting_support', 'awaiting_customer']), isNull(schema.supportCase.deletedAt))));
393
+ .where(and(eq(schema.supportCase.orgId, orgId), eq(schema.supportCase.tenantContact, userId), inArray(schema.supportCase.status, [...LIVE_SUPPORT_CASE_STATUSES]), isNull(schema.supportCase.deletedAt))));
338
394
  }
339
395
  /**
340
396
  * Cases raised across a scope within the last `windowDays` — the FAIR-USE count.
@@ -427,17 +483,20 @@ export async function listCaseNotes(caseId) {
427
483
  .orderBy(asc(schema.supportCaseNote.createdAt)));
428
484
  }
429
485
  /**
430
- * Soft-delete a note.
486
+ * Soft-delete a note ON a case.
487
+ *
488
+ * Keyed by BOTH ids: a note id alone would let a note on case B be removed
489
+ * through case A's URL (and the caller's audit row would name case A).
431
490
  *
432
491
  * Soft because a note is a record of what the desk believed at the time, and a
433
- * dispute may turn on it. Returns whether a row moved, so a second delete is a
434
- * reported no-op rather than a silent success.
492
+ * dispute may turn on it. Returns whether a row moved, so a second delete (or a
493
+ * note that is not on this case) is a reported no-op rather than a silent success.
435
494
  */
436
- export async function deleteCaseNote(noteId, deletedBy) {
495
+ export async function deleteCaseNote(caseId, noteId, deletedBy) {
437
496
  const rows = await withTenantTx((tx) => tx
438
497
  .update(schema.supportCaseNote)
439
498
  .set({ isActive: false, deletedAt: new Date(), deletedBy })
440
- .where(and(eq(schema.supportCaseNote.id, noteId), eq(schema.supportCaseNote.isActive, true)))
499
+ .where(and(eq(schema.supportCaseNote.id, noteId), eq(schema.supportCaseNote.caseId, caseId), eq(schema.supportCaseNote.isActive, true)))
441
500
  .returning({ id: schema.supportCaseNote.id }));
442
501
  return rows.length > 0;
443
502
  }
@@ -668,4 +727,4 @@ export async function revokeSupportContact(orgId, userId, revokedBy) {
668
727
  .returning({ id: schema.supportContact.id }));
669
728
  return { revoked: rows.length > 0, openCases };
670
729
  }
671
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcG9ydC1jYXNlcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zdXBwb3J0LWNhc2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFDdEM7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RSw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBR3RILHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlDLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUE2QnpGOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQUMsRUFBcUQsRUFBRSxLQUFhO0lBQ3ZHLE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRTtTQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1NBQ2pDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDaEMsa0JBQWtCLENBQUM7UUFDbEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLO1FBQ3ZDLEdBQUcsRUFBRTtZQUNILFVBQVUsRUFBRSxHQUFHLENBQUEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsVUFBVSxNQUFNO1lBQzVELFNBQVMsRUFBRSxJQUFJLElB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QUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsS0FBYSxFQUNiLE1BQWMsRUFDZCxTQUFpQjtJQUVqQixNQUFNLFNBQVMsR0FBRyxNQUFNLG1CQUFtQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxNQUFNLElBQUksR0FBRyxNQUFNLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtTQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztTQUM3QixHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDO1NBQzFELEtBQUssQ0FBQyxHQUFHLENBQ1IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUN0QyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQ3hDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FDekMsQ0FBQztTQUNELFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbi8qKlxuICogU3VwcG9ydC1jYXNlIHBlcnNpc3RlbmNlOiB0aGUgd29ya2Zsb3cgaGFsZiBvZiBhIHN1cHBvcnQgdGhyZWFkLlxuICpcbiAqIEhlcmUgcmF0aGVyIHRoYW4gaW4gYSBzZXJ2aWNlIGJlY2F1c2UgdHdvIGNhbGxlcnMgbmVlZCBpdCDigJQgcGxhdGZvcm0gb3ducyB0aGVcbiAqIGVudGl0bGVtZW50IGNoZWNrIGFuZCB0aGUgd3JpdGVzLCBhbmQgdGhlIG1lc3NhZ2Ugc2VydmljZSBvd25zIHRoZSB0aHJlYWQgdGhlXG4gKiBjYXNlIHBvaW50cyBhdCDigJQgYW5kIG5laXRoZXIgc2hvdWxkIGdyb3cgaXRzIG93biBjb3B5IG9mIHRoZSBhbGxvY2F0b3IuXG4gKlxuICogYG1lc3NhZ2VzYCBrZWVwcyBjYXJyeWluZyB0aGUgY29udmVyc2F0aW9uLiBUaGVzZSBmdW5jdGlvbnMgb25seSBldmVyIHRvdWNoXG4gKiB0aGUgd29ya2Zsb3cgYXhpczogaWRlbnRpdHksIHN0YXR1cywgb3duZXJzaGlwIGFuZCB0aGUgcmVzcG9uc2UgY2xvY2suXG4gKi9cblxuaW1wb3J0IHsgYW5kLCBhc2MsIGVxLCBndGUsIGluQXJyYXksIGlzTnVsbCwgbHRlLCBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRDYXNlIH0gZnJvbSAnLi4vZGF0YWJhc2Uvc2NoZW1hL3N1cHBvcnQuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFRlbmFudENvbnRleHQsIHdpdGhUZW5hbnRUeCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vKiogU3RhdHVzZXMgYSBjYXNlIGNhbiBiZSBpbi4gYGF3YWl0aW5nX2N1c3RvbWVyYCBpcyB3aGF0IHN0b3BzIHRoZSBjbG9jay4gKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JUX0NBU0VfU1RBVFVTRVMgPSBbJ29wZW4nLCAnYXdhaXRpbmdfc3VwcG9ydCcsICdhd2FpdGluZ19jdXN0b21lcicsICdyZXNvbHZlZCcsICdjbG9zZWQnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFN1cHBvcnRDYXNlU3RhdHVzID0gKHR5cGVvZiBTVVBQT1JUX0NBU0VfU1RBVFVTRVMpW251bWJlcl07XG5cbi8qKiBUaGUgc3RhdHVzZXMgdGhlIHN0YWZmIHF1ZXVlIGFza3MgYWJvdXQg4oCUIHRoZSBvbmVzIHN0aWxsIG9uIHVzLiAqL1xuZXhwb3J0IGNvbnN0IFFVRVVFX1NUQVRVU0VTOiByZWFkb25seSBTdXBwb3J0Q2FzZVN0YXR1c1tdID0gWydvcGVuJywgJ2F3YWl0aW5nX3N1cHBvcnQnXTtcblxuLyoqIFdoYXQgb3BlbmluZyBhIGNhc2UgbmVlZHMuIGBsZXZlbGAgaXMgZnJvemVuIG9udG8gdGhlIHJvdyBhdCBvcGVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuQ2FzZUlucHV0IHtcbiAgLyoqIFRoZSByb290IGBtZXNzYWdlcy5pZGAuIEJlY29tZXMgdGhlIGNhbm9uaWNhbCBjYXNlIGlkZW50aXR5LiAqL1xuICB0aHJlYWRJZDogc3RyaW5nO1xuICBvcmdJZDogc3RyaW5nO1xuICAvKiogVGhlIHN1cHBvcnQgbGV2ZWwgSEVMRCBBVCBPUEVOLCBmcm96ZW4gc28gYSBtaWQtY2FzZSBkb3duZ3JhZGUgY2Fubm90XG4gICAqICBjaGFuZ2UgdGhlIHByb21pc2UgdW5kZXJuZWF0aCBzb21lb25lIGFscmVhZHkgd2FpdGluZy4gKi9cbiAgbGV2ZWw6IHN0cmluZztcbiAgc2V2ZXJpdHk6IHN0cmluZztcbiAgLyoqIFRoZSBvcGVuZXIuIEFsc28gdGhlIGluaXRpYWwgdGVuYW50IG93bmVyIHdoZW4gdGhleSBhcmUgYSBjb250YWN0LiAqL1xuICBvcGVuZWRCeTogc3RyaW5nO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSBjYXNlIHdhcyBvcGVuZWQgYnkgc3BlbmRpbmcgYSBvbmUtdGltZSBpbmNpZGVudCByYXRoZXIgdGhhblxuICAgKiAgYWdhaW5zdCBhIGNvbnRhY3Qgc2VhdCwgc28gaW5jaWRlbnQgdXNhZ2UgaXMgYW5zd2VyYWJsZSBmcm9tIHRoZSBjYXNlc1xuICAgKiAgdGhlbXNlbHZlcyBhbmQgbm90IG9ubHkgZnJvbSBhIGJhbGFuY2UgZGVsdGEuICovXG4gIG9wZW5lZFdpdGhJbmNpZGVudD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBmaXJzdCByZXNwb25zZSBpcyBkdWUsIGFscmVhZHkgY29tcHV0ZWQgYnkgdGhlIGNhbGxlci5cbiAgICpcbiAgICogUGFzc2VkIElOIHJhdGhlciB0aGFuIGRlcml2ZWQgaGVyZTogdGhlIGJ1c2luZXNzIGNhbGVuZGFyIGlzIGRlcGxveW1lbnRcbiAgICogY29uZmlnIChgU1VQUE9SVF9CVVNJTkVTU19IT1VSU18qYCkgcmVhZCBieSBhcGktY29yZSdzIGByZXNwb25zZUR1ZUF0YCwgYW5kXG4gICAqIHRoaXMgbW9kdWxlIG11c3Qgbm90IHJlYWNoIGZvciBlbnYgdG8gYW5zd2VyIGEgcHJvZHVjdCBxdWVzdGlvbi4gTnVsbCBpcyBhXG4gICAqIGxlZ2l0aW1hdGUgdmFsdWUg4oCUIGEgbGV2ZWwgd2l0aCBubyBwdWJsaXNoZWQgdGFyZ2V0LCBvciBhIGNhbGVuZGFyIHRvb1xuICAgKiBicm9rZW4gdG8gZGVyaXZlIG9uZSDigJQgYW5kIGlzIHN0b3JlZCBhcyBcIm5vIGRlYWRsaW5lXCIgcmF0aGVyIHRoYW4gZ3Vlc3NlZC5cbiAgICovXG4gIHJlc3BvbnNlRHVlQXQ/OiBEYXRlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBBbGxvY2F0ZSB0aGUgbmV4dCBwZXItb3JnIGNhc2UgbnVtYmVyLlxuICpcbiAqIFBvc3RncmVzIHNlcXVlbmNlcyBhcmUgZ2xvYmFsIGFuZCBjYW5ub3QgYmUgcGVyLW9yZyB3aXRob3V0IG9uZSBzZXF1ZW5jZSBwZXJcbiAqIHRlbmFudCwgc28gdGhlIGNvdW50ZXIgaXMgYSByb3cuIGBVUERBVEUg4oCmIFJFVFVSTklOR2AgdGFrZXMgdGhlIHJvdyBsb2NrLFxuICogd2hpY2ggc2VyaWFsaXNlcyBjb25jdXJyZW50IG9wZW5zIFdJVEhJTiBvbmUgb3JnIHdoaWxlIGxlYXZpbmcgb3RoZXIgb3Jnc1xuICogdW50b3VjaGVkIOKAlCBhIGdsb2JhbCBzZXF1ZW5jZSB3b3VsZCBzZXJpYWxpc2UgZXZlcnlib2R5LCBhbmQgd291bGQgYWxzb1xuICogZGlzY2xvc2UgdG90YWwgY2FzZSB2b2x1bWUgdG8gZXZlcnkgY3VzdG9tZXIuXG4gKlxuICogVGhlIHVwc2VydCBzZWVkcyBgbmV4dF9udW1iZXIgPSAyYCBvbiBmaXJzdCB1c2UgYW5kIHJldHVybnMgMSwgc28gYW4gb3JnJ3NcbiAqIGZpcnN0IGNhc2UgaXMgYEFDTUUtMWAuIE11c3QgcnVuIGluc2lkZSB0aGUgc2FtZSB0cmFuc2FjdGlvbiBhcyB0aGUgY2FzZVxuICogaW5zZXJ0OiBhIGNvbW1pdHRlZCBhbGxvY2F0aW9uIHdpdGggYSByb2xsZWQtYmFjayBpbnNlcnQgYnVybnMgYSBudW1iZXIsIGFuZFxuICogYSBudW1iZXIgYnVybmVkIGlzIGEgZ2FwIGEgY3VzdG9tZXIgd2lsbCBldmVudHVhbGx5IGFzayBhYm91dC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWxsb2NhdGVEaXNwbGF5TnVtYmVyKHR4OiBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8dHlwZW9mIHdpdGhUZW5hbnRUeD5bMF0+WzBdLCBvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHR4XG4gICAgLmluc2VydChzY2hlbWEuc3VwcG9ydENhc2VDb3VudGVyKVxuICAgIC52YWx1ZXMoeyBvcmdJZCwgbmV4dE51bWJlcjogMiB9KVxuICAgIC5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgdGFyZ2V0OiBzY2hlbWEuc3VwcG9ydENhc2VDb3VudGVyLm9yZ0lkLFxuICAgICAgc2V0OiB7XG4gICAgICAgIG5leHROdW1iZXI6IHNxbGAke3NjaGVtYS5zdXBwb3J0Q2FzZUNvdW50ZXIubmV4dE51bWJlcn0gKyAxYCxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC5yZXR1cm5pbmcoeyBuZXh0OiBzY2hlbWEuc3VwcG9ydENhc2VDb3VudGVyLm5leHROdW1iZXIgfSk7XG4gIGNvbnN0IG5leHQgPSByb3dzWzBdPy5uZXh0O1xuICBpZiAobmV4dCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ3N1cHBvcnQgY2FzZSBudW1iZXIgYWxsb2NhdGlvbiByZXR1cm5lZCBubyByb3cnKTtcbiAgLy8gT24gSU5TRVJUIHRoZSByb3cgaXMgc2VlZGVkIGF0IDIgYW5kIHRoaXMgY2FzZSBpcyAxOyBvbiBVUERBVEUgdGhlIHN0b3JlZFxuICAvLyB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIGluY3JlbWVudGVkLCBzbyB0aGlzIGNhc2UgaXMgdGhlIHZhbHVlIG1pbnVzIG9uZS5cbiAgLy8gQm90aCBicmFuY2hlcyB0aGVyZWZvcmUgeWllbGQgXCJ0aGUgbnVtYmVyIGp1c3QgY29uc3VtZWRcIi5cbiAgcmV0dXJuIG5leHQgLSAxO1xufVxuXG4vKipcbiAqIE9wZW4gYSBjYXNlIGZvciBhbiBleGlzdGluZyB0aHJlYWQsIGFsbG9jYXRpbmcgaXRzIGRpc3BsYXkgbnVtYmVyLlxuICpcbiAqIE9uZSB0cmFuc2FjdGlvbiBvbiBwdXJwb3NlOiB0aGUgbnVtYmVyIGFuZCB0aGUgcm93IGNvbW1pdCB0b2dldGhlciBvciBuZWl0aGVyXG4gKiBkb2VzLiBgc3VwcG9ydF9jYXNlX29yZ19udW1iZXJfdXFgIGlzIHRoZSBiYWNrc3RvcCDigJQgaWYgdGhlIGFsbG9jYXRvciBpcyBldmVyXG4gKiBieXBhc3NlZCwgdGhlIGluc2VydCBmYWlscyByYXRoZXIgdGhhbiBpc3N1aW5nIHR3byBjYXNlcyB0aGUgb25lIGlkZW50aWZpZXJcbiAqIGN1c3RvbWVycyBxdW90ZSBiYWNrLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlblN1cHBvcnRDYXNlKGlucHV0OiBPcGVuQ2FzZUlucHV0KTogUHJvbWlzZTxTdXBwb3J0Q2FzZT4ge1xuICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgIGNvbnN0IGRpc3BsYXlOdW1iZXIgPSBhd2FpdCBhbGxvY2F0ZURpc3BsYXlOdW1iZXIodHgsIGlucHV0Lm9yZ0lkKTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdHhcbiAgICAgIC5pbnNlcnQoc2NoZW1hLnN1cHBvcnRDYXNlKVxuICAgICAgLnZhbHVlcyh7XG4gICAgICAgIHRocmVhZElkOiBpbnB1dC50aHJlYWRJZCxcbiAgICAgICAgb3JnSWQ6IGlucHV0Lm9yZ0lkLFxuICAgICAgICBkaXNwbGF5TnVtYmVyLFxuICAgICAgICBzdGF0dXM6ICdvcGVuJyxcbiAgICAgICAgc2V2ZXJpdHk6IGlucHV0LnNldmVyaXR5LFxuICAgICAgICBsZXZlbDogaW5wdXQubGV2ZWwsXG4gICAgICAgIG9wZW5lZFdpdGhJbmNpZGVudDogaW5wdXQub3BlbmVkV2l0aEluY2lkZW50ID8/IGZhbHNlLFxuICAgICAgICAvLyBGcm96ZW4gYXQgb3BlbiwgbGlrZSBgbGV2ZWxgOiBhIHdvcmtpbmctd2VlayBvciBob2xpZGF5IGNoYW5nZSBtdXN0XG4gICAgICAgIC8vIG5vdCBtb3ZlIGEgcHJvbWlzZSBhbHJlYWR5IG1hZGUuXG4gICAgICAgIHJlc3BvbnNlRHVlQXQ6IGlucHV0LnJlc3BvbnNlRHVlQXQgPz8gbnVsbCxcbiAgICAgICAgLy8gVGhlIG9wZW5lciBvd25zIGl0IG9uIHRoZSB0ZW5hbnQgc2lkZSB1bnRpbCBpdCBpcyBoYW5kZWQgb3Zlci5cbiAgICAgICAgdGVuYW50Q29udGFjdDogaW5wdXQub3BlbmVkQnksXG4gICAgICAgIGNyZWF0ZWRCeTogaW5wdXQub3BlbmVkQnksXG4gICAgICAgIHVwZGF0ZWRCeTogaW5wdXQub3BlbmVkQnksXG4gICAgICB9KVxuICAgICAgLnJldHVybmluZygpO1xuICAgIGNvbnN0IHJvdyA9IHJvd3NbMF07XG4gICAgaWYgKCFyb3cpIHRocm93IG5ldyBFcnJvcignc3VwcG9ydCBjYXNlIGluc2VydCByZXR1cm5lZCBubyByb3cnKTtcbiAgICByZXR1cm4gcm93O1xuICB9KTtcbn1cblxuLyoqIFRoZSBjYXNlIGZvciBhIHRocmVhZCwgb3IgbnVsbC4gVGhlIHRocmVhZCByb290IGlkIElTIHRoZSBjYXNlIGlkZW50aXR5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRDYXNlQnlUaHJlYWQodGhyZWFkSWQ6IHN0cmluZyk6IFByb21pc2U8U3VwcG9ydENhc2UgfCBudWxsPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC5zZWxlY3QoKVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5zdXBwb3J0Q2FzZS50aHJlYWRJZCwgdGhyZWFkSWQpLCBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlLmRlbGV0ZWRBdCkpKVxuICAgIC5saW1pdCgxKSk7XG4gIHJldHVybiByb3dzWzBdID8/IG51bGw7XG59XG5cbi8qKlxuICogVGhlIHN0YWZmIHF1ZXVlOiBvcGVuIGNhc2VzIGFjcm9zcyBBTEwgdGVuYW50cywgb2xkZXN0IGZpcnN0LlxuICpcbiAqIFRoZSBvbmUgcmVhZCB3aXRoIG5vIG9yZyBwcmVkaWNhdGUsIHNvIGl0IHJ1bnMgdW5kZXIgc3lzYWRtaW4gc2NvcGUgYW5kIGlzXG4gKiBzZXJ2ZWQgYnkgdGhlIHBhcnRpYWwgYHN1cHBvcnRfY2FzZV9xdWV1ZV9pZHhgLlxuICpcbiAqIE9yZGVyZWQgYnkgYHJlc3BvbnNlX2R1ZV9hdGAgQVNDRU5ESU5HLCBOVUxMUyBMQVNUIOKAlCBzb29uZXN0IGRlYWRsaW5lIGZpcnN0LFxuICogd2hpY2ggaXMgd2hhdCBcIm1vc3QgYXQgcmlza1wiIGFjdHVhbGx5IG1lYW5zLiBBcnJpdmFsIG9yZGVyIHdhcyB0aGUgZWFybGllclxuICogcHJveHkgZm9yIGl0IGFuZCBpcyBhIHBvb3Igb25lOiBhIHN0YW5kYXJkIGNhc2Ugb3BlbmVkIG9uIE1vbmRheSBpcyBvd2VkXG4gKiBXZWRuZXNkYXkncyBjbG9zZSB3aGlsZSBhIHByaW9yaXR5IGNhc2Ugb3BlbmVkIG9uIFR1ZXNkYXkgaXMgb3dlZCBXZWRuZXNkYXknc1xuICogY2xvc2UgdG9vLCBzbyBhcnJpdmFsIG9yZGVyIHB1dHMgdGhlbSBpbiB0aGUgd3Jvbmcgc2VxdWVuY2Ugd2hlbmV2ZXIgbGV2ZWxzXG4gKiBhcmUgbWl4ZWQuIENhc2VzIHdpdGggbm8gZGVhZGxpbmUgKGFuIHVucmVjb2duaXNlZCBsZXZlbCwgb3Igb25lIG9wZW5lZCB3aGlsZVxuICogdGhlIGNhbGVuZGFyIHdhcyBtaXNjb25maWd1cmVkKSBzb3J0IGxhc3QgcmF0aGVyIHRoYW4gZmlyc3QsIHNpbmNlIGEgbWlzc2luZ1xuICogZGVhZGxpbmUgaXMgbm90IGFuIHVyZ2VudCBvbmU7IGBjcmVhdGVkQXRgIGJyZWFrcyB0aWVzIHNvIHRoZSBvcmRlciBpcyBzdGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0UXVldWUobGltaXQgPSAxMDApOiBQcm9taXNlPFN1cHBvcnRDYXNlW10+IHtcbiAgcmV0dXJuIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnNlbGVjdCgpXG4gICAgLmZyb20oc2NoZW1hLnN1cHBvcnRDYXNlKVxuICAgIC53aGVyZShhbmQoXG4gICAgICBpbkFycmF5KHNjaGVtYS5zdXBwb3J0Q2FzZS5zdGF0dXMsIFsuLi5RVUVVRV9TVEFUVVNFU10pLFxuICAgICAgaXNOdWxsKHNjaGVtYS5zdXBwb3J0Q2FzZS5kZWxldGVkQXQpLFxuICAgICkpXG4gICAgLm9yZGVyQnkoc3FsYCR7c2NoZW1hLnN1cHBvcnRDYXNlLnJlc3BvbnNlRHVlQXR9IEFTQyBOVUxMUyBMQVNUYCwgYXNjKHNjaGVtYS5zdXBwb3J0Q2FzZS5jcmVhdGVkQXQpKVxuICAgIC5saW1pdChsaW1pdCkpO1xufVxuXG4vKipcbiAqIFByZW1pdW0gY2FzZXMgd2hvc2UgcmVzcG9uc2UgdGFyZ2V0IGlzIGFwcHJvYWNoaW5nIHdpdGggbm8gZmlyc3QgcmVzcG9uc2UgeWV0LlxuICpcbiAqIFRIRSBvbi1jYWxsIHN3ZWVwJ3Mgb25seSBxdWVyeSwgYW5kIHRoZSByZWFzb24gdGhlIHBhZ2VyIGlzIHdvcnRoIG93bmluZyB0aGVcbiAqIHRyaWdnZXIgZm9yOiB0aGlzIGlzIGFuIEVYQUNUIHBlci1jYXNlIGRlYWRsaW5lLCB3aGVyZSB0aGUgZmxlZXQgYWxlcnRcbiAqIChgU3VwcG9ydFByZW1pdW1GaXJzdFJlc3BvbnNlQXRSaXNrYCkgaXMgYSBwOTAgb3ZlciBzaXggaG91cnMgdGhhdCBjYW4gb25seVxuICogc2F5IHRoZSBkaXN0cmlidXRpb24gYWxyZWFkeSBkcmlmdGVkIOKAlCBuZXZlciB3aGljaCBjYXNlIGlzIGFib3V0IHRvIGJyZWFjaC5cbiAqXG4gKiBUaGUgcHJlZGljYXRlIG1hdGNoZXMgYHN1cHBvcnRfY2FzZV9yZXNwb25zZV9kdWVfaWR4YCBleGFjdGx5LCB3aGljaCBpcyBhXG4gKiBQQVJUSUFMIGluZGV4IG9uIGAocmVzcG9uc2VfZHVlX2F0KSBXSEVSRSBsZXZlbCA9ICdzdXBwb3J0X3ByZW1pdW0nIEFORFxuICogZmlyc3RfcmVzcG9uc2VfYXQgSVMgTlVMTCBBTkQgZGVsZXRlZF9hdCBJUyBOVUxMYC4gTm90ZSBgbGV2ZWxgIGFuZCBub3RcbiAqIGBpc19wcmVtaXVtYDogdGhhdCBjb2x1bW4gbGl2ZXMgb24gc3VwcG9ydF9DT05UQUNUUyBhbmQgbWFya3MgYW4gdXBncmFkZWRcbiAqIGNvbnRhY3QsIHdoaWxlIGEgY2FzZSBmcmVlemVzIHRoZSBvcGVuaW5nIGNvbnRhY3QncyBlZmZlY3RpdmUgbGV2ZWwgYXQgb3BlbiDigJRcbiAqIHNvIHRoZSBjYXNlJ3Mgb3duIHByb21pc2UgaXMgaXRzIGBsZXZlbGAsIGFuZCBmbGlwcGluZyB0aGUgY29udGFjdCBsYXRlciBtdXN0XG4gKiBub3QgY2hhbmdlIGEgZGVhZGxpbmUgYWxyZWFkeSBwdWJsaXNoZWQgdG8gYSBjdXN0b21lci4gVGhhdCBtYXR0ZXJzIGJlY2F1c2UgdGhpcyBydW5zIG9uIGEgdGltZXJcbiAqIGZvcmV2ZXI6IHRoZSByb3dzIGl0IHdhbnRzIGFyZSBhIHRpbnkgYW5kIHNocmlua2luZyBmcmFjdGlvbiBvZiB0aGUgdGFibGUsIHNvXG4gKiB0aGUgaW5kZXggc3RheXMgc21hbGwgd2hpbGUgdGhlIHRhYmxlIGdyb3dzLCBhbmQgd2l0aG91dCBpdCBldmVyeSB0aWNrIGlzIGFcbiAqIHNjYW4uXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBmaWx0ZXJlZCBvbiBzdGF0dXMuIEEgY2FzZSB0aGF0IGlzIGBhd2FpdGluZ19zdXBwb3J0YCBhbmQgb25lXG4gKiB0aGF0IGlzIGBvcGVuYCBib3RoIG93ZSBhIGZpcnN0IHJlc3BvbnNlLCBhbmQgcmVhZGluZyB0aGUgc3RhdHVzIGhlcmUgd291bGRcbiAqIGR1cGxpY2F0ZSBhIHJ1bGUgdGhhdCBgZmlyc3RfcmVzcG9uc2VfYXQgSVMgTlVMTGAgYWxyZWFkeSBzdGF0ZXMgZXhhY3RseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RDYXNlc0R1ZUZvclBhZ2UobGVhZE1zOiBudW1iZXIsIGxpbWl0ID0gMTAwKTogUHJvbWlzZTxTdXBwb3J0Q2FzZVtdPiB7XG4gIGNvbnN0IGN1dG9mZiA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBsZWFkTXMpO1xuICAvLyBUSElTIEZVTkNUSU9OIElTIFRIRSBQUklWSUxFR0UgQk9VTkRBUlksIHNvIHRoZSBzY29wZSBpcyBlc3RhYmxpc2hlZCBoZXJlXG4gIC8vIHJhdGhlciB0aGFuIGxlZnQgdG8gdGhlIGNhbGxlci4gVGhlIHN3ZWVwIHJ1bnMgb24gYSB0aW1lciB3aXRoIG5vIHJlcXVlc3RcbiAgLy8gYW5kIHRoZXJlZm9yZSBubyB0ZW5hbnQgY29udGV4dCwgYW5kIGBzdXBwb3J0X2Nhc2VzYCBpcyBSTFMgRk9SQ0UnZCDigJQgc29cbiAgLy8gd2l0aG91dCBhIHNjb3BlIHRoZSByZWFkIHJldHVybnMgemVybyByb3dzIChhbmQgdGhyb3dzIGluIHByb2R1Y3Rpb25cbiAgLy8gYHN0cmljdGAgbW9kZSksIHdoaWNoIGlzIHRoZSBzaGFwZSBvZiBhIHN3ZWVwIHRoYXQgc2lsZW50bHkgY292ZXJzIG5vdGhpbmcuXG4gIC8vIENyb3NzLXRlbmFudCBpcyB0aGUgcG9pbnQ6IG9uZSBvcGVyYXRvciByb3RhIGFuc3dlcnMgZm9yIGV2ZXJ5IG9yZydzXG4gIC8vIHByZW1pdW0gY2FzZXMuIE9ubHkgSURTIGxlYXZlIGhlcmU7IHRoZSBwYWdlciBuZXZlciByZWNlaXZlcyBjYXNlIGNvbnRlbnQuXG4gIHJldHVybiBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC5zZWxlY3QoKVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDYXNlLmxldmVsLCAnc3VwcG9ydF9wcmVtaXVtJyksXG4gICAgICBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlLmZpcnN0UmVzcG9uc2VBdCksXG4gICAgICBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlLmRlbGV0ZWRBdCksXG4gICAgICBsdGUoc2NoZW1hLnN1cHBvcnRDYXNlLnJlc3BvbnNlRHVlQXQsIGN1dG9mZiksXG4gICAgKSlcbiAgICAub3JkZXJCeShhc2Moc2NoZW1hLnN1cHBvcnRDYXNlLnJlc3BvbnNlRHVlQXQpKVxuICAgIC5saW1pdChsaW1pdCkpKTtcbn1cblxuLyoqIEFuIG9yZydzIG93biBjYXNlcywgbmV3ZXN0IGZpcnN0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RPcmdDYXNlcyhvcmdJZDogc3RyaW5nLCBsaW1pdCA9IDEwMCk6IFByb21pc2U8U3VwcG9ydENhc2VbXT4ge1xuICByZXR1cm4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAuc2VsZWN0KClcbiAgICAuZnJvbShzY2hlbWEuc3VwcG9ydENhc2UpXG4gICAgLndoZXJlKGFuZChlcShzY2hlbWEuc3VwcG9ydENhc2Uub3JnSWQsIG9yZ0lkKSwgaXNOdWxsKHNjaGVtYS5zdXBwb3J0Q2FzZS5kZWxldGVkQXQpKSlcbiAgICAub3JkZXJCeShzcWxgJHtzY2hlbWEuc3VwcG9ydENhc2UuY3JlYXRlZEF0fSBERVNDYClcbiAgICAubGltaXQobGltaXQpKTtcbn1cblxuLyoqXG4gKiBTdGFtcCB0aGUgZmlyc3Qgc3RhZmYgcmVzcG9uc2UsIG9uY2UuXG4gKlxuICogYGZpcnN0X3Jlc3BvbnNlX2F0IElTIE5VTExgIGlzIGluIHRoZSBXSEVSRSBjbGF1c2UgcmF0aGVyIHRoYW4gY2hlY2tlZCBieSB0aGVcbiAqIGNhbGxlcjogdGhpcyBpcyBUSEUgbnVtYmVyIHRoZSByZXNwb25zZSB0YXJnZXQgaXMgc29sZCBvbiwgc28gYSBzZWNvbmQgcmVwbHlcbiAqIG11c3Qgbm90IGJlIGFibGUgdG8gbW92ZSBpdC4gUmV0dXJucyB3aGV0aGVyIHRoaXMgY2FsbCB3YXMgdGhlIG9uZSB0aGF0XG4gKiBzdGFtcGVkIGl0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhbXBGaXJzdFJlc3BvbnNlKGNhc2VJZDogc3RyaW5nLCBhdDogRGF0ZSA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnVwZGF0ZShzY2hlbWEuc3VwcG9ydENhc2UpXG4gICAgLnNldCh7IGZpcnN0UmVzcG9uc2VBdDogYXQsIHVwZGF0ZWRBdDogYXQgfSlcbiAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5zdXBwb3J0Q2FzZS5pZCwgY2FzZUlkKSwgaXNOdWxsKHNjaGVtYS5zdXBwb3J0Q2FzZS5maXJzdFJlc3BvbnNlQXQpKSlcbiAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5zdXBwb3J0Q2FzZS5pZCB9KSk7XG4gIHJldHVybiByb3dzLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogTW92ZSBhIGNhc2UncyBzdGF0dXMsIG1haW50YWluaW5nIHRoZSByZXNwb25zZSBjbG9jay5cbiAqXG4gKiBFbnRlcmluZyBgYXdhaXRpbmdfY3VzdG9tZXJgIGFuY2hvcnMgYGF3YWl0aW5nU2luY2VgOyBsZWF2aW5nIGl0IGZvbGRzIHRoZVxuICogZWxhcHNlZCBzcGFuIGludG8gYGF3YWl0aW5nVG90YWxTZWNvbmRzYCBhbmQgY2xlYXJzIHRoZSBhbmNob3IuIEFnZWluZyB0aGVuXG4gKiBzdWJ0cmFjdHMgdGhlIGFjY3VtdWxhdG9yLCBzbyBhIGNhc2Ugd2UgYW5zd2VyZWQgaW4gYW4gaG91ciBhbmQgdGhlIHRlbmFudFxuICogcmVwbGllZCB0byBmb3VyIGRheXMgbGF0ZXIgZG9lcyBub3QgcmVhZCBhcyBhIGZvdXItZGF5IGNhc2Ug4oCUIHdoaWNoIGlzIHRoZVxuICogbnVtYmVyIG5vIGN1c3RvbWVyIHdvdWxkIGFjY2VwdC5cbiAqXG4gKiBUaGUgYXJpdGhtZXRpYyBpcyBkb25lIGluIFNRTCBhZ2FpbnN0IHRoZSBzdG9yZWQgYW5jaG9yIHJhdGhlciB0aGFuIGZyb20gYVxuICogY2FsbGVyLXN1cHBsaWVkIGR1cmF0aW9uLCBzbyBhIGNsb2NrIHNrZXcgb3IgYSBsb3N0IHJvdW5kIHRyaXAgY2Fubm90IGluZmxhdGVcbiAqIG9yIGVyYXNlIHBhdXNlZCB0aW1lLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0Q2FzZVN0YXR1cyhcbiAgY2FzZUlkOiBzdHJpbmcsXG4gIHN0YXR1czogU3VwcG9ydENhc2VTdGF0dXMsXG4gIGFjdG9ySWQ6IHN0cmluZyxcbik6IFByb21pc2U8U3VwcG9ydENhc2UgfCBudWxsPiB7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGVudGVyaW5nID0gc3RhdHVzID09PSAnYXdhaXRpbmdfY3VzdG9tZXInO1xuICBjb25zdCBjbG9zaW5nID0gc3RhdHVzID09PSAnY2xvc2VkJyB8fCBzdGF0dXMgPT09ICdyZXNvbHZlZCc7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC51cGRhdGUoc2NoZW1hLnN1cHBvcnRDYXNlKVxuICAgIC5zZXQoe1xuICAgICAgc3RhdHVzLFxuICAgICAgdXBkYXRlZEJ5OiBhY3RvcklkLFxuICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAvLyBBbmNob3Igb24gZW50cnk7IG9uIGFueSBvdGhlciB0cmFuc2l0aW9uIGZvbGQgdGhlIG9wZW4gc3BhbiBpbiBhbmQgY2xlYXIuXG4gICAgICBhd2FpdGluZ1NpbmNlOiBlbnRlcmluZyA/IG5vdyA6IG51bGwsXG4gICAgICBhd2FpdGluZ1RvdGFsU2Vjb25kczogZW50ZXJpbmdcbiAgICAgICAgPyBzY2hlbWEuc3VwcG9ydENhc2UuYXdhaXRpbmdUb3RhbFNlY29uZHNcbiAgICAgICAgOiBzcWxgJHtzY2hlbWEuc3VwcG9ydENhc2UuYXdhaXRpbmdUb3RhbFNlY29uZHN9ICsgQ09BTEVTQ0UoRVhUUkFDVChFUE9DSCBGUk9NICgke25vdy50b0lTT1N0cmluZygpfTo6dGltZXN0YW1wdHogLSAke3NjaGVtYS5zdXBwb3J0Q2FzZS5hd2FpdGluZ1NpbmNlfSkpOjppbnQsIDApYCxcbiAgICAgIC4uLihjbG9zaW5nID8geyBjbG9zZWRBdDogbm93LCBjbG9zZWRCeTogYWN0b3JJZCB9IDogeyBjbG9zZWRBdDogbnVsbCwgY2xvc2VkQnk6IG51bGwgfSksXG4gICAgfSlcbiAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5zdXBwb3J0Q2FzZS5pZCwgY2FzZUlkKSwgaXNOdWxsKHNjaGVtYS5zdXBwb3J0Q2FzZS5kZWxldGVkQXQpKSlcbiAgICAucmV0dXJuaW5nKCkpO1xuICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xufVxuXG4vKipcbiAqIFJlLXJhbmsgYSBjYXNlJ3Mgc2V2ZXJpdHkuXG4gKlxuICogU1RBRkYgT05MWSBhdCB0aGUgcm91dGUgbGF5ZXIsIGFuZCB0aGF0IGlzIHRoZSBnb3Zlcm5hbmNlIHBvaW50IHJhdGhlciB0aGFuIGFcbiAqIHBlcm1pc3Npb24gZGV0YWlsOiB0aGUgdGVuYW50IGNob29zZXMgc2V2ZXJpdHkgd2hlbiBvcGVuaW5nLCBzbyBpZiB0aGV5IGNvdWxkXG4gKiBhbHNvIGNoYW5nZSBpdCBhZnRlcndhcmRzIHRoZXkgd291bGQgdW5pbGF0ZXJhbGx5IHBpY2sgdGhlIHJlc3BvbnNlIHRhcmdldFxuICogdGhleSBhcmUgb3dlZC4gU2V2ZXJpdHkgZGVjaWRlcyB3aGljaCB0YXJnZXQgYXBwbGllcywgc28gcmUtcmFua2luZyBoYXMgdG8gYmVcbiAqIG91cnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRDYXNlU2V2ZXJpdHkoY2FzZUlkOiBzdHJpbmcsIHNldmVyaXR5OiBzdHJpbmcsIGFjdG9ySWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAudXBkYXRlKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAuc2V0KHsgc2V2ZXJpdHksIHVwZGF0ZWRCeTogYWN0b3JJZCwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgLndoZXJlKGFuZChlcShzY2hlbWEuc3VwcG9ydENhc2UuaWQsIGNhc2VJZCksIGlzTnVsbChzY2hlbWEuc3VwcG9ydENhc2UuZGVsZXRlZEF0KSkpXG4gICAgLnJldHVybmluZyh7IHNldmVyaXR5OiBzY2hlbWEuc3VwcG9ydENhc2Uuc2V2ZXJpdHkgfSkpO1xuICByZXR1cm4gcm93c1swXT8uc2V2ZXJpdHkgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBTZXQgb3IgY2xlYXIgdGhlIFNUQUZGIG93bmVyLlxuICpcbiAqIGBudWxsYCBpcyBhIGxlZ2l0aW1hdGUgdmFsdWU6IGl0IGlzIHRoZSB1bm93bmVkIHBvb2wsIGFuZCBob3cgXCJJIGNhbm5vdCB0YWtlXG4gKiB0aGlzXCIgaXMgZXhwcmVzc2VkIHdpdGhvdXQgaW52ZW50aW5nIGEgcHNldWRvLWFzc2lnbmVlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzaWduQ2FzZShjYXNlSWQ6IHN0cmluZywgYXNzaWduZWRUbzogc3RyaW5nIHwgbnVsbCwgYWN0b3JJZDogc3RyaW5nKTogUHJvbWlzZTxTdXBwb3J0Q2FzZSB8IG51bGw+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnVwZGF0ZShzY2hlbWEuc3VwcG9ydENhc2UpXG4gICAgLnNldCh7IGFzc2lnbmVkVG8sIHVwZGF0ZWRCeTogYWN0b3JJZCwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgLndoZXJlKGFuZChlcShzY2hlbWEuc3VwcG9ydENhc2UuaWQsIGNhc2VJZCksIGlzTnVsbChzY2hlbWEuc3VwcG9ydENhc2UuZGVsZXRlZEF0KSkpXG4gICAgLnJldHVybmluZygpKTtcbiAgcmV0dXJuIHJvd3NbMF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBBc3NpZ24gb3IgcmVsZWFzZSBNQU5ZIGNhc2VzIGF0IG9uY2UuXG4gKlxuICogT25lIHN0YXRlbWVudCByYXRoZXIgdGhhbiBhIGxvb3AsIHdoaWNoIGlzIHRoZSBwb2ludDogYSBzdGFmZiBtZW1iZXIgY2xlYXJpbmdcbiAqIGEgcXVldWUgb2YgdGhpcnR5IHNlbGVjdHMgdGhpcnR5IGFuZCBhY3RzIG9uY2UsIGFuZCB0aGlydHkgcm91bmQgdHJpcHMgd291bGRcbiAqIG1ha2UgdGhlIG9idmlvdXMgaW50ZXJhY3Rpb24gdGhlIHNsb3cgb25lLiBJdCBhbHNvIG1ha2VzIHRoZSB3cml0ZSBBVE9NSUMg4oCUIGFcbiAqIHBhcnRpYWwgYnVsayBhc3NpZ24gbGVhdmVzIHRoZSBxdWV1ZSBpbiBhIHN0YXRlIG5vYm9keSBjaG9zZSwgYW5kIHRoZSBvcGVyYXRvclxuICogY2Fubm90IHRlbGwgd2hpY2ggaGFsZiB0b29rLlxuICpcbiAqIFJldHVybnMgdGhlIGlkcyB0aGF0IGFjdHVhbGx5IG1vdmVkIHJhdGhlciB0aGFuIGEgY291bnQsIHNvIGEgY2FsbGVyIGNhblxuICogcmVwb3J0IHByZWNpc2VseSB3aGF0IGhhcHBlbmVkIHdoZW4gdGhlIHNlbGVjdGlvbiBpbmNsdWRlZCBzb21ldGhpbmcgc3RhbGU6XG4gKiBhIGNhc2UgY2xvc2VkIG9yIHJlYXNzaWduZWQgYnkgc29tZWJvZHkgZWxzZSBiZXR3ZWVuIHRoZSByZWFkIGFuZCB0aGUgY2xpY2suXG4gKiBUaGF0IGlzIHRoZSBub3JtYWwgY2FzZSBvbiBhIHNoYXJlZCBxdWV1ZSwgbm90IGFuIGVkZ2Ugb25lLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzaWduQ2FzZXMoXG4gIGNhc2VJZHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBhc3NpZ25lZFRvOiBzdHJpbmcgfCBudWxsLFxuICBhY3RvcklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmIChjYXNlSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAudXBkYXRlKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAuc2V0KHsgYXNzaWduZWRUbywgdXBkYXRlZEJ5OiBhY3RvcklkLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgaW5BcnJheShzY2hlbWEuc3VwcG9ydENhc2UuaWQsIFsuLi5jYXNlSWRzXSksXG4gICAgICBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlLmRlbGV0ZWRBdCksXG4gICAgKSlcbiAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5zdXBwb3J0Q2FzZS5pZCB9KSk7XG4gIHJldHVybiByb3dzLm1hcCgocikgPT4gci5pZCk7XG59XG5cbi8qKlxuICogQ2xvc2UgTUFOWSBjYXNlcyBhdCBvbmNlLlxuICpcbiAqIFNlcGFyYXRlIGZyb20ge0BsaW5rIGFzc2lnbkNhc2VzfSByYXRoZXIgdGhhbiBhIGdlbmVyaWMgYnVsay11cGRhdGUsIGJlY2F1c2VcbiAqIGNsb3NpbmcgbWFpbnRhaW5zIHRoZSByZXNwb25zZSBjbG9jayDigJQgaXQgZm9sZHMgdGhlIG9wZW4gYXdhaXRpbmcgc3BhbiBpbnRvXG4gKiB0aGUgYWNjdW11bGF0b3IgYW5kIHN0YW1wcyBgY2xvc2VkQXRgIOKAlCBhbmQgYSBnZW5lcmljIHNldHRlciB3b3VsZCBxdWlldGx5XG4gKiBza2lwIHRoYXQuIFRoZSBhcml0aG1ldGljIGlzIHRoZSBzYW1lIFNRTCBgc2V0Q2FzZVN0YXR1c2AgdXNlcywgZm9yIHRoZSBzYW1lXG4gKiByZWFzb246IGRvbmUgYWdhaW5zdCB0aGUgU1RPUkVEIGFuY2hvciBzbyBhIGNsb2NrIHNrZXcgY2Fubm90IGluZmxhdGUgcGF1c2VkXG4gKiB0aW1lLlxuICpcbiAqIE9ubHkgZXZlciB1c2VkIHRvIENMT1NFLiBCdWxrIFJFT1BFTklORyBpcyBkZWxpYmVyYXRlbHkgbm90IG9mZmVyZWQ6IHJlb3BlbmluZ1xuICogaXMgc3RhZmYtb25seSBhbmQgY2FzZS1ieS1jYXNlIGJ5IGRlc2lnbiwgYW5kIGEgYnVsayByZW9wZW4gaXMgaG93IGEgcXVldWVcbiAqIHNvbWVvbmUgaGFzIGZpbmlzaGVkIHdpdGggY29tZXMgYmFjayBhbGwgYXQgb25jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQ2FzZXMoY2FzZUlkczogcmVhZG9ubHkgc3RyaW5nW10sIGFjdG9ySWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKGNhc2VJZHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC51cGRhdGUoc2NoZW1hLnN1cHBvcnRDYXNlKVxuICAgIC5zZXQoe1xuICAgICAgc3RhdHVzOiAnY2xvc2VkJyxcbiAgICAgIGNsb3NlZEF0OiBub3csXG4gICAgICBjbG9zZWRCeTogYWN0b3JJZCxcbiAgICAgIHVwZGF0ZWRCeTogYWN0b3JJZCxcbiAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgYXdhaXRpbmdTaW5jZTogbnVsbCxcbiAgICAgIGF3YWl0aW5nVG90YWxTZWNvbmRzOiBzcWxgJHtzY2hlbWEuc3VwcG9ydENhc2UuYXdhaXRpbmdUb3RhbFNlY29uZHN9ICsgQ09BTEVTQ0UoRVhUUkFDVChFUE9DSCBGUk9NICgke25vdy50b0lTT1N0cmluZygpfTo6dGltZXN0YW1wdHogLSAke3NjaGVtYS5zdXBwb3J0Q2FzZS5hd2FpdGluZ1NpbmNlfSkpOjppbnQsIDApYCxcbiAgICB9KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBpbkFycmF5KHNjaGVtYS5zdXBwb3J0Q2FzZS5pZCwgWy4uLmNhc2VJZHNdKSxcbiAgICAgIGlzTnVsbChzY2hlbWEuc3VwcG9ydENhc2UuZGVsZXRlZEF0KSxcbiAgICAgIC8vIEFscmVhZHktY2xvc2VkIGNhc2VzIGFyZSBza2lwcGVkIHJhdGhlciB0aGFuIHJlLXN0YW1wZWQsIHNvIGEgYnVsa1xuICAgICAgLy8gY2xvc2Ugb3ZlciBhIHNlbGVjdGlvbiB0aGF0IGluY2x1ZGVzIG9uZSBkb2VzIG5vdCBtb3ZlIGl0cyBjbG9zZWRBdC5cbiAgICAgIHNxbGAke3NjaGVtYS5zdXBwb3J0Q2FzZS5zdGF0dXN9IDw+ICdjbG9zZWQnYCxcbiAgICApKVxuICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnN1cHBvcnRDYXNlLmlkIH0pKTtcbiAgcmV0dXJuIHJvd3MubWFwKChyKSA9PiByLmlkKTtcbn1cblxuLyoqXG4gKiBIYW5kIHRoZSBjYXNlIHRvIGFub3RoZXIgdGVuYW50IGNvbnRhY3QuXG4gKlxuICogTm90ZSB3aGF0IHRoaXMgZG9lcyBOT1QgdG91Y2g6IGBjcmVhdGVkQnlgLiBUaGF0IGlzIHRoZSBpbW11dGFibGUgYXVkaXQgZmFjdFxuICogb2Ygd2hvIHJhaXNlZCB0aGUgY2FzZSDigJQgbXV0YXRpbmcgaXQgdG8gZXhwcmVzcyBcInNvbWVvbmUgZWxzZSBvd25zIHRoaXMgbm93XCJcbiAqIHdvdWxkIGRlc3Ryb3kgdGhlIG9ubHkgcmVjb3JkIG9mIHdobyBhY3R1YWxseSBvcGVuZWQgaXQuIFRoZSBjYWxsZXIgbXVzdCBoYXZlXG4gKiBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgdGFyZ2V0IGlzIGEgbGl2ZSBkZXNpZ25hdGVkIGNvbnRhY3Q7IHRoaXMgZnVuY3Rpb25cbiAqIHdpbGwgbm90IGluZmVyIGVudGl0bGVtZW50IGZyb20gYSB1c2VyIGlkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNmZXJDYXNlVG9Db250YWN0KGNhc2VJZDogc3RyaW5nLCB0ZW5hbnRDb250YWN0OiBzdHJpbmcsIGFjdG9ySWQ6IHN0cmluZyk6IFByb21pc2U8U3VwcG9ydENhc2UgfCBudWxsPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC51cGRhdGUoc2NoZW1hLnN1cHBvcnRDYXNlKVxuICAgIC5zZXQoeyB0ZW5hbnRDb250YWN0LCB1cGRhdGVkQnk6IGFjdG9ySWQsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnN1cHBvcnRDYXNlLmlkLCBjYXNlSWQpLCBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlLmRlbGV0ZWRBdCkpKVxuICAgIC5yZXR1cm5pbmcoKSk7XG4gIHJldHVybiByb3dzWzBdID8/IG51bGw7XG59XG5cbi8qKlxuICogQSBkZXBhcnRpbmcgY29udGFjdCdzIG9wZW4gY2FzZXMsIHNvIHJlbW92YWwgcmVhc3NpZ25zIHJhdGhlciB0aGFuIG9ycGhhbnMuXG4gKlxuICogU2VydmVkIGJ5IHRoZSBwYXJ0aWFsIGBzdXBwb3J0X2Nhc2VfdGVuYW50X2NvbnRhY3RfaWR4YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5DYXNlc0ZvckNvbnRhY3Qob3JnSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFN1cHBvcnRDYXNlW10+IHtcbiAgcmV0dXJuIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnNlbGVjdCgpXG4gICAgLmZyb20oc2NoZW1hLnN1cHBvcnRDYXNlKVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENhc2Uub3JnSWQsIG9yZ0lkKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q2FzZS50ZW5hbnRDb250YWN0LCB1c2VySWQpLFxuICAgICAgaW5BcnJheShzY2hlbWEuc3VwcG9ydENhc2Uuc3RhdHVzLCBbJ29wZW4nLCAnYXdhaXRpbmdfc3VwcG9ydCcsICdhd2FpdGluZ19jdXN0b21lciddKSxcbiAgICAgIGlzTnVsbChzY2hlbWEuc3VwcG9ydENhc2UuZGVsZXRlZEF0KSxcbiAgICApKSk7XG59XG5cbi8qKlxuICogQ2FzZXMgcmFpc2VkIGFjcm9zcyBhIHNjb3BlIHdpdGhpbiB0aGUgbGFzdCBgd2luZG93RGF5c2Ag4oCUIHRoZSBGQUlSLVVTRSBjb3VudC5cbiAqXG4gKiBXSEFUIElUIElTIEZPUi4gU3VwcG9ydCBpcyBwcmljZWQgcGVyIENPTlRBQ1QsIGFuZCB0aGF0IHVuaXQgYXNzdW1lcyBjb250YWN0c1xuICogcHJveHkgZm9yIGNhc2Ugdm9sdW1lLiBBdCB0ZW4gc2VhdHMgdGhleSBkbzsgYXQgYSBodW5kcmVkIHRoZXkgZG8gbm90IOKAlCB0aHJlZVxuICogbmFtZWQgY29udGFjdHMgYmVjb21lIGFuIGludGVybmFsIGhlbHAgZGVzayBGT1JXQVJESU5HIHRpY2tldHMsIHNvIHRoZSBwcmljZVxuICogYnV5cyB0aGUgaW50ZXJmYWNlIHJhdGhlciB0aGFuIHRoZSBsb2FkLiBUaGlzIGlzIHRoZSBtZWFzdXJlbWVudCB0aGF0IG5vdGljZXMuXG4gKlxuICogV0hZIE5PVCBUSEUgUVVPVEEgU0VSVklDRS4gYFFVT1RBX1JFU0VUX0RBWVNgIG1ha2VzIGV2ZXJ5IHRyYWNrZWQgcXVvdGEgYVxuICogMy1kYXkgcGVyaW9kLCBhbmQgYSBzdXBwb3J0IGFsbG93YW5jZSBpcyBtb250aGx5LXNoYXBlZDogZml2ZSBhIG1vbnRoIGRvZXMgbm90XG4gKiBkaXZpZGUgaW50byB0aHJlZSBkYXlzIHdpdGhvdXQgcm91bmRpbmcgdG8gc29tZXRoaW5nIGVpdGhlciBmYXIgdG9vIGxvb3NlIG9yXG4gKiB1c2VsZXNzLiBUaGlzIHRhYmxlIElTIHRoZSBjb3VudGVyIOKAlCBvbmUgcmFuZ2Ugc2NhbiBvblxuICogYHN1cHBvcnRfY2FzZV9vcmdfY3JlYXRlZF9pZHhgLCBubyBwZXJpb2QgbWlzbWF0Y2gsIGFuZCBub3RoaW5nIHRvIGRyaWZ0IG91dFxuICogb2Ygc3luYyB3aXRoIHJlYWxpdHkuXG4gKlxuICogQ09VTlRTIEVWRVJZIENBU0UsIElOQ0xVRElORyBDTE9TRUQgQU5EIFNPRlQtREVMRVRFRC4gVGhlIHF1ZXN0aW9uIGlzIGhvdyBtdWNoXG4gKiBzdXBwb3J0IHdhcyBDT05TVU1FRCBpbiB0aGUgd2luZG93LCBhbmQgYSBjYXNlIHRoYXQgd2FzIGFuc3dlcmVkIGFuZCBjbG9zZWRcbiAqIGNvbnN1bWVkIGl0IGp1c3QgYXMgbXVjaCBhcyBhbiBvcGVuIG9uZS4gRXhjbHVkaW5nIGNsb3NlZCBjYXNlcyB3b3VsZCBtYWtlIHRoZVxuICogYWxsb3dhbmNlIHRyaXZpYWxseSBldmFkYWJsZSBieSBjbG9zaW5nIHByb21wdGx5IOKAlCB0aGUgb3Bwb3NpdGUgb2YgdGhlXG4gKiBiZWhhdmlvdXIgYW55b25lIHdhbnRzIHRvIGRpc2NvdXJhZ2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3VudENhc2VzSW5XaW5kb3cob3JnSWRzOiByZWFkb25seSBzdHJpbmdbXSwgd2luZG93RGF5czogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKG9yZ0lkcy5sZW5ndGggPT09IDAgfHwgd2luZG93RGF5cyA8PSAwKSByZXR1cm4gMDtcbiAgY29uc3Qgc2luY2UgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gd2luZG93RGF5cyAqIDg2NDAwXzAwMCk7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC5zZWxlY3QoeyBuOiBzcWw8bnVtYmVyPmBjb3VudCgqKTo6aW50YCB9KVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgaW5BcnJheShzY2hlbWEuc3VwcG9ydENhc2Uub3JnSWQsIFsuLi5vcmdJZHNdKSxcbiAgICAgIGd0ZShzY2hlbWEuc3VwcG9ydENhc2UuY3JlYXRlZEF0LCBzaW5jZSksXG4gICAgKSkpO1xuICByZXR1cm4gcm93c1swXT8ubiA/PyAwO1xufVxuXG4vKipcbiAqIFJlY29yZCB0aGUgY3VzdG9tZXIncyB2ZXJkaWN0IG9uIGEgY2FzZS5cbiAqXG4gKiBPTkxZIE9OIEEgVEVSTUlOQUwgQ0FTRSwgZW5mb3JjZWQgaW4gdGhlIFdIRVJFIGNsYXVzZSByYXRoZXIgdGhhbiBieSB0aGVcbiAqIGNhbGxlcjogcmF0aW5nIGEgY2FzZSBzdGlsbCBiZWluZyB3b3JrZWQgd291bGQgbWVhc3VyZSBhbiBhbnN3ZXIgbm9ib2R5IGhhc1xuICogZmluaXNoZWQgZ2l2aW5nLCBhbmQgcHV0dGluZyB0aGUgY29uZGl0aW9uIGluIFNRTCBtZWFucyBubyByb3V0ZSBjYW4gZm9yZ2V0XG4gKiBpdC5cbiAqXG4gKiBSRS1SQVRFQUJMRSBvbiBwdXJwb3NlLiBBIGN1c3RvbWVyIHdobyByYXRlcyBpbiBmcnVzdHJhdGlvbiBhbmQgY29tZXMgYmFjayBhXG4gKiBkYXkgbGF0ZXIgc2hvdWxkIGJlIGFibGUgdG8gY2hhbmdlIGl0OyBmcmVlemluZyB0aGUgZmlyc3QgbnVtYmVyIHdvdWxkIG1ha2VcbiAqIHRoZSBtZXRyaWMgbWVhc3VyZSBob3cgcGVvcGxlIGZlbHQgYXQgdGhlaXIgd29yc3QgbW9tZW50LiBgc2F0aXNmYWN0aW9uX2F0YFxuICogbW92ZXMgd2l0aCBpdCwgc28gdGhlIEFOU1dFUiBhbmQgV0hFTiBpdCB3YXMgZ2l2ZW4gc3RheSB0b2dldGhlci5cbiAqXG4gKiBSZXR1cm5zIHdoZXRoZXIgYSByb3cgbW92ZWQg4oCUIGZhbHNlIG1lYW5zIHRoZSBjYXNlIGlzIG1pc3NpbmcsIHNvZnQtZGVsZXRlZCxcbiAqIG9yIG5vdCBjbG9zZWQgeWV0LCB3aGljaCB0aGUgY2FsbGVyIG11c3QgZGlzdGluZ3Vpc2ggZnJvbSBhIHN0b3JlZCB6ZXJvLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmF0ZUNhc2UoXG4gIGNhc2VJZDogc3RyaW5nLFxuICBzYXRpc2ZhY3Rpb246IG51bWJlcixcbiAgY29tbWVudDogc3RyaW5nIHwgbnVsbCxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAudXBkYXRlKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAuc2V0KHsgc2F0aXNmYWN0aW9uLCBzYXRpc2ZhY3Rpb25Db21tZW50OiBjb21tZW50LCBzYXRpc2ZhY3Rpb25BdDogbmV3IERhdGUoKSB9KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENhc2UuaWQsIGNhc2VJZCksXG4gICAgICBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlLmRlbGV0ZWRBdCksXG4gICAgICAvLyBUZXJtaW5hbCBvbmx5LiBgcmVzb2x2ZWRgIGNvdW50czogd2UgaGF2ZSBjbGFpbWVkIGEgZml4LCBzbyB0aGVcbiAgICAgIC8vIGN1c3RvbWVyIGlzIGluIGEgcG9zaXRpb24gdG8gc2F5IHdoZXRoZXIgaXQgd2FzIG9uZS5cbiAgICAgIGluQXJyYXkoc2NoZW1hLnN1cHBvcnRDYXNlLnN0YXR1cywgWydyZXNvbHZlZCcsICdjbG9zZWQnXSksXG4gICAgKSlcbiAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5zdXBwb3J0Q2FzZS5pZCB9KSk7XG4gIHJldHVybiByb3dzLmxlbmd0aCA+IDA7XG59XG5cbi8vIC0tLSBTdGFmZiBub3RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE9uZSBzdGFmZiBub3RlLCBhcyB0aGUgcXVldWUgVUkgcmVuZGVycyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcG9ydENhc2VOb3RlIHtcbiAgaWQ6IHN0cmluZztcbiAgY2FzZUlkOiBzdHJpbmc7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBzdGFmZi1vbmx5IG5vdGUgdG8gYSBjYXNlLlxuICpcbiAqIGBvcmdJZGAgaXMgZGVub3JtYWxpc2VkIG9udG8gdGhlIHJvdyBmcm9tIHRoZSBDQVNFLCBub3QgdGFrZW4gZnJvbSB0aGUgYXV0aG9yOlxuICogYSBub3RlIGJlbG9uZ3MgdG8gdGhlIHRlbmFudCB3aG9zZSBjYXNlIGl0IGFubm90YXRlcywgYW5kIHNvdXJjaW5nIGl0IGZyb21cbiAqIHRoZSBzdGFmZiBhdXRob3IncyBvd24gb3JnICh0aGUgc3lzdGVtIG9yZykgd291bGQgcHV0IGV2ZXJ5IG5vdGUgb3V0c2lkZSB0aGVcbiAqIHRlbmFudCBzY29wZSB0aGF0IGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gaXQuXG4gKlxuICogU1RBRkYgT05MWSBhdCB0aGUgcm91dGUgbGF5ZXIsIGFuZCB0aGUgc2VwYXJhdGUgdGFibGUgaXMgdGhlIHJlYXNvbiB0aGF0IGlzXG4gKiBzYWZlOiBgbWVzc2FnZXNgIGlzIHJlYWQgdGhyb3VnaCBvbmUgc2hhcmVkIHZpc2liaWxpdHkgcHJlZGljYXRlLCBzbyBhIGZsYWdcbiAqIHRoZXJlIHdvdWxkIGxlYWsgYW4gaW50ZXJuYWwgbm90ZSBmcm9tIGFueSByZWFkIHBhdGggdGhhdCBmb3Jnb3QgdGhlIGV4dHJhXG4gKiBjb25kaXRpb24uIEEgc2VwYXJhdGUgdGFibGUgY2Fubm90IGxlYWsgYnkgb21pc3Npb24g4oCUIGl0IGhhcyB0byBiZSBqb2luZWRcbiAqIGRlbGliZXJhdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZENhc2VOb3RlKFxuICBjYXNlSWQ6IHN0cmluZyxcbiAgb3JnSWQ6IHN0cmluZyxcbiAgY29udGVudDogc3RyaW5nLFxuICBjcmVhdGVkQnk6IHN0cmluZyxcbik6IFByb21pc2U8U3VwcG9ydENhc2VOb3RlPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC5pbnNlcnQoc2NoZW1hLnN1cHBvcnRDYXNlTm90ZSlcbiAgICAudmFsdWVzKHsgY2FzZUlkLCBvcmdJZCwgY29udGVudCwgY3JlYXRlZEJ5IH0pXG4gICAgLnJldHVybmluZygpKTtcbiAgY29uc3Qgcm93ID0gcm93c1swXTtcbiAgaWYgKCFyb3cpIHRocm93IG5ldyBFcnJvcignc3VwcG9ydCBjYXNlIG5vdGUgaW5zZXJ0IHJldHVybmVkIG5vIHJvdycpO1xuICByZXR1cm4gcm93O1xufVxuXG4vKiogTGl2ZSBub3RlcyBvbiBhIGNhc2UsIG9sZGVzdCBmaXJzdCDigJQgdGhleSByZWFkIGFzIGEgcnVubmluZyBjb21tZW50YXJ5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RDYXNlTm90ZXMoY2FzZUlkOiBzdHJpbmcpOiBQcm9taXNlPFN1cHBvcnRDYXNlTm90ZVtdPiB7XG4gIHJldHVybiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC5zZWxlY3QoKVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q2FzZU5vdGUpXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q2FzZU5vdGUuY2FzZUlkLCBjYXNlSWQpLFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDYXNlTm90ZS5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgICBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlTm90ZS5kZWxldGVkQXQpLFxuICAgICkpXG4gICAgLm9yZGVyQnkoYXNjKHNjaGVtYS5zdXBwb3J0Q2FzZU5vdGUuY3JlYXRlZEF0KSkpO1xufVxuXG4vKipcbiAqIFNvZnQtZGVsZXRlIGEgbm90ZS5cbiAqXG4gKiBTb2Z0IGJlY2F1c2UgYSBub3RlIGlzIGEgcmVjb3JkIG9mIHdoYXQgdGhlIGRlc2sgYmVsaWV2ZWQgYXQgdGhlIHRpbWUsIGFuZCBhXG4gKiBkaXNwdXRlIG1heSB0dXJuIG9uIGl0LiBSZXR1cm5zIHdoZXRoZXIgYSByb3cgbW92ZWQsIHNvIGEgc2Vjb25kIGRlbGV0ZSBpcyBhXG4gKiByZXBvcnRlZCBuby1vcCByYXRoZXIgdGhhbiBhIHNpbGVudCBzdWNjZXNzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ2FzZU5vdGUobm90ZUlkOiBzdHJpbmcsIGRlbGV0ZWRCeTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC51cGRhdGUoc2NoZW1hLnN1cHBvcnRDYXNlTm90ZSlcbiAgICAuc2V0KHsgaXNBY3RpdmU6IGZhbHNlLCBkZWxldGVkQXQ6IG5ldyBEYXRlKCksIGRlbGV0ZWRCeSB9KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENhc2VOb3RlLmlkLCBub3RlSWQpLFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDYXNlTm90ZS5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgKSlcbiAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5zdXBwb3J0Q2FzZU5vdGUuaWQgfSkpO1xuICByZXR1cm4gcm93cy5sZW5ndGggPiAwO1xufVxuXG4vLyAtLS0gQ2FubmVkIHJlc3BvbnNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBBIHJldXNhYmxlIHN0YWZmIHJlcGx5IHRlbXBsYXRlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYW5uZWRSZXNwb25zZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBMaXZlIHRlbXBsYXRlcywgYWxwaGFiZXRpY2FsIOKAlCB0aGUgcGlja2VyJ3Mgb25seSBxdWVyeS5cbiAqXG4gKiBObyBvcmcgc2NvcGUgYmVjYXVzZSB0aGUgdGFibGUgaGFzIG5vbmU6IHRoZXNlIGFyZSB0aGUgdmVuZG9yJ3Mgb3duIHdvcmRpbmdcbiAqIGZvciByZWN1cnJpbmcgcXVlc3Rpb25zLCBhdXRob3JlZCBvbmNlIGFuZCByZXVzZWQgYWNyb3NzIGV2ZXJ5IGN1c3RvbWVyLlxuICogU2NvcGluZyB0aGVtIHBlciB0ZW5hbnQgd291bGQgYmUgdGhlIG9wcG9zaXRlIG9mIHRoZSBwb2ludC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RDYW5uZWRSZXNwb25zZXMoKTogUHJvbWlzZTxDYW5uZWRSZXNwb25zZVtdPiB7XG4gIHJldHVybiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC5zZWxlY3Qoe1xuICAgICAgaWQ6IHNjaGVtYS5zdXBwb3J0Q2FubmVkUmVzcG9uc2UuaWQsXG4gICAgICB0aXRsZTogc2NoZW1hLnN1cHBvcnRDYW5uZWRSZXNwb25zZS50aXRsZSxcbiAgICAgIGJvZHk6IHNjaGVtYS5zdXBwb3J0Q2FubmVkUmVzcG9uc2UuYm9keSxcbiAgICB9KVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q2FubmVkUmVzcG9uc2UpXG4gICAgLndoZXJlKGVxKHNjaGVtYS5zdXBwb3J0Q2FubmVkUmVzcG9uc2UuaXNBY3RpdmUsIHRydWUpKVxuICAgIC5vcmRlckJ5KGFzYyhzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlLnRpdGxlKSkpO1xufVxuXG4vKiogQ3JlYXRlIGEgdGVtcGxhdGUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ2FubmVkUmVzcG9uc2UoXG4gIHRpdGxlOiBzdHJpbmcsXG4gIGJvZHk6IHN0cmluZyxcbiAgYWN0b3JJZDogc3RyaW5nLFxuKTogUHJvbWlzZTxDYW5uZWRSZXNwb25zZT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAuaW5zZXJ0KHNjaGVtYS5zdXBwb3J0Q2FubmVkUmVzcG9uc2UpXG4gICAgLnZhbHVlcyh7IHRpdGxlLCBib2R5LCBjcmVhdGVkQnk6IGFjdG9ySWQsIHVwZGF0ZWRCeTogYWN0b3JJZCB9KVxuICAgIC5yZXR1cm5pbmcoe1xuICAgICAgaWQ6IHNjaGVtYS5zdXBwb3J0Q2FubmVkUmVzcG9uc2UuaWQsXG4gICAgICB0aXRsZTogc2NoZW1hLnN1cHBvcnRDYW5uZWRSZXNwb25zZS50aXRsZSxcbiAgICAgIGJvZHk6IHNjaGVtYS5zdXBwb3J0Q2FubmVkUmVzcG9uc2UuYm9keSxcbiAgICB9KSk7XG4gIGNvbnN0IHJvdyA9IHJvd3NbMF07XG4gIGlmICghcm93KSB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5lZCByZXNwb25zZSBpbnNlcnQgcmV0dXJuZWQgbm8gcm93Jyk7XG4gIHJldHVybiByb3c7XG59XG5cbi8qKlxuICogRWRpdCBhIGxpdmUgdGVtcGxhdGUuXG4gKlxuICogR3VhcmRlZCBvbiBgaXNfYWN0aXZlYCBzbyBhIHJldGlyZWQgdGVtcGxhdGUgY2Fubm90IGJlIGVkaXRlZCBiYWNrIGludG9cbiAqIGNpcmN1bGF0aW9uIOKAlCBhIHJlc3VycmVjdGlvbiBzaG91bGQgYmUgYSBkZWxpYmVyYXRlIG5ldyByb3csIG5vdCBhIHNpZGVcbiAqIGVmZmVjdCBvZiBmaXhpbmcgYSB0eXBvLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ2FubmVkUmVzcG9uc2UoXG4gIGlkOiBzdHJpbmcsXG4gIGZpZWxkczogeyB0aXRsZT86IHN0cmluZzsgYm9keT86IHN0cmluZyB9LFxuICBhY3RvcklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGZpZWxkcy50aXRsZSA9PT0gdW5kZWZpbmVkICYmIGZpZWxkcy5ib2R5ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnVwZGF0ZShzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlKVxuICAgIC5zZXQoe1xuICAgICAgLi4uKGZpZWxkcy50aXRsZSAhPT0gdW5kZWZpbmVkID8geyB0aXRsZTogZmllbGRzLnRpdGxlIH0gOiB7fSksXG4gICAgICAuLi4oZmllbGRzLmJvZHkgIT09IHVuZGVmaW5lZCA/IHsgYm9keTogZmllbGRzLmJvZHkgfSA6IHt9KSxcbiAgICAgIHVwZGF0ZWRCeTogYWN0b3JJZCxcbiAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICB9KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlLmlkLCBpZCksXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlLmlzQWN0aXZlLCB0cnVlKSxcbiAgICApKVxuICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnN1cHBvcnRDYW5uZWRSZXNwb25zZS5pZCB9KSk7XG4gIHJldHVybiByb3dzLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogUmV0aXJlIGEgdGVtcGxhdGUuXG4gKlxuICogU09GVCwgYmVjYXVzZSBhIHJldGlyZWQgdGVtcGxhdGUgaXMgc3RpbGwgdGhlIGV4cGxhbmF0aW9uIG9mIHdoYXQgYSBwYXN0XG4gKiByZXBseSBzYWlkIOKAlCBkZWxldGluZyB0aGUgcm93IHdvdWxkIGxlYXZlIG9sZCBjb3JyZXNwb25kZW5jZSB1bmFjY291bnRhYmxlXG4gKiBmb3IgaXRzIG93biB3b3JkaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ2FubmVkUmVzcG9uc2UoaWQ6IHN0cmluZywgYWN0b3JJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC51cGRhdGUoc2NoZW1hLnN1cHBvcnRDYW5uZWRSZXNwb25zZSlcbiAgICAuc2V0KHsgaXNBY3RpdmU6IGZhbHNlLCB1cGRhdGVkQnk6IGFjdG9ySWQsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlLmlkLCBpZCksXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlLmlzQWN0aXZlLCB0cnVlKSxcbiAgICApKVxuICAgIC5yZXR1cm5pbmcoeyBpZDogc2NoZW1hLnN1cHBvcnRDYW5uZWRSZXNwb25zZS5pZCB9KSk7XG4gIHJldHVybiByb3dzLmxlbmd0aCA+IDA7XG59XG5cbi8vIC0tLSBTdXBwb3J0IGNvbnRhY3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBMaXZlIGRlc2lnbmF0ZWQgY29udGFjdHMgYWNyb3NzIGEgc2V0IG9mIG9yZ3MgKGFuIGFjY291bnQgc3VidHJlZSkuXG4gKlxuICogVGFrZXMgdGhlIHdob2xlIHNjb3BlIGluIG9uZSBxdWVyeSByYXRoZXIgdGhhbiBwZXItb3JnIGJlY2F1c2UgdGhlIGFsbG93YW5jZVxuICogUE9PTFMgYXQgdGhlIHJvb3Q6IGEgcGVyc29uIGRlc2lnbmF0ZWQgb24gYSB0ZWFtIHNwZW5kcyB0aGUgYWNjb3VudCdzXG4gKiBhbGxvd2FuY2UsIHNvIGNvdW50aW5nIHRlYW0tYnktdGVhbSBhbmQgc3VtbWluZyB3b3VsZCBiZSB0aGUgc2FtZSBudW1iZXIgYnlcbiAqIGFjY2lkZW50IGFuZCB0aGUgd3Jvbmcgc2hhcGUgdGhlIG1vbWVudCBwb29saW5nIGNoYW5nZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3VudEFjdGl2ZVN1cHBvcnRDb250YWN0cyhvcmdJZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgLy8gQ2FsbGVycyBwYXNzIHRoZSBleHBhbmRlZCBTVUJUUkVFIGZvciB0aGUgcG9vbGVkIGNhcCwgb3IgYSBzaW5nbGUgb3JnIHRvIGFza1xuICAvLyBcIm1heSBhIGNhc2UgcmFpc2VkIGhlcmUgaGF2ZSBhbiBvd25lciBhdCBhbGxcIi4gQm90aCBhcmUgbGVnaXRpbWF0ZTsgc2VlXG4gIC8vIGBTdXBwb3J0RW50aXRsZW1lbnRgIGluIHBsYXRmb3JtIGZvciB3aGljaCBmaWVsZCBpcyB3aGljaC5cbiAgaWYgKG9yZ0lkcy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAuc2VsZWN0KHsgbjogc3FsPG51bWJlcj5gY291bnQoKik6OmludGAgfSlcbiAgICAuZnJvbShzY2hlbWEuc3VwcG9ydENvbnRhY3QpXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGluQXJyYXkoc2NoZW1hLnN1cHBvcnRDb250YWN0Lm9yZ0lkLCBbLi4ub3JnSWRzXSksXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENvbnRhY3QuaXNBY3RpdmUsIHRydWUpLFxuICAgICkpKTtcbiAgcmV0dXJuIHJvd3NbMF0/Lm4gPz8gMDtcbn1cblxuLyoqXG4gKiBMaXZlIGNvbnRhY3RzIGZvciB0aGUgdGVuYW50IG93bmVyIHBpY2tlci5cbiAqXG4gKiBTQ09QRSBJUyBUSEUgQ0FMTEVSJ1MgQ0hPSUNFLCBhbmQgdGhlIGRlZmF1bHQgaXMgT05FIE9SRy4gVGhlIGFsbG93YW5jZSBwb29sc1xuICogc3VidHJlZS13aWRlLCBidXQgb3duZXJzaGlwIGRvZXMgbm90OiBhIHRlYW0gcmVhc3NpZ25zIGEgY2FzZSBvbmx5IGFtb25nIGl0c1xuICogT1dOIGNvbnRhY3RzLCBzbyBhIHBvb2xlZCBhbGxvd2FuY2UgbmV2ZXIgdHVybnMgaW50byBvbmUgdGVhbSdzIGNhc2VzIGJlaW5nXG4gKiByZWFkYWJsZSBieSBhIHNpYmxpbmcuIFBhc3MgYSBzaW5nbGUgb3JnIGlkIGZvciB0aGUgcGlja2VyOyBwYXNzIHRoZSBleHBhbmRlZFxuICogc3VidHJlZSBvbmx5IHdoZXJlIHRoZSBwb29sZWQgQ0FQIGlzIHRoZSBxdWVzdGlvbiAoc2VlXG4gKiBgY291bnRBY3RpdmVTdXBwb3J0Q29udGFjdHNgKS5cbiAqXG4gKiBUYWtpbmcgYSBsaXN0IHJhdGhlciB0aGFuIGEgc2luZ2xlIGlkIGtlZXBzIHRoYXQgZGVjaXNpb24gYXQgdGhlIGNhbGwgc2l0ZVxuICogaW5zdGVhZCBvZiBoaWRpbmcgaXQgaGVyZSDigJQgdGhlIHR3byBzY29wZXMgYW5zd2VyIGRpZmZlcmVudGx5IGFuZCB0aGUgd3JvbmdcbiAqIG9uZSBsZWFrcyBjYXNlcyBhY3Jvc3MgdGVhbXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0QWN0aXZlU3VwcG9ydENvbnRhY3RzKFxuICBvcmdJZHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogUHJvbWlzZTx7IG9yZ0lkOiBzdHJpbmc7IHVzZXJJZDogc3RyaW5nOyBpc1ByZW1pdW06IGJvb2xlYW4gfVtdPiB7XG4gIGlmIChvcmdJZHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIHJldHVybiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC5zZWxlY3Qoe1xuICAgICAgb3JnSWQ6IHNjaGVtYS5zdXBwb3J0Q29udGFjdC5vcmdJZCxcbiAgICAgIHVzZXJJZDogc2NoZW1hLnN1cHBvcnRDb250YWN0LnVzZXJJZCxcbiAgICAgIC8vIENhcnJpZWQgc28gdGhlIGFkbWluIHBhbmVsIGNhbiBzaG93IHdobyBpcyB1cGdyYWRlZCB3aXRob3V0IGEgc2Vjb25kXG4gICAgICAvLyBxdWVyeSwgYW5kIHNvIHRoZSB0ZW5hbnQgb3duZXIgcGlja2VyIGNhbiBzYXkgd2hpY2ggY29udGFjdHMgY2FycnkgMjR4Ny5cbiAgICAgIGlzUHJlbWl1bTogc2NoZW1hLnN1cHBvcnRDb250YWN0LmlzUHJlbWl1bSxcbiAgICB9KVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q29udGFjdClcbiAgICAud2hlcmUoYW5kKFxuICAgICAgaW5BcnJheShzY2hlbWEuc3VwcG9ydENvbnRhY3Qub3JnSWQsIFsuLi5vcmdJZHNdKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgKSkpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhpcyB1c2VyIGlzIGEgbGl2ZSBkZXNpZ25hdGVkIGNvbnRhY3QgaW4gYW55IG9yZyBvZiB0aGUgc2NvcGUuXG4gKlxuICogVHJhbnNmZXIgdmFsaWRhdGlvbiBtdXN0IHBhc3MgdGhlIGNhc2UncyBPV04gb3JnLCBub3QgdGhlIHN1YnRyZWU6IGFjY2VwdGluZyBhXG4gKiBzaWJsaW5nIHRlYW0ncyBjb250YWN0IGFzIGEgdmFsaWQgdHJhbnNmZXIgdGFyZ2V0IGlzIGV4YWN0bHkgdGhlIGNyb3NzLXRlYW1cbiAqIGxlYWsgdGhlIG93bi1vcmcgb3duZXJzaGlwIHJ1bGUgZXhpc3RzIHRvIHByZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1N1cHBvcnRDb250YWN0KG9yZ0lkczogcmVhZG9ubHkgc3RyaW5nW10sIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChvcmdJZHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC5zZWxlY3QoeyBpZDogc2NoZW1hLnN1cHBvcnRDb250YWN0LmlkIH0pXG4gICAgLmZyb20oc2NoZW1hLnN1cHBvcnRDb250YWN0KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBpbkFycmF5KHNjaGVtYS5zdXBwb3J0Q29udGFjdC5vcmdJZCwgWy4uLm9yZ0lkc10pLFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDb250YWN0LnVzZXJJZCwgdXNlcklkKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgKSlcbiAgICAubGltaXQoMSkpO1xuICByZXR1cm4gcm93cy5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIERlc2lnbmF0ZSBhIHN1cHBvcnQgY29udGFjdC5cbiAqXG4gKiBUaGUgQ0FQIGlzIG5vdCBlbmZvcmNlZCBoZXJlIOKAlCB0aGUgY2FsbGVyIGhvbGRzIGl0LCBiZWNhdXNlIHRoZSBsaW1pdCBsaXZlcyBvblxuICogdGhlIE1vbmdvIG9yZyBkb2MgYW5kIHRoaXMgbW9kdWxlIG9ubHkgcmVhY2hlcyBQb3N0Z3Jlcy4gTWlycm9ycyBob3cgc2VhdHMgYXJlXG4gKiBjYXBwZWQgaW4gcGxhdGZvcm0gcmF0aGVyIHRoYW4gaW4gdGhlIHJvdyB3cml0ZXIuXG4gKlxuICogYHN1cHBvcnRfY29udGFjdF9vcmdfdXNlcl91cWAgaXMgcGFydGlhbCBvbiBgaXNfYWN0aXZlID0gdHJ1ZWAsIHNvXG4gKiByZS1kZXNpZ25hdGluZyBzb21lb25lIHByZXZpb3VzbHkgcmV2b2tlZCBpbnNlcnRzIGEgZnJlc2ggcm93IHJhdGhlciB0aGFuXG4gKiBjb2xsaWRpbmcg4oCUIHRoZSByZXZva2VkIHJvdyBzdGF5cyBhcyB0aGUgcmVjb3JkIHRoYXQgdGhleSBvbmNlIGhlbGQgaXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXNpZ25hdGVTdXBwb3J0Q29udGFjdChcbiAgb3JnSWQ6IHN0cmluZyxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGRlc2lnbmF0ZWRCeTogc3RyaW5nLFxuICBpc1ByZW1pdW0gPSBmYWxzZSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgYXdhaXQgdHguaW5zZXJ0KHNjaGVtYS5zdXBwb3J0Q29udGFjdClcbiAgICAgIC52YWx1ZXMoeyBvcmdJZCwgdXNlcklkLCBkZXNpZ25hdGVkQnksIGlzUHJlbWl1bSB9KVxuICAgICAgLm9uQ29uZmxpY3REb05vdGhpbmcoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogTGl2ZSBjb250YWN0cyBpbiBhIHNjb3BlIHRoYXQgYXJlIFVQR1JBREVEIHRvIHByZW1pdW0g4oCUIHRoZSBjYXAncyBjb3VudGVycGFydC5cbiAqXG4gKiBDb3VudGVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgYmFzZWxpbmUgdG90YWwgYmVjYXVzZSB0aGUgdHdvIGNhcHMgYXJlIHNlcGFyYXRlOlxuICogYW4gYWNjb3VudCBob2xkcyBOIGNvbnRhY3RzIChgc3VwcG9ydENvbnRhY3RzYCkgYW5kIHVwZ3JhZGVzIE0gb2YgdGhlbVxuICogKGBzdXBwb3J0UHJlbWl1bUNvbnRhY3RzYCksIE0g4omkIE4uIFBvb2xlZCBvdmVyIHdoYXRldmVyIHNjb3BlIHRoZSBjYWxsZXJcbiAqIHBhc3NlcywgZXhhY3RseSBsaWtlIHtAbGluayBjb3VudEFjdGl2ZVN1cHBvcnRDb250YWN0c30g4oCUIHN1YnRyZWUgZm9yIHRoZSBjYXAsXG4gKiBvbmUgb3JnIGZvciBhbiBvd25lcnNoaXAgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3VudFByZW1pdW1TdXBwb3J0Q29udGFjdHMob3JnSWRzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmIChvcmdJZHMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnNlbGVjdCh7IG46IHNxbDxudW1iZXI+YGNvdW50KCopOjppbnRgIH0pXG4gICAgLmZyb20oc2NoZW1hLnN1cHBvcnRDb250YWN0KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBpbkFycmF5KHNjaGVtYS5zdXBwb3J0Q29udGFjdC5vcmdJZCwgWy4uLm9yZ0lkc10pLFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDb250YWN0LmlzQWN0aXZlLCB0cnVlKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC5pc1ByZW1pdW0sIHRydWUpLFxuICAgICkpKTtcbiAgcmV0dXJuIHJvd3NbMF0/Lm4gPz8gMDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoaXMgdXNlciBpcyBhIGxpdmUgUFJFTUlVTSBjb250YWN0IGluIHRoZSBzY29wZS5cbiAqXG4gKiBUaGUgY2FzZS1vcGVuIHBhdGggcmVhZHMgdGhpcyB0byBkZWNpZGUgd2hpY2ggbGV2ZWwgdG8gZnJlZXplIG9udG8gYSBuZXcgY2FzZTpcbiAqIHByZW1pdW0gd2hlbiB0aGUgb3BlbmVyIGlzIHVwZ3JhZGVkLCB0aGUgYWNjb3VudCdzIGJhc2VsaW5lIG90aGVyd2lzZS4gUGFzcyB0aGVcbiAqIGNhc2UncyBPV04gb3JnIOKAlCB0aGUgdXBncmFkZSBmb2xsb3dzIHRoZSBwZXJzb24gaW4gdGhlIG9yZyB0aGF0IG5vbWluYXRlZFxuICogdGhlbSwgYW5kIGEgc2libGluZyB0ZWFtJ3MgdXBncmFkZSBpcyBub3QgdGhpcyBvcmcncyB0byBzcGVuZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzUHJlbWl1bVN1cHBvcnRDb250YWN0KG9yZ0lkczogcmVhZG9ubHkgc3RyaW5nW10sIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChvcmdJZHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC5zZWxlY3QoeyBpZDogc2NoZW1hLnN1cHBvcnRDb250YWN0LmlkIH0pXG4gICAgLmZyb20oc2NoZW1hLnN1cHBvcnRDb250YWN0KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBpbkFycmF5KHNjaGVtYS5zdXBwb3J0Q29udGFjdC5vcmdJZCwgWy4uLm9yZ0lkc10pLFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDb250YWN0LnVzZXJJZCwgdXNlcklkKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENvbnRhY3QuaXNQcmVtaXVtLCB0cnVlKSxcbiAgICApKVxuICAgIC5saW1pdCgxKSk7XG4gIHJldHVybiByb3dzLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogVXBncmFkZSBvciBkb3duZ3JhZGUgYSBMSVZFIGNvbnRhY3QuXG4gKlxuICogR3VhcmRlZCBvbiBgaXNfYWN0aXZlYCBzbyBhIHJldm9rZWQgcm93IGNhbm5vdCBiZSB1cGdyYWRlZCBiYWNrIGludG9cbiAqIHJlbGV2YW5jZSwgYW5kIHJldHVybnMgd2hldGhlciBhIHJvdyBhY3R1YWxseSBtb3ZlZCDigJQgdGhlIGNhbGxlciBjb3VudHNcbiAqIGFnYWluc3QgdGhlIHByZW1pdW0gY2FwIGJlZm9yZSBjYWxsaW5nLCBhbmQgYSBzaWxlbnQgbm8tb3Agd291bGQgbGV0IHRoYXRcbiAqIGNvdW50IGRyaWZ0IGZyb20gcmVhbGl0eS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgZG9lcyBOT1QgdG91Y2ggdGhlIGNhc2Ugcm93czogYHN1cHBvcnRfY2FzZS5sZXZlbGAgaXMgZnJvemVuIGF0XG4gKiBvcGVuLCBzbyBkb3duZ3JhZGluZyBzb21lYm9keSBuZXZlciB3ZWFrZW5zIGEgcHJvbWlzZSBhbHJlYWR5IG1hZGUgb24gYSBjYXNlXG4gKiB0aGV5IHJhaXNlZCB3aGlsZSB1cGdyYWRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFN1cHBvcnRDb250YWN0UHJlbWl1bShcbiAgb3JnSWQ6IHN0cmluZyxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGlzUHJlbWl1bTogYm9vbGVhbixcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAudXBkYXRlKHNjaGVtYS5zdXBwb3J0Q29udGFjdClcbiAgICAuc2V0KHsgaXNQcmVtaXVtIH0pXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC5vcmdJZCwgb3JnSWQpLFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDb250YWN0LnVzZXJJZCwgdXNlcklkKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgKSlcbiAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5zdXBwb3J0Q29udGFjdC5pZCB9KSk7XG4gIHJldHVybiByb3dzLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogUmV2b2tlIGEgZGVzaWduYXRpb24sIGZyZWVpbmcgdGhlIHNsb3QuXG4gKlxuICogUmV0dXJucyB0aGUgdXNlcidzIHN0aWxsLW9wZW4gY2FzZXMgc28gdGhlIGNhbGxlciBjYW4gcmVhc3NpZ24gdGhlbSBpbnN0ZWFkIG9mXG4gKiBvcnBoYW5pbmcg4oCUIHNjb3BlIEM0J3MgYW5zd2VyLiBSZXZva2luZyBpcyBkZWxpYmVyYXRlbHkgbm90IGJsb2NrZWQgb24gdGhlbTpcbiAqIHJlZnVzaW5nIHRvIHJlbW92ZSBhIGRlcGFydGVkIGVtcGxveWVlIGJlY2F1c2UgdGhleSBzdGlsbCBvd24gY2FzZXMgd291bGQgYmVcbiAqIHdvcnNlIHRoYW4gaGFuZGluZyB0aGUgY2FzZXMgb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXZva2VTdXBwb3J0Q29udGFjdChcbiAgb3JnSWQ6IHN0cmluZyxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHJldm9rZWRCeTogc3RyaW5nLFxuKTogUHJvbWlzZTx7IHJldm9rZWQ6IGJvb2xlYW47IG9wZW5DYXNlczogU3VwcG9ydENhc2VbXSB9PiB7XG4gIGNvbnN0IG9wZW5DYXNlcyA9IGF3YWl0IG9wZW5DYXNlc0ZvckNvbnRhY3Qob3JnSWQsIHVzZXJJZCk7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC51cGRhdGUoc2NoZW1hLnN1cHBvcnRDb250YWN0KVxuICAgIC5zZXQoeyBpc0FjdGl2ZTogZmFsc2UsIHJldm9rZWRBdDogbmV3IERhdGUoKSwgcmV2b2tlZEJ5IH0pXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC5vcmdJZCwgb3JnSWQpLFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDb250YWN0LnVzZXJJZCwgdXNlcklkKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgKSlcbiAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5zdXBwb3J0Q29udGFjdC5pZCB9KSk7XG4gIHJldHVybiB7IHJldm9rZWQ6IHJvd3MubGVuZ3RoID4gMCwgb3BlbkNhc2VzIH07XG59XG4iXX0=
730
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcG9ydC1jYXNlcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zdXBwb3J0LWNhc2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFDdEM7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxFQUFFLDBCQUEwQixFQUEwQixNQUFNLDRCQUE0QixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQVksTUFBTSxhQUFhLENBQUM7QUFDNUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1RyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFdkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTVFOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlDLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUE2QnpGOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQUMsRUFBcUQsRUFBRSxLQUFhO0lBQ3ZHLE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRTtTQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1NBQ2pDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDaEMsa0JBQWtCLENBQUM7UUFDbEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLO1FBQ3ZDLEdBQUcsRUFBRTtZQUNILFVBQVUsRUFBRSxHQUFHLENBQUEsR0FBRyxNQUFNLENBQUMsa0JBQWtC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LENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUN4QyxLQUFhLEVBQ2IsTUFBYyxFQUNkLFNBQWlCO0lBRWpCLE1BQU0sU0FBUyxHQUFHLE1BQU0sbUJBQW1CLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNELE1BQU0sSUFBSSxHQUFHLE1BQU0sWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1NBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1NBQzdCLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7U0FDMUQsS0FBSyxDQUFDLEdBQUcsQ0FDUixFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQ3RDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFDeEMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUN6QyxDQUFDO1NBQ0QsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuLyoqXG4gKiBTdXBwb3J0LWNhc2UgcGVyc2lzdGVuY2U6IHRoZSB3b3JrZmxvdyBoYWxmIG9mIGEgc3VwcG9ydCB0aHJlYWQuXG4gKlxuICogSGVyZSByYXRoZXIgdGhhbiBpbiBhIHNlcnZpY2UgYmVjYXVzZSB0d28gY2FsbGVycyBuZWVkIGl0IOKAlCBwbGF0Zm9ybSBvd25zIHRoZVxuICogZW50aXRsZW1lbnQgY2hlY2sgYW5kIHRoZSB3cml0ZXMsIGFuZCB0aGUgbWVzc2FnZSBzZXJ2aWNlIG93bnMgdGhlIHRocmVhZCB0aGVcbiAqIGNhc2UgcG9pbnRzIGF0IOKAlCBhbmQgbmVpdGhlciBzaG91bGQgZ3JvdyBpdHMgb3duIGNvcHkgb2YgdGhlIGFsbG9jYXRvci5cbiAqXG4gKiBgbWVzc2FnZXNgIGtlZXBzIGNhcnJ5aW5nIHRoZSBjb252ZXJzYXRpb24uIFRoZXNlIGZ1bmN0aW9ucyBvbmx5IGV2ZXIgdG91Y2hcbiAqIHRoZSB3b3JrZmxvdyBheGlzOiBpZGVudGl0eSwgc3RhdHVzLCBvd25lcnNoaXAgYW5kIHRoZSByZXNwb25zZSBjbG9jay5cbiAqL1xuXG5pbXBvcnQgeyBMSVZFX1NVUFBPUlRfQ0FTRV9TVEFUVVNFUywgdHlwZSBTdXBwb3J0Q2FzZVN0YXR1cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgYXNjLCBkZXNjLCBlcSwgZ2V0VGFibGVDb2x1bW5zLCBndGUsIGluQXJyYXksIGlzTnVsbCwgbHRlLCBzcWwsIHR5cGUgU1FMIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgQ1VSU09SX1NPUlRfS0VZLCBkZWNvZGVDdXJzb3IsIGVuY29kZUN1cnNvciwgaXNDYXN0YWJsZVRvLCBrZXlzZXRBZnRlciB9IGZyb20gJy4va2V5c2V0LWN1cnNvci5qcyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRDYXNlIH0gZnJvbSAnLi4vZGF0YWJhc2Uvc2NoZW1hL3N1cHBvcnQuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFRlbmFudENvbnRleHQsIHdpdGhUZW5hbnRUeCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vKipcbiAqIFRoZSBzdGF0dXNlcyB0aGUgc3RhZmYgcXVldWUgYXNrcyBhYm91dCDigJQgdGhlIG9uZXMgc3RpbGwgb24gdXMuIChUaGUgZnVsbCBzZXRcbiAqIGlzIGFwaS1jb3JlJ3MgYFNVUFBPUlRfQ0FTRV9TVEFUVVNFU2A7IGBhd2FpdGluZ19jdXN0b21lcmAgaXMgd2hhdCBzdG9wcyB0aGVcbiAqIGNsb2NrLilcbiAqL1xuZXhwb3J0IGNvbnN0IFFVRVVFX1NUQVRVU0VTOiByZWFkb25seSBTdXBwb3J0Q2FzZVN0YXR1c1tdID0gWydvcGVuJywgJ2F3YWl0aW5nX3N1cHBvcnQnXTtcblxuLyoqIFdoYXQgb3BlbmluZyBhIGNhc2UgbmVlZHMuIGBsZXZlbGAgaXMgZnJvemVuIG9udG8gdGhlIHJvdyBhdCBvcGVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuQ2FzZUlucHV0IHtcbiAgLyoqIFRoZSByb290IGBtZXNzYWdlcy5pZGAuIEJlY29tZXMgdGhlIGNhbm9uaWNhbCBjYXNlIGlkZW50aXR5LiAqL1xuICB0aHJlYWRJZDogc3RyaW5nO1xuICBvcmdJZDogc3RyaW5nO1xuICAvKiogVGhlIHN1cHBvcnQgbGV2ZWwgSEVMRCBBVCBPUEVOLCBmcm96ZW4gc28gYSBtaWQtY2FzZSBkb3duZ3JhZGUgY2Fubm90XG4gICAqICBjaGFuZ2UgdGhlIHByb21pc2UgdW5kZXJuZWF0aCBzb21lb25lIGFscmVhZHkgd2FpdGluZy4gKi9cbiAgbGV2ZWw6IHN0cmluZztcbiAgc2V2ZXJpdHk6IHN0cmluZztcbiAgLyoqIFRoZSBvcGVuZXIuIEFsc28gdGhlIGluaXRpYWwgdGVuYW50IG93bmVyIHdoZW4gdGhleSBhcmUgYSBjb250YWN0LiAqL1xuICBvcGVuZWRCeTogc3RyaW5nO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSBjYXNlIHdhcyBvcGVuZWQgYnkgc3BlbmRpbmcgYSBvbmUtdGltZSBpbmNpZGVudCByYXRoZXIgdGhhblxuICAgKiAgYWdhaW5zdCBhIGNvbnRhY3Qgc2VhdCwgc28gaW5jaWRlbnQgdXNhZ2UgaXMgYW5zd2VyYWJsZSBmcm9tIHRoZSBjYXNlc1xuICAgKiAgdGhlbXNlbHZlcyBhbmQgbm90IG9ubHkgZnJvbSBhIGJhbGFuY2UgZGVsdGEuICovXG4gIG9wZW5lZFdpdGhJbmNpZGVudD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBmaXJzdCByZXNwb25zZSBpcyBkdWUsIGFscmVhZHkgY29tcHV0ZWQgYnkgdGhlIGNhbGxlci5cbiAgICpcbiAgICogUGFzc2VkIElOIHJhdGhlciB0aGFuIGRlcml2ZWQgaGVyZTogdGhlIGJ1c2luZXNzIGNhbGVuZGFyIGlzIGRlcGxveW1lbnRcbiAgICogY29uZmlnIChgU1VQUE9SVF9CVVNJTkVTU19IT1VSU18qYCkgcmVhZCBieSBhcGktY29yZSdzIGByZXNwb25zZUR1ZUF0YCwgYW5kXG4gICAqIHRoaXMgbW9kdWxlIG11c3Qgbm90IHJlYWNoIGZvciBlbnYgdG8gYW5zd2VyIGEgcHJvZHVjdCBxdWVzdGlvbi4gTnVsbCBpcyBhXG4gICAqIGxlZ2l0aW1hdGUgdmFsdWUg4oCUIGEgbGV2ZWwgd2l0aCBubyBwdWJsaXNoZWQgdGFyZ2V0LCBvciBhIGNhbGVuZGFyIHRvb1xuICAgKiBicm9rZW4gdG8gZGVyaXZlIG9uZSDigJQgYW5kIGlzIHN0b3JlZCBhcyBcIm5vIGRlYWRsaW5lXCIgcmF0aGVyIHRoYW4gZ3Vlc3NlZC5cbiAgICovXG4gIHJlc3BvbnNlRHVlQXQ/OiBEYXRlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBBbGxvY2F0ZSB0aGUgbmV4dCBwZXItb3JnIGNhc2UgbnVtYmVyLlxuICpcbiAqIFBvc3RncmVzIHNlcXVlbmNlcyBhcmUgZ2xvYmFsIGFuZCBjYW5ub3QgYmUgcGVyLW9yZyB3aXRob3V0IG9uZSBzZXF1ZW5jZSBwZXJcbiAqIHRlbmFudCwgc28gdGhlIGNvdW50ZXIgaXMgYSByb3cuIGBVUERBVEUg4oCmIFJFVFVSTklOR2AgdGFrZXMgdGhlIHJvdyBsb2NrLFxuICogd2hpY2ggc2VyaWFsaXNlcyBjb25jdXJyZW50IG9wZW5zIFdJVEhJTiBvbmUgb3JnIHdoaWxlIGxlYXZpbmcgb3RoZXIgb3Jnc1xuICogdW50b3VjaGVkIOKAlCBhIGdsb2JhbCBzZXF1ZW5jZSB3b3VsZCBzZXJpYWxpc2UgZXZlcnlib2R5LCBhbmQgd291bGQgYWxzb1xuICogZGlzY2xvc2UgdG90YWwgY2FzZSB2b2x1bWUgdG8gZXZlcnkgY3VzdG9tZXIuXG4gKlxuICogVGhlIHVwc2VydCBzZWVkcyBgbmV4dF9udW1iZXIgPSAyYCBvbiBmaXJzdCB1c2UgYW5kIHJldHVybnMgMSwgc28gYW4gb3JnJ3NcbiAqIGZpcnN0IGNhc2UgaXMgYEFDTUUtMWAuIE11c3QgcnVuIGluc2lkZSB0aGUgc2FtZSB0cmFuc2FjdGlvbiBhcyB0aGUgY2FzZVxuICogaW5zZXJ0OiBhIGNvbW1pdHRlZCBhbGxvY2F0aW9uIHdpdGggYSByb2xsZWQtYmFjayBpbnNlcnQgYnVybnMgYSBudW1iZXIsIGFuZFxuICogYSBudW1iZXIgYnVybmVkIGlzIGEgZ2FwIGEgY3VzdG9tZXIgd2lsbCBldmVudHVhbGx5IGFzayBhYm91dC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWxsb2NhdGVEaXNwbGF5TnVtYmVyKHR4OiBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8dHlwZW9mIHdpdGhUZW5hbnRUeD5bMF0+WzBdLCBvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHR4XG4gICAgLmluc2VydChzY2hlbWEuc3VwcG9ydENhc2VDb3VudGVyKVxuICAgIC52YWx1ZXMoeyBvcmdJZCwgbmV4dE51bWJlcjogMiB9KVxuICAgIC5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgdGFyZ2V0OiBzY2hlbWEuc3VwcG9ydENhc2VDb3VudGVyLm9yZ0lkLFxuICAgICAgc2V0OiB7XG4gICAgICAgIG5leHROdW1iZXI6IHNxbGAke3NjaGVtYS5zdXBwb3J0Q2FzZUNvdW50ZXIubmV4dE51bWJlcn0gKyAxYCxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC5yZXR1cm5pbmcoeyBuZXh0OiBzY2hlbWEuc3VwcG9ydENhc2VDb3VudGVyLm5leHROdW1iZXIgfSk7XG4gIGNvbnN0IG5leHQgPSByb3dzWzBdPy5uZXh0O1xuICBpZiAobmV4dCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ3N1cHBvcnQgY2FzZSBudW1iZXIgYWxsb2NhdGlvbiByZXR1cm5lZCBubyByb3cnKTtcbiAgLy8gT24gSU5TRVJUIHRoZSByb3cgaXMgc2VlZGVkIGF0IDIgYW5kIHRoaXMgY2FzZSBpcyAxOyBvbiBVUERBVEUgdGhlIHN0b3JlZFxuICAvLyB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIGluY3JlbWVudGVkLCBzbyB0aGlzIGNhc2UgaXMgdGhlIHZhbHVlIG1pbnVzIG9uZS5cbiAgLy8gQm90aCBicmFuY2hlcyB0aGVyZWZvcmUgeWllbGQgXCJ0aGUgbnVtYmVyIGp1c3QgY29uc3VtZWRcIi5cbiAgcmV0dXJuIG5leHQgLSAxO1xufVxuXG4vKipcbiAqIE9wZW4gYSBjYXNlIGZvciBhbiBleGlzdGluZyB0aHJlYWQsIGFsbG9jYXRpbmcgaXRzIGRpc3BsYXkgbnVtYmVyLlxuICpcbiAqIE9uZSB0cmFuc2FjdGlvbiBvbiBwdXJwb3NlOiB0aGUgbnVtYmVyIGFuZCB0aGUgcm93IGNvbW1pdCB0b2dldGhlciBvciBuZWl0aGVyXG4gKiBkb2VzLiBgc3VwcG9ydF9jYXNlX29yZ19udW1iZXJfdXFgIGlzIHRoZSBiYWNrc3RvcCDigJQgaWYgdGhlIGFsbG9jYXRvciBpcyBldmVyXG4gKiBieXBhc3NlZCwgdGhlIGluc2VydCBmYWlscyByYXRoZXIgdGhhbiBpc3N1aW5nIHR3byBjYXNlcyB0aGUgb25lIGlkZW50aWZpZXJcbiAqIGN1c3RvbWVycyBxdW90ZSBiYWNrLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlblN1cHBvcnRDYXNlKGlucHV0OiBPcGVuQ2FzZUlucHV0KTogUHJvbWlzZTxTdXBwb3J0Q2FzZT4ge1xuICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgIGNvbnN0IGRpc3BsYXlOdW1iZXIgPSBhd2FpdCBhbGxvY2F0ZURpc3BsYXlOdW1iZXIodHgsIGlucHV0Lm9yZ0lkKTtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdHhcbiAgICAgIC5pbnNlcnQoc2NoZW1hLnN1cHBvcnRDYXNlKVxuICAgICAgLnZhbHVlcyh7XG4gICAgICAgIHRocmVhZElkOiBpbnB1dC50aHJlYWRJZCxcbiAgICAgICAgb3JnSWQ6IGlucHV0Lm9yZ0lkLFxuICAgICAgICBkaXNwbGF5TnVtYmVyLFxuICAgICAgICBzdGF0dXM6ICdvcGVuJyxcbiAgICAgICAgc2V2ZXJpdHk6IGlucHV0LnNldmVyaXR5LFxuICAgICAgICBsZXZlbDogaW5wdXQubGV2ZWwsXG4gICAgICAgIG9wZW5lZFdpdGhJbmNpZGVudDogaW5wdXQub3BlbmVkV2l0aEluY2lkZW50ID8/IGZhbHNlLFxuICAgICAgICAvLyBGcm96ZW4gYXQgb3BlbiwgbGlrZSBgbGV2ZWxgOiBhIHdvcmtpbmctd2VlayBvciBob2xpZGF5IGNoYW5nZSBtdXN0XG4gICAgICAgIC8vIG5vdCBtb3ZlIGEgcHJvbWlzZSBhbHJlYWR5IG1hZGUuXG4gICAgICAgIHJlc3BvbnNlRHVlQXQ6IGlucHV0LnJlc3BvbnNlRHVlQXQgPz8gbnVsbCxcbiAgICAgICAgLy8gVGhlIG9wZW5lciBvd25zIGl0IG9uIHRoZSB0ZW5hbnQgc2lkZSB1bnRpbCBpdCBpcyBoYW5kZWQgb3Zlci5cbiAgICAgICAgdGVuYW50Q29udGFjdDogaW5wdXQub3BlbmVkQnksXG4gICAgICAgIGNyZWF0ZWRCeTogaW5wdXQub3BlbmVkQnksXG4gICAgICAgIHVwZGF0ZWRCeTogaW5wdXQub3BlbmVkQnksXG4gICAgICB9KVxuICAgICAgLnJldHVybmluZygpO1xuICAgIGNvbnN0IHJvdyA9IHJvd3NbMF07XG4gICAgaWYgKCFyb3cpIHRocm93IG5ldyBFcnJvcignc3VwcG9ydCBjYXNlIGluc2VydCByZXR1cm5lZCBubyByb3cnKTtcbiAgICByZXR1cm4gcm93O1xuICB9KTtcbn1cblxuLyoqIFRoZSBjYXNlIGZvciBhIHRocmVhZCwgb3IgbnVsbC4gVGhlIHRocmVhZCByb290IGlkIElTIHRoZSBjYXNlIGlkZW50aXR5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRDYXNlQnlUaHJlYWQodGhyZWFkSWQ6IHN0cmluZyk6IFByb21pc2U8U3VwcG9ydENhc2UgfCBudWxsPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC5zZWxlY3QoKVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5zdXBwb3J0Q2FzZS50aHJlYWRJZCwgdGhyZWFkSWQpLCBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlLmRlbGV0ZWRBdCkpKVxuICAgIC5saW1pdCgxKSk7XG4gIHJldHVybiByb3dzWzBdID8/IG51bGw7XG59XG5cbi8qKiBEZWZhdWx0IGFuZCBjZWlsaW5nIHBhZ2Ugc2l6ZSBmb3IgdGhlIHR3byBjYXNlIGxpc3RzLiAqL1xuZXhwb3J0IGNvbnN0IFNVUFBPUlRfQ0FTRV9QQUdFX0RFRkFVTFQgPSAxMDA7XG5leHBvcnQgY29uc3QgU1VQUE9SVF9DQVNFX1BBR0VfTUFYID0gMTAwMDtcblxuLyoqIFBhZ2luZyBpbnB1dCBmb3IgdGhlIGNhc2UgbGlzdHM6IGEgcGFnZSBzaXplIGFuZCB0aGUgYG5leHRDdXJzb3JgIG9mIHRoZSBwcmV2aW91cyBwYWdlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdXBwb3J0Q2FzZVBhZ2VPcHRpb25zIHtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIC8qKiBPcGFxdWUg4oCUIHBhc3MgYmFjayB0aGUgcHJldmlvdXMgcGFnZSdzIGBuZXh0Q3Vyc29yYCB2ZXJiYXRpbS4gKi9cbiAgY3Vyc29yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9uZSBwYWdlIG9mIGNhc2VzLiBgaGFzTW9yZWAgc2F5cyBhIGZ1cnRoZXIgcGFnZSBleGlzdHMgYW5kIGBuZXh0Q3Vyc29yYFxuICogZmV0Y2hlcyBpdCDigJQgc28gYSBsaXN0IGlzIG5ldmVyIHNpbGVudGx5IGN1dCBhdCB0aGUgcGFnZSBzaXplLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1cHBvcnRDYXNlUGFnZSB7XG4gIGNhc2VzOiBTdXBwb3J0Q2FzZVtdO1xuICBoYXNNb3JlOiBib29sZWFuO1xuICBuZXh0Q3Vyc29yPzogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBwYWdlTGltaXQobGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGNvbnN0IG4gPSBNYXRoLmZsb29yKGxpbWl0ID8/IFNVUFBPUlRfQ0FTRV9QQUdFX0RFRkFVTFQpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pID8gTWF0aC5taW4oTWF0aC5tYXgobiwgMSksIFNVUFBPUlRfQ0FTRV9QQUdFX01BWCkgOiBTVVBQT1JUX0NBU0VfUEFHRV9ERUZBVUxUO1xufVxuXG4vKiogQSBkZWNvZGVkIGN1cnNvciB3aG9zZSBpZCBhbmQgc29ydCB0ZXh0IGFyZSBzYWZlIHRvIGJpbmQsIG9yIG51bGwgKHJlYWQgZnJvbSB0aGUgc3RhcnQpLiAqL1xuZnVuY3Rpb24gZGVjb2RlQ2FzZUN1cnNvcihjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgc29ydFRleHQ6IHN0cmluZzsgaWQ6IHN0cmluZyB9IHwgbnVsbCB7XG4gIGlmICghY3Vyc29yKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUN1cnNvcihjdXJzb3IpO1xuICByZXR1cm4gZGVjb2RlZCAmJiBkZWNvZGVkLnNvcnRUZXh0ICE9PSBudWxsXG4gICAgJiYgaXNDYXN0YWJsZVRvKHNjaGVtYS5zdXBwb3J0Q2FzZS5pZCwgZGVjb2RlZC5pZClcbiAgICAmJiBpc0Nhc3RhYmxlVG8oc2NoZW1hLnN1cHBvcnRDYXNlLmNyZWF0ZWRBdCwgZGVjb2RlZC5zb3J0VGV4dClcbiAgICA/IHsgc29ydFRleHQ6IGRlY29kZWQuc29ydFRleHQsIGlkOiBkZWNvZGVkLmlkIH1cbiAgICA6IG51bGw7XG59XG5cbi8qKiBGZXRjaCBgbGltaXQgKyAxYCByb3dzIChzZWxlY3RpbmcgdGhlIHNvcnQga2V5IGFzIHRleHQpLCBhbmQgY3V0IHRoZW0gaW50byBhIHBhZ2UuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUGFnZShcbiAgbGltaXQ6IG51bWJlcixcbiAgc29ydEtleTogU1FMLFxuICBxdWVyeTogKHNlbGVjdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IFByb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+Pixcbik6IFByb21pc2U8U3VwcG9ydENhc2VQYWdlPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeSh7IC4uLmdldFRhYmxlQ29sdW1ucyhzY2hlbWEuc3VwcG9ydENhc2UpLCBbQ1VSU09SX1NPUlRfS0VZXTogc3FsPHN0cmluZz5gKCR7c29ydEtleX0pOjp0ZXh0YCB9KTtcbiAgY29uc3QgaGFzTW9yZSA9IHJvd3MubGVuZ3RoID4gbGltaXQ7XG4gIGNvbnN0IHBhZ2UgPSBoYXNNb3JlID8gcm93cy5zbGljZSgwLCBsaW1pdCkgOiByb3dzO1xuICBjb25zdCBjYXNlcyA9IHBhZ2UubWFwKChyb3cpID0+IHtcbiAgICBjb25zdCB7IFtDVVJTT1JfU09SVF9LRVldOiBfc29ydCwgLi4ucmVzdCB9ID0gcm93O1xuICAgIHJldHVybiByZXN0IGFzIHVua25vd24gYXMgU3VwcG9ydENhc2U7XG4gIH0pO1xuICBjb25zdCBsYXN0ID0gcGFnZVtwYWdlLmxlbmd0aCAtIDFdO1xuICByZXR1cm4ge1xuICAgIGNhc2VzLFxuICAgIGhhc01vcmUsXG4gICAgLi4uKGhhc01vcmUgJiYgbGFzdCA/IHsgbmV4dEN1cnNvcjogZW5jb2RlQ3Vyc29yKFN0cmluZyhsYXN0W0NVUlNPUl9TT1JUX0tFWV0pLCBTdHJpbmcobGFzdC5pZCkpIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGluc3RhbnQgYSBjYXNlJ3Mgd2FpdGluZyBjbG9jayByZWFkcyBmcm9tOiBgY3JlYXRlZF9hdGAgcHVzaGVkIGZvcndhcmQgYnlcbiAqIHRoZSB0aW1lIGl0IHNwZW50IG9uIHRoZSBjdXN0b21lciAoYGF3YWl0aW5nX3RvdGFsX3NlY29uZHNgKS4gT3JkZXJpbmcgYnkgaXRcbiAqIGFzY2VuZGluZyBJUyBcImxvbmdlc3Qgd2FpdGluZyBmaXJzdFwiIOKAlCBgd2FpdGluZ1NlY29uZHMgPSBub3cg4oiSIGNyZWF0ZWRfYXQg4oiSXG4gKiBhd2FpdGluZ190b3RhbF9zZWNvbmRzYCBpcyB0aGlzIGluc3RhbnQgc3VidHJhY3RlZCBmcm9tIG5vdyDigJQgYnV0LCB1bmxpa2VcbiAqIHdhaXRpbmdTZWNvbmRzLCBpdCBkb2VzIG5vdCBtb3ZlIHdpdGggdGhlIGNsb2NrLCBzbyBpdCBjYW4gYmUgb3JkZXJlZCBvbixcbiAqIExJTUlUZWQgb24gYW5kIHBhZ2VkIGJ5IGEga2V5c2V0IGN1cnNvci5cbiAqL1xuY29uc3QgcXVldWVXYWl0QW5jaG9yID0gc3FsYCgke3NjaGVtYS5zdXBwb3J0Q2FzZS5jcmVhdGVkQXR9ICsgbWFrZV9pbnRlcnZhbChzZWNzID0+ICR7c2NoZW1hLnN1cHBvcnRDYXNlLmF3YWl0aW5nVG90YWxTZWNvbmRzfSkpYDtcblxuLyoqXG4gKiBUaGUgc3RhZmYgcXVldWU6IG9wZW4gY2FzZXMgYWNyb3NzIEFMTCB0ZW5hbnRzLCBMT05HRVNUIFdBSVRJTkcgZmlyc3QuXG4gKlxuICogVGhlIG9uZSByZWFkIHdpdGggbm8gb3JnIHByZWRpY2F0ZSwgc28gaXQgcnVucyB1bmRlciBzeXNhZG1pbiBzY29wZTsgdGhlXG4gKiBwYXJ0aWFsIGBzdXBwb3J0X2Nhc2VfcXVldWVfaWR4YCAob3BlbiBzdGF0dXNlcywgbm90IGRlbGV0ZWQpIGJvdW5kcyB0aGUgcm93c1xuICogaXQgc29ydHMuXG4gKlxuICogVGhlIG9yZGVyIGlzIHRoZSBxdWV1ZSdzIGRpc3BsYXllZCBvcmRlciDigJQgdGhlIHdhaXRpbmcgdGltZSBhIGh1bWFuIGFjdHMgb25cbiAqIChzZWUge0BsaW5rIHF1ZXVlV2FpdEFuY2hvcn0pIOKAlCBhbmQgaXQgaXMgYXBwbGllZCBCRUZPUkUgdGhlIGxpbWl0LiBJdCB1c2VkXG4gKiB0byBiZSBgcmVzcG9uc2VfZHVlX2F0YCBoZXJlIGFuZCB3YWl0aW5nU2Vjb25kcyBpbiB0aGUgcm91dGUsIHNvIHdpdGggbW9yZVxuICogY2FzZXMgdGhhbiB0aGUgbGltaXQgdGhlIHJvdXRlIHJlLXNvcnRlZCBhIHBhZ2UgdGFrZW4gb24gYSBkaWZmZXJlbnQga2V5IGFuZFxuICogdGhlIGxvbmdlc3Qtd2FpdGluZyBjYXNlIGNvdWxkIGJlIHRoZSBvbmUgY3V0IG9mZi4gYGlkYCBicmVha3MgdGllcywgc28gdGhlXG4gKiBvcmRlciBpcyB0b3RhbCBhbmQgdGhlIGN1cnNvciBzdGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0UXVldWUob3B0czogU3VwcG9ydENhc2VQYWdlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTdXBwb3J0Q2FzZVBhZ2U+IHtcbiAgY29uc3QgbGltaXQgPSBwYWdlTGltaXQob3B0cy5saW1pdCk7XG4gIGNvbnN0IGFmdGVyID0gZGVjb2RlQ2FzZUN1cnNvcihvcHRzLmN1cnNvcik7XG4gIHJldHVybiB3aXRoVGVuYW50VHgoKHR4KSA9PiByZWFkUGFnZShsaW1pdCwgcXVldWVXYWl0QW5jaG9yLCAoc2VsZWN0KSA9PiB0eFxuICAgIC5zZWxlY3Qoc2VsZWN0IGFzIG5ldmVyKVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgaW5BcnJheShzY2hlbWEuc3VwcG9ydENhc2Uuc3RhdHVzLCBbLi4uUVVFVUVfU1RBVFVTRVNdKSxcbiAgICAgIGlzTnVsbChzY2hlbWEuc3VwcG9ydENhc2UuZGVsZXRlZEF0KSxcbiAgICAgIC4uLihhZnRlclxuICAgICAgICA/IFtzcWxgKCR7cXVldWVXYWl0QW5jaG9yfSA+ICR7YWZ0ZXIuc29ydFRleHR9Ojp0aW1lc3RhbXB0eiBPUiAoJHtxdWV1ZVdhaXRBbmNob3J9ID0gJHthZnRlci5zb3J0VGV4dH06OnRpbWVzdGFtcHR6IEFORCAke3NjaGVtYS5zdXBwb3J0Q2FzZS5pZH0gPiAke2FmdGVyLmlkfSkpYF1cbiAgICAgICAgOiBbXSksXG4gICAgKSlcbiAgICAub3JkZXJCeShzcWxgJHtxdWV1ZVdhaXRBbmNob3J9IEFTQ2AsIGFzYyhzY2hlbWEuc3VwcG9ydENhc2UuaWQpKVxuICAgIC5saW1pdChsaW1pdCArIDEpIGFzIHVua25vd24gYXMgUHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KSk7XG59XG5cbi8qKlxuICogUHJlbWl1bSBjYXNlcyB3aG9zZSByZXNwb25zZSB0YXJnZXQgaXMgYXBwcm9hY2hpbmcgd2l0aCBubyBmaXJzdCByZXNwb25zZSB5ZXQuXG4gKlxuICogVEhFIG9uLWNhbGwgc3dlZXAncyBvbmx5IHF1ZXJ5LCBhbmQgdGhlIHJlYXNvbiB0aGUgcGFnZXIgaXMgd29ydGggb3duaW5nIHRoZVxuICogdHJpZ2dlciBmb3I6IHRoaXMgaXMgYW4gRVhBQ1QgcGVyLWNhc2UgZGVhZGxpbmUsIHdoZXJlIHRoZSBmbGVldCBhbGVydFxuICogKGBTdXBwb3J0UHJlbWl1bUZpcnN0UmVzcG9uc2VBdFJpc2tgKSBpcyBhIHA5MCBvdmVyIHNpeCBob3VycyB0aGF0IGNhbiBvbmx5XG4gKiBzYXkgdGhlIGRpc3RyaWJ1dGlvbiBhbHJlYWR5IGRyaWZ0ZWQg4oCUIG5ldmVyIHdoaWNoIGNhc2UgaXMgYWJvdXQgdG8gYnJlYWNoLlxuICpcbiAqIFRoZSBwcmVkaWNhdGUgbWF0Y2hlcyBgc3VwcG9ydF9jYXNlX3Jlc3BvbnNlX2R1ZV9pZHhgIGV4YWN0bHksIHdoaWNoIGlzIGFcbiAqIFBBUlRJQUwgaW5kZXggb24gYChyZXNwb25zZV9kdWVfYXQpIFdIRVJFIGxldmVsID0gJ3N1cHBvcnRfcHJlbWl1bScgQU5EXG4gKiBmaXJzdF9yZXNwb25zZV9hdCBJUyBOVUxMIEFORCBkZWxldGVkX2F0IElTIE5VTExgLiBOb3RlIGBsZXZlbGAgYW5kIG5vdFxuICogYGlzX3ByZW1pdW1gOiB0aGF0IGNvbHVtbiBsaXZlcyBvbiBzdXBwb3J0X0NPTlRBQ1RTIGFuZCBtYXJrcyBhbiB1cGdyYWRlZFxuICogY29udGFjdCwgd2hpbGUgYSBjYXNlIGZyZWV6ZXMgdGhlIG9wZW5pbmcgY29udGFjdCdzIGVmZmVjdGl2ZSBsZXZlbCBhdCBvcGVuIOKAlFxuICogc28gdGhlIGNhc2UncyBvd24gcHJvbWlzZSBpcyBpdHMgYGxldmVsYCwgYW5kIGZsaXBwaW5nIHRoZSBjb250YWN0IGxhdGVyIG11c3RcbiAqIG5vdCBjaGFuZ2UgYSBkZWFkbGluZSBhbHJlYWR5IHB1Ymxpc2hlZCB0byBhIGN1c3RvbWVyLiBUaGF0IG1hdHRlcnMgYmVjYXVzZSB0aGlzIHJ1bnMgb24gYSB0aW1lclxuICogZm9yZXZlcjogdGhlIHJvd3MgaXQgd2FudHMgYXJlIGEgdGlueSBhbmQgc2hyaW5raW5nIGZyYWN0aW9uIG9mIHRoZSB0YWJsZSwgc29cbiAqIHRoZSBpbmRleCBzdGF5cyBzbWFsbCB3aGlsZSB0aGUgdGFibGUgZ3Jvd3MsIGFuZCB3aXRob3V0IGl0IGV2ZXJ5IHRpY2sgaXMgYVxuICogc2Nhbi5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGZpbHRlcmVkIG9uIHN0YXR1cy4gQSBjYXNlIHRoYXQgaXMgYGF3YWl0aW5nX3N1cHBvcnRgIGFuZCBvbmVcbiAqIHRoYXQgaXMgYG9wZW5gIGJvdGggb3dlIGEgZmlyc3QgcmVzcG9uc2UsIGFuZCByZWFkaW5nIHRoZSBzdGF0dXMgaGVyZSB3b3VsZFxuICogZHVwbGljYXRlIGEgcnVsZSB0aGF0IGBmaXJzdF9yZXNwb25zZV9hdCBJUyBOVUxMYCBhbHJlYWR5IHN0YXRlcyBleGFjdGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdENhc2VzRHVlRm9yUGFnZShsZWFkTXM6IG51bWJlciwgbGltaXQgPSAxMDApOiBQcm9taXNlPFN1cHBvcnRDYXNlW10+IHtcbiAgY29uc3QgY3V0b2ZmID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIGxlYWRNcyk7XG4gIC8vIFRISVMgRlVOQ1RJT04gSVMgVEhFIFBSSVZJTEVHRSBCT1VOREFSWSwgc28gdGhlIHNjb3BlIGlzIGVzdGFibGlzaGVkIGhlcmVcbiAgLy8gcmF0aGVyIHRoYW4gbGVmdCB0byB0aGUgY2FsbGVyLiBUaGUgc3dlZXAgcnVucyBvbiBhIHRpbWVyIHdpdGggbm8gcmVxdWVzdFxuICAvLyBhbmQgdGhlcmVmb3JlIG5vIHRlbmFudCBjb250ZXh0LCBhbmQgYHN1cHBvcnRfY2FzZXNgIGlzIFJMUyBGT1JDRSdkIOKAlCBzb1xuICAvLyB3aXRob3V0IGEgc2NvcGUgdGhlIHJlYWQgcmV0dXJucyB6ZXJvIHJvd3MgKGFuZCB0aHJvd3MgaW4gcHJvZHVjdGlvblxuICAvLyBgc3RyaWN0YCBtb2RlKSwgd2hpY2ggaXMgdGhlIHNoYXBlIG9mIGEgc3dlZXAgdGhhdCBzaWxlbnRseSBjb3ZlcnMgbm90aGluZy5cbiAgLy8gQ3Jvc3MtdGVuYW50IGlzIHRoZSBwb2ludDogb25lIG9wZXJhdG9yIHJvdGEgYW5zd2VycyBmb3IgZXZlcnkgb3JnJ3NcbiAgLy8gcHJlbWl1bSBjYXNlcy4gT25seSBJRFMgbGVhdmUgaGVyZTsgdGhlIHBhZ2VyIG5ldmVyIHJlY2VpdmVzIGNhc2UgY29udGVudC5cbiAgcmV0dXJuIHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnNlbGVjdCgpXG4gICAgLmZyb20oc2NoZW1hLnN1cHBvcnRDYXNlKVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENhc2UubGV2ZWwsICdzdXBwb3J0X3ByZW1pdW0nKSxcbiAgICAgIGlzTnVsbChzY2hlbWEuc3VwcG9ydENhc2UuZmlyc3RSZXNwb25zZUF0KSxcbiAgICAgIGlzTnVsbChzY2hlbWEuc3VwcG9ydENhc2UuZGVsZXRlZEF0KSxcbiAgICAgIGx0ZShzY2hlbWEuc3VwcG9ydENhc2UucmVzcG9uc2VEdWVBdCwgY3V0b2ZmKSxcbiAgICApKVxuICAgIC5vcmRlckJ5KGFzYyhzY2hlbWEuc3VwcG9ydENhc2UucmVzcG9uc2VEdWVBdCkpXG4gICAgLmxpbWl0KGxpbWl0KSkpO1xufVxuXG4vKipcbiAqIEFuIG9yZydzIG93biBjYXNlcyAoY2xvc2VkIG9uZXMgaW5jbHVkZWQpLCBuZXdlc3QgZmlyc3QsIG9uZSBwYWdlIGF0IGEgdGltZS5cbiAqIGBjcmVhdGVkX2F0IERFU0MsIGlkIERFU0NgIGlzIHRvdGFsLCBzbyB0aGUga2V5c2V0IGN1cnNvciBuZWl0aGVyIHJlcGVhdHMgbm9yXG4gKiBza2lwcyBhIGNhc2U7IHNlcnZlZCBieSBgc3VwcG9ydF9jYXNlX29yZ19jcmVhdGVkX2lkeGAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0T3JnQ2FzZXMob3JnSWQ6IHN0cmluZywgb3B0czogU3VwcG9ydENhc2VQYWdlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTdXBwb3J0Q2FzZVBhZ2U+IHtcbiAgY29uc3QgbGltaXQgPSBwYWdlTGltaXQob3B0cy5saW1pdCk7XG4gIGNvbnN0IGFmdGVyID0gZGVjb2RlQ2FzZUN1cnNvcihvcHRzLmN1cnNvcik7XG4gIHJldHVybiB3aXRoVGVuYW50VHgoKHR4KSA9PiByZWFkUGFnZShsaW1pdCwgc3FsYCR7c2NoZW1hLnN1cHBvcnRDYXNlLmNyZWF0ZWRBdH1gLCAoc2VsZWN0KSA9PiB0eFxuICAgIC5zZWxlY3Qoc2VsZWN0IGFzIG5ldmVyKVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDYXNlLm9yZ0lkLCBvcmdJZCksXG4gICAgICBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlLmRlbGV0ZWRBdCksXG4gICAgICAuLi4oYWZ0ZXIgPyBba2V5c2V0QWZ0ZXIoc2NoZW1hLnN1cHBvcnRDYXNlLmNyZWF0ZWRBdCwgc2NoZW1hLnN1cHBvcnRDYXNlLmlkLCAnZGVzYycsIGFmdGVyLnNvcnRUZXh0LCBhZnRlci5pZCldIDogW10pLFxuICAgICkpXG4gICAgLm9yZGVyQnkoZGVzYyhzY2hlbWEuc3VwcG9ydENhc2UuY3JlYXRlZEF0KSwgZGVzYyhzY2hlbWEuc3VwcG9ydENhc2UuaWQpKVxuICAgIC5saW1pdChsaW1pdCArIDEpIGFzIHVua25vd24gYXMgUHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KSk7XG59XG5cbi8qKlxuICogU3RhbXAgdGhlIGZpcnN0IHN0YWZmIHJlc3BvbnNlLCBvbmNlLlxuICpcbiAqIGBmaXJzdF9yZXNwb25zZV9hdCBJUyBOVUxMYCBpcyBpbiB0aGUgV0hFUkUgY2xhdXNlIHJhdGhlciB0aGFuIGNoZWNrZWQgYnkgdGhlXG4gKiBjYWxsZXI6IHRoaXMgaXMgVEhFIG51bWJlciB0aGUgcmVzcG9uc2UgdGFyZ2V0IGlzIHNvbGQgb24sIHNvIGEgc2Vjb25kIHJlcGx5XG4gKiBtdXN0IG5vdCBiZSBhYmxlIHRvIG1vdmUgaXQuIFJldHVybnMgd2hldGhlciB0aGlzIGNhbGwgd2FzIHRoZSBvbmUgdGhhdFxuICogc3RhbXBlZCBpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YW1wRmlyc3RSZXNwb25zZShjYXNlSWQ6IHN0cmluZywgYXQ6IERhdGUgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC51cGRhdGUoc2NoZW1hLnN1cHBvcnRDYXNlKVxuICAgIC5zZXQoeyBmaXJzdFJlc3BvbnNlQXQ6IGF0LCB1cGRhdGVkQXQ6IGF0IH0pXG4gICAgLndoZXJlKGFuZChlcShzY2hlbWEuc3VwcG9ydENhc2UuaWQsIGNhc2VJZCksIGlzTnVsbChzY2hlbWEuc3VwcG9ydENhc2UuZmlyc3RSZXNwb25zZUF0KSkpXG4gICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEuc3VwcG9ydENhc2UuaWQgfSkpO1xuICByZXR1cm4gcm93cy5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIE1vdmUgYSBjYXNlJ3Mgc3RhdHVzLCBtYWludGFpbmluZyB0aGUgcmVzcG9uc2UgY2xvY2suXG4gKlxuICogRW50ZXJpbmcgYGF3YWl0aW5nX2N1c3RvbWVyYCBhbmNob3JzIGBhd2FpdGluZ1NpbmNlYDsgbGVhdmluZyBpdCBmb2xkcyB0aGVcbiAqIGVsYXBzZWQgc3BhbiBpbnRvIGBhd2FpdGluZ1RvdGFsU2Vjb25kc2AgYW5kIGNsZWFycyB0aGUgYW5jaG9yLiBBZ2VpbmcgdGhlblxuICogc3VidHJhY3RzIHRoZSBhY2N1bXVsYXRvciwgc28gYSBjYXNlIHdlIGFuc3dlcmVkIGluIGFuIGhvdXIgYW5kIHRoZSB0ZW5hbnRcbiAqIHJlcGxpZWQgdG8gZm91ciBkYXlzIGxhdGVyIGRvZXMgbm90IHJlYWQgYXMgYSBmb3VyLWRheSBjYXNlIOKAlCB3aGljaCBpcyB0aGVcbiAqIG51bWJlciBubyBjdXN0b21lciB3b3VsZCBhY2NlcHQuXG4gKlxuICogVGhlIGFyaXRobWV0aWMgaXMgZG9uZSBpbiBTUUwgYWdhaW5zdCB0aGUgc3RvcmVkIGFuY2hvciByYXRoZXIgdGhhbiBmcm9tIGFcbiAqIGNhbGxlci1zdXBwbGllZCBkdXJhdGlvbiwgc28gYSBjbG9jayBza2V3IG9yIGEgbG9zdCByb3VuZCB0cmlwIGNhbm5vdCBpbmZsYXRlXG4gKiBvciBlcmFzZSBwYXVzZWQgdGltZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldENhc2VTdGF0dXMoXG4gIGNhc2VJZDogc3RyaW5nLFxuICBzdGF0dXM6IFN1cHBvcnRDYXNlU3RhdHVzLFxuICBhY3RvcklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPFN1cHBvcnRDYXNlIHwgbnVsbD4ge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCBlbnRlcmluZyA9IHN0YXR1cyA9PT0gJ2F3YWl0aW5nX2N1c3RvbWVyJztcbiAgY29uc3QgY2xvc2luZyA9IHN0YXR1cyA9PT0gJ2Nsb3NlZCcgfHwgc3RhdHVzID09PSAncmVzb2x2ZWQnO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAudXBkYXRlKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAuc2V0KHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIHVwZGF0ZWRCeTogYWN0b3JJZCxcbiAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgLy8gQW5jaG9yIG9uIGVudHJ5OyBvbiBhbnkgb3RoZXIgdHJhbnNpdGlvbiBmb2xkIHRoZSBvcGVuIHNwYW4gaW4gYW5kIGNsZWFyLlxuICAgICAgYXdhaXRpbmdTaW5jZTogZW50ZXJpbmcgPyBub3cgOiBudWxsLFxuICAgICAgYXdhaXRpbmdUb3RhbFNlY29uZHM6IGVudGVyaW5nXG4gICAgICAgID8gc2NoZW1hLnN1cHBvcnRDYXNlLmF3YWl0aW5nVG90YWxTZWNvbmRzXG4gICAgICAgIDogc3FsYCR7c2NoZW1hLnN1cHBvcnRDYXNlLmF3YWl0aW5nVG90YWxTZWNvbmRzfSArIENPQUxFU0NFKEVYVFJBQ1QoRVBPQ0ggRlJPTSAoJHtub3cudG9JU09TdHJpbmcoKX06OnRpbWVzdGFtcHR6IC0gJHtzY2hlbWEuc3VwcG9ydENhc2UuYXdhaXRpbmdTaW5jZX0pKTo6aW50LCAwKWAsXG4gICAgICAuLi4oY2xvc2luZyA/IHsgY2xvc2VkQXQ6IG5vdywgY2xvc2VkQnk6IGFjdG9ySWQgfSA6IHsgY2xvc2VkQXQ6IG51bGwsIGNsb3NlZEJ5OiBudWxsIH0pLFxuICAgIH0pXG4gICAgLndoZXJlKGFuZChlcShzY2hlbWEuc3VwcG9ydENhc2UuaWQsIGNhc2VJZCksIGlzTnVsbChzY2hlbWEuc3VwcG9ydENhc2UuZGVsZXRlZEF0KSkpXG4gICAgLnJldHVybmluZygpKTtcbiAgcmV0dXJuIHJvd3NbMF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZS1yYW5rIGEgY2FzZSdzIHNldmVyaXR5LlxuICpcbiAqIFNUQUZGIE9OTFkgYXQgdGhlIHJvdXRlIGxheWVyLCBhbmQgdGhhdCBpcyB0aGUgZ292ZXJuYW5jZSBwb2ludCByYXRoZXIgdGhhbiBhXG4gKiBwZXJtaXNzaW9uIGRldGFpbDogdGhlIHRlbmFudCBjaG9vc2VzIHNldmVyaXR5IHdoZW4gb3BlbmluZywgc28gaWYgdGhleSBjb3VsZFxuICogYWxzbyBjaGFuZ2UgaXQgYWZ0ZXJ3YXJkcyB0aGV5IHdvdWxkIHVuaWxhdGVyYWxseSBwaWNrIHRoZSByZXNwb25zZSB0YXJnZXRcbiAqIHRoZXkgYXJlIG93ZWQuIFNldmVyaXR5IGRlY2lkZXMgd2hpY2ggdGFyZ2V0IGFwcGxpZXMsIHNvIHJlLXJhbmtpbmcgaGFzIHRvIGJlXG4gKiBvdXJzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0Q2FzZVNldmVyaXR5KGNhc2VJZDogc3RyaW5nLCBzZXZlcml0eTogc3RyaW5nLCBhY3RvcklkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnVwZGF0ZShzY2hlbWEuc3VwcG9ydENhc2UpXG4gICAgLnNldCh7IHNldmVyaXR5LCB1cGRhdGVkQnk6IGFjdG9ySWQsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnN1cHBvcnRDYXNlLmlkLCBjYXNlSWQpLCBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlLmRlbGV0ZWRBdCkpKVxuICAgIC5yZXR1cm5pbmcoeyBzZXZlcml0eTogc2NoZW1hLnN1cHBvcnRDYXNlLnNldmVyaXR5IH0pKTtcbiAgcmV0dXJuIHJvd3NbMF0/LnNldmVyaXR5ID8/IG51bGw7XG59XG5cbi8qKlxuICogU2V0IG9yIGNsZWFyIHRoZSBTVEFGRiBvd25lci5cbiAqXG4gKiBgbnVsbGAgaXMgYSBsZWdpdGltYXRlIHZhbHVlOiBpdCBpcyB0aGUgdW5vd25lZCBwb29sLCBhbmQgaG93IFwiSSBjYW5ub3QgdGFrZVxuICogdGhpc1wiIGlzIGV4cHJlc3NlZCB3aXRob3V0IGludmVudGluZyBhIHBzZXVkby1hc3NpZ25lZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2lnbkNhc2UoY2FzZUlkOiBzdHJpbmcsIGFzc2lnbmVkVG86IHN0cmluZyB8IG51bGwsIGFjdG9ySWQ6IHN0cmluZyk6IFByb21pc2U8U3VwcG9ydENhc2UgfCBudWxsPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC51cGRhdGUoc2NoZW1hLnN1cHBvcnRDYXNlKVxuICAgIC5zZXQoeyBhc3NpZ25lZFRvLCB1cGRhdGVkQnk6IGFjdG9ySWQsIHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9KVxuICAgIC53aGVyZShhbmQoZXEoc2NoZW1hLnN1cHBvcnRDYXNlLmlkLCBjYXNlSWQpLCBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlLmRlbGV0ZWRBdCkpKVxuICAgIC5yZXR1cm5pbmcoKSk7XG4gIHJldHVybiByb3dzWzBdID8/IG51bGw7XG59XG5cbi8qKlxuICogQXNzaWduIG9yIHJlbGVhc2UgTUFOWSBjYXNlcyBhdCBvbmNlLlxuICpcbiAqIE9uZSBzdGF0ZW1lbnQgcmF0aGVyIHRoYW4gYSBsb29wLCB3aGljaCBpcyB0aGUgcG9pbnQ6IGEgc3RhZmYgbWVtYmVyIGNsZWFyaW5nXG4gKiBhIHF1ZXVlIG9mIHRoaXJ0eSBzZWxlY3RzIHRoaXJ0eSBhbmQgYWN0cyBvbmNlLCBhbmQgdGhpcnR5IHJvdW5kIHRyaXBzIHdvdWxkXG4gKiBtYWtlIHRoZSBvYnZpb3VzIGludGVyYWN0aW9uIHRoZSBzbG93IG9uZS4gSXQgYWxzbyBtYWtlcyB0aGUgd3JpdGUgQVRPTUlDIOKAlCBhXG4gKiBwYXJ0aWFsIGJ1bGsgYXNzaWduIGxlYXZlcyB0aGUgcXVldWUgaW4gYSBzdGF0ZSBub2JvZHkgY2hvc2UsIGFuZCB0aGUgb3BlcmF0b3JcbiAqIGNhbm5vdCB0ZWxsIHdoaWNoIGhhbGYgdG9vay5cbiAqXG4gKiBSZXR1cm5zIHRoZSBpZHMgdGhhdCBhY3R1YWxseSBtb3ZlZCByYXRoZXIgdGhhbiBhIGNvdW50LCBzbyBhIGNhbGxlciBjYW5cbiAqIHJlcG9ydCBwcmVjaXNlbHkgd2hhdCBoYXBwZW5lZCB3aGVuIHRoZSBzZWxlY3Rpb24gaW5jbHVkZWQgc29tZXRoaW5nIHN0YWxlOlxuICogYSBjYXNlIGNsb3NlZCBvciByZWFzc2lnbmVkIGJ5IHNvbWVib2R5IGVsc2UgYmV0d2VlbiB0aGUgcmVhZCBhbmQgdGhlIGNsaWNrLlxuICogVGhhdCBpcyB0aGUgbm9ybWFsIGNhc2Ugb24gYSBzaGFyZWQgcXVldWUsIG5vdCBhbiBlZGdlIG9uZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2lnbkNhc2VzKFxuICBjYXNlSWRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgYXNzaWduZWRUbzogc3RyaW5nIHwgbnVsbCxcbiAgYWN0b3JJZDogc3RyaW5nLFxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBpZiAoY2FzZUlkcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnVwZGF0ZShzY2hlbWEuc3VwcG9ydENhc2UpXG4gICAgLnNldCh7IGFzc2lnbmVkVG8sIHVwZGF0ZWRCeTogYWN0b3JJZCwgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpIH0pXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGluQXJyYXkoc2NoZW1hLnN1cHBvcnRDYXNlLmlkLCBbLi4uY2FzZUlkc10pLFxuICAgICAgaXNOdWxsKHNjaGVtYS5zdXBwb3J0Q2FzZS5kZWxldGVkQXQpLFxuICAgICkpXG4gICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEuc3VwcG9ydENhc2UuaWQgfSkpO1xuICByZXR1cm4gcm93cy5tYXAoKHIpID0+IHIuaWQpO1xufVxuXG4vKipcbiAqIENsb3NlIE1BTlkgY2FzZXMgYXQgb25jZS5cbiAqXG4gKiBTZXBhcmF0ZSBmcm9tIHtAbGluayBhc3NpZ25DYXNlc30gcmF0aGVyIHRoYW4gYSBnZW5lcmljIGJ1bGstdXBkYXRlLCBiZWNhdXNlXG4gKiBjbG9zaW5nIG1haW50YWlucyB0aGUgcmVzcG9uc2UgY2xvY2sg4oCUIGl0IGZvbGRzIHRoZSBvcGVuIGF3YWl0aW5nIHNwYW4gaW50b1xuICogdGhlIGFjY3VtdWxhdG9yIGFuZCBzdGFtcHMgYGNsb3NlZEF0YCDigJQgYW5kIGEgZ2VuZXJpYyBzZXR0ZXIgd291bGQgcXVpZXRseVxuICogc2tpcCB0aGF0LiBUaGUgYXJpdGhtZXRpYyBpcyB0aGUgc2FtZSBTUUwgYHNldENhc2VTdGF0dXNgIHVzZXMsIGZvciB0aGUgc2FtZVxuICogcmVhc29uOiBkb25lIGFnYWluc3QgdGhlIFNUT1JFRCBhbmNob3Igc28gYSBjbG9jayBza2V3IGNhbm5vdCBpbmZsYXRlIHBhdXNlZFxuICogdGltZS5cbiAqXG4gKiBPbmx5IGV2ZXIgdXNlZCB0byBDTE9TRS4gQnVsayBSRU9QRU5JTkcgaXMgZGVsaWJlcmF0ZWx5IG5vdCBvZmZlcmVkOiByZW9wZW5pbmdcbiAqIGlzIHN0YWZmLW9ubHkgYW5kIGNhc2UtYnktY2FzZSBieSBkZXNpZ24sIGFuZCBhIGJ1bGsgcmVvcGVuIGlzIGhvdyBhIHF1ZXVlXG4gKiBzb21lb25lIGhhcyBmaW5pc2hlZCB3aXRoIGNvbWVzIGJhY2sgYWxsIGF0IG9uY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG9zZUNhc2VzKGNhc2VJZHM6IHJlYWRvbmx5IHN0cmluZ1tdLCBhY3RvcklkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmIChjYXNlSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAudXBkYXRlKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAuc2V0KHtcbiAgICAgIHN0YXR1czogJ2Nsb3NlZCcsXG4gICAgICBjbG9zZWRBdDogbm93LFxuICAgICAgY2xvc2VkQnk6IGFjdG9ySWQsXG4gICAgICB1cGRhdGVkQnk6IGFjdG9ySWQsXG4gICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgIGF3YWl0aW5nU2luY2U6IG51bGwsXG4gICAgICBhd2FpdGluZ1RvdGFsU2Vjb25kczogc3FsYCR7c2NoZW1hLnN1cHBvcnRDYXNlLmF3YWl0aW5nVG90YWxTZWNvbmRzfSArIENPQUxFU0NFKEVYVFJBQ1QoRVBPQ0ggRlJPTSAoJHtub3cudG9JU09TdHJpbmcoKX06OnRpbWVzdGFtcHR6IC0gJHtzY2hlbWEuc3VwcG9ydENhc2UuYXdhaXRpbmdTaW5jZX0pKTo6aW50LCAwKWAsXG4gICAgfSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgaW5BcnJheShzY2hlbWEuc3VwcG9ydENhc2UuaWQsIFsuLi5jYXNlSWRzXSksXG4gICAgICBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlLmRlbGV0ZWRBdCksXG4gICAgICAvLyBBbHJlYWR5LWNsb3NlZCBjYXNlcyBhcmUgc2tpcHBlZCByYXRoZXIgdGhhbiByZS1zdGFtcGVkLCBzbyBhIGJ1bGtcbiAgICAgIC8vIGNsb3NlIG92ZXIgYSBzZWxlY3Rpb24gdGhhdCBpbmNsdWRlcyBvbmUgZG9lcyBub3QgbW92ZSBpdHMgY2xvc2VkQXQuXG4gICAgICBzcWxgJHtzY2hlbWEuc3VwcG9ydENhc2Uuc3RhdHVzfSA8PiAnY2xvc2VkJ2AsXG4gICAgKSlcbiAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5zdXBwb3J0Q2FzZS5pZCB9KSk7XG4gIHJldHVybiByb3dzLm1hcCgocikgPT4gci5pZCk7XG59XG5cbi8qKlxuICogSGFuZCB0aGUgY2FzZSB0byBhbm90aGVyIHRlbmFudCBjb250YWN0LlxuICpcbiAqIE5vdGUgd2hhdCB0aGlzIGRvZXMgTk9UIHRvdWNoOiBgY3JlYXRlZEJ5YC4gVGhhdCBpcyB0aGUgaW1tdXRhYmxlIGF1ZGl0IGZhY3RcbiAqIG9mIHdobyByYWlzZWQgdGhlIGNhc2Ug4oCUIG11dGF0aW5nIGl0IHRvIGV4cHJlc3MgXCJzb21lb25lIGVsc2Ugb3ducyB0aGlzIG5vd1wiXG4gKiB3b3VsZCBkZXN0cm95IHRoZSBvbmx5IHJlY29yZCBvZiB3aG8gYWN0dWFsbHkgb3BlbmVkIGl0LiBUaGUgY2FsbGVyIG11c3QgaGF2ZVxuICogYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlIHRhcmdldCBpcyBhIGxpdmUgZGVzaWduYXRlZCBjb250YWN0OyB0aGlzIGZ1bmN0aW9uXG4gKiB3aWxsIG5vdCBpbmZlciBlbnRpdGxlbWVudCBmcm9tIGEgdXNlciBpZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zZmVyQ2FzZVRvQ29udGFjdChjYXNlSWQ6IHN0cmluZywgdGVuYW50Q29udGFjdDogc3RyaW5nLCBhY3RvcklkOiBzdHJpbmcpOiBQcm9taXNlPFN1cHBvcnRDYXNlIHwgbnVsbD4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAudXBkYXRlKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAuc2V0KHsgdGVuYW50Q29udGFjdCwgdXBkYXRlZEJ5OiBhY3RvcklkLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAud2hlcmUoYW5kKGVxKHNjaGVtYS5zdXBwb3J0Q2FzZS5pZCwgY2FzZUlkKSwgaXNOdWxsKHNjaGVtYS5zdXBwb3J0Q2FzZS5kZWxldGVkQXQpKSlcbiAgICAucmV0dXJuaW5nKCkpO1xuICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xufVxuXG4vKipcbiAqIEEgZGVwYXJ0aW5nIGNvbnRhY3QncyBvcGVuIGNhc2VzLCBzbyByZW1vdmFsIHJlYXNzaWducyByYXRoZXIgdGhhbiBvcnBoYW5zLlxuICpcbiAqIFNlcnZlZCBieSB0aGUgcGFydGlhbCBgc3VwcG9ydF9jYXNlX3RlbmFudF9jb250YWN0X2lkeGAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuQ2FzZXNGb3JDb250YWN0KG9yZ0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxTdXBwb3J0Q2FzZVtdPiB7XG4gIHJldHVybiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC5zZWxlY3QoKVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q2FzZSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDYXNlLm9yZ0lkLCBvcmdJZCksXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENhc2UudGVuYW50Q29udGFjdCwgdXNlcklkKSxcbiAgICAgIGluQXJyYXkoc2NoZW1hLnN1cHBvcnRDYXNlLnN0YXR1cywgWy4uLkxJVkVfU1VQUE9SVF9DQVNFX1NUQVRVU0VTXSksXG4gICAgICBpc051bGwoc2NoZW1hLnN1cHBvcnRDYXNlLmRlbGV0ZWRBdCksXG4gICAgKSkpO1xufVxuXG4vKipcbiAqIENhc2VzIHJhaXNlZCBhY3Jvc3MgYSBzY29wZSB3aXRoaW4gdGhlIGxhc3QgYHdpbmRvd0RheXNgIOKAlCB0aGUgRkFJUi1VU0UgY291bnQuXG4gKlxuICogV0hBVCBJVCBJUyBGT1IuIFN1cHBvcnQgaXMgcHJpY2VkIHBlciBDT05UQUNULCBhbmQgdGhhdCB1bml0IGFzc3VtZXMgY29udGFjdHNcbiAqIHByb3h5IGZvciBjYXNlIHZvbHVtZS4gQXQgdGVuIHNlYXRzIHRoZXkgZG87IGF0IGEgaHVuZHJlZCB0aGV5IGRvIG5vdCDigJQgdGhyZWVcbiAqIG5hbWVkIGNvbnRhY3RzIGJlY29tZSBhbiBpbnRlcm5hbCBoZWxwIGRlc2sgRk9SV0FSRElORyB0aWNrZXRzLCBzbyB0aGUgcHJpY2VcbiAqIGJ1eXMgdGhlIGludGVyZmFjZSByYXRoZXIgdGhhbiB0aGUgbG9hZC4gVGhpcyBpcyB0aGUgbWVhc3VyZW1lbnQgdGhhdCBub3RpY2VzLlxuICpcbiAqIFdIWSBOT1QgVEhFIFFVT1RBIFNFUlZJQ0UuIGBRVU9UQV9SRVNFVF9EQVlTYCBtYWtlcyBldmVyeSB0cmFja2VkIHF1b3RhIGFcbiAqIDMtZGF5IHBlcmlvZCwgYW5kIGEgc3VwcG9ydCBhbGxvd2FuY2UgaXMgbW9udGhseS1zaGFwZWQ6IGZpdmUgYSBtb250aCBkb2VzIG5vdFxuICogZGl2aWRlIGludG8gdGhyZWUgZGF5cyB3aXRob3V0IHJvdW5kaW5nIHRvIHNvbWV0aGluZyBlaXRoZXIgZmFyIHRvbyBsb29zZSBvclxuICogdXNlbGVzcy4gVGhpcyB0YWJsZSBJUyB0aGUgY291bnRlciDigJQgb25lIHJhbmdlIHNjYW4gb25cbiAqIGBzdXBwb3J0X2Nhc2Vfb3JnX2NyZWF0ZWRfaWR4YCwgbm8gcGVyaW9kIG1pc21hdGNoLCBhbmQgbm90aGluZyB0byBkcmlmdCBvdXRcbiAqIG9mIHN5bmMgd2l0aCByZWFsaXR5LlxuICpcbiAqIENPVU5UUyBFVkVSWSBDQVNFLCBJTkNMVURJTkcgQ0xPU0VEIEFORCBTT0ZULURFTEVURUQuIFRoZSBxdWVzdGlvbiBpcyBob3cgbXVjaFxuICogc3VwcG9ydCB3YXMgQ09OU1VNRUQgaW4gdGhlIHdpbmRvdywgYW5kIGEgY2FzZSB0aGF0IHdhcyBhbnN3ZXJlZCBhbmQgY2xvc2VkXG4gKiBjb25zdW1lZCBpdCBqdXN0IGFzIG11Y2ggYXMgYW4gb3BlbiBvbmUuIEV4Y2x1ZGluZyBjbG9zZWQgY2FzZXMgd291bGQgbWFrZSB0aGVcbiAqIGFsbG93YW5jZSB0cml2aWFsbHkgZXZhZGFibGUgYnkgY2xvc2luZyBwcm9tcHRseSDigJQgdGhlIG9wcG9zaXRlIG9mIHRoZVxuICogYmVoYXZpb3VyIGFueW9uZSB3YW50cyB0byBkaXNjb3VyYWdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY291bnRDYXNlc0luV2luZG93KG9yZ0lkczogcmVhZG9ubHkgc3RyaW5nW10sIHdpbmRvd0RheXM6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmIChvcmdJZHMubGVuZ3RoID09PSAwIHx8IHdpbmRvd0RheXMgPD0gMCkgcmV0dXJuIDA7XG4gIGNvbnN0IHNpbmNlID0gbmV3IERhdGUoRGF0ZS5ub3coKSAtIHdpbmRvd0RheXMgKiA4NjQwMF8wMDApO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAuc2VsZWN0KHsgbjogc3FsPG51bWJlcj5gY291bnQoKik6OmludGAgfSlcbiAgICAuZnJvbShzY2hlbWEuc3VwcG9ydENhc2UpXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGluQXJyYXkoc2NoZW1hLnN1cHBvcnRDYXNlLm9yZ0lkLCBbLi4ub3JnSWRzXSksXG4gICAgICBndGUoc2NoZW1hLnN1cHBvcnRDYXNlLmNyZWF0ZWRBdCwgc2luY2UpLFxuICAgICkpKTtcbiAgcmV0dXJuIHJvd3NbMF0/Lm4gPz8gMDtcbn1cblxuLyoqXG4gKiBSZWNvcmQgdGhlIGN1c3RvbWVyJ3MgdmVyZGljdCBvbiBhIGNhc2UuXG4gKlxuICogT05MWSBPTiBBIFRFUk1JTkFMIENBU0UsIGVuZm9yY2VkIGluIHRoZSBXSEVSRSBjbGF1c2UgcmF0aGVyIHRoYW4gYnkgdGhlXG4gKiBjYWxsZXI6IHJhdGluZyBhIGNhc2Ugc3RpbGwgYmVpbmcgd29ya2VkIHdvdWxkIG1lYXN1cmUgYW4gYW5zd2VyIG5vYm9keSBoYXNcbiAqIGZpbmlzaGVkIGdpdmluZywgYW5kIHB1dHRpbmcgdGhlIGNvbmRpdGlvbiBpbiBTUUwgbWVhbnMgbm8gcm91dGUgY2FuIGZvcmdldFxuICogaXQuXG4gKlxuICogUkUtUkFURUFCTEUgb24gcHVycG9zZS4gQSBjdXN0b21lciB3aG8gcmF0ZXMgaW4gZnJ1c3RyYXRpb24gYW5kIGNvbWVzIGJhY2sgYVxuICogZGF5IGxhdGVyIHNob3VsZCBiZSBhYmxlIHRvIGNoYW5nZSBpdDsgZnJlZXppbmcgdGhlIGZpcnN0IG51bWJlciB3b3VsZCBtYWtlXG4gKiB0aGUgbWV0cmljIG1lYXN1cmUgaG93IHBlb3BsZSBmZWx0IGF0IHRoZWlyIHdvcnN0IG1vbWVudC4gYHNhdGlzZmFjdGlvbl9hdGBcbiAqIG1vdmVzIHdpdGggaXQsIHNvIHRoZSBBTlNXRVIgYW5kIFdIRU4gaXQgd2FzIGdpdmVuIHN0YXkgdG9nZXRoZXIuXG4gKlxuICogUmV0dXJucyB3aGV0aGVyIGEgcm93IG1vdmVkIOKAlCBmYWxzZSBtZWFucyB0aGUgY2FzZSBpcyBtaXNzaW5nLCBzb2Z0LWRlbGV0ZWQsXG4gKiBvciBub3QgY2xvc2VkIHlldCwgd2hpY2ggdGhlIGNhbGxlciBtdXN0IGRpc3Rpbmd1aXNoIGZyb20gYSBzdG9yZWQgemVyby5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJhdGVDYXNlKFxuICBjYXNlSWQ6IHN0cmluZyxcbiAgc2F0aXNmYWN0aW9uOiBudW1iZXIsXG4gIGNvbW1lbnQ6IHN0cmluZyB8IG51bGwsXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnVwZGF0ZShzY2hlbWEuc3VwcG9ydENhc2UpXG4gICAgLnNldCh7IHNhdGlzZmFjdGlvbiwgc2F0aXNmYWN0aW9uQ29tbWVudDogY29tbWVudCwgc2F0aXNmYWN0aW9uQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDYXNlLmlkLCBjYXNlSWQpLFxuICAgICAgaXNOdWxsKHNjaGVtYS5zdXBwb3J0Q2FzZS5kZWxldGVkQXQpLFxuICAgICAgLy8gVGVybWluYWwgb25seS4gYHJlc29sdmVkYCBjb3VudHM6IHdlIGhhdmUgY2xhaW1lZCBhIGZpeCwgc28gdGhlXG4gICAgICAvLyBjdXN0b21lciBpcyBpbiBhIHBvc2l0aW9uIHRvIHNheSB3aGV0aGVyIGl0IHdhcyBvbmUuXG4gICAgICBpbkFycmF5KHNjaGVtYS5zdXBwb3J0Q2FzZS5zdGF0dXMsIFsncmVzb2x2ZWQnLCAnY2xvc2VkJ10pLFxuICAgICkpXG4gICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEuc3VwcG9ydENhc2UuaWQgfSkpO1xuICByZXR1cm4gcm93cy5sZW5ndGggPiAwO1xufVxuXG4vLyAtLS0gU3RhZmYgbm90ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBPbmUgc3RhZmYgbm90ZSwgYXMgdGhlIHF1ZXVlIFVJIHJlbmRlcnMgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1cHBvcnRDYXNlTm90ZSB7XG4gIGlkOiBzdHJpbmc7XG4gIGNhc2VJZDogc3RyaW5nO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IERhdGU7XG59XG5cbi8qKlxuICogQWRkIGEgc3RhZmYtb25seSBub3RlIHRvIGEgY2FzZS5cbiAqXG4gKiBgb3JnSWRgIGlzIGRlbm9ybWFsaXNlZCBvbnRvIHRoZSByb3cgZnJvbSB0aGUgQ0FTRSwgbm90IHRha2VuIGZyb20gdGhlIGF1dGhvcjpcbiAqIGEgbm90ZSBiZWxvbmdzIHRvIHRoZSB0ZW5hbnQgd2hvc2UgY2FzZSBpdCBhbm5vdGF0ZXMsIGFuZCBzb3VyY2luZyBpdCBmcm9tXG4gKiB0aGUgc3RhZmYgYXV0aG9yJ3Mgb3duIG9yZyAodGhlIHN5c3RlbSBvcmcpIHdvdWxkIHB1dCBldmVyeSBub3RlIG91dHNpZGUgdGhlXG4gKiB0ZW5hbnQgc2NvcGUgdGhhdCBpcyBzdXBwb3NlZCB0byBjb250YWluIGl0LlxuICpcbiAqIFNUQUZGIE9OTFkgYXQgdGhlIHJvdXRlIGxheWVyLCBhbmQgdGhlIHNlcGFyYXRlIHRhYmxlIGlzIHRoZSByZWFzb24gdGhhdCBpc1xuICogc2FmZTogYG1lc3NhZ2VzYCBpcyByZWFkIHRocm91Z2ggb25lIHNoYXJlZCB2aXNpYmlsaXR5IHByZWRpY2F0ZSwgc28gYSBmbGFnXG4gKiB0aGVyZSB3b3VsZCBsZWFrIGFuIGludGVybmFsIG5vdGUgZnJvbSBhbnkgcmVhZCBwYXRoIHRoYXQgZm9yZ290IHRoZSBleHRyYVxuICogY29uZGl0aW9uLiBBIHNlcGFyYXRlIHRhYmxlIGNhbm5vdCBsZWFrIGJ5IG9taXNzaW9uIOKAlCBpdCBoYXMgdG8gYmUgam9pbmVkXG4gKiBkZWxpYmVyYXRlbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRDYXNlTm90ZShcbiAgY2FzZUlkOiBzdHJpbmcsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgY3JlYXRlZEJ5OiBzdHJpbmcsXG4pOiBQcm9taXNlPFN1cHBvcnRDYXNlTm90ZT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAuaW5zZXJ0KHNjaGVtYS5zdXBwb3J0Q2FzZU5vdGUpXG4gICAgLnZhbHVlcyh7IGNhc2VJZCwgb3JnSWQsIGNvbnRlbnQsIGNyZWF0ZWRCeSB9KVxuICAgIC5yZXR1cm5pbmcoKSk7XG4gIGNvbnN0IHJvdyA9IHJvd3NbMF07XG4gIGlmICghcm93KSB0aHJvdyBuZXcgRXJyb3IoJ3N1cHBvcnQgY2FzZSBub3RlIGluc2VydCByZXR1cm5lZCBubyByb3cnKTtcbiAgcmV0dXJuIHJvdztcbn1cblxuLyoqIExpdmUgbm90ZXMgb24gYSBjYXNlLCBvbGRlc3QgZmlyc3Qg4oCUIHRoZXkgcmVhZCBhcyBhIHJ1bm5pbmcgY29tbWVudGFyeS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0Q2FzZU5vdGVzKGNhc2VJZDogc3RyaW5nKTogUHJvbWlzZTxTdXBwb3J0Q2FzZU5vdGVbXT4ge1xuICByZXR1cm4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAuc2VsZWN0KClcbiAgICAuZnJvbShzY2hlbWEuc3VwcG9ydENhc2VOb3RlKVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENhc2VOb3RlLmNhc2VJZCwgY2FzZUlkKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q2FzZU5vdGUuaXNBY3RpdmUsIHRydWUpLFxuICAgICAgaXNOdWxsKHNjaGVtYS5zdXBwb3J0Q2FzZU5vdGUuZGVsZXRlZEF0KSxcbiAgICApKVxuICAgIC5vcmRlckJ5KGFzYyhzY2hlbWEuc3VwcG9ydENhc2VOb3RlLmNyZWF0ZWRBdCkpKTtcbn1cblxuLyoqXG4gKiBTb2Z0LWRlbGV0ZSBhIG5vdGUgT04gYSBjYXNlLlxuICpcbiAqIEtleWVkIGJ5IEJPVEggaWRzOiBhIG5vdGUgaWQgYWxvbmUgd291bGQgbGV0IGEgbm90ZSBvbiBjYXNlIEIgYmUgcmVtb3ZlZFxuICogdGhyb3VnaCBjYXNlIEEncyBVUkwgKGFuZCB0aGUgY2FsbGVyJ3MgYXVkaXQgcm93IHdvdWxkIG5hbWUgY2FzZSBBKS5cbiAqXG4gKiBTb2Z0IGJlY2F1c2UgYSBub3RlIGlzIGEgcmVjb3JkIG9mIHdoYXQgdGhlIGRlc2sgYmVsaWV2ZWQgYXQgdGhlIHRpbWUsIGFuZCBhXG4gKiBkaXNwdXRlIG1heSB0dXJuIG9uIGl0LiBSZXR1cm5zIHdoZXRoZXIgYSByb3cgbW92ZWQsIHNvIGEgc2Vjb25kIGRlbGV0ZSAob3IgYVxuICogbm90ZSB0aGF0IGlzIG5vdCBvbiB0aGlzIGNhc2UpIGlzIGEgcmVwb3J0ZWQgbm8tb3AgcmF0aGVyIHRoYW4gYSBzaWxlbnQgc3VjY2Vzcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUNhc2VOb3RlKGNhc2VJZDogc3RyaW5nLCBub3RlSWQ6IHN0cmluZywgZGVsZXRlZEJ5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnVwZGF0ZShzY2hlbWEuc3VwcG9ydENhc2VOb3RlKVxuICAgIC5zZXQoeyBpc0FjdGl2ZTogZmFsc2UsIGRlbGV0ZWRBdDogbmV3IERhdGUoKSwgZGVsZXRlZEJ5IH0pXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q2FzZU5vdGUuaWQsIG5vdGVJZCksXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENhc2VOb3RlLmNhc2VJZCwgY2FzZUlkKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q2FzZU5vdGUuaXNBY3RpdmUsIHRydWUpLFxuICAgICkpXG4gICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEuc3VwcG9ydENhc2VOb3RlLmlkIH0pKTtcbiAgcmV0dXJuIHJvd3MubGVuZ3RoID4gMDtcbn1cblxuLy8gLS0tIENhbm5lZCByZXNwb25zZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQSByZXVzYWJsZSBzdGFmZiByZXBseSB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FubmVkUmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBib2R5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTGl2ZSB0ZW1wbGF0ZXMsIGFscGhhYmV0aWNhbCDigJQgdGhlIHBpY2tlcidzIG9ubHkgcXVlcnkuXG4gKlxuICogTm8gb3JnIHNjb3BlIGJlY2F1c2UgdGhlIHRhYmxlIGhhcyBub25lOiB0aGVzZSBhcmUgdGhlIHZlbmRvcidzIG93biB3b3JkaW5nXG4gKiBmb3IgcmVjdXJyaW5nIHF1ZXN0aW9ucywgYXV0aG9yZWQgb25jZSBhbmQgcmV1c2VkIGFjcm9zcyBldmVyeSBjdXN0b21lci5cbiAqIFNjb3BpbmcgdGhlbSBwZXIgdGVuYW50IHdvdWxkIGJlIHRoZSBvcHBvc2l0ZSBvZiB0aGUgcG9pbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0Q2FubmVkUmVzcG9uc2VzKCk6IFByb21pc2U8Q2FubmVkUmVzcG9uc2VbXT4ge1xuICByZXR1cm4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAuc2VsZWN0KHtcbiAgICAgIGlkOiBzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlLmlkLFxuICAgICAgdGl0bGU6IHNjaGVtYS5zdXBwb3J0Q2FubmVkUmVzcG9uc2UudGl0bGUsXG4gICAgICBib2R5OiBzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlLmJvZHksXG4gICAgfSlcbiAgICAuZnJvbShzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlKVxuICAgIC53aGVyZShlcShzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlLmlzQWN0aXZlLCB0cnVlKSlcbiAgICAub3JkZXJCeShhc2Moc2NoZW1hLnN1cHBvcnRDYW5uZWRSZXNwb25zZS50aXRsZSkpKTtcbn1cblxuLyoqIENyZWF0ZSBhIHRlbXBsYXRlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNhbm5lZFJlc3BvbnNlKFxuICB0aXRsZTogc3RyaW5nLFxuICBib2R5OiBzdHJpbmcsXG4gIGFjdG9ySWQ6IHN0cmluZyxcbik6IFByb21pc2U8Q2FubmVkUmVzcG9uc2U+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLmluc2VydChzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlKVxuICAgIC52YWx1ZXMoeyB0aXRsZSwgYm9keSwgY3JlYXRlZEJ5OiBhY3RvcklkLCB1cGRhdGVkQnk6IGFjdG9ySWQgfSlcbiAgICAucmV0dXJuaW5nKHtcbiAgICAgIGlkOiBzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlLmlkLFxuICAgICAgdGl0bGU6IHNjaGVtYS5zdXBwb3J0Q2FubmVkUmVzcG9uc2UudGl0bGUsXG4gICAgICBib2R5OiBzY2hlbWEuc3VwcG9ydENhbm5lZFJlc3BvbnNlLmJvZHksXG4gICAgfSkpO1xuICBjb25zdCByb3cgPSByb3dzWzBdO1xuICBpZiAoIXJvdykgdGhyb3cgbmV3IEVycm9yKCdjYW5uZWQgcmVzcG9uc2UgaW5zZXJ0IHJldHVybmVkIG5vIHJvdycpO1xuICByZXR1cm4gcm93O1xufVxuXG4vKipcbiAqIEVkaXQgYSBsaXZlIHRlbXBsYXRlLlxuICpcbiAqIEd1YXJkZWQgb24gYGlzX2FjdGl2ZWAgc28gYSByZXRpcmVkIHRlbXBsYXRlIGNhbm5vdCBiZSBlZGl0ZWQgYmFjayBpbnRvXG4gKiBjaXJjdWxhdGlvbiDigJQgYSByZXN1cnJlY3Rpb24gc2hvdWxkIGJlIGEgZGVsaWJlcmF0ZSBuZXcgcm93LCBub3QgYSBzaWRlXG4gKiBlZmZlY3Qgb2YgZml4aW5nIGEgdHlwby5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNhbm5lZFJlc3BvbnNlKFxuICBpZDogc3RyaW5nLFxuICBmaWVsZHM6IHsgdGl0bGU/OiBzdHJpbmc7IGJvZHk/OiBzdHJpbmcgfSxcbiAgYWN0b3JJZDogc3RyaW5nLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChmaWVsZHMudGl0bGUgPT09IHVuZGVmaW5lZCAmJiBmaWVsZHMuYm9keSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC51cGRhdGUoc2NoZW1hLnN1cHBvcnRDYW5uZWRSZXNwb25zZSlcbiAgICAuc2V0KHtcbiAgICAgIC4uLihmaWVsZHMudGl0bGUgIT09IHVuZGVmaW5lZCA/IHsgdGl0bGU6IGZpZWxkcy50aXRsZSB9IDoge30pLFxuICAgICAgLi4uKGZpZWxkcy5ib2R5ICE9PSB1bmRlZmluZWQgPyB7IGJvZHk6IGZpZWxkcy5ib2R5IH0gOiB7fSksXG4gICAgICB1cGRhdGVkQnk6IGFjdG9ySWQsXG4gICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgfSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDYW5uZWRSZXNwb25zZS5pZCwgaWQpLFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDYW5uZWRSZXNwb25zZS5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgKSlcbiAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5zdXBwb3J0Q2FubmVkUmVzcG9uc2UuaWQgfSkpO1xuICByZXR1cm4gcm93cy5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIFJldGlyZSBhIHRlbXBsYXRlLlxuICpcbiAqIFNPRlQsIGJlY2F1c2UgYSByZXRpcmVkIHRlbXBsYXRlIGlzIHN0aWxsIHRoZSBleHBsYW5hdGlvbiBvZiB3aGF0IGEgcGFzdFxuICogcmVwbHkgc2FpZCDigJQgZGVsZXRpbmcgdGhlIHJvdyB3b3VsZCBsZWF2ZSBvbGQgY29ycmVzcG9uZGVuY2UgdW5hY2NvdW50YWJsZVxuICogZm9yIGl0cyBvd24gd29yZGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUNhbm5lZFJlc3BvbnNlKGlkOiBzdHJpbmcsIGFjdG9ySWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAudXBkYXRlKHNjaGVtYS5zdXBwb3J0Q2FubmVkUmVzcG9uc2UpXG4gICAgLnNldCh7IGlzQWN0aXZlOiBmYWxzZSwgdXBkYXRlZEJ5OiBhY3RvcklkLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDYW5uZWRSZXNwb25zZS5pZCwgaWQpLFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDYW5uZWRSZXNwb25zZS5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgKSlcbiAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5zdXBwb3J0Q2FubmVkUmVzcG9uc2UuaWQgfSkpO1xuICByZXR1cm4gcm93cy5sZW5ndGggPiAwO1xufVxuXG4vLyAtLS0gU3VwcG9ydCBjb250YWN0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogTGl2ZSBkZXNpZ25hdGVkIGNvbnRhY3RzIGFjcm9zcyBhIHNldCBvZiBvcmdzIChhbiBhY2NvdW50IHN1YnRyZWUpLlxuICpcbiAqIFRha2VzIHRoZSB3aG9sZSBzY29wZSBpbiBvbmUgcXVlcnkgcmF0aGVyIHRoYW4gcGVyLW9yZyBiZWNhdXNlIHRoZSBhbGxvd2FuY2VcbiAqIFBPT0xTIGF0IHRoZSByb290OiBhIHBlcnNvbiBkZXNpZ25hdGVkIG9uIGEgdGVhbSBzcGVuZHMgdGhlIGFjY291bnQnc1xuICogYWxsb3dhbmNlLCBzbyBjb3VudGluZyB0ZWFtLWJ5LXRlYW0gYW5kIHN1bW1pbmcgd291bGQgYmUgdGhlIHNhbWUgbnVtYmVyIGJ5XG4gKiBhY2NpZGVudCBhbmQgdGhlIHdyb25nIHNoYXBlIHRoZSBtb21lbnQgcG9vbGluZyBjaGFuZ2VzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY291bnRBY3RpdmVTdXBwb3J0Q29udGFjdHMob3JnSWRzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gIC8vIENhbGxlcnMgcGFzcyB0aGUgZXhwYW5kZWQgU1VCVFJFRSBmb3IgdGhlIHBvb2xlZCBjYXAsIG9yIGEgc2luZ2xlIG9yZyB0byBhc2tcbiAgLy8gXCJtYXkgYSBjYXNlIHJhaXNlZCBoZXJlIGhhdmUgYW4gb3duZXIgYXQgYWxsXCIuIEJvdGggYXJlIGxlZ2l0aW1hdGU7IHNlZVxuICAvLyBgU3VwcG9ydEVudGl0bGVtZW50YCBpbiBwbGF0Zm9ybSBmb3Igd2hpY2ggZmllbGQgaXMgd2hpY2guXG4gIGlmIChvcmdJZHMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnNlbGVjdCh7IG46IHNxbDxudW1iZXI+YGNvdW50KCopOjppbnRgIH0pXG4gICAgLmZyb20oc2NoZW1hLnN1cHBvcnRDb250YWN0KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBpbkFycmF5KHNjaGVtYS5zdXBwb3J0Q29udGFjdC5vcmdJZCwgWy4uLm9yZ0lkc10pLFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDb250YWN0LmlzQWN0aXZlLCB0cnVlKSxcbiAgICApKSk7XG4gIHJldHVybiByb3dzWzBdPy5uID8/IDA7XG59XG5cbi8qKlxuICogTGl2ZSBjb250YWN0cyBmb3IgdGhlIHRlbmFudCBvd25lciBwaWNrZXIuXG4gKlxuICogU0NPUEUgSVMgVEhFIENBTExFUidTIENIT0lDRSwgYW5kIHRoZSBkZWZhdWx0IGlzIE9ORSBPUkcuIFRoZSBhbGxvd2FuY2UgcG9vbHNcbiAqIHN1YnRyZWUtd2lkZSwgYnV0IG93bmVyc2hpcCBkb2VzIG5vdDogYSB0ZWFtIHJlYXNzaWducyBhIGNhc2Ugb25seSBhbW9uZyBpdHNcbiAqIE9XTiBjb250YWN0cywgc28gYSBwb29sZWQgYWxsb3dhbmNlIG5ldmVyIHR1cm5zIGludG8gb25lIHRlYW0ncyBjYXNlcyBiZWluZ1xuICogcmVhZGFibGUgYnkgYSBzaWJsaW5nLiBQYXNzIGEgc2luZ2xlIG9yZyBpZCBmb3IgdGhlIHBpY2tlcjsgcGFzcyB0aGUgZXhwYW5kZWRcbiAqIHN1YnRyZWUgb25seSB3aGVyZSB0aGUgcG9vbGVkIENBUCBpcyB0aGUgcXVlc3Rpb24gKHNlZVxuICogYGNvdW50QWN0aXZlU3VwcG9ydENvbnRhY3RzYCkuXG4gKlxuICogVGFraW5nIGEgbGlzdCByYXRoZXIgdGhhbiBhIHNpbmdsZSBpZCBrZWVwcyB0aGF0IGRlY2lzaW9uIGF0IHRoZSBjYWxsIHNpdGVcbiAqIGluc3RlYWQgb2YgaGlkaW5nIGl0IGhlcmUg4oCUIHRoZSB0d28gc2NvcGVzIGFuc3dlciBkaWZmZXJlbnRseSBhbmQgdGhlIHdyb25nXG4gKiBvbmUgbGVha3MgY2FzZXMgYWNyb3NzIHRlYW1zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEFjdGl2ZVN1cHBvcnRDb250YWN0cyhcbiAgb3JnSWRzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8eyBvcmdJZDogc3RyaW5nOyB1c2VySWQ6IHN0cmluZzsgaXNQcmVtaXVtOiBib29sZWFuIH1bXT4ge1xuICBpZiAob3JnSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICByZXR1cm4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAuc2VsZWN0KHtcbiAgICAgIG9yZ0lkOiBzY2hlbWEuc3VwcG9ydENvbnRhY3Qub3JnSWQsXG4gICAgICB1c2VySWQ6IHNjaGVtYS5zdXBwb3J0Q29udGFjdC51c2VySWQsXG4gICAgICAvLyBDYXJyaWVkIHNvIHRoZSBhZG1pbiBwYW5lbCBjYW4gc2hvdyB3aG8gaXMgdXBncmFkZWQgd2l0aG91dCBhIHNlY29uZFxuICAgICAgLy8gcXVlcnksIGFuZCBzbyB0aGUgdGVuYW50IG93bmVyIHBpY2tlciBjYW4gc2F5IHdoaWNoIGNvbnRhY3RzIGNhcnJ5IDI0eDcuXG4gICAgICBpc1ByZW1pdW06IHNjaGVtYS5zdXBwb3J0Q29udGFjdC5pc1ByZW1pdW0sXG4gICAgfSlcbiAgICAuZnJvbShzY2hlbWEuc3VwcG9ydENvbnRhY3QpXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGluQXJyYXkoc2NoZW1hLnN1cHBvcnRDb250YWN0Lm9yZ0lkLCBbLi4ub3JnSWRzXSksXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENvbnRhY3QuaXNBY3RpdmUsIHRydWUpLFxuICAgICkpKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoaXMgdXNlciBpcyBhIGxpdmUgZGVzaWduYXRlZCBjb250YWN0IGluIGFueSBvcmcgb2YgdGhlIHNjb3BlLlxuICpcbiAqIFRyYW5zZmVyIHZhbGlkYXRpb24gbXVzdCBwYXNzIHRoZSBjYXNlJ3MgT1dOIG9yZywgbm90IHRoZSBzdWJ0cmVlOiBhY2NlcHRpbmcgYVxuICogc2libGluZyB0ZWFtJ3MgY29udGFjdCBhcyBhIHZhbGlkIHRyYW5zZmVyIHRhcmdldCBpcyBleGFjdGx5IHRoZSBjcm9zcy10ZWFtXG4gKiBsZWFrIHRoZSBvd24tb3JnIG93bmVyc2hpcCBydWxlIGV4aXN0cyB0byBwcmV2ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNTdXBwb3J0Q29udGFjdChvcmdJZHM6IHJlYWRvbmx5IHN0cmluZ1tdLCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAob3JnSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAuc2VsZWN0KHsgaWQ6IHNjaGVtYS5zdXBwb3J0Q29udGFjdC5pZCB9KVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q29udGFjdClcbiAgICAud2hlcmUoYW5kKFxuICAgICAgaW5BcnJheShzY2hlbWEuc3VwcG9ydENvbnRhY3Qub3JnSWQsIFsuLi5vcmdJZHNdKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC51c2VySWQsIHVzZXJJZCksXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENvbnRhY3QuaXNBY3RpdmUsIHRydWUpLFxuICAgICkpXG4gICAgLmxpbWl0KDEpKTtcbiAgcmV0dXJuIHJvd3MubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBEZXNpZ25hdGUgYSBzdXBwb3J0IGNvbnRhY3QuXG4gKlxuICogVGhlIENBUCBpcyBub3QgZW5mb3JjZWQgaGVyZSDigJQgdGhlIGNhbGxlciBob2xkcyBpdCwgYmVjYXVzZSB0aGUgbGltaXQgbGl2ZXMgb25cbiAqIHRoZSBNb25nbyBvcmcgZG9jIGFuZCB0aGlzIG1vZHVsZSBvbmx5IHJlYWNoZXMgUG9zdGdyZXMuIE1pcnJvcnMgaG93IHNlYXRzIGFyZVxuICogY2FwcGVkIGluIHBsYXRmb3JtIHJhdGhlciB0aGFuIGluIHRoZSByb3cgd3JpdGVyLlxuICpcbiAqIGBzdXBwb3J0X2NvbnRhY3Rfb3JnX3VzZXJfdXFgIGlzIHBhcnRpYWwgb24gYGlzX2FjdGl2ZSA9IHRydWVgLCBzb1xuICogcmUtZGVzaWduYXRpbmcgc29tZW9uZSBwcmV2aW91c2x5IHJldm9rZWQgaW5zZXJ0cyBhIGZyZXNoIHJvdyByYXRoZXIgdGhhblxuICogY29sbGlkaW5nIOKAlCB0aGUgcmV2b2tlZCByb3cgc3RheXMgYXMgdGhlIHJlY29yZCB0aGF0IHRoZXkgb25jZSBoZWxkIGl0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVzaWduYXRlU3VwcG9ydENvbnRhY3QoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBkZXNpZ25hdGVkQnk6IHN0cmluZyxcbiAgaXNQcmVtaXVtID0gZmFsc2UsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgIGF3YWl0IHR4Lmluc2VydChzY2hlbWEuc3VwcG9ydENvbnRhY3QpXG4gICAgICAudmFsdWVzKHsgb3JnSWQsIHVzZXJJZCwgZGVzaWduYXRlZEJ5LCBpc1ByZW1pdW0gfSlcbiAgICAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIExpdmUgY29udGFjdHMgaW4gYSBzY29wZSB0aGF0IGFyZSBVUEdSQURFRCB0byBwcmVtaXVtIOKAlCB0aGUgY2FwJ3MgY291bnRlcnBhcnQuXG4gKlxuICogQ291bnRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIGJhc2VsaW5lIHRvdGFsIGJlY2F1c2UgdGhlIHR3byBjYXBzIGFyZSBzZXBhcmF0ZTpcbiAqIGFuIGFjY291bnQgaG9sZHMgTiBjb250YWN0cyAoYHN1cHBvcnRDb250YWN0c2ApIGFuZCB1cGdyYWRlcyBNIG9mIHRoZW1cbiAqIChgc3VwcG9ydFByZW1pdW1Db250YWN0c2ApLCBNIOKJpCBOLiBQb29sZWQgb3ZlciB3aGF0ZXZlciBzY29wZSB0aGUgY2FsbGVyXG4gKiBwYXNzZXMsIGV4YWN0bHkgbGlrZSB7QGxpbmsgY291bnRBY3RpdmVTdXBwb3J0Q29udGFjdHN9IOKAlCBzdWJ0cmVlIGZvciB0aGUgY2FwLFxuICogb25lIG9yZyBmb3IgYW4gb3duZXJzaGlwIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY291bnRQcmVtaXVtU3VwcG9ydENvbnRhY3RzKG9yZ0lkczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPG51bWJlcj4ge1xuICBpZiAob3JnSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgIC5zZWxlY3QoeyBuOiBzcWw8bnVtYmVyPmBjb3VudCgqKTo6aW50YCB9KVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q29udGFjdClcbiAgICAud2hlcmUoYW5kKFxuICAgICAgaW5BcnJheShzY2hlbWEuc3VwcG9ydENvbnRhY3Qub3JnSWQsIFsuLi5vcmdJZHNdKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC5pc0FjdGl2ZSwgdHJ1ZSksXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENvbnRhY3QuaXNQcmVtaXVtLCB0cnVlKSxcbiAgICApKSk7XG4gIHJldHVybiByb3dzWzBdPy5uID8/IDA7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGlzIHVzZXIgaXMgYSBsaXZlIFBSRU1JVU0gY29udGFjdCBpbiB0aGUgc2NvcGUuXG4gKlxuICogVGhlIGNhc2Utb3BlbiBwYXRoIHJlYWRzIHRoaXMgdG8gZGVjaWRlIHdoaWNoIGxldmVsIHRvIGZyZWV6ZSBvbnRvIGEgbmV3IGNhc2U6XG4gKiBwcmVtaXVtIHdoZW4gdGhlIG9wZW5lciBpcyB1cGdyYWRlZCwgdGhlIGFjY291bnQncyBiYXNlbGluZSBvdGhlcndpc2UuIFBhc3MgdGhlXG4gKiBjYXNlJ3MgT1dOIG9yZyDigJQgdGhlIHVwZ3JhZGUgZm9sbG93cyB0aGUgcGVyc29uIGluIHRoZSBvcmcgdGhhdCBub21pbmF0ZWRcbiAqIHRoZW0sIGFuZCBhIHNpYmxpbmcgdGVhbSdzIHVwZ3JhZGUgaXMgbm90IHRoaXMgb3JnJ3MgdG8gc3BlbmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1ByZW1pdW1TdXBwb3J0Q29udGFjdChvcmdJZHM6IHJlYWRvbmx5IHN0cmluZ1tdLCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAob3JnSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAuc2VsZWN0KHsgaWQ6IHNjaGVtYS5zdXBwb3J0Q29udGFjdC5pZCB9KVxuICAgIC5mcm9tKHNjaGVtYS5zdXBwb3J0Q29udGFjdClcbiAgICAud2hlcmUoYW5kKFxuICAgICAgaW5BcnJheShzY2hlbWEuc3VwcG9ydENvbnRhY3Qub3JnSWQsIFsuLi5vcmdJZHNdKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC51c2VySWQsIHVzZXJJZCksXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENvbnRhY3QuaXNBY3RpdmUsIHRydWUpLFxuICAgICAgZXEoc2NoZW1hLnN1cHBvcnRDb250YWN0LmlzUHJlbWl1bSwgdHJ1ZSksXG4gICAgKSlcbiAgICAubGltaXQoMSkpO1xuICByZXR1cm4gcm93cy5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIFVwZ3JhZGUgb3IgZG93bmdyYWRlIGEgTElWRSBjb250YWN0LlxuICpcbiAqIEd1YXJkZWQgb24gYGlzX2FjdGl2ZWAgc28gYSByZXZva2VkIHJvdyBjYW5ub3QgYmUgdXBncmFkZWQgYmFjayBpbnRvXG4gKiByZWxldmFuY2UsIGFuZCByZXR1cm5zIHdoZXRoZXIgYSByb3cgYWN0dWFsbHkgbW92ZWQg4oCUIHRoZSBjYWxsZXIgY291bnRzXG4gKiBhZ2FpbnN0IHRoZSBwcmVtaXVtIGNhcCBiZWZvcmUgY2FsbGluZywgYW5kIGEgc2lsZW50IG5vLW9wIHdvdWxkIGxldCB0aGF0XG4gKiBjb3VudCBkcmlmdCBmcm9tIHJlYWxpdHkuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGRvZXMgTk9UIHRvdWNoIHRoZSBjYXNlIHJvd3M6IGBzdXBwb3J0X2Nhc2UubGV2ZWxgIGlzIGZyb3plbiBhdFxuICogb3Blbiwgc28gZG93bmdyYWRpbmcgc29tZWJvZHkgbmV2ZXIgd2Vha2VucyBhIHByb21pc2UgYWxyZWFkeSBtYWRlIG9uIGEgY2FzZVxuICogdGhleSByYWlzZWQgd2hpbGUgdXBncmFkZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRTdXBwb3J0Q29udGFjdFByZW1pdW0oXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBpc1ByZW1pdW06IGJvb2xlYW4sXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgLnVwZGF0ZShzY2hlbWEuc3VwcG9ydENvbnRhY3QpXG4gICAgLnNldCh7IGlzUHJlbWl1bSB9KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENvbnRhY3Qub3JnSWQsIG9yZ0lkKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC51c2VySWQsIHVzZXJJZCksXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENvbnRhY3QuaXNBY3RpdmUsIHRydWUpLFxuICAgICkpXG4gICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEuc3VwcG9ydENvbnRhY3QuaWQgfSkpO1xuICByZXR1cm4gcm93cy5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIFJldm9rZSBhIGRlc2lnbmF0aW9uLCBmcmVlaW5nIHRoZSBzbG90LlxuICpcbiAqIFJldHVybnMgdGhlIHVzZXIncyBzdGlsbC1vcGVuIGNhc2VzIHNvIHRoZSBjYWxsZXIgY2FuIHJlYXNzaWduIHRoZW0gaW5zdGVhZCBvZlxuICogb3JwaGFuaW5nIOKAlCBzY29wZSBDNCdzIGFuc3dlci4gUmV2b2tpbmcgaXMgZGVsaWJlcmF0ZWx5IG5vdCBibG9ja2VkIG9uIHRoZW06XG4gKiByZWZ1c2luZyB0byByZW1vdmUgYSBkZXBhcnRlZCBlbXBsb3llZSBiZWNhdXNlIHRoZXkgc3RpbGwgb3duIGNhc2VzIHdvdWxkIGJlXG4gKiB3b3JzZSB0aGFuIGhhbmRpbmcgdGhlIGNhc2VzIG9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV2b2tlU3VwcG9ydENvbnRhY3QoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHVzZXJJZDogc3RyaW5nLFxuICByZXZva2VkQnk6IHN0cmluZyxcbik6IFByb21pc2U8eyByZXZva2VkOiBib29sZWFuOyBvcGVuQ2FzZXM6IFN1cHBvcnRDYXNlW10gfT4ge1xuICBjb25zdCBvcGVuQ2FzZXMgPSBhd2FpdCBvcGVuQ2FzZXNGb3JDb250YWN0KG9yZ0lkLCB1c2VySWQpO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAudXBkYXRlKHNjaGVtYS5zdXBwb3J0Q29udGFjdClcbiAgICAuc2V0KHsgaXNBY3RpdmU6IGZhbHNlLCByZXZva2VkQXQ6IG5ldyBEYXRlKCksIHJldm9rZWRCeSB9KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENvbnRhY3Qub3JnSWQsIG9yZ0lkKSxcbiAgICAgIGVxKHNjaGVtYS5zdXBwb3J0Q29udGFjdC51c2VySWQsIHVzZXJJZCksXG4gICAgICBlcShzY2hlbWEuc3VwcG9ydENvbnRhY3QuaXNBY3RpdmUsIHRydWUpLFxuICAgICkpXG4gICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEuc3VwcG9ydENvbnRhY3QuaWQgfSkpO1xuICByZXR1cm4geyByZXZva2VkOiByb3dzLmxlbmd0aCA+IDAsIG9wZW5DYXNlcyB9O1xufVxuIl19
@@ -1,27 +1,5 @@
1
- /**
2
- * Which pipelines still REFERENCE a plugin version or image — the one rule every
3
- * removal path asks before it deletes anything: an org plugin delete (forced or
4
- * not), a bulk delete, a tombstone purge (manual or the retention sweep), the
5
- * image registry's age GC, the listing image GC.
6
- *
7
- * THE RULE: a version (or its image) that any pipeline references cannot be
8
- * deleted until no pipeline does — whatever its vulnerability state. A
9
- * vulnerable image is the WORST thing to delete out from under a pipeline: the
10
- * next run fails to pull, and the owners learn about the CVE from an outage.
11
- * Vulnerability consequences are graded warnings and notifications, never removal.
12
- *
13
- * A reference is any of:
14
- * - `declared` — a LIVE pipeline's config resolves to it (`pipeline_plugin_resolution`);
15
- * - `deployed` — a pipeline's last deploy recorded it (`pipeline_step_manifests`),
16
- * INCLUDING a soft-deleted pipeline: its CodePipeline still runs the image;
17
- * - `exposure` — an open DEPLOYED exposure still names it (the same "still runs
18
- * it" fact, kept when a manifest is gone).
19
- *
20
- * Matched by image digest when the version has one (a team running its parent's
21
- * plugin, or another org's install, pins the same digest), else by name +
22
- * version within the owner org and its teams.
23
- */
24
1
  import { type SQL } from 'drizzle-orm';
2
+ import { withTenantTx } from '../database/tenancy.js';
25
3
  /** A version / image whose references are wanted. */
26
4
  export interface VersionReferenceTarget {
27
5
  pluginName: string;
@@ -59,7 +37,7 @@ export declare function versionReferencedPredicate(cols: {
59
37
  * names other orgs' pipelines; callers show the OWNER only counts and its own
60
38
  * org's pipelines, and notify each referencing org about its own.
61
39
  */
62
- export declare function findVersionReferences(target: VersionReferenceTarget): Promise<VersionReference[]>;
40
+ export declare function findVersionReferences(target: VersionReferenceTarget, run?: <T>(fn: (tx: Parameters<Parameters<typeof withTenantTx>[0]>[0]) => Promise<T>) => Promise<T>): Promise<VersionReference[]>;
63
41
  /** Distinct pipelines among `refs` (a pipeline both declared and deployed counts once). */
64
42
  export declare function distinctPipelines(refs: readonly VersionReference[]): Array<{
65
43
  pipelineId: string;