@pipeline-builder/pipeline-data 4.3.6 → 4.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/access-control-builder.js +1 -1
- package/lib/api/alert-destinations.js +1 -1
- package/lib/api/crud-service.js +1 -1
- package/lib/api/ecosystem-privacy.js +1 -1
- package/lib/api/keyset-cursor.js +1 -1
- package/lib/api/pipeline-step-resolution.js +1 -1
- package/lib/api/plugin-advisories.js +1 -1
- package/lib/api/plugin-consumption-policy.js +1 -1
- package/lib/api/plugin-resolution.js +6 -1
- package/lib/api/public-directory.d.ts +71 -3
- package/lib/api/public-directory.js +68 -22
- package/lib/api/query-builders.js +47 -2
- package/lib/api/reporting/analytics-queries.js +1 -1
- package/lib/api/reporting/caches.js +1 -1
- package/lib/api/reporting/daily-rollup.js +1 -1
- package/lib/api/reporting/deploy-rollup.js +1 -1
- package/lib/api/reporting/dora-scoring.js +1 -1
- package/lib/api/reporting/dora.js +1 -1
- package/lib/api/reporting/failure-classifier.js +1 -1
- package/lib/api/reporting/ingest.js +1 -1
- package/lib/api/reporting/last-deploy.js +1 -1
- package/lib/api/reporting/needs-attention.js +1 -1
- package/lib/api/reporting/plugin-exposure.js +1 -1
- package/lib/api/reporting/plugin-runtime.js +1 -1
- package/lib/api/reporting/query-scope.js +1 -1
- package/lib/api/reporting/retention-sweep.js +1 -1
- package/lib/api/reporting/retention.js +1 -1
- package/lib/api/reporting/sql-helpers.js +1 -1
- package/lib/api/reporting/stakeholder/compose.js +1 -1
- package/lib/api/reporting/stakeholder/index.js +1 -1
- package/lib/api/reporting/stakeholder/period.js +1 -1
- package/lib/api/reporting/stakeholder/report-html.js +1 -1
- package/lib/api/reporting/stakeholder/sections.js +1 -1
- package/lib/api/reporting/stakeholder/store.js +1 -1
- package/lib/api/reporting/stakeholder/templates.js +1 -1
- package/lib/api/reporting/types.js +1 -1
- package/lib/api/reporting-service.js +1 -1
- package/lib/api/semver-range.js +1 -1
- package/lib/api/soft-delete-sweep.js +1 -1
- package/lib/api/support-cases.js +1 -1
- package/lib/api/version-references.js +1 -1
- package/lib/api/viewer-context.js +1 -1
- package/lib/core/query-filters.d.ts +25 -0
- package/lib/core/query-filters.js +1 -1
- package/lib/database/drizzle-schema.d.ts +19 -0
- package/lib/database/drizzle-schema.js +1 -1
- package/lib/database/index.js +1 -1
- package/lib/database/pg-result.js +1 -1
- package/lib/database/postgres-connection.js +1 -1
- package/lib/database/public-reader.js +1 -1
- package/lib/database/read-connection.js +1 -1
- package/lib/database/read-lag.js +1 -1
- package/lib/database/retry-strategy.js +1 -1
- package/lib/database/schema/alert.js +1 -1
- package/lib/database/schema/compliance.js +1 -1
- package/lib/database/schema/dashboard.js +1 -1
- package/lib/database/schema/ecosystem.d.ts +17 -0
- package/lib/database/schema/ecosystem.js +3 -1
- package/lib/database/schema/message-attachment.js +1 -1
- package/lib/database/schema/message.d.ts +19 -0
- package/lib/database/schema/message.js +18 -1
- package/lib/database/schema/pipeline-template.js +1 -1
- package/lib/database/schema/pipeline.js +1 -1
- package/lib/database/schema/plugin.js +1 -1
- package/lib/database/schema/reporting-analytics.js +1 -1
- package/lib/database/schema/reporting-stakeholder.js +1 -1
- package/lib/database/schema/support.js +1 -1
- package/lib/database/tenancy.js +1 -1
- package/lib/index.js +1 -1
- package/package.json +8 -8
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { SYSTEM_ORG_ID } from '@pipeline-builder/api-core';
|
|
4
|
-
import { and, asc, desc, eq, ilike, isNull, not, or, gte, lte, sql, SQL } from 'drizzle-orm';
|
|
4
|
+
import { and, asc, desc, eq, ilike, inArray, isNull, ne, not, or, gte, lte, sql, SQL } from 'drizzle-orm';
|
|
5
5
|
import { AccessControlQueryBuilder, buildJsonbKeywordCondition, escapeLikeWildcards, normalizeStringFilter, parseBooleanFilter, } from './access-control-builder.js';
|
|
6
6
|
import { isVersionRange, semverOrderBy, versionSpecCondition } from './semver-range.js';
|
|
7
7
|
import { schema, } from '../database/drizzle-schema.js';
|
|
@@ -268,6 +268,24 @@ export function buildMessageConditions(filter, orgId) {
|
|
|
268
268
|
// a mis-created '*' + per-user row can't leak to every org.
|
|
269
269
|
and(eq(schema.message.recipientOrgId, '*'), isNull(schema.message.recipientUserId))));
|
|
270
270
|
}
|
|
271
|
+
// Removed from THIS org's inbox. Applies to the system org too — "sees all"
|
|
272
|
+
// is about tenancy, not about a row somebody here chose to clear.
|
|
273
|
+
//
|
|
274
|
+
// It lives in this shared builder on purpose: `getUnreadCount` composes the
|
|
275
|
+
// same conditions so the badge cannot diverge from the inbox, and a hidden
|
|
276
|
+
// unread message would otherwise leave a count the user has no way to clear.
|
|
277
|
+
//
|
|
278
|
+
// `coalesce` for the same reason `readBy` needs it: `NULL ? org` is NULL, and
|
|
279
|
+
// `NOT NULL` is NULL, which drops the row instead of keeping it.
|
|
280
|
+
//
|
|
281
|
+
// Per MESSAGE, not per thread, which is what makes it self-correcting: a
|
|
282
|
+
// later reply is a new row with an empty map, so clearing a conversation
|
|
283
|
+
// today never buries the answer that arrives tomorrow.
|
|
284
|
+
//
|
|
285
|
+
// `hidden: true` flips it to ONLY the rows this org removed (the "Removed"
|
|
286
|
+
// view / unhide scope) — still inside the same visibility branch above.
|
|
287
|
+
const hiddenHere = sql `(coalesce(${schema.message.hiddenBy}, '{}'::jsonb) ? ${normalizedOrgId})`;
|
|
288
|
+
conditions.push(filter.hidden ? hiddenHere : sql `not ${hiddenHere}`);
|
|
271
289
|
// Active filter (default to active only)
|
|
272
290
|
if (filter.isActive !== undefined) {
|
|
273
291
|
conditions.push(eq(schema.message.isActive, parseBooleanFilter(filter.isActive)));
|
|
@@ -330,6 +348,33 @@ export function buildMessageConditions(filter, orgId) {
|
|
|
330
348
|
if (filter.id !== undefined) {
|
|
331
349
|
conditions.push(idEquals(schema.message.id, filter.id));
|
|
332
350
|
}
|
|
351
|
+
// Explicit selection. An EMPTY list matches nothing (never "no filter"), so a
|
|
352
|
+
// caller that lost its selection can't turn a bulk action into "everything".
|
|
353
|
+
if (filter.ids !== undefined) {
|
|
354
|
+
conditions.push(filter.ids.length > 0 ? inArray(schema.message.id, [...filter.ids]) : IMPOSSIBLE);
|
|
355
|
+
}
|
|
356
|
+
// Sender, relative to the viewer. `org_id` is stored lowercase (see the
|
|
357
|
+
// visibility branch above), `created_by` is the raw user id.
|
|
358
|
+
if (filter.sentBy !== undefined) {
|
|
359
|
+
if (filter.sentBy === 'me') {
|
|
360
|
+
conditions.push(filter.viewerUserId ? eq(schema.message.createdBy, filter.viewerUserId) : IMPOSSIBLE);
|
|
361
|
+
}
|
|
362
|
+
else if (filter.sentBy === 'org') {
|
|
363
|
+
conditions.push(eq(schema.message.orgId, normalizedOrgId));
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
conditions.push(ne(schema.message.orgId, normalizedOrgId));
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// A specific author. Raw user id, case-preserving (like `viewerUserId`).
|
|
370
|
+
if (filter.senderUserId !== undefined) {
|
|
371
|
+
conditions.push(eq(schema.message.createdBy, filter.senderUserId));
|
|
372
|
+
}
|
|
373
|
+
// A specific counterparty org: it sent the row, or the row was addressed to it.
|
|
374
|
+
if (filter.counterpartyOrgId !== undefined) {
|
|
375
|
+
const other = normalizeStringFilter(filter.counterpartyOrgId);
|
|
376
|
+
conditions.push(or(eq(schema.message.orgId, other), eq(schema.message.recipientOrgId, other)));
|
|
377
|
+
}
|
|
333
378
|
// Free-text inbox search — case-insensitive substring over subject OR content.
|
|
334
379
|
// Wildcards in the term are escaped so a literal `%`/`_` is matched literally;
|
|
335
380
|
// an all-whitespace term is ignored (no-op) rather than matching everything.
|
|
@@ -532,4 +577,4 @@ export function buildComplianceScanConditions(filter, orgId) {
|
|
|
532
577
|
}
|
|
533
578
|
return conditions;
|
|
534
579
|
}
|
|
535
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3F1ZXJ5LWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBa0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFN0YsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixrQkFBa0IsR0FDbkIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBWXhGLE9BQU8sRUFDTCxNQUFNLEdBT1AsTUFBTSwrQkFBK0IsQ0FBQztBQUV2QywwQkFBMEI7QUFDMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdkUsK0VBQStFO0FBQy9FLGdGQUFnRjtBQUNoRiw4REFBOEQ7QUFDOUQsTUFBTSxhQUFhLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDN0YsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRXZGOzs7Ozs7R0FNRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQWMsRUFBRSxFQUFxQjtJQUNyRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN0QixPQUFPLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDckQsQ0FBQztJQUNELE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxhQUFhLENBQUMsVUFBaUIsRUFBRSxHQUFjLEVBQUUsUUFBaUIsRUFBRSxLQUFjO0lBQ3pGLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzNCLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztTQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLEdBQVEsR0FBRyxDQUFBLE9BQU8sQ0FBQztBQUVuQzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLE1BQStCLEVBQy9CLEtBQWMsRUFDZCxXQUFvQjtJQUVwQix1RkFBdUY7SUFDdkYsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFckYsNEVBQTRFO0lBQzVFLCtFQUErRTtJQUMvRSxzRUFBc0U7SUFDdEUsMEVBQTBFO0lBQzFFLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMvQixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsNkVBQTZFO0lBQzdFLHFFQUFxRTtJQUNyRSwrQkFBK0I7SUFDL0IsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNqQyxVQUFVLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0csQ0FBQztJQUVELHdEQUF3RDtJQUN4RCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNuQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBc0IsQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFjLEVBQUUsV0FBb0I7SUFDMUUsTUFBTSxTQUFTLEdBQUcsS0FBSztRQUNyQixDQUFDLENBQUMsV0FBVztZQUNYLENBQUMsQ0FBQyxHQUFHLENBQUEsUUFBUSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxLQUFLLGdCQUFnQixXQUFXLG9CQUFvQjtZQUM3RixDQUFDLENBQUMsR0FBRyxDQUFBLFFBQVEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQVMsS0FBSyxvQkFBb0I7UUFDcEUsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNULE9BQU87UUFDTCxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQzdCLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVELGlGQUFpRjtBQUNqRixTQUFTLFNBQVM7SUFDaEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxNQUE2QixFQUM3QixLQUFjLEVBQ2QsV0FBb0I7SUFFcEIsdUZBQXVGO0lBQ3ZGLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRW5GLDhCQUE4QjtJQUM5QixJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDL0IsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLHNFQUFzRTtJQUN0RSw0Q0FBNEM7SUFDNUMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssT0FBTztZQUMxQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztZQUM5QixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSx5RUFBeUU7SUFDekUsNkVBQTZFO0lBQzdFLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBaUIsQ0FBQztRQUN0QyxVQUFVLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsa0JBQWtCLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDdkMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbEMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbkMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQTRCLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FDN0MsTUFBdUMsRUFDdkMsS0FBYyxFQUNkLFdBQW9CO0lBRXBCLE1BQU0sVUFBVSxHQUFHLHVCQUF1QixDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFN0YsK0VBQStFO0lBQy9FLHlFQUF5RTtJQUN6RSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDL0IsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsS0FBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDOUIsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZILENBQUM7SUFFRCxvRkFBb0Y7SUFDcEYsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkgsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNqQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbkMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBc0IsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsTUFBOEIsRUFDOUIsS0FBYTtJQUViLE1BQU0sVUFBVSxHQUFVLEVBQUUsQ0FBQztJQUM3QixNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFNUMsMkRBQTJEO0lBQzNELEVBQUU7SUFDRiw0RUFBNEU7SUFDNUUsOEVBQThFO0lBQzlFLDBFQUEwRTtJQUMxRSw0RUFBNEU7SUFDNUUsNEVBQTRFO0lBQzVFLHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUsNkVBQTZFO0lBQzdFLHFFQUFxRTtJQUNyRSxJQUFJLGVBQWUsS0FBSyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxrQ0FBa0M7SUFDcEMsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxZQUFZO1lBQzFDLENBQUMsQ0FBQyxFQUFFLENBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQ3RDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQ3ZEO1lBQ0YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNDLDRFQUE0RTtRQUM1RSwyRUFBMkU7UUFDM0UseUVBQXlFO1FBQ3pFLDBFQUEwRTtRQUMxRSw2RUFBNkU7UUFDN0UsNkVBQTZFO1FBQzdFLHVFQUF1RTtRQUN2RSxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxZQUFZO1lBQ25ELENBQUMsQ0FBQyxHQUFHLENBQUEsb0VBQW9FLE1BQU0sQ0FBQyxZQUFZLEVBQUU7WUFDOUYsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxvQ0FBb0MsQ0FBQztRQUM1QyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQ3RCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUMvQixHQUFHLENBQUE7d0JBQ2UsTUFBTSxDQUFDLE9BQU87MEJBQ1osTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFROytDQUNGLGVBQWU7Z0JBQzlDLHlCQUF5QjtRQUNqQyxDQUNGLENBQUM7UUFDSCxVQUFVLENBQUMsSUFBSSxDQUNiLEVBQUUsQ0FDQSxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLGFBQWEsQ0FBRSxFQUM5RCxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyxFQUFFLGdCQUFnQixDQUFFO1FBQzFFLHVFQUF1RTtRQUN2RSw0REFBNEQ7UUFDNUQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBRSxDQUNwRixDQUNILENBQUM7SUFDSixDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7U0FBTSxDQUFDO1FBQ04sVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7YUFBTSxDQUFDO1lBQ04sVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsSUFBSSxNQUFNLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsdUNBQXVDO0lBQ3ZDLElBQUksTUFBTSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6QyxJQUFJLE1BQU0sQ0FBQyxlQUFlLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUM7YUFBTSxDQUFDO1lBQ04sMEVBQTBFO1lBQzFFLCtFQUErRTtZQUMvRSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUM5RSxDQUFDO0lBQ0gsQ0FBQztJQUVELHNCQUFzQjtJQUN0QixJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDckMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQTBCLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUEyQixDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsMkRBQTJEO0lBQzNELElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNqQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDNUIsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7YUFBTSxDQUFDO1lBQ04sVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRixDQUFDO0lBQ0gsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSxvRUFBb0U7SUFDcEUsb0VBQW9FO0lBQ3BFLGlFQUFpRTtJQUNqRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFBLGdCQUFnQixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxlQUFlLEdBQUcsQ0FBQztRQUNsRixVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELFlBQVk7SUFDWixJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUIsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELCtFQUErRTtJQUMvRSwrRUFBK0U7SUFDL0UsNkVBQTZFO0lBQzdFLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekQsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUM5QyxVQUFVLENBQUMsSUFBSSxDQUNiLEVBQUUsQ0FDQSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQ25DLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FDbkMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQsMkNBQTJDO0FBQzNDLDRCQUE0QjtBQUM1QiwyQ0FBMkM7QUFFM0M7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLCtCQUErQixDQUM3QyxNQUF1QyxFQUN2QyxLQUFjO0lBRWQsTUFBTSxVQUFVLEdBQVUsRUFBRSxDQUFDO0lBRTdCLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUMsSUFBSSxlQUFlLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDdEMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7YUFBTSxDQUFDO1lBQ04sVUFBVSxDQUFDLElBQUksQ0FDYixFQUFFLENBQ0EsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQ2xELEdBQUcsQ0FDRCxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsRUFDaEQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQzVDLENBQ0YsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sOEVBQThFO1FBQzlFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM1QixVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDOUIsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZILENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDcEMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsOERBQThEO0lBQzlELGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLENBQUM7SUFFdEcsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FDM0MsTUFBcUMsRUFDckMsS0FBYztJQUVkLE1BQU0sVUFBVSxHQUFVLEVBQUUsQ0FBQztJQUU3QixJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVDLElBQUksZUFBZSxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQ3RDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQzthQUFNLENBQUM7WUFDTixVQUFVLENBQUMsSUFBSSxDQUNiLEVBQUUsQ0FDQSxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQ2hELEdBQUcsQ0FDRCxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLEVBQzlDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUF3QixDQUFDLENBQ3pELENBQ0YsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sMkVBQTJFO1FBQzNFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM1QixVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzlCLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksbUJBQW1CLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckgsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFvQixDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUF3QixDQUFDLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQy9CLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFrQixDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzdCLFVBQVUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RyxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBRXBHLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUNBQW1DLENBQ2pELE1BQXFDO0lBRXJDLE1BQU0sVUFBVSxHQUFVLEVBQUUsQ0FBQztJQUU3QiwwRUFBMEU7SUFDMUUsNkVBQTZFO0lBQzdFLGtGQUFrRjtJQUNsRixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUF3QixDQUFDLENBQUMsQ0FBQztJQUUzRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDOUIsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNySCxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFvQixDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUF3QixDQUFDLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzdCLFVBQVUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RyxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVsRixPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsa0NBQWtDLENBQ2hELE1BQTBDLEVBQzFDLEtBQWM7SUFFZCxNQUFNLFVBQVUsR0FBVSxFQUFFLENBQUM7SUFFN0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO1NBQU0sQ0FBQztRQUNOLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDcEMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBd0IsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLDhCQUE4QixDQUM1QyxNQUFzQyxFQUN0QyxLQUFjO0lBRWQsTUFBTSxVQUFVLEdBQVUsRUFBRSxDQUFDO0lBRTdCLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztTQUFNLENBQUM7UUFDTixVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBb0IsQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FDM0MsTUFBcUMsRUFDckMsS0FBYztJQUVkLE1BQU0sVUFBVSxHQUFVLEVBQUUsQ0FBQztJQUU3QixJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO1NBQU0sQ0FBQztRQUNOLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDckMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgU1lTVEVNX09SR19JRCwgdHlwZSBMaWZlY3ljbGUgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBhbmQsIGFzYywgZGVzYywgZXEsIGlsaWtlLCBpc051bGwsIG5vdCwgb3IsIGd0ZSwgbHRlLCBzcWwsIFNRTCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB0eXBlIHsgQW55Q29sdW1uIH0gZnJvbSAnZHJpenpsZS1vcm0vY29sdW1uJztcbmltcG9ydCB7XG4gIEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXIsXG4gIGJ1aWxkSnNvbmJLZXl3b3JkQ29uZGl0aW9uLFxuICBlc2NhcGVMaWtlV2lsZGNhcmRzLFxuICBub3JtYWxpemVTdHJpbmdGaWx0ZXIsXG4gIHBhcnNlQm9vbGVhbkZpbHRlcixcbn0gZnJvbSAnLi9hY2Nlc3MtY29udHJvbC1idWlsZGVyLmpzJztcbmltcG9ydCB7IGlzVmVyc2lvblJhbmdlLCBzZW12ZXJPcmRlckJ5LCB2ZXJzaW9uU3BlY0NvbmRpdGlvbiB9IGZyb20gJy4vc2VtdmVyLXJhbmdlLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgTWVzc2FnZUZpbHRlcixcbiAgUGlwZWxpbmVGaWx0ZXIsXG4gIFBpcGVsaW5lVGVtcGxhdGVGaWx0ZXIsXG4gIFBsdWdpbkZpbHRlcixcbiAgQ29tcGxpYW5jZVBvbGljeUZpbHRlcixcbiAgQ29tcGxpYW5jZVJ1bGVGaWx0ZXIsXG4gIENvbXBsaWFuY2VFeGVtcHRpb25GaWx0ZXIsXG4gIENvbXBsaWFuY2VBdWRpdEZpbHRlcixcbiAgQ29tcGxpYW5jZVNjYW5GaWx0ZXIsXG59IGZyb20gJy4uL2NvcmUvcXVlcnktZmlsdGVycy5qcyc7XG5pbXBvcnQge1xuICBzY2hlbWEsXG4gIHR5cGUgTWVzc2FnZVByaW9yaXR5LFxuICB0eXBlIE1lc3NhZ2VUeXBlLFxuICB0eXBlIFJ1bGVUYXJnZXQsXG4gIHR5cGUgUnVsZVNldmVyaXR5LFxuICB0eXBlIFJ1bGVTY29wZSxcbiAgdHlwZSBQbHVnaW5MaWZlY3ljbGUsXG59IGZyb20gJy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcblxuLy8gUXVlcnkgYnVpbGRlciBpbnN0YW5jZXNcbmNvbnN0IHBpcGVsaW5lQnVpbGRlciA9IG5ldyBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyKHNjaGVtYS5waXBlbGluZSk7XG4vLyBBIHN5c3RlbS1vcmcgcGx1Z2luIHJlYWNoZXMgb3RoZXIgb3JncyBvbmx5IGFzIGFuIE9mZmljaWFsIExJU1RJTkcsIHJlc29sdmVkXG4vLyB0aHJvdWdoIHRoZSBvcmcncyAoZXhwbGljaXQgb3IgaW1wbGljaXQpIGluc3RhbGwg4oCUIHNlZSBwbHVnaW4tcmVzb2x1dGlvbi50cyDigJRcbi8vIG5ldmVyIHRocm91Z2ggYHZpc2liaWxpdHkgPSAncHVibGljJ2Agb24gaXRzIGBwbHVnaW5zYCByb3cuXG5jb25zdCBwbHVnaW5CdWlsZGVyID0gbmV3IEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXIoc2NoZW1hLnBsdWdpbiwgeyBzeXN0ZW1DYXRhbG9nOiBmYWxzZSB9KTtcbmNvbnN0IHBpcGVsaW5lVGVtcGxhdGVCdWlsZGVyID0gbmV3IEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXIoc2NoZW1hLnBpcGVsaW5lVGVtcGxhdGUpO1xuXG4vKipcbiAqIEVxdWFsaXR5IHByZWRpY2F0ZSBmb3IgYSBmaWx0ZXIncyBgaWRgIChhIHNpbmdsZSBzdHJpbmcsIG9yIHRoZSBmaXJzdCBpZCBvZiBhXG4gKiBsaXN0KS4gQW4gRU1QVFkgbGlzdCBjYXJyaWVzIG5vIHZhbGlkIGlkLCBzbyBpbnN0ZWFkIG9mIHByb2R1Y2luZyBhIG1hbGZvcm1lZFxuICogYGVxKGNvbCwgdW5kZWZpbmVkKWAgKHdoaWNoIFBvc3RncmVzIHdvdWxkIHJlamVjdCAvIHRyZWF0IHVucHJlZGljdGFibHkpIGl0XG4gKiB5aWVsZHMgdGhlIGZhaWwtY2xvc2VkIElNUE9TU0lCTEUgcHJlZGljYXRlIOKAlCBhbiBlbXB0eSBpZCBmaWx0ZXIgbWF0Y2hlcyBub1xuICogcm93cywgY29uc2lzdGVudCB3aXRoIFwibm8gaWQgZ2l2ZW4g4oeSIG5vdGhpbmcgc2VsZWN0ZWRcIi5cbiAqL1xuZnVuY3Rpb24gaWRFcXVhbHMoY29sOiBBbnlDb2x1bW4sIGlkOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFNRTCB7XG4gIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xuICAgIHJldHVybiBpZC5sZW5ndGggPiAwID8gZXEoY29sLCBpZFswXSkgOiBJTVBPU1NJQkxFO1xuICB9XG4gIHJldHVybiBlcShjb2wsIGlkKTtcbn1cblxuLyoqXG4gKiBQdXNoIHRoZSBzaGFyZWQgXCJpc0FjdGl2ZVwiIGNvbmRpdGlvbjpcbiAqIC0gZXhwbGljaXQgYGlzQWN0aXZlYCDihpIgYGVxKGNvbCwgYm9vbClgO1xuICogLSBvdGhlcndpc2UgZGVmYXVsdCB0byBhY3RpdmUtb25seSwgRVhDRVBUIHNpbmdsZS1lbnRpdHkgbG9va3VwcyBieSBpZCBzbyBhXG4gKiAgIGBmaW5kQnlJZGAgb2YgYW4gaW5hY3RpdmUgcm93IHN0aWxsIHJldHVybnMgaXQuIFBhc3MgYGhhc0lkPWZhbHNlYCB0byBhbHdheXNcbiAqICAgZGVmYXVsdCAoZS5nLiB0aGUgcHVibGlzaGVkLWNhdGFsb2cgYnJvd3NlLCB3aGljaCBuZXZlciBrZXlzIG9mZiBpZCkuXG4gKi9cbmZ1bmN0aW9uIGFjdGl2ZURlZmF1bHQoY29uZGl0aW9uczogU1FMW10sIGNvbDogQW55Q29sdW1uLCBpc0FjdGl2ZTogdW5rbm93biwgaGFzSWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKGlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoY29sLCBwYXJzZUJvb2xlYW5GaWx0ZXIoaXNBY3RpdmUpKSk7XG4gIH0gZWxzZSBpZiAoIWhhc0lkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKGNvbCwgdHJ1ZSkpO1xuICB9XG59XG5cbi8qKlxuICogRmFpbC1jbG9zZWQgb3JnIGd1YXJkIGZvciBjb21wbGlhbmNlIGJ1aWxkZXJzIHdob3NlIG9ubHkgdGVuYW5jeSBnYXRlIGlzIHRoZVxuICogYXBwLWxheWVyIGBvcmdJZGAgcHJlZGljYXRlLiBXaGVuIGBvcmdJZGAgaXMgYWJzZW50IHdlIGVtaXQgYW4gaW1wb3NzaWJsZVxuICogcHJlZGljYXRlIHNvIHRoZSBxdWVyeSByZXR1cm5zIHplcm8gcm93cyByYXRoZXIgdGhhbiBsZWFraW5nIGFjcm9zcyB0ZW5hbnRzXG4gKiAobWlycm9ycyB0aGUgYW5vbnltb3VzIGZhbGxiYWNrIGluIGFjY2Vzcy1jb250cm9sLWJ1aWxkZXIudHMpLlxuICovXG5jb25zdCBJTVBPU1NJQkxFOiBTUUwgPSBzcWxgZmFsc2VgO1xuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBwaXBlbGluZSBxdWVyaWVzXG4gKlxuICogQWNjZXNzIGNvbnRyb2wgaXMgdGhlIHNoYXJlZCB0aHJlZS1ydW5nIGB2aXNpYmlsaXR5YCBsYWRkZXIg4oCUIHNlZVxuICogYEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXIuYnVpbGRBY2Nlc3NDb250cm9sYCBmb3IgdGhlIGZ1bGwgcHJlZGljYXRlLlxuICogYHBhcmVudE9yZ0lkYCAob3JnIOKGkiB0ZWFtIGhpZXJhcmNoeSkgd2lkZW5zIHRoZSBjYXRhbG9nIHZpZXcgc28gYSB0ZWFtIG9yZ1xuICogYWxzbyBzZWVzIGl0cyBwYXJlbnQncyBwdWJsaWMgcGlwZWxpbmVzLlxuICpcbiAqIEBwYXJhbSBmaWx0ZXIgLSBQaXBlbGluZSBmaWx0ZXIgY3JpdGVyaWFcbiAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBhbm9ueW1vdXMgZ2V0cyBzeXN0ZW0gcHVibGljIG9ubHkpXG4gKiBAcGFyYW0gcGFyZW50T3JnSWQgLSBQYXJlbnQgb3JnIElEIHdoZW4gdGhlIGNhbGxlciBpcyBhIHRlYW0gKG9wdGlvbmFsKVxuICogQHJldHVybnMgQXJyYXkgb2YgU1FMIGNvbmRpdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGlwZWxpbmVDb25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8UGlwZWxpbmVGaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbiAgcGFyZW50T3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIC8vIFVzZSBnZW5lcmljIGJ1aWxkZXIgZm9yIGNvbW1vbiBjb25kaXRpb25zIChhY2Nlc3MgY29udHJvbCwgSUQsIGJvb2xlYW5zLCB2aXNpYmlsaXR5KVxuICBjb25zdCBjb25kaXRpb25zID0gcGlwZWxpbmVCdWlsZGVyLmJ1aWxkQ29tbW9uQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgLy8gRXhwbGljaXQgb3duZXItb3JnIG5hcnJvd2luZywgYXMgdGhlIHBsdWdpbiBhbmQgdGVtcGxhdGUgYnVpbGRlcnMgYWxyZWFkeVxuICAvLyBkby4gVGhlIHNjaGVtYSBhY2NlcHRzIGA/b3JnSWQ9YCBmb3IgcGlwZWxpbmVzIHRvbywgYnV0IHRoaXMgYnVpbGRlciBkcm9wcGVkXG4gIC8vIGl0LCBzbyB0aGUgZmlsdGVyIHNpbGVudGx5IGRpZCBub3RoaW5nLiBJdCBpcyBBTkQnZCBvbnRvIHRoZSBhY2Nlc3NcbiAgLy8gcHJlZGljYXRlIGFib3ZlLCBzbyBpdCBjYW4gb25seSBOQVJST1cgdGhlIHZpc2libGUgc2V0LCBuZXZlciB3aWRlbiBpdC5cbiAgaWYgKGZpbHRlci5vcmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZS5vcmdJZCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5vcmdJZCkpKTtcbiAgfVxuXG4gIC8vIEFkZCBwaXBlbGluZS1zcGVjaWZpYyBmaWx0ZXJzXG4gIGlmIChmaWx0ZXIucHJvamVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZS5wcm9qZWN0LCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLnByb2plY3QpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLm9yZ2FuaXphdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZS5vcmdhbml6YXRpb24sIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIub3JnYW5pemF0aW9uKSkpO1xuICB9XG5cbiAgLy8gRXhhY3QtbWF0Y2ggbmFtZSBmaWx0ZXIgKG1pcnJvcnMgdGhlIHNpYmxpbmcgYHByb2plY3RgL2Bvcmdhbml6YXRpb25gXG4gIC8vIHByZWRpY2F0ZXMpLiBUaGUgQ0xJJ3MgYC0tcGlwZWxpbmUtbmFtZWAgaXMgZG9jdW1lbnRlZCBhcyBhbiBleGFjdCBmaWx0ZXIsXG4gIC8vIHNvIHRoaXMgdXNlcyBgZXFgIHJhdGhlciB0aGFuIGFuIElMSUtFIGNvbnRhaW5zLiBOdWxsLXNhZmU6IGFic2VudFxuICAvLyBwaXBlbGluZU5hbWUg4oeSIG5vIHByZWRpY2F0ZS5cbiAgaWYgKGZpbHRlci5waXBlbGluZU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUucGlwZWxpbmVOYW1lLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLnBpcGVsaW5lTmFtZSkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIua2V5d29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGJ1aWxkSnNvbmJLZXl3b3JkQ29uZGl0aW9uKHNjaGVtYS5waXBlbGluZS5rZXl3b3Jkcywgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5rZXl3b3JkKSkpO1xuICB9XG5cbiAgLy8gRGV2ZWxvcGVyLXBvcnRhbCBjYXRhbG9nIGZpbHRlcnMgKG93bmVyIC8gbGlmZWN5Y2xlKS5cbiAgaWYgKGZpbHRlci5vd25lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lLm93bmVySWQsIGZpbHRlci5vd25lcklkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmxpZmVjeWNsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZS5saWZlY3ljbGUsIGZpbHRlci5saWZlY3ljbGUgYXMgTGlmZWN5Y2xlKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBUSEUgcmFua2luZyBmb3IgcmVzb2x2aW5nIG9uZSBwbHVnaW4gUk9XIGJ5IG5hbWUgKGAvcGx1Z2lucy9sb29rdXBgLFxuICogYC9wbHVnaW5zL2ZpbmRgLCB0aGUgcGlwZWxpbmUgc2VydmljZSdzIGNvbnRyYWN0IGNoZWNrKSDigJQgb25lIGRlZmluaXRpb24gc29cbiAqIHN5bnRoIGFuZCB0aGUgY29udHJhY3QgY2hlY2sgbmV2ZXIgcGljayBkaWZmZXJlbnQgd2lubmVycy4gUm93cyBhcmUgb25seSB0aGVcbiAqIG9yZydzIG93biBhbmQgaXRzIHBhcmVudCdzOiB0aGUgT2ZmaWNpYWwgY2F0YWxvZyBhbmQgZXZlcnkgb3RoZXIgcHVibGlzaGVyXG4gKiByZXNvbHZlIGFzIExJU1RJTkdTIGFmdGVyd2FyZHMgKHBsdWdpbi1yZXNvbHV0aW9uLnRzKS5cbiAqICAgMS4gb3duZXIg4oCUIHRoZSBjYWxsZXIncyBvd24gb3JnLCB0aGVuIGl0cyBwYXJlbnQgb3JnIChhIHRlYW0gcmVhZHMgdGhlXG4gKiAgICAgIHBhcmVudCdzIHNoYXJlZCByb3dzKSwgdGhlbiBhbnl0aGluZyBlbHNlIGEgc3VwZXJhZG1pbiBjYW4gc2VlO1xuICogICAyLiB0aGUgZGVmYXVsdCB2ZXJzaW9uO1xuICogICAzLiB0aGUgaGlnaGVzdCBzZW12ZXIgKHNvIGBeMS4yYCByZXNvbHZlcyB0byB0aGUgbmV3ZXN0IG1hdGNoaW5nIHJlbGVhc2UpO1xuICogICA0LiBgaWRgLCBhIHRvdGFsIHRpZWJyZWFrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luUmVzb2x1dGlvbk9yZGVyQnkob3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogU1FMW10ge1xuICBjb25zdCBvd25lclJhbmsgPSBvcmdJZFxuICAgID8gcGFyZW50T3JnSWRcbiAgICAgID8gc3FsYENBU0UgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSBXSEVOICR7b3JnSWR9IFRIRU4gMCBXSEVOICR7cGFyZW50T3JnSWR9IFRIRU4gMSBFTFNFIDIgRU5EYFxuICAgICAgOiBzcWxgQ0FTRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9IFdIRU4gJHtvcmdJZH0gVEhFTiAwIEVMU0UgMiBFTkRgXG4gICAgOiBudWxsO1xuICByZXR1cm4gW1xuICAgIC4uLihvd25lclJhbmsgPyBbb3duZXJSYW5rXSA6IFtdKSxcbiAgICBkZXNjKHNjaGVtYS5wbHVnaW4uaXNEZWZhdWx0KSxcbiAgICAuLi5zZW12ZXJPcmRlckJ5KHNjaGVtYS5wbHVnaW4udmVyc2lvbiksXG4gICAgYXNjKHNjaGVtYS5wbHVnaW4uaWQpLFxuICBdO1xufVxuXG4vKiogQSBwbHVnaW4gdmVyc2lvbiB0aGF0IGhhcyBub3QgYmVlbiB5YW5rZWQgKHRpbWVzdGFtcCBhbmQgbGlmZWN5Y2xlIGFncmVlKS4gKi9cbmZ1bmN0aW9uIG5vdFlhbmtlZCgpOiBTUUxbXSB7XG4gIHJldHVybiBbaXNOdWxsKHNjaGVtYS5wbHVnaW4ueWFua2VkQXQpLCBzcWxgJHtzY2hlbWEucGx1Z2luLmxpZmVjeWNsZX0gPD4gJ3lhbmtlZCdgXTtcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgcGx1Z2luIHF1ZXJpZXNcbiAqXG4gKiBBY2Nlc3MgY29udHJvbCBpcyB0aGUgc2hhcmVkIHRocmVlLXJ1bmcgYHZpc2liaWxpdHlgIGxhZGRlciDigJQgc2VlXG4gKiBgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlci5idWlsZEFjY2Vzc0NvbnRyb2xgLlxuICpcbiAqIEBwYXJhbSBmaWx0ZXIgLSBQbHVnaW4gZmlsdGVyIGNyaXRlcmlhXG4gKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgYW5vbnltb3VzIGdldHMgc3lzdGVtIHB1YmxpYyBvbmx5KVxuICogQHJldHVybnMgQXJyYXkgb2YgU1FMIGNvbmRpdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGx1Z2luQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPFBsdWdpbkZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuICBwYXJlbnRPcmdJZD86IHN0cmluZyxcbik6IFNRTFtdIHtcbiAgLy8gVXNlIGdlbmVyaWMgYnVpbGRlciBmb3IgY29tbW9uIGNvbmRpdGlvbnMgKGFjY2VzcyBjb250cm9sLCBJRCwgYm9vbGVhbnMsIHZpc2liaWxpdHkpXG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBwbHVnaW5CdWlsZGVyLmJ1aWxkQ29tbW9uQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgLy8gQWRkIHBsdWdpbi1zcGVjaWZpYyBmaWx0ZXJzXG4gIGlmIChmaWx0ZXIub3JnSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGx1Z2luLm9yZ0lkLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm9yZ0lkKSkpO1xuICB9XG5cbiAgLy8gU3Vic3RyaW5nIHNlYXJjaCBmb3IgdGhlIGxpc3QgLyBzZWFyY2ggVUk7IEVYQUNUIGZvciByZXNvbHV0aW9uICh0aGVcbiAgLy8gbG9va3VwIHBhdGggc2V0cyBgbmFtZU1hdGNoOiAnZXhhY3QnYCkgc28gYHRyaXZ5YCBuZXZlciByZXNvbHZlcyB0b1xuICAvLyBgdHJpdnktc2NhbmAgb3IgYW5vdGhlciBvcmcncyBgbXktdHJpdnlgLlxuICBpZiAoZmlsdGVyLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5hbWUgPSBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm5hbWUpO1xuICAgIGNvbmRpdGlvbnMucHVzaChmaWx0ZXIubmFtZU1hdGNoID09PSAnZXhhY3QnXG4gICAgICA/IGVxKHNjaGVtYS5wbHVnaW4ubmFtZSwgbmFtZSlcbiAgICAgIDogaWxpa2Uoc2NoZW1hLnBsdWdpbi5uYW1lLCBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyhuYW1lKX0lYCkpO1xuICB9XG5cbiAgLy8gRXhhY3QgdmVyc2lvbiwgb3IgYSBzZW12ZXIgcmFuZ2UgLyBgbGF0ZXN0YCAoc2VlIHNlbXZlci1yYW5nZS50cykuIEEgcmFuZ2VcbiAgLy8gbmV2ZXIgcmVzb2x2ZXMgdG8gYSB5YW5rZWQgdmVyc2lvbjogeWFuayBzdG9wcyBhIHZlcnNpb24gcmVzb2x2aW5nIGZvclxuICAvLyBuZXcgc3ludGhzLCB3aGlsZSBhbiBleGFjdCBwaW4gc3RpbGwgZmluZHMgaXQgKHNvIHRoZSBjYWxsZXIgY2FuIGV4cGxhaW4pLlxuICBpZiAoZmlsdGVyLnZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHNwZWMgPSBmaWx0ZXIudmVyc2lvbiBhcyBzdHJpbmc7XG4gICAgY29uZGl0aW9ucy5wdXNoKHZlcnNpb25TcGVjQ29uZGl0aW9uKHNjaGVtYS5wbHVnaW4udmVyc2lvbiwgc3BlYykpO1xuICAgIGlmIChpc1ZlcnNpb25SYW5nZShzcGVjKSkgY29uZGl0aW9ucy5wdXNoKC4uLm5vdFlhbmtlZCgpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZXhjbHVkZVlhbmtlZCA9PT0gdHJ1ZSkge1xuICAgIGNvbmRpdGlvbnMucHVzaCguLi5ub3RZYW5rZWQoKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmV4Y2x1ZGVTY2FuRmxhZ2dlZCA9PT0gdHJ1ZSkge1xuICAgIGNvbmRpdGlvbnMucHVzaChpc051bGwoc2NoZW1hLnBsdWdpbi5zY2FuRmxhZ2dlZEF0KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmtleXdvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEucGx1Z2luLmtleXdvcmRzLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLmtleXdvcmQpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmNhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi5jYXRlZ29yeSwgZmlsdGVyLmNhdGVnb3J5IGFzIHN0cmluZykpO1xuICB9XG5cbiAgLy8gRGV2ZWxvcGVyLXBvcnRhbCBjYXRhbG9nIGZpbHRlcnMgKG93bmVyIC8gbGlmZWN5Y2xlKS5cbiAgaWYgKGZpbHRlci5vd25lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi5vd25lcklkLCBmaWx0ZXIub3duZXJJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5saWZlY3ljbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGx1Z2luLmxpZmVjeWNsZSwgZmlsdGVyLmxpZmVjeWNsZSBhcyBQbHVnaW5MaWZlY3ljbGUpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBwaXBlbGluZS10ZW1wbGF0ZSBxdWVyaWVzLlxuICpcbiAqIFRlbXBsYXRlcyB3ZXJlIGJyaWVmbHkgdGhlIG9ubHkgZW50aXR5IG9uIHRoZSB0aHJlZS1ydW5nIGxhZGRlciBhbmQgbmVlZGVkIGFcbiAqIGJlc3Bva2UgcHJlZGljYXRlOyBub3cgdGhhdCBldmVyeSBjYXRhbG9nIGVudGl0eSBzaGFyZXMgaXQsIHRoZXkgYXJlIGJhY2sgb25cbiAqIHRoZSBTQU1FIGBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyYCBhcyBwaXBlbGluZXMgYW5kIHBsdWdpbnMuIFZpc2liaWxpdHlcbiAqIHNlbWFudGljcyBsaXZlIGluIG9uZSBwbGFjZSDigJQgc2VlIGBidWlsZEFjY2Vzc0NvbnRyb2xgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQaXBlbGluZVRlbXBsYXRlQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPFBpcGVsaW5lVGVtcGxhdGVGaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbiAgcGFyZW50T3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBwaXBlbGluZVRlbXBsYXRlQnVpbGRlci5idWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gIC8vIE9wdGlvbmFsIG5hcnJvd2luZyB0byBhIHNwZWNpZmljIG9yZyB3aXRoaW4gdGhlIGNhbGxlcidzIHZpc2liaWxpdHkgKG1pcnJvcnNcbiAgLy8gdGhlIHBsdWdpbiBidWlsZGVyKS4gQWNjZXNzIGNvbnRyb2wgYWJvdmUgc3RpbGwgYm91bmRzIHdoYXQncyB2aXNpYmxlLlxuICBpZiAoZmlsdGVyLm9yZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lVGVtcGxhdGUub3JnSWQsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIub3JnSWQgYXMgc3RyaW5nKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWxpa2Uoc2NoZW1hLnBpcGVsaW5lVGVtcGxhdGUubmFtZSwgYCUke2VzY2FwZUxpa2VXaWxkY2FyZHMobm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5uYW1lKSl9JWApKTtcbiAgfVxuXG4gIC8vIFZlcmJhdGltIG1hdGNoLCBjb25zaXN0ZW50IHdpdGggdGhlIHBsdWdpbiBidWlsZGVyIChjYXRlZ29yaWVzIGFyZSBzdG9yZWQgYXMtaXMpLlxuICBpZiAoZmlsdGVyLmNhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lVGVtcGxhdGUuY2F0ZWdvcnksIGZpbHRlci5jYXRlZ29yeSBhcyBzdHJpbmcpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIua2V5d29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGJ1aWxkSnNvbmJLZXl3b3JkQ29uZGl0aW9uKHNjaGVtYS5waXBlbGluZVRlbXBsYXRlLmtleXdvcmRzLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLmtleXdvcmQpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLm93bmVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmVUZW1wbGF0ZS5vd25lcklkLCBmaWx0ZXIub3duZXJJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5saWZlY3ljbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmVUZW1wbGF0ZS5saWZlY3ljbGUsIGZpbHRlci5saWZlY3ljbGUgYXMgTGlmZWN5Y2xlKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgbWVzc2FnZSBxdWVyaWVzLlxuICpcbiAqIEN1c3RvbSBhY2Nlc3MgY29udHJvbCBmb3IgbWVzc2FnZXM6XG4gKiAtIE1lc3NhZ2VzIGFyZSB2aXNpYmxlIHRvIHRoZSBzZW5kZXIgb3JnIChvcmdJZCkgT1IgdGhlIHJlY2lwaWVudCBvcmcgKHJlY2lwaWVudE9yZ0lkKVxuICogLSBCcm9hZGNhc3QgYW5ub3VuY2VtZW50cyAocmVjaXBpZW50T3JnSWQgPSAnKicpIGFyZSB2aXNpYmxlIHRvIGFsbCBvcmdzXG4gKiAtIFN5c3RlbSBvcmcgY2FuIHNlZSBhbGwgbWVzc2FnZXNcbiAqXG4gKiBAcGFyYW0gZmlsdGVyIC0gTWVzc2FnZSBmaWx0ZXIgY3JpdGVyaWFcbiAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSURcbiAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE1lc3NhZ2VDb25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8TWVzc2FnZUZpbHRlcj4sXG4gIG9yZ0lkOiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG4gIGNvbnN0IG5vcm1hbGl6ZWRPcmdJZCA9IG9yZ0lkLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ3VzdG9tIGFjY2VzcyBjb250cm9sOiBzZW5kZXIgT1IgcmVjaXBpZW50IE9SIGJyb2FkY2FzdC5cbiAgLy9cbiAgLy8gUGVyLXVzZXIgdGFyZ2V0aW5nOiBhIHJvdyB3aXRoIGByZWNpcGllbnRfdXNlcl9pZGAgc2V0IGlzIHByaXZhdGUgdG8gdGhhdFxuICAvLyB1c2VyIFdJVEhJTiB0aGUgcmVjaXBpZW50IG9yZy4gVGhlIHJlY2lwaWVudC1zaWRlIGJyYW5jaCB0aGVyZWZvcmUgYWRtaXRzIGFcbiAgLy8gdGFyZ2V0ZWQgcm93IG9ubHkgd2hlbiB0aGUgdmlld2VyIElTIHRoYXQgdXNlciAoYGZpbHRlci52aWV3ZXJVc2VySWRgKTtcbiAgLy8gb3JnLXdpZGUgcm93cyAocmVjaXBpZW50X3VzZXJfaWQgSVMgTlVMTCkgc3RheSB2aXNpYmxlIHRvIGV2ZXJ5b25lIGluIHRoZVxuICAvLyBvcmcuIEFic2VudCBhIHZpZXdlciBpZCwgdGhlIHJlY2lwaWVudCBzaWRlIHNlZXMgb3JnLXdpZGUgcm93cyBvbmx5LCBzbyBhXG4gIC8vIHRhcmdldGVkIG1lc3NhZ2UgbmV2ZXIgbGVha3MgdG8gb3RoZXIgbWVtYmVycyAoaXQgc3RheXMgdmlzaWJsZSB0byBpdHNcbiAgLy8gdGFyZ2V0LCB0aGUgc2VuZGVyIG9yZywgYW5kIHRoZSBzeXN0ZW0gb3JnKS4gVGhlIFNFTkRFUiBicmFuY2ggc2hvd3Mgd2hhdFxuICAvLyB5b3VyIG9yZyBzZW50IOKAlCBleGNlcHQgYSByZXBseSB5b3VyIG9yZydzIFRBUkdFVEVEIHVzZXIgd3JvdGUgaW5zaWRlIHRoZWlyXG4gIC8vIHByaXZhdGUgdGhyZWFkLCB3aGljaCBzdGF5cyBwcml2YXRlIHRvIHRoZW0gKHNlZSBgc2VuZGVyVmlzaWJsZWApLlxuICBpZiAobm9ybWFsaXplZE9yZ0lkID09PSBTWVNURU1fT1JHX0lEKSB7XG4gICAgLy8gU3lzdGVtIG9yZyBjYW4gc2VlIGFsbCBtZXNzYWdlc1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHJlY2lwaWVudFZpc2libGUgPSBmaWx0ZXIudmlld2VyVXNlcklkXG4gICAgICA/IG9yKFxuICAgICAgICBpc051bGwoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50VXNlcklkKSxcbiAgICAgICAgZXEoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50VXNlcklkLCBmaWx0ZXIudmlld2VyVXNlcklkKSxcbiAgICAgICkhXG4gICAgICA6IGlzTnVsbChzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRVc2VySWQpO1xuICAgIC8vIFNlbmRlciBzaWRlIG9mIGEgUFJJVkFURSB0aHJlYWQ6IGEgcmVwbHkgYXV0aG9yZWQgYnkgdGhlIG9yZyB0aGF0IGhvbGRzIGFcbiAgICAvLyB1c2VyLXRhcmdldGVkIHJvb3QgKHRoZSB0YXJnZXRlZCB1c2VyIGFuc3dlcmluZykgY2FycmllcyBgb3JnX2lkYCA9IHRoYXRcbiAgICAvLyBvcmcsIHNvIHRoZSB1bmNvbmRpdGlvbmFsIHNlbmRlciBicmFuY2ggc2hvd2VkIHRoZSBwcml2YXRlIGV4Y2hhbmdlIHRvXG4gICAgLy8gZXZlcnkgb25lIG9mIGl0cyBtZW1iZXJzLiBTdWNoIGEgcmVwbHkgaXMgdmlzaWJsZSBvbiBpdHMgb3duIG9yZydzIHNpZGVcbiAgICAvLyBvbmx5IHRvIHRoZSByb290J3MgdGFyZ2V0IHVzZXI7IHdpdGggbm8gdmlld2VyIGl0IGlzIGhpZGRlbiAoZmFpbC1jbG9zZWQpLlxuICAgIC8vIEV2ZXJ5IG90aGVyIHJvdyAocm9vdHMsIHJlcGxpZXMgaW4gdW50YXJnZXRlZCB0aHJlYWRzLCByZXBsaWVzIGluIGEgdGhyZWFkXG4gICAgLy8gdGFyZ2V0ZWQgYXQgU09NRU9ORSBFTFNFJ3Mgb3JnKSBrZWVwcyB0aGUgdW5jb25kaXRpb25hbCBzZW5kZXIgdmlldy5cbiAgICBjb25zdCBwcml2YXRlUm9vdEZvck90aGVyVmlld2VyID0gZmlsdGVyLnZpZXdlclVzZXJJZFxuICAgICAgPyBzcWxgcm9vdC5yZWNpcGllbnRfdXNlcl9pZCBJUyBOT1QgTlVMTCBBTkQgcm9vdC5yZWNpcGllbnRfdXNlcl9pZCA8PiAke2ZpbHRlci52aWV3ZXJVc2VySWR9YFxuICAgICAgOiBzcWxgcm9vdC5yZWNpcGllbnRfdXNlcl9pZCBJUyBOT1QgTlVMTGA7XG4gICAgY29uc3Qgc2VuZGVyVmlzaWJsZSA9IG9yKFxuICAgICAgaXNOdWxsKHNjaGVtYS5tZXNzYWdlLnRocmVhZElkKSxcbiAgICAgIHNxbGBOT1QgRVhJU1RTIChcbiAgICAgICAgU0VMRUNUIDEgRlJPTSAke3NjaGVtYS5tZXNzYWdlfSBBUyByb290XG4gICAgICAgIFdIRVJFIHJvb3QuaWQgPSAke3NjaGVtYS5tZXNzYWdlLnRocmVhZElkfVxuICAgICAgICAgIEFORCBsb3dlcihyb290LnJlY2lwaWVudF9vcmdfaWQpID0gJHtub3JtYWxpemVkT3JnSWR9XG4gICAgICAgICAgQU5EICR7cHJpdmF0ZVJvb3RGb3JPdGhlclZpZXdlcn1cbiAgICAgIClgLFxuICAgICkhO1xuICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgIG9yKFxuICAgICAgICBhbmQoZXEoc2NoZW1hLm1lc3NhZ2Uub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZCksIHNlbmRlclZpc2libGUpISxcbiAgICAgICAgYW5kKGVxKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudE9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLCByZWNpcGllbnRWaXNpYmxlKSEsXG4gICAgICAgIC8vIEJyb2FkY2FzdCAoYW5ub3VuY2VtZW50cykuIFNlbGYtZGVmZW5kaW5nOiBvbmx5IGV2ZXIgb3JnLXdpZGUgcm93cyDigJRcbiAgICAgICAgLy8gYSBtaXMtY3JlYXRlZCAnKicgKyBwZXItdXNlciByb3cgY2FuJ3QgbGVhayB0byBldmVyeSBvcmcuXG4gICAgICAgIGFuZChlcShzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRPcmdJZCwgJyonKSwgaXNOdWxsKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudFVzZXJJZCkpISxcbiAgICAgICkhLFxuICAgICk7XG4gIH1cblxuICAvLyBBY3RpdmUgZmlsdGVyIChkZWZhdWx0IHRvIGFjdGl2ZSBvbmx5KVxuICBpZiAoZmlsdGVyLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UuaXNBY3RpdmUsIHBhcnNlQm9vbGVhbkZpbHRlcihmaWx0ZXIuaXNBY3RpdmUpKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLmlzQWN0aXZlLCB0cnVlKSk7XG4gIH1cblxuICAvLyBUaHJlYWQgZmlsdGVyIChudWxsID0gcm9vdCBtZXNzYWdlcyBvbmx5IHZpYSBJUyBOVUxMKVxuICBpZiAoZmlsdGVyLnRocmVhZElkICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZmlsdGVyLnRocmVhZElkID09PSBudWxsKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goaXNOdWxsKHNjaGVtYS5tZXNzYWdlLnRocmVhZElkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS50aHJlYWRJZCwgZmlsdGVyLnRocmVhZElkKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVjaXBpZW50IG9yZyBmaWx0ZXJcbiAgaWYgKGZpbHRlci5yZWNpcGllbnRPcmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudE9yZ0lkLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLnJlY2lwaWVudE9yZ0lkKSkpO1xuICB9XG5cbiAgLy8gUmVjaXBpZW50IHVzZXIgZmlsdGVyIChleHBsaWNpdCk6IG51bGwg4oaSIG9yZy13aWRlIHJvd3Mgb25seTsgYSB2YWx1ZSDihpJcbiAgLy8gcm93cyB0YXJnZXRlZCBhdCB0aGF0IHVzZXIuIERpc3RpbmN0IGZyb20gYHZpZXdlclVzZXJJZGAsIHdoaWNoIHdpZGVuc1xuICAvLyB2aXNpYmlsaXR5IHJhdGhlciB0aGFuIG5hcnJvd2luZyBpdC5cbiAgaWYgKGZpbHRlci5yZWNpcGllbnRVc2VySWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChmaWx0ZXIucmVjaXBpZW50VXNlcklkID09PSBudWxsKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goaXNOdWxsKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudFVzZXJJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb21wYXJlIHRoZSByYXcgdXNlciBpZCDigJQgY2FzZS1wcmVzZXJ2aW5nLCBtYXRjaGluZyBob3cgaXQncyBzdG9yZWQgYW5kXG4gICAgICAvLyBob3cgYHZpZXdlclVzZXJJZGAgaXMgY29tcGFyZWQgKGRvIE5PVCBsb3dlcmNhc2UgdmlhIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcikuXG4gICAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50VXNlcklkLCBmaWx0ZXIucmVjaXBpZW50VXNlcklkKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWVzc2FnZSB0eXBlIGZpbHRlclxuICBpZiAoZmlsdGVyLm1lc3NhZ2VUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UubWVzc2FnZVR5cGUsIGZpbHRlci5tZXNzYWdlVHlwZSBhcyBNZXNzYWdlVHlwZSkpO1xuICB9XG5cbiAgLy8gUHJpb3JpdHkgZmlsdGVyXG4gIGlmIChmaWx0ZXIucHJpb3JpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5wcmlvcml0eSwgZmlsdGVyLnByaW9yaXR5IGFzIE1lc3NhZ2VQcmlvcml0eSkpO1xuICB9XG5cbiAgLy8gQ2hhbm5lbCBmaWx0ZXIgKG51bGwgPSBubyBjaGFubmVsIC8gb3JnLXRvLW9yZyBtZXNzYWdlcylcbiAgaWYgKGZpbHRlci5jaGFubmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZmlsdGVyLmNoYW5uZWwgPT09IG51bGwpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChpc051bGwoc2NoZW1hLm1lc3NhZ2UuY2hhbm5lbCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UuY2hhbm5lbCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5jaGFubmVsKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlYWQtc3RhdGUgZmlsdGVyIOKAlCBKU09OQiBrZXktZXhpc3RlbmNlIGNoZWNrIGFnYWluc3QgYHJlYWRfYnlgLlxuICAvLyBXZSB1c2UganNvbmJfZXhpc3RzKHJlYWRfYnksICRvcmdJZCkgcmF0aGVyIHRoYW4gdGhlIGA/YCBvcGVyYXRvclxuICAvLyBiZWNhdXNlIHBvc3RncmVzLWpzIC8gZHJpenpsZSdzIHBhcmFtZXRlciBiaW5kaW5nIHRyZWF0cyBgP2AgYXMgYVxuICAvLyBwbGFjZWhvbGRlciwgd2hpY2ggd291bGQgY29uZmxpY3Qgd2l0aCB0aGUgSlNPTkIgYD9gIG9wZXJhdG9yLlxuICBpZiAoZmlsdGVyLmlzUmVhZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qga2V5RXhpc3RzID0gc3FsYGpzb25iX2V4aXN0cygke3NjaGVtYS5tZXNzYWdlLnJlYWRCeX0sICR7bm9ybWFsaXplZE9yZ0lkfSlgO1xuICAgIGNvbmRpdGlvbnMucHVzaChmaWx0ZXIuaXNSZWFkID8ga2V5RXhpc3RzIDogbm90KGtleUV4aXN0cykpO1xuICB9XG5cbiAgLy8gSUQgZmlsdGVyXG4gIGlmIChmaWx0ZXIuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChpZEVxdWFscyhzY2hlbWEubWVzc2FnZS5pZCwgZmlsdGVyLmlkKSk7XG4gIH1cblxuICAvLyBGcmVlLXRleHQgaW5ib3ggc2VhcmNoIOKAlCBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBvdmVyIHN1YmplY3QgT1IgY29udGVudC5cbiAgLy8gV2lsZGNhcmRzIGluIHRoZSB0ZXJtIGFyZSBlc2NhcGVkIHNvIGEgbGl0ZXJhbCBgJWAvYF9gIGlzIG1hdGNoZWQgbGl0ZXJhbGx5O1xuICAvLyBhbiBhbGwtd2hpdGVzcGFjZSB0ZXJtIGlzIGlnbm9yZWQgKG5vLW9wKSByYXRoZXIgdGhhbiBtYXRjaGluZyBldmVyeXRoaW5nLlxuICBpZiAoZmlsdGVyLnNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgdGVybSA9IG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIuc2VhcmNoKS50cmltKCk7XG4gICAgaWYgKHRlcm0pIHtcbiAgICAgIGNvbnN0IGxpa2UgPSBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyh0ZXJtKX0lYDtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgb3IoXG4gICAgICAgICAgaWxpa2Uoc2NoZW1hLm1lc3NhZ2Uuc3ViamVjdCwgbGlrZSksXG4gICAgICAgICAgaWxpa2Uoc2NoZW1hLm1lc3NhZ2UuY29udGVudCwgbGlrZSksXG4gICAgICAgICkhLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29tcGxpYW5jZSBRdWVyeSBCdWlsZGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBjb21wbGlhbmNlIHBvbGljeSBxdWVyaWVzLlxuICpcbiAqIFZpc2liaWxpdHk6XG4gKiAtIFRoZSByZXF1ZXN0aW5nIG9yZydzIG93biBwb2xpY2llcywgQU5EXG4gKiAtIFRoZSBzeXN0ZW0gb3JnJ3MgcG9saWN5IHRlbXBsYXRlcyAoc28gdGhlIHNoYXJlZCBjYXRhbG9nIGlzIGFsd2F5cyB2aXNpYmxlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29tcGxpYW5jZVBvbGljeUNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlUG9saWN5RmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZE9yZ0lkID0gb3JnSWQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9ybWFsaXplZE9yZ0lkID09PSBTWVNURU1fT1JHX0lEKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICAgIG9yKFxuICAgICAgICAgIGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5Lm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLFxuICAgICAgICAgIGFuZChcbiAgICAgICAgICAgIGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5Lm9yZ0lkLCBTWVNURU1fT1JHX0lEKSxcbiAgICAgICAgICAgIGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5LmlzVGVtcGxhdGUsIHRydWUpLFxuICAgICAgICAgICkhLFxuICAgICAgICApISxcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEZhaWwtY2xvc2VkOiBubyBvcmcgY29udGV4dCDih5Igbm8gcm93cyAobmV2ZXIgbGVhayBldmVyeSB0ZW5hbnQncyBwb2xpY2llcykuXG4gICAgY29uZGl0aW9ucy5wdXNoKElNUE9TU0lCTEUpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlkRXF1YWxzKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5LmlkLCBmaWx0ZXIuaWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5Lm5hbWUsIGAlJHtlc2NhcGVMaWtlV2lsZGNhcmRzKG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIubmFtZSkpfSVgKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmlzVGVtcGxhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5pc1RlbXBsYXRlLCBwYXJzZUJvb2xlYW5GaWx0ZXIoZmlsdGVyLmlzVGVtcGxhdGUpKSk7XG4gIH1cblxuICAvLyBEZWZhdWx0IHRvIGFjdGl2ZT10cnVlIGZvciBsaXN0IHF1ZXJpZXMsIG5vdCBzaW5nbGUtZW50aXR5IGxvb2t1cHMgYnkgSURcbiAgLy8gKG90aGVyd2lzZSBmaW5kQnlJZCBvZiBhbiBpbmFjdGl2ZSBwb2xpY3kgcmV0dXJucyBub3RoaW5nKS5cbiAgYWN0aXZlRGVmYXVsdChjb25kaXRpb25zLCBzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5pc0FjdGl2ZSwgZmlsdGVyLmlzQWN0aXZlLCBmaWx0ZXIuaWQgIT09IHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2UgcnVsZSBxdWVyaWVzLlxuICpcbiAqIFZpc2liaWxpdHk6XG4gKiAtIFRoZSByZXF1ZXN0aW5nIG9yZydzIG93biBydWxlcyAoYW55IHNjb3BlKSwgQU5EXG4gKiAtIFRoZSBzeXN0ZW0gb3JnJ3MgcHVibGlzaGVkIHJ1bGVzIChzbyB0aGUgZ2xvYmFsIGNhdGFsb2cgaXMgYWx3YXlzIHZpc2libGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlUnVsZUNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlUnVsZUZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcmdJZCA9IG9yZ0lkLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRPcmdJZCA9PT0gU1lTVEVNX09SR19JRCkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgb3IoXG4gICAgICAgICAgZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLFxuICAgICAgICAgIGFuZChcbiAgICAgICAgICAgIGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5vcmdJZCwgU1lTVEVNX09SR19JRCksXG4gICAgICAgICAgICBlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuc2NvcGUsICdwdWJsaXNoZWQnIGFzIFJ1bGVTY29wZSksXG4gICAgICAgICAgKSEsXG4gICAgICAgICkhLFxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFpbC1jbG9zZWQ6IG5vIG9yZyBjb250ZXh0IOKHkiBubyByb3dzIChuZXZlciBsZWFrIGV2ZXJ5IHRlbmFudCdzIHJ1bGVzKS5cbiAgICBjb25kaXRpb25zLnB1c2goSU1QT1NTSUJMRSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWRFcXVhbHMoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlkLCBmaWx0ZXIuaWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5uYW1lLCBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyhub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm5hbWUpKX0lYCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5wb2xpY3lJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5wb2xpY3lJZCwgZmlsdGVyLnBvbGljeUlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS50YXJnZXQsIGZpbHRlci50YXJnZXQgYXMgUnVsZVRhcmdldCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zZXZlcml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zZXZlcml0eSwgZmlsdGVyLnNldmVyaXR5IGFzIFJ1bGVTZXZlcml0eSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zY29wZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zY29wZSwgZmlsdGVyLnNjb3BlIGFzIFJ1bGVTY29wZSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YWcgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEuY29tcGxpYW5jZVJ1bGUudGFncywgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci50YWcpKSk7XG4gIH1cblxuICAvLyBEZWZhdWx0IHRvIGFjdGl2ZT10cnVlIGZvciBsaXN0IHF1ZXJpZXMsIG5vdCBzaW5nbGUtZW50aXR5IGxvb2t1cHMgYnkgSUQuXG4gIGFjdGl2ZURlZmF1bHQoY29uZGl0aW9ucywgc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlzQWN0aXZlLCBmaWx0ZXIuaXNBY3RpdmUsIGZpbHRlci5pZCAhPT0gdW5kZWZpbmVkKTtcblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgYnJvd3NpbmcgdGhlIHB1Ymxpc2hlZCBydWxlcyBjYXRhbG9nLlxuICogT25seSByZXR1cm5zIHN5c3RlbS1vcmcgcHVibGlzaGVkIHJ1bGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQdWJsaXNoZWRSdWxlQ2F0YWxvZ0NvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlUnVsZUZpbHRlcj4sXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgLy8gT25seSBzY29wZT0ncHVibGlzaGVkJyBpcyBuZWVkZWQg4oCUIHRoZSBjcmVhdGUgZW5kcG9pbnQgYWxyZWFkeSBlbmZvcmNlc1xuICAvLyB0aGF0IG9ubHkgdGhlIHN5c3RlbSBvcmcgY2FuIGNyZWF0ZSBwdWJsaXNoZWQgcnVsZXMsIHNvIGZpbHRlcmluZyBieSBvcmdJZFxuICAvLyBpcyByZWR1bmRhbnQgYW5kIGJyZWFrcyB3aGVuIHRoZSBzeXN0ZW0gb3JnJ3MgREIgSUQgZGlmZmVycyBmcm9tIFNZU1RFTV9PUkdfSUQuXG4gIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuc2NvcGUsICdwdWJsaXNoZWQnIGFzIFJ1bGVTY29wZSkpO1xuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5uYW1lLCBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyhub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm5hbWUpKX0lYCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUudGFyZ2V0LCBmaWx0ZXIudGFyZ2V0IGFzIFJ1bGVUYXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc2V2ZXJpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuc2V2ZXJpdHksIGZpbHRlci5zZXZlcml0eSBhcyBSdWxlU2V2ZXJpdHkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24oc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnRhZ3MsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIudGFnKSkpO1xuICB9XG5cbiAgLy8gVGhlIGNhdGFsb2cgaXMgYWx3YXlzIGFjdGl2ZS1vbmx5IChubyBzaW5nbGUtaWQgZXhlbXB0aW9uIGhlcmUpLlxuICBhY3RpdmVEZWZhdWx0KGNvbmRpdGlvbnMsIHNjaGVtYS5jb21wbGlhbmNlUnVsZS5pc0FjdGl2ZSwgZmlsdGVyLmlzQWN0aXZlLCBmYWxzZSk7XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2UgZXhlbXB0aW9uIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VFeGVtcHRpb25Db25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZUV4ZW1wdGlvbkZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5vcmdJZCwgb3JnSWQudG9Mb3dlckNhc2UoKSkpO1xuICB9IGVsc2Uge1xuICAgIGNvbmRpdGlvbnMucHVzaChJTVBPU1NJQkxFKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIucnVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VFeGVtcHRpb24ucnVsZUlkLCBmaWx0ZXIucnVsZUlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmVudGl0eVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5lbnRpdHlUeXBlLCBmaWx0ZXIuZW50aXR5VHlwZSBhcyBSdWxlVGFyZ2V0KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmVudGl0eUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VFeGVtcHRpb24uZW50aXR5SWQsIGZpbHRlci5lbnRpdHlJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5zdGF0dXMsIGZpbHRlci5zdGF0dXMpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBjb21wbGlhbmNlIGF1ZGl0IGxvZyBxdWVyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlQXVkaXRDb25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZUF1ZGl0RmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cub3JnSWQsIG9yZ0lkLnRvTG93ZXJDYXNlKCkpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLnB1c2goSU1QT1NTSUJMRSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cudGFyZ2V0LCBmaWx0ZXIudGFyZ2V0IGFzIFJ1bGVUYXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuYWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5hY3Rpb24sIGZpbHRlci5hY3Rpb24pKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5yZXN1bHQsIGZpbHRlci5yZXN1bHQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc2NhbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5zY2FuSWQsIGZpbHRlci5zY2FuSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZGF0ZUZyb20gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChndGUoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5jcmVhdGVkQXQsIG5ldyBEYXRlKGZpbHRlci5kYXRlRnJvbSkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZGF0ZVRvICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2gobHRlKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cuY3JlYXRlZEF0LCBuZXcgRGF0ZShmaWx0ZXIuZGF0ZVRvKSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2Ugc2NhbiBxdWVyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlU2NhbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlU2NhbkZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVNjYW4ub3JnSWQsIG9yZ0lkLnRvTG93ZXJDYXNlKCkpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLnB1c2goSU1QT1NTSUJMRSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlU2Nhbi50YXJnZXQsIGZpbHRlci50YXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VTY2FuLnN0YXR1cywgZmlsdGVyLnN0YXR1cykpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50cmlnZ2VyZWRCeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlU2Nhbi50cmlnZ2VyZWRCeSwgZmlsdGVyLnRyaWdnZXJlZEJ5KSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cbiJdfQ==
|
|
580
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlcnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcXVlcnktYnVpbGRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFrQixNQUFNLDRCQUE0QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFHLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzFCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsa0JBQWtCLEdBQ25CLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVl4RixPQUFPLEVBQ0wsTUFBTSxHQU9QLE1BQU0sK0JBQStCLENBQUM7QUFFdkMsMEJBQTBCO0FBQzFCLE1BQU0sZUFBZSxHQUFHLElBQUkseUJBQXlCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZFLCtFQUErRTtBQUMvRSxnRkFBZ0Y7QUFDaEYsOERBQThEO0FBQzlELE1BQU0sYUFBYSxHQUFHLElBQUkseUJBQXlCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzdGLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUV2Rjs7Ozs7O0dBTUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxHQUFjLEVBQUUsRUFBcUI7SUFDckQsSUFBSSxLQUFLLENB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Q0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgU1lTVEVNX09SR19JRCwgdHlwZSBMaWZlY3ljbGUgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBhbmQsIGFzYywgZGVzYywgZXEsIGlsaWtlLCBpbkFycmF5LCBpc051bGwsIG5lLCBub3QsIG9yLCBndGUsIGx0ZSwgc3FsLCBTUUwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IEFueUNvbHVtbiB9IGZyb20gJ2RyaXp6bGUtb3JtL2NvbHVtbic7XG5pbXBvcnQge1xuICBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyLFxuICBidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbixcbiAgZXNjYXBlTGlrZVdpbGRjYXJkcyxcbiAgbm9ybWFsaXplU3RyaW5nRmlsdGVyLFxuICBwYXJzZUJvb2xlYW5GaWx0ZXIsXG59IGZyb20gJy4vYWNjZXNzLWNvbnRyb2wtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1ZlcnNpb25SYW5nZSwgc2VtdmVyT3JkZXJCeSwgdmVyc2lvblNwZWNDb25kaXRpb24gfSBmcm9tICcuL3NlbXZlci1yYW5nZS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE1lc3NhZ2VGaWx0ZXIsXG4gIFBpcGVsaW5lRmlsdGVyLFxuICBQaXBlbGluZVRlbXBsYXRlRmlsdGVyLFxuICBQbHVnaW5GaWx0ZXIsXG4gIENvbXBsaWFuY2VQb2xpY3lGaWx0ZXIsXG4gIENvbXBsaWFuY2VSdWxlRmlsdGVyLFxuICBDb21wbGlhbmNlRXhlbXB0aW9uRmlsdGVyLFxuICBDb21wbGlhbmNlQXVkaXRGaWx0ZXIsXG4gIENvbXBsaWFuY2VTY2FuRmlsdGVyLFxufSBmcm9tICcuLi9jb3JlL3F1ZXJ5LWZpbHRlcnMuanMnO1xuaW1wb3J0IHtcbiAgc2NoZW1hLFxuICB0eXBlIE1lc3NhZ2VQcmlvcml0eSxcbiAgdHlwZSBNZXNzYWdlVHlwZSxcbiAgdHlwZSBSdWxlVGFyZ2V0LFxuICB0eXBlIFJ1bGVTZXZlcml0eSxcbiAgdHlwZSBSdWxlU2NvcGUsXG4gIHR5cGUgUGx1Z2luTGlmZWN5Y2xlLFxufSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5cbi8vIFF1ZXJ5IGJ1aWxkZXIgaW5zdGFuY2VzXG5jb25zdCBwaXBlbGluZUJ1aWxkZXIgPSBuZXcgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlcihzY2hlbWEucGlwZWxpbmUpO1xuLy8gQSBzeXN0ZW0tb3JnIHBsdWdpbiByZWFjaGVzIG90aGVyIG9yZ3Mgb25seSBhcyBhbiBPZmZpY2lhbCBMSVNUSU5HLCByZXNvbHZlZFxuLy8gdGhyb3VnaCB0aGUgb3JnJ3MgKGV4cGxpY2l0IG9yIGltcGxpY2l0KSBpbnN0YWxsIOKAlCBzZWUgcGx1Z2luLXJlc29sdXRpb24udHMg4oCUXG4vLyBuZXZlciB0aHJvdWdoIGB2aXNpYmlsaXR5ID0gJ3B1YmxpYydgIG9uIGl0cyBgcGx1Z2luc2Agcm93LlxuY29uc3QgcGx1Z2luQnVpbGRlciA9IG5ldyBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyKHNjaGVtYS5wbHVnaW4sIHsgc3lzdGVtQ2F0YWxvZzogZmFsc2UgfSk7XG5jb25zdCBwaXBlbGluZVRlbXBsYXRlQnVpbGRlciA9IG5ldyBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyKHNjaGVtYS5waXBlbGluZVRlbXBsYXRlKTtcblxuLyoqXG4gKiBFcXVhbGl0eSBwcmVkaWNhdGUgZm9yIGEgZmlsdGVyJ3MgYGlkYCAoYSBzaW5nbGUgc3RyaW5nLCBvciB0aGUgZmlyc3QgaWQgb2YgYVxuICogbGlzdCkuIEFuIEVNUFRZIGxpc3QgY2FycmllcyBubyB2YWxpZCBpZCwgc28gaW5zdGVhZCBvZiBwcm9kdWNpbmcgYSBtYWxmb3JtZWRcbiAqIGBlcShjb2wsIHVuZGVmaW5lZClgICh3aGljaCBQb3N0Z3JlcyB3b3VsZCByZWplY3QgLyB0cmVhdCB1bnByZWRpY3RhYmx5KSBpdFxuICogeWllbGRzIHRoZSBmYWlsLWNsb3NlZCBJTVBPU1NJQkxFIHByZWRpY2F0ZSDigJQgYW4gZW1wdHkgaWQgZmlsdGVyIG1hdGNoZXMgbm9cbiAqIHJvd3MsIGNvbnNpc3RlbnQgd2l0aCBcIm5vIGlkIGdpdmVuIOKHkiBub3RoaW5nIHNlbGVjdGVkXCIuXG4gKi9cbmZ1bmN0aW9uIGlkRXF1YWxzKGNvbDogQW55Q29sdW1uLCBpZDogc3RyaW5nIHwgc3RyaW5nW10pOiBTUUwge1xuICBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICByZXR1cm4gaWQubGVuZ3RoID4gMCA/IGVxKGNvbCwgaWRbMF0pIDogSU1QT1NTSUJMRTtcbiAgfVxuICByZXR1cm4gZXEoY29sLCBpZCk7XG59XG5cbi8qKlxuICogUHVzaCB0aGUgc2hhcmVkIFwiaXNBY3RpdmVcIiBjb25kaXRpb246XG4gKiAtIGV4cGxpY2l0IGBpc0FjdGl2ZWAg4oaSIGBlcShjb2wsIGJvb2wpYDtcbiAqIC0gb3RoZXJ3aXNlIGRlZmF1bHQgdG8gYWN0aXZlLW9ubHksIEVYQ0VQVCBzaW5nbGUtZW50aXR5IGxvb2t1cHMgYnkgaWQgc28gYVxuICogICBgZmluZEJ5SWRgIG9mIGFuIGluYWN0aXZlIHJvdyBzdGlsbCByZXR1cm5zIGl0LiBQYXNzIGBoYXNJZD1mYWxzZWAgdG8gYWx3YXlzXG4gKiAgIGRlZmF1bHQgKGUuZy4gdGhlIHB1Ymxpc2hlZC1jYXRhbG9nIGJyb3dzZSwgd2hpY2ggbmV2ZXIga2V5cyBvZmYgaWQpLlxuICovXG5mdW5jdGlvbiBhY3RpdmVEZWZhdWx0KGNvbmRpdGlvbnM6IFNRTFtdLCBjb2w6IEFueUNvbHVtbiwgaXNBY3RpdmU6IHVua25vd24sIGhhc0lkOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChpc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKGNvbCwgcGFyc2VCb29sZWFuRmlsdGVyKGlzQWN0aXZlKSkpO1xuICB9IGVsc2UgaWYgKCFoYXNJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShjb2wsIHRydWUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEZhaWwtY2xvc2VkIG9yZyBndWFyZCBmb3IgY29tcGxpYW5jZSBidWlsZGVycyB3aG9zZSBvbmx5IHRlbmFuY3kgZ2F0ZSBpcyB0aGVcbiAqIGFwcC1sYXllciBgb3JnSWRgIHByZWRpY2F0ZS4gV2hlbiBgb3JnSWRgIGlzIGFic2VudCB3ZSBlbWl0IGFuIGltcG9zc2libGVcbiAqIHByZWRpY2F0ZSBzbyB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MgcmF0aGVyIHRoYW4gbGVha2luZyBhY3Jvc3MgdGVuYW50c1xuICogKG1pcnJvcnMgdGhlIGFub255bW91cyBmYWxsYmFjayBpbiBhY2Nlc3MtY29udHJvbC1idWlsZGVyLnRzKS5cbiAqL1xuY29uc3QgSU1QT1NTSUJMRTogU1FMID0gc3FsYGZhbHNlYDtcblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgcGlwZWxpbmUgcXVlcmllc1xuICpcbiAqIEFjY2VzcyBjb250cm9sIGlzIHRoZSBzaGFyZWQgdGhyZWUtcnVuZyBgdmlzaWJpbGl0eWAgbGFkZGVyIOKAlCBzZWVcbiAqIGBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyLmJ1aWxkQWNjZXNzQ29udHJvbGAgZm9yIHRoZSBmdWxsIHByZWRpY2F0ZS5cbiAqIGBwYXJlbnRPcmdJZGAgKG9yZyDihpIgdGVhbSBoaWVyYXJjaHkpIHdpZGVucyB0aGUgY2F0YWxvZyB2aWV3IHNvIGEgdGVhbSBvcmdcbiAqIGFsc28gc2VlcyBpdHMgcGFyZW50J3MgcHVibGljIHBpcGVsaW5lcy5cbiAqXG4gKiBAcGFyYW0gZmlsdGVyIC0gUGlwZWxpbmUgZmlsdGVyIGNyaXRlcmlhXG4gKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgYW5vbnltb3VzIGdldHMgc3lzdGVtIHB1YmxpYyBvbmx5KVxuICogQHBhcmFtIHBhcmVudE9yZ0lkIC0gUGFyZW50IG9yZyBJRCB3aGVuIHRoZSBjYWxsZXIgaXMgYSB0ZWFtIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBpcGVsaW5lQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPFBpcGVsaW5lRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4gIHBhcmVudE9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICAvLyBVc2UgZ2VuZXJpYyBidWlsZGVyIGZvciBjb21tb24gY29uZGl0aW9ucyAoYWNjZXNzIGNvbnRyb2wsIElELCBib29sZWFucywgdmlzaWJpbGl0eSlcbiAgY29uc3QgY29uZGl0aW9ucyA9IHBpcGVsaW5lQnVpbGRlci5idWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gIC8vIEV4cGxpY2l0IG93bmVyLW9yZyBuYXJyb3dpbmcsIGFzIHRoZSBwbHVnaW4gYW5kIHRlbXBsYXRlIGJ1aWxkZXJzIGFscmVhZHlcbiAgLy8gZG8uIFRoZSBzY2hlbWEgYWNjZXB0cyBgP29yZ0lkPWAgZm9yIHBpcGVsaW5lcyB0b28sIGJ1dCB0aGlzIGJ1aWxkZXIgZHJvcHBlZFxuICAvLyBpdCwgc28gdGhlIGZpbHRlciBzaWxlbnRseSBkaWQgbm90aGluZy4gSXQgaXMgQU5EJ2Qgb250byB0aGUgYWNjZXNzXG4gIC8vIHByZWRpY2F0ZSBhYm92ZSwgc28gaXQgY2FuIG9ubHkgTkFSUk9XIHRoZSB2aXNpYmxlIHNldCwgbmV2ZXIgd2lkZW4gaXQuXG4gIGlmIChmaWx0ZXIub3JnSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUub3JnSWQsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIub3JnSWQpKSk7XG4gIH1cblxuICAvLyBBZGQgcGlwZWxpbmUtc3BlY2lmaWMgZmlsdGVyc1xuICBpZiAoZmlsdGVyLnByb2plY3QgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUucHJvamVjdCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5wcm9qZWN0KSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5vcmdhbml6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUub3JnYW5pemF0aW9uLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm9yZ2FuaXphdGlvbikpKTtcbiAgfVxuXG4gIC8vIEV4YWN0LW1hdGNoIG5hbWUgZmlsdGVyIChtaXJyb3JzIHRoZSBzaWJsaW5nIGBwcm9qZWN0YC9gb3JnYW5pemF0aW9uYFxuICAvLyBwcmVkaWNhdGVzKS4gVGhlIENMSSdzIGAtLXBpcGVsaW5lLW5hbWVgIGlzIGRvY3VtZW50ZWQgYXMgYW4gZXhhY3QgZmlsdGVyLFxuICAvLyBzbyB0aGlzIHVzZXMgYGVxYCByYXRoZXIgdGhhbiBhbiBJTElLRSBjb250YWlucy4gTnVsbC1zYWZlOiBhYnNlbnRcbiAgLy8gcGlwZWxpbmVOYW1lIOKHkiBubyBwcmVkaWNhdGUuXG4gIGlmIChmaWx0ZXIucGlwZWxpbmVOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lLnBpcGVsaW5lTmFtZSwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5waXBlbGluZU5hbWUpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmtleXdvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEucGlwZWxpbmUua2V5d29yZHMsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIua2V5d29yZCkpKTtcbiAgfVxuXG4gIC8vIERldmVsb3Blci1wb3J0YWwgY2F0YWxvZyBmaWx0ZXJzIChvd25lciAvIGxpZmVjeWNsZSkuXG4gIGlmIChmaWx0ZXIub3duZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZS5vd25lcklkLCBmaWx0ZXIub3duZXJJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5saWZlY3ljbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUubGlmZWN5Y2xlLCBmaWx0ZXIubGlmZWN5Y2xlIGFzIExpZmVjeWNsZSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogVEhFIHJhbmtpbmcgZm9yIHJlc29sdmluZyBvbmUgcGx1Z2luIFJPVyBieSBuYW1lIChgL3BsdWdpbnMvbG9va3VwYCxcbiAqIGAvcGx1Z2lucy9maW5kYCwgdGhlIHBpcGVsaW5lIHNlcnZpY2UncyBjb250cmFjdCBjaGVjaykg4oCUIG9uZSBkZWZpbml0aW9uIHNvXG4gKiBzeW50aCBhbmQgdGhlIGNvbnRyYWN0IGNoZWNrIG5ldmVyIHBpY2sgZGlmZmVyZW50IHdpbm5lcnMuIFJvd3MgYXJlIG9ubHkgdGhlXG4gKiBvcmcncyBvd24gYW5kIGl0cyBwYXJlbnQnczogdGhlIE9mZmljaWFsIGNhdGFsb2cgYW5kIGV2ZXJ5IG90aGVyIHB1Ymxpc2hlclxuICogcmVzb2x2ZSBhcyBMSVNUSU5HUyBhZnRlcndhcmRzIChwbHVnaW4tcmVzb2x1dGlvbi50cykuXG4gKiAgIDEuIG93bmVyIOKAlCB0aGUgY2FsbGVyJ3Mgb3duIG9yZywgdGhlbiBpdHMgcGFyZW50IG9yZyAoYSB0ZWFtIHJlYWRzIHRoZVxuICogICAgICBwYXJlbnQncyBzaGFyZWQgcm93cyksIHRoZW4gYW55dGhpbmcgZWxzZSBhIHN1cGVyYWRtaW4gY2FuIHNlZTtcbiAqICAgMi4gdGhlIGRlZmF1bHQgdmVyc2lvbjtcbiAqICAgMy4gdGhlIGhpZ2hlc3Qgc2VtdmVyIChzbyBgXjEuMmAgcmVzb2x2ZXMgdG8gdGhlIG5ld2VzdCBtYXRjaGluZyByZWxlYXNlKTtcbiAqICAgNC4gYGlkYCwgYSB0b3RhbCB0aWVicmVhay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpblJlc29sdXRpb25PcmRlckJ5KG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgY29uc3Qgb3duZXJSYW5rID0gb3JnSWRcbiAgICA/IHBhcmVudE9yZ0lkXG4gICAgICA/IHNxbGBDQVNFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gV0hFTiAke29yZ0lkfSBUSEVOIDAgV0hFTiAke3BhcmVudE9yZ0lkfSBUSEVOIDEgRUxTRSAyIEVORGBcbiAgICAgIDogc3FsYENBU0UgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSBXSEVOICR7b3JnSWR9IFRIRU4gMCBFTFNFIDIgRU5EYFxuICAgIDogbnVsbDtcbiAgcmV0dXJuIFtcbiAgICAuLi4ob3duZXJSYW5rID8gW293bmVyUmFua10gOiBbXSksXG4gICAgZGVzYyhzY2hlbWEucGx1Z2luLmlzRGVmYXVsdCksXG4gICAgLi4uc2VtdmVyT3JkZXJCeShzY2hlbWEucGx1Z2luLnZlcnNpb24pLFxuICAgIGFzYyhzY2hlbWEucGx1Z2luLmlkKSxcbiAgXTtcbn1cblxuLyoqIEEgcGx1Z2luIHZlcnNpb24gdGhhdCBoYXMgbm90IGJlZW4geWFua2VkICh0aW1lc3RhbXAgYW5kIGxpZmVjeWNsZSBhZ3JlZSkuICovXG5mdW5jdGlvbiBub3RZYW5rZWQoKTogU1FMW10ge1xuICByZXR1cm4gW2lzTnVsbChzY2hlbWEucGx1Z2luLnlhbmtlZEF0KSwgc3FsYCR7c2NoZW1hLnBsdWdpbi5saWZlY3ljbGV9IDw+ICd5YW5rZWQnYF07XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIHBsdWdpbiBxdWVyaWVzXG4gKlxuICogQWNjZXNzIGNvbnRyb2wgaXMgdGhlIHNoYXJlZCB0aHJlZS1ydW5nIGB2aXNpYmlsaXR5YCBsYWRkZXIg4oCUIHNlZVxuICogYEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXIuYnVpbGRBY2Nlc3NDb250cm9sYC5cbiAqXG4gKiBAcGFyYW0gZmlsdGVyIC0gUGx1Z2luIGZpbHRlciBjcml0ZXJpYVxuICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIGFub255bW91cyBnZXRzIHN5c3RlbSBwdWJsaWMgb25seSlcbiAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsdWdpbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxQbHVnaW5GaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbiAgcGFyZW50T3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIC8vIFVzZSBnZW5lcmljIGJ1aWxkZXIgZm9yIGNvbW1vbiBjb25kaXRpb25zIChhY2Nlc3MgY29udHJvbCwgSUQsIGJvb2xlYW5zLCB2aXNpYmlsaXR5KVxuICBjb25zdCBjb25kaXRpb25zID0gcGx1Z2luQnVpbGRlci5idWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gIC8vIEFkZCBwbHVnaW4tc3BlY2lmaWMgZmlsdGVyc1xuICBpZiAoZmlsdGVyLm9yZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi5vcmdJZCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5vcmdJZCkpKTtcbiAgfVxuXG4gIC8vIFN1YnN0cmluZyBzZWFyY2ggZm9yIHRoZSBsaXN0IC8gc2VhcmNoIFVJOyBFWEFDVCBmb3IgcmVzb2x1dGlvbiAodGhlXG4gIC8vIGxvb2t1cCBwYXRoIHNldHMgYG5hbWVNYXRjaDogJ2V4YWN0J2ApIHNvIGB0cml2eWAgbmV2ZXIgcmVzb2x2ZXMgdG9cbiAgLy8gYHRyaXZ5LXNjYW5gIG9yIGFub3RoZXIgb3JnJ3MgYG15LXRyaXZ5YC5cbiAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBuYW1lID0gbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5uYW1lKTtcbiAgICBjb25kaXRpb25zLnB1c2goZmlsdGVyLm5hbWVNYXRjaCA9PT0gJ2V4YWN0J1xuICAgICAgPyBlcShzY2hlbWEucGx1Z2luLm5hbWUsIG5hbWUpXG4gICAgICA6IGlsaWtlKHNjaGVtYS5wbHVnaW4ubmFtZSwgYCUke2VzY2FwZUxpa2VXaWxkY2FyZHMobmFtZSl9JWApKTtcbiAgfVxuXG4gIC8vIEV4YWN0IHZlcnNpb24sIG9yIGEgc2VtdmVyIHJhbmdlIC8gYGxhdGVzdGAgKHNlZSBzZW12ZXItcmFuZ2UudHMpLiBBIHJhbmdlXG4gIC8vIG5ldmVyIHJlc29sdmVzIHRvIGEgeWFua2VkIHZlcnNpb246IHlhbmsgc3RvcHMgYSB2ZXJzaW9uIHJlc29sdmluZyBmb3JcbiAgLy8gbmV3IHN5bnRocywgd2hpbGUgYW4gZXhhY3QgcGluIHN0aWxsIGZpbmRzIGl0IChzbyB0aGUgY2FsbGVyIGNhbiBleHBsYWluKS5cbiAgaWYgKGZpbHRlci52ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBzcGVjID0gZmlsdGVyLnZlcnNpb24gYXMgc3RyaW5nO1xuICAgIGNvbmRpdGlvbnMucHVzaCh2ZXJzaW9uU3BlY0NvbmRpdGlvbihzY2hlbWEucGx1Z2luLnZlcnNpb24sIHNwZWMpKTtcbiAgICBpZiAoaXNWZXJzaW9uUmFuZ2Uoc3BlYykpIGNvbmRpdGlvbnMucHVzaCguLi5ub3RZYW5rZWQoKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmV4Y2x1ZGVZYW5rZWQgPT09IHRydWUpIHtcbiAgICBjb25kaXRpb25zLnB1c2goLi4ubm90WWFua2VkKCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5leGNsdWRlU2NhbkZsYWdnZWQgPT09IHRydWUpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaXNOdWxsKHNjaGVtYS5wbHVnaW4uc2NhbkZsYWdnZWRBdCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5rZXl3b3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24oc2NoZW1hLnBsdWdpbi5rZXl3b3Jkcywgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5rZXl3b3JkKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5jYXRlZ29yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5wbHVnaW4uY2F0ZWdvcnksIGZpbHRlci5jYXRlZ29yeSBhcyBzdHJpbmcpKTtcbiAgfVxuXG4gIC8vIERldmVsb3Blci1wb3J0YWwgY2F0YWxvZyBmaWx0ZXJzIChvd25lciAvIGxpZmVjeWNsZSkuXG4gIGlmIChmaWx0ZXIub3duZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5wbHVnaW4ub3duZXJJZCwgZmlsdGVyLm93bmVySWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubGlmZWN5Y2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi5saWZlY3ljbGUsIGZpbHRlci5saWZlY3ljbGUgYXMgUGx1Z2luTGlmZWN5Y2xlKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgcGlwZWxpbmUtdGVtcGxhdGUgcXVlcmllcy5cbiAqXG4gKiBUZW1wbGF0ZXMgd2VyZSBicmllZmx5IHRoZSBvbmx5IGVudGl0eSBvbiB0aGUgdGhyZWUtcnVuZyBsYWRkZXIgYW5kIG5lZWRlZCBhXG4gKiBiZXNwb2tlIHByZWRpY2F0ZTsgbm93IHRoYXQgZXZlcnkgY2F0YWxvZyBlbnRpdHkgc2hhcmVzIGl0LCB0aGV5IGFyZSBiYWNrIG9uXG4gKiB0aGUgU0FNRSBgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlcmAgYXMgcGlwZWxpbmVzIGFuZCBwbHVnaW5zLiBWaXNpYmlsaXR5XG4gKiBzZW1hbnRpY3MgbGl2ZSBpbiBvbmUgcGxhY2Ug4oCUIHNlZSBgYnVpbGRBY2Nlc3NDb250cm9sYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGlwZWxpbmVUZW1wbGF0ZUNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxQaXBlbGluZVRlbXBsYXRlRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4gIHBhcmVudE9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zID0gcGlwZWxpbmVUZW1wbGF0ZUJ1aWxkZXIuYnVpbGRDb21tb25Db25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAvLyBPcHRpb25hbCBuYXJyb3dpbmcgdG8gYSBzcGVjaWZpYyBvcmcgd2l0aGluIHRoZSBjYWxsZXIncyB2aXNpYmlsaXR5IChtaXJyb3JzXG4gIC8vIHRoZSBwbHVnaW4gYnVpbGRlcikuIEFjY2VzcyBjb250cm9sIGFib3ZlIHN0aWxsIGJvdW5kcyB3aGF0J3MgdmlzaWJsZS5cbiAgaWYgKGZpbHRlci5vcmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZVRlbXBsYXRlLm9yZ0lkLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm9yZ0lkIGFzIHN0cmluZykpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5waXBlbGluZVRlbXBsYXRlLm5hbWUsIGAlJHtlc2NhcGVMaWtlV2lsZGNhcmRzKG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIubmFtZSkpfSVgKSk7XG4gIH1cblxuICAvLyBWZXJiYXRpbSBtYXRjaCwgY29uc2lzdGVudCB3aXRoIHRoZSBwbHVnaW4gYnVpbGRlciAoY2F0ZWdvcmllcyBhcmUgc3RvcmVkIGFzLWlzKS5cbiAgaWYgKGZpbHRlci5jYXRlZ29yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZVRlbXBsYXRlLmNhdGVnb3J5LCBmaWx0ZXIuY2F0ZWdvcnkgYXMgc3RyaW5nKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmtleXdvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEucGlwZWxpbmVUZW1wbGF0ZS5rZXl3b3Jkcywgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5rZXl3b3JkKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5vd25lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lVGVtcGxhdGUub3duZXJJZCwgZmlsdGVyLm93bmVySWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubGlmZWN5Y2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lVGVtcGxhdGUubGlmZWN5Y2xlLCBmaWx0ZXIubGlmZWN5Y2xlIGFzIExpZmVjeWNsZSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIG1lc3NhZ2UgcXVlcmllcy5cbiAqXG4gKiBDdXN0b20gYWNjZXNzIGNvbnRyb2wgZm9yIG1lc3NhZ2VzOlxuICogLSBNZXNzYWdlcyBhcmUgdmlzaWJsZSB0byB0aGUgc2VuZGVyIG9yZyAob3JnSWQpIE9SIHRoZSByZWNpcGllbnQgb3JnIChyZWNpcGllbnRPcmdJZClcbiAqIC0gQnJvYWRjYXN0IGFubm91bmNlbWVudHMgKHJlY2lwaWVudE9yZ0lkID0gJyonKSBhcmUgdmlzaWJsZSB0byBhbGwgb3Jnc1xuICogLSBTeXN0ZW0gb3JnIGNhbiBzZWUgYWxsIG1lc3NhZ2VzXG4gKlxuICogQHBhcmFtIGZpbHRlciAtIE1lc3NhZ2UgZmlsdGVyIGNyaXRlcmlhXG4gKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEXG4gKiBAcmV0dXJucyBBcnJheSBvZiBTUUwgY29uZGl0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRNZXNzYWdlQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPE1lc3NhZ2VGaWx0ZXI+LFxuICBvcmdJZDogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuICBjb25zdCBub3JtYWxpemVkT3JnSWQgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIEN1c3RvbSBhY2Nlc3MgY29udHJvbDogc2VuZGVyIE9SIHJlY2lwaWVudCBPUiBicm9hZGNhc3QuXG4gIC8vXG4gIC8vIFBlci11c2VyIHRhcmdldGluZzogYSByb3cgd2l0aCBgcmVjaXBpZW50X3VzZXJfaWRgIHNldCBpcyBwcml2YXRlIHRvIHRoYXRcbiAgLy8gdXNlciBXSVRISU4gdGhlIHJlY2lwaWVudCBvcmcuIFRoZSByZWNpcGllbnQtc2lkZSBicmFuY2ggdGhlcmVmb3JlIGFkbWl0cyBhXG4gIC8vIHRhcmdldGVkIHJvdyBvbmx5IHdoZW4gdGhlIHZpZXdlciBJUyB0aGF0IHVzZXIgKGBmaWx0ZXIudmlld2VyVXNlcklkYCk7XG4gIC8vIG9yZy13aWRlIHJvd3MgKHJlY2lwaWVudF91c2VyX2lkIElTIE5VTEwpIHN0YXkgdmlzaWJsZSB0byBldmVyeW9uZSBpbiB0aGVcbiAgLy8gb3JnLiBBYnNlbnQgYSB2aWV3ZXIgaWQsIHRoZSByZWNpcGllbnQgc2lkZSBzZWVzIG9yZy13aWRlIHJvd3Mgb25seSwgc28gYVxuICAvLyB0YXJnZXRlZCBtZXNzYWdlIG5ldmVyIGxlYWtzIHRvIG90aGVyIG1lbWJlcnMgKGl0IHN0YXlzIHZpc2libGUgdG8gaXRzXG4gIC8vIHRhcmdldCwgdGhlIHNlbmRlciBvcmcsIGFuZCB0aGUgc3lzdGVtIG9yZykuIFRoZSBTRU5ERVIgYnJhbmNoIHNob3dzIHdoYXRcbiAgLy8geW91ciBvcmcgc2VudCDigJQgZXhjZXB0IGEgcmVwbHkgeW91ciBvcmcncyBUQVJHRVRFRCB1c2VyIHdyb3RlIGluc2lkZSB0aGVpclxuICAvLyBwcml2YXRlIHRocmVhZCwgd2hpY2ggc3RheXMgcHJpdmF0ZSB0byB0aGVtIChzZWUgYHNlbmRlclZpc2libGVgKS5cbiAgaWYgKG5vcm1hbGl6ZWRPcmdJZCA9PT0gU1lTVEVNX09SR19JRCkge1xuICAgIC8vIFN5c3RlbSBvcmcgY2FuIHNlZSBhbGwgbWVzc2FnZXNcbiAgfSBlbHNlIHtcbiAgICBjb25zdCByZWNpcGllbnRWaXNpYmxlID0gZmlsdGVyLnZpZXdlclVzZXJJZFxuICAgICAgPyBvcihcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudFVzZXJJZCksXG4gICAgICAgIGVxKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudFVzZXJJZCwgZmlsdGVyLnZpZXdlclVzZXJJZCksXG4gICAgICApIVxuICAgICAgOiBpc051bGwoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50VXNlcklkKTtcbiAgICAvLyBTZW5kZXIgc2lkZSBvZiBhIFBSSVZBVEUgdGhyZWFkOiBhIHJlcGx5IGF1dGhvcmVkIGJ5IHRoZSBvcmcgdGhhdCBob2xkcyBhXG4gICAgLy8gdXNlci10YXJnZXRlZCByb290ICh0aGUgdGFyZ2V0ZWQgdXNlciBhbnN3ZXJpbmcpIGNhcnJpZXMgYG9yZ19pZGAgPSB0aGF0XG4gICAgLy8gb3JnLCBzbyB0aGUgdW5jb25kaXRpb25hbCBzZW5kZXIgYnJhbmNoIHNob3dlZCB0aGUgcHJpdmF0ZSBleGNoYW5nZSB0b1xuICAgIC8vIGV2ZXJ5IG9uZSBvZiBpdHMgbWVtYmVycy4gU3VjaCBhIHJlcGx5IGlzIHZpc2libGUgb24gaXRzIG93biBvcmcncyBzaWRlXG4gICAgLy8gb25seSB0byB0aGUgcm9vdCdzIHRhcmdldCB1c2VyOyB3aXRoIG5vIHZpZXdlciBpdCBpcyBoaWRkZW4gKGZhaWwtY2xvc2VkKS5cbiAgICAvLyBFdmVyeSBvdGhlciByb3cgKHJvb3RzLCByZXBsaWVzIGluIHVudGFyZ2V0ZWQgdGhyZWFkcywgcmVwbGllcyBpbiBhIHRocmVhZFxuICAgIC8vIHRhcmdldGVkIGF0IFNPTUVPTkUgRUxTRSdzIG9yZykga2VlcHMgdGhlIHVuY29uZGl0aW9uYWwgc2VuZGVyIHZpZXcuXG4gICAgY29uc3QgcHJpdmF0ZVJvb3RGb3JPdGhlclZpZXdlciA9IGZpbHRlci52aWV3ZXJVc2VySWRcbiAgICAgID8gc3FsYHJvb3QucmVjaXBpZW50X3VzZXJfaWQgSVMgTk9UIE5VTEwgQU5EIHJvb3QucmVjaXBpZW50X3VzZXJfaWQgPD4gJHtmaWx0ZXIudmlld2VyVXNlcklkfWBcbiAgICAgIDogc3FsYHJvb3QucmVjaXBpZW50X3VzZXJfaWQgSVMgTk9UIE5VTExgO1xuICAgIGNvbnN0IHNlbmRlclZpc2libGUgPSBvcihcbiAgICAgIGlzTnVsbChzY2hlbWEubWVzc2FnZS50aHJlYWRJZCksXG4gICAgICBzcWxgTk9UIEVYSVNUUyAoXG4gICAgICAgIFNFTEVDVCAxIEZST00gJHtzY2hlbWEubWVzc2FnZX0gQVMgcm9vdFxuICAgICAgICBXSEVSRSByb290LmlkID0gJHtzY2hlbWEubWVzc2FnZS50aHJlYWRJZH1cbiAgICAgICAgICBBTkQgbG93ZXIocm9vdC5yZWNpcGllbnRfb3JnX2lkKSA9ICR7bm9ybWFsaXplZE9yZ0lkfVxuICAgICAgICAgIEFORCAke3ByaXZhdGVSb290Rm9yT3RoZXJWaWV3ZXJ9XG4gICAgICApYCxcbiAgICApITtcbiAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICBvcihcbiAgICAgICAgYW5kKGVxKHNjaGVtYS5tZXNzYWdlLm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLCBzZW5kZXJWaXNpYmxlKSEsXG4gICAgICAgIGFuZChlcShzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRPcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSwgcmVjaXBpZW50VmlzaWJsZSkhLFxuICAgICAgICAvLyBCcm9hZGNhc3QgKGFubm91bmNlbWVudHMpLiBTZWxmLWRlZmVuZGluZzogb25seSBldmVyIG9yZy13aWRlIHJvd3Mg4oCUXG4gICAgICAgIC8vIGEgbWlzLWNyZWF0ZWQgJyonICsgcGVyLXVzZXIgcm93IGNhbid0IGxlYWsgdG8gZXZlcnkgb3JnLlxuICAgICAgICBhbmQoZXEoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50T3JnSWQsICcqJyksIGlzTnVsbChzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRVc2VySWQpKSEsXG4gICAgICApISxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVtb3ZlZCBmcm9tIFRISVMgb3JnJ3MgaW5ib3guIEFwcGxpZXMgdG8gdGhlIHN5c3RlbSBvcmcgdG9vIOKAlCBcInNlZXMgYWxsXCJcbiAgLy8gaXMgYWJvdXQgdGVuYW5jeSwgbm90IGFib3V0IGEgcm93IHNvbWVib2R5IGhlcmUgY2hvc2UgdG8gY2xlYXIuXG4gIC8vXG4gIC8vIEl0IGxpdmVzIGluIHRoaXMgc2hhcmVkIGJ1aWxkZXIgb24gcHVycG9zZTogYGdldFVucmVhZENvdW50YCBjb21wb3NlcyB0aGVcbiAgLy8gc2FtZSBjb25kaXRpb25zIHNvIHRoZSBiYWRnZSBjYW5ub3QgZGl2ZXJnZSBmcm9tIHRoZSBpbmJveCwgYW5kIGEgaGlkZGVuXG4gIC8vIHVucmVhZCBtZXNzYWdlIHdvdWxkIG90aGVyd2lzZSBsZWF2ZSBhIGNvdW50IHRoZSB1c2VyIGhhcyBubyB3YXkgdG8gY2xlYXIuXG4gIC8vXG4gIC8vIGBjb2FsZXNjZWAgZm9yIHRoZSBzYW1lIHJlYXNvbiBgcmVhZEJ5YCBuZWVkcyBpdDogYE5VTEwgPyBvcmdgIGlzIE5VTEwsIGFuZFxuICAvLyBgTk9UIE5VTExgIGlzIE5VTEwsIHdoaWNoIGRyb3BzIHRoZSByb3cgaW5zdGVhZCBvZiBrZWVwaW5nIGl0LlxuICAvL1xuICAvLyBQZXIgTUVTU0FHRSwgbm90IHBlciB0aHJlYWQsIHdoaWNoIGlzIHdoYXQgbWFrZXMgaXQgc2VsZi1jb3JyZWN0aW5nOiBhXG4gIC8vIGxhdGVyIHJlcGx5IGlzIGEgbmV3IHJvdyB3aXRoIGFuIGVtcHR5IG1hcCwgc28gY2xlYXJpbmcgYSBjb252ZXJzYXRpb25cbiAgLy8gdG9kYXkgbmV2ZXIgYnVyaWVzIHRoZSBhbnN3ZXIgdGhhdCBhcnJpdmVzIHRvbW9ycm93LlxuICAvL1xuICAvLyBgaGlkZGVuOiB0cnVlYCBmbGlwcyBpdCB0byBPTkxZIHRoZSByb3dzIHRoaXMgb3JnIHJlbW92ZWQgKHRoZSBcIlJlbW92ZWRcIlxuICAvLyB2aWV3IC8gdW5oaWRlIHNjb3BlKSDigJQgc3RpbGwgaW5zaWRlIHRoZSBzYW1lIHZpc2liaWxpdHkgYnJhbmNoIGFib3ZlLlxuICBjb25zdCBoaWRkZW5IZXJlID0gc3FsYChjb2FsZXNjZSgke3NjaGVtYS5tZXNzYWdlLmhpZGRlbkJ5fSwgJ3t9Jzo6anNvbmIpID8gJHtub3JtYWxpemVkT3JnSWR9KWA7XG4gIGNvbmRpdGlvbnMucHVzaChmaWx0ZXIuaGlkZGVuID8gaGlkZGVuSGVyZSA6IHNxbGBub3QgJHtoaWRkZW5IZXJlfWApO1xuXG4gIC8vIEFjdGl2ZSBmaWx0ZXIgKGRlZmF1bHQgdG8gYWN0aXZlIG9ubHkpXG4gIGlmIChmaWx0ZXIuaXNBY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5pc0FjdGl2ZSwgcGFyc2VCb29sZWFuRmlsdGVyKGZpbHRlci5pc0FjdGl2ZSkpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UuaXNBY3RpdmUsIHRydWUpKTtcbiAgfVxuXG4gIC8vIFRocmVhZCBmaWx0ZXIgKG51bGwgPSByb290IG1lc3NhZ2VzIG9ubHkgdmlhIElTIE5VTEwpXG4gIGlmIChmaWx0ZXIudGhyZWFkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChmaWx0ZXIudGhyZWFkSWQgPT09IG51bGwpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChpc051bGwoc2NoZW1hLm1lc3NhZ2UudGhyZWFkSWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLnRocmVhZElkLCBmaWx0ZXIudGhyZWFkSWQpKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWNpcGllbnQgb3JnIGZpbHRlclxuICBpZiAoZmlsdGVyLnJlY2lwaWVudE9yZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50T3JnSWQsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIucmVjaXBpZW50T3JnSWQpKSk7XG4gIH1cblxuICAvLyBSZWNpcGllbnQgdXNlciBmaWx0ZXIgKGV4cGxpY2l0KTogbnVsbCDihpIgb3JnLXdpZGUgcm93cyBvbmx5OyBhIHZhbHVlIOKGklxuICAvLyByb3dzIHRhcmdldGVkIGF0IHRoYXQgdXNlci4gRGlzdGluY3QgZnJvbSBgdmlld2VyVXNlcklkYCwgd2hpY2ggd2lkZW5zXG4gIC8vIHZpc2liaWxpdHkgcmF0aGVyIHRoYW4gbmFycm93aW5nIGl0LlxuICBpZiAoZmlsdGVyLnJlY2lwaWVudFVzZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGZpbHRlci5yZWNpcGllbnRVc2VySWQgPT09IG51bGwpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChpc051bGwoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50VXNlcklkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbXBhcmUgdGhlIHJhdyB1c2VyIGlkIOKAlCBjYXNlLXByZXNlcnZpbmcsIG1hdGNoaW5nIGhvdyBpdCdzIHN0b3JlZCBhbmRcbiAgICAgIC8vIGhvdyBgdmlld2VyVXNlcklkYCBpcyBjb21wYXJlZCAoZG8gTk9UIGxvd2VyY2FzZSB2aWEgbm9ybWFsaXplU3RyaW5nRmlsdGVyKS5cbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRVc2VySWQsIGZpbHRlci5yZWNpcGllbnRVc2VySWQpKTtcbiAgICB9XG4gIH1cblxuICAvLyBNZXNzYWdlIHR5cGUgZmlsdGVyXG4gIGlmIChmaWx0ZXIubWVzc2FnZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5tZXNzYWdlVHlwZSwgZmlsdGVyLm1lc3NhZ2VUeXBlIGFzIE1lc3NhZ2VUeXBlKSk7XG4gIH1cblxuICAvLyBQcmlvcml0eSBmaWx0ZXJcbiAgaWYgKGZpbHRlci5wcmlvcml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLnByaW9yaXR5LCBmaWx0ZXIucHJpb3JpdHkgYXMgTWVzc2FnZVByaW9yaXR5KSk7XG4gIH1cblxuICAvLyBDaGFubmVsIGZpbHRlciAobnVsbCA9IG5vIGNoYW5uZWwgLyBvcmctdG8tb3JnIG1lc3NhZ2VzKVxuICBpZiAoZmlsdGVyLmNoYW5uZWwgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChmaWx0ZXIuY2hhbm5lbCA9PT0gbnVsbCkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGlzTnVsbChzY2hlbWEubWVzc2FnZS5jaGFubmVsKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5jaGFubmVsLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLmNoYW5uZWwpKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVhZC1zdGF0ZSBmaWx0ZXIg4oCUIEpTT05CIGtleS1leGlzdGVuY2UgY2hlY2sgYWdhaW5zdCBgcmVhZF9ieWAuXG4gIC8vIFdlIHVzZSBqc29uYl9leGlzdHMocmVhZF9ieSwgJG9yZ0lkKSByYXRoZXIgdGhhbiB0aGUgYD9gIG9wZXJhdG9yXG4gIC8vIGJlY2F1c2UgcG9zdGdyZXMtanMgLyBkcml6emxlJ3MgcGFyYW1ldGVyIGJpbmRpbmcgdHJlYXRzIGA/YCBhcyBhXG4gIC8vIHBsYWNlaG9sZGVyLCB3aGljaCB3b3VsZCBjb25mbGljdCB3aXRoIHRoZSBKU09OQiBgP2Agb3BlcmF0b3IuXG4gIGlmIChmaWx0ZXIuaXNSZWFkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBrZXlFeGlzdHMgPSBzcWxganNvbmJfZXhpc3RzKCR7c2NoZW1hLm1lc3NhZ2UucmVhZEJ5fSwgJHtub3JtYWxpemVkT3JnSWR9KWA7XG4gICAgY29uZGl0aW9ucy5wdXNoKGZpbHRlci5pc1JlYWQgPyBrZXlFeGlzdHMgOiBub3Qoa2V5RXhpc3RzKSk7XG4gIH1cblxuICAvLyBJRCBmaWx0ZXJcbiAgaWYgKGZpbHRlci5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlkRXF1YWxzKHNjaGVtYS5tZXNzYWdlLmlkLCBmaWx0ZXIuaWQpKTtcbiAgfVxuXG4gIC8vIEV4cGxpY2l0IHNlbGVjdGlvbi4gQW4gRU1QVFkgbGlzdCBtYXRjaGVzIG5vdGhpbmcgKG5ldmVyIFwibm8gZmlsdGVyXCIpLCBzbyBhXG4gIC8vIGNhbGxlciB0aGF0IGxvc3QgaXRzIHNlbGVjdGlvbiBjYW4ndCB0dXJuIGEgYnVsayBhY3Rpb24gaW50byBcImV2ZXJ5dGhpbmdcIi5cbiAgaWYgKGZpbHRlci5pZHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChmaWx0ZXIuaWRzLmxlbmd0aCA+IDAgPyBpbkFycmF5KHNjaGVtYS5tZXNzYWdlLmlkLCBbLi4uZmlsdGVyLmlkc10pIDogSU1QT1NTSUJMRSk7XG4gIH1cblxuICAvLyBTZW5kZXIsIHJlbGF0aXZlIHRvIHRoZSB2aWV3ZXIuIGBvcmdfaWRgIGlzIHN0b3JlZCBsb3dlcmNhc2UgKHNlZSB0aGVcbiAgLy8gdmlzaWJpbGl0eSBicmFuY2ggYWJvdmUpLCBgY3JlYXRlZF9ieWAgaXMgdGhlIHJhdyB1c2VyIGlkLlxuICBpZiAoZmlsdGVyLnNlbnRCeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGZpbHRlci5zZW50QnkgPT09ICdtZScpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChmaWx0ZXIudmlld2VyVXNlcklkID8gZXEoc2NoZW1hLm1lc3NhZ2UuY3JlYXRlZEJ5LCBmaWx0ZXIudmlld2VyVXNlcklkKSA6IElNUE9TU0lCTEUpO1xuICAgIH0gZWxzZSBpZiAoZmlsdGVyLnNlbnRCeSA9PT0gJ29yZycpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChuZShzY2hlbWEubWVzc2FnZS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQSBzcGVjaWZpYyBhdXRob3IuIFJhdyB1c2VyIGlkLCBjYXNlLXByZXNlcnZpbmcgKGxpa2UgYHZpZXdlclVzZXJJZGApLlxuICBpZiAoZmlsdGVyLnNlbmRlclVzZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLmNyZWF0ZWRCeSwgZmlsdGVyLnNlbmRlclVzZXJJZCkpO1xuICB9XG5cbiAgLy8gQSBzcGVjaWZpYyBjb3VudGVycGFydHkgb3JnOiBpdCBzZW50IHRoZSByb3csIG9yIHRoZSByb3cgd2FzIGFkZHJlc3NlZCB0byBpdC5cbiAgaWYgKGZpbHRlci5jb3VudGVycGFydHlPcmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgb3RoZXIgPSBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLmNvdW50ZXJwYXJ0eU9yZ0lkKTtcbiAgICBjb25kaXRpb25zLnB1c2gob3IoZXEoc2NoZW1hLm1lc3NhZ2Uub3JnSWQsIG90aGVyKSwgZXEoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50T3JnSWQsIG90aGVyKSkhKTtcbiAgfVxuXG4gIC8vIEZyZWUtdGV4dCBpbmJveCBzZWFyY2gg4oCUIGNhc2UtaW5zZW5zaXRpdmUgc3Vic3RyaW5nIG92ZXIgc3ViamVjdCBPUiBjb250ZW50LlxuICAvLyBXaWxkY2FyZHMgaW4gdGhlIHRlcm0gYXJlIGVzY2FwZWQgc28gYSBsaXRlcmFsIGAlYC9gX2AgaXMgbWF0Y2hlZCBsaXRlcmFsbHk7XG4gIC8vIGFuIGFsbC13aGl0ZXNwYWNlIHRlcm0gaXMgaWdub3JlZCAobm8tb3ApIHJhdGhlciB0aGFuIG1hdGNoaW5nIGV2ZXJ5dGhpbmcuXG4gIGlmIChmaWx0ZXIuc2VhcmNoICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB0ZXJtID0gbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5zZWFyY2gpLnRyaW0oKTtcbiAgICBpZiAodGVybSkge1xuICAgICAgY29uc3QgbGlrZSA9IGAlJHtlc2NhcGVMaWtlV2lsZGNhcmRzKHRlcm0pfSVgO1xuICAgICAgY29uZGl0aW9ucy5wdXNoKFxuICAgICAgICBvcihcbiAgICAgICAgICBpbGlrZShzY2hlbWEubWVzc2FnZS5zdWJqZWN0LCBsaWtlKSxcbiAgICAgICAgICBpbGlrZShzY2hlbWEubWVzc2FnZS5jb250ZW50LCBsaWtlKSxcbiAgICAgICAgKSEsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb21wbGlhbmNlIFF1ZXJ5IEJ1aWxkZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2UgcG9saWN5IHF1ZXJpZXMuXG4gKlxuICogVmlzaWJpbGl0eTpcbiAqIC0gVGhlIHJlcXVlc3Rpbmcgb3JnJ3Mgb3duIHBvbGljaWVzLCBBTkRcbiAqIC0gVGhlIHN5c3RlbSBvcmcncyBwb2xpY3kgdGVtcGxhdGVzIChzbyB0aGUgc2hhcmVkIGNhdGFsb2cgaXMgYWx3YXlzIHZpc2libGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlUG9saWN5Q29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPENvbXBsaWFuY2VQb2xpY3lGaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbik6IFNRTFtdIHtcbiAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICBpZiAob3JnSWQpIHtcbiAgICBjb25zdCBub3JtYWxpemVkT3JnSWQgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkT3JnSWQgPT09IFNZU1RFTV9PUkdfSUQpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgb3IoXG4gICAgICAgICAgZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZCksXG4gICAgICAgICAgYW5kKFxuICAgICAgICAgICAgZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kub3JnSWQsIFNZU1RFTV9PUkdfSUQpLFxuICAgICAgICAgICAgZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kuaXNUZW1wbGF0ZSwgdHJ1ZSksXG4gICAgICAgICAgKSEsXG4gICAgICAgICkhLFxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFpbC1jbG9zZWQ6IG5vIG9yZyBjb250ZXh0IOKHkiBubyByb3dzIChuZXZlciBsZWFrIGV2ZXJ5IHRlbmFudCdzIHBvbGljaWVzKS5cbiAgICBjb25kaXRpb25zLnB1c2goSU1QT1NTSUJMRSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWRFcXVhbHMoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kuaWQsIGZpbHRlci5pZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWxpa2Uoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kubmFtZSwgYCUke2VzY2FwZUxpa2VXaWxkY2FyZHMobm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5uYW1lKSl9JWApKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuaXNUZW1wbGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5LmlzVGVtcGxhdGUsIHBhcnNlQm9vbGVhbkZpbHRlcihmaWx0ZXIuaXNUZW1wbGF0ZSkpKTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgdG8gYWN0aXZlPXRydWUgZm9yIGxpc3QgcXVlcmllcywgbm90IHNpbmdsZS1lbnRpdHkgbG9va3VwcyBieSBJRFxuICAvLyAob3RoZXJ3aXNlIGZpbmRCeUlkIG9mIGFuIGluYWN0aXZlIHBvbGljeSByZXR1cm5zIG5vdGhpbmcpLlxuICBhY3RpdmVEZWZhdWx0KGNvbmRpdGlvbnMsIHNjaGVtYS5jb21wbGlhbmNlUG9saWN5LmlzQWN0aXZlLCBmaWx0ZXIuaXNBY3RpdmUsIGZpbHRlci5pZCAhPT0gdW5kZWZpbmVkKTtcblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgY29tcGxpYW5jZSBydWxlIHF1ZXJpZXMuXG4gKlxuICogVmlzaWJpbGl0eTpcbiAqIC0gVGhlIHJlcXVlc3Rpbmcgb3JnJ3Mgb3duIHJ1bGVzIChhbnkgc2NvcGUpLCBBTkRcbiAqIC0gVGhlIHN5c3RlbSBvcmcncyBwdWJsaXNoZWQgcnVsZXMgKHNvIHRoZSBnbG9iYWwgY2F0YWxvZyBpcyBhbHdheXMgdmlzaWJsZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VSdWxlQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPENvbXBsaWFuY2VSdWxlRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZE9yZ0lkID0gb3JnSWQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9ybWFsaXplZE9yZ0lkID09PSBTWVNURU1fT1JHX0lEKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKFxuICAgICAgICBvcihcbiAgICAgICAgICBlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZCksXG4gICAgICAgICAgYW5kKFxuICAgICAgICAgICAgZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLm9yZ0lkLCBTWVNURU1fT1JHX0lEKSxcbiAgICAgICAgICAgIGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zY29wZSwgJ3B1Ymxpc2hlZCcgYXMgUnVsZVNjb3BlKSxcbiAgICAgICAgICApISxcbiAgICAgICAgKSEsXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBGYWlsLWNsb3NlZDogbm8gb3JnIGNvbnRleHQg4oeSIG5vIHJvd3MgKG5ldmVyIGxlYWsgZXZlcnkgdGVuYW50J3MgcnVsZXMpLlxuICAgIGNvbmRpdGlvbnMucHVzaChJTVBPU1NJQkxFKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChpZEVxdWFscyhzY2hlbWEuY29tcGxpYW5jZVJ1bGUuaWQsIGZpbHRlci5pZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWxpa2Uoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLm5hbWUsIGAlJHtlc2NhcGVMaWtlV2lsZGNhcmRzKG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIubmFtZSkpfSVgKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnBvbGljeUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnBvbGljeUlkLCBmaWx0ZXIucG9saWN5SWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnRhcmdldCwgZmlsdGVyLnRhcmdldCBhcyBSdWxlVGFyZ2V0KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnNldmVyaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnNldmVyaXR5LCBmaWx0ZXIuc2V2ZXJpdHkgYXMgUnVsZVNldmVyaXR5KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnNjb3BlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnNjb3BlLCBmaWx0ZXIuc2NvcGUgYXMgUnVsZVNjb3BlKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGJ1aWxkSnNvbmJLZXl3b3JkQ29uZGl0aW9uKHNjaGVtYS5jb21wbGlhbmNlUnVsZS50YWdzLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLnRhZykpKTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgdG8gYWN0aXZlPXRydWUgZm9yIGxpc3QgcXVlcmllcywgbm90IHNpbmdsZS1lbnRpdHkgbG9va3VwcyBieSBJRC5cbiAgYWN0aXZlRGVmYXVsdChjb25kaXRpb25zLCBzY2hlbWEuY29tcGxpYW5jZVJ1bGUuaXNBY3RpdmUsIGZpbHRlci5pc0FjdGl2ZSwgZmlsdGVyLmlkICE9PSB1bmRlZmluZWQpO1xuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBicm93c2luZyB0aGUgcHVibGlzaGVkIHJ1bGVzIGNhdGFsb2cuXG4gKiBPbmx5IHJldHVybnMgc3lzdGVtLW9yZyBwdWJsaXNoZWQgcnVsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFB1Ymxpc2hlZFJ1bGVDYXRhbG9nQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPENvbXBsaWFuY2VSdWxlRmlsdGVyPixcbik6IFNRTFtdIHtcbiAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICAvLyBPbmx5IHNjb3BlPSdwdWJsaXNoZWQnIGlzIG5lZWRlZCDigJQgdGhlIGNyZWF0ZSBlbmRwb2ludCBhbHJlYWR5IGVuZm9yY2VzXG4gIC8vIHRoYXQgb25seSB0aGUgc3lzdGVtIG9yZyBjYW4gY3JlYXRlIHB1Ymxpc2hlZCBydWxlcywgc28gZmlsdGVyaW5nIGJ5IG9yZ0lkXG4gIC8vIGlzIHJlZHVuZGFudCBhbmQgYnJlYWtzIHdoZW4gdGhlIHN5c3RlbSBvcmcncyBEQiBJRCBkaWZmZXJzIGZyb20gU1lTVEVNX09SR19JRC5cbiAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zY29wZSwgJ3B1Ymxpc2hlZCcgYXMgUnVsZVNjb3BlKSk7XG5cbiAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWxpa2Uoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLm5hbWUsIGAlJHtlc2NhcGVMaWtlV2lsZGNhcmRzKG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIubmFtZSkpfSVgKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS50YXJnZXQsIGZpbHRlci50YXJnZXQgYXMgUnVsZVRhcmdldCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zZXZlcml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zZXZlcml0eSwgZmlsdGVyLnNldmVyaXR5IGFzIFJ1bGVTZXZlcml0eSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YWcgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEuY29tcGxpYW5jZVJ1bGUudGFncywgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci50YWcpKSk7XG4gIH1cblxuICAvLyBUaGUgY2F0YWxvZyBpcyBhbHdheXMgYWN0aXZlLW9ubHkgKG5vIHNpbmdsZS1pZCBleGVtcHRpb24gaGVyZSkuXG4gIGFjdGl2ZURlZmF1bHQoY29uZGl0aW9ucywgc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlzQWN0aXZlLCBmaWx0ZXIuaXNBY3RpdmUsIGZhbHNlKTtcblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgY29tcGxpYW5jZSBleGVtcHRpb24gcXVlcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29tcGxpYW5jZUV4ZW1wdGlvbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlRXhlbXB0aW9uRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlRXhlbXB0aW9uLm9yZ0lkLCBvcmdJZC50b0xvd2VyQ2FzZSgpKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKElNUE9TU0lCTEUpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5ydWxlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5ydWxlSWQsIGZpbHRlci5ydWxlSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZW50aXR5VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlRXhlbXB0aW9uLmVudGl0eVR5cGUsIGZpbHRlci5lbnRpdHlUeXBlIGFzIFJ1bGVUYXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZW50aXR5SWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5lbnRpdHlJZCwgZmlsdGVyLmVudGl0eUlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnN0YXR1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlRXhlbXB0aW9uLnN0YXR1cywgZmlsdGVyLnN0YXR1cykpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2UgYXVkaXQgbG9nIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VBdWRpdENvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlQXVkaXRGaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbik6IFNRTFtdIHtcbiAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICBpZiAob3JnSWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5vcmdJZCwgb3JnSWQudG9Mb3dlckNhc2UoKSkpO1xuICB9IGVsc2Uge1xuICAgIGNvbmRpdGlvbnMucHVzaChJTVBPU1NJQkxFKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy50YXJnZXQsIGZpbHRlci50YXJnZXQgYXMgUnVsZVRhcmdldCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5hY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUF1ZGl0TG9nLmFjdGlvbiwgZmlsdGVyLmFjdGlvbikpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5yZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUF1ZGl0TG9nLnJlc3VsdCwgZmlsdGVyLnJlc3VsdCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zY2FuSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUF1ZGl0TG9nLnNjYW5JZCwgZmlsdGVyLnNjYW5JZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5kYXRlRnJvbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGd0ZShzY2hlbWEuY29tcGxpYW5jZUF1ZGl0TG9nLmNyZWF0ZWRBdCwgbmV3IERhdGUoZmlsdGVyLmRhdGVGcm9tKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5kYXRlVG8gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChsdGUoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5jcmVhdGVkQXQsIG5ldyBEYXRlKGZpbHRlci5kYXRlVG8pKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgY29tcGxpYW5jZSBzY2FuIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VTY2FuQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPENvbXBsaWFuY2VTY2FuRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlU2Nhbi5vcmdJZCwgb3JnSWQudG9Mb3dlckNhc2UoKSkpO1xuICB9IGVsc2Uge1xuICAgIGNvbmRpdGlvbnMucHVzaChJTVBPU1NJQkxFKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VTY2FuLnRhcmdldCwgZmlsdGVyLnRhcmdldCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVNjYW4uc3RhdHVzLCBmaWx0ZXIuc3RhdHVzKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRyaWdnZXJlZEJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VTY2FuLnRyaWdnZXJlZEJ5LCBmaWx0ZXIudHJpZ2dlcmVkQnkpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuIl19
|