ng-kinintel 0.0.397 → 20.0.2
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/fesm2022/ng-kinintel.mjs +11874 -0
- package/fesm2022/ng-kinintel.mjs.map +1 -0
- package/index.d.ts +2818 -5
- package/package.json +6 -14
- package/esm2020/lib/components/alert-groups/alert-groups.component.mjs +0 -76
- package/esm2020/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.mjs +0 -83
- package/esm2020/lib/components/dashboard-editor/configure-item/configure-item.component.mjs +0 -853
- package/esm2020/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.mjs +0 -56
- package/esm2020/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.mjs +0 -114
- package/esm2020/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.mjs +0 -163
- package/esm2020/lib/components/dashboard-editor/configure-item/vis-network-options.json +0 -135
- package/esm2020/lib/components/dashboard-editor/dashboard-editor.component.mjs +0 -580
- package/esm2020/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.mjs +0 -15
- package/esm2020/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.mjs +0 -50
- package/esm2020/lib/components/dashboard-editor/item-component/item-component.component.mjs +0 -1226
- package/esm2020/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.mjs +0 -111
- package/esm2020/lib/components/dashboards/dashboards.component.mjs +0 -163
- package/esm2020/lib/components/dashboards/view-dashboard/view-dashboard.component.mjs +0 -429
- package/esm2020/lib/components/data-explorer/change-source-warning/change-source-warning.component.mjs +0 -20
- package/esm2020/lib/components/data-explorer/data-explorer.component.mjs +0 -243
- package/esm2020/lib/components/data-explorer/export-data/export-data.component.mjs +0 -62
- package/esm2020/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.mjs +0 -70
- package/esm2020/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.mjs +0 -190
- package/esm2020/lib/components/data-picker/data-picker.component.mjs +0 -79
- package/esm2020/lib/components/data-search/data-search.component.mjs +0 -11
- package/esm2020/lib/components/data-sharing-invite/data-sharing-invite.component.mjs +0 -52
- package/esm2020/lib/components/dataset/create-dataset/create-dataset.component.mjs +0 -47
- package/esm2020/lib/components/dataset/dataset-editor/available-columns/available-columns.component.mjs +0 -28
- package/esm2020/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.mjs +0 -344
- package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.mjs +0 -80
- package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.mjs +0 -54
- package/esm2020/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.mjs +0 -67
- package/esm2020/lib/components/dataset/dataset-editor/dataset-editor.component.mjs +0 -1134
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.mjs +0 -201
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.mjs +0 -25
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.mjs +0 -72
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.mjs +0 -62
- package/esm2020/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.mjs +0 -41
- package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.mjs +0 -78
- package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.mjs +0 -39
- package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.mjs +0 -75
- package/esm2020/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.mjs +0 -107
- package/esm2020/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.mjs +0 -20
- package/esm2020/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.mjs +0 -20
- package/esm2020/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.mjs +0 -58
- package/esm2020/lib/components/dataset/dataset-editor/share-query/share-query.component.mjs +0 -110
- package/esm2020/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.mjs +0 -20
- package/esm2020/lib/components/dataset/dataset.component.mjs +0 -294
- package/esm2020/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.mjs +0 -130
- package/esm2020/lib/components/datasource/create-datasource/api-access/api-access.component.mjs +0 -132
- package/esm2020/lib/components/datasource/create-datasource/create-datasource.component.mjs +0 -729
- package/esm2020/lib/components/datasource/create-datasource/import-data/import-data.component.mjs +0 -146
- package/esm2020/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.mjs +0 -165
- package/esm2020/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.mjs +0 -145
- package/esm2020/lib/components/datasource/datasource.component.mjs +0 -162
- package/esm2020/lib/components/datasource/document-datasource/document-datasource.component.mjs +0 -297
- package/esm2020/lib/components/export-project/export-project.component.mjs +0 -29
- package/esm2020/lib/components/feeds/feed/feed.component.mjs +0 -92
- package/esm2020/lib/components/feeds/feeds.component.mjs +0 -145
- package/esm2020/lib/components/job-tasks/job-tasks.component.mjs +0 -25
- package/esm2020/lib/components/marketplace/marketplace.component.mjs +0 -65
- package/esm2020/lib/components/metadata/metadata.component.mjs +0 -65
- package/esm2020/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.mjs +0 -113
- package/esm2020/lib/components/notification-groups/notification-groups.component.mjs +0 -86
- package/esm2020/lib/components/project-picker/project-picker.component.mjs +0 -118
- package/esm2020/lib/components/project-settings/project-link-selection/project-link-selection.component.mjs +0 -104
- package/esm2020/lib/components/project-settings/project-settings.component.mjs +0 -155
- package/esm2020/lib/components/query-caching/edit-query-cache/edit-query-cache.component.mjs +0 -51
- package/esm2020/lib/components/query-caching/query-cache-view/query-cache-view.component.mjs +0 -121
- package/esm2020/lib/components/query-caching/query-caching.component.mjs +0 -162
- package/esm2020/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.mjs +0 -45
- package/esm2020/lib/components/shared-with-me/shared-with-me.component.mjs +0 -174
- package/esm2020/lib/components/snapshots/snapshots.component.mjs +0 -244
- package/esm2020/lib/components/tag-picker/tag-picker.component.mjs +0 -74
- package/esm2020/lib/components/task-time-periods/task-time-periods.component.mjs +0 -55
- package/esm2020/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.mjs +0 -40
- package/esm2020/lib/guards/dashboard-changes.guard.mjs +0 -22
- package/esm2020/lib/kinintel-config.mjs +0 -3
- package/esm2020/lib/ng-kinintel.module.mjs +0 -437
- package/esm2020/lib/objects/action-event.mjs +0 -16
- package/esm2020/lib/services/alert.service.mjs +0 -52
- package/esm2020/lib/services/dashboard.service.mjs +0 -75
- package/esm2020/lib/services/data-processor.service.mjs +0 -56
- package/esm2020/lib/services/data-search.service.mjs +0 -36
- package/esm2020/lib/services/dataset.service.mjs +0 -187
- package/esm2020/lib/services/datasource.service.mjs +0 -93
- package/esm2020/lib/services/external.service.mjs +0 -33
- package/esm2020/lib/services/feed.service.mjs +0 -50
- package/esm2020/lib/services/notification.service.mjs +0 -41
- package/esm2020/lib/services/project.service.mjs +0 -130
- package/esm2020/lib/services/tag.service.mjs +0 -63
- package/esm2020/ng-kinintel.mjs +0 -5
- package/esm2020/public-api.mjs +0 -43
- package/fesm2015/ng-kinintel.mjs +0 -12182
- package/fesm2015/ng-kinintel.mjs.map +0 -1
- package/fesm2020/ng-kinintel.mjs +0 -11872
- package/fesm2020/ng-kinintel.mjs.map +0 -1
- package/lib/components/alert-groups/alert-groups.component.d.ts +0 -30
- package/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.d.ts +0 -28
- package/lib/components/dashboard-editor/configure-item/configure-item.component.d.ts +0 -256
- package/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.d.ts +0 -16
- package/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.d.ts +0 -59
- package/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.d.ts +0 -26
- package/lib/components/dashboard-editor/dashboard-editor.component.d.ts +0 -85
- package/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.d.ts +0 -8
- package/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.d.ts +0 -22
- package/lib/components/dashboard-editor/item-component/item-component.component.d.ts +0 -264
- package/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.d.ts +0 -30
- package/lib/components/dashboards/dashboards.component.d.ts +0 -56
- package/lib/components/dashboards/view-dashboard/view-dashboard.component.d.ts +0 -81
- package/lib/components/data-explorer/change-source-warning/change-source-warning.component.d.ts +0 -11
- package/lib/components/data-explorer/data-explorer.component.d.ts +0 -61
- package/lib/components/data-explorer/export-data/export-data.component.d.ts +0 -17
- package/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.d.ts +0 -25
- package/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.d.ts +0 -44
- package/lib/components/data-picker/data-picker.component.d.ts +0 -32
- package/lib/components/data-search/data-search.component.d.ts +0 -5
- package/lib/components/data-sharing-invite/data-sharing-invite.component.d.ts +0 -21
- package/lib/components/dataset/create-dataset/create-dataset.component.d.ts +0 -17
- package/lib/components/dataset/dataset-editor/available-columns/available-columns.component.d.ts +0 -12
- package/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.d.ts +0 -61
- package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.d.ts +0 -21
- package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.d.ts +0 -20
- package/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.d.ts +0 -19
- package/lib/components/dataset/dataset-editor/dataset-editor.component.d.ts +0 -131
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.d.ts +0 -63
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.d.ts +0 -11
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.d.ts +0 -20
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.d.ts +0 -16
- package/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.d.ts +0 -18
- package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.d.ts +0 -23
- package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.d.ts +0 -13
- package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.d.ts +0 -22
- package/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.d.ts +0 -27
- package/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.d.ts +0 -11
- package/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.d.ts +0 -11
- package/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.d.ts +0 -25
- package/lib/components/dataset/dataset-editor/share-query/share-query.component.d.ts +0 -41
- package/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.d.ts +0 -11
- package/lib/components/dataset/dataset.component.d.ts +0 -74
- package/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.d.ts +0 -26
- package/lib/components/datasource/create-datasource/api-access/api-access.component.d.ts +0 -31
- package/lib/components/datasource/create-datasource/create-datasource.component.d.ts +0 -112
- package/lib/components/datasource/create-datasource/import-data/import-data.component.d.ts +0 -28
- package/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.d.ts +0 -40
- package/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.d.ts +0 -34
- package/lib/components/datasource/datasource.component.d.ts +0 -46
- package/lib/components/datasource/document-datasource/document-datasource.component.d.ts +0 -64
- package/lib/components/export-project/export-project.component.d.ts +0 -9
- package/lib/components/feeds/feed/feed.component.d.ts +0 -30
- package/lib/components/feeds/feeds.component.d.ts +0 -47
- package/lib/components/job-tasks/job-tasks.component.d.ts +0 -11
- package/lib/components/marketplace/marketplace.component.d.ts +0 -42
- package/lib/components/metadata/metadata.component.d.ts +0 -24
- package/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.d.ts +0 -37
- package/lib/components/notification-groups/notification-groups.component.d.ts +0 -28
- package/lib/components/project-picker/project-picker.component.d.ts +0 -37
- package/lib/components/project-settings/project-link-selection/project-link-selection.component.d.ts +0 -32
- package/lib/components/project-settings/project-settings.component.d.ts +0 -40
- package/lib/components/query-caching/edit-query-cache/edit-query-cache.component.d.ts +0 -17
- package/lib/components/query-caching/query-cache-view/query-cache-view.component.d.ts +0 -35
- package/lib/components/query-caching/query-caching.component.d.ts +0 -38
- package/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.d.ts +0 -21
- package/lib/components/shared-with-me/shared-with-me.component.d.ts +0 -43
- package/lib/components/snapshots/snapshots.component.d.ts +0 -52
- package/lib/components/tag-picker/tag-picker.component.d.ts +0 -27
- package/lib/components/task-time-periods/task-time-periods.component.d.ts +0 -20
- package/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.d.ts +0 -17
- package/lib/guards/dashboard-changes.guard.d.ts +0 -11
- package/lib/kinintel-config.d.ts +0 -10
- package/lib/ng-kinintel.module.d.ts +0 -116
- package/lib/objects/action-event.d.ts +0 -12
- package/lib/services/alert.service.d.ts +0 -17
- package/lib/services/dashboard.service.d.ts +0 -25
- package/lib/services/data-processor.service.d.ts +0 -18
- package/lib/services/data-search.service.d.ts +0 -14
- package/lib/services/dataset.service.d.ts +0 -56
- package/lib/services/datasource.service.d.ts +0 -34
- package/lib/services/external.service.d.ts +0 -12
- package/lib/services/feed.service.d.ts +0 -19
- package/lib/services/notification.service.d.ts +0 -16
- package/lib/services/project.service.d.ts +0 -27
- package/lib/services/tag.service.d.ts +0 -19
- package/public-api.d.ts +0 -38
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "@angular/material/legacy-dialog";
|
|
4
|
-
export class ChangeSourceWarningComponent {
|
|
5
|
-
constructor(dialogRef) {
|
|
6
|
-
this.dialogRef = dialogRef;
|
|
7
|
-
}
|
|
8
|
-
ngOnInit() {
|
|
9
|
-
}
|
|
10
|
-
close(res) {
|
|
11
|
-
this.dialogRef.close(res);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
ChangeSourceWarningComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChangeSourceWarningComponent, deps: [{ token: i1.MatLegacyDialogRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
15
|
-
ChangeSourceWarningComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ChangeSourceWarningComponent, selector: "ki-change-source-warning", ngImport: i0, template: "<div class=\"flex flex-col h-full justify-between p-8\">\n <div>\n <div class=\"mx-auto flex h-12 w-12 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"w-12 h-12 text-orange-500\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n\n </div>\n <div class=\"mt-3 text-center sm:mt-5\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\" id=\"modal-title\">Change Source Query?</h3>\n <div class=\"mt-2\">\n <p class=\"text-sm text-gray-500\">\n You are about to change the underlying dataset which may have different column mappings to the\n dataset you are currently working with. Any upstream transformations that are not compatible will\n cause the evaluation to fail. For convenience, we will disable all transformations after this point\n so they can be reviewed manually one by one.\n </p>\n </div>\n </div>\n </div>\n <div class=\"mt-5 flex align-center justify-between\">\n <button type=\"button\" mat-dialog-close\n class=\"mr-2 inline-flex w-full justify-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm\">\n Cancel\n </button>\n <button type=\"button\" [matDialogClose]=\"true\"\n class=\"mx-2 inline-flex w-full justify-center rounded-md border border-primary text-primary bg-white px-4 py-2 text-sm font-medium shadow-sm\">\n Proceed With Change\n </button>\n\n\n </div>\n</div>\n\n", styles: [""], dependencies: [{ kind: "directive", type: i1.MatLegacyDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }] });
|
|
16
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChangeSourceWarningComponent, decorators: [{
|
|
17
|
-
type: Component,
|
|
18
|
-
args: [{ selector: 'ki-change-source-warning', template: "<div class=\"flex flex-col h-full justify-between p-8\">\n <div>\n <div class=\"mx-auto flex h-12 w-12 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"w-12 h-12 text-orange-500\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n\n </div>\n <div class=\"mt-3 text-center sm:mt-5\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\" id=\"modal-title\">Change Source Query?</h3>\n <div class=\"mt-2\">\n <p class=\"text-sm text-gray-500\">\n You are about to change the underlying dataset which may have different column mappings to the\n dataset you are currently working with. Any upstream transformations that are not compatible will\n cause the evaluation to fail. For convenience, we will disable all transformations after this point\n so they can be reviewed manually one by one.\n </p>\n </div>\n </div>\n </div>\n <div class=\"mt-5 flex align-center justify-between\">\n <button type=\"button\" mat-dialog-close\n class=\"mr-2 inline-flex w-full justify-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm\">\n Cancel\n </button>\n <button type=\"button\" [matDialogClose]=\"true\"\n class=\"mx-2 inline-flex w-full justify-center rounded-md border border-primary text-primary bg-white px-4 py-2 text-sm font-medium shadow-sm\">\n Proceed With Change\n </button>\n\n\n </div>\n</div>\n\n" }]
|
|
19
|
-
}], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }]; } });
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXNvdXJjZS13YXJuaW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWV4cGxvcmVyL2NoYW5nZS1zb3VyY2Utd2FybmluZy9jaGFuZ2Utc291cmNlLXdhcm5pbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtZXhwbG9yZXIvY2hhbmdlLXNvdXJjZS13YXJuaW5nL2NoYW5nZS1zb3VyY2Utd2FybmluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFTLE1BQU0sZUFBZSxDQUFDOzs7QUFRaEQsTUFBTSxPQUFPLDRCQUE0QjtJQUVyQyxZQUFtQixTQUFxRDtRQUFyRCxjQUFTLEdBQVQsU0FBUyxDQUE0QztJQUN4RSxDQUFDO0lBRUQsUUFBUTtJQUNSLENBQUM7SUFFTSxLQUFLLENBQUMsR0FBSTtRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7OzBIQVZRLDRCQUE0Qjs4R0FBNUIsNEJBQTRCLGdFQ1J6Qyx5OERBbUNBOzRGRDNCYSw0QkFBNEI7a0JBTHhDLFNBQVM7K0JBQ0ksMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdExlZ2FjeURpYWxvZ1JlZiBhcyBNYXREaWFsb2dSZWZ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2tpLWNoYW5nZS1zb3VyY2Utd2FybmluZycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NoYW5nZS1zb3VyY2Utd2FybmluZy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2hhbmdlLXNvdXJjZS13YXJuaW5nLmNvbXBvbmVudC5zYXNzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ2hhbmdlU291cmNlV2FybmluZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Q2hhbmdlU291cmNlV2FybmluZ0NvbXBvbmVudD4pIHtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2UocmVzPykge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShyZXMpO1xuICAgIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaC1mdWxsIGp1c3RpZnktYmV0d2VlbiBwLThcIj5cbiAgICA8ZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXgtYXV0byBmbGV4IGgtMTIgdy0xMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMiBoLTEyIHRleHQtb3JhbmdlLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGQ9XCJNMTIgOXYzLjc1bS05LjMwMyAzLjM3NmMtLjg2NiAxLjUuMjE3IDMuMzc0IDEuOTQ4IDMuMzc0aDE0LjcxYzEuNzMgMCAyLjgxMy0xLjg3NCAxLjk0OC0zLjM3NEwxMy45NDkgMy4zNzhjLS44NjYtMS41LTMuMDMyLTEuNS0zLjg5OCAwTDIuNjk3IDE2LjEyNnpNMTIgMTUuNzVoLjAwN3YuMDA4SDEydi0uMDA4elwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgdGV4dC1jZW50ZXIgc206bXQtNVwiPlxuICAgICAgICAgICAgPGgzIGNsYXNzPVwidGV4dC1sZyBmb250LW1lZGl1bSBsZWFkaW5nLTYgdGV4dC1ncmF5LTkwMFwiIGlkPVwibW9kYWwtdGl0bGVcIj5DaGFuZ2UgU291cmNlIFF1ZXJ5PzwvaDM+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIFlvdSBhcmUgYWJvdXQgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGRhdGFzZXQgd2hpY2ggbWF5IGhhdmUgZGlmZmVyZW50IGNvbHVtbiBtYXBwaW5ncyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgZGF0YXNldCB5b3UgYXJlIGN1cnJlbnRseSB3b3JraW5nIHdpdGguIEFueSB1cHN0cmVhbSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2lsbFxuICAgICAgICAgICAgICAgICAgICBjYXVzZSB0aGUgZXZhbHVhdGlvbiB0byBmYWlsLiBGb3IgY29udmVuaWVuY2UsIHdlIHdpbGwgZGlzYWJsZSBhbGwgdHJhbnNmb3JtYXRpb25zIGFmdGVyIHRoaXMgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgc28gdGhleSBjYW4gYmUgcmV2aWV3ZWQgbWFudWFsbHkgb25lIGJ5IG9uZS5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm10LTUgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1kaWFsb2ctY2xvc2VcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1yLTIgaW5saW5lLWZsZXggdy1mdWxsIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCBiZy13aGl0ZSBweC00IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIHNoYWRvdy1zbVwiPlxuICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBbbWF0RGlhbG9nQ2xvc2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJteC0yIGlubGluZS1mbGV4IHctZnVsbCBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItcHJpbWFyeSB0ZXh0LXByaW1hcnkgYmctd2hpdGUgcHgtNCBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gc2hhZG93LXNtXCI+XG4gICAgICAgICAgICBQcm9jZWVkIFdpdGggQ2hhbmdlXG4gICAgICAgIDwvYnV0dG9uPlxuXG5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
import { Component, Inject, Input, ViewChild } from '@angular/core';
|
|
2
|
-
import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
|
|
3
|
-
import { DatasetNameDialogComponent } from '../dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component';
|
|
4
|
-
import { SnapshotProfileDialogComponent } from '../data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component';
|
|
5
|
-
import { ExportDataComponent } from './export-data/export-data.component';
|
|
6
|
-
import * as lodash from 'lodash';
|
|
7
|
-
import { SnapshotApiAccessComponent } from './snapshot-api-access/snapshot-api-access.component';
|
|
8
|
-
import { EditQueryCacheComponent } from '../query-caching/edit-query-cache/edit-query-cache.component';
|
|
9
|
-
import { Subject } from 'rxjs';
|
|
10
|
-
import { CreateDatasetComponent } from '../dataset/create-dataset/create-dataset.component';
|
|
11
|
-
import { ChangeSourceWarningComponent } from './change-source-warning/change-source-warning.component';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@angular/material/legacy-dialog";
|
|
14
|
-
import * as i2 from "../../services/dataset.service";
|
|
15
|
-
import * as i3 from "@angular/router";
|
|
16
|
-
import * as i4 from "../../services/project.service";
|
|
17
|
-
import * as i5 from "../../services/data-processor.service";
|
|
18
|
-
import * as i6 from "@angular/common";
|
|
19
|
-
import * as i7 from "@angular/material/legacy-button";
|
|
20
|
-
import * as i8 from "@angular/material/icon";
|
|
21
|
-
import * as i9 from "@3dgenomes/ngx-resizable";
|
|
22
|
-
import * as i10 from "@angular/forms";
|
|
23
|
-
import * as i11 from "@angular/material/legacy-radio";
|
|
24
|
-
import * as i12 from "@angular/material/legacy-tooltip";
|
|
25
|
-
import * as i13 from "../dataset/dataset-editor/dataset-editor.component";
|
|
26
|
-
import * as i14 from "../query-caching/query-cache-view/query-cache-view.component";
|
|
27
|
-
const _ = lodash.default;
|
|
28
|
-
export class DataExplorerComponent {
|
|
29
|
-
constructor(dialogRef, data, dialog, datasetService, router, projectService, dataProcessorService) {
|
|
30
|
-
this.dialogRef = dialogRef;
|
|
31
|
-
this.data = data;
|
|
32
|
-
this.dialog = dialog;
|
|
33
|
-
this.datasetService = datasetService;
|
|
34
|
-
this.router = router;
|
|
35
|
-
this.projectService = projectService;
|
|
36
|
-
this.dataProcessorService = dataProcessorService;
|
|
37
|
-
this.datasetEditorReadonly = false;
|
|
38
|
-
this.datasetEditorSimpleMode = false;
|
|
39
|
-
this.datasetEditorNoTools = false;
|
|
40
|
-
this._ = _;
|
|
41
|
-
this.showChart = false;
|
|
42
|
-
this.showSnapshots = false;
|
|
43
|
-
this.snapshotProfiles = [];
|
|
44
|
-
this.showQueryCache = false;
|
|
45
|
-
this.editTitle = false;
|
|
46
|
-
this.canHaveSnapshots = false;
|
|
47
|
-
this.canExportData = false;
|
|
48
|
-
this.reloadCache = new Subject();
|
|
49
|
-
this.columns = [];
|
|
50
|
-
}
|
|
51
|
-
ngOnInit() {
|
|
52
|
-
this.chartData = !!this.data.showChart;
|
|
53
|
-
this.datasetInstanceSummary = this.data.datasetInstanceSummary;
|
|
54
|
-
this.admin = !!this.data.admin;
|
|
55
|
-
this.accountId = this.data.accountId;
|
|
56
|
-
this.breadcrumb = this.data.breadcrumb;
|
|
57
|
-
this.backendUrl = this.data.backendUrl;
|
|
58
|
-
this.datasetEditorReadonly = !!this.data.datasetEditorReadonly;
|
|
59
|
-
this.datasetEditorSimpleMode = !!this.data.datasetEditorSimpleMode;
|
|
60
|
-
this.datasetEditorNoTools = !!this.data.datasetEditorNoTools;
|
|
61
|
-
if (!this.datasetInstanceSummary.id) {
|
|
62
|
-
this.datasetTitle = this.datasetInstanceSummary.title;
|
|
63
|
-
}
|
|
64
|
-
this.newTitle = this.data.newTitle;
|
|
65
|
-
this.newDescription = this.data.newDescription;
|
|
66
|
-
this.chartData = [
|
|
67
|
-
{ data: [1000, 1400, 1999, 2500, 5000] },
|
|
68
|
-
];
|
|
69
|
-
this.canHaveSnapshots = this.projectService.doesActiveProjectHavePrivilege('snapshotaccess');
|
|
70
|
-
this.canExportData = this.projectService.doesActiveProjectHavePrivilege('exportdata');
|
|
71
|
-
}
|
|
72
|
-
ngOnDestroy() {
|
|
73
|
-
if (this.timer) {
|
|
74
|
-
clearInterval(this.timer);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
changeSource() {
|
|
78
|
-
const dialogRef = this.dialog.open(CreateDatasetComponent, {
|
|
79
|
-
width: '1200px',
|
|
80
|
-
height: '800px',
|
|
81
|
-
data: {
|
|
82
|
-
admin: this.admin,
|
|
83
|
-
accountId: this.accountId
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
dialogRef.afterClosed().subscribe(res => {
|
|
87
|
-
if (res) {
|
|
88
|
-
const dialogRef2 = this.dialog.open(ChangeSourceWarningComponent, {
|
|
89
|
-
width: '700px',
|
|
90
|
-
height: '275px'
|
|
91
|
-
});
|
|
92
|
-
dialogRef2.afterClosed().subscribe(proceed => {
|
|
93
|
-
if (proceed) {
|
|
94
|
-
this.datasetInstanceSummary.datasetInstanceId = res.datasetInstanceId;
|
|
95
|
-
this.datasetInstanceSummary.datasourceInstanceKey = res.datasourceInstanceKey;
|
|
96
|
-
this.datasetInstanceSummary.source = {
|
|
97
|
-
title: res.title,
|
|
98
|
-
datasetInstanceId: res.datasetInstanceId,
|
|
99
|
-
datasourceInstanceKey: res.datasourceInstanceKey,
|
|
100
|
-
type: null
|
|
101
|
-
};
|
|
102
|
-
const transformation = this.datasetInstanceSummary.transformationInstances[0];
|
|
103
|
-
if (transformation) {
|
|
104
|
-
this.datasetEditorComponent.excludeUpstreamTransformations(transformation, true);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
this.datasetEditorComponent.evaluateDataset(true);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
dataLoaded(data) {
|
|
115
|
-
this.columns = data.columns;
|
|
116
|
-
}
|
|
117
|
-
async triggerSnapshot(snapshotKey) {
|
|
118
|
-
await this.dataProcessorService.triggerProcessor(snapshotKey);
|
|
119
|
-
this.snapshotProfiles = await this.loadProcessorItems('snapshot');
|
|
120
|
-
this.timer = setInterval(async () => {
|
|
121
|
-
this.snapshotProfiles = await this.loadProcessorItems('snapshot');
|
|
122
|
-
}, 3000);
|
|
123
|
-
}
|
|
124
|
-
apiAccess() {
|
|
125
|
-
const dialogRef = this.dialog.open(SnapshotApiAccessComponent, {
|
|
126
|
-
width: '800px',
|
|
127
|
-
height: '530px',
|
|
128
|
-
data: {
|
|
129
|
-
datasetInstanceSummary: this.datasetInstanceSummary,
|
|
130
|
-
backendUrl: this.backendUrl
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
exportData() {
|
|
135
|
-
const dialogRef = this.dialog.open(ExportDataComponent, {
|
|
136
|
-
width: '600px',
|
|
137
|
-
height: '530px',
|
|
138
|
-
data: {
|
|
139
|
-
datasetInstanceSummary: Object.assign({}, this.datasetInstanceSummary)
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
async viewSnapshots() {
|
|
144
|
-
this.showQueryCache = false;
|
|
145
|
-
this.showSnapshots = !this.showSnapshots;
|
|
146
|
-
if (this.showSnapshots) {
|
|
147
|
-
this.snapshotProfiles = await this.loadProcessorItems('snapshot');
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
editSnapshot(snapshot) {
|
|
151
|
-
const dialogRef = this.dialog.open(SnapshotProfileDialogComponent, {
|
|
152
|
-
width: '900px',
|
|
153
|
-
height: '900px',
|
|
154
|
-
data: {
|
|
155
|
-
snapshot,
|
|
156
|
-
datasetInstanceId: this.datasetInstanceSummary.id,
|
|
157
|
-
columns: this.columns,
|
|
158
|
-
datasetInstance: this.datasetInstanceSummary
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
dialogRef.afterClosed().subscribe(async (res) => {
|
|
162
|
-
if (res) {
|
|
163
|
-
this.snapshotProfiles = await this.loadProcessorItems('snapshot');
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
async deleteSnapshot(snapshot) {
|
|
168
|
-
const message = 'Are you sure you would like to remove this snapshot?';
|
|
169
|
-
if (window.confirm(message)) {
|
|
170
|
-
await this.dataProcessorService.removeProcessor(snapshot.key);
|
|
171
|
-
this.snapshotProfiles = await this.loadProcessorItems('snapshot');
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
async viewQueryCaching() {
|
|
175
|
-
this.showSnapshots = false;
|
|
176
|
-
this.showQueryCache = !this.showQueryCache;
|
|
177
|
-
}
|
|
178
|
-
editQueryCache(cache) {
|
|
179
|
-
const dialogRef = this.dialog.open(EditQueryCacheComponent, {
|
|
180
|
-
width: '900px',
|
|
181
|
-
height: '900px',
|
|
182
|
-
data: {
|
|
183
|
-
cache,
|
|
184
|
-
datasetInstanceId: this.datasetInstanceSummary.id,
|
|
185
|
-
columns: this.columns,
|
|
186
|
-
datasetInstance: this.datasetInstanceSummary
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
dialogRef.afterClosed().subscribe(async (res) => {
|
|
190
|
-
if (res) {
|
|
191
|
-
this.reloadCache.next(Date.now());
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
saveChanges() {
|
|
196
|
-
if (!this.datasetInstanceSummary.id && (this.datasetInstanceSummary.title === this.datasetTitle)) {
|
|
197
|
-
const dialogRef = this.dialog.open(DatasetNameDialogComponent, {
|
|
198
|
-
width: '700px',
|
|
199
|
-
height: '800px',
|
|
200
|
-
data: {
|
|
201
|
-
datasetInstanceSummary: this.datasetInstanceSummary
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
dialogRef.afterClosed().subscribe(datasetInstanceSummary => {
|
|
205
|
-
if (datasetInstanceSummary) {
|
|
206
|
-
this.datasetInstanceSummary = datasetInstanceSummary;
|
|
207
|
-
this.saveDataset();
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
this.saveDataset();
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
saveDataset() {
|
|
216
|
-
this.datasetService.saveDataset(this.datasetInstanceSummary, this.accountId).then(() => {
|
|
217
|
-
this.dialogRef.close(true);
|
|
218
|
-
// this.router.navigate(['/dataset']);
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
async loadProcessorItems(type) {
|
|
222
|
-
return await this.dataProcessorService.filterProcessorsByRelatedItem(type, 'DatasetInstance', this.datasetInstanceSummary.id);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
DataExplorerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DataExplorerComponent, deps: [{ token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i1.MatLegacyDialog }, { token: i2.DatasetService }, { token: i3.Router }, { token: i4.ProjectService }, { token: i5.DataProcessorService }], target: i0.ɵɵFactoryTarget.Component });
|
|
226
|
-
DataExplorerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DataExplorerComponent, selector: "ki-data-explorer", inputs: { datasetEditorReadonly: "datasetEditorReadonly", datasetEditorSimpleMode: "datasetEditorSimpleMode", datasetEditorNoTools: "datasetEditorNoTools" }, host: { classAttribute: "configure-dialog" }, viewQueries: [{ propertyName: "datasetEditorComponent", first: true, predicate: ["datasetEditorComponent"], descendants: true }], ngImport: i0, template: "<div class=\"bg-gray-50 configure-header border-b border-gray-200\">\n <div class=\"w-full flex items-center\">\n <ng-template [ngIf]=\"datasetInstanceSummary && datasetInstanceSummary.title && !editTitle\">\n <div (click)=\"editTitle = !editTitle\">{{ datasetInstanceSummary.title }}</div>\n </ng-template>\n <ng-template [ngIf]=\"datasetInstanceSummary && editTitle\">\n <input type=\"text\" class=\"w-1/4 text-sm\"\n [(ngModel)]=\"datasetInstanceSummary.title\" (blur)=\"editTitle = false\">\n </ng-template>\n <ng-template [ngIf]=\"!datasetInstanceSummary || !datasetInstanceSummary.title\">\n Data Explorer\n </ng-template>\n\n </div>\n\n <div class=\"flex items-center\">\n <mat-radio-group class=\"flex items-center text-sm\"\n *ngIf=\"admin\" aria-label=\"Select a scope\" [(ngModel)]=\"accountId\">\n <mat-radio-button class=\"mt-0\" [value]=\"null\">Data Feed</mat-radio-button>\n <mat-radio-button class=\"mt-0 ml-2\" [value]=\"0\">Stored Query</mat-radio-button>\n </mat-radio-group>\n </div>\n\n</div>\n<nav class=\"h-10 flex border-b border-gray-200 bg-white\" aria-label=\"Breadcrumb\">\n <ol role=\"list\" class=\"flex w-full px-4\">\n <li class=\"flex\">\n <div class=\"flex items-center\">\n <a [mat-dialog-close]=\"{breadcrumb: '/'}\" class=\"text-gray-600 hover:text-gray-800 flex items-center\">\n <span class=\"material-symbols-outlined\">home</span>\n </a>\n </div>\n </li>\n\n <li class=\"flex truncate\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a [mat-dialog-close]=\"true\"\n class=\"capitalize ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\">\n {{ breadcrumb }}</a>\n </div>\n </li>\n\n <li class=\"flex truncate\" *ngIf=\"datasetInstanceSummary\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a class=\"ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\" aria-current=\"page\">\n {{ datasetInstanceSummary.title || 'Data Explorer' }}\n </a>\n <ng-template [ngIf]=\"datasetInstanceSummary && datasetInstanceSummary.source\">\n <span\n class=\"flex items-center border border-gray-200 text-xs px-2 py-0 rounded-xl ml-2 font-thin bg-gray-100\">\n <span class=\"uppercase tracking-wider text-gray-700 font-medium\">Querying:</span>\n <ng-template [ngIf]=\"datasetInstanceSummary.source.datasourceInstanceKey\">\n <img *ngIf=\"['custom', 'snapshot'].indexOf(datasetInstanceSummary.source.type) === -1\"\n src=\"/assets/favicon.png\" class=\"w-2.5 mx-1.5\">\n <span *ngIf=\"datasetInstanceSummary.source.type === 'custom'\"\n class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">upload_file</span>\n <span *ngIf=\"datasetInstanceSummary.source.type === 'snapshot'\"\n class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">history</span>\n </ng-template>\n <ng-template [ngIf]=\"!datasetInstanceSummary.source.datasourceInstanceKey\">\n <span class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">query_stats</span>\n </ng-template>\n {{ datasetInstanceSummary.source.title }}\n <span class=\"material-symbols-outlined ml-2 cursor-pointer\" title=\"Change source query\"\n (click)=\"changeSource()\">change_circle</span>\n </span>\n </ng-template>\n </div>\n </li>\n </ol>\n</nav>\n<div class=\"configure-content\">\n\n <rsz-layout class=\"row top\" [directions]=\"(showSnapshots || showQueryCache) ? ['bottom'] : ['none']\"\n [rFlex]=\"(showSnapshots || showQueryCache)\">\n\n <rsz-layout class=\"cell left no-p\" [directions]=\"showChart ? ['right'] : ['none']\" [rFlex]=\"true\"\n [ngStyle]=\"{'flex-basis': showChart ? '65%' : '100%'}\">\n <div class=\"cell-contents no-p\">\n <ki-dataset-editor #datasetEditorComponent [(datasetInstanceSummary)]=\"datasetInstanceSummary\"\n [accountId]=\"accountId\" [newTitle]=\"newTitle\" [newDescription]=\"newDescription\"\n (dataLoaded)=\"dataLoaded($event)\" [admin]=\"admin\"\n [datasetEditorReadonly]=\"datasetEditorReadonly\"\n [datasetEditorSimpleMode]=\"datasetEditorSimpleMode\"\n [datasetEditorNoTools]=\"datasetEditorNoTools\"></ki-dataset-editor>\n </div>\n </rsz-layout>\n </rsz-layout>\n\n <rsz-layout *ngIf=\"showSnapshots || showQueryCache\" class=\"row bottom\" [directions]=\"['none']\" [rFlex]=\"false\"\n [ngClass]=\"{'overflow-y-scroll': showQueryCache}\">\n <ng-template [ngIf]=\"showSnapshots\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">\n <div>Snapshot Profiles</div>\n </h1>\n <p class=\"text-xs font-medium text-gray-500\">\n A list of all the snapshots that have been created for this stored query.\n </p>\n </div>\n </div>\n\n <div class=\"flex flex-1 items-center justify-end\">\n <button type=\"button\" (click)=\"apiAccess()\"\n class=\"inline-flex items-center justify-center px-4 py-2 mr-3 border border-transparent text-sm font-medium rounded-md shadow-sm text-primary bg-gray-100 focus:outline-none\">\n API Access\n </button>\n\n <button type=\"button\" (click)=\"editSnapshot(null)\"\n class=\"inline-flex items-center justify-center px-4 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n <mat-icon>add</mat-icon>\n New Snapshot Profile\n </button>\n </div>\n </div>\n </div>\n <div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <table *ngIf=\"snapshotProfiles.length\"\n class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Title\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Status\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Last Started\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Next Start Time\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n <tr *ngFor=\"let snapshot of snapshotProfiles; let i = index\">\n <td>\n <button *ngIf=\"snapshot.taskStatus !== 'RUNNING'\" color=\"primary\"\n matTooltip=\"Trigger snapshot to run now\" mat-icon-button\n (click)=\"triggerSnapshot(snapshot.key)\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <svg *ngIf=\"snapshot.taskStatus === 'RUNNING'\"\n class=\"animate-spin ml-3 mr-2 h-5 w-5 text-secondary\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n {{ snapshot.title }}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-0.5 px-2 text-sm text-gray-500\">\n <div\n class=\"inline-flex text-sm lowercase flex items-center text-white px-3 rounded-full\"\n [ngClass]=\"{'py-0.5': snapshot.taskStatus !== 'RUNNING','py-1': snapshot.taskStatus === 'RUNNING', 'bg-gray-400': snapshot.taskStatus === 'PENDING', 'bg-secondary': snapshot.taskStatus === 'RUNNING', 'bg-success': snapshot.taskStatus === 'COMPLETED', 'bg-danger': snapshot.taskStatus === 'FAILED'}\">\n <ng-template [ngIf]=\"snapshot.taskStatus === 'PENDING'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'RUNNING'\">\n <svg class=\"animate-spin -ml-1 mr-3 h-5 w-5 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'COMPLETED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'FAILED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'TIMED_OUT'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M14.25 9v6m-4.5 0V9M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n {{ _.startCase(snapshot.taskStatus) }}\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{ snapshot.taskLastStartTime }}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{ snapshot.taskNextStartTime }}\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"align-center justify-end\">\n <button mat-button color=\"primary\" (click)=\"editSnapshot(snapshot)\"> Edit\n </button>\n <div class=\"divider\"></div>\n <button mat-button color=\"warn\" (click)=\"deleteSnapshot(snapshot)\"> Delete\n </button>\n </div>\n </td>\n </tr>\n\n </tbody>\n\n </table>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"p-4\" *ngIf=\"!snapshotProfiles.length\">\n <button type=\"button\" (click)=\"editSnapshot(null)\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <mat-icon\n class=\"mx-auto text-6xl h-14 w-20 text-gray-300\">history\n </mat-icon>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create Snapshot Profile</span>\n </button>\n </div>\n </ng-template>\n <ng-template [ngIf]=\"showQueryCache\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">\n <div>Query Caching</div>\n </h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Set up Query Caching on this data set.\n </p>\n </div>\n </div>\n <div class=\"flex flex-1 items-center justify-end\">\n <button type=\"button\" (click)=\"editQueryCache(null)\"\n class=\"inline-flex items-center justify-center px-4 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n <mat-icon>add</mat-icon>\n Create Query Cache\n </button>\n </div>\n\n </div>\n </div>\n <ki-query-cache-view [limit]=\"100\" [showPager]=\"false\" [reload]=\"reloadCache\"\n [datasetInstance]=\"datasetInstanceSummary.id\"></ki-query-cache-view>\n </ng-template>\n </rsz-layout>\n</div>\n\n<div class=\"configure-footer\">\n <button mat-stroked-button [mat-dialog-close]=\"true\" color=\"primary\">\n Cancel\n </button>\n <div class=\"align-center\">\n <button mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\"\n *ngIf=\"canHaveSnapshots && !datasetEditorReadonly\"\n [disabled]=\"!datasetInstanceSummary || !datasetInstanceSummary.id\"\n (click)=\"viewQueryCaching()\">\n Query Caching\n </button>\n <button mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\"\n *ngIf=\"canHaveSnapshots && !datasetEditorReadonly\"\n [disabled]=\"!datasetInstanceSummary || !datasetInstanceSummary.id\"\n (click)=\"viewSnapshots()\">\n Manage Snapshots\n </button>\n <button *ngIf=\"canExportData\" mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\" (click)=\"exportData()\">\n Export Data\n </button>\n <button *ngIf=\"!datasetEditorReadonly\" mat-flat-button color=\"primary\" (click)=\"saveChanges()\">\n Save & Exit\n </button>\n </div>\n\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:100dvh;width:100vw}.configure-header{height:60px;width:100%;background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;box-sizing:border-box;font-size:1.2rem;font-weight:500}.configure-content{flex:1;background-color:#f5f5f5;overflow:hidden;display:flex;width:100%;height:100%;flex-direction:column}.configure-content rsz-layout.row{height:100%;background-color:transparent}.configure-content rsz-layout.row.top{width:100%;display:flex;flex-basis:65%;position:relative;background-color:#fff}.configure-content rsz-layout.row .rg-bottom{background-color:#dadada}.configure-content rsz-layout.row.bottom{width:100%;flex-basis:35%;display:flex;flex-direction:column;position:relative;overflow:hidden}.configure-content rsz-layout.row .cell{border-bottom:none;border-top:none;position:relative;padding:1rem}.configure-content rsz-layout.row .cell.no-p{padding:0}.configure-content rsz-layout.row .left{flex-basis:65%}.configure-content rsz-layout.row .right{border-right:none}.cell-contents{position:absolute;inset:0;padding:1rem}.cell-contents::-webkit-scrollbar{width:1em;background:transparent}.cell-contents::-webkit-scrollbar-thumb{background:#d2d2d2}.cell-contents.pad{padding:2rem}.cell-contents.bar-space{margin-top:30px}.cell-contents.no-p{padding:0}.cell-contents .entity-header{padding:1rem}.cell-contents .cell-header{height:50px;width:100%;display:flex;align-items:center;justify-content:space-between}.configure-footer{height:60px;width:100%;background-color:#f0f0f0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i7.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatLegacyDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "component", type: i9.ResizableComponent, selector: "rsz-layout", inputs: ["rFlex", "directions"], outputs: ["resizeStart", "resizing", "resizeEnd"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i11.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "directive", type: i12.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i13.DatasetEditorComponent, selector: "ki-dataset-editor", inputs: ["datasetInstanceSummary", "environment", "admin", "dashboardParameters", "dashboardLayoutSettings", "accountId", "newTitle", "newDescription", "datasetEditorReadonly", "datasetEditorSimpleMode", "datasetEditorNoTools"], outputs: ["dataLoaded", "datasetInstanceSummaryChange"] }, { kind: "component", type: i14.QueryCacheViewComponent, selector: "ki-query-cache-view", inputs: ["admin", "reload", "showPager", "limit", "datasetInstance"] }] });
|
|
227
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DataExplorerComponent, decorators: [{
|
|
228
|
-
type: Component,
|
|
229
|
-
args: [{ selector: 'ki-data-explorer', host: { class: 'configure-dialog' }, template: "<div class=\"bg-gray-50 configure-header border-b border-gray-200\">\n <div class=\"w-full flex items-center\">\n <ng-template [ngIf]=\"datasetInstanceSummary && datasetInstanceSummary.title && !editTitle\">\n <div (click)=\"editTitle = !editTitle\">{{ datasetInstanceSummary.title }}</div>\n </ng-template>\n <ng-template [ngIf]=\"datasetInstanceSummary && editTitle\">\n <input type=\"text\" class=\"w-1/4 text-sm\"\n [(ngModel)]=\"datasetInstanceSummary.title\" (blur)=\"editTitle = false\">\n </ng-template>\n <ng-template [ngIf]=\"!datasetInstanceSummary || !datasetInstanceSummary.title\">\n Data Explorer\n </ng-template>\n\n </div>\n\n <div class=\"flex items-center\">\n <mat-radio-group class=\"flex items-center text-sm\"\n *ngIf=\"admin\" aria-label=\"Select a scope\" [(ngModel)]=\"accountId\">\n <mat-radio-button class=\"mt-0\" [value]=\"null\">Data Feed</mat-radio-button>\n <mat-radio-button class=\"mt-0 ml-2\" [value]=\"0\">Stored Query</mat-radio-button>\n </mat-radio-group>\n </div>\n\n</div>\n<nav class=\"h-10 flex border-b border-gray-200 bg-white\" aria-label=\"Breadcrumb\">\n <ol role=\"list\" class=\"flex w-full px-4\">\n <li class=\"flex\">\n <div class=\"flex items-center\">\n <a [mat-dialog-close]=\"{breadcrumb: '/'}\" class=\"text-gray-600 hover:text-gray-800 flex items-center\">\n <span class=\"material-symbols-outlined\">home</span>\n </a>\n </div>\n </li>\n\n <li class=\"flex truncate\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a [mat-dialog-close]=\"true\"\n class=\"capitalize ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\">\n {{ breadcrumb }}</a>\n </div>\n </li>\n\n <li class=\"flex truncate\" *ngIf=\"datasetInstanceSummary\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a class=\"ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\" aria-current=\"page\">\n {{ datasetInstanceSummary.title || 'Data Explorer' }}\n </a>\n <ng-template [ngIf]=\"datasetInstanceSummary && datasetInstanceSummary.source\">\n <span\n class=\"flex items-center border border-gray-200 text-xs px-2 py-0 rounded-xl ml-2 font-thin bg-gray-100\">\n <span class=\"uppercase tracking-wider text-gray-700 font-medium\">Querying:</span>\n <ng-template [ngIf]=\"datasetInstanceSummary.source.datasourceInstanceKey\">\n <img *ngIf=\"['custom', 'snapshot'].indexOf(datasetInstanceSummary.source.type) === -1\"\n src=\"/assets/favicon.png\" class=\"w-2.5 mx-1.5\">\n <span *ngIf=\"datasetInstanceSummary.source.type === 'custom'\"\n class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">upload_file</span>\n <span *ngIf=\"datasetInstanceSummary.source.type === 'snapshot'\"\n class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">history</span>\n </ng-template>\n <ng-template [ngIf]=\"!datasetInstanceSummary.source.datasourceInstanceKey\">\n <span class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">query_stats</span>\n </ng-template>\n {{ datasetInstanceSummary.source.title }}\n <span class=\"material-symbols-outlined ml-2 cursor-pointer\" title=\"Change source query\"\n (click)=\"changeSource()\">change_circle</span>\n </span>\n </ng-template>\n </div>\n </li>\n </ol>\n</nav>\n<div class=\"configure-content\">\n\n <rsz-layout class=\"row top\" [directions]=\"(showSnapshots || showQueryCache) ? ['bottom'] : ['none']\"\n [rFlex]=\"(showSnapshots || showQueryCache)\">\n\n <rsz-layout class=\"cell left no-p\" [directions]=\"showChart ? ['right'] : ['none']\" [rFlex]=\"true\"\n [ngStyle]=\"{'flex-basis': showChart ? '65%' : '100%'}\">\n <div class=\"cell-contents no-p\">\n <ki-dataset-editor #datasetEditorComponent [(datasetInstanceSummary)]=\"datasetInstanceSummary\"\n [accountId]=\"accountId\" [newTitle]=\"newTitle\" [newDescription]=\"newDescription\"\n (dataLoaded)=\"dataLoaded($event)\" [admin]=\"admin\"\n [datasetEditorReadonly]=\"datasetEditorReadonly\"\n [datasetEditorSimpleMode]=\"datasetEditorSimpleMode\"\n [datasetEditorNoTools]=\"datasetEditorNoTools\"></ki-dataset-editor>\n </div>\n </rsz-layout>\n </rsz-layout>\n\n <rsz-layout *ngIf=\"showSnapshots || showQueryCache\" class=\"row bottom\" [directions]=\"['none']\" [rFlex]=\"false\"\n [ngClass]=\"{'overflow-y-scroll': showQueryCache}\">\n <ng-template [ngIf]=\"showSnapshots\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">\n <div>Snapshot Profiles</div>\n </h1>\n <p class=\"text-xs font-medium text-gray-500\">\n A list of all the snapshots that have been created for this stored query.\n </p>\n </div>\n </div>\n\n <div class=\"flex flex-1 items-center justify-end\">\n <button type=\"button\" (click)=\"apiAccess()\"\n class=\"inline-flex items-center justify-center px-4 py-2 mr-3 border border-transparent text-sm font-medium rounded-md shadow-sm text-primary bg-gray-100 focus:outline-none\">\n API Access\n </button>\n\n <button type=\"button\" (click)=\"editSnapshot(null)\"\n class=\"inline-flex items-center justify-center px-4 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n <mat-icon>add</mat-icon>\n New Snapshot Profile\n </button>\n </div>\n </div>\n </div>\n <div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <table *ngIf=\"snapshotProfiles.length\"\n class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Title\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Status\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Last Started\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Next Start Time\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n <tr *ngFor=\"let snapshot of snapshotProfiles; let i = index\">\n <td>\n <button *ngIf=\"snapshot.taskStatus !== 'RUNNING'\" color=\"primary\"\n matTooltip=\"Trigger snapshot to run now\" mat-icon-button\n (click)=\"triggerSnapshot(snapshot.key)\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <svg *ngIf=\"snapshot.taskStatus === 'RUNNING'\"\n class=\"animate-spin ml-3 mr-2 h-5 w-5 text-secondary\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n {{ snapshot.title }}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-0.5 px-2 text-sm text-gray-500\">\n <div\n class=\"inline-flex text-sm lowercase flex items-center text-white px-3 rounded-full\"\n [ngClass]=\"{'py-0.5': snapshot.taskStatus !== 'RUNNING','py-1': snapshot.taskStatus === 'RUNNING', 'bg-gray-400': snapshot.taskStatus === 'PENDING', 'bg-secondary': snapshot.taskStatus === 'RUNNING', 'bg-success': snapshot.taskStatus === 'COMPLETED', 'bg-danger': snapshot.taskStatus === 'FAILED'}\">\n <ng-template [ngIf]=\"snapshot.taskStatus === 'PENDING'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'RUNNING'\">\n <svg class=\"animate-spin -ml-1 mr-3 h-5 w-5 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'COMPLETED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'FAILED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'TIMED_OUT'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M14.25 9v6m-4.5 0V9M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n {{ _.startCase(snapshot.taskStatus) }}\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{ snapshot.taskLastStartTime }}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{ snapshot.taskNextStartTime }}\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"align-center justify-end\">\n <button mat-button color=\"primary\" (click)=\"editSnapshot(snapshot)\"> Edit\n </button>\n <div class=\"divider\"></div>\n <button mat-button color=\"warn\" (click)=\"deleteSnapshot(snapshot)\"> Delete\n </button>\n </div>\n </td>\n </tr>\n\n </tbody>\n\n </table>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"p-4\" *ngIf=\"!snapshotProfiles.length\">\n <button type=\"button\" (click)=\"editSnapshot(null)\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <mat-icon\n class=\"mx-auto text-6xl h-14 w-20 text-gray-300\">history\n </mat-icon>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create Snapshot Profile</span>\n </button>\n </div>\n </ng-template>\n <ng-template [ngIf]=\"showQueryCache\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">\n <div>Query Caching</div>\n </h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Set up Query Caching on this data set.\n </p>\n </div>\n </div>\n <div class=\"flex flex-1 items-center justify-end\">\n <button type=\"button\" (click)=\"editQueryCache(null)\"\n class=\"inline-flex items-center justify-center px-4 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n <mat-icon>add</mat-icon>\n Create Query Cache\n </button>\n </div>\n\n </div>\n </div>\n <ki-query-cache-view [limit]=\"100\" [showPager]=\"false\" [reload]=\"reloadCache\"\n [datasetInstance]=\"datasetInstanceSummary.id\"></ki-query-cache-view>\n </ng-template>\n </rsz-layout>\n</div>\n\n<div class=\"configure-footer\">\n <button mat-stroked-button [mat-dialog-close]=\"true\" color=\"primary\">\n Cancel\n </button>\n <div class=\"align-center\">\n <button mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\"\n *ngIf=\"canHaveSnapshots && !datasetEditorReadonly\"\n [disabled]=\"!datasetInstanceSummary || !datasetInstanceSummary.id\"\n (click)=\"viewQueryCaching()\">\n Query Caching\n </button>\n <button mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\"\n *ngIf=\"canHaveSnapshots && !datasetEditorReadonly\"\n [disabled]=\"!datasetInstanceSummary || !datasetInstanceSummary.id\"\n (click)=\"viewSnapshots()\">\n Manage Snapshots\n </button>\n <button *ngIf=\"canExportData\" mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\" (click)=\"exportData()\">\n Export Data\n </button>\n <button *ngIf=\"!datasetEditorReadonly\" mat-flat-button color=\"primary\" (click)=\"saveChanges()\">\n Save & Exit\n </button>\n </div>\n\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:100dvh;width:100vw}.configure-header{height:60px;width:100%;background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;box-sizing:border-box;font-size:1.2rem;font-weight:500}.configure-content{flex:1;background-color:#f5f5f5;overflow:hidden;display:flex;width:100%;height:100%;flex-direction:column}.configure-content rsz-layout.row{height:100%;background-color:transparent}.configure-content rsz-layout.row.top{width:100%;display:flex;flex-basis:65%;position:relative;background-color:#fff}.configure-content rsz-layout.row .rg-bottom{background-color:#dadada}.configure-content rsz-layout.row.bottom{width:100%;flex-basis:35%;display:flex;flex-direction:column;position:relative;overflow:hidden}.configure-content rsz-layout.row .cell{border-bottom:none;border-top:none;position:relative;padding:1rem}.configure-content rsz-layout.row .cell.no-p{padding:0}.configure-content rsz-layout.row .left{flex-basis:65%}.configure-content rsz-layout.row .right{border-right:none}.cell-contents{position:absolute;inset:0;padding:1rem}.cell-contents::-webkit-scrollbar{width:1em;background:transparent}.cell-contents::-webkit-scrollbar-thumb{background:#d2d2d2}.cell-contents.pad{padding:2rem}.cell-contents.bar-space{margin-top:30px}.cell-contents.no-p{padding:0}.cell-contents .entity-header{padding:1rem}.cell-contents .cell-header{height:50px;width:100%;display:flex;align-items:center;justify-content:space-between}.configure-footer{height:60px;width:100%;background-color:#f0f0f0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;box-sizing:border-box}\n"] }]
|
|
230
|
-
}], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
|
|
231
|
-
type: Inject,
|
|
232
|
-
args: [MAT_DIALOG_DATA]
|
|
233
|
-
}] }, { type: i1.MatLegacyDialog }, { type: i2.DatasetService }, { type: i3.Router }, { type: i4.ProjectService }, { type: i5.DataProcessorService }]; }, propDecorators: { datasetEditorComponent: [{
|
|
234
|
-
type: ViewChild,
|
|
235
|
-
args: ['datasetEditorComponent']
|
|
236
|
-
}], datasetEditorReadonly: [{
|
|
237
|
-
type: Input
|
|
238
|
-
}], datasetEditorSimpleMode: [{
|
|
239
|
-
type: Input
|
|
240
|
-
}], datasetEditorNoTools: [{
|
|
241
|
-
type: Input
|
|
242
|
-
}] } });
|
|
243
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1leHBsb3Jlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1raW5pbnRlbC9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS1leHBsb3Jlci9kYXRhLWV4cGxvcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWV4cGxvcmVyL2RhdGEtZXhwbG9yZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUNILHNCQUFzQixJQUFJLGVBQWUsRUFHNUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSw2RUFBNkUsQ0FBQztBQUd2SCxPQUFPLEVBQ0gsOEJBQThCLEVBQ2pDLE1BQU0sNEVBQTRFLENBQUM7QUFDcEYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFFeEUsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFakMsT0FBTyxFQUNILDBCQUEwQixFQUM3QixNQUFNLHFEQUFxRCxDQUFDO0FBQzdELE9BQU8sRUFDSCx1QkFBdUIsRUFDMUIsTUFBTSw4REFBOEQsQ0FBQztBQUN0RSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBRTFGLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHlEQUF5RCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBR3JHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFRekIsTUFBTSxPQUFPLHFCQUFxQjtJQStCOUIsWUFBbUIsU0FBOEMsRUFDckIsSUFBUyxFQUNqQyxNQUFpQixFQUNqQixjQUE4QixFQUM5QixNQUFjLEVBQ2QsY0FBOEIsRUFDOUIsb0JBQTBDO1FBTjNDLGNBQVMsR0FBVCxTQUFTLENBQXFDO1FBQ3JCLFNBQUksR0FBSixJQUFJLENBQUs7UUFDakMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBakNyRCwwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDOUIsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLHlCQUFvQixHQUFZLEtBQUssQ0FBQztRQUV4QyxNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRU4sY0FBUyxHQUFHLEtBQUssQ0FBQztRQUtsQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixxQkFBZ0IsR0FBUSxFQUFFLENBQUM7UUFDM0IsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUtsQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRTNCLFlBQU8sR0FBUSxFQUFFLENBQUM7SUFXMUIsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN2QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztRQUMvRCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN2QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDL0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQ25FLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUU3RCxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7U0FDekQ7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ25DLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFL0MsSUFBSSxDQUFDLFNBQVMsR0FBRztZQUNiLEVBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFDO1NBQ3pDLENBQUM7UUFFRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNaLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRU0sWUFBWTtRQUNmLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQ3ZELEtBQUssRUFBRSxRQUFRO1lBQ2YsTUFBTSxFQUFFLE9BQU87WUFDZixJQUFJLEVBQUU7Z0JBQ0YsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDNUI7U0FDSixDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BDLElBQUksR0FBRyxFQUFFO2dCQUNMLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFO29CQUM5RCxLQUFLLEVBQUUsT0FBTztvQkFDZCxNQUFNLEVBQUUsT0FBTztpQkFDbEIsQ0FBQyxDQUFDO2dCQUNILFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3pDLElBQUksT0FBTyxFQUFFO3dCQUNULElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUM7d0JBQ3RFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsR0FBRyxHQUFHLENBQUMscUJBQXFCLENBQUM7d0JBQzlFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEdBQUc7NEJBQ2pDLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSzs0QkFDaEIsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLGlCQUFpQjs0QkFDeEMscUJBQXFCLEVBQUUsR0FBRyxDQUFDLHFCQUFxQjs0QkFDaEQsSUFBSSxFQUFFLElBQUk7eUJBQ2IsQ0FBQzt3QkFDRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzlFLElBQUksY0FBYyxFQUFFOzRCQUNoQixJQUFJLENBQUMsc0JBQXNCLENBQUMsOEJBQThCLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO3lCQUNwRjs2QkFBTTs0QkFDSCxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUNyRDtxQkFDSjtnQkFDTCxDQUFDLENBQUMsQ0FBQzthQUNOO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sVUFBVSxDQUFDLElBQUk7UUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVc7UUFDcEMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDYixDQUFDO0lBRU0sU0FBUztRQUNaLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO1lBQzNELEtBQUssRUFBRSxPQUFPO1lBQ2QsTUFBTSxFQUFFLE9BQU87WUFDZixJQUFJLEVBQUU7Z0JBQ0Ysc0JBQXNCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQjtnQkFDbkQsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2FBQzlCO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLFVBQVU7UUFDYixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUNwRCxLQUFLLEVBQUUsT0FBTztZQUNkLE1BQU0sRUFBRSxPQUFPO1lBQ2YsSUFBSSxFQUFFO2dCQUNGLHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQzthQUN6RTtTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYTtRQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN6QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3JFO0lBQ0wsQ0FBQztJQUVNLFlBQVksQ0FBQyxRQUFRO1FBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFO1lBQy9ELEtBQUssRUFBRSxPQUFPO1lBQ2QsTUFBTSxFQUFFLE9BQU87WUFDZixJQUFJLEVBQUU7Z0JBQ0YsUUFBUTtnQkFDUixpQkFBaUIsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRTtnQkFDakQsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixlQUFlLEVBQUUsSUFBSSxDQUFDLHNCQUFzQjthQUMvQztTQUNKLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFDLEdBQUcsRUFBQyxFQUFFO1lBQzFDLElBQUksR0FBRyxFQUFFO2dCQUNMLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNyRTtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUTtRQUNoQyxNQUFNLE9BQU8sR0FBRyxzREFBc0QsQ0FBQztRQUN2RSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekIsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDckU7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLGdCQUFnQjtRQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sY0FBYyxDQUFDLEtBQVU7UUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDeEQsS0FBSyxFQUFFLE9BQU87WUFDZCxNQUFNLEVBQUUsT0FBTztZQUNmLElBQUksRUFBRTtnQkFDRixLQUFLO2dCQUNMLGlCQUFpQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO2dCQUNqRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3JCLGVBQWUsRUFBRSxJQUFJLENBQUMsc0JBQXNCO2FBQy9DO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUMsR0FBRyxFQUFDLEVBQUU7WUFDMUMsSUFBSSxHQUFHLEVBQUU7Z0JBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7YUFDckM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxXQUFXO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUM5RixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRTtnQkFDM0QsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsSUFBSSxFQUFFO29CQUNGLHNCQUFzQixFQUFFLElBQUksQ0FBQyxzQkFBc0I7aUJBQ3REO2FBQ0osQ0FBQyxDQUFDO1lBQ0gsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO2dCQUN2RCxJQUFJLHNCQUFzQixFQUFFO29CQUN4QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsc0JBQXNCLENBQUM7b0JBQ3JELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztpQkFDdEI7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDSCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEI7SUFDTCxDQUFDO0lBRU8sV0FBVztRQUNmLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNuRixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixzQ0FBc0M7UUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQVk7UUFDekMsT0FBTyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyw2QkFBNkIsQ0FDaEUsSUFBSSxFQUNKLGlCQUFpQixFQUNqQixJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUNqQyxDQUFDO0lBQ04sQ0FBQzs7bUhBeE9RLHFCQUFxQixvREFnQ1YsZUFBZTt1R0FoQzFCLHFCQUFxQixzWUNwQ2xDLHFpc0JBd1VBOzRGRHBTYSxxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0ksa0JBQWtCLFFBR3RCLEVBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFDOzswQkFrQ3BCLE1BQU07MkJBQUMsZUFBZTs0TEE5QkUsc0JBQXNCO3NCQUExRCxTQUFTO3VCQUFDLHdCQUF3QjtnQkFFMUIscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIE1BVF9MRUdBQ1lfRElBTE9HX0RBVEEgYXMgTUFUX0RJQUxPR19EQVRBLFxuICAgIE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2csXG4gICAgTWF0TGVnYWN5RGlhbG9nUmVmIGFzIE1hdERpYWxvZ1JlZlxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCB7RGF0YXNldE5hbWVEaWFsb2dDb21wb25lbnR9IGZyb20gJy4uL2RhdGFzZXQvZGF0YXNldC1lZGl0b3IvZGF0YXNldC1uYW1lLWRpYWxvZy9kYXRhc2V0LW5hbWUtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQge0RhdGFzZXRTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhc2V0LnNlcnZpY2UnO1xuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICAgIFNuYXBzaG90UHJvZmlsZURpYWxvZ0NvbXBvbmVudFxufSBmcm9tICcuLi9kYXRhLWV4cGxvcmVyL3NuYXBzaG90LXByb2ZpbGUtZGlhbG9nL3NuYXBzaG90LXByb2ZpbGUtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQge0V4cG9ydERhdGFDb21wb25lbnR9IGZyb20gJy4vZXhwb3J0LWRhdGEvZXhwb3J0LWRhdGEuY29tcG9uZW50JztcbmltcG9ydCB7UHJvamVjdFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Byb2plY3Quc2VydmljZSc7XG5pbXBvcnQgKiBhcyBsb2Rhc2ggZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7RGF0YVByb2Nlc3NvclNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEtcHJvY2Vzc29yLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgICBTbmFwc2hvdEFwaUFjY2Vzc0NvbXBvbmVudFxufSBmcm9tICcuL3NuYXBzaG90LWFwaS1hY2Nlc3Mvc25hcHNob3QtYXBpLWFjY2Vzcy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBFZGl0UXVlcnlDYWNoZUNvbXBvbmVudFxufSBmcm9tICcuLi9xdWVyeS1jYWNoaW5nL2VkaXQtcXVlcnktY2FjaGUvZWRpdC1xdWVyeS1jYWNoZS5jb21wb25lbnQnO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7Q3JlYXRlRGF0YXNldENvbXBvbmVudH0gZnJvbSAnLi4vZGF0YXNldC9jcmVhdGUtZGF0YXNldC9jcmVhdGUtZGF0YXNldC5jb21wb25lbnQnO1xuaW1wb3J0IHtEYXRhc2V0RWRpdG9yQ29tcG9uZW50fSBmcm9tICcuLi9kYXRhc2V0L2RhdGFzZXQtZWRpdG9yL2RhdGFzZXQtZWRpdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQge0NoYW5nZVNvdXJjZVdhcm5pbmdDb21wb25lbnR9IGZyb20gJy4vY2hhbmdlLXNvdXJjZS13YXJuaW5nL2NoYW5nZS1zb3VyY2Utd2FybmluZy5jb21wb25lbnQnO1xuXG5cbmNvbnN0IF8gPSBsb2Rhc2guZGVmYXVsdDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdraS1kYXRhLWV4cGxvcmVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1leHBsb3Jlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0YS1leHBsb3Jlci5jb21wb25lbnQuc2FzcyddLFxuICAgIGhvc3Q6IHtjbGFzczogJ2NvbmZpZ3VyZS1kaWFsb2cnfVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhRXhwbG9yZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBAVmlld0NoaWxkKCdkYXRhc2V0RWRpdG9yQ29tcG9uZW50JykgZGF0YXNldEVkaXRvckNvbXBvbmVudDogRGF0YXNldEVkaXRvckNvbXBvbmVudDtcblxuICAgIEBJbnB1dCgpIGRhdGFzZXRFZGl0b3JSZWFkb25seSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGRhdGFzZXRFZGl0b3JTaW1wbGVNb2RlID0gZmFsc2U7XG4gICAgQElucHV0KCkgZGF0YXNldEVkaXRvck5vVG9vbHM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBfID0gXztcbiAgICBwdWJsaWMgYmFja2VuZFVybDogc3RyaW5nO1xuICAgIHB1YmxpYyBzaG93Q2hhcnQgPSBmYWxzZTtcbiAgICBwdWJsaWMgY2hhcnREYXRhO1xuICAgIHB1YmxpYyBkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5OiBhbnk7XG4gICAgcHVibGljIGZpbHRlcnM6IGFueTtcbiAgICBwdWJsaWMgYWRtaW46IGJvb2xlYW47XG4gICAgcHVibGljIHNob3dTbmFwc2hvdHMgPSBmYWxzZTtcbiAgICBwdWJsaWMgc25hcHNob3RQcm9maWxlczogYW55ID0gW107XG4gICAgcHVibGljIHNob3dRdWVyeUNhY2hlID0gZmFsc2U7XG4gICAgcHVibGljIGVkaXRUaXRsZSA9IGZhbHNlO1xuICAgIHB1YmxpYyBhY2NvdW50SWQ6IGFueTtcbiAgICBwdWJsaWMgbmV3VGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgbmV3RGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgYnJlYWRjcnVtYjogc3RyaW5nO1xuICAgIHB1YmxpYyBjYW5IYXZlU25hcHNob3RzID0gZmFsc2U7XG4gICAgcHVibGljIGNhbkV4cG9ydERhdGEgPSBmYWxzZTtcbiAgICBwdWJsaWMgcmVsb2FkQ2FjaGUgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgcHJpdmF0ZSBjb2x1bW5zOiBhbnkgPSBbXTtcbiAgICBwcml2YXRlIGRhdGFzZXRUaXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgdGltZXI6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxEYXRhRXhwbG9yZXJDb21wb25lbnQ+LFxuICAgICAgICAgICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LFxuICAgICAgICAgICAgICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBkYXRhc2V0U2VydmljZTogRGF0YXNldFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOiBQcm9qZWN0U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGRhdGFQcm9jZXNzb3JTZXJ2aWNlOiBEYXRhUHJvY2Vzc29yU2VydmljZSkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoYXJ0RGF0YSA9ICEhdGhpcy5kYXRhLnNob3dDaGFydDtcbiAgICAgICAgdGhpcy5kYXRhc2V0SW5zdGFuY2VTdW1tYXJ5ID0gdGhpcy5kYXRhLmRhdGFzZXRJbnN0YW5jZVN1bW1hcnk7XG4gICAgICAgIHRoaXMuYWRtaW4gPSAhIXRoaXMuZGF0YS5hZG1pbjtcbiAgICAgICAgdGhpcy5hY2NvdW50SWQgPSB0aGlzLmRhdGEuYWNjb3VudElkO1xuICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSB0aGlzLmRhdGEuYnJlYWRjcnVtYjtcbiAgICAgICAgdGhpcy5iYWNrZW5kVXJsID0gdGhpcy5kYXRhLmJhY2tlbmRVcmw7XG4gICAgICAgIHRoaXMuZGF0YXNldEVkaXRvclJlYWRvbmx5ID0gISF0aGlzLmRhdGEuZGF0YXNldEVkaXRvclJlYWRvbmx5O1xuICAgICAgICB0aGlzLmRhdGFzZXRFZGl0b3JTaW1wbGVNb2RlID0gISF0aGlzLmRhdGEuZGF0YXNldEVkaXRvclNpbXBsZU1vZGU7XG4gICAgICAgIHRoaXMuZGF0YXNldEVkaXRvck5vVG9vbHMgPSAhIXRoaXMuZGF0YS5kYXRhc2V0RWRpdG9yTm9Ub29scztcblxuICAgICAgICBpZiAoIXRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeS5pZCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhc2V0VGl0bGUgPSB0aGlzLmRhdGFzZXRJbnN0YW5jZVN1bW1hcnkudGl0bGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5ld1RpdGxlID0gdGhpcy5kYXRhLm5ld1RpdGxlO1xuICAgICAgICB0aGlzLm5ld0Rlc2NyaXB0aW9uID0gdGhpcy5kYXRhLm5ld0Rlc2NyaXB0aW9uO1xuXG4gICAgICAgIHRoaXMuY2hhcnREYXRhID0gW1xuICAgICAgICAgICAge2RhdGE6IFsxMDAwLCAxNDAwLCAxOTk5LCAyNTAwLCA1MDAwXX0sXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5jYW5IYXZlU25hcHNob3RzID0gdGhpcy5wcm9qZWN0U2VydmljZS5kb2VzQWN0aXZlUHJvamVjdEhhdmVQcml2aWxlZ2UoJ3NuYXBzaG90YWNjZXNzJyk7XG4gICAgICAgIHRoaXMuY2FuRXhwb3J0RGF0YSA9IHRoaXMucHJvamVjdFNlcnZpY2UuZG9lc0FjdGl2ZVByb2plY3RIYXZlUHJpdmlsZWdlKCdleHBvcnRkYXRhJyk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZVNvdXJjZSgpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDcmVhdGVEYXRhc2V0Q29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzEyMDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICc4MDBweCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgYWRtaW46IHRoaXMuYWRtaW4sXG4gICAgICAgICAgICAgICAgYWNjb3VudElkOiB0aGlzLmFjY291bnRJZFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmMiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2hhbmdlU291cmNlV2FybmluZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzcwMHB4JyxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMjc1cHgnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGlhbG9nUmVmMi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShwcm9jZWVkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2NlZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeS5kYXRhc2V0SW5zdGFuY2VJZCA9IHJlcy5kYXRhc2V0SW5zdGFuY2VJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeS5kYXRhc291cmNlSW5zdGFuY2VLZXkgPSByZXMuZGF0YXNvdXJjZUluc3RhbmNlS2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LnNvdXJjZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogcmVzLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXRJbnN0YW5jZUlkOiByZXMuZGF0YXNldEluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNvdXJjZUluc3RhbmNlS2V5OiByZXMuZGF0YXNvdXJjZUluc3RhbmNlS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1hdGlvbiA9IHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeS50cmFuc2Zvcm1hdGlvbkluc3RhbmNlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldEVkaXRvckNvbXBvbmVudC5leGNsdWRlVXBzdHJlYW1UcmFuc2Zvcm1hdGlvbnModHJhbnNmb3JtYXRpb24sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFzZXRFZGl0b3JDb21wb25lbnQuZXZhbHVhdGVEYXRhc2V0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBkYXRhTG9hZGVkKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gZGF0YS5jb2x1bW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB0cmlnZ2VyU25hcHNob3Qoc25hcHNob3RLZXkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhUHJvY2Vzc29yU2VydmljZS50cmlnZ2VyUHJvY2Vzc29yKHNuYXBzaG90S2V5KTtcbiAgICAgICAgdGhpcy5zbmFwc2hvdFByb2ZpbGVzID0gYXdhaXQgdGhpcy5sb2FkUHJvY2Vzc29ySXRlbXMoJ3NuYXBzaG90Jyk7XG4gICAgICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90UHJvZmlsZXMgPSBhd2FpdCB0aGlzLmxvYWRQcm9jZXNzb3JJdGVtcygnc25hcHNob3QnKTtcbiAgICAgICAgfSwgMzAwMCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwaUFjY2VzcygpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihTbmFwc2hvdEFwaUFjY2Vzc0NvbXBvbmVudCwge1xuICAgICAgICAgICAgd2lkdGg6ICc4MDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICc1MzBweCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGF0YXNldEluc3RhbmNlU3VtbWFyeTogdGhpcy5kYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LFxuICAgICAgICAgICAgICAgIGJhY2tlbmRVcmw6IHRoaXMuYmFja2VuZFVybFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwb3J0RGF0YSgpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihFeHBvcnREYXRhQ29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJzUzMHB4JyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5OiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRhdGFzZXRJbnN0YW5jZVN1bW1hcnkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB2aWV3U25hcHNob3RzKCkge1xuICAgICAgICB0aGlzLnNob3dRdWVyeUNhY2hlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd1NuYXBzaG90cyA9ICF0aGlzLnNob3dTbmFwc2hvdHM7XG4gICAgICAgIGlmICh0aGlzLnNob3dTbmFwc2hvdHMpIHtcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3RQcm9maWxlcyA9IGF3YWl0IHRoaXMubG9hZFByb2Nlc3Nvckl0ZW1zKCdzbmFwc2hvdCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGVkaXRTbmFwc2hvdChzbmFwc2hvdCkge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFNuYXBzaG90UHJvZmlsZURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgd2lkdGg6ICc5MDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICc5MDBweCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgc25hcHNob3QsXG4gICAgICAgICAgICAgICAgZGF0YXNldEluc3RhbmNlSWQ6IHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeS5pZCxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXG4gICAgICAgICAgICAgICAgZGF0YXNldEluc3RhbmNlOiB0aGlzLmRhdGFzZXRJbnN0YW5jZVN1bW1hcnlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShhc3luYyByZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3RQcm9maWxlcyA9IGF3YWl0IHRoaXMubG9hZFByb2Nlc3Nvckl0ZW1zKCdzbmFwc2hvdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsZXRlU25hcHNob3Qoc25hcHNob3QpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdBcmUgeW91IHN1cmUgeW91IHdvdWxkIGxpa2UgdG8gcmVtb3ZlIHRoaXMgc25hcHNob3Q/JztcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFQcm9jZXNzb3JTZXJ2aWNlLnJlbW92ZVByb2Nlc3NvcihzbmFwc2hvdC5rZXkpO1xuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdFByb2ZpbGVzID0gYXdhaXQgdGhpcy5sb2FkUHJvY2Vzc29ySXRlbXMoJ3NuYXBzaG90Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdmlld1F1ZXJ5Q2FjaGluZygpIHtcbiAgICAgICAgdGhpcy5zaG93U25hcHNob3RzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd1F1ZXJ5Q2FjaGUgPSAhdGhpcy5zaG93UXVlcnlDYWNoZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZWRpdFF1ZXJ5Q2FjaGUoY2FjaGU6IGFueSkge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEVkaXRRdWVyeUNhY2hlQ29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzkwMHB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJzkwMHB4JyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBjYWNoZSxcbiAgICAgICAgICAgICAgICBkYXRhc2V0SW5zdGFuY2VJZDogdGhpcy5kYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LmlkLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1ucyxcbiAgICAgICAgICAgICAgICBkYXRhc2V0SW5zdGFuY2U6IHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKGFzeW5jIHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWRDYWNoZS5uZXh0KERhdGUubm93KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2F2ZUNoYW5nZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5kYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LmlkICYmICh0aGlzLmRhdGFzZXRJbnN0YW5jZVN1bW1hcnkudGl0bGUgPT09IHRoaXMuZGF0YXNldFRpdGxlKSkge1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEYXRhc2V0TmFtZURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAnNzAwcHgnLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzgwMHB4JyxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXRJbnN0YW5jZVN1bW1hcnk6IHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeSA9IGRhdGFzZXRJbnN0YW5jZVN1bW1hcnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZURhdGFzZXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZURhdGFzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZURhdGFzZXQoKSB7XG4gICAgICAgIHRoaXMuZGF0YXNldFNlcnZpY2Uuc2F2ZURhdGFzZXQodGhpcy5kYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LCB0aGlzLmFjY291bnRJZCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0cnVlKTtcbiAgICAgICAgICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2RhdGFzZXQnXSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZFByb2Nlc3Nvckl0ZW1zKHR5cGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5kYXRhUHJvY2Vzc29yU2VydmljZS5maWx0ZXJQcm9jZXNzb3JzQnlSZWxhdGVkSXRlbShcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAnRGF0YXNldEluc3RhbmNlJyxcbiAgICAgICAgICAgIHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeS5pZFxuICAgICAgICApO1xuICAgIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImJnLWdyYXktNTAgY29uZmlndXJlLWhlYWRlciBib3JkZXItYiBib3JkZXItZ3JheS0yMDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5ICYmIGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkudGl0bGUgJiYgIWVkaXRUaXRsZVwiPlxuICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiZWRpdFRpdGxlID0gIWVkaXRUaXRsZVwiPnt7IGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImRhdGFzZXRJbnN0YW5jZVN1bW1hcnkgJiYgZWRpdFRpdGxlXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInctMS80IHRleHQtc21cIlxuICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZGF0YXNldEluc3RhbmNlU3VtbWFyeS50aXRsZVwiIChibHVyKT1cImVkaXRUaXRsZSA9IGZhbHNlXCI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhZGF0YXNldEluc3RhbmNlU3VtbWFyeSB8fCAhZGF0YXNldEluc3RhbmNlU3VtbWFyeS50aXRsZVwiPlxuICAgICAgICAgICAgRGF0YSBFeHBsb3JlclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPG1hdC1yYWRpby1ncm91cCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYWRtaW5cIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGEgc2NvcGVcIiBbKG5nTW9kZWwpXT1cImFjY291bnRJZFwiPlxuICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XCJtdC0wXCIgW3ZhbHVlXT1cIm51bGxcIj5EYXRhIEZlZWQ8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cIm10LTAgbWwtMlwiIFt2YWx1ZV09XCIwXCI+U3RvcmVkIFF1ZXJ5PC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICA8L2Rpdj5cblxuPC9kaXY+XG48bmF2IGNsYXNzPVwiaC0xMCBmbGV4IGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBiZy13aGl0ZVwiIGFyaWEtbGFiZWw9XCJCcmVhZGNydW1iXCI+XG4gICAgPG9sIHJvbGU9XCJsaXN0XCIgY2xhc3M9XCJmbGV4IHctZnVsbCBweC00XCI+XG4gICAgICAgIDxsaSBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxhIFttYXQtZGlhbG9nLWNsb3NlXT1cInticmVhZGNydW1iOiAnLyd9XCIgY2xhc3M9XCJ0ZXh0LWdyYXktNjAwIGhvdmVyOnRleHQtZ3JheS04MDAgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+aG9tZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9saT5cblxuICAgICAgICA8bGkgY2xhc3M9XCJmbGV4IHRydW5jYXRlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaC1mdWxsIHctNiBmbGV4LXNocmluay0wIHRleHQtZ3JheS0yMDBcIiB2aWV3Qm94PVwiMCAwIDI0IDQ0XCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0uMjkzIDBsMjIgMjItMjIgMjJoMS40MTRsMjItMjItMjItMjJILjI5M3pcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPGEgW21hdC1kaWFsb2ctY2xvc2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXBpdGFsaXplIG1sLTQgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNTAwIGhvdmVyOnRleHQtZ3JheS03MDBcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgYnJlYWRjcnVtYiB9fTwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuXG4gICAgICAgIDxsaSBjbGFzcz1cImZsZXggdHJ1bmNhdGVcIiAqbmdJZj1cImRhdGFzZXRJbnN0YW5jZVN1bW1hcnlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJoLWZ1bGwgdy02IGZsZXgtc2hyaW5rLTAgdGV4dC1ncmF5LTIwMFwiIHZpZXdCb3g9XCIwIDAgMjQgNDRcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTS4yOTMgMGwyMiAyMi0yMiAyMmgxLjQxNGwyMi0yMi0yMi0yMkguMjkzelwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm1sLTQgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNTAwIGhvdmVyOnRleHQtZ3JheS03MDBcIiBhcmlhLWN1cnJlbnQ9XCJwYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkudGl0bGUgfHwgJ0RhdGEgRXhwbG9yZXInIH19XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5ICYmIGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkuc291cmNlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGJvcmRlciBib3JkZXItZ3JheS0yMDAgdGV4dC14cyBweC0yIHB5LTAgcm91bmRlZC14bCBtbC0yIGZvbnQtdGhpbiBiZy1ncmF5LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVwcGVyY2FzZSB0cmFja2luZy13aWRlciB0ZXh0LWdyYXktNzAwIGZvbnQtbWVkaXVtXCI+UXVlcnlpbmc6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImRhdGFzZXRJbnN0YW5jZVN1bW1hcnkuc291cmNlLmRhdGFzb3VyY2VJbnN0YW5jZUtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJbJ2N1c3RvbScsICdzbmFwc2hvdCddLmluZGV4T2YoZGF0YXNldEluc3RhbmNlU3VtbWFyeS5zb3VyY2UudHlwZSkgPT09IC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cIi9hc3NldHMvZmF2aWNvbi5wbmdcIiBjbGFzcz1cInctMi41IG14LTEuNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZGF0YXNldEluc3RhbmNlU3VtbWFyeS5zb3VyY2UudHlwZSA9PT0gJ2N1c3RvbSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaC00IHctNCB0ZXh0LWxnIGxlYWRpbmctNCBteC0xLjVcIj51cGxvYWRfZmlsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImRhdGFzZXRJbnN0YW5jZVN1bW1hcnkuc291cmNlLnR5cGUgPT09ICdzbmFwc2hvdCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaC00IHctNCB0ZXh0LWxnIGxlYWRpbmctNCBteC0xLjVcIj5oaXN0b3J5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhZGF0YXNldEluc3RhbmNlU3VtbWFyeS5zb3VyY2UuZGF0YXNvdXJjZUluc3RhbmNlS2V5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGgtNCB3LTQgdGV4dC1sZyBsZWFkaW5nLTQgbXgtMS41XCI+cXVlcnlfc3RhdHM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7e3sgZGF0YXNldEluc3RhbmNlU3VtbWFyeS5zb3VyY2UudGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBtbC0yIGN1cnNvci1wb2ludGVyXCIgdGl0bGU9XCJDaGFuZ2Ugc291cmNlIHF1ZXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlU291cmNlKClcIj5jaGFuZ2VfY2lyY2xlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgIDwvb2w+XG48L25hdj5cbjxkaXYgY2xhc3M9XCJjb25maWd1cmUtY29udGVudFwiPlxuXG4gICAgPHJzei1sYXlvdXQgY2xhc3M9XCJyb3cgdG9wXCIgW2RpcmVjdGlvbnNdPVwiKHNob3dTbmFwc2hvdHMgfHwgc2hvd1F1ZXJ5Q2FjaGUpID8gWydib3R0b20nXSA6IFsnbm9uZSddXCJcbiAgICAgICAgICAgICAgICBbckZsZXhdPVwiKHNob3dTbmFwc2hvdHMgfHwgc2hvd1F1ZXJ5Q2FjaGUpXCI+XG5cbiAgICAgICAgPHJzei1sYXlvdXQgY2xhc3M9XCJjZWxsIGxlZnQgbm8tcFwiIFtkaXJlY3Rpb25zXT1cInNob3dDaGFydCA/IFsncmlnaHQnXSA6IFsnbm9uZSddXCIgW3JGbGV4XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2ZsZXgtYmFzaXMnOiBzaG93Q2hhcnQgPyAnNjUlJyA6ICcxMDAlJ31cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZWxsLWNvbnRlbnRzIG5vLXBcIj5cbiAgICAgICAgICAgICAgICA8a2ktZGF0YXNldC1lZGl0b3IgI2RhdGFzZXRFZGl0b3JDb21wb25lbnQgWyhkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5KV09XCJkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY291bnRJZF09XCJhY2NvdW50SWRcIiBbbmV3VGl0bGVdPVwibmV3VGl0bGVcIiBbbmV3RGVzY3JpcHRpb25dPVwibmV3RGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YUxvYWRlZCk9XCJkYXRhTG9hZGVkKCRldmVudClcIiBbYWRtaW5dPVwiYWRtaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFzZXRFZGl0b3JSZWFkb25seV09XCJkYXRhc2V0RWRpdG9yUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YXNldEVkaXRvclNpbXBsZU1vZGVdPVwiZGF0YXNldEVkaXRvclNpbXBsZU1vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YXNldEVkaXRvck5vVG9vbHNdPVwiZGF0YXNldEVkaXRvck5vVG9vbHNcIj48L2tpLWRhdGFzZXQtZWRpdG9yPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcnN6LWxheW91dD5cbiAgICA8L3Jzei1sYXlvdXQ+XG5cbiAgICA8cnN6LWxheW91dCAqbmdJZj1cInNob3dTbmFwc2hvdHMgfHwgc2hvd1F1ZXJ5Q2FjaGVcIiBjbGFzcz1cInJvdyBib3R0b21cIiBbZGlyZWN0aW9uc109XCJbJ25vbmUnXVwiIFtyRmxleF09XCJmYWxzZVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnb3ZlcmZsb3cteS1zY3JvbGwnOiBzaG93UXVlcnlDYWNoZX1cIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNob3dTbmFwc2hvdHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC02IHB5LTMgYmctd2hpdGUgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1kOmZsZXggbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlbiBtZDpzcGFjZS14LTVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtc3RhcnQgZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMS41XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bCBmb250LWJvbGQgdGV4dC1ncmF5LTkwMCBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+U25hcHNob3QgUHJvZmlsZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgbGlzdCBvZiBhbGwgdGhlIHNuYXBzaG90cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIGZvciB0aGlzIHN0b3JlZCBxdWVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImFwaUFjY2VzcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtNCBweS0yIG1yLTMgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHJvdW5kZWQtbWQgc2hhZG93LXNtIHRleHQtcHJpbWFyeSBiZy1ncmF5LTEwMCBmb2N1czpvdXRsaW5lLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEkgQWNjZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImVkaXRTbmFwc2hvdChudWxsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTQgcHktMS41IGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQgdGV4dC1zbSBmb250LW1lZGl1bSByb3VuZGVkLW1kIHNoYWRvdy1zbSB0ZXh0LXdoaXRlIGJnLXByaW1hcnkgZm9jdXM6b3V0bGluZS1ub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3IFNuYXBzaG90IFByb2ZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTQgc206cHgtNiBsZzpweC04IG10LTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiLW15LTIgLW14LTQgc206LW14LTYgbGc6LW14LThcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmxpbmUtYmxvY2sgbWluLXctZnVsbCBweS0yIGFsaWduLW1pZGRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSAqbmdJZj1cInNuYXBzaG90UHJvZmlsZXMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtaW4tdy1mdWxsIGJvcmRlci1zZXBhcmF0ZVwiIHN0eWxlPVwiYm9yZGVyLXNwYWNpbmc6IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkIGNsYXNzPVwiYmctZ3JheS0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTUwIGJnLW9wYWNpdHktNzUgcHktMy41IHB4LTQgdGV4dC1sZWZ0IHRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIGJhY2tkcm9wLWJsdXIgYmFja2Ryb3AtZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTUwIGJnLW9wYWNpdHktNzUgcHktMy41IHB4LTQgdGV4dC1sZWZ0IHRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIGJhY2tkcm9wLWJsdXIgYmFja2Ryb3AtZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RpY2t5IHRvcC0wIHotMTAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMzAwIGJnLWdyYXktNTAgYmctb3BhY2l0eS03NSBweS0zLjUgcHgtNCB0ZXh0LWxlZnQgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgYmFja2Ryb3AtYmx1ciBiYWNrZHJvcC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RpY2t5IHRvcC0wIHotMTAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMzAwIGJnLWdyYXktNTAgYmctb3BhY2l0eS03NSBweS0zLjUgcHgtNCB0ZXh0LWxlZnQgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgYmFja2Ryb3AtYmx1ciBiYWNrZHJvcC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0IFN0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RpY2t5IHRvcC0wIHotMTAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMzAwIGJnLWdyYXktNTAgYmctb3BhY2l0eS03NSBweS0zLjUgcHgtNCB0ZXh0LWxlZnQgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgYmFja2Ryb3AtYmx1ciBiYWNrZHJvcC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXh0IFN0YXJ0IFRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RpY2t5IHRvcC0wIHotMTAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMzAwIGJnLWdyYXktNTAgYmctb3BhY2l0eS03NSBweS0zLjUgcHgtNCBiYWNrZHJvcC1ibHVyIGJhY2tkcm9wLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkVkaXQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJiZy13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHNuYXBzaG90IG9mIHNuYXBzaG90UHJvZmlsZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic25hcHNob3QudGFza1N0YXR1cyAhPT0gJ1JVTk5JTkcnXCIgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJUcmlnZ2VyIHNuYXBzaG90IHRvIHJ1biBub3dcIiBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0cmlnZ2VyU25hcHNob3Qoc25hcHNob3Qua2V5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cGxheV9hcnJvdzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdSVU5OSU5HJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFuaW1hdGUtc3BpbiBtbC0zIG1yLTIgaC01IHctNSB0ZXh0LXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJvcGFjaXR5LTI1XCIgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJvcGFjaXR5LTc1XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNCAxMmE4IDggMCAwMTgtOFYwQzUuMzczIDAgMCA1LjM3MyAwIDEyaDR6bTIgNS4yOTFBNy45NjIgNy45NjIgMCAwMTQgMTJIMGMwIDMuMDQyIDEuMTM1IDUuODI0IDMgNy45MzhsMy0yLjY0N3pcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwid2hpdGVzcGFjZS1ub3dyYXAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIHB5LTIgcHgtNCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzbmFwc2hvdC50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndoaXRlc3BhY2Utbm93cmFwIGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBweS0wLjUgcHgtMiB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXggdGV4dC1zbSBsb3dlcmNhc2UgZmxleCBpdGVtcy1jZW50ZXIgdGV4dC13aGl0ZSBweC0zIHJvdW5kZWQtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsncHktMC41Jzogc25hcHNob3QudGFza1N0YXR1cyAhPT0gJ1JVTk5JTkcnLCdweS0xJzogc25hcHNob3QudGFza1N0YXR1cyA9PT0gJ1JVTk5JTkcnLCAnYmctZ3JheS00MDAnOiBzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnUEVORElORycsICdiZy1zZWNvbmRhcnknOiBzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnUlVOTklORycsICdiZy1zdWNjZXNzJzogc25hcHNob3QudGFza1N0YXR1cyA9PT0gJ0NPTVBMRVRFRCcsICdiZy1kYW5nZXInOiBzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnRkFJTEVEJ31cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdQRU5ESU5HJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCItbWwtMSB3LTYgaC02IG1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgNnY2aDQuNW00LjUgMGE5IDkgMCAxMS0xOCAwIDkgOSAwIDAxMTggMHpcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdSVU5OSU5HJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImFuaW1hdGUtc3BpbiAtbWwtMSBtci0zIGgtNSB3LTUgdGV4dC13aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwib3BhY2l0eS0yNVwiIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJvcGFjaXR5LTc1XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00IDEyYTggOCAwIDAxOC04VjBDNS4zNzMgMCAwIDUuMzczIDAgMTJoNHptMiA1LjI5MUE3Ljk2MiA3Ljk2MiAwIDAxNCAxMkgwYzAgMy4wNDIgMS4xMzUgNS44MjQgMyA3LjkzOGwzLTIuNjQ3elwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic25hcHNob3QudGFza1N0YXR1cyA9PT0gJ0NPTVBMRVRFRCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiLW1sLTEgdy02IGgtNiBtci0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgMTIuNzVMMTEuMjUgMTUgMTUgOS43NU0yMSAxMmE5IDkgMCAxMS0xOCAwIDkgOSAwIDAxMTggMHpcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdGQUlMRUQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIi1tbC0xIHctNiBoLTYgbXItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMiA5djMuNzVtLTkuMzAzIDMuMzc2Yy0uODY2IDEuNS4yMTcgMy4zNzQgMS45NDggMy4zNzRoMTQuNzFjMS43MyAwIDIuODEzLTEuODc0IDEuOTQ4LTMuMzc0TDEzLjk0OSAzLjM3OGMtLjg2Ni0xLjUtMy4wMzItMS41LTMuODk4IDBMMi42OTcgMTYuMTI2ek0xMiAxNS43NWguMDA3di4wMDhIMTJ2LS4wMDh6XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnVElNRURfT1VUJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCItbWwtMSB3LTYgaC02IG1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQuMjUgOXY2bS00LjUgMFY5TTIxIDEyYTkgOSAwIDExLTE4IDAgOSA5IDAgMDExOCAwelwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBfLnN0YXJ0Q2FzZShzbmFwc2hvdC50YXNrU3RhdHVzKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndoaXRlc3BhY2Utbm93cmFwIGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBweS0yIHB4LTQgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc25hcHNob3QudGFza0xhc3RTdGFydFRpbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vd3JhcCBib3JkZXItYiBib3JkZXItZ3JheS0yMDAgcHktMiBweC00IHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNuYXBzaG90LnRhc2tOZXh0U3RhcnRUaW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicmVsYXRpdmUgd2hpdGVzcGFjZS1ub3dyYXAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIHB5LTIgcHgtNCB0ZXh0LXJpZ2h0IHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24tY2VudGVyIGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZWRpdFNuYXBzaG90KHNuYXBzaG90KVwiPiBFZGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJ3YXJuXCIgKGNsaWNrKT1cImRlbGV0ZVNuYXBzaG90KHNuYXBzaG90KVwiPiBEZWxldGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTRcIiAqbmdJZj1cIiFzbmFwc2hvdFByb2ZpbGVzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJlZGl0U25hcHNob3QobnVsbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBibG9jayB3LWZ1bGwgYm9yZGVyLTIgYm9yZGVyLWdyYXktMzAwIGJvcmRlci1kYXNoZWQgcm91bmRlZC1sZyBwLTEyIHRleHQtY2VudGVyIGhvdmVyOmJvcmRlci1ncmF5LTQwMCBmb2N1czpvdXRsaW5lLW5vbmVcIj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm14LWF1dG8gdGV4dC02eGwgaC0xNCB3LTIwIHRleHQtZ3JheS0zMDBcIj5oaXN0b3J5XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyaWdodC0wIGJvdHRvbS0wIGFic29sdXRlIGgtOCB3LTggdGV4dC1ncmF5LTQwMFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBkPVwiTTEyIDR2MTZtOC04SDRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdC0yIGJsb2NrIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMFwiPkNyZWF0ZSBTbmFwc2hvdCBQcm9maWxlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzaG93UXVlcnlDYWNoZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTYgcHktMyBiZy13aGl0ZSBib3JkZXItYiBib3JkZXItZ3JheS0yMDBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWQ6ZmxleCBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuIG1kOnNwYWNlLXgtNVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1zdGFydCBmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0xLjVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LWdyYXktOTAwIG1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5RdWVyeSBDYWNoaW5nPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdXAgUXVlcnkgQ2FjaGluZyBvbiB0aGlzIGRhdGEgc2V0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImVkaXRRdWVyeUNhY2hlKG51bGwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtNCBweS0xLjUgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHJvdW5kZWQtbWQgc2hhZG93LXNtIHRleHQtd2hpdGUgYmctcHJpbWFyeSBmb2N1czpvdXRsaW5lLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgUXVlcnkgQ2FjaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8a2ktcXVlcnktY2FjaGUtdmlldyBbbGltaXRdPVwiMTAwXCIgW3Nob3dQYWdlcl09XCJmYWxzZVwiIFtyZWxvYWRdPVwicmVsb2FkQ2FjaGVcIlxuICAgICAgICAgICAgICAgIFtkYXRhc2V0SW5zdGFuY2VdPVwiZGF0YXNldEluc3RhbmNlU3VtbWFyeS5pZFwiPjwva2ktcXVlcnktY2FjaGUtdmlldz5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3Jzei1sYXlvdXQ+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImNvbmZpZ3VyZS1mb290ZXJcIj5cbiAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJ0cnVlXCIgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgIENhbmNlbFxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJhbGlnbi1jZW50ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJtci0yIGJnLXdoaXRlXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNhbkhhdmVTbmFwc2hvdHMgJiYgIWRhdGFzZXRFZGl0b3JSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5IHx8ICFkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LmlkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlld1F1ZXJ5Q2FjaGluZygpXCI+XG4gICAgICAgICAgICBRdWVyeSBDYWNoaW5nXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cIm1yLTIgYmctd2hpdGVcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY2FuSGF2ZVNuYXBzaG90cyAmJiAhZGF0YXNldEVkaXRvclJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWRhdGFzZXRJbnN0YW5jZVN1bW1hcnkgfHwgIWRhdGFzZXRJbnN0YW5jZVN1bW1hcnkuaWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3U25hcHNob3RzKClcIj5cbiAgICAgICAgICAgIE1hbmFnZSBTbmFwc2hvdHNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJjYW5FeHBvcnREYXRhXCIgbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIGNsYXNzPVwibXItMiBiZy13aGl0ZVwiIChjbGljayk9XCJleHBvcnREYXRhKClcIj5cbiAgICAgICAgICAgIEV4cG9ydCBEYXRhXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWRhdGFzZXRFZGl0b3JSZWFkb25seVwiIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwic2F2ZUNoYW5nZXMoKVwiPlxuICAgICAgICAgICAgU2F2ZSAmIEV4aXRcbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbjwvZGl2PlxuIl19
|