@pipeline-builder/pipeline-data 4.3.3 → 4.3.4
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/crud-service.d.ts +7 -0
- package/lib/api/crud-service.js +14 -3
- package/lib/api/pipeline-step-resolution.d.ts +111 -0
- package/lib/api/pipeline-step-resolution.js +163 -0
- package/lib/api/plugin-consumption-policy.d.ts +8 -2
- package/lib/api/plugin-consumption-policy.js +20 -3
- package/lib/api/plugin-resolution.d.ts +26 -9
- package/lib/api/plugin-resolution.js +51 -33
- package/lib/api/reporting/analytics-queries.d.ts +6 -4
- package/lib/api/reporting/analytics-queries.js +11 -11
- package/lib/api/reporting/deploy-rollup.d.ts +2 -0
- package/lib/api/reporting/deploy-rollup.js +5 -1
- package/lib/api/reporting/failure-classifier.d.ts +2 -6
- package/lib/api/reporting/failure-classifier.js +22 -1
- package/lib/api/reporting/ingest.js +73 -16
- package/lib/api/reporting/plugin-exposure.d.ts +261 -15
- package/lib/api/reporting/plugin-exposure.js +423 -38
- package/lib/api/reporting/stakeholder/compose.d.ts +1 -1
- package/lib/api/reporting/stakeholder/compose.js +30 -1
- package/lib/api/reporting/stakeholder/store.d.ts +16 -2
- package/lib/api/reporting/stakeholder/store.js +17 -6
- package/lib/api/reporting/types.d.ts +80 -1
- package/lib/api/reporting/types.js +1 -1
- package/lib/api/reporting-service.d.ts +11 -4
- package/lib/api/reporting-service.js +106 -43
- package/lib/api/soft-delete-sweep.d.ts +8 -18
- package/lib/api/soft-delete-sweep.js +35 -5
- package/lib/api/version-references.d.ts +80 -0
- package/lib/api/version-references.js +135 -0
- package/lib/core/query-filters.d.ts +3 -3
- package/lib/core/query-filters.js +1 -1
- package/lib/database/drizzle-schema.d.ts +1238 -143
- package/lib/database/drizzle-schema.js +6 -3
- package/lib/database/index.d.ts +1 -1
- package/lib/database/index.js +2 -2
- package/lib/database/schema/ecosystem.d.ts +53 -0
- package/lib/database/schema/ecosystem.js +14 -3
- package/lib/database/schema/pipeline.d.ts +38 -0
- package/lib/database/schema/pipeline.js +20 -2
- package/lib/database/schema/plugin.d.ts +265 -0
- package/lib/database/schema/plugin.js +34 -3
- package/lib/database/schema/reporting-analytics.d.ts +786 -4
- package/lib/database/schema/reporting-analytics.js +111 -5
- package/lib/index.d.ts +5 -3
- package/lib/index.js +5 -3
- package/lib/testing/exports.json +24 -0
- package/package.json +4 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { createLogger, errorMessage, isoOrNull, scrubAwsIdentifiersFromString } from '@pipeline-builder/api-core';
|
|
4
|
-
import { eq, sql } from 'drizzle-orm';
|
|
4
|
+
import { and, eq, sql } from 'drizzle-orm';
|
|
5
5
|
import { drizzleRows } from './crud-service.js';
|
|
6
6
|
import { schema } from '../database/drizzle-schema.js';
|
|
7
7
|
import { withTenantTx, runWithTenantContext } from '../database/tenancy.js';
|
|
@@ -103,7 +103,8 @@ export class ReportingService {
|
|
|
103
103
|
MAX(e.completed_at) FILTER (WHERE e.event_type = 'PIPELINE')::text AS ended_at,
|
|
104
104
|
MAX(e.duration_ms) FILTER (WHERE e.event_type = 'PIPELINE')::int AS duration_ms,
|
|
105
105
|
(ARRAY_AGG(e.stage_name) FILTER (WHERE e.event_type = 'STAGE' AND e.status = 'FAILED'))[1] AS failing_stage,
|
|
106
|
-
(ARRAY_AGG(e.action_name) FILTER (WHERE e.event_type = 'ACTION' AND e.status = 'FAILED'))[1] AS failing_action
|
|
106
|
+
(ARRAY_AGG(e.action_name) FILTER (WHERE e.event_type = 'ACTION' AND e.status = 'FAILED'))[1] AS failing_action,
|
|
107
|
+
(ARRAY_AGG(e.detail->'failure') FILTER (WHERE e.detail ? 'failure'))[1] AS failure
|
|
107
108
|
FROM ${schema.pipelineEvent} e
|
|
108
109
|
JOIN ${schema.pipeline} p ON p.id = e.pipeline_id
|
|
109
110
|
WHERE p.org_id ${pred} AND e.pipeline_id = ${pipelineId} AND e.execution_id IS NOT NULL
|
|
@@ -402,23 +403,36 @@ export class ReportingService {
|
|
|
402
403
|
* the real MTTR. Runs under the caller's org context (RLS WITH CHECK).
|
|
403
404
|
*/
|
|
404
405
|
async recordDeploymentOutcome(orgId, executionId, input) {
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
406
|
+
// The prior marker (if any) is read in the SAME tx as the upsert so the
|
|
407
|
+
// caller's audit row can carry before/after: a re-POST that moves `at`
|
|
408
|
+
// rewrites when the org's CFR/MTTR clock started, and "from what" is the
|
|
409
|
+
// half a reviewer cannot reconstruct afterwards.
|
|
410
|
+
const previous = await runWithTenantContext({ orgId, isSuperAdmin: false }, () => withTenantTx(async (tx) => {
|
|
411
|
+
const [prior] = await tx
|
|
412
|
+
.select({ at: schema.deploymentOutcome.at, environment: schema.deploymentOutcome.environment })
|
|
413
|
+
.from(schema.deploymentOutcome)
|
|
414
|
+
.where(and(eq(schema.deploymentOutcome.executionId, executionId), eq(schema.deploymentOutcome.outcome, input.outcome)))
|
|
415
|
+
.limit(1);
|
|
416
|
+
await tx.insert(schema.deploymentOutcome).values({
|
|
417
|
+
executionId,
|
|
418
|
+
orgId,
|
|
419
|
+
environment: scrubOptional(input.environment),
|
|
420
|
+
outcome: input.outcome,
|
|
414
421
|
at: new Date(input.at),
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
422
|
+
}).onConflictDoUpdate({
|
|
423
|
+
target: [schema.deploymentOutcome.executionId, schema.deploymentOutcome.outcome],
|
|
424
|
+
set: {
|
|
425
|
+
at: new Date(input.at),
|
|
426
|
+
environment: scrubOptional(input.environment) ?? null,
|
|
427
|
+
},
|
|
428
|
+
});
|
|
429
|
+
return prior ? { at: isoOrNull(prior.at), environment: prior.environment ?? null } : null;
|
|
430
|
+
}));
|
|
418
431
|
// Outcome changes the DORA aggregate — drop the org's cached reports.
|
|
419
432
|
await this.invalidateOrg(orgId).catch((err) => {
|
|
420
433
|
logger.warn('Reporting cache invalidation failed', { orgId, error: errorMessage(err) });
|
|
421
434
|
});
|
|
435
|
+
return { previous };
|
|
422
436
|
}
|
|
423
437
|
/**
|
|
424
438
|
* Ingest a production incident from the org's incident tooling
|
|
@@ -436,33 +450,69 @@ export class ReportingService {
|
|
|
436
450
|
const severity = scrubAwsIdentifiersFromString(input.severity);
|
|
437
451
|
const openedAt = new Date(input.openedAt);
|
|
438
452
|
const resolvedAt = input.resolvedAt ? new Date(input.resolvedAt) : null;
|
|
439
|
-
await runWithTenantContext({ orgId, isSuperAdmin: false }, () => withTenantTx((tx) =>
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
453
|
+
const { previous, stored } = await runWithTenantContext({ orgId, isSuperAdmin: false }, () => withTenantTx(async (tx) => {
|
|
454
|
+
// Read the prior row in the same tx so the caller can tell a NEW or
|
|
455
|
+
// CHANGED incident from a sender's repeat-interval re-post of the same
|
|
456
|
+
// firing alert (which changes nothing and is not worth an audit row).
|
|
457
|
+
const [prior] = await tx
|
|
458
|
+
.select({
|
|
459
|
+
environment: schema.incident.environment,
|
|
460
|
+
openedAt: schema.incident.openedAt,
|
|
461
|
+
resolvedAt: schema.incident.resolvedAt,
|
|
462
|
+
severity: schema.incident.severity,
|
|
463
|
+
})
|
|
464
|
+
.from(schema.incident)
|
|
465
|
+
.where(and(eq(schema.incident.orgId, orgId), eq(schema.incident.incidentId, incidentId)))
|
|
466
|
+
.limit(1);
|
|
467
|
+
const [row] = await tx.insert(schema.incident).values({
|
|
468
|
+
incidentId,
|
|
469
|
+
orgId,
|
|
454
470
|
environment,
|
|
455
471
|
openedAt,
|
|
456
|
-
resolvedAt
|
|
457
|
-
THEN COALESCE(excluded.resolved_at, ${schema.incident.resolvedAt})
|
|
458
|
-
ELSE excluded.resolved_at END`,
|
|
472
|
+
resolvedAt,
|
|
459
473
|
severity,
|
|
460
|
-
}
|
|
461
|
-
|
|
474
|
+
}).onConflictDoUpdate({
|
|
475
|
+
target: [schema.incident.orgId, schema.incident.incidentId],
|
|
476
|
+
// A redelivered FIRING post (no resolvedAt) must not wipe a recorded
|
|
477
|
+
// resolve — senders re-post firing alerts on every repeat interval, and
|
|
478
|
+
// delivery order isn't guaranteed. Keep the stored resolve unless the
|
|
479
|
+
// post carries its own, or the incident was RE-OPENED (a different
|
|
480
|
+
// openedAt means a new occurrence, whose resolve state is the post's).
|
|
481
|
+
set: {
|
|
482
|
+
environment,
|
|
483
|
+
openedAt,
|
|
484
|
+
resolvedAt: sql `CASE WHEN ${schema.incident.openedAt} = excluded.opened_at
|
|
485
|
+
THEN COALESCE(excluded.resolved_at, ${schema.incident.resolvedAt})
|
|
486
|
+
ELSE excluded.resolved_at END`,
|
|
487
|
+
severity,
|
|
488
|
+
},
|
|
489
|
+
}).returning({ resolvedAt: schema.incident.resolvedAt });
|
|
490
|
+
return { previous: prior ?? null, stored: row };
|
|
491
|
+
}));
|
|
462
492
|
// A new/updated incident changes the DORA aggregate — drop cached reports.
|
|
463
493
|
await this.invalidateOrg(orgId).catch((err) => {
|
|
464
494
|
logger.warn('Reporting cache invalidation failed', { orgId, error: errorMessage(err) });
|
|
465
495
|
});
|
|
496
|
+
const after = {
|
|
497
|
+
environment,
|
|
498
|
+
openedAt: openedAt.toISOString(),
|
|
499
|
+
resolvedAt: isoOrNull(stored?.resolvedAt ?? null),
|
|
500
|
+
severity,
|
|
501
|
+
};
|
|
502
|
+
const before = previous
|
|
503
|
+
? {
|
|
504
|
+
environment: previous.environment,
|
|
505
|
+
openedAt: isoOrNull(previous.openedAt),
|
|
506
|
+
resolvedAt: isoOrNull(previous.resolvedAt),
|
|
507
|
+
severity: previous.severity,
|
|
508
|
+
}
|
|
509
|
+
: null;
|
|
510
|
+
const changed = before === null
|
|
511
|
+
|| before.environment !== after.environment
|
|
512
|
+
|| before.openedAt !== after.openedAt
|
|
513
|
+
|| before.resolvedAt !== after.resolvedAt
|
|
514
|
+
|| before.severity !== after.severity;
|
|
515
|
+
return { incidentId, created: before === null, changed, before, after };
|
|
466
516
|
}
|
|
467
517
|
/**
|
|
468
518
|
* Read the per-org DORA settings. Returns the stored
|
|
@@ -734,17 +784,25 @@ export class ReportingService {
|
|
|
734
784
|
* why one unavailable read costs one finding rather than the whole section. The
|
|
735
785
|
* alternative — a section that fails because the streak query timed out — replaces
|
|
736
786
|
* six findings with none.
|
|
787
|
+
*
|
|
788
|
+
* A skipped rule is SAID, in `unavailableRules`. Absorbed silently, a failed
|
|
789
|
+
* vulnerable-pipelines read became an empty set — indistinguishable from "no
|
|
790
|
+
* pipeline runs a vulnerable plugin", which is the one false negative a security
|
|
791
|
+
* reader must never be handed. The composer turns it into a data-quality note.
|
|
737
792
|
*/
|
|
738
793
|
async getNeedsAttention(scope, previous) {
|
|
739
794
|
const current = await getPipelineBreakdown(scope, ATTENTION_PIPELINE_LIMIT);
|
|
795
|
+
const unavailable = new Set();
|
|
796
|
+
const track = (rules, p, fallback) => soften(p, fallback, () => { for (const r of rules)
|
|
797
|
+
unavailable.add(r); });
|
|
740
798
|
const prior = previous
|
|
741
|
-
? await
|
|
799
|
+
? await track(['slower_p95'], getPipelineBreakdown({ ...scope, ...previous }, ATTENTION_PIPELINE_LIMIT), [])
|
|
742
800
|
: [];
|
|
743
801
|
const [streakRows, configChanges, vulnerable, untracked, thresholds] = await Promise.all([
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
802
|
+
track(['consecutive_failures', 'no_recent_success'], getPipelineStreaks(scope), []),
|
|
803
|
+
track(['failed_after_config_change'], getPipelineConfigChanges(scope), new Map()),
|
|
804
|
+
track(['vulnerable_plugin'], getVulnerablePipelines(scope), []),
|
|
805
|
+
track(['no_deploy_tracking'], getUntrackedPipelines(scope), []),
|
|
748
806
|
soften(this.attentionThresholds(scope.orgId), {}),
|
|
749
807
|
]);
|
|
750
808
|
const items = evaluateNeedsAttention({
|
|
@@ -755,8 +813,10 @@ export class ReportingService {
|
|
|
755
813
|
lastSuccessAt: r.lastSuccessAt,
|
|
756
814
|
}])),
|
|
757
815
|
configChanges,
|
|
758
|
-
|
|
759
|
-
|
|
816
|
+
// An unavailable input is passed as ABSENT, so the evaluator skips its rule
|
|
817
|
+
// rather than evaluating it against an empty set.
|
|
818
|
+
...(unavailable.has('vulnerable_plugin') ? {} : { vulnerablePipelines: new Set(vulnerable) }),
|
|
819
|
+
...(unavailable.has('no_deploy_tracking') ? {} : { untrackedPipelines: new Set(untracked) }),
|
|
760
820
|
thresholds: thresholdsFrom(thresholds),
|
|
761
821
|
now: new Date(scope.to),
|
|
762
822
|
});
|
|
@@ -766,6 +826,8 @@ export class ReportingService {
|
|
|
766
826
|
// What the rules were evaluated over, so a reader can tell an empty list
|
|
767
827
|
// ("nothing tripped") from an empty input ("nothing ran").
|
|
768
828
|
pipelinesEvaluated: current.length,
|
|
829
|
+
// Rules that could NOT run this period because their input failed to load.
|
|
830
|
+
unavailableRules: [...unavailable],
|
|
769
831
|
};
|
|
770
832
|
}
|
|
771
833
|
/**
|
|
@@ -814,14 +876,15 @@ const ATTENTION_PIPELINE_LIMIT = 25;
|
|
|
814
876
|
* evaluator says so. Never used for a number the report presents: a query that fails
|
|
815
877
|
* and silently reads as zero is how a report states something false.
|
|
816
878
|
*/
|
|
817
|
-
async function soften(p, fallback) {
|
|
879
|
+
async function soften(p, fallback, onFail) {
|
|
818
880
|
try {
|
|
819
881
|
return await p;
|
|
820
882
|
}
|
|
821
883
|
catch (err) {
|
|
822
884
|
logger.warn('Needs-attention input unavailable; its rule is skipped', { error: errorMessage(err) });
|
|
885
|
+
onFail?.();
|
|
823
886
|
return fallback;
|
|
824
887
|
}
|
|
825
888
|
}
|
|
826
889
|
export const reportingService = new ReportingService();
|
|
827
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEgsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUUsZ0ZBQWdGO0FBQ2hGLDRFQUE0RTtBQUM1RSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsd0JBQXdCLEVBQ3hCLGdCQUFnQixFQUNoQixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixzQkFBc0IsR0FFdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckcsT0FBTyxFQUNMLGNBQWMsSUFBSSxXQUFXLEVBQzdCLFlBQVksSUFBSSxTQUFTLEVBQ3pCLGNBQWMsSUFBSSxXQUFXLEdBQzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsOEVBQThFO0FBQzlFLE9BQU8sRUFBRSxZQUFZLElBQUksTUFBTSxFQUFFLE1BQU0sdUJB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QUksQ0FBQyx3REFBd0QsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBpc29Pck51bGwsIHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgZXEsIHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGRyaXp6bGVSb3dzIH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4LCBydW5XaXRoVGVuYW50Q29udGV4dCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vLyBFeHRyYWN0ZWQgZm9yIHNpemUg4oCUIHNlZSAuL3JlcG9ydGluZy8uIEV2ZXJ5dGhpbmcgcHVibGljIGlzIHJlLWV4cG9ydGVkIGJlbG93XG4vLyBzbyBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YWAncyBzdXJmYWNlIGlzIHVuY2hhbmdlZCBieSB0aGUgc3BsaXQuXG5pbXBvcnQge1xuICBnZXRBZG9wdGlvbixcbiAgZ2V0RmFpbHVyZUFuYWx5c2lzLFxuICBnZXRPdXRkYXRlZFBsdWdpbnMsXG4gIGdldFBpcGVsaW5lQnJlYWtkb3duLFxuICBnZXRQaXBlbGluZUNvbmZpZ0NoYW5nZXMsXG4gIGdldFBpcGVsaW5lU3RyZWFrcyxcbiAgZ2V0UGx1Z2luVnVsbmVyYWJpbGl0aWVzLFxuICBnZXRQcm9tb3Rpb25WaWV3LFxuICBnZXRSZXNvdXJjZUNvbnN1bXB0aW9uLFxuICBnZXRTdGFnZVBlcmZvcm1hbmNlLFxuICBnZXRVbnRyYWNrZWRQaXBlbGluZXMsXG4gIGdldFZ1bG5lcmFibGVQaXBlbGluZXMsXG4gIHR5cGUgQW5hbHl0aWNzU2NvcGUsXG59IGZyb20gJy4vcmVwb3J0aW5nL2FuYWx5dGljcy1xdWVyaWVzLmpzJztcbmltcG9ydCB7IGludmVudG9yeUNhY2hlLCBpbnZhbGlkYXRlT3JnUmVwb3J0cyB9IGZyb20gJy4vcmVwb3J0aW5nL2NhY2hlcy5qcyc7XG5pbXBvcnQgeyBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUywgcmVzb2x2ZUluY2lkZW50V2luZG93SG91cnMgfSBmcm9tICcuL3JlcG9ydGluZy9kb3JhLXNjb3JpbmcuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RG9yYU1ldHJpY3MgYXMgZG9yYU1ldHJpY3MsXG4gIGdldERvcmFUcmVuZCBhcyBkb3JhVHJlbmQsXG4gIGdldEJ1aWxkSGVhbHRoIGFzIGJ1aWxkSGVhbHRoLFxufSBmcm9tICcuL3JlcG9ydGluZy9kb3JhLmpzJztcbi8vIEFsaWFzZWQ6IHRoZSBtb2R1bGUgZnVuY3Rpb25zIGFuZCB0aGUgZGVsZWdhdGluZyBtZXRob2RzIGJlbG93IHNoYXJlIG5hbWVzLlxuaW1wb3J0IHsgaW5nZXN0RXZlbnRzIGFzIGluZ2VzdCB9IGZyb20gJy4vcmVwb3J0aW5nL2luZ2VzdC5qcyc7XG5pbXBvcnQgeyBnZXRMYXN0RGVwbG95ZWRDb21taXQgYXMgbGFzdERlcGxveWVkQ29tbWl0IH0gZnJvbSAnLi9yZXBvcnRpbmcvbGFzdC1kZXBsb3kuanMnO1xuaW1wb3J0IHR5cGUgeyBMYXN0RGVwbG95ZWRDb21taXQgfSBmcm9tICcuL3JlcG9ydGluZy9sYXN0LWRlcGxveS5qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZU5lZWRzQXR0ZW50aW9uLCB0aHJlc2hvbGRzRnJvbSB9IGZyb20gJy4vcmVwb3J0aW5nL25lZWRzLWF0dGVudGlvbi5qcyc7XG5pbXBvcnQge1xuICBnZXRQbHVnaW5SdW50aW1lIGFzIHBsdWdpblJ1bnRpbWUsXG4gIGdldFBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUgYXMgcGx1Z2luUnVudGltZUFnZ3JlZ2F0ZSxcbiAgaGFzVmVyaWZpZWRQbHVnaW5Vc2UgYXMgdmVyaWZpZWRQbHVnaW5Vc2UsXG59IGZyb20gJy4vcmVwb3J0aW5nL3BsdWdpbi1ydW50aW1lLmpzJztcbmltcG9ydCB7IHJlcG9ydCB9IGZyb20gJy4vcmVwb3J0aW5nL3F1ZXJ5LXNjb3BlLmpzJztcbmltcG9ydCB7IHB1cmdlRXhwaXJlZFJlcG9ydGluZ0RhdGEgYXMgcHVyZ2VSZXBvcnRpbmdSZXRlbnRpb24gfSBmcm9tICcuL3JlcG9ydGluZy9yZXRlbnRpb24tc3dlZXAuanMnO1xuaW1wb3J0IHsgUkVQT1JUSU5HX0VWRU5UX1JFVEVOVElPTl9EQVlTLCBSRVBPUlRJTkdfRE9SQV9SRVRFTlRJT05fREFZUyB9IGZyb20gJy4vcmVwb3J0aW5nL3JldGVudGlvbi5qcyc7XG5pbXBvcnQgeyBhc3NlcnRSZXBvcnRJbnRlcnZhbCwgYnVja2V0S2V5LCBwZXJpb2RCdWNrZXQsIHNjcnViT3B0aW9uYWwsIG9wdGlvbmFsU3RhcnRlZEF0UmFuZ2UsIHN0YXJ0ZWRBdFdpbmRvdyB9IGZyb20gJy4vcmVwb3J0aW5nL3NxbC1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRXhlY3V0aW9uQ291bnQsIFRpbWVTZXJpZXNFbnRyeSwgRHVyYXRpb25TdGF0cywgUGlwZWxpbmVFeGVjdXRpb24sIFN0YWdlRmFpbHVyZSwgU3RhZ2VCb3R0bGVuZWNrLFxuICBBY3Rpb25GYWlsdXJlLCBFcnJvckVudHJ5LCBQbHVnaW5TdW1tYXJ5LCBUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbiwgVmVyc2lvbkNvdW50LFxuICBCdWlsZFRpbWVTZXJpZXNFbnRyeSwgQnVpbGREdXJhdGlvbiwgQnVpbGRGYWlsdXJlLFxuICBQbHVnaW5SdW50aW1lQWdncmVnYXRlLCBQbHVnaW5SdW50aW1lRmlsdGVyLCBQbHVnaW5SdW50aW1lU3RhdHMsXG4gIFJlcG9ydGluZ1JldGVudGlvbk9wdGlvbnMsIFJlcG9ydGluZ1JldGVudGlvbkNvdW50cyxcbiAgRG9yYU9wdGlvbnMsIFJlcG9ydGluZ1NldHRpbmdzLCBSZXBvcnRpbmdTZXR0aW5nc1BhdGNoLCBJbmNpZGVudExpc3RJdGVtLCBJbmNpZGVudFRlc3RSZXN1bHQsXG4gIERvcmFNZXRyaWNzLCBEb3JhVHJlbmRQb2ludCwgQnVpbGRIZWFsdGgsIEluY2lkZW50SW5wdXQsXG4gIEluZ2VzdENhbGxlciwgSW5nZXN0RXZlbnQsIEluZ2VzdE1ldHJpYywgSW5nZXN0UmVzdWx0LCBJbmdlc3RIZWFsdGhTdGF0dXMsXG4gIEJ1Y2tldE9wdGlvbnMsXG59IGZyb20gJy4vcmVwb3J0aW5nL3R5cGVzLmpzJztcblxuLy8gVGhlIHJlcG9ydGluZyB0eXBlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBwYWNrYWdlIEFQSS4gRW51bWVyYXRlZCByYXRoZXIgdGhhblxuLy8gYGV4cG9ydCAqYCBiZWNhdXNlIHRoZSByZXBvcnRpbmcgbW9kdWxlcyBhbHNvIGV4cG9ydCBpbnRlcm5hbHMgKG9yZ1Njb3BlLFxuLy8gcnVuUmVwb3J0LCB0aGUgY2FjaGVzLCB0aGUgRE9SQSByb3cgc2hhcGVzKSB0aGF0IG11c3Qgc3RheSBwcml2YXRlLlxuZXhwb3J0IHR5cGUgeyBMYXN0RGVwbG95ZWRDb21taXQgfSBmcm9tICcuL3JlcG9ydGluZy9sYXN0LWRlcGxveS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEJ1Y2tldE9wdGlvbnMsXG4gIEJ1aWxkSGVhbHRoLCBCdWlsZEhlYWx0aFN0YWdlLCBEb3JhRW52TWV0cmljcywgRG9yYUxldmVsLCBEb3JhTWV0cmljcywgRG9yYU9wdGlvbnMsIERvcmFUcmVuZFBvaW50LFxuICBJbmNpZGVudElucHV0LCBJbmNpZGVudExpc3RJdGVtLCBSZXBvcnRpbmdTZXR0aW5ncywgSW5jaWRlbnRUZXN0UmVzdWx0LFxuICBJbmdlc3RDYWxsZXIsIEluZ2VzdEV2ZW50LCBJbmdlc3RIZWFsdGhTdGF0dXMsIEluZ2VzdE1ldHJpYywgSW5nZXN0UmVzdWx0LFxuICBQbHVnaW5SdW50aW1lQWdncmVnYXRlLCBQbHVnaW5SdW50aW1lRmlsdGVyLCBQbHVnaW5SdW50aW1lU3RhdHMsXG4gIFJlcG9ydGluZ1JldGVudGlvbkNvdW50cywgUmVwb3J0aW5nUmV0ZW50aW9uT3B0aW9ucywgUmVwb3J0aW5nUmV0ZW50aW9uU2V0dGluZ3MsXG4gIFJlcG9ydGluZ1NldHRpbmdzUGF0Y2gsXG59IGZyb20gJy4vcmVwb3J0aW5nL3R5cGVzLmpzJztcblxuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JlcG9ydGluZy1zZXJ2aWNlJyk7XG5cbmV4cG9ydCBjbGFzcyBSZXBvcnRpbmdTZXJ2aWNlIHtcblxuICAvKiogSW52YWxpZGF0ZSBhbGwgY2FjaGVkIHJlcG9ydHMgZm9yIGFuIG9yZyAoY2FsbCBhZnRlciBldmVudCBpbmdlc3QpLiAqL1xuICBhc3luYyBpbnZhbGlkYXRlT3JnKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBpbnZhbGlkYXRlT3JnUmVwb3J0cyhvcmdJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBpbmNvbWluZyBldmVudHMgYWdhaW5zdCB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIGJhdGNoLWluc2VydCB0aGVcbiAgICogbWF0Y2hlZCBvbmVzLCBhbmQgaW52YWxpZGF0ZSByZXBvcnRpbmcgY2FjaGVzIGZvciBhZmZlY3RlZCBvcmdzLlxuICAgKiBTZWUgLi9yZXBvcnRpbmcvaW5nZXN0LnRzIOKAlCB0aGUgY2FsbGVyIG11c3QgYWxyZWFkeSBob2xkIGEgc3lzYWRtaW5cbiAgICogdGVuYW50IHNjb3BlLCBiZWNhdXNlIGEgYmF0Y2ggc3BhbnMgd2hhdGV2ZXIgb3JncyB0aGUgcmVnaXN0cnkgcmVzb2x2ZXMgdG8uXG4gICAqL1xuICBhc3luYyBpbmdlc3RFdmVudHMoZXZlbnRzOiBJbmdlc3RFdmVudFtdLCBvbk1ldHJpYz86IChtOiBJbmdlc3RNZXRyaWMpID0+IHZvaWQsIGNhbGxlcj86IEluZ2VzdENhbGxlcik6IFByb21pc2U8SW5nZXN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIGluZ2VzdChldmVudHMsIG9uTWV0cmljLCBjYWxsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXQgc2hhIG9mIHRoaXMgcGlwZWxpbmUncyBsYXN0IHN1Y2Nlc3NmdWwgZGVwbG95IOKAlCB0byBgZW52aXJvbm1lbnRgXG4gICAqIHdoZW4gZ2l2ZW4sIHRvIGFueXdoZXJlIG90aGVyd2lzZS4gVGhlIGV4Y2x1c2l2ZSBsb3dlciBib3VuZCBmb3IgXCJjb21taXRzXG4gICAqIHNpbmNlIHRoZSBsYXN0IGRlcGxveVwiLiBUZW5hbmN5IGlzIGVuZm9yY2VkIGZyb20gYGNhbGxlcmAgZXhhY3RseSBhc1xuICAgKiB7QGxpbmsgaW5nZXN0RXZlbnRzfSBkb2VzIGl0LlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFzdERlcGxveWVkQ29tbWl0KHBpcGVsaW5lSWQ6IHN0cmluZywgZW52aXJvbm1lbnQ/OiBzdHJpbmcsIGNhbGxlcj86IEluZ2VzdENhbGxlcik6IFByb21pc2U8TGFzdERlcGxveWVkQ29tbWl0PiB7XG4gICAgcmV0dXJuIGxhc3REZXBsb3llZENvbW1pdChwaXBlbGluZUlkLCBlbnZpcm9ubWVudCwgY2FsbGVyKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAxOiBQaXBlbGluZSBFeGVjdXRpb24gJiBQZXJmb3JtYW5jZSDilIDilIBcblxuXG4gIC8qKiBFeGVjdXRpb24gY291bnQgcGVyIHBpcGVsaW5lIHdpdGggc3RhdHVzIGJyZWFrZG93bi4gKi9cbiAgYXN5bmMgZ2V0RXhlY3V0aW9uQ291bnQob3JnSWQ6IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIHJhbmdlPzogeyBmcm9tPzogc3RyaW5nOyB0bz86IHN0cmluZyB9KTogUHJvbWlzZTxFeGVjdXRpb25Db3VudFtdPiB7XG4gICAgLy8gT3B0aW9uYWwgW2Zyb20sdG9dIHdpbmRvdyBvbiB0aGUgZXhlY3V0aW9uJ3Mgc3RhcnRlZF9hdCwgbWlycm9yaW5nIHRoZVxuICAgIC8vIHNpYmxpbmcgdGltZXNlcmllcyByZXBvcnRzIHNvIHRoZSBkYXNoYm9hcmQgZGF0ZS1yYW5nZSBwaWNrZXIgbmFycm93cyB0aGVcbiAgICAvLyBjb3VudCB0b28gKGFuIGVtcHR5IHJhbmdlID0gYWxsLXRpbWUsIHByZXNlcnZpbmcgdGhlIHByaW9yIGJlaGF2aW9yKS4gVGhlXG4gICAgLy8gcmFuZ2UgcmlkZXMgdGhlIEpPSU4gc28gcGlwZWxpbmVzIHdpdGggbm8gaW4td2luZG93IGV2ZW50cyBzdGlsbCBsaXN0XG4gICAgLy8gKExFRlQgc2VtYW50aWNzIHByZXNlcnZlZCB2aWEgdGhlIGlubmVyLWpvaW4gZmlsdGVyIOKAlCBhIHBpcGVsaW5lIHdpdGggemVyb1xuICAgIC8vIG1hdGNoaW5nIGV2ZW50cyBkcm9wcyBmcm9tIHRoZSBjb3VudCwgc2FtZSBhcyBiZWZvcmUgZm9yIGl0cyB3aW5kb3cpLlxuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gb3B0aW9uYWxTdGFydGVkQXRSYW5nZShyYW5nZSk7XG4gICAgcmV0dXJuIHJlcG9ydDxFeGVjdXRpb25Db3VudD4oYGV4ZWMtY291bnQ6JHtyYW5nZT8uZnJvbSA/PyAnJ306JHtyYW5nZT8udG8gPz8gJyd9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLm9yZ2FuaXphdGlvbiwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGZpcnN0X2V4ZWN1dGlvbixcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X2V4ZWN1dGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lfSBwXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZSBPTiBlLnBpcGVsaW5lX2lkID0gcC5pZFxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyAhPSAnU1RBUlRFRCdcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBwLmlzX2FjdGl2ZSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgcC5pZFxuICAgICAgICBPUkRFUiBCWSB0b3RhbCBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXItcGlwZWxpbmUgZXhlY3V0aW9uIGhpc3Rvcnkg4oCUIERJU1RJTkNUIGV4ZWN1dGlvbnMgZm9yIG9uZSBwaXBlbGluZSxcbiAgICogbmV3ZXN0IGZpcnN0LiBHcm91cHMgYWxsIGV2ZW50cyBieSBgZXhlY3V0aW9uX2lkYCBpbiBhIHNpbmdsZSBzY2FuIGFuZFxuICAgKiByb2xscyBlYWNoIGV4ZWN1dGlvbiB1cCB0byBvbmUgcm93OlxuICAgKiAgIC0gc3RhdHVzOiBkZXJpdmVkIGZyb20gdGhlIFBJUEVMSU5FLXR5cGUgZXZlbnRzLiBGQUlMRUQgd2lucywgdGhlblxuICAgKiAgICAgU1VDQ0VFREVELCB0aGVuIENBTkNFTEVEOyBhbiBleGVjdXRpb24gd2l0aCBubyB0ZXJtaW5hbCBQSVBFTElORSBldmVudFxuICAgKiAgICAgaXMgc3RpbGwgYGluLXByb2dyZXNzYC5cbiAgICogICAtIHN0YXJ0ZWRBdC9lbmRlZEF0L2R1cmF0aW9uTXM6IGZyb20gdGhlIFBJUEVMSU5FIGxpZmVjeWNsZSBldmVudHMuXG4gICAqICAgLSBmYWlsaW5nU3RhZ2UvZmFpbGluZ0FjdGlvbjogdGhlIGZpcnN0IEZBSUxFRCBTVEFHRS9BQ1RJT04gZXZlbnQgKGNoZWFwIOKAlFxuICAgKiAgICAgc2FtZSBzY2FuLCBubyBleHRyYSBxdWVyeSkuXG4gICAqXG4gICAqIE9SRy1TQ09QSU5HOiBpZGVudGljYWwgdG8gdGhlIHNpYmxpbmcgZXhlY3V0aW9uIHJlcG9ydHMg4oCUIGpvaW5zIHRoZSBwaXBlbGluZVxuICAgKiByZWdpc3RyeSB0YWJsZSAoYHBpcGVsaW5lYCkgYW5kIGdhdGVzIG9uIGBwLm9yZ19pZCAke3ByZWR9YCwgd2hlcmUgYHByZWRgIGlzXG4gICAqIHRoZSBzaW5nbGUtb3JnIGA9ICRvcmdgIG9yICh3aXRoIGEgcm9sbHVwKSBhbiBgSU4gKC4uLilgIG92ZXIgdGhlIG9yZ+KGknRlYW1cbiAgICogc3VidHJlZS4gQSBwaXBlbGluZUlkIGJlbG9uZ2luZyB0byBhbm90aGVyIG9yZyB5aWVsZHMgemVybyByb3dzLlxuICAgKi9cbiAgYXN5bmMgbGlzdFBpcGVsaW5lRXhlY3V0aW9ucyhcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHBpcGVsaW5lSWQ6IHN0cmluZyxcbiAgICBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgICByYW5nZT86IHsgZnJvbT86IHN0cmluZzsgdG8/OiBzdHJpbmcgfSxcbiAgICBsaW1pdDogbnVtYmVyID0gNTAsXG4gICk6IFByb21pc2U8UGlwZWxpbmVFeGVjdXRpb25bXT4ge1xuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gb3B0aW9uYWxTdGFydGVkQXRSYW5nZShyYW5nZSk7XG4gICAgcmV0dXJuIHJlcG9ydDxQaXBlbGluZUV4ZWN1dGlvbj4oYHBpcGVsaW5lLWV4ZWN1dGlvbnM6JHtwaXBlbGluZUlkfToke3JhbmdlPy5mcm9tID8/ICcnfToke3JhbmdlPy50byA/PyAnJ306JHtsaW1pdH1gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmV4ZWN1dGlvbl9pZCxcbiAgICAgICAgICBDQVNFXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykgVEhFTiAnZmFpbGVkJ1xuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpIFRIRU4gJ3N1Y2NlZWRlZCdcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdDQU5DRUxFRCcpIFRIRU4gJ2NhbmNlbGVkJ1xuICAgICAgICAgICAgRUxTRSAnaW4tcHJvZ3Jlc3MnXG4gICAgICAgICAgRU5EIEFTIHN0YXR1cyxcbiAgICAgICAgICBNSU4oZS5zdGFydGVkX2F0KSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScpOjp0ZXh0IEFTIHN0YXJ0ZWRfYXQsXG4gICAgICAgICAgTUFYKGUuY29tcGxldGVkX2F0KSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScpOjp0ZXh0IEFTIGVuZGVkX2F0LFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScpOjppbnQgQVMgZHVyYXRpb25fbXMsXG4gICAgICAgICAgKEFSUkFZX0FHRyhlLnN0YWdlX25hbWUpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykpWzFdIEFTIGZhaWxpbmdfc3RhZ2UsXG4gICAgICAgICAgKEFSUkFZX0FHRyhlLmFjdGlvbl9uYW1lKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSlbMV0gQVMgZmFpbGluZ19hY3Rpb25cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH0gQU5EIGUuZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtyYW5nZUNsYXVzZX1cbiAgICAgICAgR1JPVVAgQlkgZS5leGVjdXRpb25faWRcbiAgICAgICAgT1JERVIgQlkgTUFYKGUuY3JlYXRlZF9hdCkgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCk7XG4gIH1cblxuICAvKiogU3VjY2VzcyByYXRlIG92ZXIgdGltZSBmb3IgYW4gb3JnLiAqL1xuICBhc3luYyBnZXRTdWNjZXNzUmF0ZShcbiAgICBvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIGJ1Y2tldDogQnVja2V0T3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHsgdHogPSAnVVRDJywgd2Vla1N0YXJ0ID0gJ21vbmRheScgfSA9IGJ1Y2tldDtcbiAgICAvLyBUaGUgYnVja2V0aW5nIHNldHRpbmdzIGFyZSBwYXJ0IG9mIHRoZSBjYWNoZSBLRVk6IHdpdGhvdXQgdGhlbSBhIENoaWNhZ29cbiAgICAvLyByZXF1ZXN0IGFuZCBhIFVUQyByZXF1ZXN0IHNoYXJlIGFuIGVudHJ5IGFuZCBvbmUgb2YgdGhlbSBnZXRzIHRoZSBvdGhlcidzIHdlZWtzLlxuICAgIHJldHVybiByZXBvcnQ8VGltZVNlcmllc0VudHJ5Pihgc3VjY2Vzcy1yYXRlOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b306JHtidWNrZXRLZXkodHosIHdlZWtTdGFydCl9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtwZXJpb2RCdWNrZXQoaW50ZXJ2YWwsIHNxbGBlLnN0YXJ0ZWRfYXRgLCB0eiwgd2Vla1N0YXJ0KX06OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0NBTkNFTEVEJyk6OmludCBBUyBjYW5jZWxlZCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBzdWNjZXNzX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcpXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCk7XG4gIH1cblxuICAvKiogQXZlcmFnZSBkdXJhdGlvbiBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldEF2ZXJhZ2VEdXJhdGlvbihvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxEdXJhdGlvblN0YXRzW10+IHtcbiAgICByZXR1cm4gcmVwb3J0PER1cmF0aW9uU3RhdHM+KGBhdmctZHVyYXRpb246JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucHJvamVjdCwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNSU4oZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtaW5fbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjk1KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGUuZHVyYXRpb25fbXMpOjppbnQgQVMgcDk1X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZXhlY3V0aW9uc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcC5pZCBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKiogU3RhZ2UgZmFpbHVyZSBoZWF0bWFwIOKAlCB3aGljaCBzdGFnZXMgZmFpbCBtb3N0LiAqL1xuICBhc3luYyBnZXRTdGFnZUZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPFN0YWdlRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxTdGFnZUZhaWx1cmU+KGBzdGFnZS1mYWlsdXJlczoke2Zyb219OiR7dG99YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXN0aW5jdCBkZXBsb3kgYGVudmlyb25tZW50YCB2YWx1ZXMgb2JzZXJ2ZWQgaW4gdGhlIHdpbmRvdyDigJQgcG93ZXJzIHRoZVxuICAgKiBET1JBIGVudmlyb25tZW50LXNjb3BlIGRhdGFsaXN0LiBPcmctc2NvcGVkICsgcm9sbHVwLWF3YXJlIGxpa2UgdGhlIHNpYmxpbmdcbiAgICogcmVwb3J0czsgb25seSBub24tbnVsbCBlbnZpcm9ubWVudHMgKGkuZS4gZGVwbG95LWF0dHJpYnV0ZWQgZXhlY3V0aW9ucykuXG4gICAqL1xuICBhc3luYyBnZXRSZXBvcnRFbnZpcm9ubWVudHMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcmVwb3J0PHsgZW52aXJvbm1lbnQ6IHN0cmluZyB9PihgcmVwb3J0LWVudnM6JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVCBESVNUSU5DVCBlLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBPUkRFUiBCWSBlbnZpcm9ubWVudFxuICAgICAgYCk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy5lbnZpcm9ubWVudCk7XG4gIH1cblxuICAvKiogU3RhZ2UgYm90dGxlbmVja3Mg4oCUIHNsb3dlc3Qgc3RhZ2VzIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0U3RhZ2VCb3R0bGVuZWNrcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxTdGFnZUJvdHRsZW5lY2tbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8U3RhZ2VCb3R0bGVuZWNrPihgc3RhZ2UtYm90dGxlbmVja3M6JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucGlwZWxpbmVfbmFtZSwgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIHAuaWQsIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKiogQWN0aW9uIGZhaWx1cmUgcmF0ZSDigJQgd2hpY2ggcGx1Z2luIHN0ZXBzIGZhaWwgbW9zdC4gKi9cbiAgYXN5bmMgZ2V0QWN0aW9uRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QWN0aW9uRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxBY3Rpb25GYWlsdXJlPihgYWN0aW9uLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmFjdGlvbl9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLmFjdGlvbl9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgZS5hY3Rpb25fbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFcnJvciBjYXRlZ29yaXphdGlvbiDigJQgZ3JvdXAgZmFpbHVyZSBtZXNzYWdlcy4gRXhlY3V0aW9uIHJlcG9ydCwgc29cbiAgICogcm9sbHVwLWF3YXJlIGV4YWN0bHkgbGlrZSB0aGUgc2libGluZyBleGVjdXRpb24gcmVwb3J0czogd2l0aCBgb3JnSWRzYFxuICAgKiAodGhlIG9yZ+KGknRlYW0gc3VidHJlZSkgdGhlIG9yZyBnYXRlIGJlY29tZXMgYW4gYElOICguLi4pYCBhbmQgdGhlIHJlYWQgcnVuc1xuICAgKiBmcmVzaCB1bmRlciBzeXNhZG1pbiB2aWEgYHJ1blJlcG9ydGA7IHNpbmdsZS1vcmcgcmVhZHMga2VlcCB0aGUgcGVyLW9yZyBjYWNoZS5cbiAgICovXG4gIGFzeW5jIGdldEVycm9ycyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCwgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEVycm9yRW50cnlbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8RXJyb3JFbnRyeT4oYGVycm9yczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgU1VCU1RSSU5HKGUuZXJyb3JfbWVzc2FnZSBGUk9NIDEgRk9SIDIwMCkgQVMgZXJyb3JfcGF0dGVybixcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIENPVU5UKERJU1RJTkNUIGUucGlwZWxpbmVfaWQpOjppbnQgQVMgYWZmZWN0ZWRfcGlwZWxpbmVzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnIEFORCBlLmVycm9yX21lc3NhZ2UgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBlcnJvcl9wYXR0ZXJuIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3VyIERPUkEgbWVhc3VyZXMgcGx1cyB0aGVpciBwZXItZW52aXJvbm1lbnQgYnJlYWtkb3duLlxuICAgKiBJbXBsZW1lbnRhdGlvbiBpbiAuL3JlcG9ydGluZy9kb3JhLnRzIOKAlCBzZWUgdGhhdCBmaWxlJ3MgaGVhZGVyIGZvciB3aHkuXG4gICAqL1xuICBnZXREb3JhTWV0cmljcyhcbiAgICBvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPERvcmFNZXRyaWNzPiB7XG4gICAgcmV0dXJuIGRvcmFNZXRyaWNzKG9yZ0lkLCBmcm9tLCB0bywgb3JnSWRzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKiBET1JBIG1lYXN1cmVzIGJ1Y2tldGVkIG92ZXIgdGltZS4gKi9cbiAgZ2V0RG9yYVRyZW5kKFxuICAgIG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYVRyZW5kUG9pbnRbXT4ge1xuICAgIHJldHVybiBkb3JhVHJlbmQob3JnSWQsIGludGVydmFsLCBmcm9tLCB0bywgb3JnSWRzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKiBQZXItcGlwZWxpbmUgYnVpbGQgaGVhbHRoIChzdGFnZSBwYXNzIHJhdGVzIG92ZXIgYSB3aW5kb3cpLiAqL1xuICBnZXRCdWlsZEhlYWx0aChcbiAgICBvcmdJZDogc3RyaW5nLCBwaXBlbGluZUlkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sXG4gICk6IFByb21pc2U8QnVpbGRIZWFsdGg+IHtcbiAgICByZXR1cm4gYnVpbGRIZWFsdGgob3JnSWQsIHBpcGVsaW5lSWQsIGZyb20sIHRvLCBvcmdJZHMpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UGx1Z2luU3VtbWFyeShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5TdW1tYXJ5PiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tc3VtbWFyeWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgTk9UICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgaW5hY3RpdmUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAncHVibGljJyk6OmludCBBUyBwdWJsaWMsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAnb3JnJyk6OmludCBBUyBvcmcsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAncHJpdmF0ZScpOjppbnQgQVMgcHJpdmF0ZSxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCAke3NjaGVtYS5wbHVnaW4ubmFtZX0pOjppbnQgQVMgdW5pcXVlX25hbWVzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgIGApKTtcbiAgICAgIHJldHVybiAoZHJpenpsZVJvd3M8UGx1Z2luU3VtbWFyeT4ocm93cy5yb3dzKVswXSB8fCB7IHRvdGFsOiAwLCBhY3RpdmU6IDAsIGluYWN0aXZlOiAwLCBwdWJsaWM6IDAsIG9yZzogMCwgcHJpdmF0ZTogMCwgdW5pcXVlTmFtZXM6IDAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogVHlwZSAmIGNvbXB1dGUgZGlzdHJpYnV0aW9uLlxuICAgKiAgSU5URU5USU9OQUxMWSBTSU5HTEUtT1JHIChubyByb2xsdXApOiBwbHVnaW4gaW52ZW50b3J5IGlzIHBlci1vcmcgKHNlZVxuICAgKiAgZ2V0UGx1Z2luU3VtbWFyeSkuIFNpbmdsZSBgPSAkb3JnYCBzY29wZS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luRGlzdHJpYnV0aW9uKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uW10+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi1kaXN0cmlidXRpb25gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSBBUyBwbHVnaW5fdHlwZSxcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9IEFTIGNvbXB1dGVfdHlwZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGNvdW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSwgJHtzY2hlbWEucGx1Z2luLmNvbXB1dGVUeXBlfVxuICAgICAgICBPUkRFUiBCWSBjb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VHlwZUNvbXB1dGVEaXN0cmlidXRpb24+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIFZlcnNpb24gY291bnRzIHBlciBwbHVnaW4gbmFtZS5cbiAgICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBwZXItb3JnIChzZWVcbiAgICogIGdldFBsdWdpblN1bW1hcnkpLiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4gIGFzeW5jIGdldFBsdWdpblZlcnNpb25zKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFZlcnNpb25Db3VudFtdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tdmVyc2lvbnNgLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5uYW1lfSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHZlcnNpb25fY291bnQsXG4gICAgICAgICAgLS0gSGlnaGVzdCB2ZXJzaW9uIGJ5IE5VTUVSSUMgc2VtdmVyIGNvcmUgKG5vdCBsZXhpY2FsOiAnMTAuMC4wJyA+ICc5LjAuMCcpLlxuICAgICAgICAgIC0tIFN0cmlwIGFueSAtcHJlcmVsZWFzZS8rYnVpbGQgc3VmZml4IGJlZm9yZSB0aGUgaW50W10gY2FzdCBzbyBpdCBjYW4ndFxuICAgICAgICAgIC0tIGVycm9yIG9uIHZhbGlkIHNlbXZlcjsga2VlcCB0aGUgb3JpZ2luYWwgc3RyaW5nIGZvciBkaXNwbGF5LlxuICAgICAgICAgIC0tIEdVQVJEOiBhIG5vbi1udW1lcmljLWRvdHRlZCB2ZXJzaW9uICgnbGF0ZXN0JywgJycsICd2MScpIHdvdWxkIG1ha2UgdGhlXG4gICAgICAgICAgLS0gOjppbnRbXSBjYXN0IHRocm93IGFuZCBibG93IHVwIHRoZSBXSE9MRSBvcmcgc3VtbWFyeS4gT25seSBjYXN0IHJvd3NcbiAgICAgICAgICAtLSB3aG9zZSBzdHJpcHBlZCBjb3JlIG1hdGNoZXMgYSBudW1lcmljLWRvdHRlZCBzaGFwZTsgc29ydCBldmVyeXRoaW5nXG4gICAgICAgICAgLS0gZWxzZSB0byB0aGUgYm90dG9tIHZpYSBhIHNlbnRpbmVsIEFSUkFZWy0xXSBzbyB0aGUgcm93IHN0aWxsIGNvdW50cy5cbiAgICAgICAgICAoYXJyYXlfYWdnKCR7c2NoZW1hLnBsdWdpbi52ZXJzaW9ufVxuICAgICAgICAgICAgIE9SREVSIEJZIENBU0VcbiAgICAgICAgICAgICAgIFdIRU4gcmVnZXhwX3JlcGxhY2UoJHtzY2hlbWEucGx1Z2luLnZlcnNpb259LCAnWy0rXS4qJCcsICcnKSB+ICdeWzAtOV0rKFsuXVswLTldKykqJCdcbiAgICAgICAgICAgICAgICAgVEhFTiBzdHJpbmdfdG9fYXJyYXkocmVnZXhwX3JlcGxhY2UoJHtzY2hlbWEucGx1Z2luLnZlcnNpb259LCAnWy0rXS4qJCcsICcnKSwgJy4nKTo6aW50W11cbiAgICAgICAgICAgICAgIEVMU0UgQVJSQVlbLTFdXG4gICAgICAgICAgICAgRU5EIERFU0NcbiAgICAgICAgICApKVsxXSBBUyBsYXRlc3RfdmVyc2lvbixcbiAgICAgICAgICBib29sX29yKCR7c2NoZW1hLnBsdWdpbi5pc0RlZmF1bHR9KSBBUyBoYXNfZGVmYXVsdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ubmFtZX1cbiAgICAgICAgT1JERVIgQlkgdmVyc2lvbl9jb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VmVyc2lvbkNvdW50PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBzdWNjZXNzIHJhdGUgb3ZlciB0aW1lLlxuICAgKlxuICAgKiBTVEFUVVMgQ0FTSU5HIE5PVEU6IFRoaXMgcXVlcnkgZmlsdGVycyBieSBgZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdgXG4gICAqIGFuZCB1c2VzIGxvd2VyY2FzZSBzdGF0dXMgdmFsdWVzIChgJ2NvbXBsZXRlZCdgLCBgJ2ZhaWxlZCdgKSwgd2hpbGVcbiAgICogYGdldFN1Y2Nlc3NSYXRlYCAoMS4yKSBmaWx0ZXJzIGJ5IGBldmVudF90eXBlID0gJ1BJUEVMSU5FJ2Agd2l0aFxuICAgKiB1cHBlcmNhc2UgQVdTLXN0eWxlIHN0YXR1c2VzIChgJ1NVQ0NFRURFRCdgLCBgJ0ZBSUxFRCdgLCBgJ0NBTkNFTEVEJ2ApLlxuICAgKiBUaGUgY2FzaW5nIGRyaWZ0IGlzIGludGVudGlvbmFsIGFuZCB0cmFja3MgdGhlIHByb2R1Y2VyOlxuICAgKiAgIC0gYHBsdWdpbi1idWlsZGAgZXZlbnRzIGNvbWUgZnJvbSBvdXIgb3duIGJ1aWxkIHBpcGVsaW5lIChsb3dlcmNhc2UpXG4gICAqICAgLSBgUElQRUxJTkVgIGV2ZW50cyBjb21lIGZyb20gQVdTIENvZGVQaXBlbGluZSAodXBwZXJjYXNlKVxuICAgKiBUaGUgaW5nZXN0IFpvZCBzY2hlbWEgYXQgYXBpL3JlcG9ydGluZy9zcmMvcm91dGVzL2V2ZW50LWluZ2VzdC50c1xuICAgKiBTSE9VTEQgZW51bSB0aGVzZSBwZXItZXZlbnRTb3VyY2Ugc28gd2UgY2F0Y2ggZHJpZnQgYXQgaW5nZXN0IHJhdGhlclxuICAgKiB0aGFuIHNpbGVudGx5IHByb2R1Y2luZyB6ZXJvIHJvd3MgaGVyZS4gU2VlIGZpbmRpbmdzIE43MS5cbiAgICovXG4gIGFzeW5jIGdldEJ1aWxkU3VjY2Vzc1JhdGUoXG4gICAgb3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgICBidWNrZXQ6IEJ1Y2tldE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxCdWlsZFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHsgdHogPSAnVVRDJywgd2Vla1N0YXJ0ID0gJ21vbmRheScgfSA9IGJ1Y2tldDtcbiAgICAvLyBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZSBsaWtlIHRoZSBleGVjdXRpb24gcmVwb3J0cy4gVGhlc2VcbiAgICAvLyByb3dzIGFyZSBnYXRlZCBvbiB0aGUgcGlwZWxpbmVfZXZlbnQgYG9yZ19pZGAgZGlyZWN0bHkgKG5vIHBpcGVsaW5lIGpvaW4pLFxuICAgIC8vIHNvIGBwcmVkYCBhcHBsaWVzIHRvIGBlLm9yZ19pZGAuXG4gICAgcmV0dXJuIHJlcG9ydDxCdWlsZFRpbWVTZXJpZXNFbnRyeT4oYGJ1aWxkLXN1Y2Nlc3M6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfToke2J1Y2tldEtleSh0eiwgd2Vla1N0YXJ0KX1gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3BlcmlvZEJ1Y2tldChpbnRlcnZhbCwgc3FsYGUuc3RhcnRlZF9hdGAsIHR6LCB3ZWVrU3RhcnQpfTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2ZhaWxlZCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnY29tcGxldGVkJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnY29tcGxldGVkJywgJ2ZhaWxlZCcpXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCk7XG4gIH1cblxuICAvKiogQnVpbGQgZHVyYXRpb24gcGVyIHBsdWdpbi4gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUuICovXG4gIGFzeW5jIGdldEJ1aWxkRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QnVpbGREdXJhdGlvbltdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxCdWlsZER1cmF0aW9uPihgYnVpbGQtZHVyYXRpb246JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBidWlsZHNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCcgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKiogQnVpbGQgZmFpbHVyZXMg4oCUIHRvcCBlcnJvciBtZXNzYWdlcy4gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUuICovXG4gIGFzeW5jIGdldEJ1aWxkRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMjAsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxCdWlsZEZhaWx1cmVbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8QnVpbGRGYWlsdXJlPihgYnVpbGQtZmFpbHVyZXM6JHtmcm9tfToke3RvfToke2xpbWl0fWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIGUuZXJyb3JfbWVzc2FnZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5zdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIHBsdWdpbl9uYW1lLCBlLmVycm9yX21lc3NhZ2VcbiAgICAgICAgT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCk7XG4gIH1cblxuICAvLyDilIDilIAgUGx1Z2luIHJ1bnRpbWUgdGVsZW1ldHJ5IOKAlCBzZWUgLi9yZXBvcnRpbmcvcGx1Z2luLXJ1bnRpbWUudHMg4pSA4pSAXG5cbiAgLyoqXG4gICAqIFBsdWdpbiBydW50aW1lOiBwZXIgcGx1Z2luIHZlcnNpb24gcnVucywgc3VjY2VzcyByYXRlIGFuZCBwNTAvcDk1XG4gICAqIGR1cmF0aW9uIG92ZXIgYFtmcm9tLCB0b11gLCBmcm9tIHRoZSBtYW5pZmVzdC1hdHRyaWJ1dGVkIEFDVElPTiBldmVudHMuXG4gICAqIFJvbGx1cC1hd2FyZS5cbiAgICovXG4gIGFzeW5jIGdldFBsdWdpblJ1bnRpbWUob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBmaWx0ZXI/OiBQbHVnaW5SdW50aW1lRmlsdGVyLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luUnVudGltZVN0YXRzW10+IHtcbiAgICByZXR1cm4gcGx1Z2luUnVudGltZShvcmdJZCwgZnJvbSwgdG8sIGZpbHRlciwgb3JnSWRzKTtcbiAgfVxuXG4gIC8qKiBDcm9zcy1vcmcgMzAtZGF5IHJ1bnRpbWUgYWdncmVnYXRlIGZvciBhIGAocHVibGlzaGVyLCBuYW1lKWAgbGlzdGluZyAocGx1Z2luX3N0YXRzIGlucHV0KS4gU2VydmljZSBjYWxsZXJzIG9ubHkuICovXG4gIGFzeW5jIGdldFBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUocHVibGlzaGVyOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGx1Z2luUnVudGltZUFnZ3JlZ2F0ZT4ge1xuICAgIHJldHVybiBwbHVnaW5SdW50aW1lQWdncmVnYXRlKHB1Ymxpc2hlciwgbmFtZSk7XG4gIH1cblxuICAvKiogUmV2aWV3IFwidmVyaWZpZWQgdXNlXCI6IGBvcmdJZGAgcmFuIGAocHVibGlzaGVyLCBuYW1lKWAgc3VjY2Vzc2Z1bGx5IHdpdGhpbiA5MCBkYXlzLiBTZXJ2aWNlIGNhbGxlcnMgb25seS4gKi9cbiAgYXN5bmMgaGFzVmVyaWZpZWRQbHVnaW5Vc2Uob3JnSWQ6IHN0cmluZywgcHVibGlzaGVyOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB2ZXJpZmllZFBsdWdpblVzZShvcmdJZCwgcHVibGlzaGVyLCBuYW1lKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAzOiBET1JBIHdyaXRlIHBhdGhzIChwb3N0LWRlcGxveSBvdXRjb21lcyArIGluZ2VzdCBoZWFsdGgpIOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBtYW51YWwgcG9zdC1kZXBsb3kgb3V0Y29tZSBtYXJrZXI6IGEgdXNlciBtYXJrcyBhXG4gICAqIGRlcGxveW1lbnQgYGZhaWxlZGAgKGEgcHJvZHVjdGlvbiBpbmNpZGVudCBsaW5rZWQgdG8gdGhlIGRlcGxveSkgb3JcbiAgICogYHJlc3RvcmVkYCAocmVjb3ZlcmVkKS4gSWRlbXBvdGVudCDigJQga2V5ZWQgb24gKGV4ZWN1dGlvbl9pZCwgb3V0Y29tZSkgc28gYVxuICAgKiBkdXBsaWNhdGUgUE9TVCByZWZyZXNoZXMgYGF0YCByYXRoZXIgdGhhbiBkb3VibGUtY291bnRpbmcsIHdoaWxlIGFcbiAgICogZmFpbGVk4oaScmVzdG9yZWQgcGFpciBzdGF5cyB0d28gcm93cy4gRmVlZHMgdGhlIHBvc3QtZGVwbG95IENGUiBjb21wb25lbnQgYW5kXG4gICAqIHRoZSByZWFsIE1UVFIuIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0IChSTFMgV0lUSCBDSEVDSykuXG4gICAqL1xuICBhc3luYyByZWNvcmREZXBsb3ltZW50T3V0Y29tZShcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgaW5wdXQ6IHsgb3V0Y29tZTogJ2ZhaWxlZCcgfCAncmVzdG9yZWQnOyBhdDogc3RyaW5nOyBlbnZpcm9ubWVudD86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLmRlcGxveW1lbnRPdXRjb21lKS52YWx1ZXMoe1xuICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgb3JnSWQsXG4gICAgICAgIGVudmlyb25tZW50OiBzY3J1Yk9wdGlvbmFsKGlucHV0LmVudmlyb25tZW50KSxcbiAgICAgICAgb3V0Y29tZTogaW5wdXQub3V0Y29tZSxcbiAgICAgICAgYXQ6IG5ldyBEYXRlKGlucHV0LmF0KSxcbiAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogW3NjaGVtYS5kZXBsb3ltZW50T3V0Y29tZS5leGVjdXRpb25JZCwgc2NoZW1hLmRlcGxveW1lbnRPdXRjb21lLm91dGNvbWVdLFxuICAgICAgICBzZXQ6IHtcbiAgICAgICAgICBhdDogbmV3IERhdGUoaW5wdXQuYXQpLFxuICAgICAgICAgIGVudmlyb25tZW50OiBzY3J1Yk9wdGlvbmFsKGlucHV0LmVudmlyb25tZW50KSA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgfSkpLFxuICAgICk7XG4gICAgLy8gT3V0Y29tZSBjaGFuZ2VzIHRoZSBET1JBIGFnZ3JlZ2F0ZSDigJQgZHJvcCB0aGUgb3JnJ3MgY2FjaGVkIHJlcG9ydHMuXG4gICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlT3JnKG9yZ0lkKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5nZXN0IGEgcHJvZHVjdGlvbiBpbmNpZGVudCBmcm9tIHRoZSBvcmcncyBpbmNpZGVudCB0b29saW5nXG4gICAqIChQYWdlckR1dHkgLyBEYXRhZG9nIC8gQWxlcnRtYW5hZ2VyIHdlYmhvb2spLiBJZGVtcG90ZW50IOKAlCBrZXllZCBvblxuICAgKiAob3JnX2lkLCBpbmNpZGVudF9pZCkgc28gYSBsYXRlciByZXNvbHZlIHJlLXBvc3QgdXBzZXJ0cyBgcmVzb2x2ZWRfYXRgXG4gICAqIChhbmQgcmVmcmVzaGVzIHRoZSBvdGhlciBtdXRhYmxlIGZpZWxkcykgaW5zdGVhZCBvZiBpbnNlcnRpbmcgYSBkdXBsaWNhdGUuXG4gICAqIERPUkEgY29ycmVsYXRlcyBlYWNoIGluY2lkZW50IHRvIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSB0byBpdHNcbiAgICogYGVudmlyb25tZW50YCwgcHJvZHVjaW5nIGFuIGF1dG9tYXRlZCBwb3N0LWRlcGxveSBmYWlsdXJlICsgYSByZWFsIE1UVFIuXG4gICAqIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0IChSTFMgV0lUSCBDSEVDSyk7IGZyZWUtZm9ybSBmaWVsZHMgYXJlXG4gICAqIEFXUy1pZCBzY3J1YmJlZCBhdCB0aGlzIHBlcnNpc3RlbmNlIGJvdW5kYXJ5IGxpa2UgdGhlIG90aGVyIGluZ2VzdCBwYXRocy5cbiAgICovXG4gIGFzeW5jIHJlY29yZEluY2lkZW50KG9yZ0lkOiBzdHJpbmcsIGlucHV0OiBJbmNpZGVudElucHV0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5jaWRlbnRJZCA9IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGlucHV0LmluY2lkZW50SWQpO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoaW5wdXQuZW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IHNldmVyaXR5ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoaW5wdXQuc2V2ZXJpdHkpO1xuICAgIGNvbnN0IG9wZW5lZEF0ID0gbmV3IERhdGUoaW5wdXQub3BlbmVkQXQpO1xuICAgIGNvbnN0IHJlc29sdmVkQXQgPSBpbnB1dC5yZXNvbHZlZEF0ID8gbmV3IERhdGUoaW5wdXQucmVzb2x2ZWRBdCkgOiBudWxsO1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuaW5jaWRlbnQpLnZhbHVlcyh7XG4gICAgICAgIGluY2lkZW50SWQsXG4gICAgICAgIG9yZ0lkLFxuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgb3BlbmVkQXQsXG4gICAgICAgIHJlc29sdmVkQXQsXG4gICAgICAgIHNldmVyaXR5LFxuICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBbc2NoZW1hLmluY2lkZW50Lm9yZ0lkLCBzY2hlbWEuaW5jaWRlbnQuaW5jaWRlbnRJZF0sXG4gICAgICAgIC8vIEEgcmVkZWxpdmVyZWQgRklSSU5HIHBvc3QgKG5vIHJlc29sdmVkQXQpIG11c3Qgbm90IHdpcGUgYSByZWNvcmRlZFxuICAgICAgICAvLyByZXNvbHZlIOKAlCBzZW5kZXJzIHJlLXBvc3QgZmlyaW5nIGFsZXJ0cyBvbiBldmVyeSByZXBlYXQgaW50ZXJ2YWwsIGFuZFxuICAgICAgICAvLyBkZWxpdmVyeSBvcmRlciBpc24ndCBndWFyYW50ZWVkLiBLZWVwIHRoZSBzdG9yZWQgcmVzb2x2ZSB1bmxlc3MgdGhlXG4gICAgICAgIC8vIHBvc3QgY2FycmllcyBpdHMgb3duLCBvciB0aGUgaW5jaWRlbnQgd2FzIFJFLU9QRU5FRCAoYSBkaWZmZXJlbnRcbiAgICAgICAgLy8gb3BlbmVkQXQgbWVhbnMgYSBuZXcgb2NjdXJyZW5jZSwgd2hvc2UgcmVzb2x2ZSBzdGF0ZSBpcyB0aGUgcG9zdCdzKS5cbiAgICAgICAgc2V0OiB7XG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgICAgb3BlbmVkQXQsXG4gICAgICAgICAgcmVzb2x2ZWRBdDogc3FsYENBU0UgV0hFTiAke3NjaGVtYS5pbmNpZGVudC5vcGVuZWRBdH0gPSBleGNsdWRlZC5vcGVuZWRfYXRcbiAgICAgICAgICAgIFRIRU4gQ09BTEVTQ0UoZXhjbHVkZWQucmVzb2x2ZWRfYXQsICR7c2NoZW1hLmluY2lkZW50LnJlc29sdmVkQXR9KVxuICAgICAgICAgICAgRUxTRSBleGNsdWRlZC5yZXNvbHZlZF9hdCBFTkRgLFxuICAgICAgICAgIHNldmVyaXR5LFxuICAgICAgICB9LFxuICAgICAgfSkpLFxuICAgICk7XG4gICAgLy8gQSBuZXcvdXBkYXRlZCBpbmNpZGVudCBjaGFuZ2VzIHRoZSBET1JBIGFnZ3JlZ2F0ZSDigJQgZHJvcCBjYWNoZWQgcmVwb3J0cy5cbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVPcmcob3JnSWQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBwZXItb3JnIERPUkEgc2V0dGluZ3MuIFJldHVybnMgdGhlIHN0b3JlZFxuICAgKiBgaW5jaWRlbnRXaW5kb3dIb3Vyc2Agb3ZlcnJpZGUgKG9yIGBudWxsYCB3aGVuIHVuc2V0KSBwbHVzIHRoZSBnbG9iYWwgZW52XG4gICAqIGRlZmF1bHQsIHNvIHRoZSBzZXR0aW5ncyBVSSBjYW4gc2hvdyBib3RoLiBSdW5zIHVuZGVyIHRoZSBjYWxsZXIncyB0ZW5hbnRcbiAgICogY29udGV4dCAoUkxTLXNjb3BlZCk7IGEgc2luZ2xlLW9yZyByZWFkLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmVwb3J0aW5nU2V0dGluZ3Mob3JnSWQ6IHN0cmluZywgcmV0ZW50aW9uT3JnSWQ6IHN0cmluZyA9IG9yZ0lkKTogUHJvbWlzZTxSZXBvcnRpbmdTZXR0aW5ncz4ge1xuICAgIGNvbnN0IHJvd3MgPSBkcml6emxlUm93czx7XG4gICAgICBpbmNpZGVudF93aW5kb3dfaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgICBldmVudF9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGRvcmFfcmV0ZW50aW9uX2RheXM6IG51bWJlciB8IG51bGw7XG4gICAgfT4oKGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1QgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmluY2lkZW50V2luZG93SG91cnN9IEFTIGluY2lkZW50X3dpbmRvd19ob3VycyxcbiAgICAgICAgICAgICAgICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5ldmVudFJldGVudGlvbkRheXN9IEFTIGV2ZW50X3JldGVudGlvbl9kYXlzLFxuICAgICAgICAgICAgICAgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmRvcmFSZXRlbnRpb25EYXlzfSBBUyBkb3JhX3JldGVudGlvbl9kYXlzXG4gICAgICAgIEZST00gJHtzY2hlbWEuZG9yYVNldHRpbmdzfVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgYCkpKS5yb3dzKTtcbiAgICBjb25zdCByb3cgPSByb3dzWzBdO1xuICAgIC8vIFJldGVudGlvbiBpcyBhIGJpbGxpbmcgZW50aXRsZW1lbnQgc3luY2VkIG9udG8gdGhlIGFjY291bnQgUk9PVCBvbmx5OyBhXG4gICAgLy8gdGVhbSByZWFkcyBpdHMgcm9vdCdzIHdpbmRvdyAodGhlIGluY2lkZW50IHdpbmRvdyBzdGF5cyB0aGUgdGVhbSdzIG93bikuXG4gICAgY29uc3QgcmV0ZW50aW9uID0gcmV0ZW50aW9uT3JnSWQgPT09IG9yZ0lkXG4gICAgICA/IHJvd1xuICAgICAgOiBhd2FpdCB0aGlzLiNyZWFkUmV0ZW50aW9uT3ZlcnJpZGUocmV0ZW50aW9uT3JnSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBpbmNpZGVudFdpbmRvd0hvdXJzOiByb3c/LmluY2lkZW50X3dpbmRvd19ob3VycyAhPSBudWxsID8gTnVtYmVyKHJvdy5pbmNpZGVudF93aW5kb3dfaG91cnMpIDogbnVsbCxcbiAgICAgIGRlZmF1bHRXaW5kb3dIb3VyczogRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlMsXG4gICAgICBldmVudFJldGVudGlvbkRheXM6IHJldGVudGlvbj8uZXZlbnRfcmV0ZW50aW9uX2RheXMgIT0gbnVsbCA/IE51bWJlcihyZXRlbnRpb24uZXZlbnRfcmV0ZW50aW9uX2RheXMpIDogbnVsbCxcbiAgICAgIGRvcmFSZXRlbnRpb25EYXlzOiByZXRlbnRpb24/LmRvcmFfcmV0ZW50aW9uX2RheXMgIT0gbnVsbCA/IE51bWJlcihyZXRlbnRpb24uZG9yYV9yZXRlbnRpb25fZGF5cykgOiBudWxsLFxuICAgICAgZGVmYXVsdEV2ZW50UmV0ZW50aW9uRGF5czogUkVQT1JUSU5HX0VWRU5UX1JFVEVOVElPTl9EQVlTLFxuICAgICAgZGVmYXVsdERvcmFSZXRlbnRpb25EYXlzOiBSRVBPUlRJTkdfRE9SQV9SRVRFTlRJT05fREFZUyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBST09UIG9yZydzIHN0b3JlZCByZXRlbnRpb24gb3ZlcnJpZGUuIFRoZSBjYWxsZXIgKGEgdGVhbSkgY2FuJ3Qgc2VlIHRoZVxuICAgKiByb290J3MgYGRvcmFfc2V0dGluZ3NgIHJvdyB1bmRlciBpdHMgb3duIFJMUyBzY29wZSwgc28gdGhpcyBuYXJyb3cgcmVhZCBvZlxuICAgKiB0d28gaW50ZWdlciBjb2x1bW5zIOKAlCBrZXllZCBieSB0aGUgZXhwbGljaXQsIEpXVC1kZXJpdmVkIHJvb3QgaWQg4oCUIHJ1bnMgaW4gYVxuICAgKiBzeXNhZG1pbiBzY29wZS5cbiAgICovXG4gIGFzeW5jICNyZWFkUmV0ZW50aW9uT3ZlcnJpZGUob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8eyBldmVudF9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDsgZG9yYV9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbCB9IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IGRyaXp6bGVSb3dzPHtcbiAgICAgIGV2ZW50X3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgICAgZG9yYV9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDtcbiAgICB9PigoYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVCAke3NjaGVtYS5kb3JhU2V0dGluZ3MuZXZlbnRSZXRlbnRpb25EYXlzfSBBUyBldmVudF9yZXRlbnRpb25fZGF5cyxcbiAgICAgICAgICAgICAgICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5kb3JhUmV0ZW50aW9uRGF5c30gQVMgZG9yYV9yZXRlbnRpb25fZGF5c1xuICAgICAgICBGUk9NICR7c2NoZW1hLmRvcmFTZXR0aW5nc31cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkfSA9ICR7b3JnSWR9XG4gICAgICAgIExJTUlUIDFcbiAgICAgIGApKSkucm93cykpO1xuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwc2VydCBwZXItb3JnIHJlcG9ydGluZyBzZXR0aW5ncyAoaW5jaWRlbnQgd2luZG93ICtcbiAgICogcmV0ZW50aW9uIG92ZXJyaWRlcyksIGlkZW1wb3RlbnQgb24gYG9yZ19pZGAuIEEgcGFydGlhbCB3cml0ZSDigJQgb25seSB0aGVcbiAgICogZmllbGRzIHByZXNlbnQgaW4gYHBhdGNoYCBhcmUgc2V0IChzbyB1cGRhdGluZyByZXRlbnRpb24gbmV2ZXIgY2xlYXJzIHRoZVxuICAgKiBpbmNpZGVudCB3aW5kb3csIGFuZCB2aWNlLXZlcnNhKS4gU2V0IHNlbGYtc2VydmUgYnkgYW4gb3JnIGFkbWluIHZpYVxuICAgKiBgUFVUIC9hcGkvcmVwb3J0cy9zZXR0aW5ncy9pbmNpZGVudHNgLiBSdW5zIHVuZGVyIHRoZSBjYWxsZXIncyBvcmcgY29udGV4dFxuICAgKiAoUkxTIFdJVEggQ0hFQ0spOyBhIGNoYW5nZWQgdmFsdWUgYWZmZWN0cyBET1JBIGFnZ3JlZ2F0ZXMgc28gdGhlIG9yZydzXG4gICAqIGNhY2hlZCByZXBvcnRzIGFyZSBkcm9wcGVkLlxuICAgKi9cbiAgYXN5bmMgc2V0UmVwb3J0aW5nU2V0dGluZ3Mob3JnSWQ6IHN0cmluZywgcGF0Y2g6IFJlcG9ydGluZ1NldHRpbmdzUGF0Y2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfTtcbiAgICBpZiAocGF0Y2guaW5jaWRlbnRXaW5kb3dIb3VycyAhPT0gdW5kZWZpbmVkKSBzZXQuaW5jaWRlbnRXaW5kb3dIb3VycyA9IHBhdGNoLmluY2lkZW50V2luZG93SG91cnM7XG4gICAgaWYgKHBhdGNoLmV2ZW50UmV0ZW50aW9uRGF5cyAhPT0gdW5kZWZpbmVkKSBzZXQuZXZlbnRSZXRlbnRpb25EYXlzID0gcGF0Y2guZXZlbnRSZXRlbnRpb25EYXlzO1xuICAgIGlmIChwYXRjaC5kb3JhUmV0ZW50aW9uRGF5cyAhPT0gdW5kZWZpbmVkKSBzZXQuZG9yYVJldGVudGlvbkRheXMgPSBwYXRjaC5kb3JhUmV0ZW50aW9uRGF5cztcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLmRvcmFTZXR0aW5ncykudmFsdWVzKHtcbiAgICAgICAgb3JnSWQsXG4gICAgICAgIGluY2lkZW50V2luZG93SG91cnM6IHBhdGNoLmluY2lkZW50V2luZG93SG91cnMsXG4gICAgICAgIGV2ZW50UmV0ZW50aW9uRGF5czogcGF0Y2guZXZlbnRSZXRlbnRpb25EYXlzLFxuICAgICAgICBkb3JhUmV0ZW50aW9uRGF5czogcGF0Y2guZG9yYVJldGVudGlvbkRheXMsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCxcbiAgICAgICAgc2V0LFxuICAgICAgfSkpLFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlT3JnKG9yZ0lkKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCByZWNlbnQgaW5jaWRlbnRzIGZvciBhbiBvcmcgKG9yZy1hZG1pbiBzdXJmYWNlKSwgbmV3ZXN0IGZpcnN0LFxuICAgKiBwYWdpbmF0ZWQuIEVhY2ggcm93IGNhcnJpZXMgaXRzIHJlc29sdmVkIHN0YXRlIGFuZCBpdHMgZGVwbG95IGNvcnJlbGF0aW9uIOKAlFxuICAgKiB0aGUgbW9zdCByZWNlbnQgU1VDQ0VTU0ZVTCBkZXBsb3kgdG8gdGhlIGluY2lkZW50J3MgYGVudmlyb25tZW50YCB3aG9zZVxuICAgKiBgY29tcGxldGVkX2F0YCBmYWxscyB3aXRoaW4gdGhlIGVmZmVjdGl2ZSBwZXItb3JnIGNvcnJlbGF0aW9uIHdpbmRvdyBiZWZvcmVcbiAgICogYG9wZW5lZF9hdGAgKHRoZSBzYW1lIHJ1bGUgRE9SQSdzIENGUi9NVFRSIGNvcnJlbGF0aW9uIGFwcGxpZXMpLiBTaW5nbGUtb3JnXG4gICAqIChubyByb2xsdXApIOKAlCBhbiBvcmcgYWRtaW4gdmlld3MgdGhlaXIgb3duIG9yZydzIGluY2lkZW50cy4gUkxTLXNjb3BlZCB2aWFcbiAgICogdGhlIGBwLm9yZ19pZGAvYGkub3JnX2lkYCBwcmVkaWNhdGVzICsgdGhlIHRlbmFudCBjb250ZXh0LlxuICAgKi9cbiAgYXN5bmMgbGlzdEluY2lkZW50cyhvcmdJZDogc3RyaW5nLCBvcHRzOiB7IGxpbWl0OiBudW1iZXI7IG9mZnNldDogbnVtYmVyIH0pOiBQcm9taXNlPEluY2lkZW50TGlzdEl0ZW1bXT4ge1xuICAgIGNvbnN0IHsgaW5jaWRlbnRXaW5kb3dIb3VycyB9ID0gYXdhaXQgdGhpcy5nZXRSZXBvcnRpbmdTZXR0aW5ncyhvcmdJZCk7XG4gICAgY29uc3Qgd2luZG93SG91cnMgPSByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyhpbmNpZGVudFdpbmRvd0hvdXJzKTtcbiAgICBjb25zdCBsaW1pdCA9IE1hdGgubWF4KDEsIE1hdGgubWluKG9wdHMubGltaXQsIDIwMCkpO1xuICAgIGNvbnN0IG9mZnNldCA9IE1hdGgubWF4KDAsIG9wdHMub2Zmc2V0KTtcbiAgICAvLyBUaGUgY29ycmVsYXRpb24gd2luZG93IGlzIGV4cHJlc3NlZCBpbiBTRUNPTkRTIGFzIGEgZG91YmxlLCBub3QgYXNcbiAgICAvLyBgbWFrZV9pbnRlcnZhbChob3VycyA9PiBOOjppbnQpYC4gVGhlIHdpbmRvdyBpcyB2YWxpZGF0ZWQgYXMgYW55IHBvc2l0aXZlXG4gICAgLy8gbnVtYmVyICgwLjVoIGlzIGxlZ2FsKSBhbmQgdGhlIGluLW1lbW9yeSBET1JBIGNvcnJlbGF0aW9uIHVzZXMgaXQgZXhhY3RseTtcbiAgICAvLyB0aGUgaW50IGNhc3QgbWFkZSBQb3N0Z3JlcyByZWplY3QgYSBmcmFjdGlvbmFsIHZhbHVlLCBzbyBhIDAuNWggd2luZG93XG4gICAgLy8gcmV0dXJuZWQgNTAwIGZyb20gdGhpcyBlbmRwb2ludCBhbmQgZnJvbSB0aGUgY29ycmVsYXRpb24gbG9va3VwIGJlbG93LlxuICAgIHJldHVybiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgaS5pbmNpZGVudF9pZCBBUyBcImluY2lkZW50SWRcIixcbiAgICAgICAgICBpLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50LFxuICAgICAgICAgIGkuc2V2ZXJpdHkgQVMgc2V2ZXJpdHksXG4gICAgICAgICAgaS5vcGVuZWRfYXQ6OnRleHQgQVMgXCJvcGVuZWRBdFwiLFxuICAgICAgICAgIGkucmVzb2x2ZWRfYXQ6OnRleHQgQVMgXCJyZXNvbHZlZEF0XCIsXG4gICAgICAgICAgaS5jcmVhdGVkX2F0Ojp0ZXh0IEFTIFwiY3JlYXRlZEF0XCIsXG4gICAgICAgICAgKGkucmVzb2x2ZWRfYXQgSVMgTk9UIE5VTEwpIEFTIHJlc29sdmVkLFxuICAgICAgICAgIGNvcnIuZXhlY3V0aW9uX2lkIEFTIFwiY29ycmVsYXRlZEV4ZWN1dGlvbklkXCIsXG4gICAgICAgICAgY29yci5jb21wbGV0ZWRfYXQ6OnRleHQgQVMgXCJkZXBsb3lDb21wbGV0ZWRBdFwiXG4gICAgICAgIEZST00gJHtzY2hlbWEuaW5jaWRlbnR9IGlcbiAgICAgICAgTEVGVCBKT0lOIExBVEVSQUwgKFxuICAgICAgICAgIFNFTEVDVCBlLmV4ZWN1dGlvbl9pZCwgZS5jb21wbGV0ZWRfYXRcbiAgICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgICAgV0hFUkUgcC5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJ1xuICAgICAgICAgICAgQU5EIGUuZW52aXJvbm1lbnQgPSBpLmVudmlyb25tZW50IEFORCBlLnN0YXR1cyA9ICdTVUNDRUVERUQnXG4gICAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPD0gaS5vcGVuZWRfYXRcbiAgICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA+PSBpLm9wZW5lZF9hdCAtIG1ha2VfaW50ZXJ2YWwoc2VjcyA9PiAke3dpbmRvd0hvdXJzICogMzYwMH06OmRvdWJsZSBwcmVjaXNpb24pXG4gICAgICAgICAgT1JERVIgQlkgZS5jb21wbGV0ZWRfYXQgREVTQ1xuICAgICAgICAgIExJTUlUIDFcbiAgICAgICAgKSBjb3JyIE9OIHRydWVcbiAgICAgICAgV0hFUkUgaS5vcmdfaWQgPSAke29yZ0lkfVxuICAgICAgICBPUkRFUiBCWSBpLm9wZW5lZF9hdCBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9IE9GRlNFVCAke29mZnNldH1cbiAgICAgIGApLnRoZW4oKHIpID0+IGRyaXp6bGVSb3dzPEluY2lkZW50TGlzdEl0ZW0+KHIucm93cykubWFwKChyb3cpID0+ICh7XG4gICAgICAuLi5yb3csXG4gICAgICByZXNvbHZlZDogcm93LnJlc29sdmVkID09PSB0cnVlIHx8IChyb3cucmVzb2x2ZWQgYXMgdW5rbm93bikgPT09ICd0JyxcbiAgICAgIGNvcnJlbGF0ZWRFeGVjdXRpb25JZDogcm93LmNvcnJlbGF0ZWRFeGVjdXRpb25JZCA/PyBudWxsLFxuICAgICAgZGVwbG95Q29tcGxldGVkQXQ6IHJvdy5kZXBsb3lDb21wbGV0ZWRBdCA/PyBudWxsLFxuICAgIH0pKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpcmluZy10ZXN0IGRyeS1ydW46IHdvdWxkIGEgc3ludGhldGljIGluY2lkZW50IG9wZW5pbmcgTk9XIGZvclxuICAgKiBgZW52aXJvbm1lbnRgIGNvcnJlbGF0ZSB0byBhIHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSB1bmRlciB0aGUgb3JnJ3NcbiAgICogZWZmZWN0aXZlIHdpbmRvdz8gVGhpcyBpcyBhIE5PTi1wZXJzaXN0aW5nIGNvcnJlbGF0aW9uIGNoZWNrIOKAlCBpdCB2ZXJpZmllc1xuICAgKiB0aGUgYWRtaW4ncyBlbnZpcm9ubWVudCBuYW1pbmcgKyB3aW5kb3cgbGluZSB1cCB3aXRoIHJlYWwgZGVwbG95IGV2ZW50c1xuICAgKiBXSVRIT1VUIHdyaXRpbmcgYW4gaW5jaWRlbnQgKHNvIGEgXCJ0ZXN0XCIgbmV2ZXIgcG9sbHV0ZXMgQ0ZSL01UVFIpLiBSTFMtc2NvcGVkLlxuICAgKi9cbiAgYXN5bmMgdGVzdEluY2lkZW50Q29ycmVsYXRpb24ob3JnSWQ6IHN0cmluZywgZW52aXJvbm1lbnQ6IHN0cmluZyk6IFByb21pc2U8SW5jaWRlbnRUZXN0UmVzdWx0PiB7XG4gICAgY29uc3QgZW52ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IG9wZW5lZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIGNvbnN0IHsgaW5jaWRlbnRXaW5kb3dIb3VycyB9ID0gYXdhaXQgdGhpcy5nZXRSZXBvcnRpbmdTZXR0aW5ncyhvcmdJZCk7XG4gICAgY29uc3Qgd2luZG93SG91cnMgPSByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyhpbmNpZGVudFdpbmRvd0hvdXJzKTtcbiAgICBjb25zdCByb3dzID0gZHJpenpsZVJvd3M8eyBleGVjdXRpb25faWQ6IHN0cmluZyB8IG51bGw7IGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbCB9PigoYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVCBlLmV4ZWN1dGlvbl9pZCBBUyBleGVjdXRpb25faWQsIGUuY29tcGxldGVkX2F0Ojp0ZXh0IEFTIGNvbXBsZXRlZF9hdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnXG4gICAgICAgICAgQU5EIGUuZW52aXJvbm1lbnQgPSAke2Vudn0gQU5EIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCdcbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPD0gJHtvcGVuZWRBdH06OnRpbWVzdGFtcHR6XG4gICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49ICR7b3BlbmVkQXR9Ojp0aW1lc3RhbXB0eiAtIG1ha2VfaW50ZXJ2YWwoc2VjcyA9PiAke3dpbmRvd0hvdXJzICogMzYwMH06OmRvdWJsZSBwcmVjaXNpb24pXG4gICAgICAgIE9SREVSIEJZIGUuY29tcGxldGVkX2F0IERFU0NcbiAgICAgICAgTElNSVQgMVxuICAgICAgYCkpKS5yb3dzKTtcbiAgICBjb25zdCBoaXQgPSByb3dzWzBdO1xuICAgIHJldHVybiB7XG4gICAgICBlbnZpcm9ubWVudDogZW52LFxuICAgICAgb3BlbmVkQXQsXG4gICAgICB3aW5kb3dIb3VycyxcbiAgICAgIGNvcnJlbGF0ZWQ6IGhpdD8uZXhlY3V0aW9uX2lkICE9IG51bGwsXG4gICAgICBleGVjdXRpb25JZDogaGl0Py5leGVjdXRpb25faWQgPz8gbnVsbCxcbiAgICAgIGRlcGxveUNvbXBsZXRlZEF0OiBoaXQ/LmNvbXBsZXRlZF9hdCA/PyBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVXBzZXJ0IHBlci1vcmcgaW5nZXN0aW9uIGhlYWx0aDogdGhlIEFXUyBldmVudHMgTGFtYmRhIHBlcmlvZGljYWxseVxuICAgKiByZXBvcnRzIGZvcndhcmRlZC9kcm9wcGVkIGNvdW50ZXJzICsgdGhlIGxhc3QgZXZlbnQgdGltZXN0YW1wIHNvIHRoZSBSZXBvcnRzXG4gICAqIFVJIGNhbiBzaG93IGZsb3dpbmcgLyBzdGFsZSAvIGRyb3BwaW5nLiBPbmUgcm93IHBlciBvcmcgKHVwc2VydCBvbiBvcmdfaWQpLlxuICAgKi9cbiAgYXN5bmMgcmVjb3JkSW5nZXN0SGVhbHRoKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgaW5wdXQ6IHsgZm9yd2FyZGVkPzogbnVtYmVyOyBkcm9wcGVkPzogbnVtYmVyOyBsYXN0RXZlbnRBdD86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsYXN0RXZlbnRBdCA9IGlucHV0Lmxhc3RFdmVudEF0ID8gbmV3IERhdGUoaW5wdXQubGFzdEV2ZW50QXQpIDogdW5kZWZpbmVkO1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuaW5nZXN0SGVhbHRoKS52YWx1ZXMoe1xuICAgICAgICBvcmdJZCxcbiAgICAgICAgZm9yd2FyZGVkOiBpbnB1dC5mb3J3YXJkZWQsXG4gICAgICAgIGRyb3BwZWQ6IGlucHV0LmRyb3BwZWQsXG4gICAgICAgIGxhc3RFdmVudEF0LFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICB9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgICB0YXJnZXQ6IHNjaGVtYS5pbmdlc3RIZWFsdGgub3JnSWQsXG4gICAgICAgIHNldDoge1xuICAgICAgICAgIGZvcndhcmRlZDogaW5wdXQuZm9yd2FyZGVkLFxuICAgICAgICAgIGRyb3BwZWQ6IGlucHV0LmRyb3BwZWQsXG4gICAgICAgICAgbGFzdEV2ZW50QXQsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBiYWNrIG9uZSBvcmcncyBpbmdlc3Rpb24gaGVhbHRoIGZvciB0aGUgUmVwb3J0cyBVSSBmcmVzaG5lc3NcbiAgICogaW5kaWNhdG9yLiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSBvcmcgaGFzIE5PIHJvdyDigJQgaS5lLiB0aGUgZGVwbG95bWVudCBoYXNcbiAgICogbmV2ZXIgaW5nZXN0ZWQgYW55dGhpbmcg4oCUIHdoaWNoIHRoZSBVSSBtdXN0IHJlbmRlciBhcyBcIm5vIGluZ2VzdCByZXBvcnRlZFxuICAgKiB5ZXRcIiwgbmV2ZXIgYXMgXCJzdGFsZVwiLiBSTFMtc2NvcGVkIHRvIHRoZSBvcmcgbGlrZSBldmVyeSBvdGhlciByZWFkLlxuICAgKi9cbiAgYXN5bmMgZ2V0SW5nZXN0SGVhbHRoKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPEluZ2VzdEhlYWx0aFN0YXR1cyB8IG51bGw+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAgICAgLnNlbGVjdCgpXG4gICAgICAgIC5mcm9tKHNjaGVtYS5pbmdlc3RIZWFsdGgpXG4gICAgICAgIC53aGVyZShlcShzY2hlbWEuaW5nZXN0SGVhbHRoLm9yZ0lkLCBvcmdJZCkpXG4gICAgICAgIC5saW1pdCgxKSksXG4gICAgKTtcbiAgICBjb25zdCByb3cgPSByb3dzWzBdO1xuICAgIGlmICghcm93KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlZEF0OiByb3cudXBkYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICBsYXN0RXZlbnRBdDogaXNvT3JOdWxsKHJvdy5sYXN0RXZlbnRBdCksXG4gICAgICBmb3J3YXJkZWQ6IHJvdy5mb3J3YXJkZWQgPz8gbnVsbCxcbiAgICAgIGRyb3BwZWQ6IHJvdy5kcm9wcGVkID8/IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRpbmcgcmV0ZW50aW9uIHN3ZWVwOiBoYXJkLWRlbGV0ZXMgcm93cyBwYXN0IHRoZWlyIHBlci1vcmcgcmV0ZW50aW9uXG4gICAqIHdpbmRvdyAoc3BsaXQgc3RhbmRhcmQtZXZlbnQgdnMgRE9SQS1zb3VyY2UpLiBDcm9zcy10ZW5hbnQgaG91c2VrZWVwaW5nIOKAlFxuICAgKiBpdCBlc3RhYmxpc2hlcyBpdHMgb3duIHN5c2FkbWluIHNjb3BlLiBTZWUgLi9yZXBvcnRpbmcvcmV0ZW50aW9uLXN3ZWVwLnRzLlxuICAgKi9cbiAgYXN5bmMgcHVyZ2VFeHBpcmVkUmVwb3J0aW5nRGF0YShvcHRzOiBSZXBvcnRpbmdSZXRlbnRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFJlcG9ydGluZ1JldGVudGlvbkNvdW50cz4ge1xuICAgIHJldHVybiBwdXJnZVJlcG9ydGluZ1JldGVudGlvbihvcHRzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSA1OiB0aGUgQU5BTFlUSUNTIHJlYWRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBUaGluIGRlbGVnYXRpb25zIHRvIC4vcmVwb3J0aW5nL2FuYWx5dGljcy1xdWVyaWVzLnRzLCBzbyBgcmVwb3J0aW5nU2VydmljZWBcbiAgLy8gc2F0aXNmaWVzIHRoZSByZXBvcnQgZW5naW5lJ3MgYFNlY3Rpb25EYXRhU291cmNlYCBpbiBmdWxsIGFuZCBhIHNlY3Rpb24gbmV2ZXJcbiAgLy8gcmVhY2hlcyBwYXN0IHRoZSBzZXJ2aWNlIGZvciBpdHMgZGF0YS4gRXZlcnkgb25lIG9mIHRoZXNlIHJlYWRzIGFcbiAgLy8gcHJlLWFnZ3JlZ2F0ZWQgdGFibGUgKGBleGVjdXRpb25fZGFpbHlfcm9sbHVwc2AsIGBkb3JhX2RlcGxveW1lbnRzYCxcbiAgLy8gYHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uYCwgYHBsdWdpbl92dWxuX2V4cG9zdXJlYCkgcmF0aGVyIHRoYW4gcmF3IGV2ZW50cyDigJRcbiAgLy8gd2hpY2ggaXMgd2hhdCBtYWtlcyBhIHF1YXJ0ZXJseSByZXBvcnQgYWZmb3JkYWJsZSBBTkQgd2hhdCBtYWtlcyBpdCBzdGlsbFxuICAvLyBhbnN3ZXJhYmxlIGFmdGVyIHJldGVudGlvbiBoYXMgc3dlcHQgdGhlIGV2ZW50cyBpdCBjYW1lIGZyb20uXG5cbiAgLyoqIFBlci1waXBlbGluZSBkZWxpdmVyeSwgd29yc3QgZmlyc3QuICovXG4gIGFzeW5jIGdldFBpcGVsaW5lQnJlYWtkb3duKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgbGltaXQgPSAxMCkge1xuICAgIHJldHVybiBnZXRQaXBlbGluZUJyZWFrZG93bihzY29wZSwgbGltaXQpO1xuICB9XG5cbiAgLyoqIEZhaWx1cmVzIGJ5IGNhdGVnb3J5LCB3aXRoIHRoZSBwcmV2aW91cyBwZXJpb2QncyBjb3VudHMgZm9yIHRoZSB0cmVuZC4gKi9cbiAgYXN5bmMgZ2V0RmFpbHVyZUFuYWx5c2lzKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgcHJldmlvdXM/OiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIGdldEZhaWx1cmVBbmFseXNpcyhzY29wZSwgcHJldmlvdXMpO1xuICB9XG5cbiAgLyoqIFBlci1zdGFnZSB0aW1pbmdzIGZvciBvbmUgcGlwZWxpbmUsIHNsb3dlc3QgZmlyc3QuICovXG4gIGFzeW5jIGdldFN0YWdlUGVyZm9ybWFuY2Uoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBwaXBlbGluZUlkOiBzdHJpbmcsIHByZXZpb3VzPzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfSkge1xuICAgIHJldHVybiBnZXRTdGFnZVBlcmZvcm1hbmNlKHNjb3BlLCBwaXBlbGluZUlkLCBwcmV2aW91cyk7XG4gIH1cblxuICAvKiogQnVpbGQgdGltZSBieSBwcm9qZWN0IGFuZCBwaXBlbGluZS4gU2Vjb25kcywgbmV2ZXIgbW9uZXkuICovXG4gIGFzeW5jIGdldFJlc291cmNlQ29uc3VtcHRpb24oc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDIwKSB7XG4gICAgcmV0dXJuIGdldFJlc291cmNlQ29uc3VtcHRpb24oc2NvcGUsIGxpbWl0KTtcbiAgfVxuXG4gIC8qKiBFYWNoIGNvbW1pdCdzIHBhdGggYWNyb3NzIGVudmlyb25tZW50cywgYW5kIHdoaWNoIG9uZXMgc3RvcHBlZCBzaG9ydC4gKi9cbiAgYXN5bmMgZ2V0UHJvbW90aW9uVmlldyhzY29wZTogQW5hbHl0aWNzU2NvcGUsIHByb2R1Y3Rpb25FbnYgPSAncHJvZHVjdGlvbicsIGxpbWl0ID0gMjUpIHtcbiAgICByZXR1cm4gZ2V0UHJvbW90aW9uVmlldyhzY29wZSwgcHJvZHVjdGlvbkVudiwgbGltaXQpO1xuICB9XG5cbiAgLyoqIFBpcGVsaW5lcyBiZWhpbmQgb24gYSBwbHVnaW4sIHdvcnN0IGdhcCBmaXJzdCAodGhlIERFQ0xBUkVEIHNpZGUpLiAqL1xuICBhc3luYyBnZXRPdXRkYXRlZFBsdWdpbnMoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDUwKSB7XG4gICAgcmV0dXJuIGdldE91dGRhdGVkUGx1Z2lucyhzY29wZSwgbGltaXQpO1xuICB9XG5cbiAgLyoqIE9wZW4gcGx1Z2luIHZ1bG5lcmFiaWxpdGllcyBwZXIgcGlwZWxpbmUgKHNheXMgZGVjbGFyZWQgdnMgZGVwbG95ZWQpLiAqL1xuICBhc3luYyBnZXRQbHVnaW5WdWxuZXJhYmlsaXRpZXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDUwKSB7XG4gICAgcmV0dXJuIGdldFBsdWdpblZ1bG5lcmFiaWxpdGllcyhzY29wZSwgbGltaXQpO1xuICB9XG5cbiAgLyoqIEFkb3B0aW9uLCBjcmVhdGlvbiBzb3VyY2UsIGFuZCB0aGUgZGVwbG95LXRyYWNraW5nIGNvdmVyYWdlIGRlbm9taW5hdG9yLiAqL1xuICBhc3luYyBnZXRBZG9wdGlvbihzY29wZTogQW5hbHl0aWNzU2NvcGUsIHRpbWVTYXZlZE1pbnV0ZXM/OiBudW1iZXIgfCBudWxsKSB7XG4gICAgcmV0dXJuIGdldEFkb3B0aW9uKHNjb3BlLCB0aW1lU2F2ZWRNaW51dGVzID8/IChhd2FpdCB0aGlzLnRpbWVTYXZlZEFzc3VtcHRpb24oc2NvcGUub3JnSWQpKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5lZWRzLWF0dGVudGlvbiBmaW5kaW5ncyBmb3IgdGhlIHBlcmlvZC5cbiAgICpcbiAgICogQXNzZW1ibGVkIEhFUkUgcmF0aGVyIHRoYW4gaW4gdGhlIHNlY3Rpb24sIGJlY2F1c2UgdGhlIHJ1bGVzIG5lZWQgc2l4IHJlYWRzIHRoYXRcbiAgICogbXVzdCBhbGwgZGVzY3JpYmUgdGhlIHNhbWUgd2luZG93OiB0aGlzIHBlcmlvZCdzIGJyZWFrZG93biwgdGhlIHByZXZpb3VzIG9uZSdzLFxuICAgKiBmYWlsdXJlIHN0cmVha3MsIGNvbmZpZy1jaGFuZ2UgdGltZXMsIHBpcGVsaW5lcyB3aXRoIGFuIG9wZW4gQ3JpdGljYWwsIGFuZFxuICAgKiBwaXBlbGluZXMgRE9SQSBjYW5ub3Qgc2VlLiBBIHNlY3Rpb24gdGhhdCBmZXRjaGVkIHRoZW0gaXRzZWxmIHdvdWxkIGJlIHRoZSBvbmx5XG4gICAqIHBsYWNlIGluIHRoZSByZXBvcnQgd2hlcmUgdGhlIHdpbmRvdyBjb3VsZCBkcmlmdCBiZXR3ZWVuIHBhbmVscy5cbiAgICpcbiAgICogRXZlcnkgaW5wdXQgZXhjZXB0IHRoZSBjdXJyZW50IGJyZWFrZG93biBpcyBPUFRJT05BTCB0byB0aGUgZXZhbHVhdG9yLCBhbmQgZWFjaFxuICAgKiBvbmUncyBmYWlsdXJlIGlzIGFic29yYmVkOiBhIHJ1bGUgd2l0aCBubyBkYXRhIHRvIHJ1biBvbiBpcyBza2lwcGVkLCB3aGljaCBpc1xuICAgKiB3aHkgb25lIHVuYXZhaWxhYmxlIHJlYWQgY29zdHMgb25lIGZpbmRpbmcgcmF0aGVyIHRoYW4gdGhlIHdob2xlIHNlY3Rpb24uIFRoZVxuICAgKiBhbHRlcm5hdGl2ZSDigJQgYSBzZWN0aW9uIHRoYXQgZmFpbHMgYmVjYXVzZSB0aGUgc3RyZWFrIHF1ZXJ5IHRpbWVkIG91dCDigJQgcmVwbGFjZXNcbiAgICogc2l4IGZpbmRpbmdzIHdpdGggbm9uZS5cbiAgICovXG4gIGFzeW5jIGdldE5lZWRzQXR0ZW50aW9uKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgcHJldmlvdXM/OiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9KSB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGdldFBpcGVsaW5lQnJlYWtkb3duKHNjb3BlLCBBVFRFTlRJT05fUElQRUxJTkVfTElNSVQpO1xuICAgIGNvbnN0IHByaW9yID0gcHJldmlvdXNcbiAgICAgID8gYXdhaXQgc29mdGVuKGdldFBpcGVsaW5lQnJlYWtkb3duKHsgLi4uc2NvcGUsIC4uLnByZXZpb3VzIH0sIEFUVEVOVElPTl9QSVBFTElORV9MSU1JVCksIFtdKVxuICAgICAgOiBbXTtcbiAgICBjb25zdCBbc3RyZWFrUm93cywgY29uZmlnQ2hhbmdlcywgdnVsbmVyYWJsZSwgdW50cmFja2VkLCB0aHJlc2hvbGRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHNvZnRlbihnZXRQaXBlbGluZVN0cmVha3Moc2NvcGUpLCBbXSksXG4gICAgICBzb2Z0ZW4oZ2V0UGlwZWxpbmVDb25maWdDaGFuZ2VzKHNjb3BlKSwgbmV3IE1hcDxzdHJpbmcsIERhdGU+KCkpLFxuICAgICAgc29mdGVuKGdldFZ1bG5lcmFibGVQaXBlbGluZXMoc2NvcGUpLCBbXSksXG4gICAgICBzb2Z0ZW4oZ2V0VW50cmFja2VkUGlwZWxpbmVzKHNjb3BlKSwgW10pLFxuICAgICAgc29mdGVuKHRoaXMuYXR0ZW50aW9uVGhyZXNob2xkcyhzY29wZS5vcmdJZCksIHt9KSxcbiAgICBdKTtcbiAgICBjb25zdCBpdGVtcyA9IGV2YWx1YXRlTmVlZHNBdHRlbnRpb24oe1xuICAgICAgY3VycmVudCxcbiAgICAgIHByZXZpb3VzOiBwcmlvcixcbiAgICAgIHN0cmVha3M6IG5ldyBNYXAoc3RyZWFrUm93cy5tYXAoKHIpID0+IFtyLnBpcGVsaW5lSWQsIHtcbiAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlczogci5jb25zZWN1dGl2ZUZhaWx1cmVzLFxuICAgICAgICBsYXN0U3VjY2Vzc0F0OiByLmxhc3RTdWNjZXNzQXQsXG4gICAgICB9XSkpLFxuICAgICAgY29uZmlnQ2hhbmdlcyxcbiAgICAgIHZ1bG5lcmFibGVQaXBlbGluZXM6IG5ldyBTZXQodnVsbmVyYWJsZSksXG4gICAgICB1bnRyYWNrZWRQaXBlbGluZXM6IG5ldyBTZXQodW50cmFja2VkKSxcbiAgICAgIHRocmVzaG9sZHM6IHRocmVzaG9sZHNGcm9tKHRocmVzaG9sZHMpLFxuICAgICAgbm93OiBuZXcgRGF0ZShzY29wZS50byksXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zLFxuICAgICAgdGhyZXNob2xkczogdGhyZXNob2xkc0Zyb20odGhyZXNob2xkcyksXG4gICAgICAvLyBXaGF0IHRoZSBydWxlcyB3ZXJlIGV2YWx1YXRlZCBvdmVyLCBzbyBhIHJlYWRlciBjYW4gdGVsbCBhbiBlbXB0eSBsaXN0XG4gICAgICAvLyAoXCJub3RoaW5nIHRyaXBwZWRcIikgZnJvbSBhbiBlbXB0eSBpbnB1dCAoXCJub3RoaW5nIHJhblwiKS5cbiAgICAgIHBpcGVsaW5lc0V2YWx1YXRlZDogY3VycmVudC5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb3JnJ3Mgc3RvcmVkIG5lZWRzLWF0dGVudGlvbiB0aHJlc2hvbGRzLCBvciBge31gLlxuICAgKlxuICAgKiBSZXR1cm5lZCBhcyBhIHBhcnRpYWwgb24gcHVycG9zZTogYHRocmVzaG9sZHNGcm9tYCBmaWxscyB0aGUgcmVzdCBwZXIgZmllbGQsIHNvXG4gICAqIGFuIG9yZyB0aGF0IGNvbmZpZ3VyZWQgb25lIG51bWJlciBrZWVwcyB0aGUgZGVmYXVsdHMgZm9yIHRoZSBvdGhlcnMgaW5zdGVhZCBvZlxuICAgKiBzaWxlbnRseSBkaXNhYmxpbmcgZm91ciBydWxlcyBieSBzZXR0aW5nIG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXR0ZW50aW9uVGhyZXNob2xkcyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7IHQ6IHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0QXR0ZW50aW9uVGhyZXNob2xkcyB9KVxuICAgICAgICAuZnJvbShzY2hlbWEuZG9yYVNldHRpbmdzKVxuICAgICAgICAud2hlcmUoZXEoc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCwgb3JnSWQpKVxuICAgICAgICAubGltaXQoMSkpKTtcbiAgICBjb25zdCBzdG9yZWQgPSAocm93cyBhcyBBcnJheTx7IHQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsIH0+KVswXT8udDtcbiAgICByZXR1cm4gc3RvcmVkICYmIHR5cGVvZiBzdG9yZWQgPT09ICdvYmplY3QnID8gc3RvcmVkIDoge307XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9yZydzIG93biBtaW51dGVzLXNhdmVkLXBlci1waXBlbGluZSBhc3N1bXB0aW9uLCBvciBudWxsLlxuICAgKlxuICAgKiBSZWFkIGhlcmUgc28gdGhlIGFkb3B0aW9uIHNlY3Rpb24gY2Fubm90IGFjY2lkZW50YWxseSBiZSBoYW5kZWQgYVxuICAgKiBwbGF0Zm9ybS1jaG9zZW4gZGVmYXVsdDogdGhlIG51bWJlciBvbmx5IG1lYW5zIHNvbWV0aGluZyB3aGVuIHRoZSBjdXN0b21lclxuICAgKiBwaWNrZWQgaXQsIGFuZCBgbnVsbGAgcmVuZGVycyBhcyBcIm5vdCBlc3RpbWF0ZWRcIiByYXRoZXIgdGhhbiBhcyB6ZXJvLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0aW1lU2F2ZWRBc3N1bXB0aW9uKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KHsgbWludXRlczogc2NoZW1hLmRvcmFTZXR0aW5ncy50aW1lU2F2ZWRNaW51dGVzUGVyUGlwZWxpbmUgfSlcbiAgICAgICAgLmZyb20oc2NoZW1hLmRvcmFTZXR0aW5ncylcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQsIG9yZ0lkKSlcbiAgICAgICAgLmxpbWl0KDEpKSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIEFycmF5PHsgbWludXRlczogbnVtYmVyIHwgbnVsbCB9PilbMF0/Lm1pbnV0ZXMgPz8gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEhvdyBtYW55IHBpcGVsaW5lcyB0aGUgbmVlZHMtYXR0ZW50aW9uIHJ1bGVzIGNvbnNpZGVyLlxuICpcbiAqIFRoZSBzZWN0aW9uIGlzIGEgc2hvcnQgbGlzdCBvZiB0aGluZ3MgdG8gZG8sIG5vdCBhIHRhYmxlIG9mIGV2ZXJ5dGhpbmcsIHNvIHRoZVxuICogZXZhbHVhdG9yIHNlZXMgdGhlIHNhbWUgd29yc3QtZmlyc3Qgc2xpY2UgdGhlIGJyZWFrZG93biBzZWN0aW9uIHNob3dzLiBBIHBpcGVsaW5lXG4gKiBvdXRzaWRlIHRoZSB3b3JzdCAyNSBieSB0aGUgYnJlYWtkb3duJ3Mgb3duIG9yZGVyaW5nIGlzIG5vdCB0aGUgb25lIGEgbGVhZCBzaG91bGRcbiAqIGJlIHRvbGQgYWJvdXQgZmlyc3QuXG4gKi9cbmNvbnN0IEFUVEVOVElPTl9QSVBFTElORV9MSU1JVCA9IDI1O1xuXG4vKipcbiAqIFJ1biBhIHJlYWQsIG9yIGZhbGwgYmFjay5cbiAqXG4gKiBPbmx5IGZvciB0aGUgbmVlZHMtYXR0ZW50aW9uIGlucHV0cywgd2hlcmUgYW4gYWJzZW50IGlucHV0IFNLSVBTIGEgcnVsZSBhbmQgdGhlXG4gKiBldmFsdWF0b3Igc2F5cyBzby4gTmV2ZXIgdXNlZCBmb3IgYSBudW1iZXIgdGhlIHJlcG9ydCBwcmVzZW50czogYSBxdWVyeSB0aGF0IGZhaWxzXG4gKiBhbmQgc2lsZW50bHkgcmVhZHMgYXMgemVybyBpcyBob3cgYSByZXBvcnQgc3RhdGVzIHNvbWV0aGluZyBmYWxzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc29mdGVuPFQ+KHA6IFByb21pc2U8VD4sIGZhbGxiYWNrOiBUKTogUHJvbWlzZTxUPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHA7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKCdOZWVkcy1hdHRlbnRpb24gaW5wdXQgdW5hdmFpbGFibGU7IGl0cyBydWxlIGlzIHNraXBwZWQnLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlcG9ydGluZ1NlcnZpY2UgPSBuZXcgUmVwb3J0aW5nU2VydmljZSgpO1xuIl19
|
|
890
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEgsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTVFLGdGQUFnRjtBQUNoRiw0RUFBNEU7QUFDNUUsT0FBTyxFQUNMLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQix3QkFBd0IsRUFDeEIsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsc0JBQXNCLEdBRXZCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JHLE9BQU8sRUFDTCxjQUFjLElBQUksV0FBVyxFQUM3QixZQUFZLElBQUksU0FBUyxFQUN6QixjQUFjLElBQUksV0FBVyxHQUM5QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLDhFQUE4RTtBQUM5RSxPQUFPLEVBQUUsWUFBWSxJQUFJLE1BQU0sRUFB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Qyx3REFBd0QsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDWCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIsIGVycm9yTWVzc2FnZSwgaXNvT3JOdWxsLCBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgZXEsIHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGRyaXp6bGVSb3dzIH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4LCBydW5XaXRoVGVuYW50Q29udGV4dCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vLyBFeHRyYWN0ZWQgZm9yIHNpemUg4oCUIHNlZSAuL3JlcG9ydGluZy8uIEV2ZXJ5dGhpbmcgcHVibGljIGlzIHJlLWV4cG9ydGVkIGJlbG93XG4vLyBzbyBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YWAncyBzdXJmYWNlIGlzIHVuY2hhbmdlZCBieSB0aGUgc3BsaXQuXG5pbXBvcnQge1xuICBnZXRBZG9wdGlvbixcbiAgZ2V0RmFpbHVyZUFuYWx5c2lzLFxuICBnZXRPdXRkYXRlZFBsdWdpbnMsXG4gIGdldFBpcGVsaW5lQnJlYWtkb3duLFxuICBnZXRQaXBlbGluZUNvbmZpZ0NoYW5nZXMsXG4gIGdldFBpcGVsaW5lU3RyZWFrcyxcbiAgZ2V0UGx1Z2luVnVsbmVyYWJpbGl0aWVzLFxuICBnZXRQcm9tb3Rpb25WaWV3LFxuICBnZXRSZXNvdXJjZUNvbnN1bXB0aW9uLFxuICBnZXRTdGFnZVBlcmZvcm1hbmNlLFxuICBnZXRVbnRyYWNrZWRQaXBlbGluZXMsXG4gIGdldFZ1bG5lcmFibGVQaXBlbGluZXMsXG4gIHR5cGUgQW5hbHl0aWNzU2NvcGUsXG59IGZyb20gJy4vcmVwb3J0aW5nL2FuYWx5dGljcy1xdWVyaWVzLmpzJztcbmltcG9ydCB7IGludmVudG9yeUNhY2hlLCBpbnZhbGlkYXRlT3JnUmVwb3J0cyB9IGZyb20gJy4vcmVwb3J0aW5nL2NhY2hlcy5qcyc7XG5pbXBvcnQgeyBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUywgcmVzb2x2ZUluY2lkZW50V2luZG93SG91cnMgfSBmcm9tICcuL3JlcG9ydGluZy9kb3JhLXNjb3JpbmcuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RG9yYU1ldHJpY3MgYXMgZG9yYU1ldHJpY3MsXG4gIGdldERvcmFUcmVuZCBhcyBkb3JhVHJlbmQsXG4gIGdldEJ1aWxkSGVhbHRoIGFzIGJ1aWxkSGVhbHRoLFxufSBmcm9tICcuL3JlcG9ydGluZy9kb3JhLmpzJztcbi8vIEFsaWFzZWQ6IHRoZSBtb2R1bGUgZnVuY3Rpb25zIGFuZCB0aGUgZGVsZWdhdGluZyBtZXRob2RzIGJlbG93IHNoYXJlIG5hbWVzLlxuaW1wb3J0IHsgaW5nZXN0RXZlbnRzIGFzIGluZ2VzdCB9IGZyb20gJy4vcmVwb3J0aW5nL2luZ2VzdC5qcyc7XG5pbXBvcnQgeyBnZXRMYXN0RGVwbG95ZWRDb21taXQgYXMgbGFzdERlcGxveWVkQ29tbWl0IH0gZnJvbSAnLi9yZXBvcnRpbmcvbGFzdC1kZXBsb3kuanMnO1xuaW1wb3J0IHR5cGUgeyBMYXN0RGVwbG95ZWRDb21taXQgfSBmcm9tICcuL3JlcG9ydGluZy9sYXN0LWRlcGxveS5qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZU5lZWRzQXR0ZW50aW9uLCB0aHJlc2hvbGRzRnJvbSwgdHlwZSBBdHRlbnRpb25SdWxlSWQgfSBmcm9tICcuL3JlcG9ydGluZy9uZWVkcy1hdHRlbnRpb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0UGx1Z2luUnVudGltZSBhcyBwbHVnaW5SdW50aW1lLFxuICBnZXRQbHVnaW5SdW50aW1lQWdncmVnYXRlIGFzIHBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUsXG4gIGhhc1ZlcmlmaWVkUGx1Z2luVXNlIGFzIHZlcmlmaWVkUGx1Z2luVXNlLFxufSBmcm9tICcuL3JlcG9ydGluZy9wbHVnaW4tcnVudGltZS5qcyc7XG5pbXBvcnQgeyByZXBvcnQgfSBmcm9tICcuL3JlcG9ydGluZy9xdWVyeS1zY29wZS5qcyc7XG5pbXBvcnQgeyBwdXJnZUV4cGlyZWRSZXBvcnRpbmdEYXRhIGFzIHB1cmdlUmVwb3J0aW5nUmV0ZW50aW9uIH0gZnJvbSAnLi9yZXBvcnRpbmcvcmV0ZW50aW9uLXN3ZWVwLmpzJztcbmltcG9ydCB7IFJFUE9SVElOR19FVkVOVF9SRVRFTlRJT05fREFZUywgUkVQT1JUSU5HX0RPUkFfUkVURU5USU9OX0RBWVMgfSBmcm9tICcuL3JlcG9ydGluZy9yZXRlbnRpb24uanMnO1xuaW1wb3J0IHsgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwsIGJ1Y2tldEtleSwgcGVyaW9kQnVja2V0LCBzY3J1Yk9wdGlvbmFsLCBvcHRpb25hbFN0YXJ0ZWRBdFJhbmdlLCBzdGFydGVkQXRXaW5kb3cgfSBmcm9tICcuL3JlcG9ydGluZy9zcWwtaGVscGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEV4ZWN1dGlvbkNvdW50LCBUaW1lU2VyaWVzRW50cnksIER1cmF0aW9uU3RhdHMsIFBpcGVsaW5lRXhlY3V0aW9uLCBTdGFnZUZhaWx1cmUsIFN0YWdlQm90dGxlbmVjayxcbiAgQWN0aW9uRmFpbHVyZSwgRXJyb3JFbnRyeSwgUGx1Z2luU3VtbWFyeSwgVHlwZUNvbXB1dGVEaXN0cmlidXRpb24sIFZlcnNpb25Db3VudCxcbiAgQnVpbGRUaW1lU2VyaWVzRW50cnksIEJ1aWxkRHVyYXRpb24sIEJ1aWxkRmFpbHVyZSxcbiAgUGx1Z2luUnVudGltZUFnZ3JlZ2F0ZSwgUGx1Z2luUnVudGltZUZpbHRlciwgUGx1Z2luUnVudGltZVN0YXRzLFxuICBSZXBvcnRpbmdSZXRlbnRpb25PcHRpb25zLCBSZXBvcnRpbmdSZXRlbnRpb25Db3VudHMsXG4gIERvcmFPcHRpb25zLCBSZXBvcnRpbmdTZXR0aW5ncywgUmVwb3J0aW5nU2V0dGluZ3NQYXRjaCwgSW5jaWRlbnRMaXN0SXRlbSwgSW5jaWRlbnRUZXN0UmVzdWx0LFxuICBEb3JhTWV0cmljcywgRG9yYVRyZW5kUG9pbnQsIEJ1aWxkSGVhbHRoLCBJbmNpZGVudElucHV0LCBJbmNpZGVudFdyaXRlLCBEZXBsb3ltZW50T3V0Y29tZVdyaXRlLFxuICBJbmdlc3RDYWxsZXIsIEluZ2VzdEV2ZW50LCBJbmdlc3RNZXRyaWMsIEluZ2VzdFJlc3VsdCwgSW5nZXN0SGVhbHRoU3RhdHVzLFxuICBCdWNrZXRPcHRpb25zLFxufSBmcm9tICcuL3JlcG9ydGluZy90eXBlcy5qcyc7XG5cbi8vIFRoZSByZXBvcnRpbmcgdHlwZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgcGFja2FnZSBBUEkuIEVudW1lcmF0ZWQgcmF0aGVyIHRoYW5cbi8vIGBleHBvcnQgKmAgYmVjYXVzZSB0aGUgcmVwb3J0aW5nIG1vZHVsZXMgYWxzbyBleHBvcnQgaW50ZXJuYWxzIChvcmdTY29wZSxcbi8vIHJ1blJlcG9ydCwgdGhlIGNhY2hlcywgdGhlIERPUkEgcm93IHNoYXBlcykgdGhhdCBtdXN0IHN0YXkgcHJpdmF0ZS5cbmV4cG9ydCB0eXBlIHsgTGFzdERlcGxveWVkQ29tbWl0IH0gZnJvbSAnLi9yZXBvcnRpbmcvbGFzdC1kZXBsb3kuanMnO1xuZXhwb3J0IHR5cGUge1xuICBCdWNrZXRPcHRpb25zLFxuICBCdWlsZEhlYWx0aCwgQnVpbGRIZWFsdGhTdGFnZSwgRG9yYUVudk1ldHJpY3MsIERvcmFMZXZlbCwgRG9yYU1ldHJpY3MsIERvcmFPcHRpb25zLCBEb3JhVHJlbmRQb2ludCxcbiAgRGVwbG95bWVudE91dGNvbWVXcml0ZSwgSW5jaWRlbnRJbnB1dCwgSW5jaWRlbnRMaXN0SXRlbSwgSW5jaWRlbnRTdGF0ZSwgSW5jaWRlbnRXcml0ZSwgUmVwb3J0aW5nU2V0dGluZ3MsIEluY2lkZW50VGVzdFJlc3VsdCxcbiAgSW5nZXN0Q2FsbGVyLCBJbmdlc3RFdmVudCwgSW5nZXN0SGVhbHRoU3RhdHVzLCBJbmdlc3RNZXRyaWMsIEluZ2VzdFJlc3VsdCxcbiAgUGx1Z2luUnVudGltZUFnZ3JlZ2F0ZSwgUGx1Z2luUnVudGltZUZpbHRlciwgUGx1Z2luUnVudGltZVN0YXRzLFxuICBSZXBvcnRpbmdSZXRlbnRpb25Db3VudHMsIFJlcG9ydGluZ1JldGVudGlvbk9wdGlvbnMsIFJlcG9ydGluZ1JldGVudGlvblNldHRpbmdzLFxuICBSZXBvcnRpbmdTZXR0aW5nc1BhdGNoLFxufSBmcm9tICcuL3JlcG9ydGluZy90eXBlcy5qcyc7XG5cblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXBvcnRpbmctc2VydmljZScpO1xuXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nU2VydmljZSB7XG5cbiAgLyoqIEludmFsaWRhdGUgYWxsIGNhY2hlZCByZXBvcnRzIGZvciBhbiBvcmcgKGNhbGwgYWZ0ZXIgZXZlbnQgaW5nZXN0KS4gKi9cbiAgYXN5bmMgaW52YWxpZGF0ZU9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgaW52YWxpZGF0ZU9yZ1JlcG9ydHMob3JnSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgaW5jb21pbmcgZXZlbnRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBiYXRjaC1pbnNlcnQgdGhlXG4gICAqIG1hdGNoZWQgb25lcywgYW5kIGludmFsaWRhdGUgcmVwb3J0aW5nIGNhY2hlcyBmb3IgYWZmZWN0ZWQgb3Jncy5cbiAgICogU2VlIC4vcmVwb3J0aW5nL2luZ2VzdC50cyDigJQgdGhlIGNhbGxlciBtdXN0IGFscmVhZHkgaG9sZCBhIHN5c2FkbWluXG4gICAqIHRlbmFudCBzY29wZSwgYmVjYXVzZSBhIGJhdGNoIHNwYW5zIHdoYXRldmVyIG9yZ3MgdGhlIHJlZ2lzdHJ5IHJlc29sdmVzIHRvLlxuICAgKi9cbiAgYXN5bmMgaW5nZXN0RXZlbnRzKGV2ZW50czogSW5nZXN0RXZlbnRbXSwgb25NZXRyaWM/OiAobTogSW5nZXN0TWV0cmljKSA9PiB2b2lkLCBjYWxsZXI/OiBJbmdlc3RDYWxsZXIpOiBQcm9taXNlPEluZ2VzdFJlc3VsdD4ge1xuICAgIHJldHVybiBpbmdlc3QoZXZlbnRzLCBvbk1ldHJpYywgY2FsbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IHNoYSBvZiB0aGlzIHBpcGVsaW5lJ3MgbGFzdCBzdWNjZXNzZnVsIGRlcGxveSDigJQgdG8gYGVudmlyb25tZW50YFxuICAgKiB3aGVuIGdpdmVuLCB0byBhbnl3aGVyZSBvdGhlcndpc2UuIFRoZSBleGNsdXNpdmUgbG93ZXIgYm91bmQgZm9yIFwiY29tbWl0c1xuICAgKiBzaW5jZSB0aGUgbGFzdCBkZXBsb3lcIi4gVGVuYW5jeSBpcyBlbmZvcmNlZCBmcm9tIGBjYWxsZXJgIGV4YWN0bHkgYXNcbiAgICoge0BsaW5rIGluZ2VzdEV2ZW50c30gZG9lcyBpdC5cbiAgICovXG4gIGFzeW5jIGdldExhc3REZXBsb3llZENvbW1pdChwaXBlbGluZUlkOiBzdHJpbmcsIGVudmlyb25tZW50Pzogc3RyaW5nLCBjYWxsZXI/OiBJbmdlc3RDYWxsZXIpOiBQcm9taXNlPExhc3REZXBsb3llZENvbW1pdD4ge1xuICAgIHJldHVybiBsYXN0RGVwbG95ZWRDb21taXQocGlwZWxpbmVJZCwgZW52aXJvbm1lbnQsIGNhbGxlcik7XG4gIH1cblxuICAvLyDilIDilIAgQ2F0ZWdvcnkgMTogUGlwZWxpbmUgRXhlY3V0aW9uICYgUGVyZm9ybWFuY2Ug4pSA4pSAXG5cblxuICAvKiogRXhlY3V0aW9uIGNvdW50IHBlciBwaXBlbGluZSB3aXRoIHN0YXR1cyBicmVha2Rvd24uICovXG4gIGFzeW5jIGdldEV4ZWN1dGlvbkNvdW50KG9yZ0lkOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCByYW5nZT86IHsgZnJvbT86IHN0cmluZzsgdG8/OiBzdHJpbmcgfSk6IFByb21pc2U8RXhlY3V0aW9uQ291bnRbXT4ge1xuICAgIC8vIE9wdGlvbmFsIFtmcm9tLHRvXSB3aW5kb3cgb24gdGhlIGV4ZWN1dGlvbidzIHN0YXJ0ZWRfYXQsIG1pcnJvcmluZyB0aGVcbiAgICAvLyBzaWJsaW5nIHRpbWVzZXJpZXMgcmVwb3J0cyBzbyB0aGUgZGFzaGJvYXJkIGRhdGUtcmFuZ2UgcGlja2VyIG5hcnJvd3MgdGhlXG4gICAgLy8gY291bnQgdG9vIChhbiBlbXB0eSByYW5nZSA9IGFsbC10aW1lLCBwcmVzZXJ2aW5nIHRoZSBwcmlvciBiZWhhdmlvcikuIFRoZVxuICAgIC8vIHJhbmdlIHJpZGVzIHRoZSBKT0lOIHNvIHBpcGVsaW5lcyB3aXRoIG5vIGluLXdpbmRvdyBldmVudHMgc3RpbGwgbGlzdFxuICAgIC8vIChMRUZUIHNlbWFudGljcyBwcmVzZXJ2ZWQgdmlhIHRoZSBpbm5lci1qb2luIGZpbHRlciDigJQgYSBwaXBlbGluZSB3aXRoIHplcm9cbiAgICAvLyBtYXRjaGluZyBldmVudHMgZHJvcHMgZnJvbSB0aGUgY291bnQsIHNhbWUgYXMgYmVmb3JlIGZvciBpdHMgd2luZG93KS5cbiAgICBjb25zdCByYW5nZUNsYXVzZSA9IG9wdGlvbmFsU3RhcnRlZEF0UmFuZ2UocmFuZ2UpO1xuICAgIHJldHVybiByZXBvcnQ8RXhlY3V0aW9uQ291bnQ+KGBleGVjLWNvdW50OiR7cmFuZ2U/LmZyb20gPz8gJyd9OiR7cmFuZ2U/LnRvID8/ICcnfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucHJvamVjdCwgcC5vcmdhbml6YXRpb24sIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0NBTkNFTEVEJyk6OmludCBBUyBjYW5jZWxlZCxcbiAgICAgICAgICBNSU4oZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBmaXJzdF9leGVjdXRpb24sXG4gICAgICAgICAgTUFYKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgbGFzdF9leGVjdXRpb25cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZX0gcFxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGUgT04gZS5waXBlbGluZV9pZCA9IHAuaWRcbiAgICAgICAgICBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgIT0gJ1NUQVJURUQnXG4gICAgICAgICAgJHtyYW5nZUNsYXVzZX1cbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgcC5pc19hY3RpdmUgPSB0cnVlXG4gICAgICAgIEdST1VQIEJZIHAuaWRcbiAgICAgICAgT1JERVIgQlkgdG90YWwgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyLXBpcGVsaW5lIGV4ZWN1dGlvbiBoaXN0b3J5IOKAlCBESVNUSU5DVCBleGVjdXRpb25zIGZvciBvbmUgcGlwZWxpbmUsXG4gICAqIG5ld2VzdCBmaXJzdC4gR3JvdXBzIGFsbCBldmVudHMgYnkgYGV4ZWN1dGlvbl9pZGAgaW4gYSBzaW5nbGUgc2NhbiBhbmRcbiAgICogcm9sbHMgZWFjaCBleGVjdXRpb24gdXAgdG8gb25lIHJvdzpcbiAgICogICAtIHN0YXR1czogZGVyaXZlZCBmcm9tIHRoZSBQSVBFTElORS10eXBlIGV2ZW50cy4gRkFJTEVEIHdpbnMsIHRoZW5cbiAgICogICAgIFNVQ0NFRURFRCwgdGhlbiBDQU5DRUxFRDsgYW4gZXhlY3V0aW9uIHdpdGggbm8gdGVybWluYWwgUElQRUxJTkUgZXZlbnRcbiAgICogICAgIGlzIHN0aWxsIGBpbi1wcm9ncmVzc2AuXG4gICAqICAgLSBzdGFydGVkQXQvZW5kZWRBdC9kdXJhdGlvbk1zOiBmcm9tIHRoZSBQSVBFTElORSBsaWZlY3ljbGUgZXZlbnRzLlxuICAgKiAgIC0gZmFpbGluZ1N0YWdlL2ZhaWxpbmdBY3Rpb246IHRoZSBmaXJzdCBGQUlMRUQgU1RBR0UvQUNUSU9OIGV2ZW50IChjaGVhcCDigJRcbiAgICogICAgIHNhbWUgc2Nhbiwgbm8gZXh0cmEgcXVlcnkpLlxuICAgKlxuICAgKiBPUkctU0NPUElORzogaWRlbnRpY2FsIHRvIHRoZSBzaWJsaW5nIGV4ZWN1dGlvbiByZXBvcnRzIOKAlCBqb2lucyB0aGUgcGlwZWxpbmVcbiAgICogcmVnaXN0cnkgdGFibGUgKGBwaXBlbGluZWApIGFuZCBnYXRlcyBvbiBgcC5vcmdfaWQgJHtwcmVkfWAsIHdoZXJlIGBwcmVkYCBpc1xuICAgKiB0aGUgc2luZ2xlLW9yZyBgPSAkb3JnYCBvciAod2l0aCBhIHJvbGx1cCkgYW4gYElOICguLi4pYCBvdmVyIHRoZSBvcmfihpJ0ZWFtXG4gICAqIHN1YnRyZWUuIEEgcGlwZWxpbmVJZCBiZWxvbmdpbmcgdG8gYW5vdGhlciBvcmcgeWllbGRzIHplcm8gcm93cy5cbiAgICovXG4gIGFzeW5jIGxpc3RQaXBlbGluZUV4ZWN1dGlvbnMoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gICAgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgcmFuZ2U/OiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH0sXG4gICAgbGltaXQ6IG51bWJlciA9IDUwLFxuICApOiBQcm9taXNlPFBpcGVsaW5lRXhlY3V0aW9uW10+IHtcbiAgICBjb25zdCByYW5nZUNsYXVzZSA9IG9wdGlvbmFsU3RhcnRlZEF0UmFuZ2UocmFuZ2UpO1xuICAgIHJldHVybiByZXBvcnQ8UGlwZWxpbmVFeGVjdXRpb24+KGBwaXBlbGluZS1leGVjdXRpb25zOiR7cGlwZWxpbmVJZH06JHtyYW5nZT8uZnJvbSA/PyAnJ306JHtyYW5nZT8udG8gPz8gJyd9OiR7bGltaXR9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5leGVjdXRpb25faWQsXG4gICAgICAgICAgQ0FTRVxuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpIFRIRU4gJ2ZhaWxlZCdcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKSBUSEVOICdzdWNjZWVkZWQnXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKSBUSEVOICdjYW5jZWxlZCdcbiAgICAgICAgICAgIEVMU0UgJ2luLXByb2dyZXNzJ1xuICAgICAgICAgIEVORCBBUyBzdGF0dXMsXG4gICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6dGV4dCBBUyBzdGFydGVkX2F0LFxuICAgICAgICAgIE1BWChlLmNvbXBsZXRlZF9hdCkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6dGV4dCBBUyBlbmRlZF9hdCxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcykgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6aW50IEFTIGR1cmF0aW9uX21zLFxuICAgICAgICAgIChBUlJBWV9BR0coZS5zdGFnZV9uYW1lKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpKVsxXSBBUyBmYWlsaW5nX3N0YWdlLFxuICAgICAgICAgIChBUlJBWV9BR0coZS5hY3Rpb25fbmFtZSkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnQUNUSU9OJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykpWzFdIEFTIGZhaWxpbmdfYWN0aW9uLFxuICAgICAgICAgIChBUlJBWV9BR0coZS5kZXRhaWwtPidmYWlsdXJlJykgRklMVEVSIChXSEVSRSBlLmRldGFpbCA/ICdmYWlsdXJlJykpWzFdIEFTIGZhaWx1cmVcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH0gQU5EIGUuZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtyYW5nZUNsYXVzZX1cbiAgICAgICAgR1JPVVAgQlkgZS5leGVjdXRpb25faWRcbiAgICAgICAgT1JERVIgQlkgTUFYKGUuY3JlYXRlZF9hdCkgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCk7XG4gIH1cblxuICAvKiogU3VjY2VzcyByYXRlIG92ZXIgdGltZSBmb3IgYW4gb3JnLiAqL1xuICBhc3luYyBnZXRTdWNjZXNzUmF0ZShcbiAgICBvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIGJ1Y2tldDogQnVja2V0T3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHsgdHogPSAnVVRDJywgd2Vla1N0YXJ0ID0gJ21vbmRheScgfSA9IGJ1Y2tldDtcbiAgICAvLyBUaGUgYnVja2V0aW5nIHNldHRpbmdzIGFyZSBwYXJ0IG9mIHRoZSBjYWNoZSBLRVk6IHdpdGhvdXQgdGhlbSBhIENoaWNhZ29cbiAgICAvLyByZXF1ZXN0IGFuZCBhIFVUQyByZXF1ZXN0IHNoYXJlIGFuIGVudHJ5IGFuZCBvbmUgb2YgdGhlbSBnZXRzIHRoZSBvdGhlcidzIHdlZWtzLlxuICAgIHJldHVybiByZXBvcnQ8VGltZVNlcmllc0VudHJ5Pihgc3VjY2Vzcy1yYXRlOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b306JHtidWNrZXRLZXkodHosIHdlZWtTdGFydCl9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtwZXJpb2RCdWNrZXQoaW50ZXJ2YWwsIHNxbGBlLnN0YXJ0ZWRfYXRgLCB0eiwgd2Vla1N0YXJ0KX06OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0NBTkNFTEVEJyk6OmludCBBUyBjYW5jZWxlZCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBzdWNjZXNzX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcpXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCk7XG4gIH1cblxuICAvKiogQXZlcmFnZSBkdXJhdGlvbiBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldEF2ZXJhZ2VEdXJhdGlvbihvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxEdXJhdGlvblN0YXRzW10+IHtcbiAgICByZXR1cm4gcmVwb3J0PER1cmF0aW9uU3RhdHM+KGBhdmctZHVyYXRpb246JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucHJvamVjdCwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNSU4oZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtaW5fbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjk1KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGUuZHVyYXRpb25fbXMpOjppbnQgQVMgcDk1X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZXhlY3V0aW9uc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcC5pZCBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKiogU3RhZ2UgZmFpbHVyZSBoZWF0bWFwIOKAlCB3aGljaCBzdGFnZXMgZmFpbCBtb3N0LiAqL1xuICBhc3luYyBnZXRTdGFnZUZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPFN0YWdlRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxTdGFnZUZhaWx1cmU+KGBzdGFnZS1mYWlsdXJlczoke2Zyb219OiR7dG99YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXN0aW5jdCBkZXBsb3kgYGVudmlyb25tZW50YCB2YWx1ZXMgb2JzZXJ2ZWQgaW4gdGhlIHdpbmRvdyDigJQgcG93ZXJzIHRoZVxuICAgKiBET1JBIGVudmlyb25tZW50LXNjb3BlIGRhdGFsaXN0LiBPcmctc2NvcGVkICsgcm9sbHVwLWF3YXJlIGxpa2UgdGhlIHNpYmxpbmdcbiAgICogcmVwb3J0czsgb25seSBub24tbnVsbCBlbnZpcm9ubWVudHMgKGkuZS4gZGVwbG95LWF0dHJpYnV0ZWQgZXhlY3V0aW9ucykuXG4gICAqL1xuICBhc3luYyBnZXRSZXBvcnRFbnZpcm9ubWVudHMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcmVwb3J0PHsgZW52aXJvbm1lbnQ6IHN0cmluZyB9PihgcmVwb3J0LWVudnM6JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVCBESVNUSU5DVCBlLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBPUkRFUiBCWSBlbnZpcm9ubWVudFxuICAgICAgYCk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy5lbnZpcm9ubWVudCk7XG4gIH1cblxuICAvKiogU3RhZ2UgYm90dGxlbmVja3Mg4oCUIHNsb3dlc3Qgc3RhZ2VzIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0U3RhZ2VCb3R0bGVuZWNrcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxTdGFnZUJvdHRsZW5lY2tbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8U3RhZ2VCb3R0bGVuZWNrPihgc3RhZ2UtYm90dGxlbmVja3M6JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucGlwZWxpbmVfbmFtZSwgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIHAuaWQsIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKiogQWN0aW9uIGZhaWx1cmUgcmF0ZSDigJQgd2hpY2ggcGx1Z2luIHN0ZXBzIGZhaWwgbW9zdC4gKi9cbiAgYXN5bmMgZ2V0QWN0aW9uRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QWN0aW9uRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxBY3Rpb25GYWlsdXJlPihgYWN0aW9uLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmFjdGlvbl9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLmFjdGlvbl9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgZS5hY3Rpb25fbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFcnJvciBjYXRlZ29yaXphdGlvbiDigJQgZ3JvdXAgZmFpbHVyZSBtZXNzYWdlcy4gRXhlY3V0aW9uIHJlcG9ydCwgc29cbiAgICogcm9sbHVwLWF3YXJlIGV4YWN0bHkgbGlrZSB0aGUgc2libGluZyBleGVjdXRpb24gcmVwb3J0czogd2l0aCBgb3JnSWRzYFxuICAgKiAodGhlIG9yZ+KGknRlYW0gc3VidHJlZSkgdGhlIG9yZyBnYXRlIGJlY29tZXMgYW4gYElOICguLi4pYCBhbmQgdGhlIHJlYWQgcnVuc1xuICAgKiBmcmVzaCB1bmRlciBzeXNhZG1pbiB2aWEgYHJ1blJlcG9ydGA7IHNpbmdsZS1vcmcgcmVhZHMga2VlcCB0aGUgcGVyLW9yZyBjYWNoZS5cbiAgICovXG4gIGFzeW5jIGdldEVycm9ycyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCwgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEVycm9yRW50cnlbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8RXJyb3JFbnRyeT4oYGVycm9yczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgU1VCU1RSSU5HKGUuZXJyb3JfbWVzc2FnZSBGUk9NIDEgRk9SIDIwMCkgQVMgZXJyb3JfcGF0dGVybixcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIENPVU5UKERJU1RJTkNUIGUucGlwZWxpbmVfaWQpOjppbnQgQVMgYWZmZWN0ZWRfcGlwZWxpbmVzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnIEFORCBlLmVycm9yX21lc3NhZ2UgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBlcnJvcl9wYXR0ZXJuIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3VyIERPUkEgbWVhc3VyZXMgcGx1cyB0aGVpciBwZXItZW52aXJvbm1lbnQgYnJlYWtkb3duLlxuICAgKiBJbXBsZW1lbnRhdGlvbiBpbiAuL3JlcG9ydGluZy9kb3JhLnRzIOKAlCBzZWUgdGhhdCBmaWxlJ3MgaGVhZGVyIGZvciB3aHkuXG4gICAqL1xuICBnZXREb3JhTWV0cmljcyhcbiAgICBvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPERvcmFNZXRyaWNzPiB7XG4gICAgcmV0dXJuIGRvcmFNZXRyaWNzKG9yZ0lkLCBmcm9tLCB0bywgb3JnSWRzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKiBET1JBIG1lYXN1cmVzIGJ1Y2tldGVkIG92ZXIgdGltZS4gKi9cbiAgZ2V0RG9yYVRyZW5kKFxuICAgIG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYVRyZW5kUG9pbnRbXT4ge1xuICAgIHJldHVybiBkb3JhVHJlbmQob3JnSWQsIGludGVydmFsLCBmcm9tLCB0bywgb3JnSWRzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKiBQZXItcGlwZWxpbmUgYnVpbGQgaGVhbHRoIChzdGFnZSBwYXNzIHJhdGVzIG92ZXIgYSB3aW5kb3cpLiAqL1xuICBnZXRCdWlsZEhlYWx0aChcbiAgICBvcmdJZDogc3RyaW5nLCBwaXBlbGluZUlkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sXG4gICk6IFByb21pc2U8QnVpbGRIZWFsdGg+IHtcbiAgICByZXR1cm4gYnVpbGRIZWFsdGgob3JnSWQsIHBpcGVsaW5lSWQsIGZyb20sIHRvLCBvcmdJZHMpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UGx1Z2luU3VtbWFyeShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5TdW1tYXJ5PiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tc3VtbWFyeWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgTk9UICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgaW5hY3RpdmUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAncHVibGljJyk6OmludCBBUyBwdWJsaWMsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAnb3JnJyk6OmludCBBUyBvcmcsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAncHJpdmF0ZScpOjppbnQgQVMgcHJpdmF0ZSxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCAke3NjaGVtYS5wbHVnaW4ubmFtZX0pOjppbnQgQVMgdW5pcXVlX25hbWVzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgIGApKTtcbiAgICAgIHJldHVybiAoZHJpenpsZVJvd3M8UGx1Z2luU3VtbWFyeT4ocm93cy5yb3dzKVswXSB8fCB7IHRvdGFsOiAwLCBhY3RpdmU6IDAsIGluYWN0aXZlOiAwLCBwdWJsaWM6IDAsIG9yZzogMCwgcHJpdmF0ZTogMCwgdW5pcXVlTmFtZXM6IDAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogVHlwZSAmIGNvbXB1dGUgZGlzdHJpYnV0aW9uLlxuICAgKiAgSU5URU5USU9OQUxMWSBTSU5HTEUtT1JHIChubyByb2xsdXApOiBwbHVnaW4gaW52ZW50b3J5IGlzIHBlci1vcmcgKHNlZVxuICAgKiAgZ2V0UGx1Z2luU3VtbWFyeSkuIFNpbmdsZSBgPSAkb3JnYCBzY29wZS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luRGlzdHJpYnV0aW9uKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uW10+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi1kaXN0cmlidXRpb25gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSBBUyBwbHVnaW5fdHlwZSxcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9IEFTIGNvbXB1dGVfdHlwZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGNvdW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSwgJHtzY2hlbWEucGx1Z2luLmNvbXB1dGVUeXBlfVxuICAgICAgICBPUkRFUiBCWSBjb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VHlwZUNvbXB1dGVEaXN0cmlidXRpb24+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIFZlcnNpb24gY291bnRzIHBlciBwbHVnaW4gbmFtZS5cbiAgICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBwZXItb3JnIChzZWVcbiAgICogIGdldFBsdWdpblN1bW1hcnkpLiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4gIGFzeW5jIGdldFBsdWdpblZlcnNpb25zKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFZlcnNpb25Db3VudFtdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tdmVyc2lvbnNgLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5uYW1lfSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHZlcnNpb25fY291bnQsXG4gICAgICAgICAgLS0gSGlnaGVzdCB2ZXJzaW9uIGJ5IE5VTUVSSUMgc2VtdmVyIGNvcmUgKG5vdCBsZXhpY2FsOiAnMTAuMC4wJyA+ICc5LjAuMCcpLlxuICAgICAgICAgIC0tIFN0cmlwIGFueSAtcHJlcmVsZWFzZS8rYnVpbGQgc3VmZml4IGJlZm9yZSB0aGUgaW50W10gY2FzdCBzbyBpdCBjYW4ndFxuICAgICAgICAgIC0tIGVycm9yIG9uIHZhbGlkIHNlbXZlcjsga2VlcCB0aGUgb3JpZ2luYWwgc3RyaW5nIGZvciBkaXNwbGF5LlxuICAgICAgICAgIC0tIEdVQVJEOiBhIG5vbi1udW1lcmljLWRvdHRlZCB2ZXJzaW9uICgnbGF0ZXN0JywgJycsICd2MScpIHdvdWxkIG1ha2UgdGhlXG4gICAgICAgICAgLS0gOjppbnRbXSBjYXN0IHRocm93IGFuZCBibG93IHVwIHRoZSBXSE9MRSBvcmcgc3VtbWFyeS4gT25seSBjYXN0IHJvd3NcbiAgICAgICAgICAtLSB3aG9zZSBzdHJpcHBlZCBjb3JlIG1hdGNoZXMgYSBudW1lcmljLWRvdHRlZCBzaGFwZTsgc29ydCBldmVyeXRoaW5nXG4gICAgICAgICAgLS0gZWxzZSB0byB0aGUgYm90dG9tIHZpYSBhIHNlbnRpbmVsIEFSUkFZWy0xXSBzbyB0aGUgcm93IHN0aWxsIGNvdW50cy5cbiAgICAgICAgICAoYXJyYXlfYWdnKCR7c2NoZW1hLnBsdWdpbi52ZXJzaW9ufVxuICAgICAgICAgICAgIE9SREVSIEJZIENBU0VcbiAgICAgICAgICAgICAgIFdIRU4gcmVnZXhwX3JlcGxhY2UoJHtzY2hlbWEucGx1Z2luLnZlcnNpb259LCAnWy0rXS4qJCcsICcnKSB+ICdeWzAtOV0rKFsuXVswLTldKykqJCdcbiAgICAgICAgICAgICAgICAgVEhFTiBzdHJpbmdfdG9fYXJyYXkocmVnZXhwX3JlcGxhY2UoJHtzY2hlbWEucGx1Z2luLnZlcnNpb259LCAnWy0rXS4qJCcsICcnKSwgJy4nKTo6aW50W11cbiAgICAgICAgICAgICAgIEVMU0UgQVJSQVlbLTFdXG4gICAgICAgICAgICAgRU5EIERFU0NcbiAgICAgICAgICApKVsxXSBBUyBsYXRlc3RfdmVyc2lvbixcbiAgICAgICAgICBib29sX29yKCR7c2NoZW1hLnBsdWdpbi5pc0RlZmF1bHR9KSBBUyBoYXNfZGVmYXVsdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ubmFtZX1cbiAgICAgICAgT1JERVIgQlkgdmVyc2lvbl9jb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VmVyc2lvbkNvdW50PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBzdWNjZXNzIHJhdGUgb3ZlciB0aW1lLlxuICAgKlxuICAgKiBTVEFUVVMgQ0FTSU5HIE5PVEU6IFRoaXMgcXVlcnkgZmlsdGVycyBieSBgZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdgXG4gICAqIGFuZCB1c2VzIGxvd2VyY2FzZSBzdGF0dXMgdmFsdWVzIChgJ2NvbXBsZXRlZCdgLCBgJ2ZhaWxlZCdgKSwgd2hpbGVcbiAgICogYGdldFN1Y2Nlc3NSYXRlYCAoMS4yKSBmaWx0ZXJzIGJ5IGBldmVudF90eXBlID0gJ1BJUEVMSU5FJ2Agd2l0aFxuICAgKiB1cHBlcmNhc2UgQVdTLXN0eWxlIHN0YXR1c2VzIChgJ1NVQ0NFRURFRCdgLCBgJ0ZBSUxFRCdgLCBgJ0NBTkNFTEVEJ2ApLlxuICAgKiBUaGUgY2FzaW5nIGRyaWZ0IGlzIGludGVudGlvbmFsIGFuZCB0cmFja3MgdGhlIHByb2R1Y2VyOlxuICAgKiAgIC0gYHBsdWdpbi1idWlsZGAgZXZlbnRzIGNvbWUgZnJvbSBvdXIgb3duIGJ1aWxkIHBpcGVsaW5lIChsb3dlcmNhc2UpXG4gICAqICAgLSBgUElQRUxJTkVgIGV2ZW50cyBjb21lIGZyb20gQVdTIENvZGVQaXBlbGluZSAodXBwZXJjYXNlKVxuICAgKiBUaGUgaW5nZXN0IFpvZCBzY2hlbWEgYXQgYXBpL3JlcG9ydGluZy9zcmMvcm91dGVzL2V2ZW50LWluZ2VzdC50c1xuICAgKiBTSE9VTEQgZW51bSB0aGVzZSBwZXItZXZlbnRTb3VyY2Ugc28gd2UgY2F0Y2ggZHJpZnQgYXQgaW5nZXN0IHJhdGhlclxuICAgKiB0aGFuIHNpbGVudGx5IHByb2R1Y2luZyB6ZXJvIHJvd3MgaGVyZS4gU2VlIGZpbmRpbmdzIE43MS5cbiAgICovXG4gIGFzeW5jIGdldEJ1aWxkU3VjY2Vzc1JhdGUoXG4gICAgb3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgICBidWNrZXQ6IEJ1Y2tldE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxCdWlsZFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHsgdHogPSAnVVRDJywgd2Vla1N0YXJ0ID0gJ21vbmRheScgfSA9IGJ1Y2tldDtcbiAgICAvLyBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZSBsaWtlIHRoZSBleGVjdXRpb24gcmVwb3J0cy4gVGhlc2VcbiAgICAvLyByb3dzIGFyZSBnYXRlZCBvbiB0aGUgcGlwZWxpbmVfZXZlbnQgYG9yZ19pZGAgZGlyZWN0bHkgKG5vIHBpcGVsaW5lIGpvaW4pLFxuICAgIC8vIHNvIGBwcmVkYCBhcHBsaWVzIHRvIGBlLm9yZ19pZGAuXG4gICAgcmV0dXJuIHJlcG9ydDxCdWlsZFRpbWVTZXJpZXNFbnRyeT4oYGJ1aWxkLXN1Y2Nlc3M6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfToke2J1Y2tldEtleSh0eiwgd2Vla1N0YXJ0KX1gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3BlcmlvZEJ1Y2tldChpbnRlcnZhbCwgc3FsYGUuc3RhcnRlZF9hdGAsIHR6LCB3ZWVrU3RhcnQpfTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2ZhaWxlZCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnY29tcGxldGVkJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnY29tcGxldGVkJywgJ2ZhaWxlZCcpXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCk7XG4gIH1cblxuICAvKiogQnVpbGQgZHVyYXRpb24gcGVyIHBsdWdpbi4gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUuICovXG4gIGFzeW5jIGdldEJ1aWxkRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QnVpbGREdXJhdGlvbltdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxCdWlsZER1cmF0aW9uPihgYnVpbGQtZHVyYXRpb246JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBidWlsZHNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCcgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKiogQnVpbGQgZmFpbHVyZXMg4oCUIHRvcCBlcnJvciBtZXNzYWdlcy4gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUuICovXG4gIGFzeW5jIGdldEJ1aWxkRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMjAsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxCdWlsZEZhaWx1cmVbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8QnVpbGRGYWlsdXJlPihgYnVpbGQtZmFpbHVyZXM6JHtmcm9tfToke3RvfToke2xpbWl0fWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIGUuZXJyb3JfbWVzc2FnZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5zdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIHBsdWdpbl9uYW1lLCBlLmVycm9yX21lc3NhZ2VcbiAgICAgICAgT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCk7XG4gIH1cblxuICAvLyDilIDilIAgUGx1Z2luIHJ1bnRpbWUgdGVsZW1ldHJ5IOKAlCBzZWUgLi9yZXBvcnRpbmcvcGx1Z2luLXJ1bnRpbWUudHMg4pSA4pSAXG5cbiAgLyoqXG4gICAqIFBsdWdpbiBydW50aW1lOiBwZXIgcGx1Z2luIHZlcnNpb24gcnVucywgc3VjY2VzcyByYXRlIGFuZCBwNTAvcDk1XG4gICAqIGR1cmF0aW9uIG92ZXIgYFtmcm9tLCB0b11gLCBmcm9tIHRoZSBtYW5pZmVzdC1hdHRyaWJ1dGVkIEFDVElPTiBldmVudHMuXG4gICAqIFJvbGx1cC1hd2FyZS5cbiAgICovXG4gIGFzeW5jIGdldFBsdWdpblJ1bnRpbWUob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBmaWx0ZXI/OiBQbHVnaW5SdW50aW1lRmlsdGVyLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luUnVudGltZVN0YXRzW10+IHtcbiAgICByZXR1cm4gcGx1Z2luUnVudGltZShvcmdJZCwgZnJvbSwgdG8sIGZpbHRlciwgb3JnSWRzKTtcbiAgfVxuXG4gIC8qKiBDcm9zcy1vcmcgMzAtZGF5IHJ1bnRpbWUgYWdncmVnYXRlIGZvciBhIGAocHVibGlzaGVyLCBuYW1lKWAgbGlzdGluZyAocGx1Z2luX3N0YXRzIGlucHV0KS4gU2VydmljZSBjYWxsZXJzIG9ubHkuICovXG4gIGFzeW5jIGdldFBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUocHVibGlzaGVyOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGx1Z2luUnVudGltZUFnZ3JlZ2F0ZT4ge1xuICAgIHJldHVybiBwbHVnaW5SdW50aW1lQWdncmVnYXRlKHB1Ymxpc2hlciwgbmFtZSk7XG4gIH1cblxuICAvKiogUmV2aWV3IFwidmVyaWZpZWQgdXNlXCI6IGBvcmdJZGAgcmFuIGAocHVibGlzaGVyLCBuYW1lKWAgc3VjY2Vzc2Z1bGx5IHdpdGhpbiA5MCBkYXlzLiBTZXJ2aWNlIGNhbGxlcnMgb25seS4gKi9cbiAgYXN5bmMgaGFzVmVyaWZpZWRQbHVnaW5Vc2Uob3JnSWQ6IHN0cmluZywgcHVibGlzaGVyOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB2ZXJpZmllZFBsdWdpblVzZShvcmdJZCwgcHVibGlzaGVyLCBuYW1lKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAzOiBET1JBIHdyaXRlIHBhdGhzIChwb3N0LWRlcGxveSBvdXRjb21lcyArIGluZ2VzdCBoZWFsdGgpIOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBtYW51YWwgcG9zdC1kZXBsb3kgb3V0Y29tZSBtYXJrZXI6IGEgdXNlciBtYXJrcyBhXG4gICAqIGRlcGxveW1lbnQgYGZhaWxlZGAgKGEgcHJvZHVjdGlvbiBpbmNpZGVudCBsaW5rZWQgdG8gdGhlIGRlcGxveSkgb3JcbiAgICogYHJlc3RvcmVkYCAocmVjb3ZlcmVkKS4gSWRlbXBvdGVudCDigJQga2V5ZWQgb24gKGV4ZWN1dGlvbl9pZCwgb3V0Y29tZSkgc28gYVxuICAgKiBkdXBsaWNhdGUgUE9TVCByZWZyZXNoZXMgYGF0YCByYXRoZXIgdGhhbiBkb3VibGUtY291bnRpbmcsIHdoaWxlIGFcbiAgICogZmFpbGVk4oaScmVzdG9yZWQgcGFpciBzdGF5cyB0d28gcm93cy4gRmVlZHMgdGhlIHBvc3QtZGVwbG95IENGUiBjb21wb25lbnQgYW5kXG4gICAqIHRoZSByZWFsIE1UVFIuIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0IChSTFMgV0lUSCBDSEVDSykuXG4gICAqL1xuICBhc3luYyByZWNvcmREZXBsb3ltZW50T3V0Y29tZShcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgaW5wdXQ6IHsgb3V0Y29tZTogJ2ZhaWxlZCcgfCAncmVzdG9yZWQnOyBhdDogc3RyaW5nOyBlbnZpcm9ubWVudD86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPERlcGxveW1lbnRPdXRjb21lV3JpdGU+IHtcbiAgICAvLyBUaGUgcHJpb3IgbWFya2VyIChpZiBhbnkpIGlzIHJlYWQgaW4gdGhlIFNBTUUgdHggYXMgdGhlIHVwc2VydCBzbyB0aGVcbiAgICAvLyBjYWxsZXIncyBhdWRpdCByb3cgY2FuIGNhcnJ5IGJlZm9yZS9hZnRlcjogYSByZS1QT1NUIHRoYXQgbW92ZXMgYGF0YFxuICAgIC8vIHJld3JpdGVzIHdoZW4gdGhlIG9yZydzIENGUi9NVFRSIGNsb2NrIHN0YXJ0ZWQsIGFuZCBcImZyb20gd2hhdFwiIGlzIHRoZVxuICAgIC8vIGhhbGYgYSByZXZpZXdlciBjYW5ub3QgcmVjb25zdHJ1Y3QgYWZ0ZXJ3YXJkcy5cbiAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgICAgY29uc3QgW3ByaW9yXSA9IGF3YWl0IHR4XG4gICAgICAgICAgLnNlbGVjdCh7IGF0OiBzY2hlbWEuZGVwbG95bWVudE91dGNvbWUuYXQsIGVudmlyb25tZW50OiBzY2hlbWEuZGVwbG95bWVudE91dGNvbWUuZW52aXJvbm1lbnQgfSlcbiAgICAgICAgICAuZnJvbShzY2hlbWEuZGVwbG95bWVudE91dGNvbWUpXG4gICAgICAgICAgLndoZXJlKGFuZChlcShzY2hlbWEuZGVwbG95bWVudE91dGNvbWUuZXhlY3V0aW9uSWQsIGV4ZWN1dGlvbklkKSwgZXEoc2NoZW1hLmRlcGxveW1lbnRPdXRjb21lLm91dGNvbWUsIGlucHV0Lm91dGNvbWUpKSlcbiAgICAgICAgICAubGltaXQoMSk7XG4gICAgICAgIGF3YWl0IHR4Lmluc2VydChzY2hlbWEuZGVwbG95bWVudE91dGNvbWUpLnZhbHVlcyh7XG4gICAgICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICAgICAgb3JnSWQsXG4gICAgICAgICAgZW52aXJvbm1lbnQ6IHNjcnViT3B0aW9uYWwoaW5wdXQuZW52aXJvbm1lbnQpLFxuICAgICAgICAgIG91dGNvbWU6IGlucHV0Lm91dGNvbWUsXG4gICAgICAgICAgYXQ6IG5ldyBEYXRlKGlucHV0LmF0KSxcbiAgICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgICB0YXJnZXQ6IFtzY2hlbWEuZGVwbG95bWVudE91dGNvbWUuZXhlY3V0aW9uSWQsIHNjaGVtYS5kZXBsb3ltZW50T3V0Y29tZS5vdXRjb21lXSxcbiAgICAgICAgICBzZXQ6IHtcbiAgICAgICAgICAgIGF0OiBuZXcgRGF0ZShpbnB1dC5hdCksXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogc2NydWJPcHRpb25hbChpbnB1dC5lbnZpcm9ubWVudCkgPz8gbnVsbCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHByaW9yID8geyBhdDogaXNvT3JOdWxsKHByaW9yLmF0KSwgZW52aXJvbm1lbnQ6IHByaW9yLmVudmlyb25tZW50ID8/IG51bGwgfSA6IG51bGw7XG4gICAgICB9KSxcbiAgICApO1xuICAgIC8vIE91dGNvbWUgY2hhbmdlcyB0aGUgRE9SQSBhZ2dyZWdhdGUg4oCUIGRyb3AgdGhlIG9yZydzIGNhY2hlZCByZXBvcnRzLlxuICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZU9yZyhvcmdJZCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlcG9ydGluZyBjYWNoZSBpbnZhbGlkYXRpb24gZmFpbGVkJywgeyBvcmdJZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7IHByZXZpb3VzIH07XG4gIH1cblxuICAvKipcbiAgICogSW5nZXN0IGEgcHJvZHVjdGlvbiBpbmNpZGVudCBmcm9tIHRoZSBvcmcncyBpbmNpZGVudCB0b29saW5nXG4gICAqIChQYWdlckR1dHkgLyBEYXRhZG9nIC8gQWxlcnRtYW5hZ2VyIHdlYmhvb2spLiBJZGVtcG90ZW50IOKAlCBrZXllZCBvblxuICAgKiAob3JnX2lkLCBpbmNpZGVudF9pZCkgc28gYSBsYXRlciByZXNvbHZlIHJlLXBvc3QgdXBzZXJ0cyBgcmVzb2x2ZWRfYXRgXG4gICAqIChhbmQgcmVmcmVzaGVzIHRoZSBvdGhlciBtdXRhYmxlIGZpZWxkcykgaW5zdGVhZCBvZiBpbnNlcnRpbmcgYSBkdXBsaWNhdGUuXG4gICAqIERPUkEgY29ycmVsYXRlcyBlYWNoIGluY2lkZW50IHRvIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSB0byBpdHNcbiAgICogYGVudmlyb25tZW50YCwgcHJvZHVjaW5nIGFuIGF1dG9tYXRlZCBwb3N0LWRlcGxveSBmYWlsdXJlICsgYSByZWFsIE1UVFIuXG4gICAqIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0IChSTFMgV0lUSCBDSEVDSyk7IGZyZWUtZm9ybSBmaWVsZHMgYXJlXG4gICAqIEFXUy1pZCBzY3J1YmJlZCBhdCB0aGlzIHBlcnNpc3RlbmNlIGJvdW5kYXJ5IGxpa2UgdGhlIG90aGVyIGluZ2VzdCBwYXRocy5cbiAgICovXG4gIGFzeW5jIHJlY29yZEluY2lkZW50KG9yZ0lkOiBzdHJpbmcsIGlucHV0OiBJbmNpZGVudElucHV0KTogUHJvbWlzZTxJbmNpZGVudFdyaXRlPiB7XG4gICAgY29uc3QgaW5jaWRlbnRJZCA9IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGlucHV0LmluY2lkZW50SWQpO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoaW5wdXQuZW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IHNldmVyaXR5ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoaW5wdXQuc2V2ZXJpdHkpO1xuICAgIGNvbnN0IG9wZW5lZEF0ID0gbmV3IERhdGUoaW5wdXQub3BlbmVkQXQpO1xuICAgIGNvbnN0IHJlc29sdmVkQXQgPSBpbnB1dC5yZXNvbHZlZEF0ID8gbmV3IERhdGUoaW5wdXQucmVzb2x2ZWRBdCkgOiBudWxsO1xuICAgIGNvbnN0IHsgcHJldmlvdXMsIHN0b3JlZCB9ID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgICAvLyBSZWFkIHRoZSBwcmlvciByb3cgaW4gdGhlIHNhbWUgdHggc28gdGhlIGNhbGxlciBjYW4gdGVsbCBhIE5FVyBvclxuICAgICAgICAvLyBDSEFOR0VEIGluY2lkZW50IGZyb20gYSBzZW5kZXIncyByZXBlYXQtaW50ZXJ2YWwgcmUtcG9zdCBvZiB0aGUgc2FtZVxuICAgICAgICAvLyBmaXJpbmcgYWxlcnQgKHdoaWNoIGNoYW5nZXMgbm90aGluZyBhbmQgaXMgbm90IHdvcnRoIGFuIGF1ZGl0IHJvdykuXG4gICAgICAgIGNvbnN0IFtwcmlvcl0gPSBhd2FpdCB0eFxuICAgICAgICAgIC5zZWxlY3Qoe1xuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHNjaGVtYS5pbmNpZGVudC5lbnZpcm9ubWVudCxcbiAgICAgICAgICAgIG9wZW5lZEF0OiBzY2hlbWEuaW5jaWRlbnQub3BlbmVkQXQsXG4gICAgICAgICAgICByZXNvbHZlZEF0OiBzY2hlbWEuaW5jaWRlbnQucmVzb2x2ZWRBdCxcbiAgICAgICAgICAgIHNldmVyaXR5OiBzY2hlbWEuaW5jaWRlbnQuc2V2ZXJpdHksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZnJvbShzY2hlbWEuaW5jaWRlbnQpXG4gICAgICAgICAgLndoZXJlKGFuZChlcShzY2hlbWEuaW5jaWRlbnQub3JnSWQsIG9yZ0lkKSwgZXEoc2NoZW1hLmluY2lkZW50LmluY2lkZW50SWQsIGluY2lkZW50SWQpKSlcbiAgICAgICAgICAubGltaXQoMSk7XG4gICAgICAgIGNvbnN0IFtyb3ddID0gYXdhaXQgdHguaW5zZXJ0KHNjaGVtYS5pbmNpZGVudCkudmFsdWVzKHtcbiAgICAgICAgICBpbmNpZGVudElkLFxuICAgICAgICAgIG9yZ0lkLFxuICAgICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICAgIG9wZW5lZEF0LFxuICAgICAgICAgIHJlc29sdmVkQXQsXG4gICAgICAgICAgc2V2ZXJpdHksXG4gICAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgICAgdGFyZ2V0OiBbc2NoZW1hLmluY2lkZW50Lm9yZ0lkLCBzY2hlbWEuaW5jaWRlbnQuaW5jaWRlbnRJZF0sXG4gICAgICAgICAgLy8gQSByZWRlbGl2ZXJlZCBGSVJJTkcgcG9zdCAobm8gcmVzb2x2ZWRBdCkgbXVzdCBub3Qgd2lwZSBhIHJlY29yZGVkXG4gICAgICAgICAgLy8gcmVzb2x2ZSDigJQgc2VuZGVycyByZS1wb3N0IGZpcmluZyBhbGVydHMgb24gZXZlcnkgcmVwZWF0IGludGVydmFsLCBhbmRcbiAgICAgICAgICAvLyBkZWxpdmVyeSBvcmRlciBpc24ndCBndWFyYW50ZWVkLiBLZWVwIHRoZSBzdG9yZWQgcmVzb2x2ZSB1bmxlc3MgdGhlXG4gICAgICAgICAgLy8gcG9zdCBjYXJyaWVzIGl0cyBvd24sIG9yIHRoZSBpbmNpZGVudCB3YXMgUkUtT1BFTkVEIChhIGRpZmZlcmVudFxuICAgICAgICAgIC8vIG9wZW5lZEF0IG1lYW5zIGEgbmV3IG9jY3VycmVuY2UsIHdob3NlIHJlc29sdmUgc3RhdGUgaXMgdGhlIHBvc3QncykuXG4gICAgICAgICAgc2V0OiB7XG4gICAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICAgIG9wZW5lZEF0LFxuICAgICAgICAgICAgcmVzb2x2ZWRBdDogc3FsYENBU0UgV0hFTiAke3NjaGVtYS5pbmNpZGVudC5vcGVuZWRBdH0gPSBleGNsdWRlZC5vcGVuZWRfYXRcbiAgICAgICAgICAgICAgVEhFTiBDT0FMRVNDRShleGNsdWRlZC5yZXNvbHZlZF9hdCwgJHtzY2hlbWEuaW5jaWRlbnQucmVzb2x2ZWRBdH0pXG4gICAgICAgICAgICAgIEVMU0UgZXhjbHVkZWQucmVzb2x2ZWRfYXQgRU5EYCxcbiAgICAgICAgICAgIHNldmVyaXR5LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLnJldHVybmluZyh7IHJlc29sdmVkQXQ6IHNjaGVtYS5pbmNpZGVudC5yZXNvbHZlZEF0IH0pO1xuICAgICAgICByZXR1cm4geyBwcmV2aW91czogcHJpb3IgPz8gbnVsbCwgc3RvcmVkOiByb3cgfTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgLy8gQSBuZXcvdXBkYXRlZCBpbmNpZGVudCBjaGFuZ2VzIHRoZSBET1JBIGFnZ3JlZ2F0ZSDigJQgZHJvcCBjYWNoZWQgcmVwb3J0cy5cbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVPcmcob3JnSWQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBhZnRlciA9IHtcbiAgICAgIGVudmlyb25tZW50LFxuICAgICAgb3BlbmVkQXQ6IG9wZW5lZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICByZXNvbHZlZEF0OiBpc29Pck51bGwoc3RvcmVkPy5yZXNvbHZlZEF0ID8/IG51bGwpLFxuICAgICAgc2V2ZXJpdHksXG4gICAgfTtcbiAgICBjb25zdCBiZWZvcmUgPSBwcmV2aW91c1xuICAgICAgPyB7XG4gICAgICAgIGVudmlyb25tZW50OiBwcmV2aW91cy5lbnZpcm9ubWVudCxcbiAgICAgICAgb3BlbmVkQXQ6IGlzb09yTnVsbChwcmV2aW91cy5vcGVuZWRBdCksXG4gICAgICAgIHJlc29sdmVkQXQ6IGlzb09yTnVsbChwcmV2aW91cy5yZXNvbHZlZEF0KSxcbiAgICAgICAgc2V2ZXJpdHk6IHByZXZpb3VzLnNldmVyaXR5LFxuICAgICAgfVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGNoYW5nZWQgPSBiZWZvcmUgPT09IG51bGxcbiAgICAgIHx8IGJlZm9yZS5lbnZpcm9ubWVudCAhPT0gYWZ0ZXIuZW52aXJvbm1lbnRcbiAgICAgIHx8IGJlZm9yZS5vcGVuZWRBdCAhPT0gYWZ0ZXIub3BlbmVkQXRcbiAgICAgIHx8IGJlZm9yZS5yZXNvbHZlZEF0ICE9PSBhZnRlci5yZXNvbHZlZEF0XG4gICAgICB8fCBiZWZvcmUuc2V2ZXJpdHkgIT09IGFmdGVyLnNldmVyaXR5O1xuICAgIHJldHVybiB7IGluY2lkZW50SWQsIGNyZWF0ZWQ6IGJlZm9yZSA9PT0gbnVsbCwgY2hhbmdlZCwgYmVmb3JlLCBhZnRlciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIHBlci1vcmcgRE9SQSBzZXR0aW5ncy4gUmV0dXJucyB0aGUgc3RvcmVkXG4gICAqIGBpbmNpZGVudFdpbmRvd0hvdXJzYCBvdmVycmlkZSAob3IgYG51bGxgIHdoZW4gdW5zZXQpIHBsdXMgdGhlIGdsb2JhbCBlbnZcbiAgICogZGVmYXVsdCwgc28gdGhlIHNldHRpbmdzIFVJIGNhbiBzaG93IGJvdGguIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIHRlbmFudFxuICAgKiBjb250ZXh0IChSTFMtc2NvcGVkKTsgYSBzaW5nbGUtb3JnIHJlYWQuXG4gICAqL1xuICBhc3luYyBnZXRSZXBvcnRpbmdTZXR0aW5ncyhvcmdJZDogc3RyaW5nLCByZXRlbnRpb25PcmdJZDogc3RyaW5nID0gb3JnSWQpOiBQcm9taXNlPFJlcG9ydGluZ1NldHRpbmdzPiB7XG4gICAgY29uc3Qgcm93cyA9IGRyaXp6bGVSb3dzPHtcbiAgICAgIGluY2lkZW50X3dpbmRvd19ob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGV2ZW50X3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgICAgZG9yYV9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDtcbiAgICB9PigoYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVCAke3NjaGVtYS5kb3JhU2V0dGluZ3MuaW5jaWRlbnRXaW5kb3dIb3Vyc30gQVMgaW5jaWRlbnRfd2luZG93X2hvdXJzLFxuICAgICAgICAgICAgICAgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmV2ZW50UmV0ZW50aW9uRGF5c30gQVMgZXZlbnRfcmV0ZW50aW9uX2RheXMsXG4gICAgICAgICAgICAgICAke3NjaGVtYS5kb3JhU2V0dGluZ3MuZG9yYVJldGVudGlvbkRheXN9IEFTIGRvcmFfcmV0ZW50aW9uX2RheXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5kb3JhU2V0dGluZ3N9XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZH0gPSAke29yZ0lkfVxuICAgICAgICBMSU1JVCAxXG4gICAgICBgKSkpLnJvd3MpO1xuICAgIGNvbnN0IHJvdyA9IHJvd3NbMF07XG4gICAgLy8gUmV0ZW50aW9uIGlzIGEgYmlsbGluZyBlbnRpdGxlbWVudCBzeW5jZWQgb250byB0aGUgYWNjb3VudCBST09UIG9ubHk7IGFcbiAgICAvLyB0ZWFtIHJlYWRzIGl0cyByb290J3Mgd2luZG93ICh0aGUgaW5jaWRlbnQgd2luZG93IHN0YXlzIHRoZSB0ZWFtJ3Mgb3duKS5cbiAgICBjb25zdCByZXRlbnRpb24gPSByZXRlbnRpb25PcmdJZCA9PT0gb3JnSWRcbiAgICAgID8gcm93XG4gICAgICA6IGF3YWl0IHRoaXMuI3JlYWRSZXRlbnRpb25PdmVycmlkZShyZXRlbnRpb25PcmdJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluY2lkZW50V2luZG93SG91cnM6IHJvdz8uaW5jaWRlbnRfd2luZG93X2hvdXJzICE9IG51bGwgPyBOdW1iZXIocm93LmluY2lkZW50X3dpbmRvd19ob3VycykgOiBudWxsLFxuICAgICAgZGVmYXVsdFdpbmRvd0hvdXJzOiBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUyxcbiAgICAgIGV2ZW50UmV0ZW50aW9uRGF5czogcmV0ZW50aW9uPy5ldmVudF9yZXRlbnRpb25fZGF5cyAhPSBudWxsID8gTnVtYmVyKHJldGVudGlvbi5ldmVudF9yZXRlbnRpb25fZGF5cykgOiBudWxsLFxuICAgICAgZG9yYVJldGVudGlvbkRheXM6IHJldGVudGlvbj8uZG9yYV9yZXRlbnRpb25fZGF5cyAhPSBudWxsID8gTnVtYmVyKHJldGVudGlvbi5kb3JhX3JldGVudGlvbl9kYXlzKSA6IG51bGwsXG4gICAgICBkZWZhdWx0RXZlbnRSZXRlbnRpb25EYXlzOiBSRVBPUlRJTkdfRVZFTlRfUkVURU5USU9OX0RBWVMsXG4gICAgICBkZWZhdWx0RG9yYVJldGVudGlvbkRheXM6IFJFUE9SVElOR19ET1JBX1JFVEVOVElPTl9EQVlTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIFJPT1Qgb3JnJ3Mgc3RvcmVkIHJldGVudGlvbiBvdmVycmlkZS4gVGhlIGNhbGxlciAoYSB0ZWFtKSBjYW4ndCBzZWUgdGhlXG4gICAqIHJvb3QncyBgZG9yYV9zZXR0aW5nc2Agcm93IHVuZGVyIGl0cyBvd24gUkxTIHNjb3BlLCBzbyB0aGlzIG5hcnJvdyByZWFkIG9mXG4gICAqIHR3byBpbnRlZ2VyIGNvbHVtbnMg4oCUIGtleWVkIGJ5IHRoZSBleHBsaWNpdCwgSldULWRlcml2ZWQgcm9vdCBpZCDigJQgcnVucyBpbiBhXG4gICAqIHN5c2FkbWluIHNjb3BlLlxuICAgKi9cbiAgYXN5bmMgI3JlYWRSZXRlbnRpb25PdmVycmlkZShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx7IGV2ZW50X3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsOyBkb3JhX3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsIH0gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgYXN5bmMgKCkgPT4gZHJpenpsZVJvd3M8e1xuICAgICAgZXZlbnRfcmV0ZW50aW9uX2RheXM6IG51bWJlciB8IG51bGw7XG4gICAgICBkb3JhX3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgIH0+KChhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5ldmVudFJldGVudGlvbkRheXN9IEFTIGV2ZW50X3JldGVudGlvbl9kYXlzLFxuICAgICAgICAgICAgICAgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmRvcmFSZXRlbnRpb25EYXlzfSBBUyBkb3JhX3JldGVudGlvbl9kYXlzXG4gICAgICAgIEZST00gJHtzY2hlbWEuZG9yYVNldHRpbmdzfVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgYCkpKS5yb3dzKSk7XG4gICAgcmV0dXJuIHJvd3NbMF07XG4gIH1cblxuICAvKipcbiAgICogVXBzZXJ0IHBlci1vcmcgcmVwb3J0aW5nIHNldHRpbmdzIChpbmNpZGVudCB3aW5kb3cgK1xuICAgKiByZXRlbnRpb24gb3ZlcnJpZGVzKSwgaWRlbXBvdGVudCBvbiBgb3JnX2lkYC4gQSBwYXJ0aWFsIHdyaXRlIOKAlCBvbmx5IHRoZVxuICAgKiBmaWVsZHMgcHJlc2VudCBpbiBgcGF0Y2hgIGFyZSBzZXQgKHNvIHVwZGF0aW5nIHJldGVudGlvbiBuZXZlciBjbGVhcnMgdGhlXG4gICAqIGluY2lkZW50IHdpbmRvdywgYW5kIHZpY2UtdmVyc2EpLiBTZXQgc2VsZi1zZXJ2ZSBieSBhbiBvcmcgYWRtaW4gdmlhXG4gICAqIGBQVVQgL2FwaS9yZXBvcnRzL3NldHRpbmdzL2luY2lkZW50c2AuIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0XG4gICAqIChSTFMgV0lUSCBDSEVDSyk7IGEgY2hhbmdlZCB2YWx1ZSBhZmZlY3RzIERPUkEgYWdncmVnYXRlcyBzbyB0aGUgb3JnJ3NcbiAgICogY2FjaGVkIHJlcG9ydHMgYXJlIGRyb3BwZWQuXG4gICAqL1xuICBhc3luYyBzZXRSZXBvcnRpbmdTZXR0aW5ncyhvcmdJZDogc3RyaW5nLCBwYXRjaDogUmVwb3J0aW5nU2V0dGluZ3NQYXRjaCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9O1xuICAgIGlmIChwYXRjaC5pbmNpZGVudFdpbmRvd0hvdXJzICE9PSB1bmRlZmluZWQpIHNldC5pbmNpZGVudFdpbmRvd0hvdXJzID0gcGF0Y2guaW5jaWRlbnRXaW5kb3dIb3VycztcbiAgICBpZiAocGF0Y2guZXZlbnRSZXRlbnRpb25EYXlzICE9PSB1bmRlZmluZWQpIHNldC5ldmVudFJldGVudGlvbkRheXMgPSBwYXRjaC5ldmVudFJldGVudGlvbkRheXM7XG4gICAgaWYgKHBhdGNoLmRvcmFSZXRlbnRpb25EYXlzICE9PSB1bmRlZmluZWQpIHNldC5kb3JhUmV0ZW50aW9uRGF5cyA9IHBhdGNoLmRvcmFSZXRlbnRpb25EYXlzO1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuZG9yYVNldHRpbmdzKS52YWx1ZXMoe1xuICAgICAgICBvcmdJZCxcbiAgICAgICAgaW5jaWRlbnRXaW5kb3dIb3VyczogcGF0Y2guaW5jaWRlbnRXaW5kb3dIb3VycyxcbiAgICAgICAgZXZlbnRSZXRlbnRpb25EYXlzOiBwYXRjaC5ldmVudFJldGVudGlvbkRheXMsXG4gICAgICAgIGRvcmFSZXRlbnRpb25EYXlzOiBwYXRjaC5kb3JhUmV0ZW50aW9uRGF5cyxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkLFxuICAgICAgICBzZXQsXG4gICAgICB9KSksXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVPcmcob3JnSWQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHJlY2VudCBpbmNpZGVudHMgZm9yIGFuIG9yZyAob3JnLWFkbWluIHN1cmZhY2UpLCBuZXdlc3QgZmlyc3QsXG4gICAqIHBhZ2luYXRlZC4gRWFjaCByb3cgY2FycmllcyBpdHMgcmVzb2x2ZWQgc3RhdGUgYW5kIGl0cyBkZXBsb3kgY29ycmVsYXRpb24g4oCUXG4gICAqIHRoZSBtb3N0IHJlY2VudCBTVUNDRVNTRlVMIGRlcGxveSB0byB0aGUgaW5jaWRlbnQncyBgZW52aXJvbm1lbnRgIHdob3NlXG4gICAqIGBjb21wbGV0ZWRfYXRgIGZhbGxzIHdpdGhpbiB0aGUgZWZmZWN0aXZlIHBlci1vcmcgY29ycmVsYXRpb24gd2luZG93IGJlZm9yZVxuICAgKiBgb3BlbmVkX2F0YCAodGhlIHNhbWUgcnVsZSBET1JBJ3MgQ0ZSL01UVFIgY29ycmVsYXRpb24gYXBwbGllcykuIFNpbmdsZS1vcmdcbiAgICogKG5vIHJvbGx1cCkg4oCUIGFuIG9yZyBhZG1pbiB2aWV3cyB0aGVpciBvd24gb3JnJ3MgaW5jaWRlbnRzLiBSTFMtc2NvcGVkIHZpYVxuICAgKiB0aGUgYHAub3JnX2lkYC9gaS5vcmdfaWRgIHByZWRpY2F0ZXMgKyB0aGUgdGVuYW50IGNvbnRleHQuXG4gICAqL1xuICBhc3luYyBsaXN0SW5jaWRlbnRzKG9yZ0lkOiBzdHJpbmcsIG9wdHM6IHsgbGltaXQ6IG51bWJlcjsgb2Zmc2V0OiBudW1iZXIgfSk6IFByb21pc2U8SW5jaWRlbnRMaXN0SXRlbVtdPiB7XG4gICAgY29uc3QgeyBpbmNpZGVudFdpbmRvd0hvdXJzIH0gPSBhd2FpdCB0aGlzLmdldFJlcG9ydGluZ1NldHRpbmdzKG9yZ0lkKTtcbiAgICBjb25zdCB3aW5kb3dIb3VycyA9IHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzKGluY2lkZW50V2luZG93SG91cnMpO1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4ob3B0cy5saW1pdCwgMjAwKSk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgb3B0cy5vZmZzZXQpO1xuICAgIC8vIFRoZSBjb3JyZWxhdGlvbiB3aW5kb3cgaXMgZXhwcmVzc2VkIGluIFNFQ09ORFMgYXMgYSBkb3VibGUsIG5vdCBhc1xuICAgIC8vIGBtYWtlX2ludGVydmFsKGhvdXJzID0+IE46OmludClgLiBUaGUgd2luZG93IGlzIHZhbGlkYXRlZCBhcyBhbnkgcG9zaXRpdmVcbiAgICAvLyBudW1iZXIgKDAuNWggaXMgbGVnYWwpIGFuZCB0aGUgaW4tbWVtb3J5IERPUkEgY29ycmVsYXRpb24gdXNlcyBpdCBleGFjdGx5O1xuICAgIC8vIHRoZSBpbnQgY2FzdCBtYWRlIFBvc3RncmVzIHJlamVjdCBhIGZyYWN0aW9uYWwgdmFsdWUsIHNvIGEgMC41aCB3aW5kb3dcbiAgICAvLyByZXR1cm5lZCA1MDAgZnJvbSB0aGlzIGVuZHBvaW50IGFuZCBmcm9tIHRoZSBjb3JyZWxhdGlvbiBsb29rdXAgYmVsb3cuXG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBpLmluY2lkZW50X2lkIEFTIFwiaW5jaWRlbnRJZFwiLFxuICAgICAgICAgIGkuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsXG4gICAgICAgICAgaS5zZXZlcml0eSBBUyBzZXZlcml0eSxcbiAgICAgICAgICBpLm9wZW5lZF9hdDo6dGV4dCBBUyBcIm9wZW5lZEF0XCIsXG4gICAgICAgICAgaS5yZXNvbHZlZF9hdDo6dGV4dCBBUyBcInJlc29sdmVkQXRcIixcbiAgICAgICAgICBpLmNyZWF0ZWRfYXQ6OnRleHQgQVMgXCJjcmVhdGVkQXRcIixcbiAgICAgICAgICAoaS5yZXNvbHZlZF9hdCBJUyBOT1QgTlVMTCkgQVMgcmVzb2x2ZWQsXG4gICAgICAgICAgY29yci5leGVjdXRpb25faWQgQVMgXCJjb3JyZWxhdGVkRXhlY3V0aW9uSWRcIixcbiAgICAgICAgICBjb3JyLmNvbXBsZXRlZF9hdDo6dGV4dCBBUyBcImRlcGxveUNvbXBsZXRlZEF0XCJcbiAgICAgICAgRlJPTSAke3NjaGVtYS5pbmNpZGVudH0gaVxuICAgICAgICBMRUZUIEpPSU4gTEFURVJBTCAoXG4gICAgICAgICAgU0VMRUNUIGUuZXhlY3V0aW9uX2lkLCBlLmNvbXBsZXRlZF9hdFxuICAgICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnXG4gICAgICAgICAgICBBTkQgZS5lbnZpcm9ubWVudCA9IGkuZW52aXJvbm1lbnQgQU5EIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCdcbiAgICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA8PSBpLm9wZW5lZF9hdFxuICAgICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49IGkub3BlbmVkX2F0IC0gbWFrZV9pbnRlcnZhbChzZWNzID0+ICR7d2luZG93SG91cnMgKiAzNjAwfTo6ZG91YmxlIHByZWNpc2lvbilcbiAgICAgICAgICBPUkRFUiBCWSBlLmNvbXBsZXRlZF9hdCBERVNDXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICApIGNvcnIgT04gdHJ1ZVxuICAgICAgICBXSEVSRSBpLm9yZ19pZCA9ICR7b3JnSWR9XG4gICAgICAgIE9SREVSIEJZIGkub3BlbmVkX2F0IERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH0gT0ZGU0VUICR7b2Zmc2V0fVxuICAgICAgYCkudGhlbigocikgPT4gZHJpenpsZVJvd3M8SW5jaWRlbnRMaXN0SXRlbT4oci5yb3dzKS5tYXAoKHJvdykgPT4gKHtcbiAgICAgIC4uLnJvdyxcbiAgICAgIHJlc29sdmVkOiByb3cucmVzb2x2ZWQgPT09IHRydWUgfHwgKHJvdy5yZXNvbHZlZCBhcyB1bmtub3duKSA9PT0gJ3QnLFxuICAgICAgY29ycmVsYXRlZEV4ZWN1dGlvbklkOiByb3cuY29ycmVsYXRlZEV4ZWN1dGlvbklkID8/IG51bGwsXG4gICAgICBkZXBsb3lDb21wbGV0ZWRBdDogcm93LmRlcGxveUNvbXBsZXRlZEF0ID8/IG51bGwsXG4gICAgfSkpKSk7XG4gIH1cblxuICAvKipcbiAgICogV2lyaW5nLXRlc3QgZHJ5LXJ1bjogd291bGQgYSBzeW50aGV0aWMgaW5jaWRlbnQgb3BlbmluZyBOT1cgZm9yXG4gICAqIGBlbnZpcm9ubWVudGAgY29ycmVsYXRlIHRvIGEgcmVjZW50IHN1Y2Nlc3NmdWwgZGVwbG95IHVuZGVyIHRoZSBvcmcnc1xuICAgKiBlZmZlY3RpdmUgd2luZG93PyBUaGlzIGlzIGEgTk9OLXBlcnNpc3RpbmcgY29ycmVsYXRpb24gY2hlY2sg4oCUIGl0IHZlcmlmaWVzXG4gICAqIHRoZSBhZG1pbidzIGVudmlyb25tZW50IG5hbWluZyArIHdpbmRvdyBsaW5lIHVwIHdpdGggcmVhbCBkZXBsb3kgZXZlbnRzXG4gICAqIFdJVEhPVVQgd3JpdGluZyBhbiBpbmNpZGVudCAoc28gYSBcInRlc3RcIiBuZXZlciBwb2xsdXRlcyBDRlIvTVRUUikuIFJMUy1zY29wZWQuXG4gICAqL1xuICBhc3luYyB0ZXN0SW5jaWRlbnRDb3JyZWxhdGlvbihvcmdJZDogc3RyaW5nLCBlbnZpcm9ubWVudDogc3RyaW5nKTogUHJvbWlzZTxJbmNpZGVudFRlc3RSZXN1bHQ+IHtcbiAgICBjb25zdCBlbnYgPSBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhlbnZpcm9ubWVudCk7XG4gICAgY29uc3Qgb3BlbmVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgY29uc3QgeyBpbmNpZGVudFdpbmRvd0hvdXJzIH0gPSBhd2FpdCB0aGlzLmdldFJlcG9ydGluZ1NldHRpbmdzKG9yZ0lkKTtcbiAgICBjb25zdCB3aW5kb3dIb3VycyA9IHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzKGluY2lkZW50V2luZG93SG91cnMpO1xuICAgIGNvbnN0IHJvd3MgPSBkcml6emxlUm93czx7IGV4ZWN1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDsgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsIH0+KChhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUIGUuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCwgZS5jb21wbGV0ZWRfYXQ6OnRleHQgQVMgY29tcGxldGVkX2F0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRSdcbiAgICAgICAgICBBTkQgZS5lbnZpcm9ubWVudCA9ICR7ZW52fSBBTkQgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJ1xuICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA8PSAke29wZW5lZEF0fTo6dGltZXN0YW1wdHpcbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gJHtvcGVuZWRBdH06OnRpbWVzdGFtcHR6IC0gbWFrZV9pbnRlcnZhbChzZWNzID0+ICR7d2luZG93SG91cnMgKiAzNjAwfTo6ZG91YmxlIHByZWNpc2lvbilcbiAgICAgICAgT1JERVIgQlkgZS5jb21wbGV0ZWRfYXQgREVTQ1xuICAgICAgICBMSU1JVCAxXG4gICAgICBgKSkpLnJvd3MpO1xuICAgIGNvbnN0IGhpdCA9IHJvd3NbMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudmlyb25tZW50OiBlbnYsXG4gICAgICBvcGVuZWRBdCxcbiAgICAgIHdpbmRvd0hvdXJzLFxuICAgICAgY29ycmVsYXRlZDogaGl0Py5leGVjdXRpb25faWQgIT0gbnVsbCxcbiAgICAgIGV4ZWN1dGlvbklkOiBoaXQ/LmV4ZWN1dGlvbl9pZCA/PyBudWxsLFxuICAgICAgZGVwbG95Q29tcGxldGVkQXQ6IGhpdD8uY29tcGxldGVkX2F0ID8/IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcHNlcnQgcGVyLW9yZyBpbmdlc3Rpb24gaGVhbHRoOiB0aGUgQVdTIGV2ZW50cyBMYW1iZGEgcGVyaW9kaWNhbGx5XG4gICAqIHJlcG9ydHMgZm9yd2FyZGVkL2Ryb3BwZWQgY291bnRlcnMgKyB0aGUgbGFzdCBldmVudCB0aW1lc3RhbXAgc28gdGhlIFJlcG9ydHNcbiAgICogVUkgY2FuIHNob3cgZmxvd2luZyAvIHN0YWxlIC8gZHJvcHBpbmcuIE9uZSByb3cgcGVyIG9yZyAodXBzZXJ0IG9uIG9yZ19pZCkuXG4gICAqL1xuICBhc3luYyByZWNvcmRJbmdlc3RIZWFsdGgoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpbnB1dDogeyBmb3J3YXJkZWQ/OiBudW1iZXI7IGRyb3BwZWQ/OiBudW1iZXI7IGxhc3RFdmVudEF0Pzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhc3RFdmVudEF0ID0gaW5wdXQubGFzdEV2ZW50QXQgPyBuZXcgRGF0ZShpbnB1dC5sYXN0RXZlbnRBdCkgOiB1bmRlZmluZWQ7XG4gICAgYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5pbmdlc3RIZWFsdGgpLnZhbHVlcyh7XG4gICAgICAgIG9yZ0lkLFxuICAgICAgICBmb3J3YXJkZWQ6IGlucHV0LmZvcndhcmRlZCxcbiAgICAgICAgZHJvcHBlZDogaW5wdXQuZHJvcHBlZCxcbiAgICAgICAgbGFzdEV2ZW50QXQsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogc2NoZW1hLmluZ2VzdEhlYWx0aC5vcmdJZCxcbiAgICAgICAgc2V0OiB7XG4gICAgICAgICAgZm9yd2FyZGVkOiBpbnB1dC5mb3J3YXJkZWQsXG4gICAgICAgICAgZHJvcHBlZDogaW5wdXQuZHJvcHBlZCxcbiAgICAgICAgICBsYXN0RXZlbnRBdCxcbiAgICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIH0sXG4gICAgICB9KSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGJhY2sgb25lIG9yZydzIGluZ2VzdGlvbiBoZWFsdGggZm9yIHRoZSBSZXBvcnRzIFVJIGZyZXNobmVzc1xuICAgKiBpbmRpY2F0b3IuIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIG9yZyBoYXMgTk8gcm93IOKAlCBpLmUuIHRoZSBkZXBsb3ltZW50IGhhc1xuICAgKiBuZXZlciBpbmdlc3RlZCBhbnl0aGluZyDigJQgd2hpY2ggdGhlIFVJIG11c3QgcmVuZGVyIGFzIFwibm8gaW5nZXN0IHJlcG9ydGVkXG4gICAqIHlldFwiLCBuZXZlciBhcyBcInN0YWxlXCIuIFJMUy1zY29wZWQgdG8gdGhlIG9yZyBsaWtlIGV2ZXJ5IG90aGVyIHJlYWQuXG4gICAqL1xuICBhc3luYyBnZXRJbmdlc3RIZWFsdGgob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8SW5nZXN0SGVhbHRoU3RhdHVzIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgICAgICAuc2VsZWN0KClcbiAgICAgICAgLmZyb20oc2NoZW1hLmluZ2VzdEhlYWx0aClcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5pbmdlc3RIZWFsdGgub3JnSWQsIG9yZ0lkKSlcbiAgICAgICAgLmxpbWl0KDEpKSxcbiAgICApO1xuICAgIGNvbnN0IHJvdyA9IHJvd3NbMF07XG4gICAgaWYgKCFyb3cpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGVkQXQ6IHJvdy51cGRhdGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIGxhc3RFdmVudEF0OiBpc29Pck51bGwocm93Lmxhc3RFdmVudEF0KSxcbiAgICAgIGZvcndhcmRlZDogcm93LmZvcndhcmRlZCA/PyBudWxsLFxuICAgICAgZHJvcHBlZDogcm93LmRyb3BwZWQgPz8gbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydGluZyByZXRlbnRpb24gc3dlZXA6IGhhcmQtZGVsZXRlcyByb3dzIHBhc3QgdGhlaXIgcGVyLW9yZyByZXRlbnRpb25cbiAgICogd2luZG93IChzcGxpdCBzdGFuZGFyZC1ldmVudCB2cyBET1JBLXNvdXJjZSkuIENyb3NzLXRlbmFudCBob3VzZWtlZXBpbmcg4oCUXG4gICAqIGl0IGVzdGFibGlzaGVzIGl0cyBvd24gc3lzYWRtaW4gc2NvcGUuIFNlZSAuL3JlcG9ydGluZy9yZXRlbnRpb24tc3dlZXAudHMuXG4gICAqL1xuICBhc3luYyBwdXJnZUV4cGlyZWRSZXBvcnRpbmdEYXRhKG9wdHM6IFJlcG9ydGluZ1JldGVudGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8UmVwb3J0aW5nUmV0ZW50aW9uQ291bnRzPiB7XG4gICAgcmV0dXJuIHB1cmdlUmVwb3J0aW5nUmV0ZW50aW9uKG9wdHMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIENhdGVnb3J5IDU6IHRoZSBBTkFMWVRJQ1MgcmVhZHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIFRoaW4gZGVsZWdhdGlvbnMgdG8gLi9yZXBvcnRpbmcvYW5hbHl0aWNzLXF1ZXJpZXMudHMsIHNvIGByZXBvcnRpbmdTZXJ2aWNlYFxuICAvLyBzYXRpc2ZpZXMgdGhlIHJlcG9ydCBlbmdpbmUncyBgU2VjdGlvbkRhdGFTb3VyY2VgIGluIGZ1bGwgYW5kIGEgc2VjdGlvbiBuZXZlclxuICAvLyByZWFjaGVzIHBhc3QgdGhlIHNlcnZpY2UgZm9yIGl0cyBkYXRhLiBFdmVyeSBvbmUgb2YgdGhlc2UgcmVhZHMgYVxuICAvLyBwcmUtYWdncmVnYXRlZCB0YWJsZSAoYGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzYCwgYGRvcmFfZGVwbG95bWVudHNgLFxuICAvLyBgcGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb25gLCBgcGx1Z2luX3Z1bG5fZXhwb3N1cmVgKSByYXRoZXIgdGhhbiByYXcgZXZlbnRzIOKAlFxuICAvLyB3aGljaCBpcyB3aGF0IG1ha2VzIGEgcXVhcnRlcmx5IHJlcG9ydCBhZmZvcmRhYmxlIEFORCB3aGF0IG1ha2VzIGl0IHN0aWxsXG4gIC8vIGFuc3dlcmFibGUgYWZ0ZXIgcmV0ZW50aW9uIGhhcyBzd2VwdCB0aGUgZXZlbnRzIGl0IGNhbWUgZnJvbS5cblxuICAvKiogUGVyLXBpcGVsaW5lIGRlbGl2ZXJ5LCB3b3JzdCBmaXJzdC4gKi9cbiAgYXN5bmMgZ2V0UGlwZWxpbmVCcmVha2Rvd24oc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDEwKSB7XG4gICAgcmV0dXJuIGdldFBpcGVsaW5lQnJlYWtkb3duKHNjb3BlLCBsaW1pdCk7XG4gIH1cblxuICAvKiogRmFpbHVyZXMgYnkgY2F0ZWdvcnksIHdpdGggdGhlIHByZXZpb3VzIHBlcmlvZCdzIGNvdW50cyBmb3IgdGhlIHRyZW5kLiAqL1xuICBhc3luYyBnZXRGYWlsdXJlQW5hbHlzaXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBwcmV2aW91cz86IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0pIHtcbiAgICByZXR1cm4gZ2V0RmFpbHVyZUFuYWx5c2lzKHNjb3BlLCBwcmV2aW91cyk7XG4gIH1cblxuICAvKiogUGVyLXN0YWdlIHRpbWluZ3MgZm9yIG9uZSBwaXBlbGluZSwgc2xvd2VzdCBmaXJzdC4gKi9cbiAgYXN5bmMgZ2V0U3RhZ2VQZXJmb3JtYW5jZShzY29wZTogQW5hbHl0aWNzU2NvcGUsIHBpcGVsaW5lSWQ6IHN0cmluZywgcHJldmlvdXM/OiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIGdldFN0YWdlUGVyZm9ybWFuY2Uoc2NvcGUsIHBpcGVsaW5lSWQsIHByZXZpb3VzKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCB0aW1lIGJ5IHByb2plY3QgYW5kIHBpcGVsaW5lLiBTZWNvbmRzLCBuZXZlciBtb25leS4gKi9cbiAgYXN5bmMgZ2V0UmVzb3VyY2VDb25zdW1wdGlvbihzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gMjApIHtcbiAgICByZXR1cm4gZ2V0UmVzb3VyY2VDb25zdW1wdGlvbihzY29wZSwgbGltaXQpO1xuICB9XG5cbiAgLyoqIEVhY2ggY29tbWl0J3MgcGF0aCBhY3Jvc3MgZW52aXJvbm1lbnRzLCBhbmQgd2hpY2ggb25lcyBzdG9wcGVkIHNob3J0LiAqL1xuICBhc3luYyBnZXRQcm9tb3Rpb25WaWV3KHNjb3BlOiBBbmFseXRpY3NTY29wZSwgcHJvZHVjdGlvbkVudiA9ICdwcm9kdWN0aW9uJywgbGltaXQgPSAyNSkge1xuICAgIHJldHVybiBnZXRQcm9tb3Rpb25WaWV3KHNjb3BlLCBwcm9kdWN0aW9uRW52LCBsaW1pdCk7XG4gIH1cblxuICAvKiogUGlwZWxpbmVzIGJlaGluZCBvbiBhIHBsdWdpbiwgd29yc3QgZ2FwIGZpcnN0ICh0aGUgREVDTEFSRUQgc2lkZSkuICovXG4gIGFzeW5jIGdldE91dGRhdGVkUGx1Z2lucyhzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gNTApIHtcbiAgICByZXR1cm4gZ2V0T3V0ZGF0ZWRQbHVnaW5zKHNjb3BlLCBsaW1pdCk7XG4gIH1cblxuICAvKiogT3BlbiBwbHVnaW4gdnVsbmVyYWJpbGl0aWVzIHBlciBwaXBlbGluZSAoc2F5cyBkZWNsYXJlZCB2cyBkZXBsb3llZCkuICovXG4gIGFzeW5jIGdldFBsdWdpblZ1bG5lcmFiaWxpdGllcyhzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gNTApIHtcbiAgICByZXR1cm4gZ2V0UGx1Z2luVnVsbmVyYWJpbGl0aWVzKHNjb3BlLCBsaW1pdCk7XG4gIH1cblxuICAvKiogQWRvcHRpb24sIGNyZWF0aW9uIHNvdXJjZSwgYW5kIHRoZSBkZXBsb3ktdHJhY2tpbmcgY292ZXJhZ2UgZGVub21pbmF0b3IuICovXG4gIGFzeW5jIGdldEFkb3B0aW9uKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgdGltZVNhdmVkTWludXRlcz86IG51bWJlciB8IG51bGwpIHtcbiAgICByZXR1cm4gZ2V0QWRvcHRpb24oc2NvcGUsIHRpbWVTYXZlZE1pbnV0ZXMgPz8gKGF3YWl0IHRoaXMudGltZVNhdmVkQXNzdW1wdGlvbihzY29wZS5vcmdJZCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmVlZHMtYXR0ZW50aW9uIGZpbmRpbmdzIGZvciB0aGUgcGVyaW9kLlxuICAgKlxuICAgKiBBc3NlbWJsZWQgSEVSRSByYXRoZXIgdGhhbiBpbiB0aGUgc2VjdGlvbiwgYmVjYXVzZSB0aGUgcnVsZXMgbmVlZCBzaXggcmVhZHMgdGhhdFxuICAgKiBtdXN0IGFsbCBkZXNjcmliZSB0aGUgc2FtZSB3aW5kb3c6IHRoaXMgcGVyaW9kJ3MgYnJlYWtkb3duLCB0aGUgcHJldmlvdXMgb25lJ3MsXG4gICAqIGZhaWx1cmUgc3RyZWFrcywgY29uZmlnLWNoYW5nZSB0aW1lcywgcGlwZWxpbmVzIHdpdGggYW4gb3BlbiBDcml0aWNhbCwgYW5kXG4gICAqIHBpcGVsaW5lcyBET1JBIGNhbm5vdCBzZWUuIEEgc2VjdGlvbiB0aGF0IGZldGNoZWQgdGhlbSBpdHNlbGYgd291bGQgYmUgdGhlIG9ubHlcbiAgICogcGxhY2UgaW4gdGhlIHJlcG9ydCB3aGVyZSB0aGUgd2luZG93IGNvdWxkIGRyaWZ0IGJldHdlZW4gcGFuZWxzLlxuICAgKlxuICAgKiBFdmVyeSBpbnB1dCBleGNlcHQgdGhlIGN1cnJlbnQgYnJlYWtkb3duIGlzIE9QVElPTkFMIHRvIHRoZSBldmFsdWF0b3IsIGFuZCBlYWNoXG4gICAqIG9uZSdzIGZhaWx1cmUgaXMgYWJzb3JiZWQ6IGEgcnVsZSB3aXRoIG5vIGRhdGEgdG8gcnVuIG9uIGlzIHNraXBwZWQsIHdoaWNoIGlzXG4gICAqIHdoeSBvbmUgdW5hdmFpbGFibGUgcmVhZCBjb3N0cyBvbmUgZmluZGluZyByYXRoZXIgdGhhbiB0aGUgd2hvbGUgc2VjdGlvbi4gVGhlXG4gICAqIGFsdGVybmF0aXZlIOKAlCBhIHNlY3Rpb24gdGhhdCBmYWlscyBiZWNhdXNlIHRoZSBzdHJlYWsgcXVlcnkgdGltZWQgb3V0IOKAlCByZXBsYWNlc1xuICAgKiBzaXggZmluZGluZ3Mgd2l0aCBub25lLlxuICAgKlxuICAgKiBBIHNraXBwZWQgcnVsZSBpcyBTQUlELCBpbiBgdW5hdmFpbGFibGVSdWxlc2AuIEFic29yYmVkIHNpbGVudGx5LCBhIGZhaWxlZFxuICAgKiB2dWxuZXJhYmxlLXBpcGVsaW5lcyByZWFkIGJlY2FtZSBhbiBlbXB0eSBzZXQg4oCUIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gXCJub1xuICAgKiBwaXBlbGluZSBydW5zIGEgdnVsbmVyYWJsZSBwbHVnaW5cIiwgd2hpY2ggaXMgdGhlIG9uZSBmYWxzZSBuZWdhdGl2ZSBhIHNlY3VyaXR5XG4gICAqIHJlYWRlciBtdXN0IG5ldmVyIGJlIGhhbmRlZC4gVGhlIGNvbXBvc2VyIHR1cm5zIGl0IGludG8gYSBkYXRhLXF1YWxpdHkgbm90ZS5cbiAgICovXG4gIGFzeW5jIGdldE5lZWRzQXR0ZW50aW9uKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgcHJldmlvdXM/OiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9KSB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGdldFBpcGVsaW5lQnJlYWtkb3duKHNjb3BlLCBBVFRFTlRJT05fUElQRUxJTkVfTElNSVQpO1xuICAgIGNvbnN0IHVuYXZhaWxhYmxlID0gbmV3IFNldDxBdHRlbnRpb25SdWxlSWQ+KCk7XG4gICAgY29uc3QgdHJhY2sgPSA8VD4ocnVsZXM6IEF0dGVudGlvblJ1bGVJZFtdLCBwOiBQcm9taXNlPFQ+LCBmYWxsYmFjazogVCkgPT5cbiAgICAgIHNvZnRlbihwLCBmYWxsYmFjaywgKCkgPT4geyBmb3IgKGNvbnN0IHIgb2YgcnVsZXMpIHVuYXZhaWxhYmxlLmFkZChyKTsgfSk7XG4gICAgY29uc3QgcHJpb3IgPSBwcmV2aW91c1xuICAgICAgPyBhd2FpdCB0cmFjayhbJ3Nsb3dlcl9wOTUnXSwgZ2V0UGlwZWxpbmVCcmVha2Rvd24oeyAuLi5zY29wZSwgLi4ucHJldmlvdXMgfSwgQVRURU5USU9OX1BJUEVMSU5FX0xJTUlUKSwgW10pXG4gICAgICA6IFtdO1xuICAgIGNvbnN0IFtzdHJlYWtSb3dzLCBjb25maWdDaGFuZ2VzLCB2dWxuZXJhYmxlLCB1bnRyYWNrZWQsIHRocmVzaG9sZHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdHJhY2soWydjb25zZWN1dGl2ZV9mYWlsdXJlcycsICdub19yZWNlbnRfc3VjY2VzcyddLCBnZXRQaXBlbGluZVN0cmVha3Moc2NvcGUpLCBbXSksXG4gICAgICB0cmFjayhbJ2ZhaWxlZF9hZnRlcl9jb25maWdfY2hhbmdlJ10sIGdldFBpcGVsaW5lQ29uZmlnQ2hhbmdlcyhzY29wZSksIG5ldyBNYXA8c3RyaW5nLCBEYXRlPigpKSxcbiAgICAgIHRyYWNrKFsndnVsbmVyYWJsZV9wbHVnaW4nXSwgZ2V0VnVsbmVyYWJsZVBpcGVsaW5lcyhzY29wZSksIFtdKSxcbiAgICAgIHRyYWNrKFsnbm9fZGVwbG95X3RyYWNraW5nJ10sIGdldFVudHJhY2tlZFBpcGVsaW5lcyhzY29wZSksIFtdKSxcbiAgICAgIHNvZnRlbih0aGlzLmF0dGVudGlvblRocmVzaG9sZHMoc2NvcGUub3JnSWQpLCB7fSksXG4gICAgXSk7XG4gICAgY29uc3QgaXRlbXMgPSBldmFsdWF0ZU5lZWRzQXR0ZW50aW9uKHtcbiAgICAgIGN1cnJlbnQsXG4gICAgICBwcmV2aW91czogcHJpb3IsXG4gICAgICBzdHJlYWtzOiBuZXcgTWFwKHN0cmVha1Jvd3MubWFwKChyKSA9PiBbci5waXBlbGluZUlkLCB7XG4gICAgICAgIGNvbnNlY3V0aXZlRmFpbHVyZXM6IHIuY29uc2VjdXRpdmVGYWlsdXJlcyxcbiAgICAgICAgbGFzdFN1Y2Nlc3NBdDogci5sYXN0U3VjY2Vzc0F0LFxuICAgICAgfV0pKSxcbiAgICAgIGNvbmZpZ0NoYW5nZXMsXG4gICAgICAvLyBBbiB1bmF2YWlsYWJsZSBpbnB1dCBpcyBwYXNzZWQgYXMgQUJTRU5ULCBzbyB0aGUgZXZhbHVhdG9yIHNraXBzIGl0cyBydWxlXG4gICAgICAvLyByYXRoZXIgdGhhbiBldmFsdWF0aW5nIGl0IGFnYWluc3QgYW4gZW1wdHkgc2V0LlxuICAgICAgLi4uKHVuYXZhaWxhYmxlLmhhcygndnVsbmVyYWJsZV9wbHVnaW4nKSA/IHt9IDogeyB2dWxuZXJhYmxlUGlwZWxpbmVzOiBuZXcgU2V0KHZ1bG5lcmFibGUpIH0pLFxuICAgICAgLi4uKHVuYXZhaWxhYmxlLmhhcygnbm9fZGVwbG95X3RyYWNraW5nJykgPyB7fSA6IHsgdW50cmFja2VkUGlwZWxpbmVzOiBuZXcgU2V0KHVudHJhY2tlZCkgfSksXG4gICAgICB0aHJlc2hvbGRzOiB0aHJlc2hvbGRzRnJvbSh0aHJlc2hvbGRzKSxcbiAgICAgIG5vdzogbmV3IERhdGUoc2NvcGUudG8pLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtcyxcbiAgICAgIHRocmVzaG9sZHM6IHRocmVzaG9sZHNGcm9tKHRocmVzaG9sZHMpLFxuICAgICAgLy8gV2hhdCB0aGUgcnVsZXMgd2VyZSBldmFsdWF0ZWQgb3Zlciwgc28gYSByZWFkZXIgY2FuIHRlbGwgYW4gZW1wdHkgbGlzdFxuICAgICAgLy8gKFwibm90aGluZyB0cmlwcGVkXCIpIGZyb20gYW4gZW1wdHkgaW5wdXQgKFwibm90aGluZyByYW5cIikuXG4gICAgICBwaXBlbGluZXNFdmFsdWF0ZWQ6IGN1cnJlbnQubGVuZ3RoLFxuICAgICAgLy8gUnVsZXMgdGhhdCBjb3VsZCBOT1QgcnVuIHRoaXMgcGVyaW9kIGJlY2F1c2UgdGhlaXIgaW5wdXQgZmFpbGVkIHRvIGxvYWQuXG4gICAgICB1bmF2YWlsYWJsZVJ1bGVzOiBbLi4udW5hdmFpbGFibGVdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9yZydzIHN0b3JlZCBuZWVkcy1hdHRlbnRpb24gdGhyZXNob2xkcywgb3IgYHt9YC5cbiAgICpcbiAgICogUmV0dXJuZWQgYXMgYSBwYXJ0aWFsIG9uIHB1cnBvc2U6IGB0aHJlc2hvbGRzRnJvbWAgZmlsbHMgdGhlIHJlc3QgcGVyIGZpZWxkLCBzb1xuICAgKiBhbiBvcmcgdGhhdCBjb25maWd1cmVkIG9uZSBudW1iZXIga2VlcHMgdGhlIGRlZmF1bHRzIGZvciB0aGUgb3RoZXJzIGluc3RlYWQgb2ZcbiAgICogc2lsZW50bHkgZGlzYWJsaW5nIGZvdXIgcnVsZXMgYnkgc2V0dGluZyBvbmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGF0dGVudGlvblRocmVzaG9sZHMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoeyB0OiBzY2hlbWEuZG9yYVNldHRpbmdzLnJlcG9ydEF0dGVudGlvblRocmVzaG9sZHMgfSlcbiAgICAgICAgLmZyb20oc2NoZW1hLmRvcmFTZXR0aW5ncylcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQsIG9yZ0lkKSlcbiAgICAgICAgLmxpbWl0KDEpKSk7XG4gICAgY29uc3Qgc3RvcmVkID0gKHJvd3MgYXMgQXJyYXk8eyB0OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbCB9PilbMF0/LnQ7XG4gICAgcmV0dXJuIHN0b3JlZCAmJiB0eXBlb2Ygc3RvcmVkID09PSAnb2JqZWN0JyA/IHN0b3JlZCA6IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcmcncyBvd24gbWludXRlcy1zYXZlZC1wZXItcGlwZWxpbmUgYXNzdW1wdGlvbiwgb3IgbnVsbC5cbiAgICpcbiAgICogUmVhZCBoZXJlIHNvIHRoZSBhZG9wdGlvbiBzZWN0aW9uIGNhbm5vdCBhY2NpZGVudGFsbHkgYmUgaGFuZGVkIGFcbiAgICogcGxhdGZvcm0tY2hvc2VuIGRlZmF1bHQ6IHRoZSBudW1iZXIgb25seSBtZWFucyBzb21ldGhpbmcgd2hlbiB0aGUgY3VzdG9tZXJcbiAgICogcGlja2VkIGl0LCBhbmQgYG51bGxgIHJlbmRlcnMgYXMgXCJub3QgZXN0aW1hdGVkXCIgcmF0aGVyIHRoYW4gYXMgemVyby5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdGltZVNhdmVkQXNzdW1wdGlvbihvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7IG1pbnV0ZXM6IHNjaGVtYS5kb3JhU2V0dGluZ3MudGltZVNhdmVkTWludXRlc1BlclBpcGVsaW5lIH0pXG4gICAgICAgIC5mcm9tKHNjaGVtYS5kb3JhU2V0dGluZ3MpXG4gICAgICAgIC53aGVyZShlcShzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkLCBvcmdJZCkpXG4gICAgICAgIC5saW1pdCgxKSkpO1xuICAgIHJldHVybiAocm93cyBhcyBBcnJheTx7IG1pbnV0ZXM6IG51bWJlciB8IG51bGwgfT4pWzBdPy5taW51dGVzID8/IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBIb3cgbWFueSBwaXBlbGluZXMgdGhlIG5lZWRzLWF0dGVudGlvbiBydWxlcyBjb25zaWRlci5cbiAqXG4gKiBUaGUgc2VjdGlvbiBpcyBhIHNob3J0IGxpc3Qgb2YgdGhpbmdzIHRvIGRvLCBub3QgYSB0YWJsZSBvZiBldmVyeXRoaW5nLCBzbyB0aGVcbiAqIGV2YWx1YXRvciBzZWVzIHRoZSBzYW1lIHdvcnN0LWZpcnN0IHNsaWNlIHRoZSBicmVha2Rvd24gc2VjdGlvbiBzaG93cy4gQSBwaXBlbGluZVxuICogb3V0c2lkZSB0aGUgd29yc3QgMjUgYnkgdGhlIGJyZWFrZG93bidzIG93biBvcmRlcmluZyBpcyBub3QgdGhlIG9uZSBhIGxlYWQgc2hvdWxkXG4gKiBiZSB0b2xkIGFib3V0IGZpcnN0LlxuICovXG5jb25zdCBBVFRFTlRJT05fUElQRUxJTkVfTElNSVQgPSAyNTtcblxuLyoqXG4gKiBSdW4gYSByZWFkLCBvciBmYWxsIGJhY2suXG4gKlxuICogT25seSBmb3IgdGhlIG5lZWRzLWF0dGVudGlvbiBpbnB1dHMsIHdoZXJlIGFuIGFic2VudCBpbnB1dCBTS0lQUyBhIHJ1bGUgYW5kIHRoZVxuICogZXZhbHVhdG9yIHNheXMgc28uIE5ldmVyIHVzZWQgZm9yIGEgbnVtYmVyIHRoZSByZXBvcnQgcHJlc2VudHM6IGEgcXVlcnkgdGhhdCBmYWlsc1xuICogYW5kIHNpbGVudGx5IHJlYWRzIGFzIHplcm8gaXMgaG93IGEgcmVwb3J0IHN0YXRlcyBzb21ldGhpbmcgZmFsc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNvZnRlbjxUPihwOiBQcm9taXNlPFQ+LCBmYWxsYmFjazogVCwgb25GYWlsPzogKCkgPT4gdm9pZCk6IFByb21pc2U8VD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBwO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybignTmVlZHMtYXR0ZW50aW9uIGlucHV0IHVuYXZhaWxhYmxlOyBpdHMgcnVsZSBpcyBza2lwcGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgb25GYWlsPy4oKTtcbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlcG9ydGluZ1NlcnZpY2UgPSBuZXcgUmVwb3J0aW5nU2VydmljZSgpO1xuIl19
|