bways-report 0.1.8 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +463 -316
- package/esm2022/lib/core/config/bways-report-config.mjs +31 -32
- package/esm2022/lib/core/models/index.mjs +1 -1
- package/esm2022/lib/core/models/report-api-endpoint.model.mjs +8 -0
- package/esm2022/lib/core/models/report-component.model.mjs +1 -1
- package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
- package/esm2022/lib/core/services/index.mjs +2 -1
- package/esm2022/lib/core/services/report-api-execution.service.mjs +210 -0
- package/esm2022/lib/core/services/report-data-discovery.service.mjs +76 -4
- package/esm2022/lib/core/services/report-session-context.service.mjs +72 -3
- package/esm2022/lib/core/tokens/designer-config.token.mjs +4 -0
- package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
- package/esm2022/lib/core/utils/report-endpoint.util.mjs +22 -0
- package/esm2022/lib/core/utils/report-request-scope.mjs +48 -0
- package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +31 -1
- package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +27 -2
- package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +5 -2
- package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +30 -14
- package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +32 -28
- package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +1 -1
- package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +4 -37
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +28 -51
- package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +43 -194
- package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +17 -65
- package/esm2022/lib/data-access/adapters/index.mjs +1 -1
- package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +13 -4
- package/esm2022/lib/data-access/adapters/report-id-availability.mjs +20 -0
- package/esm2022/lib/data-access/adapters/session-headers.mjs +11 -0
- package/esm2022/lib/data-access/contracts/index.mjs +1 -1
- package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
- package/esm2022/lib/data-access/contracts/report-persistence.contract.mjs +13 -1
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +536 -6
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +55 -17
- package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +546 -119
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +142 -8
- package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +129 -28
- package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +27 -13
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +54 -32
- package/esm2022/lib/features/designer/designer.component.mjs +109 -75
- package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +10 -4
- package/esm2022/lib/features/designer/services/designer-config.service.mjs +56 -0
- package/esm2022/lib/features/designer/services/designer-endpoints.service.mjs +155 -0
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +3 -2
- package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +2 -1
- package/esm2022/lib/features/embed/bways-report-builder.component.mjs +3 -3
- package/esm2022/lib/features/export/services/report-export.service.mjs +11 -6
- package/esm2022/lib/features/persistence/services/report-store.service.mjs +78 -23
- package/esm2022/lib/features/persistence/services/schema-validator.service.mjs +59 -3
- package/esm2022/lib/features/routing/components/routed-report-designer.component.mjs +12 -17
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +6 -4
- package/esm2022/lib/features/routing/report-routes.mjs +6 -6
- package/esm2022/lib/features/routing/resolvers/report-route-identifier.mjs +5 -0
- package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +3 -2
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +23 -4
- package/esm2022/lib/features/runtime/report-execution.service.mjs +36 -6
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +54 -11
- package/esm2022/lib/features/runtime/report-runtime.component.mjs +105 -68
- package/esm2022/lib/features/runtime/rpt-report.component.mjs +50 -42
- package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +7 -2
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +16 -7
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +53 -1
- package/esm2022/lib/primitives/components/index.mjs +2 -1
- package/esm2022/lib/primitives/components/radio/rpt-radio.component.mjs +428 -0
- package/esm2022/lib/primitives/register-builtins.mjs +51 -2
- package/esm2022/lib/provide-reporting.mjs +11 -29
- package/fesm2022/bways-report.mjs +3745 -1281
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/config/bways-report-config.d.ts +27 -5
- package/lib/core/models/index.d.ts +2 -1
- package/lib/core/models/report-api-endpoint.model.d.ts +30 -0
- package/lib/core/models/report-component.model.d.ts +16 -4
- package/lib/core/models/report-datasource.model.d.ts +21 -2
- package/lib/core/services/index.d.ts +1 -0
- package/lib/core/services/report-api-execution.service.d.ts +41 -0
- package/lib/core/services/report-data-discovery.service.d.ts +23 -1
- package/lib/core/services/report-session-context.service.d.ts +9 -0
- package/lib/core/tokens/designer-config.token.d.ts +4 -0
- package/lib/core/tokens/reporting-config.token.d.ts +4 -0
- package/lib/core/utils/report-endpoint.util.d.ts +12 -0
- package/lib/core/utils/report-request-scope.d.ts +14 -0
- package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +2 -0
- package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +1 -0
- package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +6 -2
- package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +4 -2
- package/lib/data-access/adapters/endpoint-tokens.d.ts +7 -0
- package/lib/data-access/adapters/http-datasource.adapter.d.ts +1 -3
- package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -4
- package/lib/data-access/adapters/http-persistence.adapter.d.ts +11 -16
- package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +3 -5
- package/lib/data-access/adapters/index.d.ts +1 -1
- package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +2 -2
- package/lib/data-access/adapters/report-id-availability.d.ts +6 -0
- package/lib/data-access/adapters/session-headers.d.ts +3 -0
- package/lib/data-access/contracts/index.d.ts +1 -0
- package/lib/data-access/contracts/lookup.contract.d.ts +3 -0
- package/lib/data-access/contracts/report-persistence.contract.d.ts +16 -1
- package/lib/features/designer/components/component-palette/component-palette.component.d.ts +16 -0
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +2 -0
- package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +37 -5
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +21 -3
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +20 -7
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +2 -1
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +7 -1
- package/lib/features/designer/designer.component.d.ts +16 -2
- package/lib/features/designer/rpt-report-designer.component.d.ts +5 -1
- package/lib/features/designer/services/designer-config.service.d.ts +13 -0
- package/lib/features/designer/services/designer-endpoints.service.d.ts +25 -0
- package/lib/features/persistence/services/report-store.service.d.ts +15 -1
- package/lib/features/persistence/services/schema-validator.service.d.ts +2 -0
- package/lib/features/routing/resolvers/report-route-identifier.d.ts +2 -0
- package/lib/features/runtime/report-execution.service.d.ts +4 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +4 -1
- package/lib/features/runtime/report-runtime.component.d.ts +14 -1
- package/lib/features/runtime/rpt-report.component.d.ts +5 -0
- package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +3 -1
- package/lib/primitives/components/index.d.ts +2 -0
- package/lib/primitives/components/radio/rpt-radio.component.d.ts +77 -0
- package/package.json +2 -1
|
@@ -88,6 +88,8 @@ export class RptDropdownComponent {
|
|
|
88
88
|
return !!(ds &&
|
|
89
89
|
(ds.sourceType === 'table' ||
|
|
90
90
|
ds.sourceType === 'procedure' ||
|
|
91
|
+
ds.sourceType === 'api' ||
|
|
92
|
+
ds.apiEndpoint ||
|
|
91
93
|
ds.entityName ||
|
|
92
94
|
ds.masterName));
|
|
93
95
|
});
|
|
@@ -187,7 +189,9 @@ export class RptDropdownComponent {
|
|
|
187
189
|
statusText = computed(() => {
|
|
188
190
|
switch (this.statusKind()) {
|
|
189
191
|
case 'loading':
|
|
190
|
-
return '
|
|
192
|
+
return (this.config().dataSource?.sourceType === 'api' || this.config().dataSource?.apiEndpoint)
|
|
193
|
+
? 'Loading from API…'
|
|
194
|
+
: 'Loading from database…';
|
|
191
195
|
case 'ok':
|
|
192
196
|
return `${this.dynamicOptions().length} records loaded`;
|
|
193
197
|
case 'waiting':
|
|
@@ -418,10 +422,12 @@ export class RptDropdownComponent {
|
|
|
418
422
|
const ds = this.config().dataSource;
|
|
419
423
|
if (!ds || !this.isDynamicSource())
|
|
420
424
|
return;
|
|
421
|
-
// 1. Database Table / Stored Procedure Lookup
|
|
422
|
-
|
|
425
|
+
// 1. Database Table / Stored Procedure / REST API Lookup
|
|
426
|
+
const isApi = ds.sourceType === 'api' || !!ds.apiEndpoint;
|
|
427
|
+
const isDbLookup = !!(ds.entityName && (ds.sourceType === 'table' || ds.sourceType === 'procedure'));
|
|
428
|
+
if ((isApi || isDbLookup) && this.lookupAdapter) {
|
|
423
429
|
const formValues = this.parentForm()?.getRawValue() ?? {};
|
|
424
|
-
// Do not call
|
|
430
|
+
// Do not call until every canvas field this lookup depends on is filled.
|
|
425
431
|
const missing = findMissingCanvasFields(ds.parameterMappings, formValues);
|
|
426
432
|
this.waitingFor.set(missing);
|
|
427
433
|
if (missing.length > 0) {
|
|
@@ -438,13 +444,16 @@ export class RptDropdownComponent {
|
|
|
438
444
|
...resolveParameterMappings(ds.parameterMappings, session, formValues),
|
|
439
445
|
};
|
|
440
446
|
const request = {
|
|
441
|
-
sourceType: ds.sourceType ?? 'table',
|
|
442
|
-
entityName: ds.entityName,
|
|
447
|
+
sourceType: ds.sourceType ?? (isApi ? 'api' : 'table'),
|
|
448
|
+
entityName: ds.entityName ?? (isApi ? ds.apiEndpoint : ''),
|
|
443
449
|
schema: ds.schema ?? 'dbo',
|
|
444
450
|
valueField: ds.valueField?.trim() || '',
|
|
445
451
|
displayField: ds.displayField?.trim() || '',
|
|
446
452
|
filter: ds.filter,
|
|
447
453
|
parameters: resolvedParams,
|
|
454
|
+
apiEndpoint: ds.apiEndpoint,
|
|
455
|
+
dataPath: ds.dataPath,
|
|
456
|
+
useProxy: ds.useProxy,
|
|
448
457
|
};
|
|
449
458
|
const requestKey = JSON.stringify(request);
|
|
450
459
|
if (requestKey === this.lastRequestKey)
|
|
@@ -530,4 +539,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
530
539
|
type: HostListener,
|
|
531
540
|
args: ['document:keydown.escape']
|
|
532
541
|
}] } });
|
|
533
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9kcm9wZG93bi9ycHQtZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvcHJpbWl0aXZlcy9jb21wb25lbnRzL2Ryb3Bkb3duL3JwdC1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFHTCxPQUFPLEVBQ1AsYUFBYSxHQUVkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFnQixVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRS9FLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsd0JBQXdCLEdBQ3pCLE1BQU0sMkNBQTJDLENBQUM7Ozs7QUFtQm5ELE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRSxhQUFhLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEUsY0FBYyxHQUFHLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFbEMsY0FBYyxHQUFtQixJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzVFLFlBQVksR0FBRyxNQUFNLENBQWtCLE1BQU0sQ0FBQyxDQUFDO0lBRS9DLGdCQUFnQixHQUF3QjtRQUMvQztZQUNFLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNEO1lBQ0UsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsT0FBTztZQUNqQixRQUFRLEVBQUUsUUFBUTtZQUNsQixPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ1o7UUFDRDtZQUNFLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLFFBQVE7WUFDakIsUUFBUSxFQUFFLEtBQUs7WUFDZixRQUFRLEVBQUUsS0FBSztZQUNmLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRDtZQUNFLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsS0FBSztZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDWjtLQUNGLENBQUM7SUFFTyxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBNkIsQ0FBQztJQUNyRCxPQUFPLEdBQUcsS0FBSyxFQUFrQyxDQUFDO0lBQ2xELFVBQVUsR0FBRyxLQUFLLENBQW1CLElBQUksQ0FBQyxDQUFDO0lBQ3BELHFGQUFxRjtJQUM1RSxVQUFVLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ25DLGFBQWEsR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUV2QixlQUFlLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsY0FBYyxHQUFHLE1BQU0sQ0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDL0MsU0FBUyxDQUFnQjtJQUN6QixhQUFhLENBQWdCO0lBQzdCLGNBQWMsQ0FBZ0I7SUFDOUIsV0FBVyxDQUFpQztJQUM1QyxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBRTVCLDZCQUE2QjtJQUNwQixNQUFNLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLFVBQVUsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDcEMsVUFBVSxHQUFHLE1BQU0sQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUNoQyxZQUFZLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsWUFBWSxHQUFHLE1BQU0sQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUNyQyxpQkFBaUIsR0FBRyxTQUFTLENBQTBCLGlCQUFpQixDQUFDLENBQUM7SUFDMUUsYUFBYSxHQUFHLFNBQVMsQ0FBK0IsYUFBYSxDQUFDLENBQUM7SUFDdkUsYUFBYSxHQUFHLFNBQVMsQ0FBMEIsZUFBZSxDQUFDLENBQUM7SUFFckUsVUFBVSxDQUFnQjtJQUV6QixXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDckUsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRSxXQUFXLEdBQUcsUUFBUSxDQUM3QixHQUFHLEVBQUUsQ0FBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsYUFBYSxDQUFZLElBQUksY0FBYyxDQUM5RSxDQUFDO0lBRU8sWUFBWSxHQUFHLFFBQVEsQ0FDOUIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLElBQUksQ0FDMUQsQ0FBQztJQUVPLFNBQVMsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDbkMsU0FBUyxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNuQyxTQUFTLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUNqRCx1RUFBdUU7SUFDOUQsVUFBVSxHQUFHLE1BQU0sQ0FBVyxFQUFFLENBQUMsQ0FBQztJQUVsQyxlQUFlLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUN2QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxDQUFDLENBQ1AsRUFBRTtZQUNGLENBQUMsRUFBRSxDQUFDLFVBQVUsS0FBSyxPQUFPO2dCQUN4QixFQUFFLENBQUMsVUFBVSxLQUFLLFdBQVc7Z0JBQzdCLEVBQUUsQ0FBQyxVQUFVO2dCQUNiLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FDakIsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRU0sYUFBYSxHQUFHLFFBQVEsQ0FBbUIsR0FBRyxFQUFFO1FBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQyxDQUFDO0lBRU0sVUFBVSxHQUFHLFFBQVEsQ0FBbUIsR0FBRyxFQUFFO1FBQ3BELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUMsQ0FBQyxDQUFDO0lBRU0sY0FBYyxHQUFHLFFBQVEsQ0FBd0IsR0FBRyxFQUFFO1FBQzdELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQzFFLElBQUksS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hCLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBc0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFFTSxlQUFlLEdBQUcsUUFBUSxDQUFtQixHQUFHLEVBQUU7UUFDekQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sR0FBRyxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ3hCLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUN2RixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFTSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7SUFDeEIscUJBQXFCLEdBQUcsR0FBRyxDQUFDO0lBQzVCLGlCQUFpQixHQUFHLE1BQU0sQ0FBUyxHQUFHLENBQUMsQ0FBQztJQUV4QyxzQkFBc0IsR0FBRyxRQUFRLENBQW1CLEdBQUcsRUFBRTtRQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDdkMsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLEtBQUs7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUM5QyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBRU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFTLEdBQUcsRUFBRTtRQUNuRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUMvRSxDQUFDLENBQUMsQ0FBQztJQUVILGVBQWUsQ0FBQyxLQUFZO1FBQzFCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO1FBQ3ZDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUNoQixJQUFJLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLE9BQU8sR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRVEsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0lBQzVCLGVBQWUsR0FBRyxRQUFRLENBQW1CLEdBQUcsRUFBRTtRQUN6RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0I7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMxRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ00sZ0JBQWdCLEdBQUcsUUFBUSxDQUFVLEdBQUcsRUFBRTtRQUNqRCxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ00sa0JBQWtCLEdBQUcsUUFBUSxDQUFTLEdBQUcsRUFBRTtRQUNsRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDM0UsQ0FBQyxDQUFDLENBQUM7SUFFTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFTSxVQUFVLEdBQUcsUUFBUSxDQUE0RCxHQUFHLEVBQUU7UUFDN0YsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN2QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ25ELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQy9FLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBRU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbEMsUUFBUSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUMxQixLQUFLLFNBQVM7Z0JBQ1osT0FBTyx3QkFBd0IsQ0FBQztZQUNsQyxLQUFLLElBQUk7Z0JBQ1AsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLGlCQUFpQixDQUFDO1lBQzFELEtBQUssU0FBUztnQkFDWixPQUFPLGdCQUFnQixJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztZQUMvQyxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksZ0JBQWdCLENBQUM7WUFDOUMsS0FBSyxPQUFPO2dCQUNWLE9BQU8sZ0RBQWdELENBQUM7WUFDMUQ7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFFTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDdkIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxPQUFPLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFHSCxlQUFlLENBQUMsS0FBaUI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPO1FBQzNCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFjLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUdELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFtQjtRQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDaEMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNsRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBYTtRQUN0QixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ3hDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBRXhDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUN6RixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxDQUFDO1FBQ3RFLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBc0M7UUFDckQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELGlCQUFpQjtRQUNmLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFtQjtRQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFZO1FBQ3pCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsbUZBQW1GO0lBQ25GLFdBQVcsQ0FBQyxLQUFhO1FBQ3ZCLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVk7UUFDdEIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBWTtRQUN4QixNQUFNLEdBQUcsR0FBSSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxLQUFLLENBQUM7UUFDckQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBb0I7UUFDbkMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFdBQVcsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzVFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsS0FBb0I7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUU3QixRQUFRLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNsQixLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQy9CLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUM1RSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQy9CLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ2IsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2hDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxFQUFFLENBQUM7b0JBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLENBQUM7cUJBQU0sSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JCLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNYLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckIsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsYUFBYSxDQUFDO1FBQ25ELElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUNwQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQWMsdUJBQXVCLENBQUMsQ0FBQztRQUM1RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDaEMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDO0lBRUQ7UUFDRSxrRUFBa0U7UUFDbEUsTUFBTSxDQUNKLEdBQUcsRUFBRTtZQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLENBQUMsRUFDRCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUM1QixDQUFDO1FBRUYsa0ZBQWtGO1FBQ2xGLE1BQU0sQ0FDSixHQUFHLEVBQUU7WUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM1RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsd0NBQXdDO1lBRXZELElBQUksQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDbkMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDakYsQ0FBQztZQUNELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUN6QyxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVPLHVCQUF1QixDQUFDLE9BQTBCO1FBQ3hELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDcEMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFBRSxPQUFPO1FBRTNDLDhDQUE4QztRQUM5QyxJQUFJLEVBQUUsQ0FBQyxVQUFVLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxLQUFLLE9BQU8sSUFBSSxFQUFFLENBQUMsVUFBVSxLQUFLLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4RyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO1lBRTFELHNGQUFzRjtZQUN0RixNQUFNLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0IsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztnQkFDekIsT0FBTztZQUNULENBQUM7WUFFRCxtR0FBbUc7WUFDbkcsTUFBTSxjQUFjLEdBQTRCO2dCQUM5QyxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxHQUFHLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDO2FBQ3ZFLENBQUM7WUFFRixNQUFNLE9BQU8sR0FBRztnQkFDZCxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsSUFBSSxPQUFPO2dCQUNwQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVU7Z0JBQ3pCLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxJQUFJLEtBQUs7Z0JBQzFCLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7Z0JBQ3ZDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7Z0JBQzNDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTTtnQkFDakIsVUFBVSxFQUFFLGNBQWM7YUFDM0IsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLGNBQWM7Z0JBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUNsRSxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQztZQUVqQyw2RUFBNkU7WUFDN0Usc0dBQXNHO1lBQ3RHLE1BQU0sU0FBUyxHQUNYLEVBQVUsRUFBRSxTQUFvQjtnQkFDakMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBWTtnQkFDbkQsSUFBSSxDQUFDLGVBQWUsRUFBRSxlQUFlO2dCQUNyQyxNQUFNLENBQUM7WUFFVCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWE7aUJBQ2hDLFlBQVksQ0FBQyxPQUFPLENBQUM7aUJBQ3JCLElBQUksQ0FDSCxPQUFPLENBQUM7Z0JBQ04sSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUNULFVBQVUsQ0FDUixHQUFHLEVBQUUsQ0FDSCxJQUFJLEtBQUssQ0FDUCxnQ0FBZ0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGlFQUFpRSxDQUM5SCxDQUNKO2FBQ0osQ0FBQyxDQUNIO2lCQUNBLFNBQVMsQ0FBQztnQkFDWCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pCLGdFQUFnRTtvQkFDaEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztvQkFDL0IsTUFBTSxPQUFPLEdBQXFCLEVBQUUsQ0FBQztvQkFDckMsS0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLEVBQUUsQ0FBQzt3QkFDdkIsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDWixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNqRCxDQUFDO29CQUNILENBQUM7b0JBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ25DLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsRUFBRSxDQUFDLFVBQVUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUN4RixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGNBQWM7b0JBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLElBQUksc0JBQXNCLENBQUMsQ0FBQztnQkFDN0QsQ0FBQzthQUNGLENBQUMsQ0FBQztZQUNILE9BQU87UUFDVCxDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLElBQUksRUFBRSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ2xGLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQ3JCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ2pCLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUN2QyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztxQkFDNUMsQ0FBQyxDQUFDLENBQ0osQ0FBQztnQkFDSixDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0RBQWdELEVBQUUsQ0FBQyxVQUFVLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDckYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLDRCQUE0QixDQUFDLENBQUM7Z0JBQ25FLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQzt3R0FuakJVLG9CQUFvQjs0RkFBcEIsb0JBQW9CLDhxQ0N0RGpDLDJuV0EwUFUsczJSRDdNRSxtQkFBbUIsb3RCQUFFLGFBQWE7OzRGQVNqQyxvQkFBb0I7a0JBWmhDLFNBQVM7K0JBQ0UsY0FBYyxjQUNaLElBQUksV0FDUCxDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxRQUN2Qzt3QkFDSixpQkFBaUIsRUFBRSxVQUFVO3dCQUM3QixxQkFBcUIsRUFBRSxjQUFjO3FCQUN0QyxtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTTt3REFvTy9DLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVMUMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25EZXN0cm95LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIENvbm5lY3RlZFBvc2l0aW9uLFxuICBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsXG4gIE92ZXJsYXksXG4gIE92ZXJsYXlNb2R1bGUsXG4gIFNjcm9sbFN0cmF0ZWd5LFxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBnZXRWYWxpZGF0aW9uTWVzc2FnZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdmFsaWRhdGlvbi92YWxpZGF0aW9uLWZhY3RvcnknO1xuaW1wb3J0IHsgTWFzdGVyRGF0YVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL21hc3Rlci1kYXRhLnByb3ZpZGVyJztcbmltcG9ydCB7IFJlcG9ydExvb2t1cEFkYXB0ZXIgfSBmcm9tICcuLi8uLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvbG9va3VwLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LXNlc3Npb24tY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IFJFUE9SVElOR19DT05GSUcgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3Rva2Vucy9yZXBvcnRpbmctY29uZmlnLnRva2VuJztcbmltcG9ydCB7IFNlc3Npb25Db250ZXh0TWFwIH0gZnJvbSAnLi4vLi4vLi4vY29yZS90b2tlbnMvc2Vzc2lvbi1jb250ZXh0LnRva2VuJztcbmltcG9ydCB7XG4gIGZpbmRNaXNzaW5nQ2FudmFzRmllbGRzLFxuICByZXNvbHZlUGFyYW1ldGVyTWFwcGluZ3MsXG59IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMvcmVwb3J0LXBhcmFtZXRlci51dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBEcm9wZG93bk9wdGlvbiB7XG4gIGtleTogc3RyaW5nIHwgbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtZHJvcGRvd24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZSwgT3ZlcmxheU1vZHVsZV0sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmlzLW9wZW5dJzogJ2lzT3BlbigpJyxcbiAgICAnW2NsYXNzLm9wZW5zLWFib3ZlXSc6ICdvcGVuc0Fib3ZlKCknLFxuICB9LFxuICB0ZW1wbGF0ZVVybDogJy4vcnB0LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3JwdC1kcm9wZG93bi5jb21wb25lbnQuY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJwdERyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXN0ZXJEYXRhUHJvdmlkZXIgPSBpbmplY3QoTWFzdGVyRGF0YVByb3ZpZGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvb2t1cEFkYXB0ZXIgPSBpbmplY3QoUmVwb3J0TG9va3VwQWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uU2VydmljZSA9IGluamVjdChSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRpbmdDb25maWcgPSBpbmplY3QoUkVQT1JUSU5HX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBvdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuXG4gIHJlYWRvbmx5IHNjcm9sbFN0cmF0ZWd5OiBTY3JvbGxTdHJhdGVneSA9IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKTtcbiAgcmVhZG9ubHkgdHJpZ2dlcldpZHRoID0gc2lnbmFsPG51bWJlciB8IHN0cmluZz4oJ2F1dG8nKTtcblxuICByZWFkb25seSBvdmVybGF5UG9zaXRpb25zOiBDb25uZWN0ZWRQb3NpdGlvbltdID0gW1xuICAgIHtcbiAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgb2Zmc2V0WTogNCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgb2Zmc2V0WTogLTQsXG4gICAgfSxcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgb2Zmc2V0WTogNCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICBvZmZzZXRZOiAtNCxcbiAgICB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IGNvbmZpZyA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24+KCk7XG4gIHJlYWRvbmx5IGNvbnRyb2wgPSBpbnB1dDxGb3JtQ29udHJvbCB8IG51bGwgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IHBhcmVudEZvcm0gPSBpbnB1dDxGb3JtR3JvdXAgfCBudWxsPihudWxsKTtcbiAgLyoqIERlc2lnbmVyIG1vZGU6IHNob3dzIGEgc21hbGwgc3RhdHVzIGxpbmUgKExvYWRpbmcgLyBOIHJlY29yZHMgLyBXYWl0aW5nIGZvcuKApikuICovXG4gIHJlYWRvbmx5IHNob3dTdGF0dXMgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duQ2xpY2sgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZhbGxiYWNrQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gIHJlYWRvbmx5IGR5bmFtaWNPcHRpb25zID0gc2lnbmFsPERyb3Bkb3duT3B0aW9uW10+KFtdKTtcbiAgcHJpdmF0ZSBsb29rdXBTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgbWFzdGVyRGF0YVN1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBmb3JtQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSByZWxvYWRUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIGxhc3RSZXF1ZXN0S2V5ID0gJyc7XG5cbiAgLy8gQ29tYm9ib3ggaW50ZXJhY3RpdmUgc3RhdGVcbiAgcmVhZG9ubHkgaXNPcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgb3BlbnNBYm92ZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNlYXJjaFRlcm0gPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGZvY3VzZWRJbmRleCA9IHNpZ25hbDxudW1iZXI+KC0xKTtcbiAgcmVhZG9ubHkgY3VycmVudFZhbHVlID0gc2lnbmFsPHVua25vd24+KG51bGwpO1xuICByZWFkb25seSBjb21ib2JveFdyYXBwZXJFbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ2NvbWJvYm94V3JhcHBlcicpO1xuICByZWFkb25seSBzZWFyY2hJbnB1dEVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdzZWFyY2hJbnB1dCcpO1xuICByZWFkb25seSBvcHRpb25zTGlzdEVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pignb3B0aW9uc0xpc3RFbCcpO1xuXG4gIHByaXZhdGUgY29udHJvbFN1Yj86IFN1YnNjcmlwdGlvbjtcblxuICByZWFkb25seSBmb3JtQ29udHJvbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29udHJvbCgpID8/IHRoaXMuZmFsbGJhY2tDb250cm9sKTtcbiAgcmVhZG9ubHkgZWxlbWVudElkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb25maWcoKS5rZXkgfHwgdGhpcy5jb25maWcoKS5pZCk7XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gKHRoaXMuY29uZmlnKCkucHJvcGVydGllcz8uWydwbGFjZWhvbGRlciddIGFzIHN0cmluZykgPz8gJy0tIFNlbGVjdCAtLSdcbiAgKTtcblxuICByZWFkb25seSBpc1NlYXJjaGFibGUgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLmNvbmZpZygpLnByb3BlcnRpZXM/LlsnbmF0aXZlU2VsZWN0J10gIT09IHRydWVcbiAgKTtcblxuICByZWFkb25seSBpc0xvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBoYXNMb2FkZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBsb2FkRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBDYW52YXMgZmllbGQga2V5cyB0aGF0IG11c3QgYmUgZmlsbGVkIGJlZm9yZSB0aGUgbG9va3VwIGNhbiBydW4uICovXG4gIHJlYWRvbmx5IHdhaXRpbmdGb3IgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcblxuICByZWFkb25seSBpc0R5bmFtaWNTb3VyY2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZHMgPSB0aGlzLmNvbmZpZygpLmRhdGFTb3VyY2U7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZHMgJiZcbiAgICAgIChkcy5zb3VyY2VUeXBlID09PSAndGFibGUnIHx8XG4gICAgICAgIGRzLnNvdXJjZVR5cGUgPT09ICdwcm9jZWR1cmUnIHx8XG4gICAgICAgIGRzLmVudGl0eU5hbWUgfHxcbiAgICAgICAgZHMubWFzdGVyTmFtZSlcbiAgICApO1xuICB9KTtcblxuICByZWFkb25seSBzdGF0aWNPcHRpb25zID0gY29tcHV0ZWQ8RHJvcGRvd25PcHRpb25bXT4oKCkgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLmNvbmZpZygpLnByb3BlcnRpZXM/Llsnb3B0aW9ucyddO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMpKSB7XG4gICAgICByZXR1cm4gb3B0cztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9KTtcblxuICByZWFkb25seSBhbGxPcHRpb25zID0gY29tcHV0ZWQ8RHJvcGRvd25PcHRpb25bXT4oKCkgPT4ge1xuICAgIGlmICh0aGlzLmlzRHluYW1pY1NvdXJjZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5keW5hbWljT3B0aW9ucygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0aWNPcHRpb25zKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkT3B0aW9uID0gY29tcHV0ZWQ8RHJvcGRvd25PcHRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5jdXJyZW50VmFsdWUoKTtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gJycpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHN0clZhbCA9IFN0cmluZyh2YWwpO1xuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5hbGxPcHRpb25zKCkuZmluZCgob3B0KSA9PiBTdHJpbmcob3B0LmtleSkgPT09IHN0clZhbCk7XG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgcmV0dXJuIHsga2V5OiB2YWwgYXMgc3RyaW5nIHwgbnVtYmVyLCBsYWJlbDogc3RyVmFsIH07XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGZpbHRlcmVkT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duT3B0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCB0ZXJtID0gdGhpcy5zZWFyY2hUZXJtKCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgYWxsID0gdGhpcy5hbGxPcHRpb25zKCk7XG4gICAgaWYgKCF0ZXJtKSByZXR1cm4gYWxsO1xuICAgIHJldHVybiBhbGwuZmlsdGVyKChvcHQpID0+XG4gICAgICBvcHQubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSB8fCBTdHJpbmcob3B0LmtleSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKVxuICAgICk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IE1BWF9GSUxURVJfUkVOREVSID0gMjAwO1xuICByZWFkb25seSBJTklUSUFMX0ZJTFRFUl9SRU5ERVIgPSAyMDA7XG4gIHJlYWRvbmx5IGZpbHRlclJlbmRlckxpbWl0ID0gc2lnbmFsPG51bWJlcj4oMjAwKTtcblxuICByZWFkb25seSB2aXNpYmxlRmlsdGVyZWRPcHRpb25zID0gY29tcHV0ZWQ8RHJvcGRvd25PcHRpb25bXT4oKCkgPT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcbiAgICBjb25zdCBsaW1pdCA9IHRoaXMuZmlsdGVyUmVuZGVyTGltaXQoKTtcbiAgICBpZiAoZmlsdGVyZWQubGVuZ3RoIDw9IGxpbWl0KSByZXR1cm4gZmlsdGVyZWQ7XG4gICAgcmV0dXJuIGZpbHRlcmVkLnNsaWNlKDAsIGxpbWl0KTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZXhjZXNzRmlsdGVyZWRDb3VudCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCAtIHRoaXMuZmlsdGVyUmVuZGVyTGltaXQoKSk7XG4gIH0pO1xuXG4gIG9uT3B0aW9uc1Njcm9sbChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgaWYgKGVsLnNjcm9sbFRvcCArIGVsLmNsaWVudEhlaWdodCA+PSBlbC5zY3JvbGxIZWlnaHQgLSAxMjApIHtcbiAgICAgIHRoaXMubG9hZE1vcmVGaWx0ZXJlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRNb3JlRmlsdGVyZWQoKTogdm9pZCB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aDtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5maWx0ZXJSZW5kZXJMaW1pdCgpO1xuICAgIGlmIChjdXJyZW50IDwgdG90YWwpIHtcbiAgICAgIHRoaXMuZmlsdGVyUmVuZGVyTGltaXQudXBkYXRlKChjKSA9PiBNYXRoLm1pbih0b3RhbCwgYyArIDIwMCkpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRBbGxGaWx0ZXJlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlclJlbmRlckxpbWl0LnNldCh0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCk7XG4gIH1cblxuICByZWFkb25seSBNQVhfUkVOREVSRURfT1BUSU9OUyA9IDUwMDA7XG4gIHJlYWRvbmx5IHJlbmRlcmVkT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duT3B0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5hbGxPcHRpb25zKCk7XG4gICAgaWYgKG9wdHMubGVuZ3RoIDw9IHRoaXMuTUFYX1JFTkRFUkVEX09QVElPTlMpIHJldHVybiBvcHRzO1xuICAgIHJldHVybiBvcHRzLnNsaWNlKDAsIHRoaXMuTUFYX1JFTkRFUkVEX09QVElPTlMpO1xuICB9KTtcbiAgcmVhZG9ubHkgaGFzRXhjZXNzT3B0aW9ucyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5hbGxPcHRpb25zKCkubGVuZ3RoID4gdGhpcy5NQVhfUkVOREVSRURfT1BUSU9OUztcbiAgfSk7XG4gIHJlYWRvbmx5IGV4Y2Vzc09wdGlvbnNDb3VudCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLmFsbE9wdGlvbnMoKS5sZW5ndGggLSB0aGlzLk1BWF9SRU5ERVJFRF9PUFRJT05TKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgd2FpdGluZ0xhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGtleXMgPSB0aGlzLndhaXRpbmdGb3IoKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICByZXR1cm4ga2V5cy5qb2luKCcsICcpO1xuICB9KTtcblxuICByZWFkb25seSBzdGF0dXNLaW5kID0gY29tcHV0ZWQ8J2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ29rJyB8ICd3YWl0aW5nJyB8ICdlcnJvcicgfCAnZW1wdHknPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmlzRHluYW1pY1NvdXJjZSgpKSByZXR1cm4gJ2lkbGUnO1xuICAgIGlmICh0aGlzLmlzTG9hZGluZygpKSByZXR1cm4gJ2xvYWRpbmcnO1xuICAgIGlmICh0aGlzLmxvYWRFcnJvcigpKSByZXR1cm4gJ2Vycm9yJztcbiAgICBpZiAodGhpcy53YWl0aW5nRm9yKCkubGVuZ3RoID4gMCkgcmV0dXJuICd3YWl0aW5nJztcbiAgICBpZiAodGhpcy5oYXNMb2FkZWQoKSkgcmV0dXJuIHRoaXMuZHluYW1pY09wdGlvbnMoKS5sZW5ndGggPiAwID8gJ29rJyA6ICdlbXB0eSc7XG4gICAgcmV0dXJuICdpZGxlJztcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc3RhdHVzVGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMuc3RhdHVzS2luZCgpKSB7XG4gICAgICBjYXNlICdsb2FkaW5nJzpcbiAgICAgICAgcmV0dXJuICdMb2FkaW5nIGZyb20gZGF0YWJhc2XigKYnO1xuICAgICAgY2FzZSAnb2snOlxuICAgICAgICByZXR1cm4gYCR7dGhpcy5keW5hbWljT3B0aW9ucygpLmxlbmd0aH0gcmVjb3JkcyBsb2FkZWRgO1xuICAgICAgY2FzZSAnd2FpdGluZyc6XG4gICAgICAgIHJldHVybiBgV2FpdGluZyBmb3I6ICR7dGhpcy53YWl0aW5nTGFiZWwoKX1gO1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkRXJyb3IoKSA/PyAnRmFpbGVkIHRvIGxvYWQnO1xuICAgICAgY2FzZSAnZW1wdHknOlxuICAgICAgICByZXR1cm4gJ1F1ZXJ5IHJldHVybmVkIG5vIHJlY29yZHMgZm9yIHRoZXNlIHBhcmFtZXRlcnMnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfSk7XG5cbiAgcmVhZG9ubHkgaXNJbnZhbGlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmZvcm1Db250cm9sKCk7XG4gICAgcmV0dXJuIGN0cmwuaW52YWxpZCAmJiAoY3RybC5kaXJ0eSB8fCBjdHJsLnRvdWNoZWQpO1xuICB9KTtcblxuICByZWFkb25seSBlcnJvck1lc3NhZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybUNvbnRyb2woKTtcbiAgICBpZiAoIWN0cmwuaW52YWxpZCB8fCAoIWN0cmwuZGlydHkgJiYgIWN0cmwudG91Y2hlZCkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3QgZXJyb3JzID0gY3RybC5lcnJvcnM7XG4gICAgaWYgKCFlcnJvcnMpIHJldHVybiAnJztcbiAgICBjb25zdCBmaXJzdEtleSA9IE9iamVjdC5rZXlzKGVycm9ycylbMF07XG4gICAgcmV0dXJuIGdldFZhbGlkYXRpb25NZXNzYWdlKHRoaXMuY29uZmlnKCkudmFsaWRhdGlvbiwgZmlyc3RLZXkpO1xuICB9KTtcblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBOb2RlO1xuICAgIGlmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnKVxuICBvbkVzY2FwZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgfVxuICB9XG5cbiAgaXNTZWxlY3RlZChvcHQ6IERyb3Bkb3duT3B0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5jdXJyZW50VmFsdWUoKTtcbiAgICBpZiAoY3VyID09PSBudWxsIHx8IGN1ciA9PT0gdW5kZWZpbmVkIHx8IGN1ciA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gU3RyaW5nKGN1cikgPT09IFN0cmluZyhvcHQua2V5KTtcbiAgfVxuXG4gIHRvZ2dsZU9wZW4oZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuZHJvcGRvd25DbGljay5lbWl0KCk7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2woKS5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuRHJvcGRvd24oKTtcbiAgICB9XG4gIH1cblxuICBvcGVuRHJvcGRvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2woKS5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuY29tYm9ib3hXcmFwcGVyRWwoKT8ubmF0aXZlRWxlbWVudCA/PyB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCByZWN0ID0gd3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAocmVjdC53aWR0aCA+IDApIHtcbiAgICAgIHRoaXMudHJpZ2dlcldpZHRoLnNldChyZWN0LndpZHRoKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmZXJBYm92ZSA9IHRoaXMuY29uZmlnKCk/LnByb3BlcnRpZXM/Llsnb3BlbkFib3ZlJ10gPT09IHRydWU7XG4gICAgaWYgKHByZWZlckFib3ZlKSB7XG4gICAgICB0aGlzLm9wZW5zQWJvdmUuc2V0KHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICB0aGlzLnNlYXJjaFRlcm0uc2V0KCcnKTtcbiAgICB0aGlzLmZpbHRlclJlbmRlckxpbWl0LnNldCh0aGlzLklOSVRJQUxfRklMVEVSX1JFTkRFUik7XG4gICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgfVxuXG4gIG9uUG9zaXRpb25DaGFuZ2UoY2hhbmdlOiBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5zQWJvdmUuc2V0KGNoYW5nZS5jb25uZWN0aW9uUGFpci5vcmlnaW5ZID09PSAndG9wJyk7XG4gIH1cblxuICBvbk92ZXJsYXlBdHRhY2hlZCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfSwgMjUpO1xuICB9XG5cbiAgY2xvc2VEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gICAgdGhpcy5mb3JtQ29udHJvbCgpLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuXG4gIHNlbGVjdE9wdGlvbihvcHQ6IERyb3Bkb3duT3B0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmFsdWUuc2V0KG9wdC5rZXkpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2woKS5zZXRWYWx1ZShvcHQua2V5KTtcbiAgICB0aGlzLmZvcm1Db250cm9sKCkubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLmZvcm1Db250cm9sKCkubWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICB9XG5cbiAgY2xlYXJTZWxlY3Rpb24oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmN1cnJlbnRWYWx1ZS5zZXQoJycpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2woKS5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy5mb3JtQ29udHJvbCgpLm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5mb3JtQ29udHJvbCgpLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLnNlYXJjaFRlcm0uc2V0KCcnKTtcbiAgICB0aGlzLmZpbHRlclJlbmRlckxpbWl0LnNldCh0aGlzLklOSVRJQUxfRklMVEVSX1JFTkRFUik7XG4gICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgfVxuXG4gIC8qKiBNYW51YWxseSByZXRyeSBsb2FkaW5nIGR5bmFtaWMgbG9va3VwIG9wdGlvbnMgKGUuZy4gYWZ0ZXIgZGF0YWJhc2UgdGltZW91dCkuICovXG4gIHJldHJ5TG9va3VwKGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVxdWVzdEtleSA9ICcnO1xuICAgIHRoaXMubG9hZEVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLnJlbG9hZERhdGFTb3VyY2VPcHRpb25zKHRoaXMuc2Vzc2lvblNlcnZpY2U/LnNlc3Npb25Db250ZXh0KCkgPz8ge30pO1xuICB9XG5cbiAgY2xlYXJTZWFyY2goZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCgnJyk7XG4gICAgdGhpcy5maWx0ZXJSZW5kZXJMaW1pdC5zZXQodGhpcy5JTklUSUFMX0ZJTFRFUl9SRU5ERVIpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gICAgdGhpcy5zZWFyY2hJbnB1dEVsKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIG9uU2VhcmNoSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdmFsID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLnNlYXJjaFRlcm0uc2V0KHZhbCk7XG4gICAgdGhpcy5maWx0ZXJSZW5kZXJMaW1pdC5zZXQodGhpcy5JTklUSUFMX0ZJTFRFUl9SRU5ERVIpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgwKTtcbiAgfVxuXG4gIG9uVHJpZ2dlcktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyB8fCBldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLm9wZW5Ecm9wZG93bigpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLnZpc2libGVGaWx0ZXJlZE9wdGlvbnMoKTtcbiAgICBjb25zdCBjb3VudCA9IHZpc2libGUubGVuZ3RoO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSAodGhpcy5mb2N1c2VkSW5kZXgoKSArIDEpICUgY291bnQ7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KG5leHQpO1xuICAgICAgICAgIHRoaXMuc2Nyb2xsRm9jdXNlZEludG9WaWV3KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1VwJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuZm9jdXNlZEluZGV4KCkgPD0gMCA/IGNvdW50IC0gMSA6IHRoaXMuZm9jdXNlZEluZGV4KCkgLSAxO1xuICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChwcmV2KTtcbiAgICAgICAgICB0aGlzLnNjcm9sbEZvY3VzZWRJbnRvVmlldygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgICAgIGlmIChpZHggPj0gMCAmJiBpZHggPCBjb3VudCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9uKHZpc2libGVbaWR4XSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdE9wdGlvbih2aXNpYmxlWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VzY2FwZSc6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnVGFiJzoge1xuICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxGb2N1c2VkSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgY29uc3QgbGlzdEVsID0gdGhpcy5vcHRpb25zTGlzdEVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFsaXN0RWwpIHJldHVybjtcbiAgICBjb25zdCBpdGVtcyA9IGxpc3RFbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLmNvbWJvYm94LW9wdGlvbi1pdGVtJyk7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKTtcbiAgICBpZiAoaXRlbXMgJiYgaXRlbXNbaWR4XSkge1xuICAgICAgaXRlbXNbaWR4XS5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gU3luYyByZWFjdGl2ZSBmb3JtIGNvbnRyb2wgdmFsdWUgY2hhbmdlcyB0byBjdXJyZW50VmFsdWUgc2lnbmFsXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBjdHJsID0gdGhpcy5mb3JtQ29udHJvbCgpO1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jdXJyZW50VmFsdWUuc2V0KGN0cmwudmFsdWUpKTtcbiAgICAgICAgdGhpcy5jb250cm9sU3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xTdWIgPSBjdHJsLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHYpID0+IHRoaXMuY3VycmVudFZhbHVlLnNldCh2KSk7XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcblxuICAgIC8vIFJlLXJ1biB3aGVuZXZlciB0aGUgYm91bmQgZGF0YSBzb3VyY2UsIHRoZSBzZXNzaW9uLCBvciB0aGUgcGFyZW50IGZvcm0gY2hhbmdlcy5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25TZXJ2aWNlPy5zZXNzaW9uQ29udGV4dCgpID8/IHt9O1xuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5wYXJlbnRGb3JtKCk7XG4gICAgICAgIHRoaXMuY29uZmlnKCk7IC8vIGRlcGVuZGVuY3k6IGRhdGEgc291cmNlIGNvbmZpZ3VyYXRpb25cblxuICAgICAgICB0aGlzLmZvcm1DaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAoZm9ybSAmJiB0aGlzLmlzRHluYW1pY1NvdXJjZSgpKSB7XG4gICAgICAgICAgdGhpcy5mb3JtQ2hhbmdlc1N1YiA9IGZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNjaGVkdWxlUmVsb2FkKCkpO1xuICAgICAgICB9XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLnNjaGVkdWxlUmVsb2FkKCkpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5sb29rdXBTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5tYXN0ZXJEYXRhU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZm9ybUNoYW5nZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMucmVsb2FkVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFRpbWVyKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVSZWxvYWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVsb2FkVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFRpbWVyKTtcbiAgICB0aGlzLnJlbG9hZFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlbG9hZERhdGFTb3VyY2VPcHRpb25zKHRoaXMuc2Vzc2lvblNlcnZpY2U/LnNlc3Npb25Db250ZXh0KCkgPz8ge30pO1xuICAgIH0sIDI1MCk7XG4gIH1cblxuICBwcml2YXRlIHJlbG9hZERhdGFTb3VyY2VPcHRpb25zKHNlc3Npb246IFNlc3Npb25Db250ZXh0TWFwKTogdm9pZCB7XG4gICAgY29uc3QgZHMgPSB0aGlzLmNvbmZpZygpLmRhdGFTb3VyY2U7XG4gICAgaWYgKCFkcyB8fCAhdGhpcy5pc0R5bmFtaWNTb3VyY2UoKSkgcmV0dXJuO1xuXG4gICAgLy8gMS4gRGF0YWJhc2UgVGFibGUgLyBTdG9yZWQgUHJvY2VkdXJlIExvb2t1cFxuICAgIGlmIChkcy5lbnRpdHlOYW1lICYmIChkcy5zb3VyY2VUeXBlID09PSAndGFibGUnIHx8IGRzLnNvdXJjZVR5cGUgPT09ICdwcm9jZWR1cmUnKSAmJiB0aGlzLmxvb2t1cEFkYXB0ZXIpIHtcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZXMgPSB0aGlzLnBhcmVudEZvcm0oKT8uZ2V0UmF3VmFsdWUoKSA/PyB7fTtcblxuICAgICAgLy8gRG8gbm90IGNhbGwgdGhlIGRhdGFiYXNlIHVudGlsIGV2ZXJ5IGNhbnZhcyBmaWVsZCB0aGlzIGxvb2t1cCBkZXBlbmRzIG9uIGlzIGZpbGxlZC5cbiAgICAgIGNvbnN0IG1pc3NpbmcgPSBmaW5kTWlzc2luZ0NhbnZhc0ZpZWxkcyhkcy5wYXJhbWV0ZXJNYXBwaW5ncywgZm9ybVZhbHVlcyk7XG4gICAgICB0aGlzLndhaXRpbmdGb3Iuc2V0KG1pc3NpbmcpO1xuICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmxvb2t1cFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5sb2FkRXJyb3Iuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLmR5bmFtaWNPcHRpb25zLnNldChbXSk7XG4gICAgICAgIHRoaXMubGFzdFJlcXVlc3RLZXkgPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZWQgcHJvY2VkdXJlcyBvbmx5IHJlY2VpdmUgZXhwbGljaXQgbWFwcGluZ3Mgc28gU1FMIFNlcnZlciBkb2Vzbid0IHJlamVjdCB1bmtub3duIGFyZ3VtZW50cy5cbiAgICAgIGNvbnN0IHJlc29sdmVkUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgLi4uKGRzLnNvdXJjZVR5cGUgPT09ICd0YWJsZScgPyBzZXNzaW9uIDoge30pLFxuICAgICAgICAuLi5yZXNvbHZlUGFyYW1ldGVyTWFwcGluZ3MoZHMucGFyYW1ldGVyTWFwcGluZ3MsIHNlc3Npb24sIGZvcm1WYWx1ZXMpLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgICAgc291cmNlVHlwZTogZHMuc291cmNlVHlwZSA/PyAndGFibGUnLFxuICAgICAgICBlbnRpdHlOYW1lOiBkcy5lbnRpdHlOYW1lLFxuICAgICAgICBzY2hlbWE6IGRzLnNjaGVtYSA/PyAnZGJvJyxcbiAgICAgICAgdmFsdWVGaWVsZDogZHMudmFsdWVGaWVsZD8udHJpbSgpIHx8ICcnLFxuICAgICAgICBkaXNwbGF5RmllbGQ6IGRzLmRpc3BsYXlGaWVsZD8udHJpbSgpIHx8ICcnLFxuICAgICAgICBmaWx0ZXI6IGRzLmZpbHRlcixcbiAgICAgICAgcGFyYW1ldGVyczogcmVzb2x2ZWRQYXJhbXMsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVxdWVzdEtleSA9IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpO1xuICAgICAgaWYgKHJlcXVlc3RLZXkgPT09IHRoaXMubGFzdFJlcXVlc3RLZXkpIHJldHVybjsgLy8gbm90aGluZyBjaGFuZ2VkXG4gICAgICB0aGlzLmxhc3RSZXF1ZXN0S2V5ID0gcmVxdWVzdEtleTtcblxuICAgICAgLy8gU3RvcmVkIHByb2NlZHVyZXMgb24gbG9jYWwgZGF0YWJhc2VzIGNhbiB0YWtlIGEgY291cGxlIG1pbnV0ZXMgdG8gZXhlY3V0ZS5cbiAgICAgIC8vIERlZmF1bHQgdGltZW91dCBpcyAzMDAsMDAwbXMgKDUgbWludXRlcyksIGNvbmZpZ3VyYWJsZSB2aWEgY29tcG9uZW50IHByb3BlcnRpZXMgb3IgcmVwb3J0aW5nQ29uZmlnLlxuICAgICAgY29uc3QgdGltZW91dE1zID1cbiAgICAgICAgKChkcyBhcyBhbnkpPy50aW1lb3V0TXMgYXMgbnVtYmVyKSB8fFxuICAgICAgICAodGhpcy5jb25maWcoKS5wcm9wZXJ0aWVzPy5bJ3RpbWVvdXRNcyddIGFzIG51bWJlcikgfHxcbiAgICAgICAgdGhpcy5yZXBvcnRpbmdDb25maWc/Lmxvb2t1cFRpbWVvdXRNcyB8fFxuICAgICAgICAzMDAwMDA7XG5cbiAgICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMubG9hZEVycm9yLnNldChudWxsKTtcbiAgICAgIHRoaXMubG9va3VwU3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5sb29rdXBTdWIgPSB0aGlzLmxvb2t1cEFkYXB0ZXJcbiAgICAgICAgLmZldGNoT3B0aW9ucyhyZXF1ZXN0KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0aW1lb3V0KHtcbiAgICAgICAgICAgIGVhY2g6IHRpbWVvdXRNcyxcbiAgICAgICAgICAgIHdpdGg6ICgpID0+XG4gICAgICAgICAgICAgIHRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYExvb2t1cCBxdWVyeSB0aW1lZCBvdXQgYWZ0ZXIgJHtNYXRoLnJvdW5kKHRpbWVvdXRNcyAvIDEwMDApfXMgKHN0b3JlZCBwcm9jZWR1cmUgdG9vayB0b28gbG9uZyB0byByZXNwb25kIG9uIGxvY2FsIGRhdGFiYXNlKWBcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoaXRlbXMpID0+IHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuaGFzTG9hZGVkLnNldCh0cnVlKTtcbiAgICAgICAgICAvLyBEZWR1cGxpY2F0ZSBpdGVtcyBieSBrZXkvdmFsdWUgdG8gZW5zdXJlIGNsZWFuIHNlbGVjdCBvcHRpb25zXG4gICAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgIGNvbnN0IGRlZHVwZWQ6IERyb3Bkb3duT3B0aW9uW10gPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCBrID0gU3RyaW5nKGl0LnZhbHVlKTtcbiAgICAgICAgICAgIGlmICghc2Vlbi5oYXMoaykpIHtcbiAgICAgICAgICAgICAgc2Vlbi5hZGQoayk7XG4gICAgICAgICAgICAgIGRlZHVwZWQucHVzaCh7IGtleTogaywgbGFiZWw6IGl0LmxhYmVsIHx8IGsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZHluYW1pY09wdGlvbnMuc2V0KGRlZHVwZWQpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtScHREcm9wZG93bl0gRmFpbGVkIHRvIGxvYWQgbG9va3VwIG9wdGlvbnMgZm9yICR7ZHMuZW50aXR5TmFtZX06YCwgZXJyKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuaGFzTG9hZGVkLnNldCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmR5bmFtaWNPcHRpb25zLnNldChbXSk7XG4gICAgICAgICAgdGhpcy5sYXN0UmVxdWVzdEtleSA9ICcnOyAvLyBhbGxvdyByZXRyeVxuICAgICAgICAgIHRoaXMubG9hZEVycm9yLnNldChlcnI/Lm1lc3NhZ2UgfHwgJ0RhdGFiYXNlIHF1ZXJ5IGVycm9yJyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAyLiBMZWdhY3kgTWFzdGVyIERhdGEgUHJvdmlkZXJcbiAgICBpZiAoZHMubWFzdGVyTmFtZSAmJiB0aGlzLm1hc3RlckRhdGFQcm92aWRlciAmJiAhdGhpcy5tYXN0ZXJEYXRhU3ViKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWRFcnJvci5zZXQobnVsbCk7XG4gICAgICB0aGlzLm1hc3RlckRhdGFTdWIgPSB0aGlzLm1hc3RlckRhdGFQcm92aWRlci5nZXRNYXN0ZXJEYXRhKGRzLm1hc3Rlck5hbWUpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChpdGVtcykgPT4ge1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5oYXNMb2FkZWQuc2V0KHRydWUpO1xuICAgICAgICAgIHRoaXMuZHluYW1pY09wdGlvbnMuc2V0KFxuICAgICAgICAgICAgaXRlbXMubWFwKChpdCkgPT4gKHtcbiAgICAgICAgICAgICAga2V5OiBTdHJpbmcoaXQudmFsdWUgPz8gaXRbJ2lkJ10gPz8gJycpLFxuICAgICAgICAgICAgICBsYWJlbDogU3RyaW5nKGl0LmxhYmVsID8/IGl0WyduYW1lJ10gPz8gJycpLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbUnB0RHJvcGRvd25dIEZhaWxlZCB0byBsb2FkIG1hc3RlciBkYXRhIGZvciAke2RzLm1hc3Rlck5hbWV9OmAsIGVycik7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmhhc0xvYWRlZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5sb2FkRXJyb3Iuc2V0KGVycj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGxvYWQgbWFzdGVyIGRhdGEnKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiICAgIDxkaXYgY2xhc3M9XCJycHQtZmllbGQtZ3JvdXBcIj5cbiAgICAgIEBpZiAoY29uZmlnKCkubGFiZWwpIHtcbiAgICAgICAgPGxhYmVsIFtmb3JdPVwiZWxlbWVudElkKClcIiBjbGFzcz1cInJwdC1sYWJlbFwiPlxuICAgICAgICAgIHt7IGNvbmZpZygpLmxhYmVsIH19XG4gICAgICAgICAgQGlmIChjb25maWcoKS52YWxpZGF0aW9uPy5yZXF1aXJlZCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtcmVxdWlyZWQtbWFya2VyXCI+Kjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoaXNTZWFyY2hhYmxlKCkpIHtcbiAgICAgICAgPCEtLSBTZWFyY2hhYmxlIFR5cGVhaGVhZCBDb21ib2JveCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1jb21ib2JveC13cmFwcGVyXCIgI2NvbWJvYm94V3JhcHBlciAjY29tYm9ib3hPcmlnaW49XCJjZGtPdmVybGF5T3JpZ2luXCIgY2RrT3ZlcmxheU9yaWdpbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicnB0LWNvbWJvYm94LXRyaWdnZXJcIlxuICAgICAgICAgICAgW2lkXT1cImVsZW1lbnRJZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ycHQtaW52YWxpZF09XCJpc0ludmFsaWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuaXMtb3Blbl09XCJpc09wZW4oKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybUNvbnRyb2woKS5kaXNhYmxlZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbigpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2xpc3Rib3gnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVPcGVuKCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25UcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRyaWdnZXItbGFiZWxcIiBbY2xhc3MuaXMtcGxhY2Vob2xkZXJdPVwiIXNlbGVjdGVkT3B0aW9uKClcIj5cbiAgICAgICAgICAgICAge3sgc2VsZWN0ZWRPcHRpb24oKSA/IHNlbGVjdGVkT3B0aW9uKCkhLmxhYmVsIDogcGxhY2Vob2xkZXIoKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJpZ2dlci1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIEBpZiAoaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3QgZG90LXB1bHNlXCIgc3R5bGU9XCJjb2xvcjogIzI1NjNlYjsgbWFyZ2luLXJpZ2h0OiA0cHg7XCIgdGl0bGU9XCJFeGVjdXRpbmcgcXVlcnkgb24gZGF0YWJhc2UuLi5cIj48L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChsb2FkRXJyb3IoKSAmJiAhaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJpZ2dlci1yZXRyeS1idG5cIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJSZXRyeSBkYXRhYmFzZSBxdWVyeVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmV0cnkgZGF0YWJhc2UgcXVlcnlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJldHJ5TG9va3VwKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIOKGuyBSZXRyeVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRPcHRpb24oKSAmJiAhZm9ybUNvbnRyb2woKS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRyaWdnZXItY2xlYXItYnRuXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQ2xlYXIgc2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhciBzZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2xlYXJTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJjbGVhclNlbGVjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICDinJVcbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cmlnZ2VyLWFycm93XCIgW2NsYXNzLnJvdGF0ZWRdPVwiaXNPcGVuKClcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCAxMiA4XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMSAxLjVMNiA2LjVMMTEgMS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cImNvbWJvYm94T3JpZ2luXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuKClcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cIm92ZXJsYXlQb3NpdGlvbnNcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5V2lkdGhdPVwidHJpZ2dlcldpZHRoKClcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5RmxleGlibGVEaW1lbnNpb25zXT1cInRydWVcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5Vmlld3BvcnRNYXJnaW5dPVwiOFwiXG4gICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQdXNoXT1cInRydWVcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3ldPVwic2Nyb2xsU3RyYXRlZ3lcIlxuICAgICAgICAgIChvdmVybGF5T3V0c2lkZUNsaWNrKT1cImNsb3NlRHJvcGRvd24oKVwiXG4gICAgICAgICAgKHBvc2l0aW9uQ2hhbmdlKT1cIm9uUG9zaXRpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgKGF0dGFjaCk9XCJvbk92ZXJsYXlBdHRhY2hlZCgpXCJcbiAgICAgICAgICAoZGV0YWNoKT1cImNsb3NlRHJvcGRvd24oKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInJwdC1jb21ib2JveC1tZW51XCJcbiAgICAgICAgICAgIFtjbGFzcy5vcGVucy1hYm92ZV09XCJvcGVuc0Fib3ZlKClcIlxuICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPCEtLSBSZWFsLXRpbWUgRmlsdGVyIFNlYXJjaCBCb3ggLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtc2VhcmNoLWJveFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbWJvYm94LXNlYXJjaC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cbiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiOFwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICAgICAgPGxpbmUgeDE9XCIyMVwiIHkxPVwiMjFcIiB4Mj1cIjE2LjY1XCIgeTI9XCIxNi42NVwiPjwvbGluZT5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjb21ib2JveC1zZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSB0byBmaWx0ZXIuLi5cIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXJtKClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJmb2N1c2VkSW5kZXgoKSA+PSAwID8gKGVsZW1lbnRJZCgpICsgJ19vcHRfJyArIGZvY3VzZWRJbmRleCgpKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvblNlYXJjaElucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uU2VhcmNoS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgQGlmIChzZWFyY2hUZXJtKCkpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29tYm9ib3gtc2VhcmNoLWNsZWFyXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQ2xlYXIgZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICDinJVcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gRmlsdGVyZWQgT3B0aW9ucyBMaXN0IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvYm94LW9wdGlvbnMtbGlzdFwiICNvcHRpb25zTGlzdEVsIChzY3JvbGwpPVwib25PcHRpb25zU2Nyb2xsKCRldmVudClcIj5cbiAgICAgICAgICAgICAgQGlmICh3YWl0aW5nRm9yKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1zdGF0dXMtcm93IHdhaXRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPldhaXRpbmcgZm9yIHt7IHdhaXRpbmdMYWJlbCgpIH19Li4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChpc0xvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1zdGF0dXMtcm93IGxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBkb3QtcHVsc2VcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5FeGVjdXRpbmcgcXVlcnkgb24gZGF0YWJhc2UgKG1heSB0YWtlIDHigJMyIG1pbnV0ZXMgb24gbG9jYWwgZGF0YWJhc2UpLi4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChsb2FkRXJyb3IoKSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1zdGF0dXMtcm93IGVycm9yXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5FcnJvcjoge3sgbG9hZEVycm9yKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNvbWJvYm94LXJldHJ5LWJ0blwiIChjbGljayk9XCJyZXRyeUxvb2t1cCgkZXZlbnQpXCI+4oa7IFJldHJ5IFF1ZXJ5PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGlzRHluYW1pY1NvdXJjZSgpICYmIGhhc0xvYWRlZCgpICYmIGFsbE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtc3RhdHVzLXJvdyBlbXB0eVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+Tm8gcmVjb3JkcyBmb3VuZCAoY2hlY2sgcGFyYW1ldGVycyk8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1zdGF0dXMtcm93IGVtcHR5XCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5ObyBvcHRpb25zIG1hdGNoaW5nIFwie3sgc2VhcmNoVGVybSgpIH19XCI8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIEBmb3IgKG9wdCBvZiB2aXNpYmxlRmlsdGVyZWRPcHRpb25zKCk7IHRyYWNrIG9wdC5rZXk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZWxlbWVudElkKCkgKyAnX29wdF8nICsgaVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29tYm9ib3gtb3B0aW9uLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChvcHQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWZvY3VzZWRdPVwiZm9jdXNlZEluZGV4KCkgPT09IGlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RPcHRpb24ob3B0KVwiXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImZvY3VzZWRJbmRleC5zZXQoaSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdC1sYWJlbFwiPnt7IG9wdC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpc1NlbGVjdGVkKG9wdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdC1jaGVja1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPuKckzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoZXhjZXNzRmlsdGVyZWRDb3VudCgpID4gMCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvYm94LXN0YXR1cy1yb3cgaGludFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TaG93aW5nIHt7IHZpc2libGVGaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggfX0gb2Yge3sgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIH19IG1hdGNoZXMuIFNjcm9sbCBkb3duIG9yPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb21ib2JveC1sb2FkLWFsbC1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJsb2FkQWxsRmlsdGVyZWQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBMb2FkIGFsbCB7eyBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDwhLS0gTmF0aXZlIEJyb3dzZXIgU2VsZWN0IEZhbGxiYWNrIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgW2lkXT1cImVsZW1lbnRJZCgpXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ycHQtaW52YWxpZF09XCJpc0ludmFsaWQoKVwiXG4gICAgICAgICAgICBjbGFzcz1cInJwdC1zZWxlY3RcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAod2FpdGluZ0ZvcigpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIGRpc2FibGVkIHNlbGVjdGVkPldhaXRpbmcgZm9yIHt7IHdhaXRpbmdMYWJlbCgpIH19Li4uPC9vcHRpb24+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChpc0xvYWRpbmcoKSkge1xuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgZGlzYWJsZWQgc2VsZWN0ZWQ+TG9hZGluZyBvcHRpb25zIGZyb20gZGF0YWJhc2UuLi48L29wdGlvbj5cbiAgICAgICAgICAgIH0gQGVsc2UgaWYgKGxvYWRFcnJvcigpKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBkaXNhYmxlZCBzZWxlY3RlZD5FcnJvcjoge3sgbG9hZEVycm9yKCkgfX08L29wdGlvbj5cbiAgICAgICAgICAgIH0gQGVsc2UgaWYgKGlzRHluYW1pY1NvdXJjZSgpICYmIGhhc0xvYWRlZCgpICYmIGFsbE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIGRpc2FibGVkIHNlbGVjdGVkPi0tIE5vIHJlY29yZHMgZm91bmQgKGNoZWNrIHBhcmFtZXRlcnMpIC0tPC9vcHRpb24+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChwbGFjZWhvbGRlcigpKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBbZGlzYWJsZWRdPVwiY29uZmlnKCkudmFsaWRhdGlvbj8ucmVxdWlyZWRcIj57eyBwbGFjZWhvbGRlcigpIH19PC9vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZm9yIChvcHQgb2YgcmVuZGVyZWRPcHRpb25zKCk7IHRyYWNrIG9wdC5rZXkpIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwib3B0LmtleVwiPnt7IG9wdC5sYWJlbCB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChoYXNFeGNlc3NPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIGRpc2FibGVkPi4uLiBhbmQge3sgZXhjZXNzT3B0aW9uc0NvdW50KCkgfX0gbW9yZSByZWNvcmRzIChyZWZpbmUgZmlsdGVyKSAuLi48L29wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNlbGVjdC1hcnJvd1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgMTIgOFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMSAxLjVMNiA2LjVMMTEgMS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKHNob3dTdGF0dXMoKSAmJiBpc0R5bmFtaWNTb3VyY2UoKSAmJiBzdGF0dXNUZXh0KCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zdGF0dXMtYmFkZ2VcIiBbYXR0ci5kYXRhLXN0YXR1c109XCJzdGF0dXNLaW5kKClcIj5cbiAgICAgICAgICBAc3dpdGNoIChzdGF0dXNLaW5kKCkpIHtcbiAgICAgICAgICAgIEBjYXNlICgnbG9hZGluZycpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90IGRvdC1wdWxzZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4+TG9hZGluZyBmcm9tIGRhdGFiYXNl4oCmPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdvaycpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90IGRvdC1va1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgZHluYW1pY09wdGlvbnMoKS5sZW5ndGggfX0gcmVjb3JkcyBsb2FkZWQ8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ3dhaXRpbmcnKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBkb3Qtd2FyblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4+V2FpdGluZyBmb3I6PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FpdGluZy10b2tlbnNcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChrIG9mIHdhaXRpbmdGb3IoKTsgdHJhY2sgaykge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ3YWl0aW5nLXRva2VuXCI+e3sgayB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdlcnJvcicpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90IGRvdC1lcnJcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGxvYWRFcnJvcigpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwdC1iYWRnZS1yZXRyeS1idG5cIiAoY2xpY2spPVwicmV0cnlMb29rdXAoJGV2ZW50KVwiPuKGuyBSZXRyeTwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdlbXB0eScpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj5ObyByZWNvcmRzIGZvdW5kIGZvciBwYXJhbWV0ZXJzPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmIChlcnJvck1lc3NhZ2UoKSkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1lcnJvci10ZXh0XCI+e3sgZXJyb3JNZXNzYWdlKCkgfX08L3NwYW4+XG4gICAgICB9XG4gICAgPC9kaXY+Il19
|
|
542
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9kcm9wZG93bi9ycHQtZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvcHJpbWl0aXZlcy9jb21wb25lbnRzL2Ryb3Bkb3duL3JwdC1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFHTCxPQUFPLEVBQ1AsYUFBYSxHQUVkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFnQixVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRS9FLE9B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LENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSw0QkFBNEIsQ0FBQyxDQUFDO2dCQUNuRSxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7d0dBN2pCVSxvQkFBb0I7NEZBQXBCLG9CQUFvQiw4cUNDdERqQywybldBMFBVLHMyUkQ3TUUsbUJBQW1CLG90QkFBRSxhQUFhOzs0RkFTakMsb0JBQW9CO2tCQVpoQyxTQUFTOytCQUNFLGNBQWMsY0FDWixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLENBQUMsUUFDdkM7d0JBQ0osaUJBQWlCLEVBQUUsVUFBVTt3QkFDN0IscUJBQXFCLEVBQUUsY0FBYztxQkFDdEMsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU07d0RBd08vQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVTFDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBDb25uZWN0ZWRQb3NpdGlvbixcbiAgQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLFxuICBPdmVybGF5LFxuICBPdmVybGF5TW9kdWxlLFxuICBTY3JvbGxTdHJhdGVneSxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0aW1lb3V0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdGlvbk1lc3NhZ2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1mYWN0b3J5JztcbmltcG9ydCB7IE1hc3RlckRhdGFQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9tYXN0ZXItZGF0YS5wcm92aWRlcic7XG5pbXBvcnQgeyBSZXBvcnRMb29rdXBBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL2xvb2t1cC5jb250cmFjdCc7XG5pbXBvcnQgeyBSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBSRVBPUlRJTkdfQ09ORklHIH0gZnJvbSAnLi4vLi4vLi4vY29yZS90b2tlbnMvcmVwb3J0aW5nLWNvbmZpZy50b2tlbic7XG5pbXBvcnQgeyBTZXNzaW9uQ29udGV4dE1hcCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdG9rZW5zL3Nlc3Npb24tY29udGV4dC50b2tlbic7XG5pbXBvcnQge1xuICBmaW5kTWlzc2luZ0NhbnZhc0ZpZWxkcyxcbiAgcmVzb2x2ZVBhcmFtZXRlck1hcHBpbmdzLFxufSBmcm9tICcuLi8uLi8uLi9jb3JlL3V0aWxzL3JlcG9ydC1wYXJhbWV0ZXIudXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcGRvd25PcHRpb24ge1xuICBrZXk6IHN0cmluZyB8IG51bWJlcjtcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LWRyb3Bkb3duJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGUsIE92ZXJsYXlNb2R1bGVdLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5pcy1vcGVuXSc6ICdpc09wZW4oKScsXG4gICAgJ1tjbGFzcy5vcGVucy1hYm92ZV0nOiAnb3BlbnNBYm92ZSgpJyxcbiAgfSxcbiAgdGVtcGxhdGVVcmw6ICcuL3JwdC1kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9ycHQtZHJvcGRvd24uY29tcG9uZW50LmNzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBScHREcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFzdGVyRGF0YVByb3ZpZGVyID0gaW5qZWN0KE1hc3RlckRhdGFQcm92aWRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb29rdXBBZGFwdGVyID0gaW5qZWN0KFJlcG9ydExvb2t1cEFkYXB0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0aW5nQ29uZmlnID0gaW5qZWN0KFJFUE9SVElOR19DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheSA9IGluamVjdChPdmVybGF5KTtcblxuICByZWFkb25seSBzY3JvbGxTdHJhdGVneTogU2Nyb2xsU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCk7XG4gIHJlYWRvbmx5IHRyaWdnZXJXaWR0aCA9IHNpZ25hbDxudW1iZXIgfCBzdHJpbmc+KCdhdXRvJyk7XG5cbiAgcmVhZG9ubHkgb3ZlcmxheVBvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgIG9mZnNldFk6IDQsXG4gICAgfSxcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICAgIG9mZnNldFk6IC00LFxuICAgIH0sXG4gICAge1xuICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgIG92ZXJsYXlYOiAnZW5kJyxcbiAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgIG9mZnNldFk6IDQsXG4gICAgfSxcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgb2Zmc2V0WTogLTQsXG4gICAgfSxcbiAgXTtcblxuICByZWFkb25seSBjb25maWcgPSBpbnB1dC5yZXF1aXJlZDxSZXBvcnRDb21wb25lbnREZWZpbml0aW9uPigpO1xuICByZWFkb25seSBjb250cm9sID0gaW5wdXQ8Rm9ybUNvbnRyb2wgfCBudWxsIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBwYXJlbnRGb3JtID0gaW5wdXQ8Rm9ybUdyb3VwIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBEZXNpZ25lciBtb2RlOiBzaG93cyBhIHNtYWxsIHN0YXR1cyBsaW5lIChMb2FkaW5nIC8gTiByZWNvcmRzIC8gV2FpdGluZyBmb3LigKYpLiAqL1xuICByZWFkb25seSBzaG93U3RhdHVzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBkcm9wZG93bkNsaWNrID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBmYWxsYmFja0NvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICByZWFkb25seSBkeW5hbWljT3B0aW9ucyA9IHNpZ25hbDxEcm9wZG93bk9wdGlvbltdPihbXSk7XG4gIHByaXZhdGUgbG9va3VwU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIG1hc3RlckRhdGFTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZm9ybUNoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcmVsb2FkVGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBsYXN0UmVxdWVzdEtleSA9ICcnO1xuXG4gIC8vIENvbWJvYm94IGludGVyYWN0aXZlIHN0YXRlXG4gIHJlYWRvbmx5IGlzT3BlbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IG9wZW5zQWJvdmUgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzZWFyY2hUZXJtID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICByZWFkb25seSBmb2N1c2VkSW5kZXggPSBzaWduYWw8bnVtYmVyPigtMSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRWYWx1ZSA9IHNpZ25hbDx1bmtub3duPihudWxsKTtcbiAgcmVhZG9ubHkgY29tYm9ib3hXcmFwcGVyRWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCdjb21ib2JveFdyYXBwZXInKTtcbiAgcmVhZG9ubHkgc2VhcmNoSW5wdXRFbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+Pignc2VhcmNoSW5wdXQnKTtcbiAgcmVhZG9ubHkgb3B0aW9uc0xpc3RFbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ29wdGlvbnNMaXN0RWwnKTtcblxuICBwcml2YXRlIGNvbnRyb2xTdWI/OiBTdWJzY3JpcHRpb247XG5cbiAgcmVhZG9ubHkgZm9ybUNvbnRyb2wgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbnRyb2woKSA/PyB0aGlzLmZhbGxiYWNrQ29udHJvbCk7XG4gIHJlYWRvbmx5IGVsZW1lbnRJZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29uZmlnKCkua2V5IHx8IHRoaXMuY29uZmlnKCkuaWQpO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGNvbXB1dGVkKFxuICAgICgpID0+ICh0aGlzLmNvbmZpZygpLnByb3BlcnRpZXM/LlsncGxhY2Vob2xkZXInXSBhcyBzdHJpbmcpID8/ICctLSBTZWxlY3QgLS0nXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNTZWFyY2hhYmxlID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5jb25maWcoKS5wcm9wZXJ0aWVzPy5bJ25hdGl2ZVNlbGVjdCddICE9PSB0cnVlXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNMb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgaGFzTG9hZGVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZEVycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICAvKiogQ2FudmFzIGZpZWxkIGtleXMgdGhhdCBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgdGhlIGxvb2t1cCBjYW4gcnVuLiAqL1xuICByZWFkb25seSB3YWl0aW5nRm9yID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG5cbiAgcmVhZG9ubHkgaXNEeW5hbWljU291cmNlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGRzID0gdGhpcy5jb25maWcoKS5kYXRhU291cmNlO1xuICAgIHJldHVybiAhIShcbiAgICAgIGRzICYmXG4gICAgICAoZHMuc291cmNlVHlwZSA9PT0gJ3RhYmxlJyB8fFxuICAgICAgICBkcy5zb3VyY2VUeXBlID09PSAncHJvY2VkdXJlJyB8fFxuICAgICAgICBkcy5zb3VyY2VUeXBlID09PSAnYXBpJyB8fFxuICAgICAgICBkcy5hcGlFbmRwb2ludCB8fFxuICAgICAgICBkcy5lbnRpdHlOYW1lIHx8XG4gICAgICAgIGRzLm1hc3Rlck5hbWUpXG4gICAgKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc3RhdGljT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duT3B0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5jb25maWcoKS5wcm9wZXJ0aWVzPy5bJ29wdGlvbnMnXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRzKSkge1xuICAgICAgcmV0dXJuIG9wdHM7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYWxsT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duT3B0aW9uW10+KCgpID0+IHtcbiAgICBpZiAodGhpcy5pc0R5bmFtaWNTb3VyY2UoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZHluYW1pY09wdGlvbnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhdGljT3B0aW9ucygpO1xuICB9KTtcblxuICByZWFkb25seSBzZWxlY3RlZE9wdGlvbiA9IGNvbXB1dGVkPERyb3Bkb3duT3B0aW9uIHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuY3VycmVudFZhbHVlKCk7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09ICcnKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzdHJWYWwgPSBTdHJpbmcodmFsKTtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuYWxsT3B0aW9ucygpLmZpbmQoKG9wdCkgPT4gU3RyaW5nKG9wdC5rZXkpID09PSBzdHJWYWwpO1xuICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgIHJldHVybiB7IGtleTogdmFsIGFzIHN0cmluZyB8IG51bWJlciwgbGFiZWw6IHN0clZhbCB9O1xuICB9KTtcblxuICByZWFkb25seSBmaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZDxEcm9wZG93bk9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgdGVybSA9IHRoaXMuc2VhcmNoVGVybSgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGFsbCA9IHRoaXMuYWxsT3B0aW9ucygpO1xuICAgIGlmICghdGVybSkgcmV0dXJuIGFsbDtcbiAgICByZXR1cm4gYWxsLmZpbHRlcigob3B0KSA9PlxuICAgICAgb3B0LmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkgfHwgU3RyaW5nKG9wdC5rZXkpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSlcbiAgICApO1xuICB9KTtcblxuICByZWFkb25seSBNQVhfRklMVEVSX1JFTkRFUiA9IDIwMDtcbiAgcmVhZG9ubHkgSU5JVElBTF9GSUxURVJfUkVOREVSID0gMjAwO1xuICByZWFkb25seSBmaWx0ZXJSZW5kZXJMaW1pdCA9IHNpZ25hbDxudW1iZXI+KDIwMCk7XG5cbiAgcmVhZG9ubHkgdmlzaWJsZUZpbHRlcmVkT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duT3B0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCk7XG4gICAgY29uc3QgbGltaXQgPSB0aGlzLmZpbHRlclJlbmRlckxpbWl0KCk7XG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA8PSBsaW1pdCkgcmV0dXJuIGZpbHRlcmVkO1xuICAgIHJldHVybiBmaWx0ZXJlZC5zbGljZSgwLCBsaW1pdCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGV4Y2Vzc0ZpbHRlcmVkQ291bnQgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggLSB0aGlzLmZpbHRlclJlbmRlckxpbWl0KCkpO1xuICB9KTtcblxuICBvbk9wdGlvbnNTY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmIChlbC5zY3JvbGxUb3AgKyBlbC5jbGllbnRIZWlnaHQgPj0gZWwuc2Nyb2xsSGVpZ2h0IC0gMTIwKSB7XG4gICAgICB0aGlzLmxvYWRNb3JlRmlsdGVyZWQoKTtcbiAgICB9XG4gIH1cblxuICBsb2FkTW9yZUZpbHRlcmVkKCk6IHZvaWQge1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGg7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZmlsdGVyUmVuZGVyTGltaXQoKTtcbiAgICBpZiAoY3VycmVudCA8IHRvdGFsKSB7XG4gICAgICB0aGlzLmZpbHRlclJlbmRlckxpbWl0LnVwZGF0ZSgoYykgPT4gTWF0aC5taW4odG90YWwsIGMgKyAyMDApKTtcbiAgICB9XG4gIH1cblxuICBsb2FkQWxsRmlsdGVyZWQoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJSZW5kZXJMaW1pdC5zZXQodGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGgpO1xuICB9XG5cbiAgcmVhZG9ubHkgTUFYX1JFTkRFUkVEX09QVElPTlMgPSA1MDAwO1xuICByZWFkb25seSByZW5kZXJlZE9wdGlvbnMgPSBjb21wdXRlZDxEcm9wZG93bk9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMuYWxsT3B0aW9ucygpO1xuICAgIGlmIChvcHRzLmxlbmd0aCA8PSB0aGlzLk1BWF9SRU5ERVJFRF9PUFRJT05TKSByZXR1cm4gb3B0cztcbiAgICByZXR1cm4gb3B0cy5zbGljZSgwLCB0aGlzLk1BWF9SRU5ERVJFRF9PUFRJT05TKTtcbiAgfSk7XG4gIHJlYWRvbmx5IGhhc0V4Y2Vzc09wdGlvbnMgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYWxsT3B0aW9ucygpLmxlbmd0aCA+IHRoaXMuTUFYX1JFTkRFUkVEX09QVElPTlM7XG4gIH0pO1xuICByZWFkb25seSBleGNlc3NPcHRpb25zQ291bnQgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgdGhpcy5hbGxPcHRpb25zKCkubGVuZ3RoIC0gdGhpcy5NQVhfUkVOREVSRURfT1BUSU9OUyk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHdhaXRpbmdMYWJlbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBrZXlzID0gdGhpcy53YWl0aW5nRm9yKCk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGtleXMuam9pbignLCAnKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc3RhdHVzS2luZCA9IGNvbXB1dGVkPCdpZGxlJyB8ICdsb2FkaW5nJyB8ICdvaycgfCAnd2FpdGluZycgfCAnZXJyb3InIHwgJ2VtcHR5Jz4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc0R5bmFtaWNTb3VyY2UoKSkgcmV0dXJuICdpZGxlJztcbiAgICBpZiAodGhpcy5pc0xvYWRpbmcoKSkgcmV0dXJuICdsb2FkaW5nJztcbiAgICBpZiAodGhpcy5sb2FkRXJyb3IoKSkgcmV0dXJuICdlcnJvcic7XG4gICAgaWYgKHRoaXMud2FpdGluZ0ZvcigpLmxlbmd0aCA+IDApIHJldHVybiAnd2FpdGluZyc7XG4gICAgaWYgKHRoaXMuaGFzTG9hZGVkKCkpIHJldHVybiB0aGlzLmR5bmFtaWNPcHRpb25zKCkubGVuZ3RoID4gMCA/ICdvaycgOiAnZW1wdHknO1xuICAgIHJldHVybiAnaWRsZSc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHN0YXR1c1RleHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgc3dpdGNoICh0aGlzLnN0YXR1c0tpbmQoKSkge1xuICAgICAgY2FzZSAnbG9hZGluZyc6XG4gICAgICAgIHJldHVybiAodGhpcy5jb25maWcoKS5kYXRhU291cmNlPy5zb3VyY2VUeXBlID09PSAnYXBpJyB8fCB0aGlzLmNvbmZpZygpLmRhdGFTb3VyY2U/LmFwaUVuZHBvaW50KVxuICAgICAgICAgID8gJ0xvYWRpbmcgZnJvbSBBUEnigKYnXG4gICAgICAgICAgOiAnTG9hZGluZyBmcm9tIGRhdGFiYXNl4oCmJztcbiAgICAgIGNhc2UgJ29rJzpcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZHluYW1pY09wdGlvbnMoKS5sZW5ndGh9IHJlY29yZHMgbG9hZGVkYDtcbiAgICAgIGNhc2UgJ3dhaXRpbmcnOlxuICAgICAgICByZXR1cm4gYFdhaXRpbmcgZm9yOiAke3RoaXMud2FpdGluZ0xhYmVsKCl9YDtcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZEVycm9yKCkgPz8gJ0ZhaWxlZCB0byBsb2FkJztcbiAgICAgIGNhc2UgJ2VtcHR5JzpcbiAgICAgICAgcmV0dXJuICdRdWVyeSByZXR1cm5lZCBubyByZWNvcmRzIGZvciB0aGVzZSBwYXJhbWV0ZXJzJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGlzSW52YWxpZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjdHJsID0gdGhpcy5mb3JtQ29udHJvbCgpO1xuICAgIHJldHVybiBjdHJsLmludmFsaWQgJiYgKGN0cmwuZGlydHkgfHwgY3RybC50b3VjaGVkKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZXJyb3JNZXNzYWdlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmZvcm1Db250cm9sKCk7XG4gICAgaWYgKCFjdHJsLmludmFsaWQgfHwgKCFjdHJsLmRpcnR5ICYmICFjdHJsLnRvdWNoZWQpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IGVycm9ycyA9IGN0cmwuZXJyb3JzO1xuICAgIGlmICghZXJyb3JzKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZmlyc3RLZXkgPSBPYmplY3Qua2V5cyhlcnJvcnMpWzBdO1xuICAgIHJldHVybiBnZXRWYWxpZGF0aW9uTWVzc2FnZSh0aGlzLmNvbmZpZygpLnZhbGlkYXRpb24sIGZpcnN0S2V5KTtcbiAgfSk7XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgTm9kZTtcbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgb25Fc2NhcGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgIH1cbiAgfVxuXG4gIGlzU2VsZWN0ZWQob3B0OiBEcm9wZG93bk9wdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuY3VycmVudFZhbHVlKCk7XG4gICAgaWYgKGN1ciA9PT0gbnVsbCB8fCBjdXIgPT09IHVuZGVmaW5lZCB8fCBjdXIgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIFN0cmluZyhjdXIpID09PSBTdHJpbmcob3B0LmtleSk7XG4gIH1cblxuICB0b2dnbGVPcGVuKGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmRyb3Bkb3duQ2xpY2suZW1pdCgpO1xuICAgIGlmICh0aGlzLmZvcm1Db250cm9sKCkuZGlzYWJsZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3BlbkRyb3Bkb3duKCk7XG4gICAgfVxuICB9XG5cbiAgb3BlbkRyb3Bkb3duKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm1Db250cm9sKCkuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmNvbWJvYm94V3JhcHBlckVsKCk/Lm5hdGl2ZUVsZW1lbnQgPz8gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgcmVjdCA9IHdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKHJlY3Qud2lkdGggPiAwKSB7XG4gICAgICB0aGlzLnRyaWdnZXJXaWR0aC5zZXQocmVjdC53aWR0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmVyQWJvdmUgPSB0aGlzLmNvbmZpZygpPy5wcm9wZXJ0aWVzPy5bJ29wZW5BYm92ZSddID09PSB0cnVlO1xuICAgIGlmIChwcmVmZXJBYm92ZSkge1xuICAgICAgdGhpcy5vcGVuc0Fib3ZlLnNldCh0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCgnJyk7XG4gICAgdGhpcy5maWx0ZXJSZW5kZXJMaW1pdC5zZXQodGhpcy5JTklUSUFMX0ZJTFRFUl9SRU5ERVIpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gIH1cblxuICBvblBvc2l0aW9uQ2hhbmdlKGNoYW5nZTogQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuc0Fib3ZlLnNldChjaGFuZ2UuY29ubmVjdGlvblBhaXIub3JpZ2luWSA9PT0gJ3RvcCcpO1xuICB9XG5cbiAgb25PdmVybGF5QXR0YWNoZWQoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlYXJjaElucHV0RWwoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH0sIDI1KTtcbiAgfVxuXG4gIGNsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2woKS5tYXJrQXNUb3VjaGVkKCk7XG4gIH1cblxuICBzZWxlY3RPcHRpb24ob3B0OiBEcm9wZG93bk9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFZhbHVlLnNldChvcHQua2V5KTtcbiAgICB0aGlzLmZvcm1Db250cm9sKCkuc2V0VmFsdWUob3B0LmtleSk7XG4gICAgdGhpcy5mb3JtQ29udHJvbCgpLm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5mb3JtQ29udHJvbCgpLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5jdXJyZW50VmFsdWUuc2V0KCcnKTtcbiAgICB0aGlzLmZvcm1Db250cm9sKCkuc2V0VmFsdWUoJycpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2woKS5tYXJrQXNEaXJ0eSgpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2woKS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCgnJyk7XG4gICAgdGhpcy5maWx0ZXJSZW5kZXJMaW1pdC5zZXQodGhpcy5JTklUSUFMX0ZJTFRFUl9SRU5ERVIpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gIH1cblxuICAvKiogTWFudWFsbHkgcmV0cnkgbG9hZGluZyBkeW5hbWljIGxvb2t1cCBvcHRpb25zIChlLmcuIGFmdGVyIGRhdGFiYXNlIHRpbWVvdXQpLiAqL1xuICByZXRyeUxvb2t1cChldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIHRoaXMubGFzdFJlcXVlc3RLZXkgPSAnJztcbiAgICB0aGlzLmxvYWRFcnJvci5zZXQobnVsbCk7XG4gICAgdGhpcy5yZWxvYWREYXRhU291cmNlT3B0aW9ucyh0aGlzLnNlc3Npb25TZXJ2aWNlPy5zZXNzaW9uQ29udGV4dCgpID8/IHt9KTtcbiAgfVxuXG4gIGNsZWFyU2VhcmNoKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc2VhcmNoVGVybS5zZXQoJycpO1xuICAgIHRoaXMuZmlsdGVyUmVuZGVyTGltaXQuc2V0KHRoaXMuSU5JVElBTF9GSUxURVJfUkVOREVSKTtcbiAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICAgIHRoaXMuc2VhcmNoSW5wdXRFbCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBvblNlYXJjaElucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCh2YWwpO1xuICAgIHRoaXMuZmlsdGVyUmVuZGVyTGltaXQuc2V0KHRoaXMuSU5JVElBTF9GSUxURVJfUkVOREVSKTtcbiAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoMCk7XG4gIH1cblxuICBvblRyaWdnZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgfHwgZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5vcGVuRHJvcGRvd24oKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy52aXNpYmxlRmlsdGVyZWRPcHRpb25zKCk7XG4gICAgY29uc3QgY291bnQgPSB2aXNpYmxlLmxlbmd0aDtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gKHRoaXMuZm9jdXNlZEluZGV4KCkgKyAxKSAlIGNvdW50O1xuICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChuZXh0KTtcbiAgICAgICAgICB0aGlzLnNjcm9sbEZvY3VzZWRJbnRvVmlldygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLmZvY3VzZWRJbmRleCgpIDw9IDAgPyBjb3VudCAtIDEgOiB0aGlzLmZvY3VzZWRJbmRleCgpIC0gMTtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQocHJldik7XG4gICAgICAgICAgdGhpcy5zY3JvbGxGb2N1c2VkSW50b1ZpZXcoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VudGVyJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDwgY291bnQpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdE9wdGlvbih2aXNpYmxlW2lkeF0pO1xuICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RPcHRpb24odmlzaWJsZVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdFc2NhcGUnOiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1RhYic6IHtcbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsRm9jdXNlZEludG9WaWV3KCk6IHZvaWQge1xuICAgIGNvbnN0IGxpc3RFbCA9IHRoaXMub3B0aW9uc0xpc3RFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghbGlzdEVsKSByZXR1cm47XG4gICAgY29uc3QgaXRlbXMgPSBsaXN0RWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5jb21ib2JveC1vcHRpb24taXRlbScpO1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgaWYgKGl0ZW1zICYmIGl0ZW1zW2lkeF0pIHtcbiAgICAgIGl0ZW1zW2lkeF0uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFN5bmMgcmVhY3RpdmUgZm9ybSBjb250cm9sIHZhbHVlIGNoYW5nZXMgdG8gY3VycmVudFZhbHVlIHNpZ25hbFxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybUNvbnRyb2woKTtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuY3VycmVudFZhbHVlLnNldChjdHJsLnZhbHVlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sU3ViID0gY3RybC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2KSA9PiB0aGlzLmN1cnJlbnRWYWx1ZS5zZXQodikpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG5cbiAgICAvLyBSZS1ydW4gd2hlbmV2ZXIgdGhlIGJvdW5kIGRhdGEgc291cmNlLCB0aGUgc2Vzc2lvbiwgb3IgdGhlIHBhcmVudCBmb3JtIGNoYW5nZXMuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9uU2VydmljZT8uc2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMucGFyZW50Rm9ybSgpO1xuICAgICAgICB0aGlzLmNvbmZpZygpOyAvLyBkZXBlbmRlbmN5OiBkYXRhIHNvdXJjZSBjb25maWd1cmF0aW9uXG5cbiAgICAgICAgdGhpcy5mb3JtQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKGZvcm0gJiYgdGhpcy5pc0R5bmFtaWNTb3VyY2UoKSkge1xuICAgICAgICAgIHRoaXMuZm9ybUNoYW5nZXNTdWIgPSBmb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zY2hlZHVsZVJlbG9hZCgpKTtcbiAgICAgICAgfVxuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5zY2hlZHVsZVJlbG9hZCgpKTtcbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubG9va3VwU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubWFzdGVyRGF0YVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmZvcm1DaGFuZ2VzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIGlmICh0aGlzLnJlbG9hZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRUaW1lcik7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlUmVsb2FkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlbG9hZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRUaW1lcik7XG4gICAgdGhpcy5yZWxvYWRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWxvYWREYXRhU291cmNlT3B0aW9ucyh0aGlzLnNlc3Npb25TZXJ2aWNlPy5zZXNzaW9uQ29udGV4dCgpID8/IHt9KTtcbiAgICB9LCAyNTApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWxvYWREYXRhU291cmNlT3B0aW9ucyhzZXNzaW9uOiBTZXNzaW9uQ29udGV4dE1hcCk6IHZvaWQge1xuICAgIGNvbnN0IGRzID0gdGhpcy5jb25maWcoKS5kYXRhU291cmNlO1xuICAgIGlmICghZHMgfHwgIXRoaXMuaXNEeW5hbWljU291cmNlKCkpIHJldHVybjtcblxuICAgIC8vIDEuIERhdGFiYXNlIFRhYmxlIC8gU3RvcmVkIFByb2NlZHVyZSAvIFJFU1QgQVBJIExvb2t1cFxuICAgIGNvbnN0IGlzQXBpID0gZHMuc291cmNlVHlwZSA9PT0gJ2FwaScgfHwgISFkcy5hcGlFbmRwb2ludDtcbiAgICBjb25zdCBpc0RiTG9va3VwID0gISEoZHMuZW50aXR5TmFtZSAmJiAoZHMuc291cmNlVHlwZSA9PT0gJ3RhYmxlJyB8fCBkcy5zb3VyY2VUeXBlID09PSAncHJvY2VkdXJlJykpO1xuXG4gICAgaWYgKChpc0FwaSB8fCBpc0RiTG9va3VwKSAmJiB0aGlzLmxvb2t1cEFkYXB0ZXIpIHtcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZXMgPSB0aGlzLnBhcmVudEZvcm0oKT8uZ2V0UmF3VmFsdWUoKSA/PyB7fTtcblxuICAgICAgLy8gRG8gbm90IGNhbGwgdW50aWwgZXZlcnkgY2FudmFzIGZpZWxkIHRoaXMgbG9va3VwIGRlcGVuZHMgb24gaXMgZmlsbGVkLlxuICAgICAgY29uc3QgbWlzc2luZyA9IGZpbmRNaXNzaW5nQ2FudmFzRmllbGRzKGRzLnBhcmFtZXRlck1hcHBpbmdzLCBmb3JtVmFsdWVzKTtcbiAgICAgIHRoaXMud2FpdGluZ0Zvci5zZXQobWlzc2luZyk7XG4gICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubG9va3VwU3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmxvYWRFcnJvci5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuZHluYW1pY09wdGlvbnMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5sYXN0UmVxdWVzdEtleSA9ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlZCBwcm9jZWR1cmVzIG9ubHkgcmVjZWl2ZSBleHBsaWNpdCBtYXBwaW5ncyBzbyBTUUwgU2VydmVyIGRvZXNuJ3QgcmVqZWN0IHVua25vd24gYXJndW1lbnRzLlxuICAgICAgY29uc3QgcmVzb2x2ZWRQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAuLi4oZHMuc291cmNlVHlwZSA9PT0gJ3RhYmxlJyA/IHNlc3Npb24gOiB7fSksXG4gICAgICAgIC4uLnJlc29sdmVQYXJhbWV0ZXJNYXBwaW5ncyhkcy5wYXJhbWV0ZXJNYXBwaW5ncywgc2Vzc2lvbiwgZm9ybVZhbHVlcyksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXF1ZXN0OiBhbnkgPSB7XG4gICAgICAgIHNvdXJjZVR5cGU6IGRzLnNvdXJjZVR5cGUgPz8gKGlzQXBpID8gJ2FwaScgOiAndGFibGUnKSxcbiAgICAgICAgZW50aXR5TmFtZTogZHMuZW50aXR5TmFtZSA/PyAoaXNBcGkgPyBkcy5hcGlFbmRwb2ludCA6ICcnKSxcbiAgICAgICAgc2NoZW1hOiBkcy5zY2hlbWEgPz8gJ2RibycsXG4gICAgICAgIHZhbHVlRmllbGQ6IGRzLnZhbHVlRmllbGQ/LnRyaW0oKSB8fCAnJyxcbiAgICAgICAgZGlzcGxheUZpZWxkOiBkcy5kaXNwbGF5RmllbGQ/LnRyaW0oKSB8fCAnJyxcbiAgICAgICAgZmlsdGVyOiBkcy5maWx0ZXIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHJlc29sdmVkUGFyYW1zLFxuICAgICAgICBhcGlFbmRwb2ludDogZHMuYXBpRW5kcG9pbnQsXG4gICAgICAgIGRhdGFQYXRoOiBkcy5kYXRhUGF0aCxcbiAgICAgICAgdXNlUHJveHk6IGRzLnVzZVByb3h5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlcXVlc3RLZXkgPSBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KTtcbiAgICAgIGlmIChyZXF1ZXN0S2V5ID09PSB0aGlzLmxhc3RSZXF1ZXN0S2V5KSByZXR1cm47IC8vIG5vdGhpbmcgY2hhbmdlZFxuICAgICAgdGhpcy5sYXN0UmVxdWVzdEtleSA9IHJlcXVlc3RLZXk7XG5cbiAgICAgIC8vIFN0b3JlZCBwcm9jZWR1cmVzIG9uIGxvY2FsIGRhdGFiYXNlcyBjYW4gdGFrZSBhIGNvdXBsZSBtaW51dGVzIHRvIGV4ZWN1dGUuXG4gICAgICAvLyBEZWZhdWx0IHRpbWVvdXQgaXMgMzAwLDAwMG1zICg1IG1pbnV0ZXMpLCBjb25maWd1cmFibGUgdmlhIGNvbXBvbmVudCBwcm9wZXJ0aWVzIG9yIHJlcG9ydGluZ0NvbmZpZy5cbiAgICAgIGNvbnN0IHRpbWVvdXRNcyA9XG4gICAgICAgICgoZHMgYXMgYW55KT8udGltZW91dE1zIGFzIG51bWJlcikgfHxcbiAgICAgICAgKHRoaXMuY29uZmlnKCkucHJvcGVydGllcz8uWyd0aW1lb3V0TXMnXSBhcyBudW1iZXIpIHx8XG4gICAgICAgIHRoaXMucmVwb3J0aW5nQ29uZmlnPy5sb29rdXBUaW1lb3V0TXMgfHxcbiAgICAgICAgMzAwMDAwO1xuXG4gICAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWRFcnJvci5zZXQobnVsbCk7XG4gICAgICB0aGlzLmxvb2t1cFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMubG9va3VwU3ViID0gdGhpcy5sb29rdXBBZGFwdGVyXG4gICAgICAgIC5mZXRjaE9wdGlvbnMocmVxdWVzdClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGltZW91dCh7XG4gICAgICAgICAgICBlYWNoOiB0aW1lb3V0TXMsXG4gICAgICAgICAgICB3aXRoOiAoKSA9PlxuICAgICAgICAgICAgICB0aHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBMb29rdXAgcXVlcnkgdGltZWQgb3V0IGFmdGVyICR7TWF0aC5yb3VuZCh0aW1lb3V0TXMgLyAxMDAwKX1zIChzdG9yZWQgcHJvY2VkdXJlIHRvb2sgdG9vIGxvbmcgdG8gcmVzcG9uZCBvbiBsb2NhbCBkYXRhYmFzZSlgXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmhhc0xvYWRlZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgLy8gRGVkdXBsaWNhdGUgaXRlbXMgYnkga2V5L3ZhbHVlIHRvIGVuc3VyZSBjbGVhbiBzZWxlY3Qgb3B0aW9uc1xuICAgICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICBjb25zdCBkZWR1cGVkOiBEcm9wZG93bk9wdGlvbltdID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBpdCBvZiBpdGVtcykge1xuICAgICAgICAgICAgY29uc3QgayA9IFN0cmluZyhpdC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIXNlZW4uaGFzKGspKSB7XG4gICAgICAgICAgICAgIHNlZW4uYWRkKGspO1xuICAgICAgICAgICAgICBkZWR1cGVkLnB1c2goeyBrZXk6IGssIGxhYmVsOiBpdC5sYWJlbCB8fCBrIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmR5bmFtaWNPcHRpb25zLnNldChkZWR1cGVkKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbUnB0RHJvcGRvd25dIEZhaWxlZCB0byBsb2FkIGxvb2t1cCBvcHRpb25zIGZvciAke2RzLmVudGl0eU5hbWV9OmAsIGVycik7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmhhc0xvYWRlZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5keW5hbWljT3B0aW9ucy5zZXQoW10pO1xuICAgICAgICAgIHRoaXMubGFzdFJlcXVlc3RLZXkgPSAnJzsgLy8gYWxsb3cgcmV0cnlcbiAgICAgICAgICB0aGlzLmxvYWRFcnJvci5zZXQoZXJyPy5tZXNzYWdlIHx8ICdEYXRhYmFzZSBxdWVyeSBlcnJvcicpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gMi4gTGVnYWN5IE1hc3RlciBEYXRhIFByb3ZpZGVyXG4gICAgaWYgKGRzLm1hc3Rlck5hbWUgJiYgdGhpcy5tYXN0ZXJEYXRhUHJvdmlkZXIgJiYgIXRoaXMubWFzdGVyRGF0YVN1Yikge1xuICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkRXJyb3Iuc2V0KG51bGwpO1xuICAgICAgdGhpcy5tYXN0ZXJEYXRhU3ViID0gdGhpcy5tYXN0ZXJEYXRhUHJvdmlkZXIuZ2V0TWFzdGVyRGF0YShkcy5tYXN0ZXJOYW1lKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoaXRlbXMpID0+IHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuaGFzTG9hZGVkLnNldCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmR5bmFtaWNPcHRpb25zLnNldChcbiAgICAgICAgICAgIGl0ZW1zLm1hcCgoaXQpID0+ICh7XG4gICAgICAgICAgICAgIGtleTogU3RyaW5nKGl0LnZhbHVlID8/IGl0WydpZCddID8/ICcnKSxcbiAgICAgICAgICAgICAgbGFiZWw6IFN0cmluZyhpdC5sYWJlbCA/PyBpdFsnbmFtZSddID8/ICcnKSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW1JwdERyb3Bkb3duXSBGYWlsZWQgdG8gbG9hZCBtYXN0ZXIgZGF0YSBmb3IgJHtkcy5tYXN0ZXJOYW1lfTpgLCBlcnIpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5oYXNMb2FkZWQuc2V0KHRydWUpO1xuICAgICAgICAgIHRoaXMubG9hZEVycm9yLnNldChlcnI/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBsb2FkIG1hc3RlciBkYXRhJyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIiAgICA8ZGl2IGNsYXNzPVwicnB0LWZpZWxkLWdyb3VwXCI+XG4gICAgICBAaWYgKGNvbmZpZygpLmxhYmVsKSB7XG4gICAgICAgIDxsYWJlbCBbZm9yXT1cImVsZW1lbnRJZCgpXCIgY2xhc3M9XCJycHQtbGFiZWxcIj5cbiAgICAgICAgICB7eyBjb25maWcoKS5sYWJlbCB9fVxuICAgICAgICAgIEBpZiAoY29uZmlnKCkudmFsaWRhdGlvbj8ucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXJlcXVpcmVkLW1hcmtlclwiPio8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGlzU2VhcmNoYWJsZSgpKSB7XG4gICAgICAgIDwhLS0gU2VhcmNoYWJsZSBUeXBlYWhlYWQgQ29tYm9ib3ggLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtY29tYm9ib3gtd3JhcHBlclwiICNjb21ib2JveFdyYXBwZXIgI2NvbWJvYm94T3JpZ2luPVwiY2RrT3ZlcmxheU9yaWdpblwiIGNka092ZXJsYXlPcmlnaW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInJwdC1jb21ib2JveC10cmlnZ2VyXCJcbiAgICAgICAgICAgIFtpZF09XCJlbGVtZW50SWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MucnB0LWludmFsaWRdPVwiaXNJbnZhbGlkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmlzLW9wZW5dPVwiaXNPcGVuKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm1Db250cm9sKCkuZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW4oKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidsaXN0Ym94J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3BlbigkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uVHJpZ2dlcktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cmlnZ2VyLWxhYmVsXCIgW2NsYXNzLmlzLXBsYWNlaG9sZGVyXT1cIiFzZWxlY3RlZE9wdGlvbigpXCI+XG4gICAgICAgICAgICAgIHt7IHNlbGVjdGVkT3B0aW9uKCkgPyBzZWxlY3RlZE9wdGlvbigpIS5sYWJlbCA6IHBsYWNlaG9sZGVyKCkgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRyaWdnZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgICBAaWYgKGlzTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90IGRvdC1wdWxzZVwiIHN0eWxlPVwiY29sb3I6ICMyNTYzZWI7IG1hcmdpbi1yaWdodDogNHB4O1wiIHRpdGxlPVwiRXhlY3V0aW5nIHF1ZXJ5IG9uIGRhdGFiYXNlLi4uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAobG9hZEVycm9yKCkgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRyaWdnZXItcmV0cnktYnRuXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiUmV0cnkgZGF0YWJhc2UgcXVlcnlcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJldHJ5IGRhdGFiYXNlIHF1ZXJ5XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXRyeUxvb2t1cCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICDihrsgUmV0cnlcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkT3B0aW9uKCkgJiYgIWZvcm1Db250cm9sKCkuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0cmlnZ2VyLWNsZWFyLWJ0blwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIkNsZWFyIHNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclNlbGVjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNsZWFyU2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiY2xlYXJTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAg4pyVXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJpZ2dlci1hcnJvd1wiIFtjbGFzcy5yb3RhdGVkXT1cImlzT3BlbigpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgMTIgOFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEgMS41TDYgNi41TDExIDEuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJjb21ib2JveE9yaWdpblwiXG4gICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cImlzT3BlbigpXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJvdmVybGF5UG9zaXRpb25zXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVdpZHRoXT1cInRyaWdnZXJXaWR0aCgpXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUZsZXhpYmxlRGltZW5zaW9uc109XCJ0cnVlXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVZpZXdwb3J0TWFyZ2luXT1cIjhcIlxuICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UHVzaF09XCJ0cnVlXCJcbiAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVNjcm9sbFN0cmF0ZWd5XT1cInNjcm9sbFN0cmF0ZWd5XCJcbiAgICAgICAgICAob3ZlcmxheU91dHNpZGVDbGljayk9XCJjbG9zZURyb3Bkb3duKClcIlxuICAgICAgICAgIChwb3NpdGlvbkNoYW5nZSk9XCJvblBvc2l0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIChhdHRhY2gpPVwib25PdmVybGF5QXR0YWNoZWQoKVwiXG4gICAgICAgICAgKGRldGFjaCk9XCJjbG9zZURyb3Bkb3duKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJycHQtY29tYm9ib3gtbWVudVwiXG4gICAgICAgICAgICBbY2xhc3Mub3BlbnMtYWJvdmVdPVwib3BlbnNBYm92ZSgpXCJcbiAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDwhLS0gUmVhbC10aW1lIEZpbHRlciBTZWFyY2ggQm94IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvYm94LXNlYXJjaC1ib3hcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21ib2JveC1zZWFyY2gtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjhcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICAgIDxsaW5lIHgxPVwiMjFcIiB5MT1cIjIxXCIgeDI9XCIxNi42NVwiIHkyPVwiMTYuNjVcIj48L2xpbmU+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgI3NlYXJjaElucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29tYm9ib3gtc2VhcmNoLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgdG8gZmlsdGVyLi4uXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VhcmNoVGVybSgpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiZm9jdXNlZEluZGV4KCkgPj0gMCA/IChlbGVtZW50SWQoKSArICdfb3B0XycgKyBmb2N1c2VkSW5kZXgoKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25TZWFyY2hJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblNlYXJjaEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIEBpZiAoc2VhcmNoVGVybSgpKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbWJvYm94LXNlYXJjaC1jbGVhclwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIkNsZWFyIGZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAg4pyVXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEZpbHRlcmVkIE9wdGlvbnMgTGlzdCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1vcHRpb25zLWxpc3RcIiAjb3B0aW9uc0xpc3RFbCAoc2Nyb2xsKT1cIm9uT3B0aW9uc1Njcm9sbCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIEBpZiAod2FpdGluZ0ZvcigpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtc3RhdHVzLXJvdyB3YWl0aW5nXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5XYWl0aW5nIGZvciB7eyB3YWl0aW5nTGFiZWwoKSB9fS4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtc3RhdHVzLXJvdyBsb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3QgZG90LXB1bHNlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RXhlY3V0aW5nIHF1ZXJ5IG9uIGRhdGFiYXNlIChtYXkgdGFrZSAx4oCTMiBtaW51dGVzIG9uIGxvY2FsIGRhdGFiYXNlKS4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAobG9hZEVycm9yKCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtc3RhdHVzLXJvdyBlcnJvclwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RXJyb3I6IHt7IGxvYWRFcnJvcigpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjb21ib2JveC1yZXRyeS1idG5cIiAoY2xpY2spPVwicmV0cnlMb29rdXAoJGV2ZW50KVwiPuKGuyBSZXRyeSBRdWVyeTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChpc0R5bmFtaWNTb3VyY2UoKSAmJiBoYXNMb2FkZWQoKSAmJiBhbGxPcHRpb25zKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvYm94LXN0YXR1cy1yb3cgZW1wdHlcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPk5vIHJlY29yZHMgZm91bmQgKGNoZWNrIHBhcmFtZXRlcnMpPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9ib3gtc3RhdHVzLXJvdyBlbXB0eVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+Tm8gb3B0aW9ucyBtYXRjaGluZyBcInt7IHNlYXJjaFRlcm0oKSB9fVwiPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAZm9yIChvcHQgb2YgdmlzaWJsZUZpbHRlcmVkT3B0aW9ucygpOyB0cmFjayBvcHQua2V5OyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImVsZW1lbnRJZCgpICsgJ19vcHRfJyArIGlcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbWJvYm94LW9wdGlvbi1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1mb2N1c2VkXT1cImZvY3VzZWRJbmRleCgpID09PSBpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKG9wdClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0T3B0aW9uKG9wdClcIlxuICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJmb2N1c2VkSW5kZXguc2V0KGkpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHQtbGFiZWxcIj57eyBvcHQubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXNTZWxlY3RlZChvcHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHQtY2hlY2tcIiBhcmlhLWhpZGRlbj1cInRydWVcIj7inJM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKGV4Y2Vzc0ZpbHRlcmVkQ291bnQoKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21ib2JveC1zdGF0dXMtcm93IGhpbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U2hvd2luZyB7eyB2aXNpYmxlRmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIH19IG9mIHt7IGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCB9fSBtYXRjaGVzLiBTY3JvbGwgZG93biBvcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29tYm9ib3gtbG9hZC1hbGwtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibG9hZEFsbEZpbHRlcmVkKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgTG9hZCBhbGwge3sgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8IS0tIE5hdGl2ZSBCcm93c2VyIFNlbGVjdCBGYWxsYmFjayAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgIFtpZF09XCJlbGVtZW50SWQoKVwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2woKVwiXG4gICAgICAgICAgICBbY2xhc3MucnB0LWludmFsaWRdPVwiaXNJbnZhbGlkKClcIlxuICAgICAgICAgICAgY2xhc3M9XCJycHQtc2VsZWN0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHdhaXRpbmdGb3IoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBkaXNhYmxlZCBzZWxlY3RlZD5XYWl0aW5nIGZvciB7eyB3YWl0aW5nTGFiZWwoKSB9fS4uLjwvb3B0aW9uPlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAoaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIGRpc2FibGVkIHNlbGVjdGVkPkxvYWRpbmcgb3B0aW9ucyBmcm9tIGRhdGFiYXNlLi4uPC9vcHRpb24+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChsb2FkRXJyb3IoKSkge1xuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgZGlzYWJsZWQgc2VsZWN0ZWQ+RXJyb3I6IHt7IGxvYWRFcnJvcigpIH19PC9vcHRpb24+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChpc0R5bmFtaWNTb3VyY2UoKSAmJiBoYXNMb2FkZWQoKSAmJiBhbGxPcHRpb25zKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBkaXNhYmxlZCBzZWxlY3RlZD4tLSBObyByZWNvcmRzIGZvdW5kIChjaGVjayBwYXJhbWV0ZXJzKSAtLTwvb3B0aW9uPlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAocGxhY2Vob2xkZXIoKSkge1xuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgW2Rpc2FibGVkXT1cImNvbmZpZygpLnZhbGlkYXRpb24/LnJlcXVpcmVkXCI+e3sgcGxhY2Vob2xkZXIoKSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGZvciAob3B0IG9mIHJlbmRlcmVkT3B0aW9ucygpOyB0cmFjayBvcHQua2V5KSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIm9wdC5rZXlcIj57eyBvcHQubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoaGFzRXhjZXNzT3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBkaXNhYmxlZD4uLi4gYW5kIHt7IGV4Y2Vzc09wdGlvbnNDb3VudCgpIH19IG1vcmUgcmVjb3JkcyAocmVmaW5lIGZpbHRlcikgLi4uPC9vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zZWxlY3QtYXJyb3dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDEyIDhcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEgMS41TDYgNi41TDExIDEuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmIChzaG93U3RhdHVzKCkgJiYgaXNEeW5hbWljU291cmNlKCkgJiYgc3RhdHVzVGV4dCgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdHVzLWJhZGdlXCIgW2F0dHIuZGF0YS1zdGF0dXNdPVwic3RhdHVzS2luZCgpXCI+XG4gICAgICAgICAgQHN3aXRjaCAoc3RhdHVzS2luZCgpKSB7XG4gICAgICAgICAgICBAY2FzZSAoJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBkb3QtcHVsc2VcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPkxvYWRpbmcgZnJvbSBkYXRhYmFzZeKApjwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnb2snKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBkb3Qtb2tcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGR5bmFtaWNPcHRpb25zKCkubGVuZ3RoIH19IHJlY29yZHMgbG9hZGVkPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCd3YWl0aW5nJykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3QgZG90LXdhcm5cIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPldhaXRpbmcgZm9yOjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhaXRpbmctdG9rZW5zXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoayBvZiB3YWl0aW5nRm9yKCk7IHRyYWNrIGspIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwid2FpdGluZy10b2tlblwiPnt7IGsgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnZXJyb3InKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBkb3QtZXJyXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBsb2FkRXJyb3IoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycHQtYmFkZ2UtcmV0cnktYnRuXCIgKGNsaWNrKT1cInJldHJ5TG9va3VwKCRldmVudClcIj7ihrsgUmV0cnk8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnZW1wdHknKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4+Tm8gcmVjb3JkcyBmb3VuZCBmb3IgcGFyYW1ldGVyczwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoZXJyb3JNZXNzYWdlKCkpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtZXJyb3ItdGV4dFwiPnt7IGVycm9yTWVzc2FnZSgpIH19PC9zcGFuPlxuICAgICAgfVxuICAgIDwvZGl2PiJdfQ==
|