@pipeline-builder/pipeline-data 4.1.24 → 4.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/lib/api/alert-destinations.d.ts +17 -0
  2. package/lib/api/alert-destinations.js +36 -0
  3. package/lib/api/reporting/analytics-queries.d.ts +274 -0
  4. package/lib/api/reporting/analytics-queries.js +598 -0
  5. package/lib/api/reporting/daily-rollup.d.ts +41 -0
  6. package/lib/api/reporting/daily-rollup.js +173 -0
  7. package/lib/api/reporting/deploy-rollup.d.ts +78 -0
  8. package/lib/api/reporting/deploy-rollup.js +203 -0
  9. package/lib/api/reporting/dora-scoring.d.ts +14 -0
  10. package/lib/api/reporting/dora-scoring.js +25 -1
  11. package/lib/api/reporting/dora.js +30 -6
  12. package/lib/api/reporting/failure-classifier.d.ts +54 -0
  13. package/lib/api/reporting/failure-classifier.js +179 -0
  14. package/lib/api/reporting/ingest.d.ts +2 -2
  15. package/lib/api/reporting/ingest.js +129 -4
  16. package/lib/api/reporting/last-deploy.d.ts +31 -0
  17. package/lib/api/reporting/last-deploy.js +93 -0
  18. package/lib/api/reporting/needs-attention.d.ts +93 -0
  19. package/lib/api/reporting/needs-attention.js +152 -0
  20. package/lib/api/reporting/plugin-exposure.d.ts +129 -0
  21. package/lib/api/reporting/plugin-exposure.js +312 -0
  22. package/lib/api/reporting/retention-sweep.js +9 -1
  23. package/lib/api/reporting/sql-helpers.d.ts +35 -2
  24. package/lib/api/reporting/sql-helpers.js +39 -1
  25. package/lib/api/reporting/stakeholder/compose.d.ts +115 -0
  26. package/lib/api/reporting/stakeholder/compose.js +234 -0
  27. package/lib/api/reporting/stakeholder/index.d.ts +14 -0
  28. package/lib/api/reporting/stakeholder/index.js +17 -0
  29. package/lib/api/reporting/stakeholder/period.d.ts +102 -0
  30. package/lib/api/reporting/stakeholder/period.js +273 -0
  31. package/lib/api/reporting/stakeholder/report-html.d.ts +93 -0
  32. package/lib/api/reporting/stakeholder/report-html.js +208 -0
  33. package/lib/api/reporting/stakeholder/sections.d.ts +117 -0
  34. package/lib/api/reporting/stakeholder/sections.js +249 -0
  35. package/lib/api/reporting/stakeholder/store.d.ts +450 -0
  36. package/lib/api/reporting/stakeholder/store.js +981 -0
  37. package/lib/api/reporting/stakeholder/templates.d.ts +21 -0
  38. package/lib/api/reporting/stakeholder/templates.js +104 -0
  39. package/lib/api/reporting/types.d.ts +73 -0
  40. package/lib/api/reporting/types.js +1 -1
  41. package/lib/api/reporting-service.d.ts +94 -5
  42. package/lib/api/reporting-service.js +169 -10
  43. package/lib/api/soft-delete-sweep.d.ts +11 -2
  44. package/lib/api/soft-delete-sweep.js +17 -6
  45. package/lib/database/drizzle-schema.d.ts +2244 -385
  46. package/lib/database/drizzle-schema.js +18 -7
  47. package/lib/database/index.d.ts +1 -1
  48. package/lib/database/index.js +4 -2
  49. package/lib/database/schema/compliance.d.ts +0 -682
  50. package/lib/database/schema/compliance.js +6 -66
  51. package/lib/database/schema/ecosystem.d.ts +20 -157
  52. package/lib/database/schema/ecosystem.js +23 -16
  53. package/lib/database/schema/pipeline.d.ts +200 -0
  54. package/lib/database/schema/pipeline.js +100 -1
  55. package/lib/database/schema/plugin.d.ts +20 -1
  56. package/lib/database/schema/plugin.js +13 -1
  57. package/lib/database/schema/reporting-analytics.d.ts +1212 -0
  58. package/lib/database/schema/reporting-analytics.js +250 -0
  59. package/lib/database/schema/reporting-stakeholder.d.ts +1373 -0
  60. package/lib/database/schema/reporting-stakeholder.js +251 -0
  61. package/lib/index.d.ts +10 -1
  62. package/lib/index.js +15 -1
  63. package/lib/testing/exports.json +67 -4
  64. package/package.json +4 -3
@@ -0,0 +1,21 @@
1
+ import type { ReportCadence, ReportTemplate } from '../../../database/schema/reporting-stakeholder.js';
2
+ /** A named, ordered section list with the cadence it is designed for. */
3
+ export interface TemplateSpec {
4
+ id: ReportTemplate;
5
+ /** What a lead picks in the UI. */
6
+ label: string;
7
+ /** One line explaining who it is for — shown next to the label. */
8
+ audience: string;
9
+ /** The cadence this template assumes. A weekly DORA report is mostly noise. */
10
+ cadence: ReportCadence;
11
+ sections: readonly string[];
12
+ }
13
+ export declare const REPORT_TEMPLATE_SPECS: readonly TemplateSpec[];
14
+ /** Look a template up by id. */
15
+ export declare function getTemplate(id: string): TemplateSpec | undefined;
16
+ /**
17
+ * Every section id a template names must exist in the registry. Called at module
18
+ * load so a template referencing a removed section fails the BUILD rather than
19
+ * producing a report full of "Unknown report section" panels in production.
20
+ */
21
+ export declare function assertTemplatesResolve(): void;
@@ -0,0 +1,104 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * The manager-facing templates.
5
+ *
6
+ * A template is a curated section list, not a free-form picker, because the
7
+ * failure mode of this feature is a report nobody reads. Managers do not act on
8
+ * "p95 stage duration"; they act on answers to four questions — are we shipping,
9
+ * is it getting better or worse, what is blocking us, is anything risky. Each
10
+ * template answers those in that order, so the first thing on the page is a
11
+ * number with a direction rather than a table.
12
+ *
13
+ * Section ORDER is the reading order. It is deliberate and worth preserving.
14
+ */
15
+ import { getSection } from './sections.js';
16
+ export const REPORT_TEMPLATE_SPECS = [
17
+ {
18
+ id: 'weekly_delivery',
19
+ label: 'Weekly delivery summary',
20
+ audience: 'For an engineering manager: what shipped this week and what is blocking it.',
21
+ cadence: 'weekly',
22
+ // NEEDS ATTENTION LEADS. A weekly report's job is to answer "what should I
23
+ // look at", and putting the decision first is the difference between a report
24
+ // that gets read and a table that gets skimmed. Then: are we shipping, what is
25
+ // breaking, and which pipelines are worst.
26
+ //
27
+ // No DORA here: weekly DORA on a normal team is too small a sample to mean
28
+ // anything, and the locked-section path would dominate the page for orgs
29
+ // without the add-on.
30
+ sections: [
31
+ 'needs_attention',
32
+ 'execution_count',
33
+ 'success_rate',
34
+ 'failure_analysis',
35
+ 'pipeline_breakdown',
36
+ 'promotion',
37
+ ],
38
+ },
39
+ {
40
+ id: 'monthly_health',
41
+ label: 'Monthly engineering health',
42
+ audience: 'For a director: delivery performance with DORA levels and trend.',
43
+ cadence: 'monthly',
44
+ // A month is the smallest window where DORA bands are meaningful. Adds the
45
+ // supply-chain and posture panels a director is accountable for and a lead
46
+ // rarely volunteers: vulnerable plugins, versions behind, compliance.
47
+ sections: [
48
+ 'needs_attention',
49
+ 'dora',
50
+ 'dora_trend',
51
+ 'success_rate',
52
+ 'failure_analysis',
53
+ 'stage_performance',
54
+ 'plugin_vulnerabilities',
55
+ 'outdated_plugins',
56
+ 'compliance_posture',
57
+ ],
58
+ },
59
+ {
60
+ id: 'quarterly_review',
61
+ label: 'Quarterly review',
62
+ audience: 'For a leadership review: the quarter across teams, with quarter-over-quarter change.',
63
+ cadence: 'quarterly',
64
+ // Widest view: delivery, health, supply chain, adoption and cost-of-build.
65
+ // `adoption` and `resource_consumption` are here and nowhere else — both are
66
+ // quarter-scale questions, and asking them weekly would produce noise a lead
67
+ // would rightly ignore.
68
+ sections: [
69
+ 'dora',
70
+ 'dora_trend',
71
+ 'execution_count',
72
+ 'success_rate',
73
+ 'failure_analysis',
74
+ 'promotion',
75
+ 'environments',
76
+ 'plugin_vulnerabilities',
77
+ 'outdated_plugins',
78
+ 'compliance_posture',
79
+ 'adoption',
80
+ 'resource_consumption',
81
+ ],
82
+ },
83
+ ];
84
+ /** Look a template up by id. */
85
+ export function getTemplate(id) {
86
+ return REPORT_TEMPLATE_SPECS.find((t) => t.id === id);
87
+ }
88
+ /**
89
+ * Every section id a template names must exist in the registry. Called at module
90
+ * load so a template referencing a removed section fails the BUILD rather than
91
+ * producing a report full of "Unknown report section" panels in production.
92
+ */
93
+ export function assertTemplatesResolve() {
94
+ for (const template of REPORT_TEMPLATE_SPECS) {
95
+ for (const id of template.sections) {
96
+ if (!getSection(id)) {
97
+ throw new Error(`Template "${template.id}" names unknown section "${id}". `
98
+ + 'Register it in sections.ts or remove it from the template.');
99
+ }
100
+ }
101
+ }
102
+ }
103
+ assertTemplatesResolve();
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9yZXBvcnRpbmcvc3Rha2Vob2xkZXIvdGVtcGxhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBZTNDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUE0QjtJQUM1RDtRQUNFLEVBQUUsRUFBRSxpQkFBaUI7UUFDckIsS0FBSyxFQUFFLHlCQUF5QjtRQUNoQyxRQUFRLEVBQUUsNkVBQTZFO1FBQ3ZGLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLDJFQUEyRTtRQUMzRSw4RUFBOEU7UUFDOUUsK0VBQStFO1FBQy9FLDJDQUEyQztRQUMzQyxFQUFFO1FBQ0YsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSxzQkFBc0I7UUFDdEIsUUFBUSxFQUFFO1lBQ1IsaUJBQWlCO1lBQ2pCLGlCQUFpQjtZQUNqQixjQUFjO1lBQ2Qsa0JBQWtCO1lBQ2xCLG9CQUFvQjtZQUNwQixXQUFXO1NBQ1o7S0FDRjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGdCQUFnQjtRQUNwQixLQUFLLEVBQUUsNEJBQTRCO1FBQ25DLFFBQVEsRUFBRSxrRUFBa0U7UUFDNUUsT0FBTyxFQUFFLFNBQVM7UUFDbEIsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSxzRUFBc0U7UUFDdEUsUUFBUSxFQUFFO1lBQ1IsaUJBQWlCO1lBQ2pCLE1BQU07WUFDTixZQUFZO1lBQ1osY0FBYztZQUNkLGtCQUFrQjtZQUNsQixtQkFBbUI7WUFDbkIsd0JBQXdCO1lBQ3hCLGtCQUFrQjtZQUNsQixvQkFBb0I7U0FDckI7S0FDRjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGtCQUFrQjtRQUN0QixLQUFLLEVBQUUsa0JBQWtCO1FBQ3pCLFFBQVEsRUFBRSxzRkFBc0Y7UUFDaEcsT0FBTyxFQUFFLFdBQVc7UUFDcEIsMkVBQTJFO1FBQzNFLDZFQUE2RTtRQUM3RSw2RUFBNkU7UUFDN0Usd0JBQXdCO1FBQ3hCLFFBQVEsRUFBRTtZQUNSLE1BQU07WUFDTixZQUFZO1lBQ1osaUJBQWlCO1lBQ2pCLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsV0FBVztZQUNYLGNBQWM7WUFDZCx3QkFBd0I7WUFDeEIsa0JBQWtCO1lBQ2xCLG9CQUFvQjtZQUNwQixVQUFVO1lBQ1Ysc0JBQXNCO1NBQ3ZCO0tBQ0Y7Q0FDRixDQUFDO0FBRUYsZ0NBQWdDO0FBQ2hDLE1BQU0sVUFBVSxXQUFXLENBQUMsRUFBVTtJQUNwQyxPQUFPLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsS0FBSyxNQUFNLFFBQVEsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQzdDLEtBQUssTUFBTSxFQUFFLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FDYixhQUFhLFFBQVEsQ0FBQyxFQUFFLDRCQUE0QixFQUFFLEtBQUs7c0JBQ3pELDREQUE0RCxDQUMvRCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVELHNCQUFzQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgbWFuYWdlci1mYWNpbmcgdGVtcGxhdGVzLlxuICpcbiAqIEEgdGVtcGxhdGUgaXMgYSBjdXJhdGVkIHNlY3Rpb24gbGlzdCwgbm90IGEgZnJlZS1mb3JtIHBpY2tlciwgYmVjYXVzZSB0aGVcbiAqIGZhaWx1cmUgbW9kZSBvZiB0aGlzIGZlYXR1cmUgaXMgYSByZXBvcnQgbm9ib2R5IHJlYWRzLiBNYW5hZ2VycyBkbyBub3QgYWN0IG9uXG4gKiBcInA5NSBzdGFnZSBkdXJhdGlvblwiOyB0aGV5IGFjdCBvbiBhbnN3ZXJzIHRvIGZvdXIgcXVlc3Rpb25zIOKAlCBhcmUgd2Ugc2hpcHBpbmcsXG4gKiBpcyBpdCBnZXR0aW5nIGJldHRlciBvciB3b3JzZSwgd2hhdCBpcyBibG9ja2luZyB1cywgaXMgYW55dGhpbmcgcmlza3kuIEVhY2hcbiAqIHRlbXBsYXRlIGFuc3dlcnMgdGhvc2UgaW4gdGhhdCBvcmRlciwgc28gdGhlIGZpcnN0IHRoaW5nIG9uIHRoZSBwYWdlIGlzIGFcbiAqIG51bWJlciB3aXRoIGEgZGlyZWN0aW9uIHJhdGhlciB0aGFuIGEgdGFibGUuXG4gKlxuICogU2VjdGlvbiBPUkRFUiBpcyB0aGUgcmVhZGluZyBvcmRlci4gSXQgaXMgZGVsaWJlcmF0ZSBhbmQgd29ydGggcHJlc2VydmluZy5cbiAqL1xuXG5pbXBvcnQgeyBnZXRTZWN0aW9uIH0gZnJvbSAnLi9zZWN0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlcG9ydENhZGVuY2UsIFJlcG9ydFRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YWJhc2Uvc2NoZW1hL3JlcG9ydGluZy1zdGFrZWhvbGRlci5qcyc7XG5cbi8qKiBBIG5hbWVkLCBvcmRlcmVkIHNlY3Rpb24gbGlzdCB3aXRoIHRoZSBjYWRlbmNlIGl0IGlzIGRlc2lnbmVkIGZvci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVTcGVjIHtcbiAgaWQ6IFJlcG9ydFRlbXBsYXRlO1xuICAvKiogV2hhdCBhIGxlYWQgcGlja3MgaW4gdGhlIFVJLiAqL1xuICBsYWJlbDogc3RyaW5nO1xuICAvKiogT25lIGxpbmUgZXhwbGFpbmluZyB3aG8gaXQgaXMgZm9yIOKAlCBzaG93biBuZXh0IHRvIHRoZSBsYWJlbC4gKi9cbiAgYXVkaWVuY2U6IHN0cmluZztcbiAgLyoqIFRoZSBjYWRlbmNlIHRoaXMgdGVtcGxhdGUgYXNzdW1lcy4gQSB3ZWVrbHkgRE9SQSByZXBvcnQgaXMgbW9zdGx5IG5vaXNlLiAqL1xuICBjYWRlbmNlOiBSZXBvcnRDYWRlbmNlO1xuICBzZWN0aW9uczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBSRVBPUlRfVEVNUExBVEVfU1BFQ1M6IHJlYWRvbmx5IFRlbXBsYXRlU3BlY1tdID0gW1xuICB7XG4gICAgaWQ6ICd3ZWVrbHlfZGVsaXZlcnknLFxuICAgIGxhYmVsOiAnV2Vla2x5IGRlbGl2ZXJ5IHN1bW1hcnknLFxuICAgIGF1ZGllbmNlOiAnRm9yIGFuIGVuZ2luZWVyaW5nIG1hbmFnZXI6IHdoYXQgc2hpcHBlZCB0aGlzIHdlZWsgYW5kIHdoYXQgaXMgYmxvY2tpbmcgaXQuJyxcbiAgICBjYWRlbmNlOiAnd2Vla2x5JyxcbiAgICAvLyBORUVEUyBBVFRFTlRJT04gTEVBRFMuIEEgd2Vla2x5IHJlcG9ydCdzIGpvYiBpcyB0byBhbnN3ZXIgXCJ3aGF0IHNob3VsZCBJXG4gICAgLy8gbG9vayBhdFwiLCBhbmQgcHV0dGluZyB0aGUgZGVjaXNpb24gZmlyc3QgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHJlcG9ydFxuICAgIC8vIHRoYXQgZ2V0cyByZWFkIGFuZCBhIHRhYmxlIHRoYXQgZ2V0cyBza2ltbWVkLiBUaGVuOiBhcmUgd2Ugc2hpcHBpbmcsIHdoYXQgaXNcbiAgICAvLyBicmVha2luZywgYW5kIHdoaWNoIHBpcGVsaW5lcyBhcmUgd29yc3QuXG4gICAgLy9cbiAgICAvLyBObyBET1JBIGhlcmU6IHdlZWtseSBET1JBIG9uIGEgbm9ybWFsIHRlYW0gaXMgdG9vIHNtYWxsIGEgc2FtcGxlIHRvIG1lYW5cbiAgICAvLyBhbnl0aGluZywgYW5kIHRoZSBsb2NrZWQtc2VjdGlvbiBwYXRoIHdvdWxkIGRvbWluYXRlIHRoZSBwYWdlIGZvciBvcmdzXG4gICAgLy8gd2l0aG91dCB0aGUgYWRkLW9uLlxuICAgIHNlY3Rpb25zOiBbXG4gICAgICAnbmVlZHNfYXR0ZW50aW9uJyxcbiAgICAgICdleGVjdXRpb25fY291bnQnLFxuICAgICAgJ3N1Y2Nlc3NfcmF0ZScsXG4gICAgICAnZmFpbHVyZV9hbmFseXNpcycsXG4gICAgICAncGlwZWxpbmVfYnJlYWtkb3duJyxcbiAgICAgICdwcm9tb3Rpb24nLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogJ21vbnRobHlfaGVhbHRoJyxcbiAgICBsYWJlbDogJ01vbnRobHkgZW5naW5lZXJpbmcgaGVhbHRoJyxcbiAgICBhdWRpZW5jZTogJ0ZvciBhIGRpcmVjdG9yOiBkZWxpdmVyeSBwZXJmb3JtYW5jZSB3aXRoIERPUkEgbGV2ZWxzIGFuZCB0cmVuZC4nLFxuICAgIGNhZGVuY2U6ICdtb250aGx5JyxcbiAgICAvLyBBIG1vbnRoIGlzIHRoZSBzbWFsbGVzdCB3aW5kb3cgd2hlcmUgRE9SQSBiYW5kcyBhcmUgbWVhbmluZ2Z1bC4gQWRkcyB0aGVcbiAgICAvLyBzdXBwbHktY2hhaW4gYW5kIHBvc3R1cmUgcGFuZWxzIGEgZGlyZWN0b3IgaXMgYWNjb3VudGFibGUgZm9yIGFuZCBhIGxlYWRcbiAgICAvLyByYXJlbHkgdm9sdW50ZWVyczogdnVsbmVyYWJsZSBwbHVnaW5zLCB2ZXJzaW9ucyBiZWhpbmQsIGNvbXBsaWFuY2UuXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgICduZWVkc19hdHRlbnRpb24nLFxuICAgICAgJ2RvcmEnLFxuICAgICAgJ2RvcmFfdHJlbmQnLFxuICAgICAgJ3N1Y2Nlc3NfcmF0ZScsXG4gICAgICAnZmFpbHVyZV9hbmFseXNpcycsXG4gICAgICAnc3RhZ2VfcGVyZm9ybWFuY2UnLFxuICAgICAgJ3BsdWdpbl92dWxuZXJhYmlsaXRpZXMnLFxuICAgICAgJ291dGRhdGVkX3BsdWdpbnMnLFxuICAgICAgJ2NvbXBsaWFuY2VfcG9zdHVyZScsXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIGlkOiAncXVhcnRlcmx5X3JldmlldycsXG4gICAgbGFiZWw6ICdRdWFydGVybHkgcmV2aWV3JyxcbiAgICBhdWRpZW5jZTogJ0ZvciBhIGxlYWRlcnNoaXAgcmV2aWV3OiB0aGUgcXVhcnRlciBhY3Jvc3MgdGVhbXMsIHdpdGggcXVhcnRlci1vdmVyLXF1YXJ0ZXIgY2hhbmdlLicsXG4gICAgY2FkZW5jZTogJ3F1YXJ0ZXJseScsXG4gICAgLy8gV2lkZXN0IHZpZXc6IGRlbGl2ZXJ5LCBoZWFsdGgsIHN1cHBseSBjaGFpbiwgYWRvcHRpb24gYW5kIGNvc3Qtb2YtYnVpbGQuXG4gICAgLy8gYGFkb3B0aW9uYCBhbmQgYHJlc291cmNlX2NvbnN1bXB0aW9uYCBhcmUgaGVyZSBhbmQgbm93aGVyZSBlbHNlIOKAlCBib3RoIGFyZVxuICAgIC8vIHF1YXJ0ZXItc2NhbGUgcXVlc3Rpb25zLCBhbmQgYXNraW5nIHRoZW0gd2Vla2x5IHdvdWxkIHByb2R1Y2Ugbm9pc2UgYSBsZWFkXG4gICAgLy8gd291bGQgcmlnaHRseSBpZ25vcmUuXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgICdkb3JhJyxcbiAgICAgICdkb3JhX3RyZW5kJyxcbiAgICAgICdleGVjdXRpb25fY291bnQnLFxuICAgICAgJ3N1Y2Nlc3NfcmF0ZScsXG4gICAgICAnZmFpbHVyZV9hbmFseXNpcycsXG4gICAgICAncHJvbW90aW9uJyxcbiAgICAgICdlbnZpcm9ubWVudHMnLFxuICAgICAgJ3BsdWdpbl92dWxuZXJhYmlsaXRpZXMnLFxuICAgICAgJ291dGRhdGVkX3BsdWdpbnMnLFxuICAgICAgJ2NvbXBsaWFuY2VfcG9zdHVyZScsXG4gICAgICAnYWRvcHRpb24nLFxuICAgICAgJ3Jlc291cmNlX2NvbnN1bXB0aW9uJyxcbiAgICBdLFxuICB9LFxuXTtcblxuLyoqIExvb2sgYSB0ZW1wbGF0ZSB1cCBieSBpZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW1wbGF0ZShpZDogc3RyaW5nKTogVGVtcGxhdGVTcGVjIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFJFUE9SVF9URU1QTEFURV9TUEVDUy5maW5kKCh0KSA9PiB0LmlkID09PSBpZCk7XG59XG5cbi8qKlxuICogRXZlcnkgc2VjdGlvbiBpZCBhIHRlbXBsYXRlIG5hbWVzIG11c3QgZXhpc3QgaW4gdGhlIHJlZ2lzdHJ5LiBDYWxsZWQgYXQgbW9kdWxlXG4gKiBsb2FkIHNvIGEgdGVtcGxhdGUgcmVmZXJlbmNpbmcgYSByZW1vdmVkIHNlY3Rpb24gZmFpbHMgdGhlIEJVSUxEIHJhdGhlciB0aGFuXG4gKiBwcm9kdWNpbmcgYSByZXBvcnQgZnVsbCBvZiBcIlVua25vd24gcmVwb3J0IHNlY3Rpb25cIiBwYW5lbHMgaW4gcHJvZHVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRlbXBsYXRlc1Jlc29sdmUoKTogdm9pZCB7XG4gIGZvciAoY29uc3QgdGVtcGxhdGUgb2YgUkVQT1JUX1RFTVBMQVRFX1NQRUNTKSB7XG4gICAgZm9yIChjb25zdCBpZCBvZiB0ZW1wbGF0ZS5zZWN0aW9ucykge1xuICAgICAgaWYgKCFnZXRTZWN0aW9uKGlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRlbXBsYXRlIFwiJHt0ZW1wbGF0ZS5pZH1cIiBuYW1lcyB1bmtub3duIHNlY3Rpb24gXCIke2lkfVwiLiBgXG4gICAgICAgICAgKyAnUmVnaXN0ZXIgaXQgaW4gc2VjdGlvbnMudHMgb3IgcmVtb3ZlIGl0IGZyb20gdGhlIHRlbXBsYXRlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzc2VydFRlbXBsYXRlc1Jlc29sdmUoKTtcbiJdfQ==
@@ -153,9 +153,30 @@ export interface ReportingRetentionSettings {
153
153
  defaultDoraRetentionDays: number;
154
154
  }
155
155
  /** Options for the reporting retention sweep. */
156
+ /**
157
+ * How a time-bucketed report slices its periods. Absent means UTC + Monday, which
158
+ * is what every pre-timezone caller got — so an omitted value can never silently
159
+ * change an existing report's boundaries.
160
+ */
161
+ export interface BucketOptions {
162
+ /** IANA timezone the buckets are cut in (validated at the route). */
163
+ tz?: string;
164
+ /** Where the week starts. Postgres DATE_TRUNC is Monday-only, so `sunday`
165
+ * shifts the boundary explicitly. */
166
+ weekStart?: 'monday' | 'sunday';
167
+ }
156
168
  export interface ReportingRetentionOptions {
157
169
  /** Rows deleted per statement (default 1000). */
158
170
  batchSize?: number;
171
+ /**
172
+ * The leader-locked run this sweep belongs to. Checked BETWEEN ORGS: aborted
173
+ * means the lock was lost (another pod is taking over) or the process is
174
+ * shutting down, and the remaining orgs are picked up next tick. Without it a
175
+ * long sweep kept deleting after another pod had already taken the lock.
176
+ */
177
+ run?: {
178
+ signal: AbortSignal;
179
+ };
159
180
  /** Max batches per table per org per tick (default 50); the rest defers to
160
181
  * the next tick so a huge backlog can't hold locks too long. */
161
182
  maxBatchesPerTable?: number;
@@ -204,6 +225,10 @@ export interface DoraOptions {
204
225
  * passes it in; unset falls back to the env default.
205
226
  */
206
227
  incidentWindowHours?: number;
228
+ /** IANA timezone for the trend's buckets (see {@link BucketOptions}). */
229
+ tz?: string;
230
+ /** Week start for the trend's buckets. */
231
+ weekStart?: 'monday' | 'sunday';
207
232
  }
208
233
  /**
209
234
  * Per-org reporting settings surfaced to the org-admin panel. `incidentWindowHours`
@@ -301,6 +326,11 @@ export interface DoraMetrics {
301
326
  incidents: number;
302
327
  restored: number;
303
328
  medianSeconds: number | null;
329
+ /** 90th/95th percentile recovery, over the same sample as the median. The
330
+ * median alone hides the long tail that actually defines an outage's cost;
331
+ * `null` when no recovery gap was observed. */
332
+ p90Seconds: number | null;
333
+ p95Seconds: number | null;
304
334
  level: DoraLevel;
305
335
  };
306
336
  /**
@@ -346,11 +376,16 @@ export interface DoraEnvMetrics {
346
376
  * successful deploys with a resolvable commit timestamp (deltas clamped ≥0).
347
377
  * `medianSeconds` is `null` (= unknown) when no successful deploy in this env
348
378
  * carried a `commit_timestamp`. The old median-run-duration proxy is removed.
379
+ *
380
+ * `p90Seconds`/`p95Seconds` come from the same sample. The level is scored off
381
+ * the MEDIAN only, so adding the tails cannot move a team's DORA band.
349
382
  */
350
383
  leadTime: {
351
384
  /** Successful deploys with a resolvable commit time (the median sample). */
352
385
  deployments: number;
353
386
  medianSeconds: number | null;
387
+ p90Seconds: number | null;
388
+ p95Seconds: number | null;
354
389
  level: DoraLevel;
355
390
  };
356
391
  }
@@ -459,6 +494,44 @@ export interface IngestResult {
459
494
  * PIPELINE or BUILD events would land rows and push no frame at all.
460
495
  */
461
496
  affectedOrgs: string[];
497
+ /**
498
+ * Events dropped because the pipeline they name belongs to an org the caller
499
+ * may not write for. Surfaced so the route can log and count them: a non-zero
500
+ * value is either a misrouted producer or an attempt to inject events into
501
+ * another tenant's reports, and both need to be visible.
502
+ */
503
+ droppedForeignOrg: number;
504
+ /**
505
+ * Events dropped because their timestamps are impossible — dated in the future,
506
+ * or completing before they started. Rejected here rather than clamped later:
507
+ * a deploy whose duration or lead time is negative silently skews deployment
508
+ * frequency, change-failure rate and lead time for the whole org, and a clamp
509
+ * to 0 makes a bad clock look like an instant deploy.
510
+ */
511
+ droppedInvalidTime: number;
512
+ }
513
+ /**
514
+ * Who is writing, for the ingest tenancy check.
515
+ *
516
+ * `/reports/events` resolves an event's org from the pipeline registry, so
517
+ * without this a token holding `reporting:ingest` could post events for ANY
518
+ * pipeline id and have them attributed to that pipeline's org — one org
519
+ * injecting rows into another's reports.
520
+ */
521
+ export interface IngestCaller {
522
+ /**
523
+ * Org ids this caller may write events for: its own, plus descendant teams.
524
+ * Resolved by the route. An event whose pipeline belongs to anything else is
525
+ * dropped.
526
+ */
527
+ allowedOrgIds: readonly string[];
528
+ /**
529
+ * A verified INTERNAL service principal (the plugin service posts plugin-build
530
+ * events for every tenant). Such callers are exempt: they hold a signed
531
+ * service key no external client can mint, and they legitimately write
532
+ * cross-tenant. Never set this from anything a request body can influence.
533
+ */
534
+ crossTenant?: boolean;
462
535
  }
463
536
  /**
464
537
  * One org's ingestion-health row as READ back by the Reports UI. The
@@ -1,4 +1,4 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  export {};
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUHVibGljIHJlc3VsdCBzaGFwZXMgZm9yIHRoZSByZXBvcnRpbmcgc2VydmljZS5cbiAqXG4gKiBTcGxpdCBvdXQgb2YgcmVwb3J0aW5nLXNlcnZpY2UudHMgcHVyZWx5IGZvciBzaXplOiB0aGVzZSBhcmUgZGF0YSBjb250cmFjdHNcbiAqIHdpdGggbm8gYmVoYXZpb3VyLiByZXBvcnRpbmctc2VydmljZS50cyByZS1leHBvcnRzIHRoZW0sIHNvIHRoZVxuICogYEBwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGFgIHB1YmxpYyBzdXJmYWNlIGlzIHVuY2hhbmdlZC5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50IHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0b3RhbDogbnVtYmVyO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIGZpcnN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBsYXN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVTZXJpZXNFbnRyeSB7XG4gIHBlcmlvZDogc3RyaW5nO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEdXJhdGlvblN0YXRzIHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1pbk1zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG4gIHA5NU1zOiBudW1iZXI7XG4gIGV4ZWN1dGlvbnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUV4ZWN1dGlvbiB7XG4gIGV4ZWN1dGlvbklkOiBzdHJpbmc7XG4gIC8qKiBSb2xsZWQtdXAgdGVybWluYWwgc3RhdHVzOiBzdWNjZWVkZWQgfCBmYWlsZWQgfCBjYW5jZWxlZCB8IGluLXByb2dyZXNzLiAqL1xuICBzdGF0dXM6IHN0cmluZztcbiAgc3RhcnRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBlbmRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsO1xuICAvKiogRmlyc3QgZmFpbGluZyBzdGFnZS9hY3Rpb24gZm9yIHRoZSBleGVjdXRpb24gKG51bGwgd2hlbiBpdCBkaWRuJ3QgZmFpbCkuICovXG4gIGZhaWxpbmdTdGFnZTogc3RyaW5nIHwgbnVsbDtcbiAgZmFpbGluZ0FjdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFnZUZhaWx1cmUge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlQm90dGxlbmVjayB7XG4gIGlkOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uRmFpbHVyZSB7XG4gIGFjdGlvbk5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yRW50cnkge1xuICBlcnJvclBhdHRlcm46IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgYWZmZWN0ZWRQaXBlbGluZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TdW1tYXJ5IHtcbiAgdG90YWw6IG51bWJlcjtcbiAgYWN0aXZlOiBudW1iZXI7XG4gIGluYWN0aXZlOiBudW1iZXI7XG4gIC8qKiBDb3VudHMgcGVyIHNoYXJpbmcgcnVuZyDigJQgb25lIGJ1Y2tldCBwZXIgYHZpc2liaWxpdHlgIHZhbHVlLiAqL1xuICBwdWJsaWM6IG51bWJlcjtcbiAgb3JnOiBudW1iZXI7XG4gIHByaXZhdGU6IG51bWJlcjtcbiAgdW5pcXVlTmFtZXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbiB7XG4gIHBsdWdpblR5cGU6IHN0cmluZztcbiAgY29tcHV0ZVR5cGU6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJzaW9uQ291bnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb25Db3VudDogbnVtYmVyO1xuICBsYXRlc3RWZXJzaW9uOiBzdHJpbmc7XG4gIGhhc0RlZmF1bHQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRUaW1lU2VyaWVzRW50cnkge1xuICBwZXJpb2Q6IHN0cmluZztcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBzdWNjZXNzUGN0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGREdXJhdGlvbiB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbiAgYnVpbGRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGx1Z2luIHJ1bnRpbWUgcmVwb3J0IGZpbHRlcnMuIGBwdWJsaXNoZXI6IG51bGxgIHNlbGVjdHMgb3duLW9yZ1xuICogKHB1Ymxpc2hlci1sZXNzKSBwbHVnaW5zOyBhbiBvbWl0dGVkIGZpZWxkIGRvZXNuJ3QgZmlsdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblJ1bnRpbWVGaWx0ZXIge1xuICBuYW1lPzogc3RyaW5nO1xuICBwdWJsaXNoZXI/OiBzdHJpbmcgfCBudWxsO1xuICB2ZXJzaW9uPzogc3RyaW5nO1xufVxuXG4vKiogUGVyIHBsdWdpbiB2ZXJzaW9uIHJ1bnRpbWUgc3RhdHMgb3ZlciBhIHdpbmRvdyAodGVybWluYWwgQUNUSU9OIHJ1bnMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5SdW50aW1lU3RhdHMge1xuICBwbHVnaW5QdWJsaXNoZXI6IHN0cmluZyB8IG51bGw7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcGx1Z2luVmVyc2lvbjogc3RyaW5nO1xuICBydW5zOiBudW1iZXI7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgLyoqIDDigJMxMDAsIG9uZSBkZWNpbWFsLiAqL1xuICBzdWNjZXNzUGN0OiBudW1iZXI7XG4gIC8qKiBOdWxsIHdoZW4gbm8gcnVuIGluIHRoZSBncm91cCBjYXJyaWVkIGEgZHVyYXRpb24uICovXG4gIHA1ME1zOiBudW1iZXIgfCBudWxsO1xuICBwOTVNczogbnVtYmVyIHwgbnVsbDtcbiAgbGFzdFJ1bjogc3RyaW5nO1xufVxuXG4vKiogQ3Jvc3Mtb3JnIDMwLWRheSBhZ2dyZWdhdGUgZm9yIG9uZSBgKHB1Ymxpc2hlciwgbmFtZSlgIGxpc3RpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUge1xuICBydW5zMzBkOiBudW1iZXI7XG4gIC8qKiAw4oCTMTsgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gcnVucy4gKi9cbiAgc3VjY2Vzc1JhdGUzMGQ6IG51bWJlciB8IG51bGw7XG4gIGFjdGl2ZU9yZ0NvdW50MzBkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRGYWlsdXJlIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgRE9SQSBoZWFkbGluZSBlbnZpcm9ubWVudC4gRGVwbG95bWVudCB0byB0aGlzIGxpdGVyYWwgZW52IG5hbWUgaXMgdGhlXG4gKiBpbmR1c3RyeS1zdGFuZGFyZCBET1JBIHNpZ25hbDsgTVRUUiBpcyBtZWFzdXJlZCBwcm9kdWN0aW9uLW9ubHksIGFuZCB0aGlzXG4gKiBlbnZpcm9ubWVudCdzIGNhcmQgaXMgdGhlIHN1bW1hcnkgc2hvd24gYXQgdGhlIHRvcCBvZiB0aGUgcGFuZWwuXG4gKi9cblxuLyoqIFBlci1vcmcgcmV0ZW50aW9uIG92ZXJyaWRlIHJvdy4gQm90aCBudWxsYWJsZSDih5IgZ2xvYmFsIGRlZmF1bHRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdSZXRlbnRpb25TZXR0aW5ncyB7XG4gIGV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyIHwgbnVsbDtcbiAgZG9yYVJldGVudGlvbkRheXM6IG51bWJlciB8IG51bGw7XG4gIGRlZmF1bHRFdmVudFJldGVudGlvbkRheXM6IG51bWJlcjtcbiAgZGVmYXVsdERvcmFSZXRlbnRpb25EYXlzOiBudW1iZXI7XG59XG5cbi8qKiBPcHRpb25zIGZvciB0aGUgcmVwb3J0aW5nIHJldGVudGlvbiBzd2VlcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0aW5nUmV0ZW50aW9uT3B0aW9ucyB7XG4gIC8qKiBSb3dzIGRlbGV0ZWQgcGVyIHN0YXRlbWVudCAoZGVmYXVsdCAxMDAwKS4gKi9cbiAgYmF0Y2hTaXplPzogbnVtYmVyO1xuICAvKiogTWF4IGJhdGNoZXMgcGVyIHRhYmxlIHBlciBvcmcgcGVyIHRpY2sgKGRlZmF1bHQgNTApOyB0aGUgcmVzdCBkZWZlcnMgdG9cbiAgICogIHRoZSBuZXh0IHRpY2sgc28gYSBodWdlIGJhY2tsb2cgY2FuJ3QgaG9sZCBsb2NrcyB0b28gbG9uZy4gKi9cbiAgbWF4QmF0Y2hlc1BlclRhYmxlPzogbnVtYmVyO1xuICAvKiogRml4ZWQgXCJub3dcIiBmb3IgdGhlIHdob2xlIHN3ZWVwIChkZWZhdWx0IGBuZXcgRGF0ZSgpYCkuICovXG4gIG5vdz86IERhdGU7XG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBvcmcgd2hvc2UgYGRvcmFfc2V0dGluZ3NgIHJldGVudGlvbiBnb3Zlcm5zIGBvcmdJZGAncyByb3dzIOKAlCBpdHNcbiAgICogYWNjb3VudCBST09ULiBSZXRlbnRpb24gaXMgYSBiaWxsaW5nIGVudGl0bGVtZW50IHN5bmNlZCBvbnRvIHRoZSByb290IG9ubHksXG4gICAqIHNvIGEgdGVhbSdzIHJvd3MgbXVzdCBmb2xsb3cgdGhlIHJvb3QncyAocHVyY2hhc2VkKSB3aW5kb3csIG5vdCB0aGUgZW52XG4gICAqIGRlZmF1bHQuIFJldHVybiBgbnVsbGAgd2hlbiB0aGUgcm9vdCBjYW4ndCBiZSByZXNvbHZlZDogdGhhdCBvcmcgaXMgU0tJUFBFRFxuICAgKiB0aGlzIHRpY2sgKG5ldmVyIHB1cmdlZCBvbiBhIHBvc3NpYmx5LXNob3J0ZXIgd2luZG93KS4gRGVmYXVsdDogaWRlbnRpdHlcbiAgICogKGV2ZXJ5IG9yZyBpcyBpdHMgb3duIHJvb3Qg4oCUIGEgZmxhdCBkZXBsb3ltZW50KS5cbiAgICovXG4gIHJlc29sdmVSZXRlbnRpb25PcmdJZD86IChvcmdJZDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xufVxuXG4vKiogUGVyLXJ1biBwdXJnZSB0YWxsaWVzIChhbHNvIGxvZ2dlZCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1JldGVudGlvbkNvdW50cyB7XG4gIC8qKiBPcmdzIHN3ZXB0IHRoaXMgcnVuLiAqL1xuICBvcmdzOiBudW1iZXI7XG4gIC8qKiBTdGFuZGFyZCBgcGlwZWxpbmVfZXZlbnRzYCAoZW52aXJvbm1lbnQgSVMgTlVMTCkgcm93cyBwdXJnZWQuICovXG4gIHN0YW5kYXJkRXZlbnRzOiBudW1iZXI7XG4gIC8qKiBET1JBLXNvdXJjZSBgcGlwZWxpbmVfZXZlbnRzYCAoZW52aXJvbm1lbnQgSVMgTk9UIE5VTEwpIHJvd3MgcHVyZ2VkLiAqL1xuICBkb3JhRXZlbnRzOiBudW1iZXI7XG4gIC8qKiBgZGVwbG95bWVudF9vdXRjb21lc2Agcm93cyBwdXJnZWQuICovXG4gIGRlcGxveW1lbnRPdXRjb21lczogbnVtYmVyO1xuICAvKiogYGluY2lkZW50c2Agcm93cyBwdXJnZWQuICovXG4gIGluY2lkZW50czogbnVtYmVyO1xufVxuXG4vKipcbiAqIERPUkEgcGVyZm9ybWFuY2UgYmFuZC4gYG51bGxgID0gaW5zdWZmaWNpZW50IGRhdGEgdG8gY2xhc3NpZnkgKG5vXG4gKiBkZXBsb3ltZW50cy9mYWlsdXJlcy9sZWFkLXRpbWUgc2FtcGxlIGluIHRoZSB3aW5kb3cpLCBzbyB0aGUgVUkgc2hvd3MgYVxuICogbmV1dHJhbCBzdGF0ZSByYXRoZXIgdGhhbiBtaXNsYWJlbGluZyBhbiBlbXB0eSB3aW5kb3cgYXMgXCJsb3dcIi5cbiAqL1xuZXhwb3J0IHR5cGUgRG9yYUxldmVsID0gJ2VsaXRlJyB8ICdoaWdoJyB8ICdtZWRpdW0nIHwgJ2xvdycgfCBudWxsO1xuXG4vKiogT3B0aW9uYWwgc2NvcGluZyBmb3Ige0BsaW5rIFJlcG9ydGluZ1NlcnZpY2UuZ2V0RG9yYU1ldHJpY3N9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhT3B0aW9ucyB7XG4gIC8qKiBSZXN0cmljdCB0byBhIHNpbmdsZSBwaXBlbGluZSAocGVyLXBpcGVsaW5lIERPUkEpLiAqL1xuICBwaXBlbGluZUlkPzogc3RyaW5nO1xuICAvKiogUmVzdHJpY3QgdG8gYSBzaW5nbGUgZGVwbG95IGVudmlyb25tZW50IChlbHNlIGFsbCBkZXBsb3kgZW52aXJvbm1lbnRzKS4gKi9cbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItb3JnIGluY2lkZW504oaSZGVwbG95IGNvcnJlbGF0aW9uIHdpbmRvdyBvdmVycmlkZSAoaG91cnMpLiBXaGVuIHNldCAoYVxuICAgKiBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyKSwgdGhlIGluY2lkZW50IGNvcnJlbGF0aW9uIHVzZXMgaXQgaW5zdGVhZCBvZiB0aGVcbiAgICogZ2xvYmFsIGBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSU2AuIFRoZSByb3V0ZSByZXNvbHZlcyB0aGlzIGZyb20gdGhlIG9yZydzXG4gICAqIGBkb3JhX3NldHRpbmdzYCByb3cgKHNlZSB7QGxpbmsgUmVwb3J0aW5nU2VydmljZS5nZXRSZXBvcnRpbmdTZXR0aW5nc30pIGFuZFxuICAgKiBwYXNzZXMgaXQgaW47IHVuc2V0IGZhbGxzIGJhY2sgdG8gdGhlIGVudiBkZWZhdWx0LlxuICAgKi9cbiAgaW5jaWRlbnRXaW5kb3dIb3Vycz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQZXItb3JnIHJlcG9ydGluZyBzZXR0aW5ncyBzdXJmYWNlZCB0byB0aGUgb3JnLWFkbWluIHBhbmVsLiBgaW5jaWRlbnRXaW5kb3dIb3Vyc2BcbiAqIGlzIHRoZSBpbmNpZGVudOKGkmRlcGxveSBjb3JyZWxhdGlvbiB3aW5kb3c7IGBldmVudFJldGVudGlvbkRheXNgIC9cbiAqIGBkb3JhUmV0ZW50aW9uRGF5c2AgYXJlIHRoZSB0d28gcmV0ZW50aW9uLXN3ZWVwIHdpbmRvd3MuIEVhY2ggb3ZlcnJpZGVcbiAqIGlzIGBudWxsYCB3aGVuIHVuc2V0ICh0aGUgcGFpcmVkIGBkZWZhdWx0KmAgZmllbGQgc2hvd3MgdGhlIGVudiBmYWxsYmFjayBhcHBsaWVkKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdTZXR0aW5ncyB7XG4gIC8qKiBUaGUgb3JnJ3Mgc3RvcmVkIGNvcnJlbGF0aW9uLXdpbmRvdyBvdmVycmlkZSBpbiBob3Vycywgb3IgYG51bGxgIHdoZW4gdW5zZXQuICovXG4gIGluY2lkZW50V2luZG93SG91cnM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBUaGUgZ2xvYmFsIGVudiBkZWZhdWx0IGFwcGxpZWQgd2hlbiBubyBvdmVycmlkZSBpcyBzdG9yZWQuICovXG4gIGRlZmF1bHRXaW5kb3dIb3VyczogbnVtYmVyO1xuICAvKiogU3RhbmRhcmQtZXZlbnQgcmV0ZW50aW9uIG92ZXJyaWRlIGluIGRheXMsIG9yIGBudWxsYCB3aGVuIHVuc2V0LiAqL1xuICBldmVudFJldGVudGlvbkRheXM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBET1JBLXNvdXJjZSByZXRlbnRpb24gb3ZlcnJpZGUgaW4gZGF5cywgb3IgYG51bGxgIHdoZW4gdW5zZXQuICovXG4gIGRvcmFSZXRlbnRpb25EYXlzOiBudW1iZXIgfCBudWxsO1xuICAvKiogR2xvYmFsIHN0YW5kYXJkLWV2ZW50IHJldGVudGlvbiBkZWZhdWx0IGFwcGxpZWQgd2hlbiB1bnNldCAoZGF5cykuICovXG4gIGRlZmF1bHRFdmVudFJldGVudGlvbkRheXM6IG51bWJlcjtcbiAgLyoqIEdsb2JhbCBET1JBLXNvdXJjZSByZXRlbnRpb24gZGVmYXVsdCBhcHBsaWVkIHdoZW4gdW5zZXQgKGRheXMpLiAqL1xuICBkZWZhdWx0RG9yYVJldGVudGlvbkRheXM6IG51bWJlcjtcbn1cblxuLyoqIEEgcGFydGlhbCByZXBvcnRpbmctc2V0dGluZ3Mgd3JpdGUgKDcpLiBPbmx5IHByb3ZpZGVkIGZpZWxkcyBhcmVcbiAqICB1cHNlcnRlZDsgb21pdHRlZCBmaWVsZHMgYXJlIGxlZnQgdW5jaGFuZ2VkIChhbiBvbWl0dGVkIHJldGVudGlvbiBmaWVsZCBrZWVwc1xuICogIGl0cyBzdG9yZWQgb3ZlcnJpZGUgLyB0aGUgZ2xvYmFsIGRlZmF1bHQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdTZXR0aW5nc1BhdGNoIHtcbiAgaW5jaWRlbnRXaW5kb3dIb3Vycz86IG51bWJlcjtcbiAgZXZlbnRSZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuICBkb3JhUmV0ZW50aW9uRGF5cz86IG51bWJlcjtcbn1cblxuLyoqIE9uZSByb3cgb2YgdGhlIG9yZy1hZG1pbiBpbmNpZGVudHMgbGlzdCAocmVjZW50IGluY2lkZW50cyArIGRlcGxveSBjb3JyZWxhdGlvbikuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50TGlzdEl0ZW0ge1xuICBpbmNpZGVudElkOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIHNldmVyaXR5OiBzdHJpbmc7XG4gIG9wZW5lZEF0OiBzdHJpbmcgfCBudWxsO1xuICByZXNvbHZlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBjcmVhdGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUcnVlIG9uY2UgdGhlIGluY2lkZW50IGhhcyBhIGByZXNvbHZlZF9hdGAuICovXG4gIHJlc29sdmVkOiBib29sZWFuO1xuICAvKiogVGhlIGNvcnJlbGF0ZWQgZGVwbG95IGV4ZWN1dGlvbiBpZCAobW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBkZXBsb3kgaW4td2luZG93KSwgb3IgbnVsbC4gKi9cbiAgY29ycmVsYXRlZEV4ZWN1dGlvbklkOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhhdCBkZXBsb3kncyBjb21wbGV0aW9uIGluc3RhbnQsIG9yIG51bGwgd2hlbiB1bmNvcnJlbGF0ZWQuICovXG4gIGRlcGxveUNvbXBsZXRlZEF0OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogUmVzdWx0IG9mIHRoZSB3aXJpbmctdGVzdCBkcnktcnVuIGNvcnJlbGF0aW9uICh7QGxpbmsgUmVwb3J0aW5nU2VydmljZS50ZXN0SW5jaWRlbnRDb3JyZWxhdGlvbn0pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNpZGVudFRlc3RSZXN1bHQge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICAvKiogVGhlIHN5bnRoZXRpYyBpbmNpZGVudCdzIG9wZW5lZEF0IChub3csIElTTykuICovXG4gIG9wZW5lZEF0OiBzdHJpbmc7XG4gIC8qKiBUaGUgZWZmZWN0aXZlIGNvcnJlbGF0aW9uIHdpbmRvdyB1c2VkLiAqL1xuICB3aW5kb3dIb3VyczogbnVtYmVyO1xuICAvKiogV2hldGhlciBhIHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSB0byBgZW52aXJvbm1lbnRgIGNvcnJlbGF0ZWQuICovXG4gIGNvcnJlbGF0ZWQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgY29ycmVsYXRlZCBkZXBsb3kgZXhlY3V0aW9uIGlkLCBvciBudWxsLiAqL1xuICBleGVjdXRpb25JZDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoYXQgZGVwbG95J3MgY29tcGxldGlvbiBpbnN0YW50LCBvciBudWxsLiAqL1xuICBkZXBsb3lDb21wbGV0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLy8gRE9SQSBwZXJmb3JtYW5jZSBiYW5kcyAodGhyZXNob2xkcyBmcm9tIHRoZSBET1JBL0FjY2VsZXJhdGUgcmVwb3J0cykuIEVhY2hcbi8vIGhlbHBlciByZXR1cm5zIGBudWxsYCB3aGVuIHRoZXJlJ3Mgbm8gc2FtcGxlIHRvIGNsYXNzaWZ5LlxuLyoqIERlcGxveW1lbnQgZnJlcXVlbmN5IGJ5IGRlcGxveXMvZGF5OiBlbGl0ZSDiiaUxL2RheSwgaGlnaCDiiaUxL3dlZWssIG1lZGl1bSDiiaUxL21vbnRoLiAqL1xuXG4vKipcbiAqIERPUkEgbWV0cmljcyBvdmVyIGEgW2Zyb20sdG9dIHdpbmRvdywgb3JnLXNjb3BlZCAoc2luZ2xlLW9yZyBvciByb2xsdXAgc3VidHJlZSkuXG4gKlxuICogREVQTE9ZLUJBU0lTIOKAlCBldmVyeSBtZXRyaWMgZGVyaXZlcyBmcm9tIHJlYWwgREVQTE9ZLVNUQUdFIGV4ZWN1dGlvbnMsIGkuZS5cbiAqIGBwaXBlbGluZV9ldmVudHNgIHJvd3Mgd2l0aCBgZXZlbnRfdHlwZT0nU1RBR0UnYCBhbmQgYSBub24tbnVsbCBgZW52aXJvbm1lbnRgXG4gKiAodGhlIGZvcndhcmRlciBzZXRzIGBlbnZpcm9ubWVudGAgb25seSBmb3IgdGhlIHN0YWdlcyBhIHVzZXIgZGVjbGFyZWQgaW5cbiAqIGBwYi5kZXBsb3lzYCkuIEEgQ0ktb25seSBidWlsZC90ZXN0IHBpcGVsaW5lIHdpdGggbm8gZGVwbG95IHN0YWdlIHByb2R1Y2VzIE5PXG4gKiBET1JBIGRhdGEg4oCUIHRoZXJlIGlzIG5vIHJ1bi1iYXNlZCBmYWxsYmFjay4gVGhlIHBhbmVsIGlzIGVtcHR5IHVudGlsIGRlcGxveWVkXG4gKiBwaXBlbGluZXMgcmUtc3ludGggd2l0aCB0aGUgbmV3IGRlcGxveSB0YWdzIGFuZCBzdGFydCBlbWl0dGluZyBkZXBsb3kgZXZlbnRzLlxuICpcbiAqIGBwcm9kdWN0aW9uYCBpcyB0aGUgaGVhZGxpbmUgZW52aXJvbm1lbnQ7IE1UVFIgaXMgbWVhc3VyZWQgcHJvZHVjdGlvbi1vbmx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFNZXRyaWNzIHtcbiAgLyoqIFRoZSBbZnJvbSx0b10gd2luZG93IGVjaG9lZCBiYWNrIChkZXBsb3kgYGNvbXBsZXRlZF9hdGAgcmFuZ2UpLiAqL1xuICB3aW5kb3c6IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH07XG4gIC8qKiBUaGUgc2NvcGluZyBhcHBsaWVkIChlY2hvZWQgZm9yIHRoZSBVSSk7IGBudWxsYCB3aGVuIHVuc2NvcGVkLiAqL1xuICBmaWx0ZXJzOiB7IHBpcGVsaW5lSWQ6IHN0cmluZyB8IG51bGw7IGVudmlyb25tZW50OiBzdHJpbmcgfCBudWxsIH07XG4gIC8qKiBUaGUgaGVhZGxpbmUgZW52aXJvbm1lbnQgbmFtZSAoYHByb2R1Y3Rpb25gKS4gKi9cbiAgaGVhZGxpbmU6IHN0cmluZztcbiAgLyoqIFBlci1lbnZpcm9ubWVudCBERiAvIENGUiAvIGxlYWQgdGltZS4gU29ydGVkIGhlYWRsaW5lLWZpcnN0LCB0aGVuIEHihpJaLiAqL1xuICBlbnZpcm9ubWVudHM6IERvcmFFbnZNZXRyaWNzW107XG4gIC8qKlxuICAgKiBNZWFuIFRpbWUgVG8gUmVzdG9yZSDigJQgUFJPRFVDVElPTi1PTkxZLCBmcm9tIGBkZXBsb3ltZW50X291dGNvbWVzYC5cbiAgICogYG1lZGlhbihyZXN0b3JlZC5hdCDiiJIgZGVwbG95ZWQuY29tcGxldGVkX2F0KWAgb3ZlciByZXN0b3JlZCBwcm9kdWN0aW9uXG4gICAqIGluY2lkZW50cyAoZGVsdGFzIGNsYW1wZWQg4omlMCkuIGBpbmNpZGVudHNgIGNvdW50cyBwcm9kdWN0aW9uIGRlcGxveXMgbWFya2VkXG4gICAqIGZhaWxlZDsgYHJlc3RvcmVkYCBjb3VudHMgdGhvc2UgdGhhdCByZWNvdmVyZWQ7IGBtZWRpYW5TZWNvbmRzYCBpcyBudWxsIHdoZW5cbiAgICogbm8gcmVzdG9yZWQgaW5jaWRlbnQgaGFzIGEgcmVzb2x2YWJsZSBkZXBsb3kgdGltZS5cbiAgICovXG4gIG1lYW5UaW1lVG9SZXN0b3JlOiB7XG4gICAgaW5jaWRlbnRzOiBudW1iZXI7XG4gICAgcmVzdG9yZWQ6IG51bWJlcjtcbiAgICBtZWRpYW5TZWNvbmRzOiBudW1iZXIgfCBudWxsO1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKlxuICAgKiBDb3ZlcmFnZSByZWNvbmNpbGlhdGlvbiDigJQgcmVnaXN0ZXJlZCBwaXBlbGluZXMgd2l0aCBubyBvYnNlcnZlZCBkZXBsb3kgaW5cbiAgICogdGhlIHdpbmRvdy4gQSBoaWdoIGB3aXRob3V0RGVwbG95c2AgY291bnQgbWVhbnMgRE9SQSBpcyBibGluZCB0byBtb3N0IG9mIHRoZVxuICAgKiBmbGVldCAocGlwZWxpbmVzIHRoYXQgaGF2ZW4ndCByZS1zeW50aGVkIHdpdGggZGVwbG95IHRhZ3MsIG9yIGRvbid0IGRlcGxveSkuXG4gICAqL1xuICBjb3ZlcmFnZToge1xuICAgIC8qKiBQaXBlbGluZXMgaW4gdGhlIHJlZ2lzdHJ5IChvcmctc2NvcGVkKS4gKi9cbiAgICByZWdpc3RlcmVkOiBudW1iZXI7XG4gICAgLyoqIFJlZ2lzdGVyZWQgcGlwZWxpbmVzIHdpdGgg4omlMSBkZXBsb3ktc3RhZ2UgZXhlY3V0aW9uIGluIHRoZSB3aW5kb3cuICovXG4gICAgZGVwbG95aW5nOiBudW1iZXI7XG4gICAgLyoqIHJlZ2lzdGVyZWQg4oiSIGRlcGxveWluZyAoY2xhbXBlZCDiiaUwKS4gKi9cbiAgICB3aXRob3V0RGVwbG95czogbnVtYmVyO1xuICB9O1xufVxuXG4vKiogUGVyLWVudmlyb25tZW50IERPUkEgbWV0cmljcyAoZGVwbG95bWVudCBmcmVxdWVuY3ksIENGUiwgbGVhZCB0aW1lKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYUVudk1ldHJpY3Mge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICAvKiogRGVwbG95bWVudCBGcmVxdWVuY3kg4oCUIHN1Y2Nlc3NmdWwgZGVwbG95LXN0YWdlIGV4ZWN1dGlvbnMgZm9yIHRoaXMgZW52LiAqL1xuICBkZXBsb3ltZW50RnJlcXVlbmN5OiB7XG4gICAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgICBwZXJEYXk6IG51bWJlcjtcbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xuICAvKipcbiAgICogQ2hhbmdlIEZhaWx1cmUgUmF0ZSDigJQgdHdvLWNsYXNzOlxuICAgKiBgKGRlcGxveVRpbWVGYWlsdXJlcyArIHBvc3REZXBsb3lGYWlsdXJlcykgLyBhdHRlbXB0c2AuXG4gICAqIC0gYGRlcGxveVRpbWVGYWlsdXJlc2Ag4oCUIGRlcGxveSBzdGFnZSBgcmVzdWx0PWZhaWxlZGAgKGZyb20gZXZlbnRzKS5cbiAgICogLSBgcG9zdERlcGxveUZhaWx1cmVzYCDigJQgYSBzdWNjZXNzZnVsIGRlcGxveSBsYXRlciBtYXJrZWQgZmFpbGVkIGluIHByb2RcbiAgICogICAoZnJvbSBgZGVwbG95bWVudF9vdXRjb21lc2ApLlxuICAgKiAtIGBhdHRlbXB0c2Ag4oCUIGFsbCB0ZXJtaW5hbCBkZXBsb3ktc3RhZ2UgYXR0ZW1wdHMgKHN1Y2NlZWRlZCArIGZhaWxlZCkuXG4gICAqL1xuICBjaGFuZ2VGYWlsdXJlUmF0ZToge1xuICAgIHJhdGU6IG51bWJlcjtcbiAgICBkZXBsb3lUaW1lRmFpbHVyZXM6IG51bWJlcjtcbiAgICBwb3N0RGVwbG95RmFpbHVyZXM6IG51bWJlcjtcbiAgICBhdHRlbXB0czogbnVtYmVyO1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKlxuICAgKiBMZWFkIFRpbWUg4oCUIE1FQVNVUkVEOiBgbWVkaWFuKGRlcGxveV9jb21wbGV0ZWQg4oiSIG9sZGVzdF9jb21taXRfdGltZSlgIG92ZXJcbiAgICogc3VjY2Vzc2Z1bCBkZXBsb3lzIHdpdGggYSByZXNvbHZhYmxlIGNvbW1pdCB0aW1lc3RhbXAgKGRlbHRhcyBjbGFtcGVkIOKJpTApLlxuICAgKiBgbWVkaWFuU2Vjb25kc2AgaXMgYG51bGxgICg9IHVua25vd24pIHdoZW4gbm8gc3VjY2Vzc2Z1bCBkZXBsb3kgaW4gdGhpcyBlbnZcbiAgICogY2FycmllZCBhIGBjb21taXRfdGltZXN0YW1wYC4gVGhlIG9sZCBtZWRpYW4tcnVuLWR1cmF0aW9uIHByb3h5IGlzIHJlbW92ZWQuXG4gICAqL1xuICBsZWFkVGltZToge1xuICAgIC8qKiBTdWNjZXNzZnVsIGRlcGxveXMgd2l0aCBhIHJlc29sdmFibGUgY29tbWl0IHRpbWUgKHRoZSBtZWRpYW4gc2FtcGxlKS4gKi9cbiAgICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAgIG1lZGlhblNlY29uZHM6IG51bWJlciB8IG51bGw7XG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbn1cblxuLyoqIE9uZSBpbnRlcnZhbCBidWNrZXQgb2YgdGhlIERPUkEgdHJlbmQgKGRlcGxveSBmcmVxdWVuY3kgKyBjaGFuZ2UgZmFpbHVyZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFUcmVuZFBvaW50IHtcbiAgLyoqIEJ1Y2tldCBzdGFydCAoREFURV9UUlVOQyBvZiB0aGUgZGVwbG95IGBjb21wbGV0ZWRfYXRgKSwgSVNPIHRleHQuICovXG4gIHBlcmlvZDogc3RyaW5nO1xuICAvKiogU3VjY2Vzc2Z1bCBkZXBsb3ktc3RhZ2UgZXhlY3V0aW9ucyBpbiB0aGUgYnVja2V0LiAqL1xuICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAvKiogRmFpbGVkIGRlcGxveS1zdGFnZSBleGVjdXRpb25zIGluIHRoZSBidWNrZXQuICovXG4gIGZhaWxlZDogbnVtYmVyO1xuICAvKiogc3VjY2VlZGVkICsgZmFpbGVkIGluIHRoZSBidWNrZXQgKGRlcGxveSBhdHRlbXB0cykuICovXG4gIHRvdGFsOiBudW1iZXI7XG4gIC8qKiBmYWlsZWQvdG90YWwgYXMgYSBwZXJjZW50ICgwIHdoZW4gdG90YWwgaXMgMCkuIERlcGxveS10aW1lIENGUiBvbmx5LiAqL1xuICBjaGFuZ2VGYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbi8qKiBQZXItc3RhZ2UgYnVpbGQtaGVhbHRoIG1ldHJpY3MgZm9yIG9uZSBwaXBlbGluZSBvdmVyIGEgd2luZG93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEhlYWx0aFN0YWdlIHtcbiAgc3RhZ2U6IHN0cmluZztcbiAgLyoqIFRlcm1pbmFsIHN0YWdlIHJ1bnMgKHN1Y2NlZWRlZCArIGZhaWxlZCkgaW4gdGhlIHdpbmRvdy4gKi9cbiAgcnVuczogbnVtYmVyO1xuICBzdWNjZXNzZXM6IG51bWJlcjtcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgLyoqIHN1Y2Nlc3NlcyAvIHJ1bnMgYXMgYSBwZXJjZW50ICgwIHdoZW4gcnVucyBpcyAwKS4gKi9cbiAgc3VjY2Vzc1JhdGU6IG51bWJlcjtcbiAgLyoqIER1cmF0aW9uIHBlcmNlbnRpbGVzIG92ZXIgdGhlIHN0YWdlJ3MgdGVybWluYWwgcnVuczsgbnVsbCB3aGVuIG5vIGR1cmF0aW9ucy4gKi9cbiAgcDUwTXM6IG51bWJlciB8IG51bGw7XG4gIHA5ME1zOiBudW1iZXIgfCBudWxsO1xuICBwOTlNczogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBQZXItcGlwZWxpbmUgYnVpbGQtaGVhbHRoIGJyZWFrZG93bi4gU3RhbmRhcmQgcmVwb3J0aW5nIChOT1RcbiAqIGBhZHZhbmNlZF9yZXBvcnRpbmdgLWdhdGVkKSDigJQgcGVyLXN0YWdlIHN1Y2Nlc3MgcmF0ZSArIHRpbWluZyBwZXJjZW50aWxlcywgd2l0aFxuICogdG90YWxzIHN1bW1lZCBhY3Jvc3Mgc3RhZ2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkSGVhbHRoIHtcbiAgc3RhZ2VzOiBCdWlsZEhlYWx0aFN0YWdlW107XG4gIHRvdGFsczogeyBydW5zOiBudW1iZXI7IGZhaWx1cmVzOiBudW1iZXI7IGZhaWx1cmVSYXRlOiBudW1iZXIgfTtcbn1cblxuLyoqIFBvc3QtZGVwbG95IGluY2lkZW50IG1hcmtlciBhY2NlcHRlZCBieSBgUmVwb3J0aW5nU2VydmljZS5yZWNvcmRJbmNpZGVudGAuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50SW5wdXQge1xuICBpbmNpZGVudElkOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG9wZW5lZEF0OiBzdHJpbmc7XG4gIHJlc29sdmVkQXQ/OiBzdHJpbmc7XG4gIHNldmVyaXR5OiBzdHJpbmc7XG59XG5cbi8qKiBFdmVudCBwYXlsb2FkIGFjY2VwdGVkIGJ5IGBSZXBvcnRpbmdTZXJ2aWNlLmluZ2VzdEV2ZW50c2AuIE1pcnJvcnMgdGhlIHJvdXRlJ3MgWm9kIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RFdmVudCB7XG4gIC8qKiBTdGFibGUgcGlwZWxpbmUgaWQgdGhlIGV2ZW50cyBMYW1iZGEgcmVhZCBmcm9tIHRoZSBgcGIucGlwZWxpbmUtaWRgXG4gICAqICB0YWcgKD0gdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQpLiBUaGUgcmVnaXN0cnkgam9pbiBrZXkuICovXG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIHwgJ2NvZGVidWlsZCcgfCAncGx1Z2luLWJ1aWxkJztcbiAgZXZlbnRUeXBlOiAnUElQRUxJTkUnIHwgJ1NUQUdFJyB8ICdBQ1RJT04nIHwgJ0JVSUxEJztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiAoQWN0aW9uIGV2ZW50cykuICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgb2YgdGhlIGNoYW5nZSBiZWluZyBzaGlwcGVkIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFNoYT86IHN0cmluZztcbiAgLyoqIFNvdXJjZSByZWYvYnJhbmNoIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIERlcGxveSB0YXJnZXQgKGUuZy4gXCJwcm9kdWN0aW9uXCIpLiBJdHMgcHJlc2VuY2Ugb24gYSBTVEFHRS9BQ1RJT04gZXZlbnRcbiAgICogIG1hcmtzIGEgcmVhbCBkZXBsb3ltZW50IChkZXJpdmVkIHNlcnZlci1zaWRlIOKAlCB0aGVyZSBpcyBubyBgaXNEZXBsb3lgKS4gKi9cbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIC8qKiBPbGRlc3QgdW5zaGlwcGVkIGNvbW1pdCB0aW1lc3RhbXAgKElTTyA4NjAxKSBmb3IgbWVhc3VyZWQgbGVhZCB0aW1lLiAqL1xuICBjb21taXRUaW1lc3RhbXA/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgY29tbWl0cyBzaGlwcGVkIGluIHRoaXMgY2hhbmdlICjiiaUxKS4gKi9cbiAgY29tbWl0Q291bnQ/OiBudW1iZXI7XG4gIGRldGFpbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIFBlci1ldmVudCBtZXRyaWMgZGVzY3JpcHRvciBlbWl0dGVkICh2aWEgdGhlIHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLmluZ2VzdEV2ZW50c31cbiAqIGBvbk1ldHJpY2AgaG9vaykgZm9yIGVhY2ggUkVHSVNURVJFRCB0ZXJtaW5hbCBkZXBsb3kvc3RhZ2UgZXZlbnQsIHNvIHRoZSByb3V0ZVxuICogbGF5ZXIgY2FuIGZhbiB0aGVtIGludG8gUHJvbWV0aGV1cyBjb3VudGVycyB3aXRob3V0IHBpcGVsaW5lLWRhdGEgaW1wb3J0aW5nXG4gKiBhcGktc2VydmVyJ3MgbWV0cmljcyByZWdpc3RyeS4gYHJlc3VsdGAgaXMgdGhlIHRlcm1pbmFsIG91dGNvbWU7IGBlbnZpcm9ubWVudGBcbiAqIGlzIG5vbi1udWxsIG9ubHkgZm9yIGEgZGVwbG95LXN0YWdlIGV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdE1ldHJpYyB7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgb3JnSWQ6IHN0cmluZztcbiAgc3RhZ2U6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZyB8IG51bGw7XG4gIHJlc3VsdDogJ3N1Y2NlZWRlZCcgfCAnZmFpbGVkJztcbn1cblxuLyoqIENvdW50cyArIHRoZSAocG9zc2libHkgdHJ1bmNhdGVkKSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgdGhlIGNhbGxlciBjYW4gbG9nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RSZXN1bHQge1xuICBpbnNlcnRlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG4gIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEV2ZXJ5IG9yZyB3aXRoIGF0IGxlYXN0IG9uZSByb3cgaW4gdGhpcyBiYXRjaCwgZGVkdXBlZC5cbiAgICpcbiAgICogQWxyZWFkeSBjb21wdXRlZCBmb3IgcG9zdC1jb21taXQgY2FjaGUgaW52YWxpZGF0aW9uOyBzdXJmYWNlZCBiZWNhdXNlIHRoZVxuICAgKiBpbmdlc3Qgcm91dGUgbmVlZHMgdGhlIHNhbWUgc2V0IHRvIHB1c2ggaXRzIGxpdmUgU1NFIGZyYW1lLiBUaGUgc3RhZ2UtbWV0cmljXG4gICAqIGhvb2sgY2FuJ3QgZHJpdmUgdGhhdCBmYW4tb3V0OiBpdCBvbmx5IGZpcmVzIGZvciBTVEFHRSBldmVudHMsIHNvIGEgYmF0Y2ggb2ZcbiAgICogUElQRUxJTkUgb3IgQlVJTEQgZXZlbnRzIHdvdWxkIGxhbmQgcm93cyBhbmQgcHVzaCBubyBmcmFtZSBhdCBhbGwuXG4gICAqL1xuICBhZmZlY3RlZE9yZ3M6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9uZSBvcmcncyBpbmdlc3Rpb24taGVhbHRoIHJvdyBhcyBSRUFEIGJhY2sgYnkgdGhlIFJlcG9ydHMgVUkuIFRoZVxuICogQVdTIGV2ZW50cyBMYW1iZGEgd3JpdGVzIGl0OyB0aGlzIGlzIHRoZSBzaGFwZSB0aGF0IGxldHMgdGhlIFVJIHRlbGxcbiAqIFwiaW5nZXN0aW9uIGlzIGhlYWx0aHksIHRoZXJlIHdlcmUgc2ltcGx5IG5vIGRlcGxveXMgaW4gdGhlIHJhbmdlXCIgYXBhcnQgZnJvbVxuICogXCJ3ZSBoYXZlbid0IGhlYXJkIGZyb20gdGhlIGluZ2VzdCBwaXBlbGluZSBzaW5jZSBYXCIuXG4gKlxuICogYG51bGxgIGZyb20ge0BsaW5rIFJlcG9ydGluZ1NlcnZpY2UuZ2V0SW5nZXN0SGVhbHRofSBtZWFucyB0aGUgZGVwbG95bWVudCBoYXNcbiAqIE5FVkVSIHJlcG9ydGVkIOKAlCBub3QgXCJzdGFsZVwiLiBUaGUgdHdvIG11c3Qgbm90IGJlIGNvbmZsYXRlZDogYSBmcmVzaCBpbnN0YWxsXG4gKiAob3Igb25lIHdob3NlIGZvcndhcmRlciB3YXMgbmV2ZXIgd2lyZWQgdXApIGhhcyBubyBoZWFydGJlYXQgYXQgYWxsLCBhbmRcbiAqIGNhbGxpbmcgdGhhdCBcInN0YWxlXCIgd291bGQgaW52ZW50IGEgcmVncmVzc2lvbiB0aGF0IG5ldmVyIGhhcHBlbmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdEhlYWx0aFN0YXR1cyB7XG4gIC8qKiBXaGVuIHRoZSBmb3J3YXJkZXIgbGFzdCBwb3N0ZWQgYSBoZWFydGJlYXQgKGl0cyBvd24gY2xvY2ssIElTTyA4NjAxKS4gKi9cbiAgdXBkYXRlZEF0OiBzdHJpbmc7XG4gIC8qKiBUaW1lc3RhbXAgb2YgdGhlIG5ld2VzdCBldmVudCBpdCBoYWQgZm9yd2FyZGVkLCBvciBudWxsIGlmIGl0IGhhcyBzZWVuIG5vbmUuICovXG4gIGxhc3RFdmVudEF0OiBzdHJpbmcgfCBudWxsO1xuICAvKiogQ3VtdWxhdGl2ZSBldmVudHMgZm9yd2FyZGVkLCBvciBudWxsIHdoZW4gdGhlIGZvcndhcmRlciBkb2Vzbid0IHJlcG9ydCBpdC4gKi9cbiAgZm9yd2FyZGVkOiBudW1iZXIgfCBudWxsO1xuICAvKiogQ3VtdWxhdGl2ZSBldmVudHMgRFJPUFBFRCAobm9uLXplcm8g4oeSIGRhdGEgbG9zcyB1cHN0cmVhbSBvZiB0aGUgcmVwb3J0cykuICovXG4gIGRyb3BwZWQ6IG51bWJlciB8IG51bGw7XG59XG5cblxuLyoqXG4gKiBSZWFkLW9ubHkgcmVwb3J0aW5nIHNlcnZpY2UgZm9yIHBpcGVsaW5lIGV4ZWN1dGlvbiBhbmQgcGx1Z2luIGludmVudG9yeSBhZ2dyZWdhdGlvbnMuXG4gKiBEb2VzIG5vdCBleHRlbmQgQ3J1ZFNlcnZpY2Ug4oCUIHJlcG9ydHMgYXJlIGFnZ3JlZ2F0ZSBxdWVyaWVzLCBub3QgZW50aXR5IENSVUQuXG4gKlxuICogQWxsIHF1ZXJpZXMgYXJlIGNhY2hlZCBpbi1tZW1vcnkgdG8gYXZvaWQgcmVwZWF0ZWQgZXhwZW5zaXZlIFNRTCBhZ2dyZWdhdGlvbnM6XG4gKiAtIEludmVudG9yeSBxdWVyaWVzIChwbHVnaW4gc3VtbWFyeS9kaXN0cmlidXRpb24vdmVyc2lvbnMpOiA1IG1pbiBUVExcbiAqIC0gVGltZXNlcmllcyBxdWVyaWVzIChleGVjdXRpb24vYnVpbGQgbWV0cmljcyB3aXRoIGRhdGUgcmFuZ2VzKTogMiBtaW4gVFRMXG4gKi9cblxuLyoqXG4gKiBJbnRlcm5hbCByb3cgc2hhcGVzIGZvciB0aGUgRE9SQSBxdWVyaWVzLiBFeHBvcnRlZCBiZWNhdXNlIC4vZG9yYS50cyBjb25zdW1lc1xuICogdGhlbTsgbm90IHBhcnQgb2YgdGhlIHBhY2thZ2UncyBwdWJsaWMgc3VyZmFjZSAocmVwb3J0aW5nLXNlcnZpY2UudHNcbiAqIHJlLWV4cG9ydHMgdGhpcyBtb2R1bGUgd2hvbGVzYWxlLCB3aGljaCBpcyBhIGRlbGliZXJhdGUgc2ltcGxpZmljYXRpb24g4oCUIHRoZXNlXG4gKiBkZXNjcmliZSBxdWVyeSByZXN1bHRzLCBub3QgQVBJIGNvbnRyYWN0cykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95Um93IHtcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgc3RhdHVzOiAnU1VDQ0VFREVEJyB8ICdGQUlMRUQnIHwgc3RyaW5nO1xuICAvKiogRGVwbG95IGV4ZWN1dGlvbiBpZCDigJQgdGhlIGF0dHJpYnV0aW9uIGtleSBmb3IgZGVkdXAgYWdhaW5zdCBvdXRjb21lcy9pbmNpZGVudHMuICovXG4gIGV4ZWN1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICBjb21taXRfdHM6IHN0cmluZyB8IG51bGw7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkZXBsb3kgY29tcGxldGVkIGluc2lkZSBbZnJvbSx0b10uIEFic2VudCAodW5kZWZpbmVkKSBpbiB1bml0XG4gICAqIGZpeHR1cmVzIOKHkiB0cmVhdGVkIGFzIGluLXdpbmRvdy4gYHRgL2BmYCB0b2xlcmF0ZWQgKHBnIGJvb2xlYW4gdGV4dCBmb3JtKS5cbiAgICovXG4gIGluX3dpbmRvdz86IGJvb2xlYW4gfCBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogUmF3IHBvc3QtZGVwbG95IG91dGNvbWUgbWFya2VyIHJvdyAoZnJvbSBgZGVwbG95bWVudF9vdXRjb21lc2AsIGluLXdpbmRvdykuICovXG5leHBvcnQgaW50ZXJmYWNlIE91dGNvbWVSb3cge1xuICBlbnZpcm9ubWVudDogc3RyaW5nIHwgbnVsbDtcbiAgb3V0Y29tZTogJ2ZhaWxlZCcgfCAncmVzdG9yZWQnIHwgc3RyaW5nO1xuICAvKiogRXhlY3V0aW9uIHRoZSB1c2VyIG1hcmtlZCDigJQgZGVkdXAga2V5IGFnYWluc3QgaW5jaWRlbnQtY29ycmVsYXRlZCBkZXBsb3lzLiAqL1xuICBleGVjdXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBQcm9kdWN0aW9uIHJlc3RvcmVkLWluY2lkZW50IHBhaXI6IHJlY292ZXJ5IHRpbWUgKyB0aGUgZGVwbG95J3MgY29tcGxldGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTXR0clBhaXJSb3cge1xuICByZXN0b3JlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgZGVwbG95ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBFeGVjdXRpb24gaWQg4oCUIGxldHMgaW5jaWRlbnQgcHJlY2VkZW5jZSBvdmVycmlkZSB0aGUgbWFudWFsIG91dGNvbWUgcGVyIGRlcGxveS4gKi9cbiAgZXhlY3V0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAqIFJhdyBpbmNpZGVudCByb3cgKGZyb20gYGluY2lkZW50c2AsIG9wZW5lZCBpbi13aW5kb3cpLiBDb3JyZWxhdGVkIGluIEpTIHRvIHRoZVxuICogbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBkZXBsb3kgdG8gYGVudmlyb25tZW50YCB3aXRoaW4gRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlNcbiAqIOKGkiBhbiBhdXRvbWF0ZWQgcG9zdC1kZXBsb3kgZmFpbHVyZSAoQ0ZSKSArIHJlYWwgcmVjb3ZlcnkgdGltZSAoTVRUUikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jaWRlbnRSb3cge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICBvcGVuZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gIHJlc29sdmVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogQ292ZXJhZ2UgY291bnRzOiByZWdpc3RlcmVkIHBpcGVsaW5lcyB2cyB0aG9zZSB0aGF0IGFjdHVhbGx5IGRlcGxveWVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3ZlcmFnZVJvdyB7XG4gIHJlZ2lzdGVyZWQ6IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGRlcGxveWluZzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbn1cbiJdfQ==
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUHVibGljIHJlc3VsdCBzaGFwZXMgZm9yIHRoZSByZXBvcnRpbmcgc2VydmljZS5cbiAqXG4gKiBTcGxpdCBvdXQgb2YgcmVwb3J0aW5nLXNlcnZpY2UudHMgcHVyZWx5IGZvciBzaXplOiB0aGVzZSBhcmUgZGF0YSBjb250cmFjdHNcbiAqIHdpdGggbm8gYmVoYXZpb3VyLiByZXBvcnRpbmctc2VydmljZS50cyByZS1leHBvcnRzIHRoZW0sIHNvIHRoZVxuICogYEBwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGFgIHB1YmxpYyBzdXJmYWNlIGlzIHVuY2hhbmdlZC5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50IHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0b3RhbDogbnVtYmVyO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIGZpcnN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBsYXN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVTZXJpZXNFbnRyeSB7XG4gIHBlcmlvZDogc3RyaW5nO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEdXJhdGlvblN0YXRzIHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1pbk1zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG4gIHA5NU1zOiBudW1iZXI7XG4gIGV4ZWN1dGlvbnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUV4ZWN1dGlvbiB7XG4gIGV4ZWN1dGlvbklkOiBzdHJpbmc7XG4gIC8qKiBSb2xsZWQtdXAgdGVybWluYWwgc3RhdHVzOiBzdWNjZWVkZWQgfCBmYWlsZWQgfCBjYW5jZWxlZCB8IGluLXByb2dyZXNzLiAqL1xuICBzdGF0dXM6IHN0cmluZztcbiAgc3RhcnRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBlbmRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsO1xuICAvKiogRmlyc3QgZmFpbGluZyBzdGFnZS9hY3Rpb24gZm9yIHRoZSBleGVjdXRpb24gKG51bGwgd2hlbiBpdCBkaWRuJ3QgZmFpbCkuICovXG4gIGZhaWxpbmdTdGFnZTogc3RyaW5nIHwgbnVsbDtcbiAgZmFpbGluZ0FjdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFnZUZhaWx1cmUge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlQm90dGxlbmVjayB7XG4gIGlkOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uRmFpbHVyZSB7XG4gIGFjdGlvbk5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yRW50cnkge1xuICBlcnJvclBhdHRlcm46IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgYWZmZWN0ZWRQaXBlbGluZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TdW1tYXJ5IHtcbiAgdG90YWw6IG51bWJlcjtcbiAgYWN0aXZlOiBudW1iZXI7XG4gIGluYWN0aXZlOiBudW1iZXI7XG4gIC8qKiBDb3VudHMgcGVyIHNoYXJpbmcgcnVuZyDigJQgb25lIGJ1Y2tldCBwZXIgYHZpc2liaWxpdHlgIHZhbHVlLiAqL1xuICBwdWJsaWM6IG51bWJlcjtcbiAgb3JnOiBudW1iZXI7XG4gIHByaXZhdGU6IG51bWJlcjtcbiAgdW5pcXVlTmFtZXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbiB7XG4gIHBsdWdpblR5cGU6IHN0cmluZztcbiAgY29tcHV0ZVR5cGU6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJzaW9uQ291bnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb25Db3VudDogbnVtYmVyO1xuICBsYXRlc3RWZXJzaW9uOiBzdHJpbmc7XG4gIGhhc0RlZmF1bHQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRUaW1lU2VyaWVzRW50cnkge1xuICBwZXJpb2Q6IHN0cmluZztcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBzdWNjZXNzUGN0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGREdXJhdGlvbiB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbiAgYnVpbGRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGx1Z2luIHJ1bnRpbWUgcmVwb3J0IGZpbHRlcnMuIGBwdWJsaXNoZXI6IG51bGxgIHNlbGVjdHMgb3duLW9yZ1xuICogKHB1Ymxpc2hlci1sZXNzKSBwbHVnaW5zOyBhbiBvbWl0dGVkIGZpZWxkIGRvZXNuJ3QgZmlsdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblJ1bnRpbWVGaWx0ZXIge1xuICBuYW1lPzogc3RyaW5nO1xuICBwdWJsaXNoZXI/OiBzdHJpbmcgfCBudWxsO1xuICB2ZXJzaW9uPzogc3RyaW5nO1xufVxuXG4vKiogUGVyIHBsdWdpbiB2ZXJzaW9uIHJ1bnRpbWUgc3RhdHMgb3ZlciBhIHdpbmRvdyAodGVybWluYWwgQUNUSU9OIHJ1bnMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5SdW50aW1lU3RhdHMge1xuICBwbHVnaW5QdWJsaXNoZXI6IHN0cmluZyB8IG51bGw7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcGx1Z2luVmVyc2lvbjogc3RyaW5nO1xuICBydW5zOiBudW1iZXI7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgLyoqIDDigJMxMDAsIG9uZSBkZWNpbWFsLiAqL1xuICBzdWNjZXNzUGN0OiBudW1iZXI7XG4gIC8qKiBOdWxsIHdoZW4gbm8gcnVuIGluIHRoZSBncm91cCBjYXJyaWVkIGEgZHVyYXRpb24uICovXG4gIHA1ME1zOiBudW1iZXIgfCBudWxsO1xuICBwOTVNczogbnVtYmVyIHwgbnVsbDtcbiAgbGFzdFJ1bjogc3RyaW5nO1xufVxuXG4vKiogQ3Jvc3Mtb3JnIDMwLWRheSBhZ2dyZWdhdGUgZm9yIG9uZSBgKHB1Ymxpc2hlciwgbmFtZSlgIGxpc3RpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUge1xuICBydW5zMzBkOiBudW1iZXI7XG4gIC8qKiAw4oCTMTsgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gcnVucy4gKi9cbiAgc3VjY2Vzc1JhdGUzMGQ6IG51bWJlciB8IG51bGw7XG4gIGFjdGl2ZU9yZ0NvdW50MzBkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRGYWlsdXJlIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgRE9SQSBoZWFkbGluZSBlbnZpcm9ubWVudC4gRGVwbG95bWVudCB0byB0aGlzIGxpdGVyYWwgZW52IG5hbWUgaXMgdGhlXG4gKiBpbmR1c3RyeS1zdGFuZGFyZCBET1JBIHNpZ25hbDsgTVRUUiBpcyBtZWFzdXJlZCBwcm9kdWN0aW9uLW9ubHksIGFuZCB0aGlzXG4gKiBlbnZpcm9ubWVudCdzIGNhcmQgaXMgdGhlIHN1bW1hcnkgc2hvd24gYXQgdGhlIHRvcCBvZiB0aGUgcGFuZWwuXG4gKi9cblxuLyoqIFBlci1vcmcgcmV0ZW50aW9uIG92ZXJyaWRlIHJvdy4gQm90aCBudWxsYWJsZSDih5IgZ2xvYmFsIGRlZmF1bHRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdSZXRlbnRpb25TZXR0aW5ncyB7XG4gIGV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyIHwgbnVsbDtcbiAgZG9yYVJldGVudGlvbkRheXM6IG51bWJlciB8IG51bGw7XG4gIGRlZmF1bHRFdmVudFJldGVudGlvbkRheXM6IG51bWJlcjtcbiAgZGVmYXVsdERvcmFSZXRlbnRpb25EYXlzOiBudW1iZXI7XG59XG5cbi8qKiBPcHRpb25zIGZvciB0aGUgcmVwb3J0aW5nIHJldGVudGlvbiBzd2VlcC4gKi9cbi8qKlxuICogSG93IGEgdGltZS1idWNrZXRlZCByZXBvcnQgc2xpY2VzIGl0cyBwZXJpb2RzLiBBYnNlbnQgbWVhbnMgVVRDICsgTW9uZGF5LCB3aGljaFxuICogaXMgd2hhdCBldmVyeSBwcmUtdGltZXpvbmUgY2FsbGVyIGdvdCDigJQgc28gYW4gb21pdHRlZCB2YWx1ZSBjYW4gbmV2ZXIgc2lsZW50bHlcbiAqIGNoYW5nZSBhbiBleGlzdGluZyByZXBvcnQncyBib3VuZGFyaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldE9wdGlvbnMge1xuICAvKiogSUFOQSB0aW1lem9uZSB0aGUgYnVja2V0cyBhcmUgY3V0IGluICh2YWxpZGF0ZWQgYXQgdGhlIHJvdXRlKS4gKi9cbiAgdHo/OiBzdHJpbmc7XG4gIC8qKiBXaGVyZSB0aGUgd2VlayBzdGFydHMuIFBvc3RncmVzIERBVEVfVFJVTkMgaXMgTW9uZGF5LW9ubHksIHNvIGBzdW5kYXlgXG4gICAqICBzaGlmdHMgdGhlIGJvdW5kYXJ5IGV4cGxpY2l0bHkuICovXG4gIHdlZWtTdGFydD86ICdtb25kYXknIHwgJ3N1bmRheSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0aW5nUmV0ZW50aW9uT3B0aW9ucyB7XG4gIC8qKiBSb3dzIGRlbGV0ZWQgcGVyIHN0YXRlbWVudCAoZGVmYXVsdCAxMDAwKS4gKi9cbiAgYmF0Y2hTaXplPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGxlYWRlci1sb2NrZWQgcnVuIHRoaXMgc3dlZXAgYmVsb25ncyB0by4gQ2hlY2tlZCBCRVRXRUVOIE9SR1M6IGFib3J0ZWRcbiAgICogbWVhbnMgdGhlIGxvY2sgd2FzIGxvc3QgKGFub3RoZXIgcG9kIGlzIHRha2luZyBvdmVyKSBvciB0aGUgcHJvY2VzcyBpc1xuICAgKiBzaHV0dGluZyBkb3duLCBhbmQgdGhlIHJlbWFpbmluZyBvcmdzIGFyZSBwaWNrZWQgdXAgbmV4dCB0aWNrLiBXaXRob3V0IGl0IGFcbiAgICogbG9uZyBzd2VlcCBrZXB0IGRlbGV0aW5nIGFmdGVyIGFub3RoZXIgcG9kIGhhZCBhbHJlYWR5IHRha2VuIHRoZSBsb2NrLlxuICAgKi9cbiAgcnVuPzogeyBzaWduYWw6IEFib3J0U2lnbmFsIH07XG4gIC8qKiBNYXggYmF0Y2hlcyBwZXIgdGFibGUgcGVyIG9yZyBwZXIgdGljayAoZGVmYXVsdCA1MCk7IHRoZSByZXN0IGRlZmVycyB0b1xuICAgKiAgdGhlIG5leHQgdGljayBzbyBhIGh1Z2UgYmFja2xvZyBjYW4ndCBob2xkIGxvY2tzIHRvbyBsb25nLiAqL1xuICBtYXhCYXRjaGVzUGVyVGFibGU/OiBudW1iZXI7XG4gIC8qKiBGaXhlZCBcIm5vd1wiIGZvciB0aGUgd2hvbGUgc3dlZXAgKGRlZmF1bHQgYG5ldyBEYXRlKClgKS4gKi9cbiAgbm93PzogRGF0ZTtcbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIG9yZyB3aG9zZSBgZG9yYV9zZXR0aW5nc2AgcmV0ZW50aW9uIGdvdmVybnMgYG9yZ0lkYCdzIHJvd3Mg4oCUIGl0c1xuICAgKiBhY2NvdW50IFJPT1QuIFJldGVudGlvbiBpcyBhIGJpbGxpbmcgZW50aXRsZW1lbnQgc3luY2VkIG9udG8gdGhlIHJvb3Qgb25seSxcbiAgICogc28gYSB0ZWFtJ3Mgcm93cyBtdXN0IGZvbGxvdyB0aGUgcm9vdCdzIChwdXJjaGFzZWQpIHdpbmRvdywgbm90IHRoZSBlbnZcbiAgICogZGVmYXVsdC4gUmV0dXJuIGBudWxsYCB3aGVuIHRoZSByb290IGNhbid0IGJlIHJlc29sdmVkOiB0aGF0IG9yZyBpcyBTS0lQUEVEXG4gICAqIHRoaXMgdGljayAobmV2ZXIgcHVyZ2VkIG9uIGEgcG9zc2libHktc2hvcnRlciB3aW5kb3cpLiBEZWZhdWx0OiBpZGVudGl0eVxuICAgKiAoZXZlcnkgb3JnIGlzIGl0cyBvd24gcm9vdCDigJQgYSBmbGF0IGRlcGxveW1lbnQpLlxuICAgKi9cbiAgcmVzb2x2ZVJldGVudGlvbk9yZ0lkPzogKG9yZ0lkOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG59XG5cbi8qKiBQZXItcnVuIHB1cmdlIHRhbGxpZXMgKGFsc28gbG9nZ2VkKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0aW5nUmV0ZW50aW9uQ291bnRzIHtcbiAgLyoqIE9yZ3Mgc3dlcHQgdGhpcyBydW4uICovXG4gIG9yZ3M6IG51bWJlcjtcbiAgLyoqIFN0YW5kYXJkIGBwaXBlbGluZV9ldmVudHNgIChlbnZpcm9ubWVudCBJUyBOVUxMKSByb3dzIHB1cmdlZC4gKi9cbiAgc3RhbmRhcmRFdmVudHM6IG51bWJlcjtcbiAgLyoqIERPUkEtc291cmNlIGBwaXBlbGluZV9ldmVudHNgIChlbnZpcm9ubWVudCBJUyBOT1QgTlVMTCkgcm93cyBwdXJnZWQuICovXG4gIGRvcmFFdmVudHM6IG51bWJlcjtcbiAgLyoqIGBkZXBsb3ltZW50X291dGNvbWVzYCByb3dzIHB1cmdlZC4gKi9cbiAgZGVwbG95bWVudE91dGNvbWVzOiBudW1iZXI7XG4gIC8qKiBgaW5jaWRlbnRzYCByb3dzIHB1cmdlZC4gKi9cbiAgaW5jaWRlbnRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogRE9SQSBwZXJmb3JtYW5jZSBiYW5kLiBgbnVsbGAgPSBpbnN1ZmZpY2llbnQgZGF0YSB0byBjbGFzc2lmeSAobm9cbiAqIGRlcGxveW1lbnRzL2ZhaWx1cmVzL2xlYWQtdGltZSBzYW1wbGUgaW4gdGhlIHdpbmRvdyksIHNvIHRoZSBVSSBzaG93cyBhXG4gKiBuZXV0cmFsIHN0YXRlIHJhdGhlciB0aGFuIG1pc2xhYmVsaW5nIGFuIGVtcHR5IHdpbmRvdyBhcyBcImxvd1wiLlxuICovXG5leHBvcnQgdHlwZSBEb3JhTGV2ZWwgPSAnZWxpdGUnIHwgJ2hpZ2gnIHwgJ21lZGl1bScgfCAnbG93JyB8IG51bGw7XG5cbi8qKiBPcHRpb25hbCBzY29waW5nIGZvciB7QGxpbmsgUmVwb3J0aW5nU2VydmljZS5nZXREb3JhTWV0cmljc30uICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFPcHRpb25zIHtcbiAgLyoqIFJlc3RyaWN0IHRvIGEgc2luZ2xlIHBpcGVsaW5lIChwZXItcGlwZWxpbmUgRE9SQSkuICovXG4gIHBpcGVsaW5lSWQ/OiBzdHJpbmc7XG4gIC8qKiBSZXN0cmljdCB0byBhIHNpbmdsZSBkZXBsb3kgZW52aXJvbm1lbnQgKGVsc2UgYWxsIGRlcGxveSBlbnZpcm9ubWVudHMpLiAqL1xuICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBlci1vcmcgaW5jaWRlbnTihpJkZXBsb3kgY29ycmVsYXRpb24gd2luZG93IG92ZXJyaWRlIChob3VycykuIFdoZW4gc2V0IChhXG4gICAqIHBvc2l0aXZlIGZpbml0ZSBudW1iZXIpLCB0aGUgaW5jaWRlbnQgY29ycmVsYXRpb24gdXNlcyBpdCBpbnN0ZWFkIG9mIHRoZVxuICAgKiBnbG9iYWwgYERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTYC4gVGhlIHJvdXRlIHJlc29sdmVzIHRoaXMgZnJvbSB0aGUgb3JnJ3NcbiAgICogYGRvcmFfc2V0dGluZ3NgIHJvdyAoc2VlIHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLmdldFJlcG9ydGluZ1NldHRpbmdzfSkgYW5kXG4gICAqIHBhc3NlcyBpdCBpbjsgdW5zZXQgZmFsbHMgYmFjayB0byB0aGUgZW52IGRlZmF1bHQuXG4gICAqL1xuICBpbmNpZGVudFdpbmRvd0hvdXJzPzogbnVtYmVyO1xuICAvKiogSUFOQSB0aW1lem9uZSBmb3IgdGhlIHRyZW5kJ3MgYnVja2V0cyAoc2VlIHtAbGluayBCdWNrZXRPcHRpb25zfSkuICovXG4gIHR6Pzogc3RyaW5nO1xuICAvKiogV2VlayBzdGFydCBmb3IgdGhlIHRyZW5kJ3MgYnVja2V0cy4gKi9cbiAgd2Vla1N0YXJ0PzogJ21vbmRheScgfCAnc3VuZGF5Jztcbn1cblxuLyoqXG4gKiBQZXItb3JnIHJlcG9ydGluZyBzZXR0aW5ncyBzdXJmYWNlZCB0byB0aGUgb3JnLWFkbWluIHBhbmVsLiBgaW5jaWRlbnRXaW5kb3dIb3Vyc2BcbiAqIGlzIHRoZSBpbmNpZGVudOKGkmRlcGxveSBjb3JyZWxhdGlvbiB3aW5kb3c7IGBldmVudFJldGVudGlvbkRheXNgIC9cbiAqIGBkb3JhUmV0ZW50aW9uRGF5c2AgYXJlIHRoZSB0d28gcmV0ZW50aW9uLXN3ZWVwIHdpbmRvd3MuIEVhY2ggb3ZlcnJpZGVcbiAqIGlzIGBudWxsYCB3aGVuIHVuc2V0ICh0aGUgcGFpcmVkIGBkZWZhdWx0KmAgZmllbGQgc2hvd3MgdGhlIGVudiBmYWxsYmFjayBhcHBsaWVkKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdTZXR0aW5ncyB7XG4gIC8qKiBUaGUgb3JnJ3Mgc3RvcmVkIGNvcnJlbGF0aW9uLXdpbmRvdyBvdmVycmlkZSBpbiBob3Vycywgb3IgYG51bGxgIHdoZW4gdW5zZXQuICovXG4gIGluY2lkZW50V2luZG93SG91cnM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBUaGUgZ2xvYmFsIGVudiBkZWZhdWx0IGFwcGxpZWQgd2hlbiBubyBvdmVycmlkZSBpcyBzdG9yZWQuICovXG4gIGRlZmF1bHRXaW5kb3dIb3VyczogbnVtYmVyO1xuICAvKiogU3RhbmRhcmQtZXZlbnQgcmV0ZW50aW9uIG92ZXJyaWRlIGluIGRheXMsIG9yIGBudWxsYCB3aGVuIHVuc2V0LiAqL1xuICBldmVudFJldGVudGlvbkRheXM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBET1JBLXNvdXJjZSByZXRlbnRpb24gb3ZlcnJpZGUgaW4gZGF5cywgb3IgYG51bGxgIHdoZW4gdW5zZXQuICovXG4gIGRvcmFSZXRlbnRpb25EYXlzOiBudW1iZXIgfCBudWxsO1xuICAvKiogR2xvYmFsIHN0YW5kYXJkLWV2ZW50IHJldGVudGlvbiBkZWZhdWx0IGFwcGxpZWQgd2hlbiB1bnNldCAoZGF5cykuICovXG4gIGRlZmF1bHRFdmVudFJldGVudGlvbkRheXM6IG51bWJlcjtcbiAgLyoqIEdsb2JhbCBET1JBLXNvdXJjZSByZXRlbnRpb24gZGVmYXVsdCBhcHBsaWVkIHdoZW4gdW5zZXQgKGRheXMpLiAqL1xuICBkZWZhdWx0RG9yYVJldGVudGlvbkRheXM6IG51bWJlcjtcbn1cblxuLyoqIEEgcGFydGlhbCByZXBvcnRpbmctc2V0dGluZ3Mgd3JpdGUgKDcpLiBPbmx5IHByb3ZpZGVkIGZpZWxkcyBhcmVcbiAqICB1cHNlcnRlZDsgb21pdHRlZCBmaWVsZHMgYXJlIGxlZnQgdW5jaGFuZ2VkIChhbiBvbWl0dGVkIHJldGVudGlvbiBmaWVsZCBrZWVwc1xuICogIGl0cyBzdG9yZWQgb3ZlcnJpZGUgLyB0aGUgZ2xvYmFsIGRlZmF1bHQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdTZXR0aW5nc1BhdGNoIHtcbiAgaW5jaWRlbnRXaW5kb3dIb3Vycz86IG51bWJlcjtcbiAgZXZlbnRSZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuICBkb3JhUmV0ZW50aW9uRGF5cz86IG51bWJlcjtcbn1cblxuLyoqIE9uZSByb3cgb2YgdGhlIG9yZy1hZG1pbiBpbmNpZGVudHMgbGlzdCAocmVjZW50IGluY2lkZW50cyArIGRlcGxveSBjb3JyZWxhdGlvbikuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50TGlzdEl0ZW0ge1xuICBpbmNpZGVudElkOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIHNldmVyaXR5OiBzdHJpbmc7XG4gIG9wZW5lZEF0OiBzdHJpbmcgfCBudWxsO1xuICByZXNvbHZlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBjcmVhdGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUcnVlIG9uY2UgdGhlIGluY2lkZW50IGhhcyBhIGByZXNvbHZlZF9hdGAuICovXG4gIHJlc29sdmVkOiBib29sZWFuO1xuICAvKiogVGhlIGNvcnJlbGF0ZWQgZGVwbG95IGV4ZWN1dGlvbiBpZCAobW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBkZXBsb3kgaW4td2luZG93KSwgb3IgbnVsbC4gKi9cbiAgY29ycmVsYXRlZEV4ZWN1dGlvbklkOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhhdCBkZXBsb3kncyBjb21wbGV0aW9uIGluc3RhbnQsIG9yIG51bGwgd2hlbiB1bmNvcnJlbGF0ZWQuICovXG4gIGRlcGxveUNvbXBsZXRlZEF0OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogUmVzdWx0IG9mIHRoZSB3aXJpbmctdGVzdCBkcnktcnVuIGNvcnJlbGF0aW9uICh7QGxpbmsgUmVwb3J0aW5nU2VydmljZS50ZXN0SW5jaWRlbnRDb3JyZWxhdGlvbn0pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNpZGVudFRlc3RSZXN1bHQge1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICAvKiogVGhlIHN5bnRoZXRpYyBpbmNpZGVudCdzIG9wZW5lZEF0IChub3csIElTTykuICovXG4gIG9wZW5lZEF0OiBzdHJpbmc7XG4gIC8qKiBUaGUgZWZmZWN0aXZlIGNvcnJlbGF0aW9uIHdpbmRvdyB1c2VkLiAqL1xuICB3aW5kb3dIb3VyczogbnVtYmVyO1xuICAvKiogV2hldGhlciBhIHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSB0byBgZW52aXJvbm1lbnRgIGNvcnJlbGF0ZWQuICovXG4gIGNvcnJlbGF0ZWQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgY29ycmVsYXRlZCBkZXBsb3kgZXhlY3V0aW9uIGlkLCBvciBudWxsLiAqL1xuICBleGVjdXRpb25JZDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoYXQgZGVwbG95J3MgY29tcGxldGlvbiBpbnN0YW50LCBvciBudWxsLiAqL1xuICBkZXBsb3lDb21wbGV0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLy8gRE9SQSBwZXJmb3JtYW5jZSBiYW5kcyAodGhyZXNob2xkcyBmcm9tIHRoZSBET1JBL0FjY2VsZXJhdGUgcmVwb3J0cykuIEVhY2hcbi8vIGhlbHBlciByZXR1cm5zIGBudWxsYCB3aGVuIHRoZXJlJ3Mgbm8gc2FtcGxlIHRvIGNsYXNzaWZ5LlxuLyoqIERlcGxveW1lbnQgZnJlcXVlbmN5IGJ5IGRlcGxveXMvZGF5OiBlbGl0ZSDiiaUxL2RheSwgaGlnaCDiiaUxL3dlZWssIG1lZGl1bSDiiaUxL21vbnRoLiAqL1xuXG4vKipcbiAqIERPUkEgbWV0cmljcyBvdmVyIGEgW2Zyb20sdG9dIHdpbmRvdywgb3JnLXNjb3BlZCAoc2luZ2xlLW9yZyBvciByb2xsdXAgc3VidHJlZSkuXG4gKlxuICogREVQTE9ZLUJBU0lTIOKAlCBldmVyeSBtZXRyaWMgZGVyaXZlcyBmcm9tIHJlYWwgREVQTE9ZLVNUQUdFIGV4ZWN1dGlvbnMsIGkuZS5cbiAqIGBwaXBlbGluZV9ldmVudHNgIHJvd3Mgd2l0aCBgZXZlbnRfdHlwZT0nU1RBR0UnYCBhbmQgYSBub24tbnVsbCBgZW52aXJvbm1lbnRgXG4gKiAodGhlIGZvcndhcmRlciBzZXRzIGBlbnZpcm9ubWVudGAgb25seSBmb3IgdGhlIHN0YWdlcyBhIHVzZXIgZGVjbGFyZWQgaW5cbiAqIGBwYi5kZXBsb3lzYCkuIEEgQ0ktb25seSBidWlsZC90ZXN0IHBpcGVsaW5lIHdpdGggbm8gZGVwbG95IHN0YWdlIHByb2R1Y2VzIE5PXG4gKiBET1JBIGRhdGEg4oCUIHRoZXJlIGlzIG5vIHJ1bi1iYXNlZCBmYWxsYmFjay4gVGhlIHBhbmVsIGlzIGVtcHR5IHVudGlsIGRlcGxveWVkXG4gKiBwaXBlbGluZXMgcmUtc3ludGggd2l0aCB0aGUgbmV3IGRlcGxveSB0YWdzIGFuZCBzdGFydCBlbWl0dGluZyBkZXBsb3kgZXZlbnRzLlxuICpcbiAqIGBwcm9kdWN0aW9uYCBpcyB0aGUgaGVhZGxpbmUgZW52aXJvbm1lbnQ7IE1UVFIgaXMgbWVhc3VyZWQgcHJvZHVjdGlvbi1vbmx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFNZXRyaWNzIHtcbiAgLyoqIFRoZSBbZnJvbSx0b10gd2luZG93IGVjaG9lZCBiYWNrIChkZXBsb3kgYGNvbXBsZXRlZF9hdGAgcmFuZ2UpLiAqL1xuICB3aW5kb3c6IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH07XG4gIC8qKiBUaGUgc2NvcGluZyBhcHBsaWVkIChlY2hvZWQgZm9yIHRoZSBVSSk7IGBudWxsYCB3aGVuIHVuc2NvcGVkLiAqL1xuICBmaWx0ZXJzOiB7IHBpcGVsaW5lSWQ6IHN0cmluZyB8IG51bGw7IGVudmlyb25tZW50OiBzdHJpbmcgfCBudWxsIH07XG4gIC8qKiBUaGUgaGVhZGxpbmUgZW52aXJvbm1lbnQgbmFtZSAoYHByb2R1Y3Rpb25gKS4gKi9cbiAgaGVhZGxpbmU6IHN0cmluZztcbiAgLyoqIFBlci1lbnZpcm9ubWVudCBERiAvIENGUiAvIGxlYWQgdGltZS4gU29ydGVkIGhlYWRsaW5lLWZpcnN0LCB0aGVuIEHihpJaLiAqL1xuICBlbnZpcm9ubWVudHM6IERvcmFFbnZNZXRyaWNzW107XG4gIC8qKlxuICAgKiBNZWFuIFRpbWUgVG8gUmVzdG9yZSDigJQgUFJPRFVDVElPTi1PTkxZLCBmcm9tIGBkZXBsb3ltZW50X291dGNvbWVzYC5cbiAgICogYG1lZGlhbihyZXN0b3JlZC5hdCDiiJIgZGVwbG95ZWQuY29tcGxldGVkX2F0KWAgb3ZlciByZXN0b3JlZCBwcm9kdWN0aW9uXG4gICAqIGluY2lkZW50cyAoZGVsdGFzIGNsYW1wZWQg4omlMCkuIGBpbmNpZGVudHNgIGNvdW50cyBwcm9kdWN0aW9uIGRlcGxveXMgbWFya2VkXG4gICAqIGZhaWxlZDsgYHJlc3RvcmVkYCBjb3VudHMgdGhvc2UgdGhhdCByZWNvdmVyZWQ7IGBtZWRpYW5TZWNvbmRzYCBpcyBudWxsIHdoZW5cbiAgICogbm8gcmVzdG9yZWQgaW5jaWRlbnQgaGFzIGEgcmVzb2x2YWJsZSBkZXBsb3kgdGltZS5cbiAgICovXG4gIG1lYW5UaW1lVG9SZXN0b3JlOiB7XG4gICAgaW5jaWRlbnRzOiBudW1iZXI7XG4gICAgcmVzdG9yZWQ6IG51bWJlcjtcbiAgICBtZWRpYW5TZWNvbmRzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKiA5MHRoLzk1dGggcGVyY2VudGlsZSByZWNvdmVyeSwgb3ZlciB0aGUgc2FtZSBzYW1wbGUgYXMgdGhlIG1lZGlhbi4gVGhlXG4gICAgICogIG1lZGlhbiBhbG9uZSBoaWRlcyB0aGUgbG9uZyB0YWlsIHRoYXQgYWN0dWFsbHkgZGVmaW5lcyBhbiBvdXRhZ2UncyBjb3N0O1xuICAgICAqICBgbnVsbGAgd2hlbiBubyByZWNvdmVyeSBnYXAgd2FzIG9ic2VydmVkLiAqL1xuICAgIHA5MFNlY29uZHM6IG51bWJlciB8IG51bGw7XG4gICAgcDk1U2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xuICAvKipcbiAgICogQ292ZXJhZ2UgcmVjb25jaWxpYXRpb24g4oCUIHJlZ2lzdGVyZWQgcGlwZWxpbmVzIHdpdGggbm8gb2JzZXJ2ZWQgZGVwbG95IGluXG4gICAqIHRoZSB3aW5kb3cuIEEgaGlnaCBgd2l0aG91dERlcGxveXNgIGNvdW50IG1lYW5zIERPUkEgaXMgYmxpbmQgdG8gbW9zdCBvZiB0aGVcbiAgICogZmxlZXQgKHBpcGVsaW5lcyB0aGF0IGhhdmVuJ3QgcmUtc3ludGhlZCB3aXRoIGRlcGxveSB0YWdzLCBvciBkb24ndCBkZXBsb3kpLlxuICAgKi9cbiAgY292ZXJhZ2U6IHtcbiAgICAvKiogUGlwZWxpbmVzIGluIHRoZSByZWdpc3RyeSAob3JnLXNjb3BlZCkuICovXG4gICAgcmVnaXN0ZXJlZDogbnVtYmVyO1xuICAgIC8qKiBSZWdpc3RlcmVkIHBpcGVsaW5lcyB3aXRoIOKJpTEgZGVwbG95LXN0YWdlIGV4ZWN1dGlvbiBpbiB0aGUgd2luZG93LiAqL1xuICAgIGRlcGxveWluZzogbnVtYmVyO1xuICAgIC8qKiByZWdpc3RlcmVkIOKIkiBkZXBsb3lpbmcgKGNsYW1wZWQg4omlMCkuICovXG4gICAgd2l0aG91dERlcGxveXM6IG51bWJlcjtcbiAgfTtcbn1cblxuLyoqIFBlci1lbnZpcm9ubWVudCBET1JBIG1ldHJpY3MgKGRlcGxveW1lbnQgZnJlcXVlbmN5LCBDRlIsIGxlYWQgdGltZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFFbnZNZXRyaWNzIHtcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgLyoqIERlcGxveW1lbnQgRnJlcXVlbmN5IOKAlCBzdWNjZXNzZnVsIGRlcGxveS1zdGFnZSBleGVjdXRpb25zIGZvciB0aGlzIGVudi4gKi9cbiAgZGVwbG95bWVudEZyZXF1ZW5jeToge1xuICAgIGRlcGxveW1lbnRzOiBudW1iZXI7XG4gICAgcGVyRGF5OiBudW1iZXI7XG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqXG4gICAqIENoYW5nZSBGYWlsdXJlIFJhdGUg4oCUIHR3by1jbGFzczpcbiAgICogYChkZXBsb3lUaW1lRmFpbHVyZXMgKyBwb3N0RGVwbG95RmFpbHVyZXMpIC8gYXR0ZW1wdHNgLlxuICAgKiAtIGBkZXBsb3lUaW1lRmFpbHVyZXNgIOKAlCBkZXBsb3kgc3RhZ2UgYHJlc3VsdD1mYWlsZWRgIChmcm9tIGV2ZW50cykuXG4gICAqIC0gYHBvc3REZXBsb3lGYWlsdXJlc2Ag4oCUIGEgc3VjY2Vzc2Z1bCBkZXBsb3kgbGF0ZXIgbWFya2VkIGZhaWxlZCBpbiBwcm9kXG4gICAqICAgKGZyb20gYGRlcGxveW1lbnRfb3V0Y29tZXNgKS5cbiAgICogLSBgYXR0ZW1wdHNgIOKAlCBhbGwgdGVybWluYWwgZGVwbG95LXN0YWdlIGF0dGVtcHRzIChzdWNjZWVkZWQgKyBmYWlsZWQpLlxuICAgKi9cbiAgY2hhbmdlRmFpbHVyZVJhdGU6IHtcbiAgICByYXRlOiBudW1iZXI7XG4gICAgZGVwbG95VGltZUZhaWx1cmVzOiBudW1iZXI7XG4gICAgcG9zdERlcGxveUZhaWx1cmVzOiBudW1iZXI7XG4gICAgYXR0ZW1wdHM6IG51bWJlcjtcbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xuICAvKipcbiAgICogTGVhZCBUaW1lIOKAlCBNRUFTVVJFRDogYG1lZGlhbihkZXBsb3lfY29tcGxldGVkIOKIkiBvbGRlc3RfY29tbWl0X3RpbWUpYCBvdmVyXG4gICAqIHN1Y2Nlc3NmdWwgZGVwbG95cyB3aXRoIGEgcmVzb2x2YWJsZSBjb21taXQgdGltZXN0YW1wIChkZWx0YXMgY2xhbXBlZCDiiaUwKS5cbiAgICogYG1lZGlhblNlY29uZHNgIGlzIGBudWxsYCAoPSB1bmtub3duKSB3aGVuIG5vIHN1Y2Nlc3NmdWwgZGVwbG95IGluIHRoaXMgZW52XG4gICAqIGNhcnJpZWQgYSBgY29tbWl0X3RpbWVzdGFtcGAuIFRoZSBvbGQgbWVkaWFuLXJ1bi1kdXJhdGlvbiBwcm94eSBpcyByZW1vdmVkLlxuICAgKlxuICAgKiBgcDkwU2Vjb25kc2AvYHA5NVNlY29uZHNgIGNvbWUgZnJvbSB0aGUgc2FtZSBzYW1wbGUuIFRoZSBsZXZlbCBpcyBzY29yZWQgb2ZmXG4gICAqIHRoZSBNRURJQU4gb25seSwgc28gYWRkaW5nIHRoZSB0YWlscyBjYW5ub3QgbW92ZSBhIHRlYW0ncyBET1JBIGJhbmQuXG4gICAqL1xuICBsZWFkVGltZToge1xuICAgIC8qKiBTdWNjZXNzZnVsIGRlcGxveXMgd2l0aCBhIHJlc29sdmFibGUgY29tbWl0IHRpbWUgKHRoZSBtZWRpYW4gc2FtcGxlKS4gKi9cbiAgICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAgIG1lZGlhblNlY29uZHM6IG51bWJlciB8IG51bGw7XG4gICAgcDkwU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICBwOTVTZWNvbmRzOiBudW1iZXIgfCBudWxsO1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG59XG5cbi8qKiBPbmUgaW50ZXJ2YWwgYnVja2V0IG9mIHRoZSBET1JBIHRyZW5kIChkZXBsb3kgZnJlcXVlbmN5ICsgY2hhbmdlIGZhaWx1cmUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhVHJlbmRQb2ludCB7XG4gIC8qKiBCdWNrZXQgc3RhcnQgKERBVEVfVFJVTkMgb2YgdGhlIGRlcGxveSBgY29tcGxldGVkX2F0YCksIElTTyB0ZXh0LiAqL1xuICBwZXJpb2Q6IHN0cmluZztcbiAgLyoqIFN1Y2Nlc3NmdWwgZGVwbG95LXN0YWdlIGV4ZWN1dGlvbnMgaW4gdGhlIGJ1Y2tldC4gKi9cbiAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgLyoqIEZhaWxlZCBkZXBsb3ktc3RhZ2UgZXhlY3V0aW9ucyBpbiB0aGUgYnVja2V0LiAqL1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgLyoqIHN1Y2NlZWRlZCArIGZhaWxlZCBpbiB0aGUgYnVja2V0IChkZXBsb3kgYXR0ZW1wdHMpLiAqL1xuICB0b3RhbDogbnVtYmVyO1xuICAvKiogZmFpbGVkL3RvdGFsIGFzIGEgcGVyY2VudCAoMCB3aGVuIHRvdGFsIGlzIDApLiBEZXBsb3ktdGltZSBDRlIgb25seS4gKi9cbiAgY2hhbmdlRmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG4vKiogUGVyLXN0YWdlIGJ1aWxkLWhlYWx0aCBtZXRyaWNzIGZvciBvbmUgcGlwZWxpbmUgb3ZlciBhIHdpbmRvdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRIZWFsdGhTdGFnZSB7XG4gIHN0YWdlOiBzdHJpbmc7XG4gIC8qKiBUZXJtaW5hbCBzdGFnZSBydW5zIChzdWNjZWVkZWQgKyBmYWlsZWQpIGluIHRoZSB3aW5kb3cuICovXG4gIHJ1bnM6IG51bWJlcjtcbiAgc3VjY2Vzc2VzOiBudW1iZXI7XG4gIGZhaWx1cmVzOiBudW1iZXI7XG4gIC8qKiBzdWNjZXNzZXMgLyBydW5zIGFzIGEgcGVyY2VudCAoMCB3aGVuIHJ1bnMgaXMgMCkuICovXG4gIHN1Y2Nlc3NSYXRlOiBudW1iZXI7XG4gIC8qKiBEdXJhdGlvbiBwZXJjZW50aWxlcyBvdmVyIHRoZSBzdGFnZSdzIHRlcm1pbmFsIHJ1bnM7IG51bGwgd2hlbiBubyBkdXJhdGlvbnMuICovXG4gIHA1ME1zOiBudW1iZXIgfCBudWxsO1xuICBwOTBNczogbnVtYmVyIHwgbnVsbDtcbiAgcDk5TXM6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICogUGVyLXBpcGVsaW5lIGJ1aWxkLWhlYWx0aCBicmVha2Rvd24uIFN0YW5kYXJkIHJlcG9ydGluZyAoTk9UXG4gKiBgYWR2YW5jZWRfcmVwb3J0aW5nYC1nYXRlZCkg4oCUIHBlci1zdGFnZSBzdWNjZXNzIHJhdGUgKyB0aW1pbmcgcGVyY2VudGlsZXMsIHdpdGhcbiAqIHRvdGFscyBzdW1tZWQgYWNyb3NzIHN0YWdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEhlYWx0aCB7XG4gIHN0YWdlczogQnVpbGRIZWFsdGhTdGFnZVtdO1xuICB0b3RhbHM6IHsgcnVuczogbnVtYmVyOyBmYWlsdXJlczogbnVtYmVyOyBmYWlsdXJlUmF0ZTogbnVtYmVyIH07XG59XG5cbi8qKiBQb3N0LWRlcGxveSBpbmNpZGVudCBtYXJrZXIgYWNjZXB0ZWQgYnkgYFJlcG9ydGluZ1NlcnZpY2UucmVjb3JkSW5jaWRlbnRgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNpZGVudElucHV0IHtcbiAgaW5jaWRlbnRJZDogc3RyaW5nO1xuICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICBvcGVuZWRBdDogc3RyaW5nO1xuICByZXNvbHZlZEF0Pzogc3RyaW5nO1xuICBzZXZlcml0eTogc3RyaW5nO1xufVxuXG4vKiogRXZlbnQgcGF5bG9hZCBhY2NlcHRlZCBieSBgUmVwb3J0aW5nU2VydmljZS5pbmdlc3RFdmVudHNgLiBNaXJyb3JzIHRoZSByb3V0ZSdzIFpvZCBzaGFwZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0RXZlbnQge1xuICAvKiogU3RhYmxlIHBpcGVsaW5lIGlkIHRoZSBldmVudHMgTGFtYmRhIHJlYWQgZnJvbSB0aGUgYHBiLnBpcGVsaW5lLWlkYFxuICAgKiAgdGFnICg9IHRoZSBwbGF0Zm9ybSBwaXBlbGluZUlkKS4gVGhlIHJlZ2lzdHJ5IGpvaW4ga2V5LiAqL1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB8ICdjb2RlYnVpbGQnIHwgJ3BsdWdpbi1idWlsZCc7XG4gIGV2ZW50VHlwZTogJ1BJUEVMSU5FJyB8ICdTVEFHRScgfCAnQUNUSU9OJyB8ICdCVUlMRCc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBleGVjdXRpb25JZD86IHN0cmluZztcbiAgc3RhZ2VOYW1lPzogc3RyaW5nO1xuICBhY3Rpb25OYW1lPzogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZmFpbHVyZSByZWFzb24gKEFjdGlvbiBldmVudHMpLiAqL1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcbiAgY29tcGxldGVkQXQ/OiBzdHJpbmc7XG4gIGR1cmF0aW9uTXM/OiBudW1iZXI7XG4gIC8qKiBTb3VyY2UgY29tbWl0IGlkIG9mIHRoZSBjaGFuZ2UgYmVpbmcgc2hpcHBlZCAoRE9SQSBkZXBsb3kgYXR0cmlidXRpb24pLiAqL1xuICBjb21taXRTaGE/OiBzdHJpbmc7XG4gIC8qKiBTb3VyY2UgcmVmL2JyYW5jaCAoRE9SQSBkZXBsb3kgYXR0cmlidXRpb24pLiAqL1xuICBjb21taXRSZWY/OiBzdHJpbmc7XG4gIC8qKiBEZXBsb3kgdGFyZ2V0IChlLmcuIFwicHJvZHVjdGlvblwiKS4gSXRzIHByZXNlbmNlIG9uIGEgU1RBR0UvQUNUSU9OIGV2ZW50XG4gICAqICBtYXJrcyBhIHJlYWwgZGVwbG95bWVudCAoZGVyaXZlZCBzZXJ2ZXItc2lkZSDigJQgdGhlcmUgaXMgbm8gYGlzRGVwbG95YCkuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAvKiogT2xkZXN0IHVuc2hpcHBlZCBjb21taXQgdGltZXN0YW1wIChJU08gODYwMSkgZm9yIG1lYXN1cmVkIGxlYWQgdGltZS4gKi9cbiAgY29tbWl0VGltZXN0YW1wPzogc3RyaW5nO1xuICAvKiogTnVtYmVyIG9mIGNvbW1pdHMgc2hpcHBlZCBpbiB0aGlzIGNoYW5nZSAo4omlMSkuICovXG4gIGNvbW1pdENvdW50PzogbnVtYmVyO1xuICBkZXRhaWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBQZXItZXZlbnQgbWV0cmljIGRlc2NyaXB0b3IgZW1pdHRlZCAodmlhIHRoZSB7QGxpbmsgUmVwb3J0aW5nU2VydmljZS5pbmdlc3RFdmVudHN9XG4gKiBgb25NZXRyaWNgIGhvb2spIGZvciBlYWNoIFJFR0lTVEVSRUQgdGVybWluYWwgZGVwbG95L3N0YWdlIGV2ZW50LCBzbyB0aGUgcm91dGVcbiAqIGxheWVyIGNhbiBmYW4gdGhlbSBpbnRvIFByb21ldGhldXMgY291bnRlcnMgd2l0aG91dCBwaXBlbGluZS1kYXRhIGltcG9ydGluZ1xuICogYXBpLXNlcnZlcidzIG1ldHJpY3MgcmVnaXN0cnkuIGByZXN1bHRgIGlzIHRoZSB0ZXJtaW5hbCBvdXRjb21lOyBgZW52aXJvbm1lbnRgXG4gKiBpcyBub24tbnVsbCBvbmx5IGZvciBhIGRlcGxveS1zdGFnZSBldmVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RNZXRyaWMge1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHN0YWdlOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmcgfCBudWxsO1xuICByZXN1bHQ6ICdzdWNjZWVkZWQnIHwgJ2ZhaWxlZCc7XG59XG5cbi8qKiBDb3VudHMgKyB0aGUgKHBvc3NpYmx5IHRydW5jYXRlZCkgbGlzdCBvZiB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIHRoZSBjYWxsZXIgY2FuIGxvZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0UmVzdWx0IHtcbiAgaW5zZXJ0ZWQ6IG51bWJlcjtcbiAgc2tpcHBlZDogbnVtYmVyO1xuICB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBFdmVyeSBvcmcgd2l0aCBhdCBsZWFzdCBvbmUgcm93IGluIHRoaXMgYmF0Y2gsIGRlZHVwZWQuXG4gICAqXG4gICAqIEFscmVhZHkgY29tcHV0ZWQgZm9yIHBvc3QtY29tbWl0IGNhY2hlIGludmFsaWRhdGlvbjsgc3VyZmFjZWQgYmVjYXVzZSB0aGVcbiAgICogaW5nZXN0IHJvdXRlIG5lZWRzIHRoZSBzYW1lIHNldCB0byBwdXNoIGl0cyBsaXZlIFNTRSBmcmFtZS4gVGhlIHN0YWdlLW1ldHJpY1xuICAgKiBob29rIGNhbid0IGRyaXZlIHRoYXQgZmFuLW91dDogaXQgb25seSBmaXJlcyBmb3IgU1RBR0UgZXZlbnRzLCBzbyBhIGJhdGNoIG9mXG4gICAqIFBJUEVMSU5FIG9yIEJVSUxEIGV2ZW50cyB3b3VsZCBsYW5kIHJvd3MgYW5kIHB1c2ggbm8gZnJhbWUgYXQgYWxsLlxuICAgKi9cbiAgYWZmZWN0ZWRPcmdzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEV2ZW50cyBkcm9wcGVkIGJlY2F1c2UgdGhlIHBpcGVsaW5lIHRoZXkgbmFtZSBiZWxvbmdzIHRvIGFuIG9yZyB0aGUgY2FsbGVyXG4gICAqIG1heSBub3Qgd3JpdGUgZm9yLiBTdXJmYWNlZCBzbyB0aGUgcm91dGUgY2FuIGxvZyBhbmQgY291bnQgdGhlbTogYSBub24temVyb1xuICAgKiB2YWx1ZSBpcyBlaXRoZXIgYSBtaXNyb3V0ZWQgcHJvZHVjZXIgb3IgYW4gYXR0ZW1wdCB0byBpbmplY3QgZXZlbnRzIGludG9cbiAgICogYW5vdGhlciB0ZW5hbnQncyByZXBvcnRzLCBhbmQgYm90aCBuZWVkIHRvIGJlIHZpc2libGUuXG4gICAqL1xuICBkcm9wcGVkRm9yZWlnbk9yZzogbnVtYmVyO1xuICAvKipcbiAgICogRXZlbnRzIGRyb3BwZWQgYmVjYXVzZSB0aGVpciB0aW1lc3RhbXBzIGFyZSBpbXBvc3NpYmxlIOKAlCBkYXRlZCBpbiB0aGUgZnV0dXJlLFxuICAgKiBvciBjb21wbGV0aW5nIGJlZm9yZSB0aGV5IHN0YXJ0ZWQuIFJlamVjdGVkIGhlcmUgcmF0aGVyIHRoYW4gY2xhbXBlZCBsYXRlcjpcbiAgICogYSBkZXBsb3kgd2hvc2UgZHVyYXRpb24gb3IgbGVhZCB0aW1lIGlzIG5lZ2F0aXZlIHNpbGVudGx5IHNrZXdzIGRlcGxveW1lbnRcbiAgICogZnJlcXVlbmN5LCBjaGFuZ2UtZmFpbHVyZSByYXRlIGFuZCBsZWFkIHRpbWUgZm9yIHRoZSB3aG9sZSBvcmcsIGFuZCBhIGNsYW1wXG4gICAqIHRvIDAgbWFrZXMgYSBiYWQgY2xvY2sgbG9vayBsaWtlIGFuIGluc3RhbnQgZGVwbG95LlxuICAgKi9cbiAgZHJvcHBlZEludmFsaWRUaW1lOiBudW1iZXI7XG59XG5cbi8qKlxuICogV2hvIGlzIHdyaXRpbmcsIGZvciB0aGUgaW5nZXN0IHRlbmFuY3kgY2hlY2suXG4gKlxuICogYC9yZXBvcnRzL2V2ZW50c2AgcmVzb2x2ZXMgYW4gZXZlbnQncyBvcmcgZnJvbSB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIHNvXG4gKiB3aXRob3V0IHRoaXMgYSB0b2tlbiBob2xkaW5nIGByZXBvcnRpbmc6aW5nZXN0YCBjb3VsZCBwb3N0IGV2ZW50cyBmb3IgQU5ZXG4gKiBwaXBlbGluZSBpZCBhbmQgaGF2ZSB0aGVtIGF0dHJpYnV0ZWQgdG8gdGhhdCBwaXBlbGluZSdzIG9yZyDigJQgb25lIG9yZ1xuICogaW5qZWN0aW5nIHJvd3MgaW50byBhbm90aGVyJ3MgcmVwb3J0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RDYWxsZXIge1xuICAvKipcbiAgICogT3JnIGlkcyB0aGlzIGNhbGxlciBtYXkgd3JpdGUgZXZlbnRzIGZvcjogaXRzIG93biwgcGx1cyBkZXNjZW5kYW50IHRlYW1zLlxuICAgKiBSZXNvbHZlZCBieSB0aGUgcm91dGUuIEFuIGV2ZW50IHdob3NlIHBpcGVsaW5lIGJlbG9uZ3MgdG8gYW55dGhpbmcgZWxzZSBpc1xuICAgKiBkcm9wcGVkLlxuICAgKi9cbiAgYWxsb3dlZE9yZ0lkczogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBBIHZlcmlmaWVkIElOVEVSTkFMIHNlcnZpY2UgcHJpbmNpcGFsICh0aGUgcGx1Z2luIHNlcnZpY2UgcG9zdHMgcGx1Z2luLWJ1aWxkXG4gICAqIGV2ZW50cyBmb3IgZXZlcnkgdGVuYW50KS4gU3VjaCBjYWxsZXJzIGFyZSBleGVtcHQ6IHRoZXkgaG9sZCBhIHNpZ25lZFxuICAgKiBzZXJ2aWNlIGtleSBubyBleHRlcm5hbCBjbGllbnQgY2FuIG1pbnQsIGFuZCB0aGV5IGxlZ2l0aW1hdGVseSB3cml0ZVxuICAgKiBjcm9zcy10ZW5hbnQuIE5ldmVyIHNldCB0aGlzIGZyb20gYW55dGhpbmcgYSByZXF1ZXN0IGJvZHkgY2FuIGluZmx1ZW5jZS5cbiAgICovXG4gIGNyb3NzVGVuYW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPbmUgb3JnJ3MgaW5nZXN0aW9uLWhlYWx0aCByb3cgYXMgUkVBRCBiYWNrIGJ5IHRoZSBSZXBvcnRzIFVJLiBUaGVcbiAqIEFXUyBldmVudHMgTGFtYmRhIHdyaXRlcyBpdDsgdGhpcyBpcyB0aGUgc2hhcGUgdGhhdCBsZXRzIHRoZSBVSSB0ZWxsXG4gKiBcImluZ2VzdGlvbiBpcyBoZWFsdGh5LCB0aGVyZSB3ZXJlIHNpbXBseSBubyBkZXBsb3lzIGluIHRoZSByYW5nZVwiIGFwYXJ0IGZyb21cbiAqIFwid2UgaGF2ZW4ndCBoZWFyZCBmcm9tIHRoZSBpbmdlc3QgcGlwZWxpbmUgc2luY2UgWFwiLlxuICpcbiAqIGBudWxsYCBmcm9tIHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLmdldEluZ2VzdEhlYWx0aH0gbWVhbnMgdGhlIGRlcGxveW1lbnQgaGFzXG4gKiBORVZFUiByZXBvcnRlZCDigJQgbm90IFwic3RhbGVcIi4gVGhlIHR3byBtdXN0IG5vdCBiZSBjb25mbGF0ZWQ6IGEgZnJlc2ggaW5zdGFsbFxuICogKG9yIG9uZSB3aG9zZSBmb3J3YXJkZXIgd2FzIG5ldmVyIHdpcmVkIHVwKSBoYXMgbm8gaGVhcnRiZWF0IGF0IGFsbCwgYW5kXG4gKiBjYWxsaW5nIHRoYXQgXCJzdGFsZVwiIHdvdWxkIGludmVudCBhIHJlZ3Jlc3Npb24gdGhhdCBuZXZlciBoYXBwZW5lZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RIZWFsdGhTdGF0dXMge1xuICAvKiogV2hlbiB0aGUgZm9yd2FyZGVyIGxhc3QgcG9zdGVkIGEgaGVhcnRiZWF0IChpdHMgb3duIGNsb2NrLCBJU08gODYwMSkuICovXG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xuICAvKiogVGltZXN0YW1wIG9mIHRoZSBuZXdlc3QgZXZlbnQgaXQgaGFkIGZvcndhcmRlZCwgb3IgbnVsbCBpZiBpdCBoYXMgc2VlbiBub25lLiAqL1xuICBsYXN0RXZlbnRBdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEN1bXVsYXRpdmUgZXZlbnRzIGZvcndhcmRlZCwgb3IgbnVsbCB3aGVuIHRoZSBmb3J3YXJkZXIgZG9lc24ndCByZXBvcnQgaXQuICovXG4gIGZvcndhcmRlZDogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIEN1bXVsYXRpdmUgZXZlbnRzIERST1BQRUQgKG5vbi16ZXJvIOKHkiBkYXRhIGxvc3MgdXBzdHJlYW0gb2YgdGhlIHJlcG9ydHMpLiAqL1xuICBkcm9wcGVkOiBudW1iZXIgfCBudWxsO1xufVxuXG5cbi8qKlxuICogUmVhZC1vbmx5IHJlcG9ydGluZyBzZXJ2aWNlIGZvciBwaXBlbGluZSBleGVjdXRpb24gYW5kIHBsdWdpbiBpbnZlbnRvcnkgYWdncmVnYXRpb25zLlxuICogRG9lcyBub3QgZXh0ZW5kIENydWRTZXJ2aWNlIOKAlCByZXBvcnRzIGFyZSBhZ2dyZWdhdGUgcXVlcmllcywgbm90IGVudGl0eSBDUlVELlxuICpcbiAqIEFsbCBxdWVyaWVzIGFyZSBjYWNoZWQgaW4tbWVtb3J5IHRvIGF2b2lkIHJlcGVhdGVkIGV4cGVuc2l2ZSBTUUwgYWdncmVnYXRpb25zOlxuICogLSBJbnZlbnRvcnkgcXVlcmllcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKTogNSBtaW4gVFRMXG4gKiAtIFRpbWVzZXJpZXMgcXVlcmllcyAoZXhlY3V0aW9uL2J1aWxkIG1ldHJpY3Mgd2l0aCBkYXRlIHJhbmdlcyk6IDIgbWluIFRUTFxuICovXG5cbi8qKlxuICogSW50ZXJuYWwgcm93IHNoYXBlcyBmb3IgdGhlIERPUkEgcXVlcmllcy4gRXhwb3J0ZWQgYmVjYXVzZSAuL2RvcmEudHMgY29uc3VtZXNcbiAqIHRoZW07IG5vdCBwYXJ0IG9mIHRoZSBwYWNrYWdlJ3MgcHVibGljIHN1cmZhY2UgKHJlcG9ydGluZy1zZXJ2aWNlLnRzXG4gKiByZS1leHBvcnRzIHRoaXMgbW9kdWxlIHdob2xlc2FsZSwgd2hpY2ggaXMgYSBkZWxpYmVyYXRlIHNpbXBsaWZpY2F0aW9uIOKAlCB0aGVzZVxuICogZGVzY3JpYmUgcXVlcnkgcmVzdWx0cywgbm90IEFQSSBjb250cmFjdHMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVJvdyB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIHN0YXR1czogJ1NVQ0NFRURFRCcgfCAnRkFJTEVEJyB8IHN0cmluZztcbiAgLyoqIERlcGxveSBleGVjdXRpb24gaWQg4oCUIHRoZSBhdHRyaWJ1dGlvbiBrZXkgZm9yIGRlZHVwIGFnYWluc3Qgb3V0Y29tZXMvaW5jaWRlbnRzLiAqL1xuICBleGVjdXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gIGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgY29tbWl0X3RzOiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZGVwbG95IGNvbXBsZXRlZCBpbnNpZGUgW2Zyb20sdG9dLiBBYnNlbnQgKHVuZGVmaW5lZCkgaW4gdW5pdFxuICAgKiBmaXh0dXJlcyDih5IgdHJlYXRlZCBhcyBpbi13aW5kb3cuIGB0YC9gZmAgdG9sZXJhdGVkIChwZyBib29sZWFuIHRleHQgZm9ybSkuXG4gICAqL1xuICBpbl93aW5kb3c/OiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFJhdyBwb3N0LWRlcGxveSBvdXRjb21lIG1hcmtlciByb3cgKGZyb20gYGRlcGxveW1lbnRfb3V0Y29tZXNgLCBpbi13aW5kb3cpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdXRjb21lUm93IHtcbiAgZW52aXJvbm1lbnQ6IHN0cmluZyB8IG51bGw7XG4gIG91dGNvbWU6ICdmYWlsZWQnIHwgJ3Jlc3RvcmVkJyB8IHN0cmluZztcbiAgLyoqIEV4ZWN1dGlvbiB0aGUgdXNlciBtYXJrZWQg4oCUIGRlZHVwIGtleSBhZ2FpbnN0IGluY2lkZW50LWNvcnJlbGF0ZWQgZGVwbG95cy4gKi9cbiAgZXhlY3V0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogUHJvZHVjdGlvbiByZXN0b3JlZC1pbmNpZGVudCBwYWlyOiByZWNvdmVyeSB0aW1lICsgdGhlIGRlcGxveSdzIGNvbXBsZXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIE10dHJQYWlyUm93IHtcbiAgcmVzdG9yZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gIGRlcGxveWVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAvKiogRXhlY3V0aW9uIGlkIOKAlCBsZXRzIGluY2lkZW50IHByZWNlZGVuY2Ugb3ZlcnJpZGUgdGhlIG1hbnVhbCBvdXRjb21lIHBlciBkZXBsb3kuICovXG4gIGV4ZWN1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSYXcgaW5jaWRlbnQgcm93IChmcm9tIGBpbmNpZGVudHNgLCBvcGVuZWQgaW4td2luZG93KS4gQ29ycmVsYXRlZCBpbiBKUyB0byB0aGVcbiAqIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgZGVwbG95IHRvIGBlbnZpcm9ubWVudGAgd2l0aGluIERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTXG4gKiDihpIgYW4gYXV0b21hdGVkIHBvc3QtZGVwbG95IGZhaWx1cmUgKENGUikgKyByZWFsIHJlY292ZXJ5IHRpbWUgKE1UVFIpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50Um93IHtcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgb3BlbmVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICByZXNvbHZlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIENvdmVyYWdlIGNvdW50czogcmVnaXN0ZXJlZCBwaXBlbGluZXMgdnMgdGhvc2UgdGhhdCBhY3R1YWxseSBkZXBsb3llZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ292ZXJhZ2VSb3cge1xuICByZWdpc3RlcmVkOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBkZXBsb3lpbmc6IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG59XG4iXX0=
@@ -1,5 +1,8 @@
1
- import type { ExecutionCount, TimeSeriesEntry, DurationStats, PipelineExecution, StageFailure, StageBottleneck, ActionFailure, ErrorEntry, PluginSummary, TypeComputeDistribution, VersionCount, BuildTimeSeriesEntry, BuildDuration, BuildFailure, PluginRuntimeAggregate, PluginRuntimeFilter, PluginRuntimeStats, ReportingRetentionOptions, ReportingRetentionCounts, DoraOptions, ReportingSettings, ReportingSettingsPatch, IncidentListItem, IncidentTestResult, DoraMetrics, DoraTrendPoint, BuildHealth, IncidentInput, IngestEvent, IngestMetric, IngestResult, IngestHealthStatus } from './reporting/types.js';
2
- export type { BuildHealth, BuildHealthStage, DoraEnvMetrics, DoraLevel, DoraMetrics, DoraOptions, DoraTrendPoint, IncidentInput, IncidentListItem, ReportingSettings, IncidentTestResult, IngestEvent, IngestHealthStatus, IngestMetric, IngestResult, PluginRuntimeAggregate, PluginRuntimeFilter, PluginRuntimeStats, ReportingRetentionCounts, ReportingRetentionOptions, ReportingRetentionSettings, ReportingSettingsPatch, } from './reporting/types.js';
1
+ import { type AnalyticsScope } from './reporting/analytics-queries.js';
2
+ import type { LastDeployedCommit } from './reporting/last-deploy.js';
3
+ import type { ExecutionCount, TimeSeriesEntry, DurationStats, PipelineExecution, StageFailure, StageBottleneck, ActionFailure, ErrorEntry, PluginSummary, TypeComputeDistribution, VersionCount, BuildTimeSeriesEntry, BuildDuration, BuildFailure, PluginRuntimeAggregate, PluginRuntimeFilter, PluginRuntimeStats, ReportingRetentionOptions, ReportingRetentionCounts, DoraOptions, ReportingSettings, ReportingSettingsPatch, IncidentListItem, IncidentTestResult, DoraMetrics, DoraTrendPoint, BuildHealth, IncidentInput, IngestCaller, IngestEvent, IngestMetric, IngestResult, IngestHealthStatus, BucketOptions } from './reporting/types.js';
4
+ export type { LastDeployedCommit } from './reporting/last-deploy.js';
5
+ export type { BucketOptions, BuildHealth, BuildHealthStage, DoraEnvMetrics, DoraLevel, DoraMetrics, DoraOptions, DoraTrendPoint, IncidentInput, IncidentListItem, ReportingSettings, IncidentTestResult, IngestCaller, IngestEvent, IngestHealthStatus, IngestMetric, IngestResult, PluginRuntimeAggregate, PluginRuntimeFilter, PluginRuntimeStats, ReportingRetentionCounts, ReportingRetentionOptions, ReportingRetentionSettings, ReportingSettingsPatch, } from './reporting/types.js';
3
6
  export declare class ReportingService {
4
7
  #private;
5
8
  /** Invalidate all cached reports for an org (call after event ingest). */
@@ -10,7 +13,14 @@ export declare class ReportingService {
10
13
  * See ./reporting/ingest.ts — the caller must already hold a sysadmin
11
14
  * tenant scope, because a batch spans whatever orgs the registry resolves to.
12
15
  */
13
- ingestEvents(events: IngestEvent[], onMetric?: (m: IngestMetric) => void): Promise<IngestResult>;
16
+ ingestEvents(events: IngestEvent[], onMetric?: (m: IngestMetric) => void, caller?: IngestCaller): Promise<IngestResult>;
17
+ /**
18
+ * The commit sha of this pipeline's last successful deploy — to `environment`
19
+ * when given, to anywhere otherwise. The exclusive lower bound for "commits
20
+ * since the last deploy". Tenancy is enforced from `caller` exactly as
21
+ * {@link ingestEvents} does it.
22
+ */
23
+ getLastDeployedCommit(pipelineId: string, environment?: string, caller?: IngestCaller): Promise<LastDeployedCommit>;
14
24
  /** Execution count per pipeline with status breakdown. */
15
25
  getExecutionCount(orgId: string, orgIds?: string[], range?: {
16
26
  from?: string;
@@ -37,7 +47,7 @@ export declare class ReportingService {
37
47
  to?: string;
38
48
  }, limit?: number): Promise<PipelineExecution[]>;
39
49
  /** Success rate over time for an org. */
40
- getSuccessRate(orgId: string, interval: string, from: string, to: string, orgIds?: string[]): Promise<TimeSeriesEntry[]>;
50
+ getSuccessRate(orgId: string, interval: string, from: string, to: string, orgIds?: string[], bucket?: BucketOptions): Promise<TimeSeriesEntry[]>;
41
51
  /** Average duration per pipeline. */
42
52
  getAverageDuration(orgId: string, from: string, to: string, orgIds?: string[]): Promise<DurationStats[]>;
43
53
  /** Stage failure heatmap — which stages fail most. */
@@ -91,7 +101,7 @@ export declare class ReportingService {
91
101
  * SHOULD enum these per-eventSource so we catch drift at ingest rather
92
102
  * than silently producing zero rows here. See findings N71.
93
103
  */
94
- getBuildSuccessRate(orgId: string, interval: string, from: string, to: string, orgIds?: string[]): Promise<BuildTimeSeriesEntry[]>;
104
+ getBuildSuccessRate(orgId: string, interval: string, from: string, to: string, orgIds?: string[], bucket?: BucketOptions): Promise<BuildTimeSeriesEntry[]>;
95
105
  /** Build duration per plugin. Build activity report — rollup-aware. */
96
106
  getBuildDuration(orgId: string, from: string, to: string, orgIds?: string[]): Promise<BuildDuration[]>;
97
107
  /** Build failures — top error messages. Build activity report — rollup-aware. */
@@ -191,5 +201,84 @@ export declare class ReportingService {
191
201
  * it establishes its own sysadmin scope. See ./reporting/retention-sweep.ts.
192
202
  */
193
203
  purgeExpiredReportingData(opts?: ReportingRetentionOptions): Promise<ReportingRetentionCounts>;
204
+ /** Per-pipeline delivery, worst first. */
205
+ getPipelineBreakdown(scope: AnalyticsScope, limit?: number): Promise<import("./reporting/analytics-queries.js").PipelineBreakdownRow[]>;
206
+ /** Failures by category, with the previous period's counts for the trend. */
207
+ getFailureAnalysis(scope: AnalyticsScope, previous?: {
208
+ from: string;
209
+ to: string;
210
+ }): Promise<{
211
+ categories: import("./reporting/analytics-queries.js").FailureCategoryRow[];
212
+ total: number;
213
+ actionableTotal: number;
214
+ }>;
215
+ /** Per-stage timings for one pipeline, slowest first. */
216
+ getStagePerformance(scope: AnalyticsScope, pipelineId: string, previous?: {
217
+ from: string;
218
+ to: string;
219
+ }): Promise<import("./reporting/analytics-queries.js").StagePerformanceRow[]>;
220
+ /** Build time by project and pipeline. Seconds, never money. */
221
+ getResourceConsumption(scope: AnalyticsScope, limit?: number): Promise<{
222
+ pipelines: import("./reporting/analytics-queries.js").ResourceRow[];
223
+ totalBuildSeconds: number;
224
+ }>;
225
+ /** Each commit's path across environments, and which ones stopped short. */
226
+ getPromotionView(scope: AnalyticsScope, productionEnv?: string, limit?: number): Promise<{
227
+ commits: import("./reporting/analytics-queries.js").PromotionRow[];
228
+ stuckCount: number;
229
+ }>;
230
+ /** Pipelines behind on a plugin, worst gap first (the DECLARED side). */
231
+ getOutdatedPlugins(scope: AnalyticsScope, limit?: number): Promise<{
232
+ rows: import("./reporting/analytics-queries.js").OutdatedPluginRow[];
233
+ behindPipelines: number;
234
+ majorBehind: number;
235
+ }>;
236
+ /** Open plugin vulnerabilities per pipeline (says declared vs deployed). */
237
+ getPluginVulnerabilities(scope: AnalyticsScope, limit?: number): Promise<{
238
+ rows: import("./reporting/analytics-queries.js").VulnerabilityRow[];
239
+ exposedPipelines: number;
240
+ criticalPipelines: number;
241
+ }>;
242
+ /** Adoption, creation source, and the deploy-tracking coverage denominator. */
243
+ getAdoption(scope: AnalyticsScope, timeSavedMinutes?: number | null): Promise<import("./reporting/analytics-queries.js").AdoptionSummary>;
244
+ /**
245
+ * The needs-attention findings for the period.
246
+ *
247
+ * Assembled HERE rather than in the section, because the rules need six reads that
248
+ * must all describe the same window: this period's breakdown, the previous one's,
249
+ * failure streaks, config-change times, pipelines with an open Critical, and
250
+ * pipelines DORA cannot see. A section that fetched them itself would be the only
251
+ * place in the report where the window could drift between panels.
252
+ *
253
+ * Every input except the current breakdown is OPTIONAL to the evaluator, and each
254
+ * one's failure is absorbed: a rule with no data to run on is skipped, which is
255
+ * why one unavailable read costs one finding rather than the whole section. The
256
+ * alternative — a section that fails because the streak query timed out — replaces
257
+ * six findings with none.
258
+ */
259
+ getNeedsAttention(scope: AnalyticsScope, previous?: {
260
+ from: string;
261
+ to: string;
262
+ }): Promise<{
263
+ items: import("./reporting/needs-attention.js").AttentionItem[];
264
+ thresholds: import("./reporting/needs-attention.js").NeedsAttentionThresholds;
265
+ pipelinesEvaluated: number;
266
+ }>;
267
+ /**
268
+ * The org's stored needs-attention thresholds, or `{}`.
269
+ *
270
+ * Returned as a partial on purpose: `thresholdsFrom` fills the rest per field, so
271
+ * an org that configured one number keeps the defaults for the others instead of
272
+ * silently disabling four rules by setting one.
273
+ */
274
+ private attentionThresholds;
275
+ /**
276
+ * The org's own minutes-saved-per-pipeline assumption, or null.
277
+ *
278
+ * Read here so the adoption section cannot accidentally be handed a
279
+ * platform-chosen default: the number only means something when the customer
280
+ * picked it, and `null` renders as "not estimated" rather than as zero.
281
+ */
282
+ private timeSavedAssumption;
194
283
  }
195
284
  export declare const reportingService: ReportingService;