@seniorsistemas/data-seniorx-core 2.3.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/constants/autocomplete.const.d.ts +4 -0
- package/core/constants/context-selector.const.d.ts +1 -0
- package/core/constants/gantt.const.d.ts +7 -0
- package/core/constants/hyperlink.const.d.ts +1 -0
- package/core/constants/inline-edit.const.d.ts +4 -0
- package/core/constants/kanban.const.d.ts +2 -0
- package/core/constants/pin-code-field.const.d.ts +5 -0
- package/core/constants/rating-scale.const.d.ts +1 -0
- package/core/constants/spotlight.const.d.ts +8 -0
- package/core/constants/star-rating.const.d.ts +4 -0
- package/core/constants/stepper.const.d.ts +1 -0
- package/core/constants/tiered-menu.const.d.ts +3 -0
- package/core/types/autocomplete.type.d.ts +9 -0
- package/core/types/chat.type.d.ts +12 -0
- package/core/types/checkbox-list.type.d.ts +12 -0
- package/core/types/gantt.type.d.ts +22 -0
- package/core/types/grid-menu.type.d.ts +13 -0
- package/core/types/hyperlink.type.d.ts +1 -0
- package/core/types/image-cropper.type.d.ts +20 -0
- package/core/types/inline-edit.type.d.ts +26 -0
- package/core/types/kanban.type.d.ts +36 -0
- package/core/types/panel.type.d.ts +16 -0
- package/core/types/profile-picture-picker.type.d.ts +9 -0
- package/core/types/rating-scale.type.d.ts +5 -0
- package/core/types/select-button.type.d.ts +1 -0
- package/core/types/spotlight.type.d.ts +34 -0
- package/core/types/star-rating.type.d.ts +1 -0
- package/core/types/stepper.type.d.ts +20 -0
- package/core/types/table-column.type.d.ts +3 -1
- package/core/types/table-options.type.d.ts +8 -2
- package/core/types/table.type.d.ts +1 -1
- package/core/types/tiered-menu.type.d.ts +16 -0
- package/core/types/tree.type.d.ts +25 -0
- package/core/types/workspace-switch.type.d.ts +6 -0
- package/core/utils/body-scroll.util.d.ts +2 -0
- package/core/utils/roving-focus.util.d.ts +2 -0
- package/core/utils/selection.util.d.ts +3 -0
- package/core/utils/tree.util.d.ts +4 -0
- package/esm2022/core/constants/autocomplete.const.mjs +5 -0
- package/esm2022/core/constants/context-selector.const.mjs +2 -0
- package/esm2022/core/constants/gantt.const.mjs +7 -0
- package/esm2022/core/constants/hyperlink.const.mjs +2 -1
- package/esm2022/core/constants/inline-edit.const.mjs +5 -0
- package/esm2022/core/constants/kanban.const.mjs +3 -0
- package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
- package/esm2022/core/constants/rating-scale.const.mjs +2 -0
- package/esm2022/core/constants/spotlight.const.mjs +9 -0
- package/esm2022/core/constants/star-rating.const.mjs +5 -0
- package/esm2022/core/constants/stepper.const.mjs +2 -0
- package/esm2022/core/constants/table.const.mjs +2 -2
- package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
- package/esm2022/core/types/autocomplete.type.mjs +2 -0
- package/esm2022/core/types/chat.type.mjs +2 -0
- package/esm2022/core/types/checkbox-list.type.mjs +2 -0
- package/esm2022/core/types/gantt.type.mjs +2 -0
- package/esm2022/core/types/grid-menu.type.mjs +2 -0
- package/esm2022/core/types/hyperlink.type.mjs +1 -1
- package/esm2022/core/types/image-cropper.type.mjs +2 -0
- package/esm2022/core/types/inline-edit.type.mjs +2 -0
- package/esm2022/core/types/kanban.type.mjs +2 -0
- package/esm2022/core/types/panel.type.mjs +9 -0
- package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
- package/esm2022/core/types/rating-scale.type.mjs +2 -0
- package/esm2022/core/types/select-button.type.mjs +1 -1
- package/esm2022/core/types/spotlight.type.mjs +2 -0
- package/esm2022/core/types/star-rating.type.mjs +2 -0
- package/esm2022/core/types/stepper.type.mjs +7 -0
- package/esm2022/core/types/table-column.type.mjs +1 -1
- package/esm2022/core/types/table-options.type.mjs +1 -1
- package/esm2022/core/types/table.type.mjs +1 -1
- package/esm2022/core/types/tiered-menu.type.mjs +2 -0
- package/esm2022/core/types/tree.type.mjs +2 -0
- package/esm2022/core/types/workspace-switch.type.mjs +2 -0
- package/esm2022/core/utils/body-scroll.util.mjs +19 -0
- package/esm2022/core/utils/combobox.util.mjs +3 -2
- package/esm2022/core/utils/roving-focus.util.mjs +20 -0
- package/esm2022/core/utils/selection.util.mjs +13 -0
- package/esm2022/core/utils/string.util.mjs +8 -3
- package/esm2022/core/utils/tree.util.mjs +23 -0
- package/esm2022/features/accordion/accordion.component.mjs +2 -2
- package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
- package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
- package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
- package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
- package/esm2022/features/card-list/card/card.component.mjs +63 -99
- package/esm2022/features/chat/chat.component.mjs +126 -0
- package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
- package/esm2022/features/combobox/combobox.component.mjs +20 -8
- package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
- package/esm2022/features/filters/filters.component.mjs +1 -1
- package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
- package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
- package/esm2022/features/gantt/gantt.component.mjs +89 -0
- package/esm2022/features/gantt/gantt.engine.mjs +662 -0
- package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
- package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
- package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
- package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
- package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
- package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
- package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
- package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
- package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
- package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
- package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
- package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
- package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
- package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
- package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
- package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
- package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
- package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
- package/esm2022/features/kanban/kanban.component.mjs +198 -0
- package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
- package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
- package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
- package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
- package/esm2022/features/paginator/paginator.component.mjs +8 -3
- package/esm2022/features/panel/panel.component.mjs +43 -11
- package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
- package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
- package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
- package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
- package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
- package/esm2022/features/select-button/select-button.component.mjs +7 -4
- package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
- package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
- package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
- package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
- package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
- package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
- package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
- package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
- package/esm2022/features/stepper/stepper.component.mjs +86 -0
- package/esm2022/features/switch/switch.component.mjs +12 -8
- package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
- package/esm2022/features/tab/tab.component.mjs +4 -4
- package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
- package/esm2022/features/table/table.component.mjs +220 -29
- package/esm2022/features/table/utils/table-data.util.mjs +71 -8
- package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
- package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
- package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
- package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
- package/esm2022/features/tree/tree.component.mjs +211 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
- package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
- package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
- package/esm2022/locales/en.json +351 -3
- package/esm2022/locales/es-CO.json +351 -3
- package/esm2022/locales/pt.json +351 -3
- package/esm2022/providers/features.provider.mjs +40 -4
- package/esm2022/public-api.mjs +56 -3
- package/features/accordion/accordion.component.d.ts +1 -1
- package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
- package/features/autocomplete/autocomplete.component.d.ts +102 -0
- package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
- package/features/card-list/card/card.component.d.ts +14 -34
- package/features/chat/chat.component.d.ts +31 -0
- package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
- package/features/combobox/combobox.component.d.ts +2 -1
- package/features/context-selector/context-selector.component.d.ts +37 -0
- package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
- package/features/gantt/gantt-date.utils.d.ts +36 -0
- package/features/gantt/gantt.component.d.ts +24 -0
- package/features/gantt/gantt.engine.d.ts +52 -0
- package/features/grid-menu/grid-menu.component.d.ts +29 -0
- package/features/hyperlink/hyperlink.component.d.ts +2 -1
- package/features/image-cropper/image-cropper.component.d.ts +43 -0
- package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
- package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
- package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
- package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
- package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
- package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
- package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
- package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
- package/features/inline-edit/inline-edit.component.d.ts +13 -0
- package/features/interactive-content/interactive-content.directive.d.ts +31 -0
- package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
- package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
- package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
- package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
- package/features/kanban/kanban.component.d.ts +32 -0
- package/features/kanban/services/kanban-event.service.d.ts +15 -0
- package/features/loading-state/loading-state.component.d.ts +0 -2
- package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
- package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
- package/features/panel/panel.component.d.ts +12 -3
- package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
- package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
- package/features/rating-scale/rating-scale.component.d.ts +24 -0
- package/features/select-button/select-button.component.d.ts +2 -1
- package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
- package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
- package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
- package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
- package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
- package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
- package/features/spotlight/spotlight.component.d.ts +59 -0
- package/features/star-rating/star-rating.component.d.ts +26 -0
- package/features/stepper/stepper.component.d.ts +23 -0
- package/features/switch/switch.component.d.ts +2 -1
- package/features/tab/tab.component.d.ts +1 -1
- package/features/table/components/table-cell-content.component.d.ts +4 -3
- package/features/table/table.component.d.ts +40 -5
- package/features/table/utils/table-data.util.d.ts +1 -0
- package/features/table/utils/table-layout.util.d.ts +1 -0
- package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
- package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
- package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
- package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
- package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
- package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
- package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
- package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
- package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
- package/features/tree/tree.component.d.ts +37 -0
- package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
- package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
- package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
- package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
- package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
- package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
- package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
- package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +8 -8
- package/public-api.d.ts +72 -2
- package/src/locales/en.json +353 -15
- package/src/locales/es-CO.json +352 -14
- package/src/locales/pt.json +352 -14
- package/styles/sdc-global-variables.scss +1 -1
- package/styles.css +1 -1
- /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewChildren, } from "@angular/core";
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewChildren, inject, } from "@angular/core";
|
|
2
2
|
import { FormsModule } from "@angular/forms";
|
|
3
3
|
import { TranslateModule } from "@ngx-translate/core";
|
|
4
4
|
import { DYNAMIC_VIEW_BUILDER_DEFAULT_TABLE_ROWS } from "../../core/constants/dynamic-view-builder.const";
|
|
5
|
-
import { DEFAULT_MODAL_Z_INDEX } from "../../core/constants/modal.const";
|
|
6
5
|
import { createDynamicViewBuilderConfig } from "../../core/config/dynamic-view-builder.config";
|
|
6
|
+
import { EMPTY_VALUE, EMPTY_SORT_FUNCTION, DEFAULT_FILTER_OPERATOR, DEFAULT_FILTER_VALUE_TYPE, FILTER_MODE_DOMAIN, OVERLAY_APPEND_TARGET, MODAL_OVERLAY_Z_INDEX, FIELD_PICKLIST_ROWS, FILTER_PICKLIST_ROWS, VISUAL_SQL_TABLE_COLOR, VISUAL_SQL_FIELD_COLOR, PICKLIST_DATA_TYPE_BADGE_COLOR, PICKLIST_FUNCTION_BADGE_COLOR, FALLBACK_SELECT_TABLES, FALLBACK_EMPTY_SELECTION, PREVIEW_ROWS_PER_PAGE_OPTIONS, ALIAS_MAX_LENGTH, MIN_PARTS_FOR_DB, DB_PARTS_OFFSET, MIN_PARTS_FOR_TABLE, JOIN_OPERATOR_LABELS, DYNAMIC_MODAL_DIMENSIONS, } from "./utils/visual-sql-editor.constants";
|
|
7
|
+
import { normalize, slugify, deduplicateByKey } from "./utils/visual-sql-editor-text.util";
|
|
8
|
+
import { buildGeneratedSql, buildWhereSql, buildGroupBySql, buildOrderBySql, resolveSourceSql, resolveJoinSql, resolveColumnSql, resolveFieldSql, resolveFunctionSql, resolveSortSql, resolveFilterSql, resolveFilterOperatorSql, resolveFilterValueSql, quoteSqlValue, decorateLikeValue, } from "./utils/visual-sql-editor-sql.util";
|
|
9
|
+
import { isNumericType, isDateType, filterOperatorsForColumn } from "./utils/visual-sql-editor-sanitize.util";
|
|
7
10
|
import { ButtonComponent } from "../button/button.component";
|
|
8
11
|
import { CheckboxComponent } from "../checkbox/checkbox.component";
|
|
9
12
|
import { CodeEditorComponent } from "../code-editor/code-editor.component";
|
|
@@ -16,92 +19,21 @@ import { TableComponent } from "../table/table.component";
|
|
|
16
19
|
import { TextareaComponent } from "../textarea/textarea.component";
|
|
17
20
|
import { TextboxComponent } from "../textbox/textbox.component";
|
|
18
21
|
import { TimelineComponent } from "../timeline/timeline.component";
|
|
22
|
+
import { VisualSqlEditorFlowService } from "./services/visual-sql-editor-flow.service";
|
|
23
|
+
import { VisualSqlEditorStateService } from "./services/visual-sql-editor-state.service";
|
|
24
|
+
import { VisualSqlEditorSourceModalComponent } from "./components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component";
|
|
25
|
+
import { VisualSqlEditorJoinModalComponent } from "./components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component";
|
|
26
|
+
import { VisualSqlEditorSortModalComponent } from "./components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component";
|
|
27
|
+
import { VisualSqlEditorFieldModalComponent } from "./components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component";
|
|
28
|
+
import { VisualSqlEditorFilterModalComponent } from "./components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component";
|
|
19
29
|
import * as i0 from "@angular/core";
|
|
20
30
|
import * as i1 from "@ngx-translate/core";
|
|
21
31
|
import * as i2 from "@angular/forms";
|
|
22
|
-
const EMPTY_VALUE = "";
|
|
23
|
-
const DEFAULT_JOIN_OPERATOR = "EQUALS";
|
|
24
|
-
const DEFAULT_FUNCTION_NAME = "count";
|
|
25
|
-
const DEFAULT_SORT_DIRECTION = "ASC";
|
|
26
|
-
const EMPTY_SORT_FUNCTION = "__base__";
|
|
27
|
-
const FLOW_ARROW_INSET = 3;
|
|
28
|
-
const FLOW_ARROW_MIN_GAP = 12;
|
|
29
|
-
const FLOW_ARROWS_REFRESH_DELAY_MS = 120;
|
|
30
|
-
const DEFAULT_FILTER_OPERATOR = "EQUAL";
|
|
31
|
-
const DEFAULT_FILTER_CONNECTOR = "AND";
|
|
32
|
-
const DEFAULT_FILTER_VALUE_TYPE = "value";
|
|
33
|
-
const FILTER_MODE_DOMAIN = "domain";
|
|
34
|
-
const OVERLAY_APPEND_TARGET = "body";
|
|
35
|
-
const MODAL_Z_INDEX_OFFSET = 20;
|
|
36
|
-
const MODAL_OVERLAY_Z_INDEX = DEFAULT_MODAL_Z_INDEX + MODAL_Z_INDEX_OFFSET;
|
|
37
|
-
const FIELD_PICKLIST_ROWS = 8;
|
|
38
|
-
const FILTER_PICKLIST_ROWS = 9;
|
|
39
|
-
const VISUAL_SQL_TABLE_COLOR = "#425466";
|
|
40
|
-
const VISUAL_SQL_FIELD_COLOR = "#1f8a52";
|
|
41
|
-
const PICKLIST_DATA_TYPE_BADGE_COLOR = "gray";
|
|
42
|
-
const PICKLIST_FUNCTION_BADGE_COLOR = "blue";
|
|
43
|
-
const FALLBACK_SELECT_TABLES = "Selecionar tabelas";
|
|
44
|
-
const FALLBACK_EMPTY_SELECTION = "Nenhum selecionado";
|
|
45
|
-
const PREVIEW_ROWS_PER_PAGE_OPTIONS = [5, 10, 20];
|
|
46
|
-
const ALIAS_MAX_LENGTH = 12;
|
|
47
|
-
const MIN_PARTS_FOR_DB = 3;
|
|
48
|
-
const DB_PARTS_OFFSET = -2;
|
|
49
|
-
const MIN_PARTS_FOR_TABLE = 2;
|
|
50
|
-
const JOIN_OPERATOR_LABELS = {
|
|
51
|
-
EQUALS: {
|
|
52
|
-
key: "joinOperators.equals",
|
|
53
|
-
fallback: "Igual a (=)",
|
|
54
|
-
},
|
|
55
|
-
NOT_EQUALS: {
|
|
56
|
-
key: "joinOperators.notEquals",
|
|
57
|
-
fallback: "Diferente de (<>)",
|
|
58
|
-
},
|
|
59
|
-
GREATER_THAN: {
|
|
60
|
-
key: "joinOperators.greaterThan",
|
|
61
|
-
fallback: "Maior que (>)",
|
|
62
|
-
},
|
|
63
|
-
GREATER_THAN_OR_EQUAL: {
|
|
64
|
-
key: "joinOperators.greaterThanOrEqual",
|
|
65
|
-
fallback: "Maior ou igual a (>=)",
|
|
66
|
-
},
|
|
67
|
-
LESS_THAN: {
|
|
68
|
-
key: "joinOperators.lessThan",
|
|
69
|
-
fallback: "Menor que (<)",
|
|
70
|
-
},
|
|
71
|
-
LESS_THAN_OR_EQUAL: {
|
|
72
|
-
key: "joinOperators.lessThanOrEqual",
|
|
73
|
-
fallback: "Menor ou igual a (<=)",
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
const DYNAMIC_MODAL_DIMENSIONS = {
|
|
77
|
-
source: {
|
|
78
|
-
width: "64rem",
|
|
79
|
-
height: "40rem",
|
|
80
|
-
},
|
|
81
|
-
selection: {
|
|
82
|
-
width: "64rem",
|
|
83
|
-
height: "40rem",
|
|
84
|
-
},
|
|
85
|
-
join: {
|
|
86
|
-
width: "70rem",
|
|
87
|
-
height: "40rem",
|
|
88
|
-
},
|
|
89
|
-
sort: {
|
|
90
|
-
width: "56rem",
|
|
91
|
-
height: "34rem",
|
|
92
|
-
},
|
|
93
|
-
filter: {
|
|
94
|
-
width: "68rem",
|
|
95
|
-
height: "55rem",
|
|
96
|
-
},
|
|
97
|
-
field: {
|
|
98
|
-
width: "68rem",
|
|
99
|
-
height: "42rem",
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
32
|
export class VisualSqlEditorComponent {
|
|
103
33
|
translate;
|
|
104
34
|
changeDetectorRef;
|
|
35
|
+
flowService = inject(VisualSqlEditorFlowService);
|
|
36
|
+
stateService = inject(VisualSqlEditorStateService);
|
|
105
37
|
internalConfig = createDynamicViewBuilderConfig();
|
|
106
38
|
sectionOrder = [
|
|
107
39
|
"tables",
|
|
@@ -111,8 +43,6 @@ export class VisualSqlEditorComponent {
|
|
|
111
43
|
"sorting",
|
|
112
44
|
"filters",
|
|
113
45
|
];
|
|
114
|
-
refreshFlowArrowsFrame = null;
|
|
115
|
-
refreshFlowArrowsTimeout = null;
|
|
116
46
|
layoutModeItems = [
|
|
117
47
|
{
|
|
118
48
|
label: "Blocos",
|
|
@@ -168,59 +98,42 @@ export class VisualSqlEditorComponent {
|
|
|
168
98
|
modalDimensions = DYNAMIC_MODAL_DIMENSIONS;
|
|
169
99
|
fieldPicklistRows = FIELD_PICKLIST_ROWS;
|
|
170
100
|
filterPicklistRows = FILTER_PICKLIST_ROWS;
|
|
171
|
-
|
|
172
|
-
sourceModalStep = "select";
|
|
173
|
-
sourceModalDrafts = [];
|
|
101
|
+
// ─── Selection modal state (not owned by stateService) ───────────────────────
|
|
174
102
|
selectionModalVisible = false;
|
|
175
103
|
selectionModalMode = "tables";
|
|
176
104
|
selectionModalIds = [];
|
|
177
105
|
selectionModalSearch = EMPTY_VALUE;
|
|
178
|
-
|
|
179
|
-
joinEditIndex = null;
|
|
106
|
+
// ─── Search state (local to component, not owned by stateService) ────────────
|
|
180
107
|
joinSourceSearch = EMPTY_VALUE;
|
|
181
108
|
joinTargetSearch = EMPTY_VALUE;
|
|
182
|
-
joinDraft = {
|
|
183
|
-
sourceColumn: EMPTY_VALUE,
|
|
184
|
-
targetColumn: EMPTY_VALUE,
|
|
185
|
-
operator: DEFAULT_JOIN_OPERATOR,
|
|
186
|
-
};
|
|
187
|
-
sortModalVisible = false;
|
|
188
|
-
sortEditIndex = null;
|
|
189
109
|
sortSearch = EMPTY_VALUE;
|
|
190
|
-
sortDraft = {
|
|
191
|
-
column: EMPTY_VALUE,
|
|
192
|
-
functionName: EMPTY_VALUE,
|
|
193
|
-
direction: DEFAULT_SORT_DIRECTION,
|
|
194
|
-
};
|
|
195
|
-
fieldModalVisible = false;
|
|
196
|
-
fieldModalStep = "select";
|
|
197
110
|
fieldModalSearch = EMPTY_VALUE;
|
|
198
|
-
fieldModalDrafts = [];
|
|
199
|
-
fieldFunctionEditColumn = null;
|
|
200
|
-
fieldFunctionDraft = {
|
|
201
|
-
column: EMPTY_VALUE,
|
|
202
|
-
functionName: EMPTY_VALUE,
|
|
203
|
-
functionAlias: EMPTY_VALUE,
|
|
204
|
-
};
|
|
205
|
-
filterModalVisible = false;
|
|
206
|
-
filterEditIndex = null;
|
|
207
|
-
filterModalStep = "select";
|
|
208
|
-
filterModalMode = "condition";
|
|
209
111
|
filterSearch = EMPTY_VALUE;
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
}
|
|
112
|
+
// ─── Delegate getters: modal state is owned by stateService ──────────────────
|
|
113
|
+
get sourceModalVisible() { return this.stateService.sourceModalVisible; }
|
|
114
|
+
set sourceModalVisible(value) { this.stateService.sourceModalVisible = value; }
|
|
115
|
+
get sourceModalStep() { return this.stateService.sourceModalStep; }
|
|
116
|
+
get sourceModalDrafts() { return this.stateService.sourceModalDrafts; }
|
|
117
|
+
get joinModalVisible() { return this.stateService.joinModalVisible; }
|
|
118
|
+
set joinModalVisible(value) { this.stateService.joinModalVisible = value; }
|
|
119
|
+
get joinEditIndex() { return this.stateService.joinEditIndex; }
|
|
120
|
+
get joinDraft() { return this.stateService.joinDraft; }
|
|
121
|
+
get sortModalVisible() { return this.stateService.sortModalVisible; }
|
|
122
|
+
set sortModalVisible(value) { this.stateService.sortModalVisible = value; }
|
|
123
|
+
get sortEditIndex() { return this.stateService.sortEditIndex; }
|
|
124
|
+
get sortDraft() { return this.stateService.sortDraft; }
|
|
125
|
+
get fieldModalVisible() { return this.stateService.fieldModalVisible; }
|
|
126
|
+
set fieldModalVisible(value) { this.stateService.fieldModalVisible = value; }
|
|
127
|
+
get fieldModalStep() { return this.stateService.fieldModalStep; }
|
|
128
|
+
get fieldModalDrafts() { return this.stateService.fieldModalDrafts; }
|
|
129
|
+
get fieldFunctionEditColumn() { return this.stateService.fieldFunctionEditColumn; }
|
|
130
|
+
get fieldFunctionDraft() { return this.stateService.fieldFunctionDraft; }
|
|
131
|
+
get filterModalVisible() { return this.stateService.filterModalVisible; }
|
|
132
|
+
set filterModalVisible(value) { this.stateService.filterModalVisible = value; }
|
|
133
|
+
get filterEditIndex() { return this.stateService.filterEditIndex; }
|
|
134
|
+
get filterModalStep() { return this.stateService.filterModalStep; }
|
|
135
|
+
get filterModalMode() { return this.stateService.filterModalMode; }
|
|
136
|
+
get filterDraft() { return this.stateService.filterDraft; }
|
|
224
137
|
constructor(translate, changeDetectorRef) {
|
|
225
138
|
this.translate = translate;
|
|
226
139
|
this.changeDetectorRef = changeDetectorRef;
|
|
@@ -229,22 +142,29 @@ export class VisualSqlEditorComponent {
|
|
|
229
142
|
this.syncSortDirectionItems();
|
|
230
143
|
this.sanitizeBuilder();
|
|
231
144
|
}
|
|
145
|
+
get flowContext() {
|
|
146
|
+
return {
|
|
147
|
+
sectionsContainer: this.sectionsContainer,
|
|
148
|
+
builderSections: this.builderSections,
|
|
149
|
+
sectionOrder: this.sectionOrder,
|
|
150
|
+
changeDetectorRef: this.changeDetectorRef,
|
|
151
|
+
onFlowArrowsChange: (arrows, measuredHeight) => {
|
|
152
|
+
this.flowArrows = arrows;
|
|
153
|
+
this.measuredSplitPreviewHeight = measuredHeight;
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
232
157
|
ngAfterViewInit() {
|
|
233
158
|
this.builderSections?.changes.subscribe(() => {
|
|
234
|
-
this.scheduleFlowArrowRefresh();
|
|
159
|
+
this.flowService.scheduleFlowArrowRefresh(this.flowContext);
|
|
235
160
|
});
|
|
236
|
-
this.scheduleFlowArrowRefresh();
|
|
161
|
+
this.flowService.scheduleFlowArrowRefresh(this.flowContext);
|
|
237
162
|
}
|
|
238
163
|
ngOnDestroy() {
|
|
239
|
-
|
|
240
|
-
cancelAnimationFrame(this.refreshFlowArrowsFrame);
|
|
241
|
-
}
|
|
242
|
-
if (this.refreshFlowArrowsTimeout !== null) {
|
|
243
|
-
clearTimeout(this.refreshFlowArrowsTimeout);
|
|
244
|
-
}
|
|
164
|
+
this.flowService.ngOnDestroy();
|
|
245
165
|
}
|
|
246
166
|
onWindowResize() {
|
|
247
|
-
this.scheduleFlowArrowRefresh();
|
|
167
|
+
this.flowService.scheduleFlowArrowRefresh(this.flowContext);
|
|
248
168
|
}
|
|
249
169
|
get selectedLayoutModeItem() {
|
|
250
170
|
return (this.layoutModeItems.find((item) => item.value === this.layoutMode) ??
|
|
@@ -1103,12 +1023,12 @@ export class VisualSqlEditorComponent {
|
|
|
1103
1023
|
if (next === "stacked" || next === "split") {
|
|
1104
1024
|
this.layoutMode = next;
|
|
1105
1025
|
this.syncSelectedLayoutModeItems();
|
|
1106
|
-
this.scheduleFlowArrowRefresh();
|
|
1026
|
+
this.flowService.scheduleFlowArrowRefresh(this.flowContext);
|
|
1107
1027
|
}
|
|
1108
1028
|
}
|
|
1109
1029
|
togglePreview() {
|
|
1110
1030
|
this.previewVisible = !this.previewVisible;
|
|
1111
|
-
this.scheduleFlowArrowRefresh();
|
|
1031
|
+
this.flowService.scheduleFlowArrowRefresh(this.flowContext);
|
|
1112
1032
|
}
|
|
1113
1033
|
onSortDirectionChange(items) {
|
|
1114
1034
|
const next = items[0]?.value;
|
|
@@ -1156,7 +1076,7 @@ export class VisualSqlEditorComponent {
|
|
|
1156
1076
|
}
|
|
1157
1077
|
openFieldModal(index) {
|
|
1158
1078
|
const current = typeof index === "number" ? this.normalizedFields[index] : undefined;
|
|
1159
|
-
|
|
1079
|
+
const drafts = this.getOrderedFieldEntries().map((item) => ({
|
|
1160
1080
|
column: item.column,
|
|
1161
1081
|
alias: item.alias?.trim() ?? EMPTY_VALUE,
|
|
1162
1082
|
width: item.width?.trim() ?? EMPTY_VALUE,
|
|
@@ -1167,16 +1087,9 @@ export class VisualSqlEditorComponent {
|
|
|
1167
1087
|
}
|
|
1168
1088
|
: null,
|
|
1169
1089
|
}));
|
|
1090
|
+
const openAtStep = typeof index === "number" && current ? "configure" : "select";
|
|
1170
1091
|
this.fieldModalSearch = EMPTY_VALUE;
|
|
1171
|
-
this.
|
|
1172
|
-
this.fieldFunctionDraft = {
|
|
1173
|
-
column: EMPTY_VALUE,
|
|
1174
|
-
functionName: EMPTY_VALUE,
|
|
1175
|
-
functionAlias: EMPTY_VALUE,
|
|
1176
|
-
};
|
|
1177
|
-
this.fieldModalStep =
|
|
1178
|
-
typeof index === "number" && current ? "configure" : "select";
|
|
1179
|
-
this.fieldModalVisible = true;
|
|
1092
|
+
this.stateService.openFieldModal(drafts, openAtStep);
|
|
1180
1093
|
}
|
|
1181
1094
|
openFieldConfigurationModal() {
|
|
1182
1095
|
if (!this.canOpenFieldConfiguration) {
|
|
@@ -1185,25 +1098,14 @@ export class VisualSqlEditorComponent {
|
|
|
1185
1098
|
this.openFieldModal(0);
|
|
1186
1099
|
}
|
|
1187
1100
|
closeFieldModal() {
|
|
1188
|
-
this.fieldModalVisible = false;
|
|
1189
|
-
this.fieldModalStep = "select";
|
|
1190
1101
|
this.fieldModalSearch = EMPTY_VALUE;
|
|
1191
|
-
this.
|
|
1192
|
-
this.fieldFunctionEditColumn = null;
|
|
1193
|
-
this.fieldFunctionDraft = {
|
|
1194
|
-
column: EMPTY_VALUE,
|
|
1195
|
-
functionName: EMPTY_VALUE,
|
|
1196
|
-
functionAlias: EMPTY_VALUE,
|
|
1197
|
-
};
|
|
1102
|
+
this.stateService.closeFieldModal();
|
|
1198
1103
|
}
|
|
1199
1104
|
goToFieldModalStep(step) {
|
|
1200
|
-
if (step === "configure" && !this.fieldModalDrafts.length) {
|
|
1201
|
-
return;
|
|
1202
|
-
}
|
|
1203
|
-
this.fieldModalStep = step;
|
|
1204
1105
|
if (step === "select") {
|
|
1205
1106
|
this.fieldModalSearch = EMPTY_VALUE;
|
|
1206
1107
|
}
|
|
1108
|
+
this.stateService.goToFieldModalStep(step);
|
|
1207
1109
|
}
|
|
1208
1110
|
advanceFieldModalStep() {
|
|
1209
1111
|
this.goToFieldModalStep("configure");
|
|
@@ -1212,13 +1114,13 @@ export class VisualSqlEditorComponent {
|
|
|
1212
1114
|
this.goToFieldModalStep(event.item.id === "configure" ? "configure" : "select");
|
|
1213
1115
|
}
|
|
1214
1116
|
selectFieldModalColumn(column) {
|
|
1215
|
-
const current = this.fieldModalDrafts.find((item) => item.column === column);
|
|
1117
|
+
const current = this.stateService.fieldModalDrafts.find((item) => item.column === column);
|
|
1216
1118
|
if (current) {
|
|
1217
1119
|
this.removeFieldModalDraft(column);
|
|
1218
1120
|
return;
|
|
1219
1121
|
}
|
|
1220
|
-
this.fieldModalDrafts = [
|
|
1221
|
-
...this.fieldModalDrafts,
|
|
1122
|
+
this.stateService.fieldModalDrafts = [
|
|
1123
|
+
...this.stateService.fieldModalDrafts,
|
|
1222
1124
|
{
|
|
1223
1125
|
column,
|
|
1224
1126
|
alias: EMPTY_VALUE,
|
|
@@ -1226,16 +1128,16 @@ export class VisualSqlEditorComponent {
|
|
|
1226
1128
|
function: null,
|
|
1227
1129
|
},
|
|
1228
1130
|
];
|
|
1229
|
-
this.fieldFunctionEditColumn = null;
|
|
1131
|
+
this.stateService.fieldFunctionEditColumn = null;
|
|
1230
1132
|
}
|
|
1231
1133
|
selectAllFieldModalColumns() {
|
|
1232
|
-
const selectedColumns = new Set(this.fieldModalDrafts.map((item) => item.column));
|
|
1134
|
+
const selectedColumns = new Set(this.stateService.fieldModalDrafts.map((item) => item.column));
|
|
1233
1135
|
const rowsToSelect = this.fieldSelectableColumns.filter((item) => !selectedColumns.has(item.value));
|
|
1234
1136
|
if (!rowsToSelect.length) {
|
|
1235
1137
|
return;
|
|
1236
1138
|
}
|
|
1237
|
-
this.fieldModalDrafts = [
|
|
1238
|
-
...this.fieldModalDrafts,
|
|
1139
|
+
this.stateService.fieldModalDrafts = [
|
|
1140
|
+
...this.stateService.fieldModalDrafts,
|
|
1239
1141
|
...rowsToSelect.map((item) => ({
|
|
1240
1142
|
column: item.value,
|
|
1241
1143
|
alias: EMPTY_VALUE,
|
|
@@ -1243,17 +1145,17 @@ export class VisualSqlEditorComponent {
|
|
|
1243
1145
|
function: null,
|
|
1244
1146
|
})),
|
|
1245
1147
|
];
|
|
1246
|
-
this.fieldFunctionEditColumn = null;
|
|
1148
|
+
this.stateService.fieldFunctionEditColumn = null;
|
|
1247
1149
|
}
|
|
1248
1150
|
addAnotherFieldFromModal() {
|
|
1249
|
-
this.fieldModalStep = "select";
|
|
1250
1151
|
this.fieldModalSearch = EMPTY_VALUE;
|
|
1152
|
+
this.stateService.fieldModalStep = "select";
|
|
1251
1153
|
}
|
|
1252
1154
|
onFieldModalSelectedIdsChange(ids) {
|
|
1253
1155
|
const selectedColumns = new Set(ids
|
|
1254
1156
|
.map((item) => this.resolveColumnPicklistColumn(item))
|
|
1255
1157
|
.filter((item) => !!item));
|
|
1256
|
-
const preservedDrafts = this.fieldModalDrafts.filter((item) => selectedColumns.has(item.column));
|
|
1158
|
+
const preservedDrafts = this.stateService.fieldModalDrafts.filter((item) => selectedColumns.has(item.column));
|
|
1257
1159
|
const preservedColumns = new Set(preservedDrafts.map((item) => item.column));
|
|
1258
1160
|
const appendedDrafts = this.fieldSelectableColumns
|
|
1259
1161
|
.filter((item) => selectedColumns.has(item.value) && !preservedColumns.has(item.value))
|
|
@@ -1263,13 +1165,13 @@ export class VisualSqlEditorComponent {
|
|
|
1263
1165
|
width: EMPTY_VALUE,
|
|
1264
1166
|
function: null,
|
|
1265
1167
|
}));
|
|
1266
|
-
this.fieldModalDrafts = [...preservedDrafts, ...appendedDrafts];
|
|
1267
|
-
if (this.fieldFunctionEditColumn &&
|
|
1268
|
-
!selectedColumns.has(this.fieldFunctionEditColumn)) {
|
|
1168
|
+
this.stateService.fieldModalDrafts = [...preservedDrafts, ...appendedDrafts];
|
|
1169
|
+
if (this.stateService.fieldFunctionEditColumn &&
|
|
1170
|
+
!selectedColumns.has(this.stateService.fieldFunctionEditColumn)) {
|
|
1269
1171
|
this.cancelFieldFunctionEdit();
|
|
1270
1172
|
}
|
|
1271
|
-
if (!this.fieldModalDrafts.length) {
|
|
1272
|
-
this.fieldModalStep = "select";
|
|
1173
|
+
if (!this.stateService.fieldModalDrafts.length) {
|
|
1174
|
+
this.stateService.fieldModalStep = "select";
|
|
1273
1175
|
}
|
|
1274
1176
|
}
|
|
1275
1177
|
onFieldModalAliasChange(column, value) {
|
|
@@ -1279,29 +1181,29 @@ export class VisualSqlEditorComponent {
|
|
|
1279
1181
|
this.patchFieldModalDraft(column, { width: value });
|
|
1280
1182
|
}
|
|
1281
1183
|
removeFieldModalDraft(column) {
|
|
1282
|
-
this.fieldModalDrafts = this.fieldModalDrafts.filter((item) => item.column !== column);
|
|
1283
|
-
if (this.fieldFunctionEditColumn === column) {
|
|
1184
|
+
this.stateService.fieldModalDrafts = this.stateService.fieldModalDrafts.filter((item) => item.column !== column);
|
|
1185
|
+
if (this.stateService.fieldFunctionEditColumn === column) {
|
|
1284
1186
|
this.cancelFieldFunctionEdit();
|
|
1285
1187
|
}
|
|
1286
|
-
if (!this.fieldModalDrafts.length) {
|
|
1287
|
-
this.fieldModalStep = "select";
|
|
1188
|
+
if (!this.stateService.fieldModalDrafts.length) {
|
|
1189
|
+
this.stateService.fieldModalStep = "select";
|
|
1288
1190
|
}
|
|
1289
1191
|
}
|
|
1290
1192
|
startFieldFunctionEdit(column) {
|
|
1291
|
-
const current = this.fieldModalDrafts.find((item) => item.column === column);
|
|
1193
|
+
const current = this.stateService.fieldModalDrafts.find((item) => item.column === column);
|
|
1292
1194
|
if (!current) {
|
|
1293
1195
|
return;
|
|
1294
1196
|
}
|
|
1295
|
-
this.fieldFunctionEditColumn = column;
|
|
1296
|
-
this.fieldFunctionDraft = {
|
|
1197
|
+
this.stateService.fieldFunctionEditColumn = column;
|
|
1198
|
+
this.stateService.fieldFunctionDraft = {
|
|
1297
1199
|
column,
|
|
1298
1200
|
functionName: current.function?.functionName?.trim() ?? EMPTY_VALUE,
|
|
1299
1201
|
functionAlias: current.function?.alias?.trim() ?? EMPTY_VALUE,
|
|
1300
1202
|
};
|
|
1301
1203
|
}
|
|
1302
1204
|
cancelFieldFunctionEdit() {
|
|
1303
|
-
this.fieldFunctionEditColumn = null;
|
|
1304
|
-
this.fieldFunctionDraft = {
|
|
1205
|
+
this.stateService.fieldFunctionEditColumn = null;
|
|
1206
|
+
this.stateService.fieldFunctionDraft = {
|
|
1305
1207
|
column: EMPTY_VALUE,
|
|
1306
1208
|
functionName: EMPTY_VALUE,
|
|
1307
1209
|
functionAlias: EMPTY_VALUE,
|
|
@@ -1327,7 +1229,7 @@ export class VisualSqlEditorComponent {
|
|
|
1327
1229
|
if (!this.canSaveFieldModal) {
|
|
1328
1230
|
return;
|
|
1329
1231
|
}
|
|
1330
|
-
this.config.generated.fields = this.fieldModalDrafts.map((item) => ({
|
|
1232
|
+
this.config.generated.fields = this.stateService.fieldModalDrafts.map((item) => ({
|
|
1331
1233
|
column: item.column,
|
|
1332
1234
|
alias: item.alias?.trim() ?? EMPTY_VALUE,
|
|
1333
1235
|
width: item.width?.trim() ?? EMPTY_VALUE,
|
|
@@ -1342,15 +1244,7 @@ export class VisualSqlEditorComponent {
|
|
|
1342
1244
|
this.afterBuilderMutation();
|
|
1343
1245
|
}
|
|
1344
1246
|
openSourceModal(step = "select") {
|
|
1345
|
-
this.
|
|
1346
|
-
table: item.table,
|
|
1347
|
-
alias: item.alias?.trim() || this.resolveDefaultSourceAlias(item.table),
|
|
1348
|
-
}));
|
|
1349
|
-
this.sourceModalStep =
|
|
1350
|
-
step === "configure" && this.sourceModalDrafts.length
|
|
1351
|
-
? "configure"
|
|
1352
|
-
: "select";
|
|
1353
|
-
this.sourceModalVisible = true;
|
|
1247
|
+
this.stateService.openSourceModal(this.config.generated.sources, (table) => this.resolveDefaultSourceAlias(table), step);
|
|
1354
1248
|
}
|
|
1355
1249
|
openSourceConfigurationModal() {
|
|
1356
1250
|
if (!this.canOpenSourceConfiguration) {
|
|
@@ -1359,15 +1253,10 @@ export class VisualSqlEditorComponent {
|
|
|
1359
1253
|
this.openSourceModal("configure");
|
|
1360
1254
|
}
|
|
1361
1255
|
closeSourceModal() {
|
|
1362
|
-
this.
|
|
1363
|
-
this.sourceModalStep = "select";
|
|
1364
|
-
this.sourceModalDrafts = [];
|
|
1256
|
+
this.stateService.closeSourceModal();
|
|
1365
1257
|
}
|
|
1366
1258
|
goToSourceModalStep(step) {
|
|
1367
|
-
|
|
1368
|
-
return;
|
|
1369
|
-
}
|
|
1370
|
-
this.sourceModalStep = step;
|
|
1259
|
+
this.stateService.goToSourceModalStep(step);
|
|
1371
1260
|
}
|
|
1372
1261
|
advanceSourceModalStep() {
|
|
1373
1262
|
this.goToSourceModalStep("configure");
|
|
@@ -1377,20 +1266,20 @@ export class VisualSqlEditorComponent {
|
|
|
1377
1266
|
}
|
|
1378
1267
|
onSourceModalSelectedIdsChange(ids) {
|
|
1379
1268
|
const selectedTables = this.resolveTablesFromPicklistIds(ids);
|
|
1380
|
-
const draftByTable = new Map(this.sourceModalDrafts.map((item) => [item.table, item]));
|
|
1381
|
-
this.sourceModalDrafts = selectedTables.map((table) => {
|
|
1269
|
+
const draftByTable = new Map(this.stateService.sourceModalDrafts.map((item) => [item.table, item]));
|
|
1270
|
+
this.stateService.sourceModalDrafts = selectedTables.map((table) => {
|
|
1382
1271
|
const current = draftByTable.get(table);
|
|
1383
1272
|
return (current ?? {
|
|
1384
1273
|
table,
|
|
1385
1274
|
alias: this.resolveDefaultSourceAlias(table),
|
|
1386
1275
|
});
|
|
1387
1276
|
});
|
|
1388
|
-
if (!this.sourceModalDrafts.length) {
|
|
1389
|
-
this.sourceModalStep = "select";
|
|
1277
|
+
if (!this.stateService.sourceModalDrafts.length) {
|
|
1278
|
+
this.stateService.sourceModalStep = "select";
|
|
1390
1279
|
}
|
|
1391
1280
|
}
|
|
1392
1281
|
onSourceModalAliasChange(table, value) {
|
|
1393
|
-
this.sourceModalDrafts = this.sourceModalDrafts.map((item) => item.table === table
|
|
1282
|
+
this.stateService.sourceModalDrafts = this.stateService.sourceModalDrafts.map((item) => item.table === table
|
|
1394
1283
|
? {
|
|
1395
1284
|
...item,
|
|
1396
1285
|
alias: value,
|
|
@@ -1398,10 +1287,10 @@ export class VisualSqlEditorComponent {
|
|
|
1398
1287
|
: item);
|
|
1399
1288
|
}
|
|
1400
1289
|
saveSourceModal() {
|
|
1401
|
-
if (!this.sourceModalDrafts.length) {
|
|
1290
|
+
if (!this.stateService.sourceModalDrafts.length) {
|
|
1402
1291
|
return;
|
|
1403
1292
|
}
|
|
1404
|
-
this.config.generated.sources = this.sourceModalDrafts.map((item) => {
|
|
1293
|
+
this.config.generated.sources = this.stateService.sourceModalDrafts.map((item) => {
|
|
1405
1294
|
const table = this.resolveTableOption(item.table);
|
|
1406
1295
|
return {
|
|
1407
1296
|
table: item.table,
|
|
@@ -1477,33 +1366,21 @@ export class VisualSqlEditorComponent {
|
|
|
1477
1366
|
}
|
|
1478
1367
|
openJoinModal(index) {
|
|
1479
1368
|
const current = typeof index === "number" ? this.config.generated.joins[index] : null;
|
|
1480
|
-
this.joinEditIndex = typeof index === "number" ? index : null;
|
|
1481
1369
|
this.joinSourceSearch = EMPTY_VALUE;
|
|
1482
1370
|
this.joinTargetSearch = EMPTY_VALUE;
|
|
1483
|
-
this.
|
|
1484
|
-
sourceColumn: current?.sourceColumn ?? EMPTY_VALUE,
|
|
1485
|
-
targetColumn: current?.targetColumn ?? EMPTY_VALUE,
|
|
1486
|
-
operator: current?.operator ?? DEFAULT_JOIN_OPERATOR,
|
|
1487
|
-
};
|
|
1488
|
-
this.joinModalVisible = true;
|
|
1371
|
+
this.stateService.openJoinModal(current, typeof index === "number" ? index : null);
|
|
1489
1372
|
}
|
|
1490
1373
|
closeJoinModal() {
|
|
1491
|
-
this.joinModalVisible = false;
|
|
1492
|
-
this.joinEditIndex = null;
|
|
1493
1374
|
this.joinSourceSearch = EMPTY_VALUE;
|
|
1494
1375
|
this.joinTargetSearch = EMPTY_VALUE;
|
|
1495
|
-
this.
|
|
1496
|
-
sourceColumn: EMPTY_VALUE,
|
|
1497
|
-
targetColumn: EMPTY_VALUE,
|
|
1498
|
-
operator: DEFAULT_JOIN_OPERATOR,
|
|
1499
|
-
};
|
|
1376
|
+
this.stateService.closeJoinModal();
|
|
1500
1377
|
}
|
|
1501
1378
|
selectJoinSource(column) {
|
|
1502
1379
|
this.joinDraft.sourceColumn =
|
|
1503
1380
|
this.joinDraft.sourceColumn === column ? EMPTY_VALUE : column;
|
|
1504
1381
|
const source = this.resolveColumnOption(this.joinDraft.sourceColumn);
|
|
1505
1382
|
const target = this.resolveColumnOption(this.joinDraft.targetColumn);
|
|
1506
|
-
if (source &&
|
|
1383
|
+
if (source?.table && source.table === target?.table) {
|
|
1507
1384
|
this.joinDraft.targetColumn = EMPTY_VALUE;
|
|
1508
1385
|
}
|
|
1509
1386
|
}
|
|
@@ -1513,7 +1390,7 @@ export class VisualSqlEditorComponent {
|
|
|
1513
1390
|
column && column === this.joinDraft.sourceColumn ? EMPTY_VALUE : column ?? EMPTY_VALUE;
|
|
1514
1391
|
const source = this.resolveColumnOption(this.joinDraft.sourceColumn);
|
|
1515
1392
|
const target = this.resolveColumnOption(this.joinDraft.targetColumn);
|
|
1516
|
-
if (source &&
|
|
1393
|
+
if (source?.table && source.table === target?.table) {
|
|
1517
1394
|
this.joinDraft.targetColumn = EMPTY_VALUE;
|
|
1518
1395
|
}
|
|
1519
1396
|
}
|
|
@@ -1548,24 +1425,12 @@ export class VisualSqlEditorComponent {
|
|
|
1548
1425
|
}
|
|
1549
1426
|
openSortModal(index) {
|
|
1550
1427
|
const current = typeof index === "number" ? this.config.generated.sorting[index] : null;
|
|
1551
|
-
this.sortEditIndex = typeof index === "number" ? index : null;
|
|
1552
1428
|
this.sortSearch = EMPTY_VALUE;
|
|
1553
|
-
this.
|
|
1554
|
-
column: current?.column ?? EMPTY_VALUE,
|
|
1555
|
-
functionName: current?.functionName?.trim() ?? EMPTY_VALUE,
|
|
1556
|
-
direction: current?.direction ?? DEFAULT_SORT_DIRECTION,
|
|
1557
|
-
};
|
|
1558
|
-
this.sortModalVisible = true;
|
|
1429
|
+
this.stateService.openSortModal(current, typeof index === "number" ? index : null);
|
|
1559
1430
|
}
|
|
1560
1431
|
closeSortModal() {
|
|
1561
|
-
this.sortModalVisible = false;
|
|
1562
|
-
this.sortEditIndex = null;
|
|
1563
1432
|
this.sortSearch = EMPTY_VALUE;
|
|
1564
|
-
this.
|
|
1565
|
-
column: EMPTY_VALUE,
|
|
1566
|
-
functionName: EMPTY_VALUE,
|
|
1567
|
-
direction: DEFAULT_SORT_DIRECTION,
|
|
1568
|
-
};
|
|
1433
|
+
this.stateService.closeSortModal();
|
|
1569
1434
|
}
|
|
1570
1435
|
selectSortColumn(sortSelectionId) {
|
|
1571
1436
|
const next = this.parseSortSelectionId(sortSelectionId);
|
|
@@ -1608,48 +1473,13 @@ export class VisualSqlEditorComponent {
|
|
|
1608
1473
|
}
|
|
1609
1474
|
openFilterModal(index) {
|
|
1610
1475
|
const current = typeof index === "number" ? this.config.generated.filters[index] : null;
|
|
1611
|
-
this.filterEditIndex = typeof index === "number" ? index : null;
|
|
1612
|
-
this.filterModalMode =
|
|
1613
|
-
current?.valueType === FILTER_MODE_DOMAIN ? FILTER_MODE_DOMAIN : "condition";
|
|
1614
|
-
this.filterModalStep = typeof index === "number" && current ? "configure" : "select";
|
|
1615
1476
|
this.filterSearch = EMPTY_VALUE;
|
|
1616
|
-
this.
|
|
1617
|
-
mode: this.filterModalMode,
|
|
1618
|
-
column: current?.column ?? EMPTY_VALUE,
|
|
1619
|
-
operator: current?.operator ?? DEFAULT_FILTER_OPERATOR,
|
|
1620
|
-
connector: current?.connector ?? DEFAULT_FILTER_CONNECTOR,
|
|
1621
|
-
optional: current?.optional ?? false,
|
|
1622
|
-
valueType: current?.valueType ?? DEFAULT_FILTER_VALUE_TYPE,
|
|
1623
|
-
value: current?.value ?? EMPTY_VALUE,
|
|
1624
|
-
valuesText: current?.values?.join(", ") ?? EMPTY_VALUE,
|
|
1625
|
-
betweenStart: current?.values?.[0] ?? EMPTY_VALUE,
|
|
1626
|
-
betweenEnd: current?.values?.[1] ?? EMPTY_VALUE,
|
|
1627
|
-
parameterName: current?.parameterName ?? EMPTY_VALUE,
|
|
1628
|
-
domainExpression: current?.domainExpression ?? EMPTY_VALUE,
|
|
1629
|
-
};
|
|
1477
|
+
this.stateService.openFilterModal(current, typeof index === "number" ? index : null);
|
|
1630
1478
|
this.syncSelectedFilterModeItems();
|
|
1631
|
-
this.filterModalVisible = true;
|
|
1632
1479
|
}
|
|
1633
1480
|
closeFilterModal() {
|
|
1634
|
-
this.filterModalVisible = false;
|
|
1635
|
-
this.filterEditIndex = null;
|
|
1636
|
-
this.filterModalStep = "select";
|
|
1637
|
-
this.filterModalMode = "condition";
|
|
1638
1481
|
this.filterSearch = EMPTY_VALUE;
|
|
1639
|
-
this.
|
|
1640
|
-
mode: "condition",
|
|
1641
|
-
column: EMPTY_VALUE,
|
|
1642
|
-
operator: DEFAULT_FILTER_OPERATOR,
|
|
1643
|
-
connector: DEFAULT_FILTER_CONNECTOR,
|
|
1644
|
-
optional: false,
|
|
1645
|
-
valueType: DEFAULT_FILTER_VALUE_TYPE,
|
|
1646
|
-
value: EMPTY_VALUE,
|
|
1647
|
-
valuesText: EMPTY_VALUE,
|
|
1648
|
-
betweenStart: EMPTY_VALUE,
|
|
1649
|
-
betweenEnd: EMPTY_VALUE,
|
|
1650
|
-
parameterName: EMPTY_VALUE,
|
|
1651
|
-
domainExpression: EMPTY_VALUE,
|
|
1652
|
-
};
|
|
1482
|
+
this.stateService.closeFilterModal();
|
|
1653
1483
|
this.syncSelectedFilterModeItems();
|
|
1654
1484
|
}
|
|
1655
1485
|
selectFilterColumn(column) {
|
|
@@ -1667,24 +1497,18 @@ export class VisualSqlEditorComponent {
|
|
|
1667
1497
|
}
|
|
1668
1498
|
resetFilterDraftValueState() {
|
|
1669
1499
|
const firstOperator = this.filterOperatorOptions[0]?.value ?? DEFAULT_FILTER_OPERATOR;
|
|
1670
|
-
this.filterDraft.operator = firstOperator;
|
|
1671
|
-
this.filterDraft.value = EMPTY_VALUE;
|
|
1672
|
-
this.filterDraft.valuesText = EMPTY_VALUE;
|
|
1673
|
-
this.filterDraft.betweenStart = EMPTY_VALUE;
|
|
1674
|
-
this.filterDraft.betweenEnd = EMPTY_VALUE;
|
|
1675
|
-
this.filterDraft.parameterName = EMPTY_VALUE;
|
|
1500
|
+
this.stateService.filterDraft.operator = firstOperator;
|
|
1501
|
+
this.stateService.filterDraft.value = EMPTY_VALUE;
|
|
1502
|
+
this.stateService.filterDraft.valuesText = EMPTY_VALUE;
|
|
1503
|
+
this.stateService.filterDraft.betweenStart = EMPTY_VALUE;
|
|
1504
|
+
this.stateService.filterDraft.betweenEnd = EMPTY_VALUE;
|
|
1505
|
+
this.stateService.filterDraft.parameterName = EMPTY_VALUE;
|
|
1676
1506
|
}
|
|
1677
1507
|
goToFilterModalStep(step) {
|
|
1678
|
-
if (step === "configure" && !this.filterModalCanProceed) {
|
|
1679
|
-
return;
|
|
1680
|
-
}
|
|
1681
|
-
if (step === "review" && !this.filterModalCanReview) {
|
|
1682
|
-
return;
|
|
1683
|
-
}
|
|
1684
|
-
this.filterModalStep = step;
|
|
1685
1508
|
if (step === "select") {
|
|
1686
1509
|
this.filterSearch = EMPTY_VALUE;
|
|
1687
1510
|
}
|
|
1511
|
+
this.stateService.goToFilterModalStep(step, this.filterModalCanProceed, this.filterModalCanReview);
|
|
1688
1512
|
}
|
|
1689
1513
|
advanceFilterModalStep() {
|
|
1690
1514
|
if (this.filterModalSelectionStepActive) {
|
|
@@ -1713,18 +1537,18 @@ export class VisualSqlEditorComponent {
|
|
|
1713
1537
|
}
|
|
1714
1538
|
}
|
|
1715
1539
|
onFilterModeChange(mode) {
|
|
1716
|
-
this.filterModalMode = mode;
|
|
1717
|
-
this.filterDraft.mode = mode;
|
|
1718
|
-
this.filterDraft.column = EMPTY_VALUE;
|
|
1719
|
-
this.filterDraft.operator = DEFAULT_FILTER_OPERATOR;
|
|
1720
|
-
this.filterDraft.valueType = DEFAULT_FILTER_VALUE_TYPE;
|
|
1721
|
-
this.filterDraft.value = EMPTY_VALUE;
|
|
1722
|
-
this.filterDraft.valuesText = EMPTY_VALUE;
|
|
1723
|
-
this.filterDraft.betweenStart = EMPTY_VALUE;
|
|
1724
|
-
this.filterDraft.betweenEnd = EMPTY_VALUE;
|
|
1725
|
-
this.filterDraft.parameterName = EMPTY_VALUE;
|
|
1726
|
-
this.filterDraft.domainExpression = EMPTY_VALUE;
|
|
1727
|
-
this.filterModalStep = "select";
|
|
1540
|
+
this.stateService.filterModalMode = mode;
|
|
1541
|
+
this.stateService.filterDraft.mode = mode;
|
|
1542
|
+
this.stateService.filterDraft.column = EMPTY_VALUE;
|
|
1543
|
+
this.stateService.filterDraft.operator = DEFAULT_FILTER_OPERATOR;
|
|
1544
|
+
this.stateService.filterDraft.valueType = DEFAULT_FILTER_VALUE_TYPE;
|
|
1545
|
+
this.stateService.filterDraft.value = EMPTY_VALUE;
|
|
1546
|
+
this.stateService.filterDraft.valuesText = EMPTY_VALUE;
|
|
1547
|
+
this.stateService.filterDraft.betweenStart = EMPTY_VALUE;
|
|
1548
|
+
this.stateService.filterDraft.betweenEnd = EMPTY_VALUE;
|
|
1549
|
+
this.stateService.filterDraft.parameterName = EMPTY_VALUE;
|
|
1550
|
+
this.stateService.filterDraft.domainExpression = EMPTY_VALUE;
|
|
1551
|
+
this.stateService.filterModalStep = "select";
|
|
1728
1552
|
this.syncSelectedFilterModeItems();
|
|
1729
1553
|
}
|
|
1730
1554
|
onFilterModalTimelineStepSelect(event) {
|
|
@@ -1759,7 +1583,7 @@ export class VisualSqlEditorComponent {
|
|
|
1759
1583
|
current.alias =
|
|
1760
1584
|
value.trim() || (table ? this.buildAliasForTable(table) : current.alias);
|
|
1761
1585
|
this.emitConfigChange();
|
|
1762
|
-
this.scheduleFlowArrowRefresh();
|
|
1586
|
+
this.flowService.scheduleFlowArrowRefresh(this.flowContext);
|
|
1763
1587
|
}
|
|
1764
1588
|
removeSource(index) {
|
|
1765
1589
|
this.config.generated.sources.splice(index, 1);
|
|
@@ -1816,7 +1640,7 @@ export class VisualSqlEditorComponent {
|
|
|
1816
1640
|
afterBuilderMutation() {
|
|
1817
1641
|
this.sanitizeBuilder();
|
|
1818
1642
|
this.emitConfigChange();
|
|
1819
|
-
this.scheduleFlowArrowRefresh();
|
|
1643
|
+
this.flowService.scheduleFlowArrowRefresh(this.flowContext);
|
|
1820
1644
|
}
|
|
1821
1645
|
emitConfigChange() {
|
|
1822
1646
|
this.configChange.emit(createDynamicViewBuilderConfig(this.config));
|
|
@@ -2011,11 +1835,7 @@ export class VisualSqlEditorComponent {
|
|
|
2011
1835
|
return values.some((value) => this.normalize(value).includes(normalizedSearch));
|
|
2012
1836
|
}
|
|
2013
1837
|
normalize(value) {
|
|
2014
|
-
return (value
|
|
2015
|
-
.normalize("NFD")
|
|
2016
|
-
.replace(/[\u0300-\u036f]/g, "")
|
|
2017
|
-
.toLowerCase()
|
|
2018
|
-
.trim();
|
|
1838
|
+
return normalize(value);
|
|
2019
1839
|
}
|
|
2020
1840
|
toggleMultipleValue(values, value) {
|
|
2021
1841
|
return values.includes(value)
|
|
@@ -2033,64 +1853,14 @@ export class VisualSqlEditorComponent {
|
|
|
2033
1853
|
}
|
|
2034
1854
|
return all;
|
|
2035
1855
|
}
|
|
2036
|
-
filterOperatorsForColumn(column) {
|
|
2037
|
-
const normalizedDataType = (column.dataType ?? EMPTY_VALUE).toLowerCase();
|
|
2038
|
-
if (normalizedDataType === "boolean") {
|
|
2039
|
-
return ["EQUAL", "NOT_EQUAL", "EMPTY", "NOT_EMPTY"];
|
|
2040
|
-
}
|
|
2041
|
-
if (normalizedDataType === "datetime" || normalizedDataType === "time" || normalizedDataType === "timestamp") {
|
|
2042
|
-
return [
|
|
2043
|
-
"EQUAL",
|
|
2044
|
-
"NOT_EQUAL",
|
|
2045
|
-
"GREATER_THAN",
|
|
2046
|
-
"GREATER_THAN_OR_EQUAL",
|
|
2047
|
-
"LESS_THAN",
|
|
2048
|
-
"LESS_THAN_OR_EQUAL",
|
|
2049
|
-
"BETWEEN",
|
|
2050
|
-
"EMPTY",
|
|
2051
|
-
"NOT_EMPTY",
|
|
2052
|
-
];
|
|
2053
|
-
}
|
|
2054
|
-
if (this.isNumericType(column.dataType) ||
|
|
2055
|
-
normalizedDataType === "date") {
|
|
2056
|
-
return [
|
|
2057
|
-
"EQUAL",
|
|
2058
|
-
"NOT_EQUAL",
|
|
2059
|
-
"GREATER_THAN",
|
|
2060
|
-
"GREATER_THAN_OR_EQUAL",
|
|
2061
|
-
"LESS_THAN",
|
|
2062
|
-
"LESS_THAN_OR_EQUAL",
|
|
2063
|
-
"BETWEEN",
|
|
2064
|
-
"IN",
|
|
2065
|
-
"EMPTY",
|
|
2066
|
-
"NOT_EMPTY",
|
|
2067
|
-
];
|
|
2068
|
-
}
|
|
2069
|
-
return [
|
|
2070
|
-
"EQUAL",
|
|
2071
|
-
"NOT_EQUAL",
|
|
2072
|
-
"CONTAINS",
|
|
2073
|
-
"DOES_NOT_CONTAIN",
|
|
2074
|
-
"STARTS_WITH",
|
|
2075
|
-
"ENDS_WITH",
|
|
2076
|
-
"IN",
|
|
2077
|
-
"EMPTY",
|
|
2078
|
-
"NOT_EMPTY",
|
|
2079
|
-
];
|
|
2080
|
-
}
|
|
2081
1856
|
isNumericType(value) {
|
|
2082
|
-
return
|
|
2083
|
-
"number",
|
|
2084
|
-
"integer",
|
|
2085
|
-
"decimal",
|
|
2086
|
-
"float",
|
|
2087
|
-
"double",
|
|
2088
|
-
"long",
|
|
2089
|
-
"short",
|
|
2090
|
-
].includes((value ?? "").toLowerCase());
|
|
1857
|
+
return isNumericType(value);
|
|
2091
1858
|
}
|
|
2092
1859
|
isDateType(value) {
|
|
2093
|
-
return
|
|
1860
|
+
return isDateType(value);
|
|
1861
|
+
}
|
|
1862
|
+
filterOperatorsForColumn(column) {
|
|
1863
|
+
return filterOperatorsForColumn(column);
|
|
2094
1864
|
}
|
|
2095
1865
|
resolveTableOption(value) {
|
|
2096
1866
|
return (this.config.availableData.tables ?? []).find((item) => item.value === value);
|
|
@@ -2242,194 +2012,49 @@ export class VisualSqlEditorComponent {
|
|
|
2242
2012
|
return filter.value ?? EMPTY_VALUE;
|
|
2243
2013
|
}
|
|
2244
2014
|
buildGeneratedSql() {
|
|
2245
|
-
|
|
2246
|
-
if (!sources.length) {
|
|
2247
|
-
return EMPTY_VALUE;
|
|
2248
|
-
}
|
|
2249
|
-
const selectParts = this.normalizedFields
|
|
2250
|
-
.map((field) => this.resolveFieldSql(field))
|
|
2251
|
-
.filter(Boolean);
|
|
2252
|
-
const sql = [
|
|
2253
|
-
"SELECT",
|
|
2254
|
-
` ${(selectParts.length ? selectParts : ["*"]).join(",\n ")}`,
|
|
2255
|
-
`FROM ${this.resolveSourceSql(sources[0])}`,
|
|
2256
|
-
...this.config.generated.joins.map((item) => this.resolveJoinSql(item)),
|
|
2257
|
-
...this.buildWhereSql(),
|
|
2258
|
-
...this.buildGroupBySql(),
|
|
2259
|
-
...this.buildOrderBySql(),
|
|
2260
|
-
];
|
|
2261
|
-
return sql.join("\n");
|
|
2015
|
+
return buildGeneratedSql(this.config.generated.sources, this.normalizedFields, this.config.generated.joins, this.config.generated.filters, this.config.generated.groupBy, this.config.generated.sorting, this.getSqlContext());
|
|
2262
2016
|
}
|
|
2263
2017
|
buildWhereSql() {
|
|
2264
|
-
|
|
2265
|
-
.map((filter, index) => {
|
|
2266
|
-
const connector = index === 0 ? "WHERE" : filter.connector;
|
|
2267
|
-
return ` ${connector} ${this.resolveFilterSql(filter)}`;
|
|
2268
|
-
})
|
|
2269
|
-
.filter((item) => !item.endsWith(EMPTY_VALUE));
|
|
2270
|
-
return expressions.length ? expressions : [];
|
|
2018
|
+
return buildWhereSql(this.getSqlContext(), this.config.generated.filters);
|
|
2271
2019
|
}
|
|
2272
2020
|
buildGroupBySql() {
|
|
2273
|
-
|
|
2274
|
-
return [];
|
|
2275
|
-
}
|
|
2276
|
-
return [
|
|
2277
|
-
"GROUP BY",
|
|
2278
|
-
` ${this.config.generated.groupBy
|
|
2279
|
-
.map((item) => this.resolveColumnSql(item))
|
|
2280
|
-
.join(",\n ")}`,
|
|
2281
|
-
];
|
|
2021
|
+
return buildGroupBySql(this.getSqlContext(), this.config.generated.groupBy);
|
|
2282
2022
|
}
|
|
2283
2023
|
buildOrderBySql() {
|
|
2284
|
-
|
|
2285
|
-
return [];
|
|
2286
|
-
}
|
|
2287
|
-
return [
|
|
2288
|
-
"ORDER BY",
|
|
2289
|
-
` ${this.config.generated.sorting
|
|
2290
|
-
.map((item) => `${this.resolveSortSql(item)} ${item.direction}`)
|
|
2291
|
-
.join(",\n ")}`,
|
|
2292
|
-
];
|
|
2024
|
+
return buildOrderBySql(this.getSqlContext(), this.config.generated.sorting);
|
|
2293
2025
|
}
|
|
2294
2026
|
resolveSourceSql(source) {
|
|
2295
|
-
|
|
2296
|
-
if (!table) {
|
|
2297
|
-
return EMPTY_VALUE;
|
|
2298
|
-
}
|
|
2299
|
-
const sourceAlias = "table" in source ? source.alias : EMPTY_VALUE;
|
|
2300
|
-
const fullName = table.schema ? `${table.schema}.${table.value}` : table.value;
|
|
2301
|
-
return sourceAlias ? `${fullName} ${sourceAlias}` : fullName;
|
|
2027
|
+
return resolveSourceSql(this.getSqlContext(), source);
|
|
2302
2028
|
}
|
|
2303
2029
|
resolveJoinSql(item) {
|
|
2304
|
-
return
|
|
2305
|
-
}
|
|
2306
|
-
resolveJoinedTableSql(item) {
|
|
2307
|
-
const targetColumn = this.resolveColumnOption(item.targetColumn);
|
|
2308
|
-
if (!targetColumn) {
|
|
2309
|
-
return EMPTY_VALUE;
|
|
2310
|
-
}
|
|
2311
|
-
const source = this.config.generated.sources.find((entry) => entry.table === targetColumn.table);
|
|
2312
|
-
if (!source) {
|
|
2313
|
-
return EMPTY_VALUE;
|
|
2314
|
-
}
|
|
2315
|
-
return this.resolveSourceSql(source);
|
|
2030
|
+
return resolveJoinSql(this.getSqlContext(), item);
|
|
2316
2031
|
}
|
|
2317
2032
|
resolveColumnSql(value) {
|
|
2318
|
-
|
|
2319
|
-
if (!column) {
|
|
2320
|
-
return value;
|
|
2321
|
-
}
|
|
2322
|
-
const alias = this.config.generated.sources.find((item) => item.table === column.table)?.alias;
|
|
2323
|
-
const fieldName = column.fullName.split(".").pop() ?? column.value;
|
|
2324
|
-
return alias ? `${alias}.${fieldName}` : column.fullName;
|
|
2033
|
+
return resolveColumnSql(this.getSqlContext(), value);
|
|
2325
2034
|
}
|
|
2326
2035
|
resolveFieldSql(field) {
|
|
2327
|
-
|
|
2328
|
-
const fieldSql = this.resolveColumnSql(normalizedField.column);
|
|
2329
|
-
if (normalizedField.function?.functionName) {
|
|
2330
|
-
return this.resolveFunctionSql({
|
|
2331
|
-
functionName: normalizedField.function.functionName,
|
|
2332
|
-
column: normalizedField.column,
|
|
2333
|
-
alias: normalizedField.function.alias?.trim() || // NOSONAR
|
|
2334
|
-
normalizedField.alias?.trim() || // NOSONAR
|
|
2335
|
-
EMPTY_VALUE,
|
|
2336
|
-
});
|
|
2337
|
-
}
|
|
2338
|
-
const alias = normalizedField.alias?.trim();
|
|
2339
|
-
return alias ? `${fieldSql} AS ${alias}` : fieldSql;
|
|
2036
|
+
return resolveFieldSql(this.getSqlContext(), field);
|
|
2340
2037
|
}
|
|
2341
2038
|
resolveFunctionSql(item) {
|
|
2342
|
-
|
|
2343
|
-
const argument = this.resolveColumnSql(item.column);
|
|
2344
|
-
const alias = item.alias?.trim();
|
|
2345
|
-
return alias
|
|
2346
|
-
? `${normalizedFunction}(${argument}) AS ${alias}`
|
|
2347
|
-
: `${normalizedFunction}(${argument})`;
|
|
2039
|
+
return resolveFunctionSql(this.getSqlContext(), item);
|
|
2348
2040
|
}
|
|
2349
2041
|
resolveSortSql(item) {
|
|
2350
|
-
|
|
2351
|
-
return this.resolveColumnSql(item.column);
|
|
2352
|
-
}
|
|
2353
|
-
return `${item.functionName.trim().toUpperCase()}(${this.resolveColumnSql(item.column)})`;
|
|
2354
|
-
}
|
|
2355
|
-
resolveJoinOperatorSql(value) {
|
|
2356
|
-
return ({
|
|
2357
|
-
EQUALS: "=",
|
|
2358
|
-
NOT_EQUALS: "<>",
|
|
2359
|
-
}[value] ?? value);
|
|
2042
|
+
return resolveSortSql(this.getSqlContext(), item);
|
|
2360
2043
|
}
|
|
2361
2044
|
resolveFilterSql(filter) {
|
|
2362
|
-
|
|
2363
|
-
return `(${filter.domainExpression ?? EMPTY_VALUE})`;
|
|
2364
|
-
}
|
|
2365
|
-
const field = this.resolveColumnSql(filter.column);
|
|
2366
|
-
if (!field) {
|
|
2367
|
-
return EMPTY_VALUE;
|
|
2368
|
-
}
|
|
2369
|
-
if (filter.operator === "EMPTY") {
|
|
2370
|
-
return `${field} IS NULL`;
|
|
2371
|
-
}
|
|
2372
|
-
if (filter.operator === "NOT_EMPTY") {
|
|
2373
|
-
return `${field} IS NOT NULL`;
|
|
2374
|
-
}
|
|
2375
|
-
if (filter.operator === "IN") {
|
|
2376
|
-
const values = (filter.values ?? []).map((item) => this.resolveFilterValueSql(filter.column, filter.operator, item));
|
|
2377
|
-
return `${field} IN (${values.join(", ")})`;
|
|
2378
|
-
}
|
|
2379
|
-
if (filter.operator === "BETWEEN") {
|
|
2380
|
-
return `${field} BETWEEN ${this.resolveFilterValueSql(filter.column, filter.operator, filter.values?.[0])} AND ${this.resolveFilterValueSql(filter.column, filter.operator, filter.values?.[1])}`;
|
|
2381
|
-
}
|
|
2382
|
-
if (filter.valueType === "parameter") {
|
|
2383
|
-
return `${field} ${this.resolveFilterOperatorSql(filter.operator)} :${filter.parameterName ?? EMPTY_VALUE}`;
|
|
2384
|
-
}
|
|
2385
|
-
return `${field} ${this.resolveFilterOperatorSql(filter.operator)} ${this.resolveFilterValueSql(filter.column, filter.operator, filter.value)}`;
|
|
2045
|
+
return resolveFilterSql(this.getSqlContext(), filter);
|
|
2386
2046
|
}
|
|
2387
2047
|
resolveFilterOperatorSql(value) {
|
|
2388
|
-
return (
|
|
2389
|
-
EQUAL: "=",
|
|
2390
|
-
NOT_EQUAL: "<>",
|
|
2391
|
-
GREATER: ">",
|
|
2392
|
-
GREATER_THAN: ">",
|
|
2393
|
-
GREATER_OR_EQUAL: ">=",
|
|
2394
|
-
GREATER_THAN_OR_EQUAL: ">=",
|
|
2395
|
-
LESS: "<",
|
|
2396
|
-
LESS_THAN: "<",
|
|
2397
|
-
LESS_OR_EQUAL: "<=",
|
|
2398
|
-
LESS_THAN_OR_EQUAL: "<=",
|
|
2399
|
-
CONTAINS: "LIKE",
|
|
2400
|
-
DOES_NOT_CONTAIN: "NOT LIKE",
|
|
2401
|
-
STARTS_WITH: "LIKE",
|
|
2402
|
-
ENDS_WITH: "LIKE",
|
|
2403
|
-
}[value] ?? value);
|
|
2048
|
+
return resolveFilterOperatorSql(value);
|
|
2404
2049
|
}
|
|
2405
2050
|
resolveFilterValueSql(columnValue, operator, value) {
|
|
2406
|
-
|
|
2407
|
-
const column = this.resolveColumnOption(columnValue);
|
|
2408
|
-
if (column?.dataType === "boolean") {
|
|
2409
|
-
return stringValue.toLowerCase() === "true" ? "TRUE" : "FALSE";
|
|
2410
|
-
}
|
|
2411
|
-
if (this.isNumericType(column?.dataType) && stringValue) {
|
|
2412
|
-
return stringValue;
|
|
2413
|
-
}
|
|
2414
|
-
if (["CONTAINS", "DOES_NOT_CONTAIN", "STARTS_WITH", "ENDS_WITH"].includes(operator)) {
|
|
2415
|
-
return this.quoteSqlValue(this.decorateLikeValue(operator, stringValue));
|
|
2416
|
-
}
|
|
2417
|
-
return this.quoteSqlValue(stringValue);
|
|
2051
|
+
return resolveFilterValueSql(this.getSqlContext(), columnValue, operator, value);
|
|
2418
2052
|
}
|
|
2419
2053
|
decorateLikeValue(operator, value) {
|
|
2420
|
-
|
|
2421
|
-
return `${value}%`;
|
|
2422
|
-
}
|
|
2423
|
-
if (operator === "ENDS_WITH") {
|
|
2424
|
-
return `%${value}`;
|
|
2425
|
-
}
|
|
2426
|
-
if (operator === "CONTAINS" || operator === "DOES_NOT_CONTAIN") {
|
|
2427
|
-
return `%${value}%`;
|
|
2428
|
-
}
|
|
2429
|
-
return value;
|
|
2054
|
+
return decorateLikeValue(operator, value);
|
|
2430
2055
|
}
|
|
2431
2056
|
quoteSqlValue(value) {
|
|
2432
|
-
return
|
|
2057
|
+
return quoteSqlValue(value);
|
|
2433
2058
|
}
|
|
2434
2059
|
syncLayoutModeItems() {
|
|
2435
2060
|
this.layoutModeItems[0].label = this.instantWithFallback(`${this.config.translationPrefix}.layoutModes.stacked`, "Blocos");
|
|
@@ -2463,6 +2088,13 @@ export class VisualSqlEditorComponent {
|
|
|
2463
2088
|
get filterSequenceIndex() {
|
|
2464
2089
|
return this.filterEditIndex ?? this.config.generated.filters.length;
|
|
2465
2090
|
}
|
|
2091
|
+
getSqlContext() {
|
|
2092
|
+
return {
|
|
2093
|
+
columns: this.config.availableData.columns ?? [],
|
|
2094
|
+
tables: this.config.availableData.tables ?? [],
|
|
2095
|
+
sources: this.config.generated.sources,
|
|
2096
|
+
};
|
|
2097
|
+
}
|
|
2466
2098
|
parseMultiValueText(value) {
|
|
2467
2099
|
return value
|
|
2468
2100
|
.split(",")
|
|
@@ -2534,7 +2166,7 @@ export class VisualSqlEditorComponent {
|
|
|
2534
2166
|
};
|
|
2535
2167
|
}
|
|
2536
2168
|
patchFieldModalDraft(column, patch) {
|
|
2537
|
-
this.fieldModalDrafts = this.fieldModalDrafts.map((item) => item.column === column
|
|
2169
|
+
this.stateService.fieldModalDrafts = this.stateService.fieldModalDrafts.map((item) => item.column === column
|
|
2538
2170
|
? {
|
|
2539
2171
|
...item,
|
|
2540
2172
|
...patch,
|
|
@@ -2545,12 +2177,10 @@ export class VisualSqlEditorComponent {
|
|
|
2545
2177
|
const fieldByColumn = new Map(fields.map((item) => [item.column, { ...item }]));
|
|
2546
2178
|
functions.forEach((item) => {
|
|
2547
2179
|
const current = fieldByColumn.get(item.column) ?? { column: item.column };
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
};
|
|
2553
|
-
}
|
|
2180
|
+
current.function ??= {
|
|
2181
|
+
functionName: item.functionName,
|
|
2182
|
+
alias: item.alias,
|
|
2183
|
+
};
|
|
2554
2184
|
fieldByColumn.set(item.column, current);
|
|
2555
2185
|
});
|
|
2556
2186
|
return Array.from(fieldByColumn.values());
|
|
@@ -2567,21 +2197,10 @@ export class VisualSqlEditorComponent {
|
|
|
2567
2197
|
}));
|
|
2568
2198
|
}
|
|
2569
2199
|
slugify(value) {
|
|
2570
|
-
|
|
2571
|
-
let start = 0;
|
|
2572
|
-
let end = normalized.length;
|
|
2573
|
-
while (start < end && normalized.charAt(start) === "_") {
|
|
2574
|
-
start += 1;
|
|
2575
|
-
}
|
|
2576
|
-
while (end > start && normalized.charAt(end - 1) === "_") {
|
|
2577
|
-
end -= 1;
|
|
2578
|
-
}
|
|
2579
|
-
return normalized.slice(start, end);
|
|
2200
|
+
return slugify(value);
|
|
2580
2201
|
}
|
|
2581
2202
|
deduplicateByKey(items, keyResolver) {
|
|
2582
|
-
|
|
2583
|
-
items.forEach((item) => map.set(keyResolver(item), item));
|
|
2584
|
-
return Array.from(map.values());
|
|
2203
|
+
return deduplicateByKey(items, keyResolver);
|
|
2585
2204
|
}
|
|
2586
2205
|
humanizeKey(value) {
|
|
2587
2206
|
return value
|
|
@@ -2683,94 +2302,12 @@ export class VisualSqlEditorComponent {
|
|
|
2683
2302
|
}
|
|
2684
2303
|
return this.filterDraft.value;
|
|
2685
2304
|
}
|
|
2686
|
-
scheduleFlowArrowRefresh() {
|
|
2687
|
-
if (this.refreshFlowArrowsFrame !== null) {
|
|
2688
|
-
cancelAnimationFrame(this.refreshFlowArrowsFrame);
|
|
2689
|
-
}
|
|
2690
|
-
if (this.refreshFlowArrowsTimeout !== null) {
|
|
2691
|
-
clearTimeout(this.refreshFlowArrowsTimeout);
|
|
2692
|
-
this.refreshFlowArrowsTimeout = null;
|
|
2693
|
-
}
|
|
2694
|
-
this.refreshFlowArrowsFrame = requestAnimationFrame(() => {
|
|
2695
|
-
this.refreshFlowArrowsFrame = null;
|
|
2696
|
-
this.refreshFlowArrows();
|
|
2697
|
-
this.refreshFlowArrowsTimeout = setTimeout(() => {
|
|
2698
|
-
this.refreshFlowArrowsTimeout = null;
|
|
2699
|
-
this.refreshFlowArrows();
|
|
2700
|
-
}, FLOW_ARROWS_REFRESH_DELAY_MS);
|
|
2701
|
-
});
|
|
2702
|
-
}
|
|
2703
|
-
refreshFlowArrows() {
|
|
2704
|
-
this.refreshMeasuredPreviewHeight();
|
|
2705
|
-
const nextArrows = this.buildFlowArrows();
|
|
2706
|
-
this.flowArrows = nextArrows;
|
|
2707
|
-
this.changeDetectorRef.markForCheck();
|
|
2708
|
-
}
|
|
2709
|
-
refreshMeasuredPreviewHeight() {
|
|
2710
|
-
const sectionsHeight = this.sectionsContainer?.nativeElement.offsetHeight ?? 0;
|
|
2711
|
-
this.measuredSplitPreviewHeight =
|
|
2712
|
-
sectionsHeight > 0 ? `${sectionsHeight}px` : "24rem";
|
|
2713
|
-
}
|
|
2714
|
-
buildFlowArrows() {
|
|
2715
|
-
const container = this.sectionsContainer?.nativeElement;
|
|
2716
|
-
const sections = this.builderSections?.toArray() ?? [];
|
|
2717
|
-
if (!container || sections.length < 2) {
|
|
2718
|
-
return [];
|
|
2719
|
-
}
|
|
2720
|
-
const sectionMap = new Map();
|
|
2721
|
-
sections.forEach((sectionRef) => {
|
|
2722
|
-
const sectionId = sectionRef.nativeElement.dataset["sectionId"];
|
|
2723
|
-
if (sectionId) {
|
|
2724
|
-
sectionMap.set(sectionId, sectionRef.nativeElement);
|
|
2725
|
-
}
|
|
2726
|
-
});
|
|
2727
|
-
const containerRect = container.getBoundingClientRect();
|
|
2728
|
-
return this.sectionOrder
|
|
2729
|
-
.slice(0, -1)
|
|
2730
|
-
.map((sectionId, index) => {
|
|
2731
|
-
const current = sectionMap.get(sectionId);
|
|
2732
|
-
const next = sectionMap.get(this.sectionOrder[index + 1]);
|
|
2733
|
-
if (!current || !next) {
|
|
2734
|
-
return null;
|
|
2735
|
-
}
|
|
2736
|
-
const currentRect = current.getBoundingClientRect();
|
|
2737
|
-
const nextRect = next.getBoundingClientRect();
|
|
2738
|
-
const isSameRow = Math.abs(currentRect.top - nextRect.top) < 16;
|
|
2739
|
-
const horizontalGap = Math.max(FLOW_ARROW_MIN_GAP, nextRect.left - currentRect.right);
|
|
2740
|
-
const verticalGap = Math.max(FLOW_ARROW_MIN_GAP, nextRect.top - currentRect.bottom);
|
|
2741
|
-
const overlapLeft = Math.max(currentRect.left, nextRect.left);
|
|
2742
|
-
const overlapRight = Math.min(currentRect.right, nextRect.right);
|
|
2743
|
-
const overlapTop = Math.max(currentRect.top, nextRect.top);
|
|
2744
|
-
const overlapBottom = Math.min(currentRect.bottom, nextRect.bottom);
|
|
2745
|
-
const nextCenterX = nextRect.left + nextRect.width / 2;
|
|
2746
|
-
const sameRowTop = overlapTop < overlapBottom
|
|
2747
|
-
? overlapTop + (overlapBottom - overlapTop) / 2
|
|
2748
|
-
: (currentRect.top +
|
|
2749
|
-
currentRect.height / 2 +
|
|
2750
|
-
(nextRect.top + nextRect.height / 2)) /
|
|
2751
|
-
2;
|
|
2752
|
-
const downLeft = overlapLeft < overlapRight
|
|
2753
|
-
? overlapLeft + (overlapRight - overlapLeft) / 2
|
|
2754
|
-
: (currentRect.left + currentRect.width / 2 + nextCenterX) / 2;
|
|
2755
|
-
return {
|
|
2756
|
-
id: `${sectionId}-${this.sectionOrder[index + 1]}`,
|
|
2757
|
-
direction: isSameRow ? "right" : "down",
|
|
2758
|
-
left: isSameRow
|
|
2759
|
-
? currentRect.right - containerRect.left - FLOW_ARROW_INSET + horizontalGap / 2
|
|
2760
|
-
: downLeft - containerRect.left,
|
|
2761
|
-
top: isSameRow
|
|
2762
|
-
? sameRowTop - containerRect.top
|
|
2763
|
-
: currentRect.bottom - containerRect.top - FLOW_ARROW_INSET + verticalGap / 2,
|
|
2764
|
-
};
|
|
2765
|
-
})
|
|
2766
|
-
.filter((item) => !!item);
|
|
2767
|
-
}
|
|
2768
2305
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VisualSqlEditorComponent, deps: [{ token: i1.TranslateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
2769
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: VisualSqlEditorComponent, isStandalone: true, selector: "sdc-visual-sql-editor", inputs: { loading: "loading", config: "config" }, outputs: { configChange: "configChange", save: "save", cancel: "cancel" }, host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "sectionsContainer", first: true, predicate: ["sectionsContainer"], descendants: true }, { propertyName: "builderSections", predicate: ["builderSection"], descendants: true }], ngImport: i0, template: "<div class=\"dynamic-view-builder\" [attr.aria-busy]=\"loading\">\n <div class=\"dynamic-view-builder__toolbar\">\n <div class=\"dynamic-view-builder__toolbar-copy\">\n <div class=\"dynamic-view-builder__title\">\n {{ config.metadata.title }}\n </div>\n <div class=\"dynamic-view-builder__subtitle\">\n {{ config.metadata.description }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__toolbar-actions\">\n <span class=\"dynamic-view-builder__toolbar-label\">\n {{ (config.translationPrefix + '.fields.layoutMode') | translate }}\n </span>\n <sdc-select-button\n [items]=\"layoutModeItems\"\n [ngModel]=\"selectedLayoutModeItems\"\n (ngModelChange)=\"onLayoutModeChange($event)\"\n ></sdc-select-button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__preview-toggle\"\n (click)=\"togglePreview()\"\n [attr.aria-pressed]=\"previewVisible\"\n [title]=\"previewToggleLabel\"\n [attr.aria-label]=\"previewToggleLabel\"\n >\n <i\n [class]=\"previewVisible ? 'fas fa-eye-slash' : 'fas fa-eye'\"\n aria-hidden=\"true\"\n ></i>\n {{ previewToggleLabel }}\n </button>\n </div>\n </div>\n\n @if (selectionModalVisible) {\n <sdc-modal\n [visible]=\"selectionModalVisible\"\n (visibleChange)=\"$event ? (selectionModalVisible = true) : closeSelectionModal()\"\n [header]=\"selectionModalTitle\"\n [width]=\"modalDimensions.selection.width\"\n [height]=\"modalDimensions.selection.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n @if (selectionModalMode === 'tables') {\n <div class=\"dynamic-view-builder__modal-inline-surface\">\n <sdc-textbox\n [label]=\"modalSearchLabel\"\n [placeholder]=\"modalSearchPlaceholder\"\n [ngModel]=\"selectionModalSearch\"\n (ngModelChange)=\"selectionModalSearch = $event\"\n width=\"100%\"\n ></sdc-textbox>\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-stage-body\"\n >\n <div\n class=\"dynamic-view-builder__selection-table\n dynamic-view-builder__selection-table--chooser\n dynamic-view-builder__selection-table--fluid\"\n >\n <div class=\"dynamic-view-builder__selection-head\">\n <div class=\"dynamic-view-builder__selection-col\">\n {{ modalNameLabel }}\n </div>\n <div class=\"dynamic-view-builder__selection-col\">\n {{ modalTypeLabel }}\n </div>\n <div class=\"dynamic-view-builder__selection-col dynamic-view-builder__selection-col--select\">\n {{ modalSelectLabel }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__selection-body\">\n @for (row of selectionModalRows; track trackById($index, row)) {\n <div\n class=\"dynamic-view-builder__selection-row\"\n [class.dynamic-view-builder__selection-row--selected]=\"row.selected\"\n [attr.role]=\"'button'\"\n [attr.tabindex]=\"row.disabled ? -1 : 0\"\n [attr.aria-pressed]=\"row.selected\"\n [attr.aria-disabled]=\"row.disabled\"\n (click)=\"toggleSelectionModalRow(row.id)\"\n (keydown)=\"onSelectableRowKeydown($event)\"\n >\n <div class=\"dynamic-view-builder__selection-cell\">\n @if (row.tableLabel) {\n <span class=\"dynamic-view-builder__selection-path\">\n @if (row.pathType === 'table') {\n @if (row.dbLabel) {\n <span class=\"dynamic-view-builder__selection-db\">{{ row.dbLabel }}</span>\n }\n @if (row.dbLabel) {\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n }\n <span class=\"dynamic-view-builder__selection-table-label\">{{ row.tableLabel }}</span>\n } @else {\n <span class=\"dynamic-view-builder__selection-table-label\">{{ row.tableLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ row.name }}</span>\n }\n </span>\n } @else {\n {{ row.name }}\n }\n </div>\n <div class=\"dynamic-view-builder__selection-cell dynamic-view-builder__selection-cell--meta\">\n <span>{{ row.meta }}</span>\n @if (row.note) {\n <span class=\"dynamic-view-builder__selection-note\">\n {{ row.note }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__selection-cell dynamic-view-builder__selection-cell--select\">\n <span\n class=\"dynamic-view-builder__selection-marker\"\n [class.dynamic-view-builder__selection-marker--selected]=\"row.selected\"\n aria-hidden=\"true\"\n >\n <i class=\"fas fa-check\"></i>\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"selectionModalPicklistItems\"\n [selectedIds]=\"selectionModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSelectionModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSelectionModal()\"\n (keydown.enter)=\"closeSelectionModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.confirmSelection') | translate\"\n (click)=\"confirmSelectionModal()\"\n (keydown.enter)=\"confirmSelectionModal()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (sourceModalVisible) {\n <sdc-modal\n [visible]=\"sourceModalVisible\"\n (visibleChange)=\"$event ? (sourceModalVisible = true) : closeSourceModal()\"\n [header]=\"sourceModalTitle\"\n [width]=\"modalDimensions.source.width\"\n [height]=\"modalDimensions.source.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__field-modal\">\n <sdc-timeline\n [items]=\"sourceModalTimelineItems\"\n [activeIndex]=\"sourceModalConfigurationStepActive ? 1 : 0\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"sourceModalTimelineAriaLabel\"\n (stepSelect)=\"onSourceModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (sourceModalSelectionStepActive) {\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"sourceModalPicklistItems\"\n [selectedIds]=\"sourceModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSourceModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__field-config-shell\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-list-shell\"\n >\n <div class=\"dynamic-view-builder__source-config-list\">\n @for (item of sourceModalConfiguredItems; track trackById($index, item)) {\n <div class=\"dynamic-view-builder__source-config-row\">\n <div class=\"dynamic-view-builder__source-config-main\">\n <div class=\"dynamic-view-builder__field-config-title\">\n <span class=\"dynamic-view-builder__selection-table-label\">{{ item.dbLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ item.tableLabel }}</span>\n </div>\n </div>\n <div class=\"dynamic-view-builder__source-config-controls\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"item.alias\"\n (ngModelChange)=\"onSourceModalAliasChange(item.table, $event)\"\n width=\"100%\"\n [maxlength]=\"24\"\n ></sdc-textbox>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSourceModal()\"\n (keydown.enter)=\"closeSourceModal()\"\n ></sdc-button>\n @if (sourceModalSelectionStepActive && sourceModalCanProceed) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.nextStep') | translate\"\n (click)=\"advanceSourceModalStep()\"\n (keydown.enter)=\"advanceSourceModalStep()\"\n ></sdc-button>\n }\n @if (sourceModalConfigurationStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!sourceModalCanProceed\"\n (click)=\"saveSourceModal()\"\n (keydown.enter)=\"saveSourceModal()\"\n ></sdc-button>\n }\n </div>\n </sdc-modal>\n }\n\n @if (joinModalVisible) {\n <sdc-modal\n [visible]=\"joinModalVisible\"\n (visibleChange)=\"$event ? (joinModalVisible = true) : closeJoinModal()\"\n [header]=\"(config.translationPrefix + '.cards.joins.title') | translate\"\n [width]=\"modalDimensions.join.width\"\n [height]=\"modalDimensions.join.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__join-modal\">\n <div class=\"dynamic-view-builder__join-modal-top\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-card\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.left') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >{{ joinSourceSummary }}</div>\n </div>\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--compact\n dynamic-view-builder__modal-card\"\n >\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.operator'\"\n [ngModel]=\"joinDraft.operator\"\n (ngModelChange)=\"joinDraft.operator = $event\"\n [options]=\"joinOperatorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n </div>\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-card\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.right') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >{{ joinTargetSummary }}</div>\n </div>\n </div>\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--fit\">\n <div\n class=\"dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__modal-card dynamic-view-builder__picklist-shell\"\n >\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.left') | translate }}\n </div>\n <sdc-picklist\n [items]=\"joinSourcePicklistItems\"\n [selectedIds]=\"joinSourceSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onJoinSourceSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n <div\n class=\"dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__modal-card dynamic-view-builder__picklist-shell\"\n >\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.right') | translate }}\n </div>\n <sdc-picklist\n [items]=\"joinTargetPicklistItems\"\n [selectedIds]=\"joinTargetSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onJoinTargetSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeJoinModal()\"\n (keydown.enter)=\"closeJoinModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveJoin\"\n (click)=\"saveJoin()\"\n (keydown.enter)=\"saveJoin()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (sortModalVisible) {\n <sdc-modal\n [visible]=\"sortModalVisible\"\n (visibleChange)=\"$event ? (sortModalVisible = true) : closeSortModal()\"\n [header]=\"sortModalTitle\"\n [width]=\"modalDimensions.sort.width\"\n [height]=\"modalDimensions.sort.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__sort-modal\">\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--full\n dynamic-view-builder__sort-direction-field\"\n >\n <div class=\"dynamic-view-builder__modal-label\">\n {{ (config.translationPrefix + '.fields.direction') | translate }}\n </div>\n <sdc-select-button\n class=\"dynamic-view-builder__sort-direction\"\n [items]=\"sortDirectionItems\"\n appearance=\"soft\"\n [ngModel]=\"selectedSortDirectionItems\"\n (ngModelChange)=\"onSortDirectionChange($event)\"\n ></sdc-select-button>\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__selection-flow dynamic-view-builder__picklist-shell\n dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"sortPicklistItems\"\n [selectedIds]=\"sortSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSortSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSortModal()\"\n (keydown.enter)=\"closeSortModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveSort\"\n (click)=\"saveSort()\"\n (keydown.enter)=\"saveSort()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (filterModalVisible) {\n <sdc-modal\n [visible]=\"filterModalVisible\"\n (visibleChange)=\"$event ? (filterModalVisible = true) : closeFilterModal()\"\n [header]=\"filterModalTitle\"\n [width]=\"modalDimensions.filter.width\"\n [height]=\"modalDimensions.filter.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__filter-modal\">\n <sdc-timeline\n [items]=\"filterModalTimelineItems\"\n [activeIndex]=\"filterModalReviewStepActive ? 2 : (filterModalConfigurationStepActive ? 1 : 0)\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"filterModalTimelineAriaLabel\"\n (stepSelect)=\"onFilterModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (filterModalSelectionStepActive) {\n <div class=\"dynamic-view-builder__filter-step\">\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-base-selector\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.modals.filter.steps.select.title') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.filters.tooltips.mode'\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-mode-row\">\n <div class=\"dynamic-view-builder__filter-mode-copy\">\n {{ (config.translationPrefix + '.modals.filter.title') | translate }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__filter-mode-selector\">\n <sdc-select-button\n [items]=\"filterModeItems\"\n appearance=\"soft\"\n [ngModel]=\"selectedFilterModeItems\"\n (ngModelChange)=\"onFilterModeChange($event[0]?.value || 'condition')\"\n ></sdc-select-button>\n </div>\n </div>\n @if (filterModalMode === 'condition') {\n <div\n class=\"dynamic-view-builder__modal-picker\n dynamic-view-builder__modal-picker--filter\n dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__selection-flow\n dynamic-view-builder__modal-stage-body\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell\"\n >\n <sdc-picklist\n [items]=\"filterModalPicklistItems\"\n [selectedIds]=\"filterModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [autoResize]=\"false\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onFilterModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-domain-intro\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.filters.domainLabel') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"filterDomainExpressionTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-grid\">\n <div class=\"dynamic-view-builder__filter-domain-item\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.domainExpression') | translate }}\n </div>\n <div class=\"dynamic-view-builder__modal-summary-value\">\n {{ filterDomainExpressionTooltip }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-item\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.connector') | translate }}\n </div>\n <div class=\"dynamic-view-builder__modal-summary-value\">\n {{ filterConnectorTooltip }}\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n } @else {\n @if (filterModalConfigurationStepActive) {\n <div class=\"dynamic-view-builder__filter-step\">\n <div class=\"dynamic-view-builder__filter-toolbar\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-summary--filter\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.modals.filter.steps.configure.title') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >\n {{ filterConfigurationSummaryLabel }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"goToFilterModalStep('select')\"\n >\n {{ filterBackToSelectionLabel }}\n </button>\n </div>\n @if (filterModalMode === 'condition') {\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-config-section\">\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.modals.filter.steps.configure.title') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.filters.tooltips.configure'\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--filter-controls\">\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.connector'\"\n [ngModel]=\"filterDraft.connector\"\n (ngModelChange)=\"filterDraft.connector = $event\"\n [options]=\"filterConnectorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterConnectorDisabled\"\n [infoTooltip]=\"filterConnectorTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.operator'\"\n [ngModel]=\"filterDraft.operator\"\n (ngModelChange)=\"filterDraft.operator = $event; onFilterOperatorChange()\"\n [options]=\"filterOperatorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n [disabled]=\"!filterDraft.column\"\n [infoTooltip]=\"filterOperatorTooltip\"\n ></sdc-combobox>\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.valueType'\"\n [ngModel]=\"filterDraft.valueType\"\n (ngModelChange)=\"filterDraft.valueType = $event; onFilterValueTypeChange()\"\n [options]=\"valueTypeOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterValueTypeDisabled\"\n [infoTooltip]=\"filterValueTypeTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <div class=\"dynamic-view-builder__filter-optional\">\n <sdc-checkbox\n [label]=\"config.translationPrefix + '.states.optional'\"\n [ngModel]=\"filterDraft.optional\"\n (ngModelChange)=\"filterDraft.optional = $event\"\n ></sdc-checkbox>\n <sdc-info-sign\n [tooltip]=\"filterOptionalTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n </div>\n </div>\n <div\n class=\"dynamic-view-builder__filter-config-section\n dynamic-view-builder__filter-config-section--value\"\n >\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--single\">\n @if (showFilterBooleanCombobox) {\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.value'\"\n [ngModel]=\"filterDraft.value\"\n (ngModelChange)=\"filterDraft.value = $event\"\n [options]=\"booleanValueOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n }\n @if (showFilterValueTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.value'\"\n [ngModel]=\"filterDraft.value\"\n (ngModelChange)=\"filterDraft.value = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n @if (showFilterValuesTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.values'\"\n [ngModel]=\"filterDraft.valuesText\"\n (ngModelChange)=\"filterDraft.valuesText = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n @if (showFilterBetweenInputs) {\n <div class=\"dynamic-view-builder__between dynamic-view-builder__modal-grid-column-full\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.valueStart'\"\n [ngModel]=\"filterDraft.betweenStart\"\n (ngModelChange)=\"filterDraft.betweenStart = $event\"\n width=\"100%\"\n ></sdc-textbox>\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.valueEnd'\"\n [ngModel]=\"filterDraft.betweenEnd\"\n (ngModelChange)=\"filterDraft.betweenEnd = $event\"\n width=\"100%\"\n ></sdc-textbox>\n </div>\n }\n @if (showFilterParameterTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.parameterName'\"\n [ngModel]=\"filterDraft.parameterName\"\n (ngModelChange)=\"filterDraft.parameterName = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-config-section\">\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--filter-controls\">\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.connector'\"\n [ngModel]=\"filterDraft.connector\"\n (ngModelChange)=\"filterDraft.connector = $event\"\n [options]=\"filterConnectorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterConnectorDisabled\"\n [infoTooltip]=\"filterConnectorTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <div class=\"dynamic-view-builder__filter-optional\">\n <sdc-checkbox\n [label]=\"config.translationPrefix + '.states.optional'\"\n [ngModel]=\"filterDraft.optional\"\n (ngModelChange)=\"filterDraft.optional = $event\"\n ></sdc-checkbox>\n <sdc-info-sign\n [tooltip]=\"filterOptionalTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n </div>\n </div>\n <div\n class=\"dynamic-view-builder__filter-config-section\n dynamic-view-builder__filter-config-section--domain\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.domainExpression') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"filterDomainExpressionTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-hint\">\n {{ filterDomainExpressionTooltip }}\n </div>\n <sdc-textarea\n [label]=\"''\"\n [ngModel]=\"filterDraft.domainExpression\"\n (ngModelChange)=\"filterDraft.domainExpression = $event\"\n width=\"100%\"\n [rows]=\"10\"\n ></sdc-textarea>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"dynamic-view-builder__filter-step\">\n <div class=\"dynamic-view-builder__filter-toolbar\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-summary--filter\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.modals.filter.steps.review.title') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >\n {{ filterConfigurationSummaryLabel }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"goToFilterModalStep('configure')\"\n >\n {{ filterBackToConfigurationLabel }}\n </button>\n </div>\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-review-grid\">\n @for (item of filterReviewItems; track trackById($index, item)) {\n <div\n class=\"dynamic-view-builder__filter-review-item\"\n >\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ item.label }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\"\n [class.dynamic-view-builder__modal-summary-value--path]=\"item.emphasize === 'path'\"\n [class.dynamic-view-builder__filter-review-code]=\"item.emphasize === 'code'\"\n >\n {{ item.value }}\n </div>\n </div>\n }\n </div>\n <div class=\"dynamic-view-builder__filter-review-preview\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.sqlPreview') | translate }}\n </div>\n <sdc-textarea\n [label]=\"''\"\n [ngModel]=\"filterReviewPreviewLabel\"\n width=\"100%\"\n [rows]=\"6\"\n [disabled]=\"true\"\n ></sdc-textarea>\n </div>\n </div>\n </div>\n }\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeFilterModal()\"\n (keydown.enter)=\"closeFilterModal()\"\n ></sdc-button>\n @if (filterModalSelectionStepActive) {\n <sdc-button\n [label]=\"filterModalConfigureActionLabel\"\n [disabled]=\"!filterModalCanProceed\"\n (click)=\"advanceFilterModalStep()\"\n (keydown.enter)=\"advanceFilterModalStep()\"\n ></sdc-button>\n }\n @if (filterModalConfigurationStepActive) {\n <sdc-button\n [label]=\"filterModalReviewActionLabel\"\n [disabled]=\"!filterModalCanReview\"\n (click)=\"advanceFilterModalStep()\"\n (keydown.enter)=\"advanceFilterModalStep()\"\n ></sdc-button>\n }\n @if (filterModalReviewStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveFilter\"\n (click)=\"saveFilter()\"\n (keydown.enter)=\"saveFilter()\"\n ></sdc-button>\n }\n </div>\n </sdc-modal>\n }\n\n @if (fieldModalVisible) {\n <sdc-modal\n [visible]=\"fieldModalVisible\"\n (visibleChange)=\"$event ? (fieldModalVisible = true) : closeFieldModal()\"\n [header]=\"fieldModalTitle\"\n [width]=\"modalDimensions.field.width\"\n [height]=\"modalDimensions.field.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__field-modal\">\n <sdc-timeline\n [items]=\"fieldModalTimelineItems\"\n [activeIndex]=\"fieldModalConfigurationStepActive ? 1 : 0\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"fieldModalTimelineAriaLabel\"\n (stepSelect)=\"onFieldModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (fieldModalSelectionStepActive) {\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"fieldModalPicklistItems\"\n [selectedIds]=\"fieldModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [autoResize]=\"false\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onFieldModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__field-config-shell\"\n >\n <div class=\"dynamic-view-builder__field-config-toolbar\">\n <div class=\"dynamic-view-builder__field-config-summary\">\n {{ fieldModalConfiguredItems.length }}\n {{ (config.translationPrefix + '.cards.fields.title') | translate }}\n </div>\n @if (fieldModalHasSelectableColumns) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--primary\"\n (click)=\"addAnotherFieldFromModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-list-shell\"\n >\n <div class=\"dynamic-view-builder__field-config-list\">\n @for (item of fieldModalConfiguredItems; track trackById($index, item)) {\n <div class=\"dynamic-view-builder__field-config-row\">\n <div class=\"dynamic-view-builder__field-config-main\">\n <div class=\"dynamic-view-builder__field-config-title\">\n <span class=\"dynamic-view-builder__selection-table-label\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ item.fieldLabel }}</span>\n </div>\n @if (item.functionName && !isFieldFunctionEditing(item.column)) {\n <div class=\"dynamic-view-builder__field-config-function\">\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n @if (item.functionAlias) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.functionAlias }}\n </span>\n }\n </div>\n }\n </div>\n @if (!isFieldFunctionEditing(item.column)) {\n <div class=\"dynamic-view-builder__field-config-controls\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"item.alias\"\n (ngModelChange)=\"onFieldModalAliasChange(item.column, $event)\"\n width=\"100%\"\n [maxlength]=\"24\"\n ></sdc-textbox>\n <div class=\"dynamic-view-builder__field-width\">\n <div class=\"dynamic-view-builder__modal-label-row\">\n <span class=\"dynamic-view-builder__modal-label\">\n {{ (config.translationPrefix + '.fields.width') | translate }}\n </span>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.messages.fieldWidthInfo'\"\n ></sdc-info-sign>\n </div>\n <sdc-textbox\n [label]=\"''\"\n [ngModel]=\"item.width\"\n (ngModelChange)=\"onFieldModalWidthChange(item.column, $event)\"\n width=\"100%\"\n [maxlength]=\"12\"\n placeholder=\"160\"\n ></sdc-textbox>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"startFieldFunctionEdit(item.column)\"\n >\n {{ item.functionName\n ? ((config.translationPrefix + '.actions.configureField') | translate)\n : ((config.translationPrefix + '.fields.functionName') | translate) }}\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--danger\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeFieldModalDraft(item.column)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__field-config-controls\n dynamic-view-builder__field-config-controls--function\"\n >\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.functionName'\"\n [ngModel]=\"fieldFunctionDraft.functionName\"\n (ngModelChange)=\"onFieldFunctionDraftNameChange($event)\"\n [options]=\"fieldModalFunctionOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"fieldFunctionDraft.functionAlias\"\n (ngModelChange)=\"fieldFunctionDraft.functionAlias = $event\"\n width=\"100%\"\n [maxlength]=\"24\"\n [disabled]=\"!fieldFunctionDraft.functionName\"\n ></sdc-textbox>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--danger\"\n [title]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n (click)=\"cancelFieldFunctionEdit()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--active\"\n [title]=\"(config.translationPrefix + '.actions.save') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.save') | translate\"\n (click)=\"saveFieldFunctionEdit()\"\n >\n <i class=\"fas fa-check\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer dynamic-view-builder__modal-footer--between\">\n <div class=\"dynamic-view-builder__modal-footer-group dynamic-view-builder__modal-footer-group--start\">\n @if (fieldModalSelectionStepActive && fieldModalCanSelectAll) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--primary\"\n (click)=\"selectAllFieldModalColumns()\"\n >\n {{ (config.translationPrefix + '.actions.selectAllColumns') | translate }}\n </button>\n }\n </div>\n <div class=\"dynamic-view-builder__modal-footer-group\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeFieldModal()\"\n (keydown.enter)=\"closeFieldModal()\"\n ></sdc-button>\n @if (fieldModalSelectionStepActive && fieldModalCanProceed) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.nextStep') | translate\"\n (click)=\"advanceFieldModalStep()\"\n (keydown.enter)=\"advanceFieldModalStep()\"\n ></sdc-button>\n }\n @if (fieldModalConfigurationStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveFieldModal\"\n (click)=\"saveField()\"\n (keydown.enter)=\"saveField()\"\n ></sdc-button>\n }\n </div>\n </div>\n </sdc-modal>\n }\n\n <div\n class=\"dynamic-view-builder__workspace\"\n [class.dynamic-view-builder__workspace--stacked]=\"layoutMode === 'stacked'\"\n [class.dynamic-view-builder__workspace--split]=\"layoutMode === 'split'\"\n [class.dynamic-view-builder__workspace--preview-hidden]=\"!previewVisible\"\n >\n <div class=\"dynamic-view-builder__builder-area\">\n <div\n #sectionsContainer\n class=\"dynamic-view-builder__sections\"\n [class.dynamic-view-builder__sections--stacked]=\"layoutMode === 'stacked'\"\n [class.dynamic-view-builder__sections--split]=\"layoutMode === 'split'\"\n >\n <section\n #builderSection\n data-section-id=\"tables\"\n class=\"dynamic-view-builder__section\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.sources.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n (click)=\"openSourceModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canOpenSourceConfiguration\"\n [title]=\"(config.translationPrefix + '.actions.configureAliases') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.configureAliases') | translate\"\n (click)=\"openSourceConfigurationModal()\"\n >\n <i class=\"fas fa-cog\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sourceItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearSources()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!sourceItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n (click)=\"openSourceModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectTables') | translate }}\n </button>\n }\n @if (sourceItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (source of sourceItems; track trackById(i, source); let i = $index) {\n <div\n class=\"dynamic-view-builder__row dynamic-view-builder__row--source\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-table-group\">\n <span class=\"dynamic-view-builder__row-db\">{{ source.dbLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-table\">\n {{ source.tableLabel }}\n </span>\n </span>\n @if (source.alias) {\n <span class=\"dynamic-view-builder__row-meta\">\n Alias {{ source.alias }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeSource(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n <div class=\"dynamic-view-builder__section-row\">\n <section\n #builderSection\n data-section-id=\"joins\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--fluid\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.joins.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canConfigureJoins\"\n [title]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n (click)=\"openJoinModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !joinItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearJoins()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!canConfigureJoins) {\n <div class=\"dynamic-view-builder__info-row\">\n {{ (config.translationPrefix + '.messages.joinRequiresTwoTables') | translate }}\n </div>\n }\n @if (canConfigureJoins && !joinItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n (click)=\"openJoinModal()\"\n >\n {{ (config.translationPrefix + '.actions.addJoin') | translate }}\n </button>\n }\n @if (joinItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of joinItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.sourceTable }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.sourceField }}</span>\n </span>\n <span class=\"dynamic-view-builder__join-operator\">{{ item.operator }}</span>\n <span class=\"dynamic-view-builder__join-arrow\" aria-hidden=\"true\">\n <i class=\"fas fa-long-arrow-alt-right\"></i>\n </span>\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.targetTable }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.targetField }}</span>\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openJoinModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeJoin(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n <section\n #builderSection\n data-section-id=\"groupBy\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--compact\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-heading\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.groupBy.title') | translate }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !groupBySelectableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n (click)=\"openSelectionModal('groupBy')\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !groupByItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearGroupBy()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!groupByItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n (click)=\"openSelectionModal('groupBy')\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n @if (groupByItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of groupByItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeGroupBy(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n </div>\n\n <section\n #builderSection\n data-section-id=\"fields\"\n class=\"dynamic-view-builder__section\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-heading\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.fields.title') | translate }}\n </div>\n <sdc-info-sign\n class=\"dynamic-view-builder__hint\"\n [tooltip]=\"'Voc\u00EA pode ordenar a sequ\u00EAncia dos campos arrastando e soltando.'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !fieldSelectableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n (click)=\"openFieldModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canOpenFieldConfiguration\"\n [title]=\"(config.translationPrefix + '.actions.configureField') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.configureField') | translate\"\n (click)=\"openFieldConfigurationModal()\"\n >\n <i class=\"fas fa-cog\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !fieldItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearFields()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!fieldItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n (click)=\"openFieldModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n @if (fieldItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of fieldItems; track trackById(i, item); let i = $index) {\n @if (isFieldDropIndicatorVisible(i)) {\n <div\n class=\"dynamic-view-builder__field-drop-indicator\"\n aria-hidden=\"true\"\n ></div>\n }\n <div\n class=\"dynamic-view-builder__row dynamic-view-builder__row--draggable\"\n [class.dynamic-view-builder__row--drag-origin]=\"draggingFieldIndex === item.sourceIndex\"\n [draggable]=\"!isReadonly\"\n (dragstart)=\"onFieldDragStart(item.sourceIndex)\"\n (dragover)=\"onFieldDragOver($event, i)\"\n (drop)=\"onFieldDrop()\"\n (dragend)=\"onFieldDragEnd()\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-order\">{{ item.orderLabel }}</span>\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n @if (item.alias) {\n <span class=\"dynamic-view-builder__row-meta\">\n Alias {{ item.alias }}\n </span>\n }\n @if (item.width) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.width }}\n </span>\n }\n @if (item.functionName) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n }\n @if (item.functionAlias) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.functionAlias }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeField(item.sourceIndex)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n @if (isFieldDropIndicatorAtEndVisible()) {\n <div\n class=\"dynamic-view-builder__field-drop-indicator\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n </section>\n\n <div class=\"dynamic-view-builder__section-row\">\n <section\n #builderSection\n data-section-id=\"sorting\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--compact\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.sorting.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sortSelectableItems.length\"\n [title]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n (click)=\"openSortModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sortItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearSorting()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!sortItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n (click)=\"openSortModal()\"\n >\n {{ (config.translationPrefix + '.actions.addSort') | translate }}\n </button>\n }\n @if (sortItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of sortItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n @if (item.functionName) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n }\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.direction }}\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openSortModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeSort(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n <section\n #builderSection\n data-section-id=\"filters\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--fluid\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.filters.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !availableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n (click)=\"openFilterModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !filterItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearFilters()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!filterItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n (click)=\"openFilterModal()\"\n >\n {{ (config.translationPrefix + '.actions.addFilter') | translate }}\n </button>\n }\n @if (filterItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of filterItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n @if (!item.isDomain) {\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n <span\n class=\"dynamic-view-builder__row-chip\n dynamic-view-builder__row-chip--operator\"\n >{{ item.operatorLabel }}</span>\n } @else {\n <span\n class=\"dynamic-view-builder__row-chip\n dynamic-view-builder__row-chip--domain\"\n >{{ item.tableLabel }}</span>\n }\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--value\">\n {{ item.subtitle }}\n </span>\n @if (item.optional) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--optional\">\n {{ (config.translationPrefix + '.states.optional') | translate }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openFilterModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeFilter(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n </div>\n\n @for (arrow of flowArrows; track trackByArrow($index, arrow)) {\n <div\n class=\"dynamic-view-builder__flow-arrow\"\n [class.dynamic-view-builder__flow-arrow--right]=\"arrow.direction === 'right'\"\n [class.dynamic-view-builder__flow-arrow--down]=\"arrow.direction === 'down'\"\n [style.left.px]=\"arrow.left\"\n [style.top.px]=\"arrow.top\"\n aria-hidden=\"true\"\n >\n <i\n [class]=\"arrow.direction === 'right'\n ? 'fas fa-angle-double-right'\n : 'fas fa-angle-double-down'\"\n ></i>\n </div>\n }\n </div>\n </div>\n\n @if (previewVisible) {\n <aside class=\"dynamic-view-builder__preview-area\">\n <div\n class=\"dynamic-view-builder__preview\"\n [style.height]=\"sqlPreviewPanelHeight\"\n >\n <div class=\"dynamic-view-builder__preview-header\">\n <div class=\"dynamic-view-builder__preview-title\">SQL Preview</div>\n <div class=\"dynamic-view-builder__preview-subtitle\">\n Consulta gerada automaticamente a partir da configuracao atual.\n </div>\n </div>\n <div class=\"dynamic-view-builder__preview-body\">\n <sdc-code-editor\n [sql]=\"sqlPreview\"\n language=\"sql\"\n [readOnly]=\"true\"\n [showCopy]=\"true\"\n [height]=\"sqlPreviewHeight\"\n ></sdc-code-editor>\n </div>\n </div>\n </aside>\n }\n </div>\n</div>\n", styles: [":host{display:block}::ng-deep .sdc-loading-state{overflow:auto!important}.dynamic-view-builder{display:flex;flex-direction:column;gap:.75rem;color:#243342}.dynamic-view-builder__toolbar{display:flex;justify-content:space-between;align-items:center;gap:1rem;padding:.25rem 0}.dynamic-view-builder__toolbar-copy{min-width:0}.dynamic-view-builder__title{font-size:1rem;font-weight:700;line-height:1.2;color:#243342}.dynamic-view-builder__subtitle{margin-top:.2rem;color:#70839a;font-size:.875rem;line-height:1.35}.dynamic-view-builder__toolbar-actions{display:flex;align-items:center;gap:.625rem;flex-shrink:0;flex-wrap:wrap}.dynamic-view-builder__toolbar-label{color:#70839a;font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__workspace{display:grid;gap:.875rem;min-width:0}.dynamic-view-builder__workspace--preview-hidden,.dynamic-view-builder__workspace--split.dynamic-view-builder__workspace--preview-hidden{grid-template-columns:1fr;grid-template-areas:\"builder\"}.dynamic-view-builder__workspace--stacked{grid-template-columns:1fr;grid-template-areas:\"preview\" \"builder\"}.dynamic-view-builder__workspace--split{grid-template-columns:minmax(0,62fr) minmax(20rem,38fr);grid-template-areas:\"builder preview\";align-items:start}.dynamic-view-builder__builder-area{grid-area:builder;display:flex;flex-direction:column;gap:.75rem;min-width:0}.dynamic-view-builder__sections{display:flex;flex-direction:column;gap:.5rem;min-width:0;position:relative}.dynamic-view-builder__section{display:flex;flex-direction:column;gap:.4rem;min-width:0;padding:.55rem .65rem;border:1px solid #dbe3ec;border-radius:.5rem;background:#fff;min-inline-size:0;max-inline-size:100%;position:relative;width:100%}.dynamic-view-builder__section-row{display:flex;flex-wrap:wrap;align-items:stretch;gap:.5rem;min-width:0}.dynamic-view-builder__section-row>.dynamic-view-builder__section{align-self:stretch}.dynamic-view-builder__section--half{flex:1 1 18rem;width:auto}.dynamic-view-builder__section--compact{flex:0 0 clamp(18rem,30%,22rem);width:auto}.dynamic-view-builder__section--fluid{flex:1 1 26rem;min-inline-size:min(100%,26rem);width:auto}.dynamic-view-builder__flow-arrow{position:absolute;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;border:1px solid #d9e3ed;border-radius:999px;background:#fff;color:#68809a;pointer-events:none;z-index:2;transform:translate(-50%,-50%)}.dynamic-view-builder__flow-arrow i{font-size:.74rem;line-height:1}.dynamic-view-builder__section-head{display:flex;justify-content:space-between;align-items:flex-start;gap:.75rem}.dynamic-view-builder__section-heading{display:inline-flex;align-items:center;gap:.4rem;min-width:0}.dynamic-view-builder__section-label{min-width:0;color:#516173;font-size:.78rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase}.dynamic-view-builder__section-actions{display:flex;align-items:center;justify-content:flex-end;gap:.5rem;flex-wrap:wrap;flex-shrink:0}.dynamic-view-builder__hint{display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;padding:0;border:0;background:transparent;color:#8ca0b6;cursor:help}.dynamic-view-builder__hint--legacy{display:none}.dynamic-view-builder__stack{display:flex;gap:.35rem;min-width:0}.dynamic-view-builder__stack--wrap{flex-direction:row;flex-wrap:wrap;align-items:flex-start}.dynamic-view-builder__row,.dynamic-view-builder__empty-row,.dynamic-view-builder__info-row{min-width:0;border:1px solid #e7edf4;border-radius:.4rem;background:#fbfcfe}.dynamic-view-builder__row{display:inline-flex;align-items:stretch;justify-content:space-between;gap:.45rem;padding:.5rem .6rem;inline-size:auto;min-inline-size:min(100%,12rem);max-inline-size:100%;flex:0 1 auto}.dynamic-view-builder__row-main{min-width:0;display:flex;align-items:center;gap:.3rem;flex-wrap:wrap;flex:1 1 auto}.dynamic-view-builder__row-label{color:#243342;font-weight:600;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-value{color:#627588;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-separator{color:#b0bcc9;flex-shrink:0}.dynamic-view-builder__row-actions{display:flex;align-items:center;justify-content:flex-end;gap:.2rem;flex-wrap:wrap;flex:0 0 auto}.dynamic-view-builder__row--source{align-items:center;min-inline-size:min(100%,16.5rem);padding-block:.45rem}.dynamic-view-builder__row--source .dynamic-view-builder__row-main{align-items:center;flex-wrap:nowrap;gap:.18rem}.dynamic-view-builder__row-table-group{display:inline-flex;align-items:center;gap:0;min-width:0;flex:0 1 auto}.dynamic-view-builder__row-db{color:#243342;font-weight:700;line-height:1.25;white-space:nowrap}.dynamic-view-builder__row-order{display:inline-flex;align-items:center;justify-content:center;min-width:2rem;padding:.1rem .35rem;border-radius:999px;background:#eef3f8;color:#516173;font-size:.75rem;font-weight:700}.dynamic-view-builder__row-path{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:wrap}.dynamic-view-builder__row-table{color:#425466;font-weight:500;line-height:1.35}.dynamic-view-builder__row-table--accent{color:#1f8a52;font-weight:700}.dynamic-view-builder__row-dot{color:#8fa1b3;flex:0 0 auto;margin-inline:.02rem}.dynamic-view-builder__row-field{color:#1f8a52;font-weight:700;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-meta{display:inline-flex;align-items:center;padding:.12rem .4rem;border-radius:999px;background:#f0f4f8;color:#627588;font-size:.74rem;line-height:1.2}.dynamic-view-builder__join-operator{display:inline-flex;align-items:center;padding:.1rem .35rem;border-radius:999px;background:#eef3f8;color:#627588;font-size:.73rem;font-weight:700;letter-spacing:.03em;text-transform:uppercase}.dynamic-view-builder__join-arrow{color:#9ab0c6;font-size:.85rem}.dynamic-view-builder__row--draggable{cursor:grab}.dynamic-view-builder__row--drag-origin{opacity:.6;border-color:#b8cae0;background:#f4f8fc}.dynamic-view-builder__row--draggable:active{cursor:grabbing}.dynamic-view-builder__alias-field{flex:0 1 5.4rem;min-inline-size:4.4rem;max-inline-size:5.8rem}.dynamic-view-builder__alias-field :where(.sdc-textbox__label-row){display:none}.dynamic-view-builder__action-link{padding:0;border:0;background:transparent;color:#6d7786;font:inherit;font-size:.82rem;font-weight:600;line-height:1.25;cursor:pointer;transition:color .18s ease;pointer-events:auto;position:relative;z-index:2;text-decoration:none}.dynamic-view-builder__action-link:disabled{opacity:.45;cursor:default}.dynamic-view-builder__action-link:hover:not(:disabled),.dynamic-view-builder__action-link:focus-visible:not(:disabled){color:#1b5cff}.dynamic-view-builder__action-link--primary{color:#1b5cff}.dynamic-view-builder__action-link--icon{display:inline-flex;align-items:center;justify-content:center;min-width:1.5rem;min-height:1.5rem}.dynamic-view-builder__action-link--icon i{font-size:.9rem;line-height:1}.dynamic-view-builder__preview-toggle{display:inline-flex;align-items:center;gap:.4rem;min-height:2rem;padding:0 .75rem;border:1px solid #dbe3ec;border-radius:999px;background:#f8fafc;color:#425466;font:inherit;font-size:.82rem;font-weight:600;cursor:pointer;transition:border-color .18s ease,background-color .18s ease,color .18s ease}.dynamic-view-builder__preview-toggle:focus-visible{outline:2px solid rgba(27,92,255,.18);outline-offset:2px}.dynamic-view-builder__preview-toggle:hover:not(:disabled),.dynamic-view-builder__preview-toggle:focus-visible:not(:disabled){border-color:#b9c7d6;background:#eef4fb;color:#1b5cff}.dynamic-view-builder__icon-action{display:inline-flex;align-items:center;justify-content:center;width:1.35rem;height:1.35rem;padding:0;border:0;background:transparent;color:#7b8ea2;cursor:pointer;transition:color .18s ease}.dynamic-view-builder__icon-action:focus-visible{outline:2px solid rgba(27,92,255,.18);outline-offset:2px;border-radius:999px}.dynamic-view-builder__icon-action:disabled{opacity:.45;cursor:default}.dynamic-view-builder__icon-action:hover:not(:disabled),.dynamic-view-builder__icon-action:focus-visible:not(:disabled){color:#1b5cff}.dynamic-view-builder__icon-action--active{color:#1c9b5f}.dynamic-view-builder__icon-action--danger{color:#8d9caf}.dynamic-view-builder__icon-action--danger:hover:not(:disabled),.dynamic-view-builder__icon-action--danger:focus-visible:not(:disabled){color:#d14343}.dynamic-view-builder__empty-row{width:auto;max-width:100%;padding:.45rem .55rem;text-align:left;color:#70839a;cursor:pointer;inline-size:fit-content;pointer-events:auto;position:relative;z-index:1}.dynamic-view-builder__info-row{padding:.45rem .55rem;color:#3d6ae8;line-height:1.35;inline-size:fit-content;max-inline-size:100%}.dynamic-view-builder__preview-area{grid-area:preview;min-width:0;display:flex;align-self:start}.dynamic-view-builder__preview{display:flex;flex:1 1 auto;flex-direction:column;border:1px solid #dbe3ec;border-radius:.5rem;background:#fff;overflow:hidden;min-height:0}.dynamic-view-builder__preview-header{padding:.75rem .9rem;border-bottom:1px solid #e7edf4;background:#f8fafc}.dynamic-view-builder__preview-title{color:#243342;font-weight:700;line-height:1.25}.dynamic-view-builder__preview-subtitle{margin-top:.2rem;color:#70839a;line-height:1.35}.dynamic-view-builder__preview-body{display:flex;flex:1 1 auto;min-height:0;padding:.55rem}.dynamic-view-builder__preview-body :where(sdc-code-editor){display:block;flex:1 1 auto;min-height:0;width:100%}.dynamic-view-builder__footer{display:flex;justify-content:flex-start;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-shell{display:flex;flex-direction:column;gap:.875rem;min-height:0;height:100%}.dynamic-view-builder__modal-shell--full{height:100%}.dynamic-view-builder__modal-stage{display:flex;flex-direction:column;gap:.75rem;min-height:0}.dynamic-view-builder__modal-stage-body{flex:1 1 auto;min-height:0}.dynamic-view-builder__modal-card{padding:.85rem .95rem;border:1px solid #dbe3ec;border-radius:.65rem;background:#fff;box-shadow:0 1px 2px #0f172a0a}.dynamic-view-builder__modal-card--compact{padding:.75rem .85rem}.dynamic-view-builder__modal-card--section{display:flex;flex-direction:column;gap:.875rem}.dynamic-view-builder__modal-card--soft{background:linear-gradient(180deg,#fbfdff,#f6f9fc)}.dynamic-view-builder__modal-inline-surface{display:flex;flex-direction:column;gap:.625rem;min-width:0}.dynamic-view-builder__modal-list-shell{flex:1 1 auto;min-height:0;overflow:hidden;padding:.8rem}.dynamic-view-builder__modal-card-title{color:#243342;font-size:.92rem;font-weight:700;line-height:1.25}.dynamic-view-builder__modal-card-text{margin-top:.2rem;color:#70839a;font-size:.8rem;line-height:1.35}.dynamic-view-builder__modal-panel-title{color:#425466;font-size:.78rem;font-weight:700;letter-spacing:.04em;line-height:1.25;text-transform:uppercase}.dynamic-view-builder__modal-panel-title--section{margin-bottom:-.1rem}.dynamic-view-builder__modal-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;align-items:start;min-height:0}.dynamic-view-builder__modal-grid>*{min-width:0}.dynamic-view-builder__modal-grid--single{grid-template-columns:1fr}.dynamic-view-builder__modal-grid--filter{grid-template-columns:repeat(2,minmax(0,1fr))}.dynamic-view-builder__modal-grid--filter-controls{grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem .75rem}.dynamic-view-builder__modal-grid-column-full{grid-column:1/-1}.dynamic-view-builder__modal-field,.dynamic-view-builder__modal-picker{display:flex;flex-direction:column;gap:.625rem;min-width:0;min-height:0}.dynamic-view-builder__modal-field--stretch,.dynamic-view-builder__modal-picker--stretch{height:100%}.dynamic-view-builder__modal-field--compact{gap:.5rem}.dynamic-view-builder__modal-field--full{width:100%}.dynamic-view-builder__modal-label-row{display:inline-flex;align-items:center;gap:.35rem;min-width:0}.dynamic-view-builder__modal-label{color:#425466;font-size:.875rem;font-weight:600;line-height:1.25}.dynamic-view-builder__join-modal{display:flex;flex-direction:column;gap:.875rem}.dynamic-view-builder__selection-flow{display:flex;flex-direction:column;gap:.75rem;height:100%;min-height:0}.dynamic-view-builder__filter-modal{display:flex;flex-direction:column;gap:.875rem;min-height:min(30rem,100vh - 14rem);height:100%;overflow:hidden}.dynamic-view-builder__filter-step{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0;flex:1 1 auto}.dynamic-view-builder__filter-toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:.875rem;flex-wrap:wrap}.dynamic-view-builder__filter-toolbar>*{min-width:0}.dynamic-view-builder__filter-heading{display:flex;align-items:center;justify-content:space-between;gap:.5rem;min-width:0}.dynamic-view-builder__filter-base-selector,.dynamic-view-builder__filter-domain-intro{min-width:0}.dynamic-view-builder__filter-base-selector{gap:.625rem;padding:.85rem 1rem}.dynamic-view-builder__filter-mode-row{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.dynamic-view-builder__filter-mode-copy{color:#70839a;font-size:.84rem;line-height:1.4}.dynamic-view-builder__filter-mode-selector{display:flex;min-width:0}.dynamic-view-builder__filter-mode-selector :where(.select-button){max-width:100%}.dynamic-view-builder__picklist-shell{flex:1 1 auto;min-height:0;overflow:hidden;display:flex;flex-direction:column}.dynamic-view-builder__picklist-shell :where(sdc-picklist){display:flex;flex:1 1 auto;height:100%;min-height:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist){display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__loading-state){display:flex;flex-direction:column;min-height:0;flex:1 1 auto}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__content){min-height:0;flex:1 1 auto;overflow:auto}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__list){margin:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__search),.dynamic-view-builder__picklist-shell :where(.sdc-picklist__selected),.dynamic-view-builder__picklist-shell :where(.sdc-picklist__footer){flex:0 0 auto}.dynamic-view-builder__filter-config-card{flex:1 1 auto;min-height:0;gap:.75rem;overflow:auto;padding:.85rem 1rem}.dynamic-view-builder__filter-panel{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0}.dynamic-view-builder__filter-context{display:flex;flex-direction:column;gap:.2rem;padding:0 .1rem;min-width:0}.dynamic-view-builder__filter-summary{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.625rem;min-width:0}.dynamic-view-builder__filter-summary-item{display:flex;flex-direction:column;gap:.22rem;padding:.7rem .8rem;border:1px solid #dbe3ec;border-radius:.55rem;background:#f8fafc;min-width:0}.dynamic-view-builder__sort-modal{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0;height:100%;overflow:hidden}.dynamic-view-builder__sort-direction{display:block;width:100%;max-width:18rem;min-width:0;overflow:hidden}.dynamic-view-builder__sort-direction :where(.select-button){width:100%;max-width:100%;overflow:hidden}.dynamic-view-builder__sort-direction :where(.select-button-item){min-width:0}.dynamic-view-builder__sort-modal>.dynamic-view-builder__modal-field{flex:0 0 auto}.dynamic-view-builder__sort-modal>.dynamic-view-builder__modal-picker{flex:1 1 auto;min-height:0}.dynamic-view-builder__sort-modal :where(.select-button--soft){padding:.25rem}.dynamic-view-builder__sort-modal :where(.select-button--soft .select-button-item){min-height:2rem;padding:.4rem .65rem}.dynamic-view-builder__modal-summary{display:flex;flex-direction:column;gap:.25rem;align-self:start}.dynamic-view-builder__modal-summary--filter{gap:.35rem}.dynamic-view-builder__modal-summary--compact{width:fit-content;max-width:100%}.dynamic-view-builder__modal-summary--field{min-width:min(100%,15rem)}.dynamic-view-builder__join-modal-top{display:grid;grid-template-columns:minmax(0,1fr) minmax(12rem,14rem) minmax(0,1fr);gap:.875rem;align-items:stretch}.dynamic-view-builder__join-modal-top>*{height:100%}.dynamic-view-builder__join-modal-top .dynamic-view-builder__modal-summary,.dynamic-view-builder__join-modal-top .dynamic-view-builder__modal-field{align-self:stretch}.dynamic-view-builder__modal-summary-label{color:#70839a;font-size:.73rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__modal-summary-value{color:#243342;font-weight:600;line-height:1.35;word-break:break-word}.dynamic-view-builder__modal-summary-value--path{color:#1f8a52;font-family:Consolas,Courier New,monospace;font-size:.86rem;font-weight:600}.dynamic-view-builder__picker-title{color:#425466;font-weight:700;line-height:1.35}.dynamic-view-builder__picker-title--path{font-family:Consolas,Courier New,monospace;font-size:.85rem;font-weight:600}.dynamic-view-builder__modal-footer{display:flex;justify-content:flex-end;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-footer--between{justify-content:space-between;align-items:center}.dynamic-view-builder__modal-footer-group{display:inline-flex;align-items:center;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-footer-group--start{margin-right:auto}.dynamic-view-builder__filter-config-section{display:flex;flex-direction:column;gap:.625rem;min-width:0}.dynamic-view-builder__filter-config-section--value,.dynamic-view-builder__filter-config-section--domain{padding-top:.25rem;border-top:1px solid #e8edf3}.dynamic-view-builder__filter-optional{display:flex;align-items:flex-end;gap:.35rem;min-height:100%;padding-bottom:.15rem}.dynamic-view-builder__filter-config-section :where(.sdc-checkbox){min-height:34px}.dynamic-view-builder__filter-domain-grid,.dynamic-view-builder__filter-review-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem}.dynamic-view-builder__filter-domain-item,.dynamic-view-builder__filter-review-item{display:flex;flex-direction:column;gap:.25rem;min-width:0;padding:.8rem .9rem;border:1px solid #e5ebf2;border-radius:.6rem;background:#f8fafc}.dynamic-view-builder__filter-domain-hint{color:#70839a;font-size:.82rem;line-height:1.45}.dynamic-view-builder__filter-review-preview{display:flex;flex-direction:column;gap:.35rem;min-width:0;padding-top:.25rem;border-top:1px solid #e8edf3}.dynamic-view-builder__filter-review-code{color:#243342;font-family:Consolas,Courier New,monospace;font-size:.84rem;line-height:1.45;white-space:pre-wrap;word-break:break-word}.dynamic-view-builder__sort-direction-field{gap:.4rem}.dynamic-view-builder__selection-table{display:flex;flex-direction:column;border:1px solid #d7dde5;background:#fff;overflow:hidden;border-radius:.5rem;min-height:0;flex:1 1 auto}.dynamic-view-builder__modal-stage-body>.dynamic-view-builder__selection-table,.dynamic-view-builder__modal-stage-body.dynamic-view-builder__picklist-shell{height:100%}.dynamic-view-builder__selection-table--chooser{min-height:0}.dynamic-view-builder__selection-head{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) 5rem;gap:.75rem;padding:.875rem 1rem;border-bottom:1px solid #e4e8ef;background:#f6f8fb}.dynamic-view-builder__selection-body{flex:1 1 auto;min-height:0;max-height:22rem;overflow:auto}.dynamic-view-builder__selection-table--fluid,.dynamic-view-builder__selection-table--fluid .dynamic-view-builder__selection-body{min-height:0;max-height:none;height:100%}.dynamic-view-builder__selection-row{width:100%;display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) 5rem;gap:.75rem;padding:.875rem 1rem;border:0;border-bottom:1px solid #eef2f7;background:transparent;text-align:left;cursor:pointer;transition:background-color .18s ease,box-shadow .18s ease}.dynamic-view-builder__selection-row:last-child{border-bottom:0}.dynamic-view-builder__selection-row:hover{background:#f9fbff}.dynamic-view-builder__selection-row--selected{background:#eef5ff}.dynamic-view-builder__selection-row:focus-visible{outline:2px solid rgba(27,92,255,.22);outline-offset:-2px}.dynamic-view-builder__selection-col,.dynamic-view-builder__selection-cell{min-width:0;color:#425466;line-height:1.4;word-break:break-word}.dynamic-view-builder__selection-col{font-weight:700}.dynamic-view-builder__selection-cell--meta{color:#70839a}.dynamic-view-builder__selection-path{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:nowrap}.dynamic-view-builder__selection-db{color:#243342;font-weight:700}.dynamic-view-builder__selection-table-label{color:#425466;font-weight:500}.dynamic-view-builder__selection-separator{color:#9aaaba;flex:0 0 auto;margin-inline:.02rem}.dynamic-view-builder__selection-accent{color:#1f8a52;font-weight:700}.dynamic-view-builder__selection-note{display:block;margin-top:.1rem;color:#8da0b4;font-size:.74rem}.dynamic-view-builder__selection-col--select,.dynamic-view-builder__selection-cell--select{display:flex;align-items:center;justify-content:center}.dynamic-view-builder__selection-marker{display:inline-flex;align-items:center;justify-content:center;width:1.2rem;height:1.2rem;border:1px solid #c8d4e0;border-radius:.3rem;background:#fff;color:transparent}.dynamic-view-builder__selection-marker i{font-size:.72rem;line-height:1}.dynamic-view-builder__selection-marker--selected{border-color:#1b5cff;background:#1b5cff;color:#fff}.dynamic-view-builder__selection-empty{padding:1rem;color:#70839a;text-align:center;line-height:1.4}.dynamic-view-builder__modal-picker--filter,.dynamic-view-builder__modal-picker--filter .dynamic-view-builder__selection-table{min-height:100%}.dynamic-view-builder__modal-picker--filter .dynamic-view-builder__selection-body{max-height:none}.dynamic-view-builder__field-modal{display:flex;flex-direction:column;gap:1rem;min-height:0;width:100%;height:100%}.dynamic-view-builder__field-config-shell{gap:.85rem;min-height:0;height:100%}.dynamic-view-builder__field-config-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__field-config-summary{color:#516173;font-size:.8rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__field-selection-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__field-config-list,.dynamic-view-builder__source-config-list{display:flex;flex-direction:column;flex:1 1 auto;gap:.75rem;width:100%;min-height:0;overflow:auto}.dynamic-view-builder__field-config-row{display:grid;grid-template-columns:minmax(13rem,1.1fr) minmax(0,1.9fr);gap:.9rem;align-items:start;width:100%;padding:.85rem .9rem;border:1px solid #dbe3ec;border-radius:.7rem;background:#fff}.dynamic-view-builder__source-config-row{display:grid;grid-template-columns:minmax(13rem,1fr) minmax(0,1.35fr);gap:.9rem;align-items:center;width:100%;padding:.85rem .9rem;border:1px solid #dbe3ec;border-radius:.7rem;background:#fff}.dynamic-view-builder__field-config-main,.dynamic-view-builder__source-config-main{display:flex;flex-direction:column;gap:.45rem;min-width:0}.dynamic-view-builder__field-config-title{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:wrap}.dynamic-view-builder__field-config-function{display:inline-flex;align-items:center;gap:.45rem;flex-wrap:wrap}.dynamic-view-builder__field-config-controls{display:grid;grid-template-columns:minmax(0,1fr) minmax(7rem,8rem) auto auto;gap:.75rem;align-items:end;min-width:0}.dynamic-view-builder__source-config-controls{display:grid;grid-template-columns:minmax(0,1fr);gap:.75rem;align-items:end;min-width:0}.dynamic-view-builder__field-config-controls--function{grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto auto}.dynamic-view-builder__field-form{display:grid;grid-template-columns:minmax(0,1fr) minmax(10rem,11rem);gap:.75rem 1rem;align-items:start}.dynamic-view-builder__field-form--balanced{grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr)}.dynamic-view-builder__field-width{display:flex;flex-direction:column;gap:.35rem;min-width:0}.dynamic-view-builder__between{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.625rem}.dynamic-view-builder__row-chip{display:inline-flex;align-items:center;padding:.14rem .45rem;border-radius:999px;font-size:.74rem;font-weight:600;line-height:1.2}.dynamic-view-builder__row-chip--operator{background:#eef4fb;color:#1b5cff}.dynamic-view-builder__row-chip--value{background:#f4f7fa;color:#5d7084}.dynamic-view-builder__row-chip--optional{background:#f2f7f3;color:#1f8a52}.dynamic-view-builder__row-chip--domain{background:#eef4fb;color:#425466}.dynamic-view-builder__field-drop-indicator{display:inline-flex;align-self:stretch;width:.2rem;min-height:2.2rem;border-radius:999px;background:#1b5cff;box-shadow:0 0 0 3px #1b5cff24;flex:0 0 auto}@media (max-width: 1120px){.dynamic-view-builder__workspace--split{grid-template-columns:1fr;grid-template-areas:\"builder\" \"preview\"}.dynamic-view-builder__workspace--split.dynamic-view-builder__workspace--preview-hidden{justify-items:stretch}.dynamic-view-builder__sections--split{padding-right:0}}@media (max-width: 900px){.dynamic-view-builder__field-form,.dynamic-view-builder__field-form--balanced,.dynamic-view-builder__field-config-toolbar,.dynamic-view-builder__field-config-row,.dynamic-view-builder__source-config-row,.dynamic-view-builder__field-config-controls,.dynamic-view-builder__source-config-controls,.dynamic-view-builder__field-config-controls--function{grid-template-columns:1fr}.dynamic-view-builder__section-row{flex-direction:column}.dynamic-view-builder__section--half,.dynamic-view-builder__section--compact,.dynamic-view-builder__section--fluid{width:100%}.dynamic-view-builder__toolbar,.dynamic-view-builder__section-head,.dynamic-view-builder__row,.dynamic-view-builder__footer,.dynamic-view-builder__modal-footer,.dynamic-view-builder__filter-toolbar,.dynamic-view-builder__field-selection-toolbar{flex-direction:column;align-items:stretch}.dynamic-view-builder__toolbar-actions,.dynamic-view-builder__section-actions,.dynamic-view-builder__row-actions{justify-content:flex-start}.dynamic-view-builder__alias-field{min-inline-size:6rem;max-inline-size:100%}.dynamic-view-builder__modal-grid,.dynamic-view-builder__modal-grid--filter,.dynamic-view-builder__modal-grid--filter-controls,.dynamic-view-builder__filter-modal,.dynamic-view-builder__filter-summary,.dynamic-view-builder__filter-domain-grid,.dynamic-view-builder__filter-review-grid,.dynamic-view-builder__between,.dynamic-view-builder__join-modal-top{grid-template-columns:1fr}.dynamic-view-builder__row{min-inline-size:100%}}:host ::ng-deep .sdc-modal__content{display:flex;flex-direction:column;min-height:0;overflow:hidden}:host ::ng-deep .sdc-modal__content>.dynamic-view-builder__modal-shell{flex:1 1 auto;min-height:0}@media (max-width: 768px){.dynamic-view-builder__selection-head,.dynamic-view-builder__selection-row{grid-template-columns:1fr}.dynamic-view-builder__selection-col--select,.dynamic-view-builder__selection-cell--select{justify-content:flex-start}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: ButtonComponent, selector: "sdc-button", inputs: ["id", "label", "ariaLabel", "disabled", "width", "priority", "size", "type", "icon", "rightIcon", "auxiliary", "caret", "tooltip", "animation", "slide", "styleClass", "badge", "menuOptions", "menuContext", "model"], outputs: ["clicked"] }, { kind: "component", type: CheckboxComponent, selector: "sdc-checkbox", inputs: ["label", "disabled", "commonCheckbox", "labelPosition", "size", "checked"], outputs: ["checkedChange"] }, { kind: "component", type: CodeEditorComponent, selector: "sdc-code-editor", inputs: ["sql", "height", "width", "showCopy", "customHeaderItems", "activeHeaderKey", "readOnly", "language", "schema"], outputs: ["headerSelect", "onCopy", "languageChange", "domainFilterClick"] }, { kind: "component", type: ComboboxComponent, selector: "sdc-combobox", inputs: ["multiple", "appendTo", "zIndex", "options", "overrideChipMessage", "maxSelectedLabels", "showClear", "iconSelector", "showIconClass", "infoTooltip", "infoTooltipPosition", "infoTooltipEvent", "infoTooltipAllowHtml"], outputs: ["onSelectedItem", "panelClosed"] }, { kind: "component", type: InfoSignComponent, selector: "sdc-info-sign", inputs: ["label", "labelParams", "tooltip", "tooltipParams", "iconClass", "iconAriaLabel", "tooltipPosition", "tooltipEvent", "inline"] }, { kind: "component", type: ModalComponent, selector: "sdc-modal", inputs: ["footerButtons", "header", "height", "maximizable", "maximize", "resizable", "responsive", "width", "zIndex", "closable", "styleClass", "appendToBody", "visible"], outputs: ["hidden", "visibleChange"] }, { kind: "component", type: PicklistComponent, selector: "sdc-picklist", inputs: ["items", "selectedIds", "idKey", "titleKey", "subtitleKey", "iconClass", "selectionIconClass", "placeholder", "emptyTitle", "emptyText", "emptyIconClass", "resultsCounterSingularLabel", "resultsCounterPluralLabel", "filterFields", "first", "rows", "rowsPerPageOptions", "maxVisibleSelectedItems", "showPaginator", "showRowsPerPageOptions", "showSelectionCounter", "showResultsCounter", "showItemIcon", "autoResize", "autoResizeMinRows", "autoResizeMaxRows", "autoResizeItemHeight", "autoResizeViewportOffset", "maxTitleLength", "maxSubtitleLength", "autofocusSearch", "loading"], outputs: ["pageChange", "selectedIdsChange"] }, { kind: "component", type: SelectButtonComponent, selector: "sdc-select-button", inputs: ["items", "multiple", "compareWith"], outputs: ["itemSelected", "itemClicked"] }, { kind: "component", type: TextareaComponent, selector: "sdc-textarea", inputs: ["infoTooltip", "infoTooltipPosition", "infoTooltipEvent", "rows", "autoResize"] }, { kind: "component", type: TextboxComponent, selector: "sdc-textbox", inputs: ["infoTooltip", "infoTooltipPosition", "infoTooltipEvent"] }, { kind: "component", type: TimelineComponent, selector: "sdc-timeline", inputs: ["items", "activeIndex", "orientation", "interactive", "responsive", "showDescriptions", "ariaLabel", "ariaLabelParams"], outputs: ["stepSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
2306
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: VisualSqlEditorComponent, isStandalone: true, selector: "sdc-visual-sql-editor", inputs: { loading: "loading", config: "config" }, outputs: { configChange: "configChange", save: "save", cancel: "cancel" }, host: { listeners: { "window:resize": "onWindowResize()" } }, providers: [VisualSqlEditorFlowService, VisualSqlEditorStateService], viewQueries: [{ propertyName: "sectionsContainer", first: true, predicate: ["sectionsContainer"], descendants: true }, { propertyName: "builderSections", predicate: ["builderSection"], descendants: true }], ngImport: i0, template: "<div class=\"dynamic-view-builder\" [attr.aria-busy]=\"loading\">\n <div class=\"dynamic-view-builder__toolbar\">\n <div class=\"dynamic-view-builder__toolbar-copy\">\n <div class=\"dynamic-view-builder__title\">\n {{ config.metadata.title }}\n </div>\n <div class=\"dynamic-view-builder__subtitle\">\n {{ config.metadata.description }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__toolbar-actions\">\n <span class=\"dynamic-view-builder__toolbar-label\">\n {{ (config.translationPrefix + '.fields.layoutMode') | translate }}\n </span>\n <sdc-select-button\n [items]=\"layoutModeItems\"\n [ngModel]=\"selectedLayoutModeItems\"\n (ngModelChange)=\"onLayoutModeChange($event)\"\n ></sdc-select-button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__preview-toggle\"\n (click)=\"togglePreview()\"\n [attr.aria-pressed]=\"previewVisible\"\n [title]=\"previewToggleLabel\"\n [attr.aria-label]=\"previewToggleLabel\"\n >\n <i\n [class]=\"previewVisible ? 'fas fa-eye-slash' : 'fas fa-eye'\"\n aria-hidden=\"true\"\n ></i>\n {{ previewToggleLabel }}\n </button>\n </div>\n </div>\n\n @if (selectionModalVisible) {\n <sdc-modal\n [visible]=\"selectionModalVisible\"\n (visibleChange)=\"$event ? (selectionModalVisible = true) : closeSelectionModal()\"\n [header]=\"selectionModalTitle\"\n [width]=\"modalDimensions.selection.width\"\n [height]=\"modalDimensions.selection.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n @if (selectionModalMode === 'tables') {\n <div class=\"dynamic-view-builder__modal-inline-surface\">\n <sdc-textbox\n [label]=\"modalSearchLabel\"\n [placeholder]=\"modalSearchPlaceholder\"\n [ngModel]=\"selectionModalSearch\"\n (ngModelChange)=\"selectionModalSearch = $event\"\n width=\"100%\"\n ></sdc-textbox>\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-stage-body\"\n >\n <div\n class=\"dynamic-view-builder__selection-table\n dynamic-view-builder__selection-table--chooser\n dynamic-view-builder__selection-table--fluid\"\n >\n <div class=\"dynamic-view-builder__selection-head\">\n <div class=\"dynamic-view-builder__selection-col\">\n {{ modalNameLabel }}\n </div>\n <div class=\"dynamic-view-builder__selection-col\">\n {{ modalTypeLabel }}\n </div>\n <div class=\"dynamic-view-builder__selection-col dynamic-view-builder__selection-col--select\">\n {{ modalSelectLabel }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__selection-body\">\n @for (row of selectionModalRows; track trackById($index, row)) {\n <div\n class=\"dynamic-view-builder__selection-row\"\n [class.dynamic-view-builder__selection-row--selected]=\"row.selected\"\n [attr.role]=\"'button'\"\n [attr.tabindex]=\"row.disabled ? -1 : 0\"\n [attr.aria-pressed]=\"row.selected\"\n [attr.aria-disabled]=\"row.disabled\"\n (click)=\"toggleSelectionModalRow(row.id)\"\n (keydown)=\"onSelectableRowKeydown($event)\"\n >\n <div class=\"dynamic-view-builder__selection-cell\">\n @if (row.tableLabel) {\n <span class=\"dynamic-view-builder__selection-path\">\n @if (row.pathType === 'table') {\n @if (row.dbLabel) {\n <span class=\"dynamic-view-builder__selection-db\">{{ row.dbLabel }}</span>\n }\n @if (row.dbLabel) {\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n }\n <span class=\"dynamic-view-builder__selection-table-label\">{{ row.tableLabel }}</span>\n } @else {\n <span class=\"dynamic-view-builder__selection-table-label\">{{ row.tableLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ row.name }}</span>\n }\n </span>\n } @else {\n {{ row.name }}\n }\n </div>\n <div class=\"dynamic-view-builder__selection-cell dynamic-view-builder__selection-cell--meta\">\n <span>{{ row.meta }}</span>\n @if (row.note) {\n <span class=\"dynamic-view-builder__selection-note\">\n {{ row.note }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__selection-cell dynamic-view-builder__selection-cell--select\">\n <span\n class=\"dynamic-view-builder__selection-marker\"\n [class.dynamic-view-builder__selection-marker--selected]=\"row.selected\"\n aria-hidden=\"true\"\n >\n <i class=\"fas fa-check\"></i>\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"selectionModalPicklistItems\"\n [selectedIds]=\"selectionModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSelectionModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSelectionModal()\"\n (keydown.enter)=\"closeSelectionModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.confirmSelection') | translate\"\n (click)=\"confirmSelectionModal()\"\n (keydown.enter)=\"confirmSelectionModal()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (sourceModalVisible) {\n <sdc-modal\n [visible]=\"sourceModalVisible\"\n (visibleChange)=\"$event ? (sourceModalVisible = true) : closeSourceModal()\"\n [header]=\"sourceModalTitle\"\n [width]=\"modalDimensions.source.width\"\n [height]=\"modalDimensions.source.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__field-modal\">\n <sdc-timeline\n [items]=\"sourceModalTimelineItems\"\n [activeIndex]=\"sourceModalConfigurationStepActive ? 1 : 0\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"sourceModalTimelineAriaLabel\"\n (stepSelect)=\"onSourceModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (sourceModalSelectionStepActive) {\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"sourceModalPicklistItems\"\n [selectedIds]=\"sourceModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSourceModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__field-config-shell\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-list-shell\"\n >\n <div class=\"dynamic-view-builder__source-config-list\">\n @for (item of sourceModalConfiguredItems; track trackById($index, item)) {\n <div class=\"dynamic-view-builder__source-config-row\">\n <div class=\"dynamic-view-builder__source-config-main\">\n <div class=\"dynamic-view-builder__field-config-title\">\n <span class=\"dynamic-view-builder__selection-table-label\">{{ item.dbLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ item.tableLabel }}</span>\n </div>\n </div>\n <div class=\"dynamic-view-builder__source-config-controls\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"item.alias\"\n (ngModelChange)=\"onSourceModalAliasChange(item.table, $event)\"\n width=\"100%\"\n [maxlength]=\"24\"\n ></sdc-textbox>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSourceModal()\"\n (keydown.enter)=\"closeSourceModal()\"\n ></sdc-button>\n @if (sourceModalSelectionStepActive && sourceModalCanProceed) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.nextStep') | translate\"\n (click)=\"advanceSourceModalStep()\"\n (keydown.enter)=\"advanceSourceModalStep()\"\n ></sdc-button>\n }\n @if (sourceModalConfigurationStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!sourceModalCanProceed\"\n (click)=\"saveSourceModal()\"\n (keydown.enter)=\"saveSourceModal()\"\n ></sdc-button>\n }\n </div>\n </sdc-modal>\n }\n\n @if (joinModalVisible) {\n <sdc-modal\n [visible]=\"joinModalVisible\"\n (visibleChange)=\"$event ? (joinModalVisible = true) : closeJoinModal()\"\n [header]=\"(config.translationPrefix + '.cards.joins.title') | translate\"\n [width]=\"modalDimensions.join.width\"\n [height]=\"modalDimensions.join.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__join-modal\">\n <div class=\"dynamic-view-builder__join-modal-top\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-card\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.left') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >{{ joinSourceSummary }}</div>\n </div>\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--compact\n dynamic-view-builder__modal-card\"\n >\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.operator'\"\n [ngModel]=\"joinDraft.operator\"\n (ngModelChange)=\"joinDraft.operator = $event\"\n [options]=\"joinOperatorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n </div>\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-card\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.right') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >{{ joinTargetSummary }}</div>\n </div>\n </div>\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--fit\">\n <div\n class=\"dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__modal-card dynamic-view-builder__picklist-shell\"\n >\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.left') | translate }}\n </div>\n <sdc-picklist\n [items]=\"joinSourcePicklistItems\"\n [selectedIds]=\"joinSourceSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onJoinSourceSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n <div\n class=\"dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__modal-card dynamic-view-builder__picklist-shell\"\n >\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.right') | translate }}\n </div>\n <sdc-picklist\n [items]=\"joinTargetPicklistItems\"\n [selectedIds]=\"joinTargetSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onJoinTargetSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeJoinModal()\"\n (keydown.enter)=\"closeJoinModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveJoin\"\n (click)=\"saveJoin()\"\n (keydown.enter)=\"saveJoin()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (sortModalVisible) {\n <sdc-modal\n [visible]=\"sortModalVisible\"\n (visibleChange)=\"$event ? (sortModalVisible = true) : closeSortModal()\"\n [header]=\"sortModalTitle\"\n [width]=\"modalDimensions.sort.width\"\n [height]=\"modalDimensions.sort.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__sort-modal\">\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--full\n dynamic-view-builder__sort-direction-field\"\n >\n <div class=\"dynamic-view-builder__modal-label\">\n {{ (config.translationPrefix + '.fields.direction') | translate }}\n </div>\n <sdc-select-button\n class=\"dynamic-view-builder__sort-direction\"\n [items]=\"sortDirectionItems\"\n appearance=\"soft\"\n [ngModel]=\"selectedSortDirectionItems\"\n (ngModelChange)=\"onSortDirectionChange($event)\"\n ></sdc-select-button>\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__selection-flow dynamic-view-builder__picklist-shell\n dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"sortPicklistItems\"\n [selectedIds]=\"sortSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSortSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSortModal()\"\n (keydown.enter)=\"closeSortModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveSort\"\n (click)=\"saveSort()\"\n (keydown.enter)=\"saveSort()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (filterModalVisible) {\n <sdc-modal\n [visible]=\"filterModalVisible\"\n (visibleChange)=\"$event ? (filterModalVisible = true) : closeFilterModal()\"\n [header]=\"filterModalTitle\"\n [width]=\"modalDimensions.filter.width\"\n [height]=\"modalDimensions.filter.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__filter-modal\">\n <sdc-timeline\n [items]=\"filterModalTimelineItems\"\n [activeIndex]=\"filterModalReviewStepActive ? 2 : (filterModalConfigurationStepActive ? 1 : 0)\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"filterModalTimelineAriaLabel\"\n (stepSelect)=\"onFilterModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (filterModalSelectionStepActive) {\n <div class=\"dynamic-view-builder__filter-step\">\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-base-selector\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.modals.filter.steps.select.title') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.filters.tooltips.mode'\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-mode-row\">\n <div class=\"dynamic-view-builder__filter-mode-copy\">\n {{ (config.translationPrefix + '.modals.filter.title') | translate }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__filter-mode-selector\">\n <sdc-select-button\n [items]=\"filterModeItems\"\n appearance=\"soft\"\n [ngModel]=\"selectedFilterModeItems\"\n (ngModelChange)=\"onFilterModeChange($event[0]?.value || 'condition')\"\n ></sdc-select-button>\n </div>\n </div>\n @if (filterModalMode === 'condition') {\n <div\n class=\"dynamic-view-builder__modal-picker\n dynamic-view-builder__modal-picker--filter\n dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__selection-flow\n dynamic-view-builder__modal-stage-body\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell\"\n >\n <sdc-picklist\n [items]=\"filterModalPicklistItems\"\n [selectedIds]=\"filterModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [autoResize]=\"false\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onFilterModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-domain-intro\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.filters.domainLabel') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"filterDomainExpressionTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-grid\">\n <div class=\"dynamic-view-builder__filter-domain-item\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.domainExpression') | translate }}\n </div>\n <div class=\"dynamic-view-builder__modal-summary-value\">\n {{ filterDomainExpressionTooltip }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-item\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.connector') | translate }}\n </div>\n <div class=\"dynamic-view-builder__modal-summary-value\">\n {{ filterConnectorTooltip }}\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n } @else {\n @if (filterModalConfigurationStepActive) {\n <div class=\"dynamic-view-builder__filter-step\">\n <div class=\"dynamic-view-builder__filter-toolbar\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-summary--filter\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.modals.filter.steps.configure.title') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >\n {{ filterConfigurationSummaryLabel }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"goToFilterModalStep('select')\"\n >\n {{ filterBackToSelectionLabel }}\n </button>\n </div>\n @if (filterModalMode === 'condition') {\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-config-section\">\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.modals.filter.steps.configure.title') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.filters.tooltips.configure'\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--filter-controls\">\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.connector'\"\n [ngModel]=\"filterDraft.connector\"\n (ngModelChange)=\"filterDraft.connector = $event\"\n [options]=\"filterConnectorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterConnectorDisabled\"\n [infoTooltip]=\"filterConnectorTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.operator'\"\n [ngModel]=\"filterDraft.operator\"\n (ngModelChange)=\"filterDraft.operator = $event; onFilterOperatorChange()\"\n [options]=\"filterOperatorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n [disabled]=\"!filterDraft.column\"\n [infoTooltip]=\"filterOperatorTooltip\"\n ></sdc-combobox>\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.valueType'\"\n [ngModel]=\"filterDraft.valueType\"\n (ngModelChange)=\"filterDraft.valueType = $event; onFilterValueTypeChange()\"\n [options]=\"valueTypeOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterValueTypeDisabled\"\n [infoTooltip]=\"filterValueTypeTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <div class=\"dynamic-view-builder__filter-optional\">\n <sdc-checkbox\n [label]=\"config.translationPrefix + '.states.optional'\"\n [ngModel]=\"filterDraft.optional\"\n (ngModelChange)=\"filterDraft.optional = $event\"\n ></sdc-checkbox>\n <sdc-info-sign\n [tooltip]=\"filterOptionalTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n </div>\n </div>\n <div\n class=\"dynamic-view-builder__filter-config-section\n dynamic-view-builder__filter-config-section--value\"\n >\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--single\">\n @if (showFilterBooleanCombobox) {\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.value'\"\n [ngModel]=\"filterDraft.value\"\n (ngModelChange)=\"filterDraft.value = $event\"\n [options]=\"booleanValueOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n }\n @if (showFilterValueTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.value'\"\n [ngModel]=\"filterDraft.value\"\n (ngModelChange)=\"filterDraft.value = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n @if (showFilterValuesTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.values'\"\n [ngModel]=\"filterDraft.valuesText\"\n (ngModelChange)=\"filterDraft.valuesText = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n @if (showFilterBetweenInputs) {\n <div class=\"dynamic-view-builder__between dynamic-view-builder__modal-grid-column-full\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.valueStart'\"\n [ngModel]=\"filterDraft.betweenStart\"\n (ngModelChange)=\"filterDraft.betweenStart = $event\"\n width=\"100%\"\n ></sdc-textbox>\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.valueEnd'\"\n [ngModel]=\"filterDraft.betweenEnd\"\n (ngModelChange)=\"filterDraft.betweenEnd = $event\"\n width=\"100%\"\n ></sdc-textbox>\n </div>\n }\n @if (showFilterParameterTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.parameterName'\"\n [ngModel]=\"filterDraft.parameterName\"\n (ngModelChange)=\"filterDraft.parameterName = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-config-section\">\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--filter-controls\">\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.connector'\"\n [ngModel]=\"filterDraft.connector\"\n (ngModelChange)=\"filterDraft.connector = $event\"\n [options]=\"filterConnectorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterConnectorDisabled\"\n [infoTooltip]=\"filterConnectorTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <div class=\"dynamic-view-builder__filter-optional\">\n <sdc-checkbox\n [label]=\"config.translationPrefix + '.states.optional'\"\n [ngModel]=\"filterDraft.optional\"\n (ngModelChange)=\"filterDraft.optional = $event\"\n ></sdc-checkbox>\n <sdc-info-sign\n [tooltip]=\"filterOptionalTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n </div>\n </div>\n <div\n class=\"dynamic-view-builder__filter-config-section\n dynamic-view-builder__filter-config-section--domain\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.domainExpression') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"filterDomainExpressionTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-hint\">\n {{ filterDomainExpressionTooltip }}\n </div>\n <sdc-textarea\n [label]=\"''\"\n [ngModel]=\"filterDraft.domainExpression\"\n (ngModelChange)=\"filterDraft.domainExpression = $event\"\n width=\"100%\"\n [rows]=\"10\"\n ></sdc-textarea>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"dynamic-view-builder__filter-step\">\n <div class=\"dynamic-view-builder__filter-toolbar\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-summary--filter\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.modals.filter.steps.review.title') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >\n {{ filterConfigurationSummaryLabel }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"goToFilterModalStep('configure')\"\n >\n {{ filterBackToConfigurationLabel }}\n </button>\n </div>\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-review-grid\">\n @for (item of filterReviewItems; track trackById($index, item)) {\n <div\n class=\"dynamic-view-builder__filter-review-item\"\n >\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ item.label }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\"\n [class.dynamic-view-builder__modal-summary-value--path]=\"item.emphasize === 'path'\"\n [class.dynamic-view-builder__filter-review-code]=\"item.emphasize === 'code'\"\n >\n {{ item.value }}\n </div>\n </div>\n }\n </div>\n <div class=\"dynamic-view-builder__filter-review-preview\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.sqlPreview') | translate }}\n </div>\n <sdc-textarea\n [label]=\"''\"\n [ngModel]=\"filterReviewPreviewLabel\"\n width=\"100%\"\n [rows]=\"6\"\n [disabled]=\"true\"\n ></sdc-textarea>\n </div>\n </div>\n </div>\n }\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeFilterModal()\"\n (keydown.enter)=\"closeFilterModal()\"\n ></sdc-button>\n @if (filterModalSelectionStepActive) {\n <sdc-button\n [label]=\"filterModalConfigureActionLabel\"\n [disabled]=\"!filterModalCanProceed\"\n (click)=\"advanceFilterModalStep()\"\n (keydown.enter)=\"advanceFilterModalStep()\"\n ></sdc-button>\n }\n @if (filterModalConfigurationStepActive) {\n <sdc-button\n [label]=\"filterModalReviewActionLabel\"\n [disabled]=\"!filterModalCanReview\"\n (click)=\"advanceFilterModalStep()\"\n (keydown.enter)=\"advanceFilterModalStep()\"\n ></sdc-button>\n }\n @if (filterModalReviewStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveFilter\"\n (click)=\"saveFilter()\"\n (keydown.enter)=\"saveFilter()\"\n ></sdc-button>\n }\n </div>\n </sdc-modal>\n }\n\n @if (fieldModalVisible) {\n <sdc-modal\n [visible]=\"fieldModalVisible\"\n (visibleChange)=\"$event ? (fieldModalVisible = true) : closeFieldModal()\"\n [header]=\"fieldModalTitle\"\n [width]=\"modalDimensions.field.width\"\n [height]=\"modalDimensions.field.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__field-modal\">\n <sdc-timeline\n [items]=\"fieldModalTimelineItems\"\n [activeIndex]=\"fieldModalConfigurationStepActive ? 1 : 0\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"fieldModalTimelineAriaLabel\"\n (stepSelect)=\"onFieldModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (fieldModalSelectionStepActive) {\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"fieldModalPicklistItems\"\n [selectedIds]=\"fieldModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [autoResize]=\"false\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onFieldModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__field-config-shell\"\n >\n <div class=\"dynamic-view-builder__field-config-toolbar\">\n <div class=\"dynamic-view-builder__field-config-summary\">\n {{ fieldModalConfiguredItems.length }}\n {{ (config.translationPrefix + '.cards.fields.title') | translate }}\n </div>\n @if (fieldModalHasSelectableColumns) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--primary\"\n (click)=\"addAnotherFieldFromModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-list-shell\"\n >\n <div class=\"dynamic-view-builder__field-config-list\">\n @for (item of fieldModalConfiguredItems; track trackById($index, item)) {\n <div class=\"dynamic-view-builder__field-config-row\">\n <div class=\"dynamic-view-builder__field-config-main\">\n <div class=\"dynamic-view-builder__field-config-title\">\n <span class=\"dynamic-view-builder__selection-table-label\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ item.fieldLabel }}</span>\n </div>\n @if (item.functionName && !isFieldFunctionEditing(item.column)) {\n <div class=\"dynamic-view-builder__field-config-function\">\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n @if (item.functionAlias) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.functionAlias }}\n </span>\n }\n </div>\n }\n </div>\n @if (!isFieldFunctionEditing(item.column)) {\n <div class=\"dynamic-view-builder__field-config-controls\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"item.alias\"\n (ngModelChange)=\"onFieldModalAliasChange(item.column, $event)\"\n width=\"100%\"\n [maxlength]=\"24\"\n ></sdc-textbox>\n <div class=\"dynamic-view-builder__field-width\">\n <div class=\"dynamic-view-builder__modal-label-row\">\n <span class=\"dynamic-view-builder__modal-label\">\n {{ (config.translationPrefix + '.fields.width') | translate }}\n </span>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.messages.fieldWidthInfo'\"\n ></sdc-info-sign>\n </div>\n <sdc-textbox\n [label]=\"''\"\n [ngModel]=\"item.width\"\n (ngModelChange)=\"onFieldModalWidthChange(item.column, $event)\"\n width=\"100%\"\n [maxlength]=\"12\"\n placeholder=\"160\"\n ></sdc-textbox>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"startFieldFunctionEdit(item.column)\"\n >\n {{ item.functionName\n ? ((config.translationPrefix + '.actions.configureField') | translate)\n : ((config.translationPrefix + '.fields.functionName') | translate) }}\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--danger\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeFieldModalDraft(item.column)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__field-config-controls\n dynamic-view-builder__field-config-controls--function\"\n >\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.functionName'\"\n [ngModel]=\"fieldFunctionDraft.functionName\"\n (ngModelChange)=\"onFieldFunctionDraftNameChange($event)\"\n [options]=\"fieldModalFunctionOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"fieldFunctionDraft.functionAlias\"\n (ngModelChange)=\"fieldFunctionDraft.functionAlias = $event\"\n width=\"100%\"\n [maxlength]=\"24\"\n [disabled]=\"!fieldFunctionDraft.functionName\"\n ></sdc-textbox>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--danger\"\n [title]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n (click)=\"cancelFieldFunctionEdit()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--active\"\n [title]=\"(config.translationPrefix + '.actions.save') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.save') | translate\"\n (click)=\"saveFieldFunctionEdit()\"\n >\n <i class=\"fas fa-check\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer dynamic-view-builder__modal-footer--between\">\n <div class=\"dynamic-view-builder__modal-footer-group dynamic-view-builder__modal-footer-group--start\">\n @if (fieldModalSelectionStepActive && fieldModalCanSelectAll) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--primary\"\n (click)=\"selectAllFieldModalColumns()\"\n >\n {{ (config.translationPrefix + '.actions.selectAllColumns') | translate }}\n </button>\n }\n </div>\n <div class=\"dynamic-view-builder__modal-footer-group\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeFieldModal()\"\n (keydown.enter)=\"closeFieldModal()\"\n ></sdc-button>\n @if (fieldModalSelectionStepActive && fieldModalCanProceed) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.nextStep') | translate\"\n (click)=\"advanceFieldModalStep()\"\n (keydown.enter)=\"advanceFieldModalStep()\"\n ></sdc-button>\n }\n @if (fieldModalConfigurationStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveFieldModal\"\n (click)=\"saveField()\"\n (keydown.enter)=\"saveField()\"\n ></sdc-button>\n }\n </div>\n </div>\n </sdc-modal>\n }\n\n <div\n class=\"dynamic-view-builder__workspace\"\n [class.dynamic-view-builder__workspace--stacked]=\"layoutMode === 'stacked'\"\n [class.dynamic-view-builder__workspace--split]=\"layoutMode === 'split'\"\n [class.dynamic-view-builder__workspace--preview-hidden]=\"!previewVisible\"\n >\n <div class=\"dynamic-view-builder__builder-area\">\n <div\n #sectionsContainer\n class=\"dynamic-view-builder__sections\"\n [class.dynamic-view-builder__sections--stacked]=\"layoutMode === 'stacked'\"\n [class.dynamic-view-builder__sections--split]=\"layoutMode === 'split'\"\n >\n <section\n #builderSection\n data-section-id=\"tables\"\n class=\"dynamic-view-builder__section\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.sources.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n (click)=\"openSourceModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canOpenSourceConfiguration\"\n [title]=\"(config.translationPrefix + '.actions.configureAliases') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.configureAliases') | translate\"\n (click)=\"openSourceConfigurationModal()\"\n >\n <i class=\"fas fa-cog\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sourceItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearSources()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!sourceItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n (click)=\"openSourceModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectTables') | translate }}\n </button>\n }\n @if (sourceItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (source of sourceItems; track trackById(i, source); let i = $index) {\n <div\n class=\"dynamic-view-builder__row dynamic-view-builder__row--source\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-table-group\">\n <span class=\"dynamic-view-builder__row-db\">{{ source.dbLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-table\">\n {{ source.tableLabel }}\n </span>\n </span>\n @if (source.alias) {\n <span class=\"dynamic-view-builder__row-meta\">\n Alias {{ source.alias }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeSource(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n <div class=\"dynamic-view-builder__section-row\">\n <section\n #builderSection\n data-section-id=\"joins\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--fluid\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.joins.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canConfigureJoins\"\n [title]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n (click)=\"openJoinModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !joinItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearJoins()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!canConfigureJoins) {\n <div class=\"dynamic-view-builder__info-row\">\n {{ (config.translationPrefix + '.messages.joinRequiresTwoTables') | translate }}\n </div>\n }\n @if (canConfigureJoins && !joinItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n (click)=\"openJoinModal()\"\n >\n {{ (config.translationPrefix + '.actions.addJoin') | translate }}\n </button>\n }\n @if (joinItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of joinItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.sourceTable }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.sourceField }}</span>\n </span>\n <span class=\"dynamic-view-builder__join-operator\">{{ item.operator }}</span>\n <span class=\"dynamic-view-builder__join-arrow\" aria-hidden=\"true\">\n <i class=\"fas fa-long-arrow-alt-right\"></i>\n </span>\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.targetTable }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.targetField }}</span>\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openJoinModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeJoin(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n <section\n #builderSection\n data-section-id=\"groupBy\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--compact\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-heading\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.groupBy.title') | translate }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !groupBySelectableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n (click)=\"openSelectionModal('groupBy')\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !groupByItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearGroupBy()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!groupByItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n (click)=\"openSelectionModal('groupBy')\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n @if (groupByItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of groupByItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeGroupBy(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n </div>\n\n <section\n #builderSection\n data-section-id=\"fields\"\n class=\"dynamic-view-builder__section\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-heading\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.fields.title') | translate }}\n </div>\n <sdc-info-sign\n class=\"dynamic-view-builder__hint\"\n [tooltip]=\"'Voc\u00EA pode ordenar a sequ\u00EAncia dos campos arrastando e soltando.'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !fieldSelectableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n (click)=\"openFieldModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canOpenFieldConfiguration\"\n [title]=\"(config.translationPrefix + '.actions.configureField') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.configureField') | translate\"\n (click)=\"openFieldConfigurationModal()\"\n >\n <i class=\"fas fa-cog\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !fieldItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearFields()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!fieldItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n (click)=\"openFieldModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n @if (fieldItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of fieldItems; track trackById(i, item); let i = $index) {\n @if (isFieldDropIndicatorVisible(i)) {\n <div\n class=\"dynamic-view-builder__field-drop-indicator\"\n aria-hidden=\"true\"\n ></div>\n }\n <div\n class=\"dynamic-view-builder__row dynamic-view-builder__row--draggable\"\n [class.dynamic-view-builder__row--drag-origin]=\"draggingFieldIndex === item.sourceIndex\"\n [draggable]=\"!isReadonly\"\n (dragstart)=\"onFieldDragStart(item.sourceIndex)\"\n (dragover)=\"onFieldDragOver($event, i)\"\n (drop)=\"onFieldDrop()\"\n (dragend)=\"onFieldDragEnd()\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-order\">{{ item.orderLabel }}</span>\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n @if (item.alias) {\n <span class=\"dynamic-view-builder__row-meta\">\n Alias {{ item.alias }}\n </span>\n }\n @if (item.width) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.width }}\n </span>\n }\n @if (item.functionName) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n }\n @if (item.functionAlias) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.functionAlias }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeField(item.sourceIndex)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n @if (isFieldDropIndicatorAtEndVisible()) {\n <div\n class=\"dynamic-view-builder__field-drop-indicator\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n </section>\n\n <div class=\"dynamic-view-builder__section-row\">\n <section\n #builderSection\n data-section-id=\"sorting\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--compact\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.sorting.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sortSelectableItems.length\"\n [title]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n (click)=\"openSortModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sortItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearSorting()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!sortItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n (click)=\"openSortModal()\"\n >\n {{ (config.translationPrefix + '.actions.addSort') | translate }}\n </button>\n }\n @if (sortItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of sortItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n @if (item.functionName) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n }\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.direction }}\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openSortModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeSort(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n <section\n #builderSection\n data-section-id=\"filters\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--fluid\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.filters.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !availableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n (click)=\"openFilterModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !filterItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearFilters()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!filterItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n (click)=\"openFilterModal()\"\n >\n {{ (config.translationPrefix + '.actions.addFilter') | translate }}\n </button>\n }\n @if (filterItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of filterItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n @if (!item.isDomain) {\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n <span\n class=\"dynamic-view-builder__row-chip\n dynamic-view-builder__row-chip--operator\"\n >{{ item.operatorLabel }}</span>\n } @else {\n <span\n class=\"dynamic-view-builder__row-chip\n dynamic-view-builder__row-chip--domain\"\n >{{ item.tableLabel }}</span>\n }\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--value\">\n {{ item.subtitle }}\n </span>\n @if (item.optional) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--optional\">\n {{ (config.translationPrefix + '.states.optional') | translate }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openFilterModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeFilter(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n </div>\n\n @for (arrow of flowArrows; track trackByArrow($index, arrow)) {\n <div\n class=\"dynamic-view-builder__flow-arrow\"\n [class.dynamic-view-builder__flow-arrow--right]=\"arrow.direction === 'right'\"\n [class.dynamic-view-builder__flow-arrow--down]=\"arrow.direction === 'down'\"\n [style.left.px]=\"arrow.left\"\n [style.top.px]=\"arrow.top\"\n aria-hidden=\"true\"\n >\n <i\n [class]=\"arrow.direction === 'right'\n ? 'fas fa-angle-double-right'\n : 'fas fa-angle-double-down'\"\n ></i>\n </div>\n }\n </div>\n </div>\n\n @if (previewVisible) {\n <aside class=\"dynamic-view-builder__preview-area\">\n <div\n class=\"dynamic-view-builder__preview\"\n [style.height]=\"sqlPreviewPanelHeight\"\n >\n <div class=\"dynamic-view-builder__preview-header\">\n <div class=\"dynamic-view-builder__preview-title\">SQL Preview</div>\n <div class=\"dynamic-view-builder__preview-subtitle\">\n Consulta gerada automaticamente a partir da configuracao atual.\n </div>\n </div>\n <div class=\"dynamic-view-builder__preview-body\">\n <sdc-code-editor\n [sql]=\"sqlPreview\"\n language=\"sql\"\n [readOnly]=\"true\"\n [showCopy]=\"true\"\n [height]=\"sqlPreviewHeight\"\n ></sdc-code-editor>\n </div>\n </div>\n </aside>\n }\n </div>\n</div>\n", styles: [":host{display:block}::ng-deep .sdc-loading-state{overflow:auto!important}.dynamic-view-builder{display:flex;flex-direction:column;gap:.75rem;color:#243342}.dynamic-view-builder__toolbar{display:flex;justify-content:space-between;align-items:center;gap:1rem;padding:.25rem 0}.dynamic-view-builder__toolbar-copy{min-width:0}.dynamic-view-builder__title{font-size:1rem;font-weight:700;line-height:1.2;color:#243342}.dynamic-view-builder__subtitle{margin-top:.2rem;color:#70839a;font-size:.875rem;line-height:1.35}.dynamic-view-builder__toolbar-actions{display:flex;align-items:center;gap:.625rem;flex-shrink:0;flex-wrap:wrap}.dynamic-view-builder__toolbar-label{color:#70839a;font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__workspace{display:grid;gap:.875rem;min-width:0}.dynamic-view-builder__workspace--preview-hidden,.dynamic-view-builder__workspace--split.dynamic-view-builder__workspace--preview-hidden{grid-template-columns:1fr;grid-template-areas:\"builder\"}.dynamic-view-builder__workspace--stacked{grid-template-columns:1fr;grid-template-areas:\"preview\" \"builder\"}.dynamic-view-builder__workspace--split{grid-template-columns:minmax(0,62fr) minmax(20rem,38fr);grid-template-areas:\"builder preview\";align-items:start}.dynamic-view-builder__builder-area{grid-area:builder;display:flex;flex-direction:column;gap:.75rem;min-width:0}.dynamic-view-builder__sections{display:flex;flex-direction:column;gap:.5rem;min-width:0;position:relative}.dynamic-view-builder__section{display:flex;flex-direction:column;gap:.4rem;min-width:0;padding:.55rem .65rem;border:1px solid #dbe3ec;border-radius:.5rem;background:#fff;min-inline-size:0;max-inline-size:100%;position:relative;width:100%}.dynamic-view-builder__section-row{display:flex;flex-wrap:wrap;align-items:stretch;gap:.5rem;min-width:0}.dynamic-view-builder__section-row>.dynamic-view-builder__section{align-self:stretch}.dynamic-view-builder__section--half{flex:1 1 18rem;width:auto}.dynamic-view-builder__section--compact{flex:0 0 clamp(18rem,30%,22rem);width:auto}.dynamic-view-builder__section--fluid{flex:1 1 26rem;min-inline-size:min(100%,26rem);width:auto}.dynamic-view-builder__flow-arrow{position:absolute;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;border:1px solid #d9e3ed;border-radius:999px;background:#fff;color:#68809a;pointer-events:none;z-index:2;transform:translate(-50%,-50%)}.dynamic-view-builder__flow-arrow i{font-size:.74rem;line-height:1}.dynamic-view-builder__section-head{display:flex;justify-content:space-between;align-items:flex-start;gap:.75rem}.dynamic-view-builder__section-heading{display:inline-flex;align-items:center;gap:.4rem;min-width:0}.dynamic-view-builder__section-label{min-width:0;color:#516173;font-size:.78rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase}.dynamic-view-builder__section-actions{display:flex;align-items:center;justify-content:flex-end;gap:.5rem;flex-wrap:wrap;flex-shrink:0}.dynamic-view-builder__hint{display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;padding:0;border:0;background:transparent;color:#8ca0b6;cursor:help}.dynamic-view-builder__hint--legacy{display:none}.dynamic-view-builder__stack{display:flex;gap:.35rem;min-width:0}.dynamic-view-builder__stack--wrap{flex-direction:row;flex-wrap:wrap;align-items:flex-start}.dynamic-view-builder__row,.dynamic-view-builder__empty-row,.dynamic-view-builder__info-row{min-width:0;border:1px solid #e7edf4;border-radius:.4rem;background:#fbfcfe}.dynamic-view-builder__row{display:inline-flex;align-items:stretch;justify-content:space-between;gap:.45rem;padding:.5rem .6rem;inline-size:auto;min-inline-size:min(100%,12rem);max-inline-size:100%;flex:0 1 auto}.dynamic-view-builder__row-main{min-width:0;display:flex;align-items:center;gap:.3rem;flex-wrap:wrap;flex:1 1 auto}.dynamic-view-builder__row-label{color:#243342;font-weight:600;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-value{color:#627588;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-separator{color:#b0bcc9;flex-shrink:0}.dynamic-view-builder__row-actions{display:flex;align-items:center;justify-content:flex-end;gap:.2rem;flex-wrap:wrap;flex:0 0 auto}.dynamic-view-builder__row--source{align-items:center;min-inline-size:min(100%,16.5rem);padding-block:.45rem}.dynamic-view-builder__row--source .dynamic-view-builder__row-main{align-items:center;flex-wrap:nowrap;gap:.18rem}.dynamic-view-builder__row-table-group{display:inline-flex;align-items:center;gap:0;min-width:0;flex:0 1 auto}.dynamic-view-builder__row-db{color:#243342;font-weight:700;line-height:1.25;white-space:nowrap}.dynamic-view-builder__row-order{display:inline-flex;align-items:center;justify-content:center;min-width:2rem;padding:.1rem .35rem;border-radius:999px;background:#eef3f8;color:#516173;font-size:.75rem;font-weight:700}.dynamic-view-builder__row-path{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:wrap}.dynamic-view-builder__row-table{color:#425466;font-weight:500;line-height:1.35}.dynamic-view-builder__row-table--accent{color:#1f8a52;font-weight:700}.dynamic-view-builder__row-dot{color:#8fa1b3;flex:0 0 auto;margin-inline:.02rem}.dynamic-view-builder__row-field{color:#1f8a52;font-weight:700;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-meta{display:inline-flex;align-items:center;padding:.12rem .4rem;border-radius:999px;background:#f0f4f8;color:#627588;font-size:.74rem;line-height:1.2}.dynamic-view-builder__join-operator{display:inline-flex;align-items:center;padding:.1rem .35rem;border-radius:999px;background:#eef3f8;color:#627588;font-size:.73rem;font-weight:700;letter-spacing:.03em;text-transform:uppercase}.dynamic-view-builder__join-arrow{color:#9ab0c6;font-size:.85rem}.dynamic-view-builder__row--draggable{cursor:grab}.dynamic-view-builder__row--drag-origin{opacity:.6;border-color:#b8cae0;background:#f4f8fc}.dynamic-view-builder__row--draggable:active{cursor:grabbing}.dynamic-view-builder__alias-field{flex:0 1 5.4rem;min-inline-size:4.4rem;max-inline-size:5.8rem}.dynamic-view-builder__alias-field :where(.sdc-textbox__label-row){display:none}.dynamic-view-builder__action-link{padding:0;border:0;background:transparent;color:#6d7786;font:inherit;font-size:.82rem;font-weight:600;line-height:1.25;cursor:pointer;transition:color .18s ease;pointer-events:auto;position:relative;z-index:2;text-decoration:none}.dynamic-view-builder__action-link:disabled{opacity:.45;cursor:default}.dynamic-view-builder__action-link:hover:not(:disabled),.dynamic-view-builder__action-link:focus-visible:not(:disabled){color:#1b5cff}.dynamic-view-builder__action-link--primary{color:#1b5cff}.dynamic-view-builder__action-link--icon{display:inline-flex;align-items:center;justify-content:center;min-width:1.5rem;min-height:1.5rem}.dynamic-view-builder__action-link--icon i{font-size:.9rem;line-height:1}.dynamic-view-builder__preview-toggle{display:inline-flex;align-items:center;gap:.4rem;min-height:2rem;padding:0 .75rem;border:1px solid #dbe3ec;border-radius:999px;background:#f8fafc;color:#425466;font:inherit;font-size:.82rem;font-weight:600;cursor:pointer;transition:border-color .18s ease,background-color .18s ease,color .18s ease}.dynamic-view-builder__preview-toggle:focus-visible{outline:2px solid rgba(27,92,255,.18);outline-offset:2px}.dynamic-view-builder__preview-toggle:hover:not(:disabled),.dynamic-view-builder__preview-toggle:focus-visible:not(:disabled){border-color:#b9c7d6;background:#eef4fb;color:#1b5cff}.dynamic-view-builder__icon-action{display:inline-flex;align-items:center;justify-content:center;width:1.35rem;height:1.35rem;padding:0;border:0;background:transparent;color:#7b8ea2;cursor:pointer;transition:color .18s ease}.dynamic-view-builder__icon-action:focus-visible{outline:2px solid rgba(27,92,255,.18);outline-offset:2px;border-radius:999px}.dynamic-view-builder__icon-action:disabled{opacity:.45;cursor:default}.dynamic-view-builder__icon-action:hover:not(:disabled),.dynamic-view-builder__icon-action:focus-visible:not(:disabled){color:#1b5cff}.dynamic-view-builder__icon-action--active{color:#1c9b5f}.dynamic-view-builder__icon-action--danger{color:#8d9caf}.dynamic-view-builder__icon-action--danger:hover:not(:disabled),.dynamic-view-builder__icon-action--danger:focus-visible:not(:disabled){color:#d14343}.dynamic-view-builder__empty-row{width:auto;max-width:100%;padding:.45rem .55rem;text-align:left;color:#70839a;cursor:pointer;inline-size:fit-content;pointer-events:auto;position:relative;z-index:1}.dynamic-view-builder__info-row{padding:.45rem .55rem;color:#3d6ae8;line-height:1.35;inline-size:fit-content;max-inline-size:100%}.dynamic-view-builder__preview-area{grid-area:preview;min-width:0;display:flex;align-self:start}.dynamic-view-builder__preview{display:flex;flex:1 1 auto;flex-direction:column;border:1px solid #dbe3ec;border-radius:.5rem;background:#fff;overflow:hidden;min-height:0}.dynamic-view-builder__preview-header{padding:.75rem .9rem;border-bottom:1px solid #e7edf4;background:#f8fafc}.dynamic-view-builder__preview-title{color:#243342;font-weight:700;line-height:1.25}.dynamic-view-builder__preview-subtitle{margin-top:.2rem;color:#70839a;line-height:1.35}.dynamic-view-builder__preview-body{display:flex;flex:1 1 auto;min-height:0;padding:.55rem}.dynamic-view-builder__preview-body :where(sdc-code-editor){display:block;flex:1 1 auto;min-height:0;width:100%}.dynamic-view-builder__footer{display:flex;justify-content:flex-start;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-shell{display:flex;flex-direction:column;gap:.875rem;min-height:0;height:100%}.dynamic-view-builder__modal-shell--full{height:100%}.dynamic-view-builder__modal-stage{display:flex;flex-direction:column;gap:.75rem;min-height:0}.dynamic-view-builder__modal-stage-body{flex:1 1 auto;min-height:0}.dynamic-view-builder__modal-card{padding:.85rem .95rem;border:1px solid #dbe3ec;border-radius:.65rem;background:#fff;box-shadow:0 1px 2px #0f172a0a}.dynamic-view-builder__modal-card--compact{padding:.75rem .85rem}.dynamic-view-builder__modal-card--section{display:flex;flex-direction:column;gap:.875rem}.dynamic-view-builder__modal-card--soft{background:linear-gradient(180deg,#fbfdff,#f6f9fc)}.dynamic-view-builder__modal-inline-surface{display:flex;flex-direction:column;gap:.625rem;min-width:0}.dynamic-view-builder__modal-list-shell{flex:1 1 auto;min-height:0;overflow:hidden;padding:.8rem}.dynamic-view-builder__modal-card-title{color:#243342;font-size:.92rem;font-weight:700;line-height:1.25}.dynamic-view-builder__modal-card-text{margin-top:.2rem;color:#70839a;font-size:.8rem;line-height:1.35}.dynamic-view-builder__modal-panel-title{color:#425466;font-size:.78rem;font-weight:700;letter-spacing:.04em;line-height:1.25;text-transform:uppercase}.dynamic-view-builder__modal-panel-title--section{margin-bottom:-.1rem}.dynamic-view-builder__modal-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;align-items:start;min-height:0}.dynamic-view-builder__modal-grid>*{min-width:0}.dynamic-view-builder__modal-grid--single{grid-template-columns:1fr}.dynamic-view-builder__modal-grid--filter{grid-template-columns:repeat(2,minmax(0,1fr))}.dynamic-view-builder__modal-grid--filter-controls{grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem .75rem}.dynamic-view-builder__modal-grid-column-full{grid-column:1/-1}.dynamic-view-builder__modal-field,.dynamic-view-builder__modal-picker{display:flex;flex-direction:column;gap:.625rem;min-width:0;min-height:0}.dynamic-view-builder__modal-field--stretch,.dynamic-view-builder__modal-picker--stretch{height:100%}.dynamic-view-builder__modal-field--compact{gap:.5rem}.dynamic-view-builder__modal-field--full{width:100%}.dynamic-view-builder__modal-label-row{display:inline-flex;align-items:center;gap:.35rem;min-width:0}.dynamic-view-builder__modal-label{color:#425466;font-size:.875rem;font-weight:600;line-height:1.25}.dynamic-view-builder__join-modal{display:flex;flex-direction:column;gap:.875rem}.dynamic-view-builder__selection-flow{display:flex;flex-direction:column;gap:.75rem;height:100%;min-height:0}.dynamic-view-builder__filter-modal{display:flex;flex-direction:column;gap:.875rem;min-height:min(30rem,100vh - 14rem);height:100%;overflow:hidden}.dynamic-view-builder__filter-step{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0;flex:1 1 auto}.dynamic-view-builder__filter-toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:.875rem;flex-wrap:wrap}.dynamic-view-builder__filter-toolbar>*{min-width:0}.dynamic-view-builder__filter-heading{display:flex;align-items:center;justify-content:space-between;gap:.5rem;min-width:0}.dynamic-view-builder__filter-base-selector,.dynamic-view-builder__filter-domain-intro{min-width:0}.dynamic-view-builder__filter-base-selector{gap:.625rem;padding:.85rem 1rem}.dynamic-view-builder__filter-mode-row{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.dynamic-view-builder__filter-mode-copy{color:#70839a;font-size:.84rem;line-height:1.4}.dynamic-view-builder__filter-mode-selector{display:flex;min-width:0}.dynamic-view-builder__filter-mode-selector :where(.select-button){max-width:100%}.dynamic-view-builder__picklist-shell{flex:1 1 auto;min-height:0;overflow:hidden;display:flex;flex-direction:column}.dynamic-view-builder__picklist-shell :where(sdc-picklist){display:flex;flex:1 1 auto;height:100%;min-height:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist){display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__loading-state){display:flex;flex-direction:column;min-height:0;flex:1 1 auto}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__content){min-height:0;flex:1 1 auto;overflow:auto}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__list){margin:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__search),.dynamic-view-builder__picklist-shell :where(.sdc-picklist__selected),.dynamic-view-builder__picklist-shell :where(.sdc-picklist__footer){flex:0 0 auto}.dynamic-view-builder__filter-config-card{flex:1 1 auto;min-height:0;gap:.75rem;overflow:auto;padding:.85rem 1rem}.dynamic-view-builder__filter-panel{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0}.dynamic-view-builder__filter-context{display:flex;flex-direction:column;gap:.2rem;padding:0 .1rem;min-width:0}.dynamic-view-builder__filter-summary{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.625rem;min-width:0}.dynamic-view-builder__filter-summary-item{display:flex;flex-direction:column;gap:.22rem;padding:.7rem .8rem;border:1px solid #dbe3ec;border-radius:.55rem;background:#f8fafc;min-width:0}.dynamic-view-builder__sort-modal{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0;height:100%;overflow:hidden}.dynamic-view-builder__sort-direction{display:block;width:100%;max-width:18rem;min-width:0;overflow:hidden}.dynamic-view-builder__sort-direction :where(.select-button){width:100%;max-width:100%;overflow:hidden}.dynamic-view-builder__sort-direction :where(.select-button-item){min-width:0}.dynamic-view-builder__sort-modal>.dynamic-view-builder__modal-field{flex:0 0 auto}.dynamic-view-builder__sort-modal>.dynamic-view-builder__modal-picker{flex:1 1 auto;min-height:0}.dynamic-view-builder__sort-modal :where(.select-button--soft){padding:.25rem}.dynamic-view-builder__sort-modal :where(.select-button--soft .select-button-item){min-height:2rem;padding:.4rem .65rem}.dynamic-view-builder__modal-summary{display:flex;flex-direction:column;gap:.25rem;align-self:start}.dynamic-view-builder__modal-summary--filter{gap:.35rem}.dynamic-view-builder__modal-summary--compact{width:fit-content;max-width:100%}.dynamic-view-builder__modal-summary--field{min-width:min(100%,15rem)}.dynamic-view-builder__join-modal-top{display:grid;grid-template-columns:minmax(0,1fr) minmax(12rem,14rem) minmax(0,1fr);gap:.875rem;align-items:stretch}.dynamic-view-builder__join-modal-top>*{height:100%}.dynamic-view-builder__join-modal-top .dynamic-view-builder__modal-summary,.dynamic-view-builder__join-modal-top .dynamic-view-builder__modal-field{align-self:stretch}.dynamic-view-builder__modal-summary-label{color:#70839a;font-size:.73rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__modal-summary-value{color:#243342;font-weight:600;line-height:1.35;word-break:break-word}.dynamic-view-builder__modal-summary-value--path{color:#1f8a52;font-family:Consolas,Courier New,monospace;font-size:.86rem;font-weight:600}.dynamic-view-builder__picker-title{color:#425466;font-weight:700;line-height:1.35}.dynamic-view-builder__picker-title--path{font-family:Consolas,Courier New,monospace;font-size:.85rem;font-weight:600}.dynamic-view-builder__modal-footer{display:flex;justify-content:flex-end;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-footer--between{justify-content:space-between;align-items:center}.dynamic-view-builder__modal-footer-group{display:inline-flex;align-items:center;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-footer-group--start{margin-right:auto}.dynamic-view-builder__filter-config-section{display:flex;flex-direction:column;gap:.625rem;min-width:0}.dynamic-view-builder__filter-config-section--value,.dynamic-view-builder__filter-config-section--domain{padding-top:.25rem;border-top:1px solid #e8edf3}.dynamic-view-builder__filter-optional{display:flex;align-items:flex-end;gap:.35rem;min-height:100%;padding-bottom:.15rem}.dynamic-view-builder__filter-config-section :where(.sdc-checkbox){min-height:34px}.dynamic-view-builder__filter-domain-grid,.dynamic-view-builder__filter-review-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem}.dynamic-view-builder__filter-domain-item,.dynamic-view-builder__filter-review-item{display:flex;flex-direction:column;gap:.25rem;min-width:0;padding:.8rem .9rem;border:1px solid #e5ebf2;border-radius:.6rem;background:#f8fafc}.dynamic-view-builder__filter-domain-hint{color:#70839a;font-size:.82rem;line-height:1.45}.dynamic-view-builder__filter-review-preview{display:flex;flex-direction:column;gap:.35rem;min-width:0;padding-top:.25rem;border-top:1px solid #e8edf3}.dynamic-view-builder__filter-review-code{color:#243342;font-family:Consolas,Courier New,monospace;font-size:.84rem;line-height:1.45;white-space:pre-wrap;word-break:break-word}.dynamic-view-builder__sort-direction-field{gap:.4rem}.dynamic-view-builder__selection-table{display:flex;flex-direction:column;border:1px solid #d7dde5;background:#fff;overflow:hidden;border-radius:.5rem;min-height:0;flex:1 1 auto}.dynamic-view-builder__modal-stage-body>.dynamic-view-builder__selection-table,.dynamic-view-builder__modal-stage-body.dynamic-view-builder__picklist-shell{height:100%}.dynamic-view-builder__selection-table--chooser{min-height:0}.dynamic-view-builder__selection-head{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) 5rem;gap:.75rem;padding:.875rem 1rem;border-bottom:1px solid #e4e8ef;background:#f6f8fb}.dynamic-view-builder__selection-body{flex:1 1 auto;min-height:0;max-height:22rem;overflow:auto}.dynamic-view-builder__selection-table--fluid,.dynamic-view-builder__selection-table--fluid .dynamic-view-builder__selection-body{min-height:0;max-height:none;height:100%}.dynamic-view-builder__selection-row{width:100%;display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) 5rem;gap:.75rem;padding:.875rem 1rem;border:0;border-bottom:1px solid #eef2f7;background:transparent;text-align:left;cursor:pointer;transition:background-color .18s ease,box-shadow .18s ease}.dynamic-view-builder__selection-row:last-child{border-bottom:0}.dynamic-view-builder__selection-row:hover{background:#f9fbff}.dynamic-view-builder__selection-row--selected{background:#eef5ff}.dynamic-view-builder__selection-row:focus-visible{outline:2px solid rgba(27,92,255,.22);outline-offset:-2px}.dynamic-view-builder__selection-col,.dynamic-view-builder__selection-cell{min-width:0;color:#425466;line-height:1.4;word-break:break-word}.dynamic-view-builder__selection-col{font-weight:700}.dynamic-view-builder__selection-cell--meta{color:#70839a}.dynamic-view-builder__selection-path{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:nowrap}.dynamic-view-builder__selection-db{color:#243342;font-weight:700}.dynamic-view-builder__selection-table-label{color:#425466;font-weight:500}.dynamic-view-builder__selection-separator{color:#9aaaba;flex:0 0 auto;margin-inline:.02rem}.dynamic-view-builder__selection-accent{color:#1f8a52;font-weight:700}.dynamic-view-builder__selection-note{display:block;margin-top:.1rem;color:#8da0b4;font-size:.74rem}.dynamic-view-builder__selection-col--select,.dynamic-view-builder__selection-cell--select{display:flex;align-items:center;justify-content:center}.dynamic-view-builder__selection-marker{display:inline-flex;align-items:center;justify-content:center;width:1.2rem;height:1.2rem;border:1px solid #c8d4e0;border-radius:.3rem;background:#fff;color:transparent}.dynamic-view-builder__selection-marker i{font-size:.72rem;line-height:1}.dynamic-view-builder__selection-marker--selected{border-color:#1b5cff;background:#1b5cff;color:#fff}.dynamic-view-builder__selection-empty{padding:1rem;color:#70839a;text-align:center;line-height:1.4}.dynamic-view-builder__modal-picker--filter,.dynamic-view-builder__modal-picker--filter .dynamic-view-builder__selection-table{min-height:100%}.dynamic-view-builder__modal-picker--filter .dynamic-view-builder__selection-body{max-height:none}.dynamic-view-builder__field-modal{display:flex;flex-direction:column;gap:1rem;min-height:0;width:100%;height:100%}.dynamic-view-builder__field-config-shell{gap:.85rem;min-height:0;height:100%}.dynamic-view-builder__field-config-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__field-config-summary{color:#516173;font-size:.8rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__field-selection-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__field-config-list,.dynamic-view-builder__source-config-list{display:flex;flex-direction:column;flex:1 1 auto;gap:.75rem;width:100%;min-height:0;overflow:auto}.dynamic-view-builder__field-config-row{display:grid;grid-template-columns:minmax(13rem,1.1fr) minmax(0,1.9fr);gap:.9rem;align-items:start;width:100%;padding:.85rem .9rem;border:1px solid #dbe3ec;border-radius:.7rem;background:#fff}.dynamic-view-builder__source-config-row{display:grid;grid-template-columns:minmax(13rem,1fr) minmax(0,1.35fr);gap:.9rem;align-items:center;width:100%;padding:.85rem .9rem;border:1px solid #dbe3ec;border-radius:.7rem;background:#fff}.dynamic-view-builder__field-config-main,.dynamic-view-builder__source-config-main{display:flex;flex-direction:column;gap:.45rem;min-width:0}.dynamic-view-builder__field-config-title{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:wrap}.dynamic-view-builder__field-config-function{display:inline-flex;align-items:center;gap:.45rem;flex-wrap:wrap}.dynamic-view-builder__field-config-controls{display:grid;grid-template-columns:minmax(0,1fr) minmax(7rem,8rem) auto auto;gap:.75rem;align-items:end;min-width:0}.dynamic-view-builder__source-config-controls{display:grid;grid-template-columns:minmax(0,1fr);gap:.75rem;align-items:end;min-width:0}.dynamic-view-builder__field-config-controls--function{grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto auto}.dynamic-view-builder__field-form{display:grid;grid-template-columns:minmax(0,1fr) minmax(10rem,11rem);gap:.75rem 1rem;align-items:start}.dynamic-view-builder__field-form--balanced{grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr)}.dynamic-view-builder__field-width{display:flex;flex-direction:column;gap:.35rem;min-width:0}.dynamic-view-builder__between{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.625rem}.dynamic-view-builder__row-chip{display:inline-flex;align-items:center;padding:.14rem .45rem;border-radius:999px;font-size:.74rem;font-weight:600;line-height:1.2}.dynamic-view-builder__row-chip--operator{background:#eef4fb;color:#1b5cff}.dynamic-view-builder__row-chip--value{background:#f4f7fa;color:#5d7084}.dynamic-view-builder__row-chip--optional{background:#f2f7f3;color:#1f8a52}.dynamic-view-builder__row-chip--domain{background:#eef4fb;color:#425466}.dynamic-view-builder__field-drop-indicator{display:inline-flex;align-self:stretch;width:.2rem;min-height:2.2rem;border-radius:999px;background:#1b5cff;box-shadow:0 0 0 3px #1b5cff24;flex:0 0 auto}@media (max-width: 1120px){.dynamic-view-builder__workspace--split{grid-template-columns:1fr;grid-template-areas:\"builder\" \"preview\"}.dynamic-view-builder__workspace--split.dynamic-view-builder__workspace--preview-hidden{justify-items:stretch}.dynamic-view-builder__sections--split{padding-right:0}}@media (max-width: 900px){.dynamic-view-builder__field-form,.dynamic-view-builder__field-form--balanced,.dynamic-view-builder__field-config-toolbar,.dynamic-view-builder__field-config-row,.dynamic-view-builder__source-config-row,.dynamic-view-builder__field-config-controls,.dynamic-view-builder__source-config-controls,.dynamic-view-builder__field-config-controls--function{grid-template-columns:1fr}.dynamic-view-builder__section-row{flex-direction:column}.dynamic-view-builder__section--half,.dynamic-view-builder__section--compact,.dynamic-view-builder__section--fluid{width:100%}.dynamic-view-builder__toolbar,.dynamic-view-builder__section-head,.dynamic-view-builder__row,.dynamic-view-builder__footer,.dynamic-view-builder__modal-footer,.dynamic-view-builder__filter-toolbar,.dynamic-view-builder__field-selection-toolbar{flex-direction:column;align-items:stretch}.dynamic-view-builder__toolbar-actions,.dynamic-view-builder__section-actions,.dynamic-view-builder__row-actions{justify-content:flex-start}.dynamic-view-builder__alias-field{min-inline-size:6rem;max-inline-size:100%}.dynamic-view-builder__modal-grid,.dynamic-view-builder__modal-grid--filter,.dynamic-view-builder__modal-grid--filter-controls,.dynamic-view-builder__filter-modal,.dynamic-view-builder__filter-summary,.dynamic-view-builder__filter-domain-grid,.dynamic-view-builder__filter-review-grid,.dynamic-view-builder__between,.dynamic-view-builder__join-modal-top{grid-template-columns:1fr}.dynamic-view-builder__row{min-inline-size:100%}}:host ::ng-deep .sdc-modal__content{display:flex;flex-direction:column;min-height:0;overflow:hidden}:host ::ng-deep .sdc-modal__content>.dynamic-view-builder__modal-shell{flex:1 1 auto;min-height:0}@media (max-width: 768px){.dynamic-view-builder__selection-head,.dynamic-view-builder__selection-row{grid-template-columns:1fr}.dynamic-view-builder__selection-col--select,.dynamic-view-builder__selection-cell--select{justify-content:flex-start}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: ButtonComponent, selector: "sdc-button", inputs: ["id", "label", "ariaLabel", "disabled", "width", "priority", "size", "type", "icon", "rightIcon", "auxiliary", "caret", "tooltip", "animation", "slide", "styleClass", "badge", "menuOptions", "menuContext", "model"], outputs: ["clicked"] }, { kind: "component", type: CheckboxComponent, selector: "sdc-checkbox", inputs: ["label", "disabled", "commonCheckbox", "labelPosition", "size", "checked"], outputs: ["checkedChange"] }, { kind: "component", type: CodeEditorComponent, selector: "sdc-code-editor", inputs: ["sql", "height", "width", "showCopy", "customHeaderItems", "activeHeaderKey", "readOnly", "language", "schema"], outputs: ["headerSelect", "onCopy", "languageChange", "domainFilterClick"] }, { kind: "component", type: ComboboxComponent, selector: "sdc-combobox", inputs: ["multiple", "appendTo", "zIndex", "options", "overrideChipMessage", "maxSelectedLabels", "showClear", "searchable", "iconSelector", "showIconClass", "infoTooltip", "infoTooltipPosition", "infoTooltipEvent", "infoTooltipAllowHtml"], outputs: ["onSelectedItem", "panelClosed"] }, { kind: "component", type: InfoSignComponent, selector: "sdc-info-sign", inputs: ["label", "labelParams", "tooltip", "tooltipParams", "iconClass", "iconAriaLabel", "tooltipPosition", "tooltipEvent", "inline"] }, { kind: "component", type: ModalComponent, selector: "sdc-modal", inputs: ["footerButtons", "header", "height", "maximizable", "maximize", "resizable", "responsive", "width", "zIndex", "closable", "styleClass", "appendToBody", "visible"], outputs: ["hidden", "visibleChange"] }, { kind: "component", type: PicklistComponent, selector: "sdc-picklist", inputs: ["items", "selectedIds", "idKey", "titleKey", "subtitleKey", "iconClass", "selectionIconClass", "placeholder", "emptyTitle", "emptyText", "emptyIconClass", "resultsCounterSingularLabel", "resultsCounterPluralLabel", "filterFields", "first", "rows", "rowsPerPageOptions", "maxVisibleSelectedItems", "showPaginator", "showRowsPerPageOptions", "showSelectionCounter", "showResultsCounter", "showItemIcon", "autoResize", "autoResizeMinRows", "autoResizeMaxRows", "autoResizeItemHeight", "autoResizeViewportOffset", "maxTitleLength", "maxSubtitleLength", "autofocusSearch", "loading"], outputs: ["pageChange", "selectedIdsChange"] }, { kind: "component", type: SelectButtonComponent, selector: "sdc-select-button", inputs: ["items", "multiple", "appearance", "compareWith"], outputs: ["itemSelected", "itemClicked"] }, { kind: "component", type: TextareaComponent, selector: "sdc-textarea", inputs: ["infoTooltip", "infoTooltipPosition", "infoTooltipEvent", "rows", "autoResize"] }, { kind: "component", type: TextboxComponent, selector: "sdc-textbox", inputs: ["infoTooltip", "infoTooltipPosition", "infoTooltipEvent"] }, { kind: "component", type: TimelineComponent, selector: "sdc-timeline", inputs: ["items", "activeIndex", "orientation", "interactive", "responsive", "showDescriptions", "ariaLabel", "ariaLabelParams"], outputs: ["stepSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
2770
2307
|
}
|
|
2771
2308
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VisualSqlEditorComponent, decorators: [{
|
|
2772
2309
|
type: Component,
|
|
2773
|
-
args: [{ selector: "sdc-visual-sql-editor", standalone: true, imports: [
|
|
2310
|
+
args: [{ selector: "sdc-visual-sql-editor", standalone: true, providers: [VisualSqlEditorFlowService, VisualSqlEditorStateService], imports: [
|
|
2774
2311
|
FormsModule,
|
|
2775
2312
|
TranslateModule,
|
|
2776
2313
|
ButtonComponent,
|
|
@@ -2784,7 +2321,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
2784
2321
|
TableComponent,
|
|
2785
2322
|
TextareaComponent,
|
|
2786
2323
|
TextboxComponent,
|
|
2787
|
-
TimelineComponent
|
|
2324
|
+
TimelineComponent,
|
|
2325
|
+
VisualSqlEditorSourceModalComponent,
|
|
2326
|
+
VisualSqlEditorJoinModalComponent,
|
|
2327
|
+
VisualSqlEditorSortModalComponent,
|
|
2328
|
+
VisualSqlEditorFieldModalComponent,
|
|
2329
|
+
VisualSqlEditorFilterModalComponent,
|
|
2788
2330
|
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"dynamic-view-builder\" [attr.aria-busy]=\"loading\">\n <div class=\"dynamic-view-builder__toolbar\">\n <div class=\"dynamic-view-builder__toolbar-copy\">\n <div class=\"dynamic-view-builder__title\">\n {{ config.metadata.title }}\n </div>\n <div class=\"dynamic-view-builder__subtitle\">\n {{ config.metadata.description }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__toolbar-actions\">\n <span class=\"dynamic-view-builder__toolbar-label\">\n {{ (config.translationPrefix + '.fields.layoutMode') | translate }}\n </span>\n <sdc-select-button\n [items]=\"layoutModeItems\"\n [ngModel]=\"selectedLayoutModeItems\"\n (ngModelChange)=\"onLayoutModeChange($event)\"\n ></sdc-select-button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__preview-toggle\"\n (click)=\"togglePreview()\"\n [attr.aria-pressed]=\"previewVisible\"\n [title]=\"previewToggleLabel\"\n [attr.aria-label]=\"previewToggleLabel\"\n >\n <i\n [class]=\"previewVisible ? 'fas fa-eye-slash' : 'fas fa-eye'\"\n aria-hidden=\"true\"\n ></i>\n {{ previewToggleLabel }}\n </button>\n </div>\n </div>\n\n @if (selectionModalVisible) {\n <sdc-modal\n [visible]=\"selectionModalVisible\"\n (visibleChange)=\"$event ? (selectionModalVisible = true) : closeSelectionModal()\"\n [header]=\"selectionModalTitle\"\n [width]=\"modalDimensions.selection.width\"\n [height]=\"modalDimensions.selection.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n @if (selectionModalMode === 'tables') {\n <div class=\"dynamic-view-builder__modal-inline-surface\">\n <sdc-textbox\n [label]=\"modalSearchLabel\"\n [placeholder]=\"modalSearchPlaceholder\"\n [ngModel]=\"selectionModalSearch\"\n (ngModelChange)=\"selectionModalSearch = $event\"\n width=\"100%\"\n ></sdc-textbox>\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-stage-body\"\n >\n <div\n class=\"dynamic-view-builder__selection-table\n dynamic-view-builder__selection-table--chooser\n dynamic-view-builder__selection-table--fluid\"\n >\n <div class=\"dynamic-view-builder__selection-head\">\n <div class=\"dynamic-view-builder__selection-col\">\n {{ modalNameLabel }}\n </div>\n <div class=\"dynamic-view-builder__selection-col\">\n {{ modalTypeLabel }}\n </div>\n <div class=\"dynamic-view-builder__selection-col dynamic-view-builder__selection-col--select\">\n {{ modalSelectLabel }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__selection-body\">\n @for (row of selectionModalRows; track trackById($index, row)) {\n <div\n class=\"dynamic-view-builder__selection-row\"\n [class.dynamic-view-builder__selection-row--selected]=\"row.selected\"\n [attr.role]=\"'button'\"\n [attr.tabindex]=\"row.disabled ? -1 : 0\"\n [attr.aria-pressed]=\"row.selected\"\n [attr.aria-disabled]=\"row.disabled\"\n (click)=\"toggleSelectionModalRow(row.id)\"\n (keydown)=\"onSelectableRowKeydown($event)\"\n >\n <div class=\"dynamic-view-builder__selection-cell\">\n @if (row.tableLabel) {\n <span class=\"dynamic-view-builder__selection-path\">\n @if (row.pathType === 'table') {\n @if (row.dbLabel) {\n <span class=\"dynamic-view-builder__selection-db\">{{ row.dbLabel }}</span>\n }\n @if (row.dbLabel) {\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n }\n <span class=\"dynamic-view-builder__selection-table-label\">{{ row.tableLabel }}</span>\n } @else {\n <span class=\"dynamic-view-builder__selection-table-label\">{{ row.tableLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ row.name }}</span>\n }\n </span>\n } @else {\n {{ row.name }}\n }\n </div>\n <div class=\"dynamic-view-builder__selection-cell dynamic-view-builder__selection-cell--meta\">\n <span>{{ row.meta }}</span>\n @if (row.note) {\n <span class=\"dynamic-view-builder__selection-note\">\n {{ row.note }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__selection-cell dynamic-view-builder__selection-cell--select\">\n <span\n class=\"dynamic-view-builder__selection-marker\"\n [class.dynamic-view-builder__selection-marker--selected]=\"row.selected\"\n aria-hidden=\"true\"\n >\n <i class=\"fas fa-check\"></i>\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"selectionModalPicklistItems\"\n [selectedIds]=\"selectionModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSelectionModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSelectionModal()\"\n (keydown.enter)=\"closeSelectionModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.confirmSelection') | translate\"\n (click)=\"confirmSelectionModal()\"\n (keydown.enter)=\"confirmSelectionModal()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (sourceModalVisible) {\n <sdc-modal\n [visible]=\"sourceModalVisible\"\n (visibleChange)=\"$event ? (sourceModalVisible = true) : closeSourceModal()\"\n [header]=\"sourceModalTitle\"\n [width]=\"modalDimensions.source.width\"\n [height]=\"modalDimensions.source.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__field-modal\">\n <sdc-timeline\n [items]=\"sourceModalTimelineItems\"\n [activeIndex]=\"sourceModalConfigurationStepActive ? 1 : 0\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"sourceModalTimelineAriaLabel\"\n (stepSelect)=\"onSourceModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (sourceModalSelectionStepActive) {\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"sourceModalPicklistItems\"\n [selectedIds]=\"sourceModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSourceModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__field-config-shell\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-list-shell\"\n >\n <div class=\"dynamic-view-builder__source-config-list\">\n @for (item of sourceModalConfiguredItems; track trackById($index, item)) {\n <div class=\"dynamic-view-builder__source-config-row\">\n <div class=\"dynamic-view-builder__source-config-main\">\n <div class=\"dynamic-view-builder__field-config-title\">\n <span class=\"dynamic-view-builder__selection-table-label\">{{ item.dbLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ item.tableLabel }}</span>\n </div>\n </div>\n <div class=\"dynamic-view-builder__source-config-controls\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"item.alias\"\n (ngModelChange)=\"onSourceModalAliasChange(item.table, $event)\"\n width=\"100%\"\n [maxlength]=\"24\"\n ></sdc-textbox>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSourceModal()\"\n (keydown.enter)=\"closeSourceModal()\"\n ></sdc-button>\n @if (sourceModalSelectionStepActive && sourceModalCanProceed) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.nextStep') | translate\"\n (click)=\"advanceSourceModalStep()\"\n (keydown.enter)=\"advanceSourceModalStep()\"\n ></sdc-button>\n }\n @if (sourceModalConfigurationStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!sourceModalCanProceed\"\n (click)=\"saveSourceModal()\"\n (keydown.enter)=\"saveSourceModal()\"\n ></sdc-button>\n }\n </div>\n </sdc-modal>\n }\n\n @if (joinModalVisible) {\n <sdc-modal\n [visible]=\"joinModalVisible\"\n (visibleChange)=\"$event ? (joinModalVisible = true) : closeJoinModal()\"\n [header]=\"(config.translationPrefix + '.cards.joins.title') | translate\"\n [width]=\"modalDimensions.join.width\"\n [height]=\"modalDimensions.join.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__join-modal\">\n <div class=\"dynamic-view-builder__join-modal-top\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-card\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.left') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >{{ joinSourceSummary }}</div>\n </div>\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--compact\n dynamic-view-builder__modal-card\"\n >\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.operator'\"\n [ngModel]=\"joinDraft.operator\"\n (ngModelChange)=\"joinDraft.operator = $event\"\n [options]=\"joinOperatorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n </div>\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-card\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.right') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >{{ joinTargetSummary }}</div>\n </div>\n </div>\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--fit\">\n <div\n class=\"dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__modal-card dynamic-view-builder__picklist-shell\"\n >\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.left') | translate }}\n </div>\n <sdc-picklist\n [items]=\"joinSourcePicklistItems\"\n [selectedIds]=\"joinSourceSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onJoinSourceSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n <div\n class=\"dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__modal-card dynamic-view-builder__picklist-shell\"\n >\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.right') | translate }}\n </div>\n <sdc-picklist\n [items]=\"joinTargetPicklistItems\"\n [selectedIds]=\"joinTargetSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onJoinTargetSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeJoinModal()\"\n (keydown.enter)=\"closeJoinModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveJoin\"\n (click)=\"saveJoin()\"\n (keydown.enter)=\"saveJoin()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (sortModalVisible) {\n <sdc-modal\n [visible]=\"sortModalVisible\"\n (visibleChange)=\"$event ? (sortModalVisible = true) : closeSortModal()\"\n [header]=\"sortModalTitle\"\n [width]=\"modalDimensions.sort.width\"\n [height]=\"modalDimensions.sort.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__sort-modal\">\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--full\n dynamic-view-builder__sort-direction-field\"\n >\n <div class=\"dynamic-view-builder__modal-label\">\n {{ (config.translationPrefix + '.fields.direction') | translate }}\n </div>\n <sdc-select-button\n class=\"dynamic-view-builder__sort-direction\"\n [items]=\"sortDirectionItems\"\n appearance=\"soft\"\n [ngModel]=\"selectedSortDirectionItems\"\n (ngModelChange)=\"onSortDirectionChange($event)\"\n ></sdc-select-button>\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__selection-flow dynamic-view-builder__picklist-shell\n dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"sortPicklistItems\"\n [selectedIds]=\"sortSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSortSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSortModal()\"\n (keydown.enter)=\"closeSortModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveSort\"\n (click)=\"saveSort()\"\n (keydown.enter)=\"saveSort()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (filterModalVisible) {\n <sdc-modal\n [visible]=\"filterModalVisible\"\n (visibleChange)=\"$event ? (filterModalVisible = true) : closeFilterModal()\"\n [header]=\"filterModalTitle\"\n [width]=\"modalDimensions.filter.width\"\n [height]=\"modalDimensions.filter.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__filter-modal\">\n <sdc-timeline\n [items]=\"filterModalTimelineItems\"\n [activeIndex]=\"filterModalReviewStepActive ? 2 : (filterModalConfigurationStepActive ? 1 : 0)\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"filterModalTimelineAriaLabel\"\n (stepSelect)=\"onFilterModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (filterModalSelectionStepActive) {\n <div class=\"dynamic-view-builder__filter-step\">\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-base-selector\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.modals.filter.steps.select.title') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.filters.tooltips.mode'\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-mode-row\">\n <div class=\"dynamic-view-builder__filter-mode-copy\">\n {{ (config.translationPrefix + '.modals.filter.title') | translate }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__filter-mode-selector\">\n <sdc-select-button\n [items]=\"filterModeItems\"\n appearance=\"soft\"\n [ngModel]=\"selectedFilterModeItems\"\n (ngModelChange)=\"onFilterModeChange($event[0]?.value || 'condition')\"\n ></sdc-select-button>\n </div>\n </div>\n @if (filterModalMode === 'condition') {\n <div\n class=\"dynamic-view-builder__modal-picker\n dynamic-view-builder__modal-picker--filter\n dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__selection-flow\n dynamic-view-builder__modal-stage-body\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell\"\n >\n <sdc-picklist\n [items]=\"filterModalPicklistItems\"\n [selectedIds]=\"filterModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [autoResize]=\"false\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onFilterModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-domain-intro\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.filters.domainLabel') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"filterDomainExpressionTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-grid\">\n <div class=\"dynamic-view-builder__filter-domain-item\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.domainExpression') | translate }}\n </div>\n <div class=\"dynamic-view-builder__modal-summary-value\">\n {{ filterDomainExpressionTooltip }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-item\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.connector') | translate }}\n </div>\n <div class=\"dynamic-view-builder__modal-summary-value\">\n {{ filterConnectorTooltip }}\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n } @else {\n @if (filterModalConfigurationStepActive) {\n <div class=\"dynamic-view-builder__filter-step\">\n <div class=\"dynamic-view-builder__filter-toolbar\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-summary--filter\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.modals.filter.steps.configure.title') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >\n {{ filterConfigurationSummaryLabel }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"goToFilterModalStep('select')\"\n >\n {{ filterBackToSelectionLabel }}\n </button>\n </div>\n @if (filterModalMode === 'condition') {\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-config-section\">\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.modals.filter.steps.configure.title') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.filters.tooltips.configure'\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--filter-controls\">\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.connector'\"\n [ngModel]=\"filterDraft.connector\"\n (ngModelChange)=\"filterDraft.connector = $event\"\n [options]=\"filterConnectorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterConnectorDisabled\"\n [infoTooltip]=\"filterConnectorTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.operator'\"\n [ngModel]=\"filterDraft.operator\"\n (ngModelChange)=\"filterDraft.operator = $event; onFilterOperatorChange()\"\n [options]=\"filterOperatorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n [disabled]=\"!filterDraft.column\"\n [infoTooltip]=\"filterOperatorTooltip\"\n ></sdc-combobox>\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.valueType'\"\n [ngModel]=\"filterDraft.valueType\"\n (ngModelChange)=\"filterDraft.valueType = $event; onFilterValueTypeChange()\"\n [options]=\"valueTypeOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterValueTypeDisabled\"\n [infoTooltip]=\"filterValueTypeTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <div class=\"dynamic-view-builder__filter-optional\">\n <sdc-checkbox\n [label]=\"config.translationPrefix + '.states.optional'\"\n [ngModel]=\"filterDraft.optional\"\n (ngModelChange)=\"filterDraft.optional = $event\"\n ></sdc-checkbox>\n <sdc-info-sign\n [tooltip]=\"filterOptionalTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n </div>\n </div>\n <div\n class=\"dynamic-view-builder__filter-config-section\n dynamic-view-builder__filter-config-section--value\"\n >\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--single\">\n @if (showFilterBooleanCombobox) {\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.value'\"\n [ngModel]=\"filterDraft.value\"\n (ngModelChange)=\"filterDraft.value = $event\"\n [options]=\"booleanValueOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n }\n @if (showFilterValueTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.value'\"\n [ngModel]=\"filterDraft.value\"\n (ngModelChange)=\"filterDraft.value = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n @if (showFilterValuesTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.values'\"\n [ngModel]=\"filterDraft.valuesText\"\n (ngModelChange)=\"filterDraft.valuesText = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n @if (showFilterBetweenInputs) {\n <div class=\"dynamic-view-builder__between dynamic-view-builder__modal-grid-column-full\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.valueStart'\"\n [ngModel]=\"filterDraft.betweenStart\"\n (ngModelChange)=\"filterDraft.betweenStart = $event\"\n width=\"100%\"\n ></sdc-textbox>\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.valueEnd'\"\n [ngModel]=\"filterDraft.betweenEnd\"\n (ngModelChange)=\"filterDraft.betweenEnd = $event\"\n width=\"100%\"\n ></sdc-textbox>\n </div>\n }\n @if (showFilterParameterTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.parameterName'\"\n [ngModel]=\"filterDraft.parameterName\"\n (ngModelChange)=\"filterDraft.parameterName = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-config-section\">\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--filter-controls\">\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.connector'\"\n [ngModel]=\"filterDraft.connector\"\n (ngModelChange)=\"filterDraft.connector = $event\"\n [options]=\"filterConnectorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterConnectorDisabled\"\n [infoTooltip]=\"filterConnectorTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <div class=\"dynamic-view-builder__filter-optional\">\n <sdc-checkbox\n [label]=\"config.translationPrefix + '.states.optional'\"\n [ngModel]=\"filterDraft.optional\"\n (ngModelChange)=\"filterDraft.optional = $event\"\n ></sdc-checkbox>\n <sdc-info-sign\n [tooltip]=\"filterOptionalTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n </div>\n </div>\n <div\n class=\"dynamic-view-builder__filter-config-section\n dynamic-view-builder__filter-config-section--domain\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.domainExpression') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"filterDomainExpressionTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-hint\">\n {{ filterDomainExpressionTooltip }}\n </div>\n <sdc-textarea\n [label]=\"''\"\n [ngModel]=\"filterDraft.domainExpression\"\n (ngModelChange)=\"filterDraft.domainExpression = $event\"\n width=\"100%\"\n [rows]=\"10\"\n ></sdc-textarea>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"dynamic-view-builder__filter-step\">\n <div class=\"dynamic-view-builder__filter-toolbar\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-summary--filter\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.modals.filter.steps.review.title') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >\n {{ filterConfigurationSummaryLabel }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"goToFilterModalStep('configure')\"\n >\n {{ filterBackToConfigurationLabel }}\n </button>\n </div>\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-review-grid\">\n @for (item of filterReviewItems; track trackById($index, item)) {\n <div\n class=\"dynamic-view-builder__filter-review-item\"\n >\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ item.label }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\"\n [class.dynamic-view-builder__modal-summary-value--path]=\"item.emphasize === 'path'\"\n [class.dynamic-view-builder__filter-review-code]=\"item.emphasize === 'code'\"\n >\n {{ item.value }}\n </div>\n </div>\n }\n </div>\n <div class=\"dynamic-view-builder__filter-review-preview\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.sqlPreview') | translate }}\n </div>\n <sdc-textarea\n [label]=\"''\"\n [ngModel]=\"filterReviewPreviewLabel\"\n width=\"100%\"\n [rows]=\"6\"\n [disabled]=\"true\"\n ></sdc-textarea>\n </div>\n </div>\n </div>\n }\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeFilterModal()\"\n (keydown.enter)=\"closeFilterModal()\"\n ></sdc-button>\n @if (filterModalSelectionStepActive) {\n <sdc-button\n [label]=\"filterModalConfigureActionLabel\"\n [disabled]=\"!filterModalCanProceed\"\n (click)=\"advanceFilterModalStep()\"\n (keydown.enter)=\"advanceFilterModalStep()\"\n ></sdc-button>\n }\n @if (filterModalConfigurationStepActive) {\n <sdc-button\n [label]=\"filterModalReviewActionLabel\"\n [disabled]=\"!filterModalCanReview\"\n (click)=\"advanceFilterModalStep()\"\n (keydown.enter)=\"advanceFilterModalStep()\"\n ></sdc-button>\n }\n @if (filterModalReviewStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveFilter\"\n (click)=\"saveFilter()\"\n (keydown.enter)=\"saveFilter()\"\n ></sdc-button>\n }\n </div>\n </sdc-modal>\n }\n\n @if (fieldModalVisible) {\n <sdc-modal\n [visible]=\"fieldModalVisible\"\n (visibleChange)=\"$event ? (fieldModalVisible = true) : closeFieldModal()\"\n [header]=\"fieldModalTitle\"\n [width]=\"modalDimensions.field.width\"\n [height]=\"modalDimensions.field.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__field-modal\">\n <sdc-timeline\n [items]=\"fieldModalTimelineItems\"\n [activeIndex]=\"fieldModalConfigurationStepActive ? 1 : 0\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"fieldModalTimelineAriaLabel\"\n (stepSelect)=\"onFieldModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (fieldModalSelectionStepActive) {\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"fieldModalPicklistItems\"\n [selectedIds]=\"fieldModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [autoResize]=\"false\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onFieldModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__field-config-shell\"\n >\n <div class=\"dynamic-view-builder__field-config-toolbar\">\n <div class=\"dynamic-view-builder__field-config-summary\">\n {{ fieldModalConfiguredItems.length }}\n {{ (config.translationPrefix + '.cards.fields.title') | translate }}\n </div>\n @if (fieldModalHasSelectableColumns) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--primary\"\n (click)=\"addAnotherFieldFromModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-list-shell\"\n >\n <div class=\"dynamic-view-builder__field-config-list\">\n @for (item of fieldModalConfiguredItems; track trackById($index, item)) {\n <div class=\"dynamic-view-builder__field-config-row\">\n <div class=\"dynamic-view-builder__field-config-main\">\n <div class=\"dynamic-view-builder__field-config-title\">\n <span class=\"dynamic-view-builder__selection-table-label\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ item.fieldLabel }}</span>\n </div>\n @if (item.functionName && !isFieldFunctionEditing(item.column)) {\n <div class=\"dynamic-view-builder__field-config-function\">\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n @if (item.functionAlias) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.functionAlias }}\n </span>\n }\n </div>\n }\n </div>\n @if (!isFieldFunctionEditing(item.column)) {\n <div class=\"dynamic-view-builder__field-config-controls\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"item.alias\"\n (ngModelChange)=\"onFieldModalAliasChange(item.column, $event)\"\n width=\"100%\"\n [maxlength]=\"24\"\n ></sdc-textbox>\n <div class=\"dynamic-view-builder__field-width\">\n <div class=\"dynamic-view-builder__modal-label-row\">\n <span class=\"dynamic-view-builder__modal-label\">\n {{ (config.translationPrefix + '.fields.width') | translate }}\n </span>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.messages.fieldWidthInfo'\"\n ></sdc-info-sign>\n </div>\n <sdc-textbox\n [label]=\"''\"\n [ngModel]=\"item.width\"\n (ngModelChange)=\"onFieldModalWidthChange(item.column, $event)\"\n width=\"100%\"\n [maxlength]=\"12\"\n placeholder=\"160\"\n ></sdc-textbox>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"startFieldFunctionEdit(item.column)\"\n >\n {{ item.functionName\n ? ((config.translationPrefix + '.actions.configureField') | translate)\n : ((config.translationPrefix + '.fields.functionName') | translate) }}\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--danger\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeFieldModalDraft(item.column)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__field-config-controls\n dynamic-view-builder__field-config-controls--function\"\n >\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.functionName'\"\n [ngModel]=\"fieldFunctionDraft.functionName\"\n (ngModelChange)=\"onFieldFunctionDraftNameChange($event)\"\n [options]=\"fieldModalFunctionOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"fieldFunctionDraft.functionAlias\"\n (ngModelChange)=\"fieldFunctionDraft.functionAlias = $event\"\n width=\"100%\"\n [maxlength]=\"24\"\n [disabled]=\"!fieldFunctionDraft.functionName\"\n ></sdc-textbox>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--danger\"\n [title]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n (click)=\"cancelFieldFunctionEdit()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--active\"\n [title]=\"(config.translationPrefix + '.actions.save') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.save') | translate\"\n (click)=\"saveFieldFunctionEdit()\"\n >\n <i class=\"fas fa-check\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer dynamic-view-builder__modal-footer--between\">\n <div class=\"dynamic-view-builder__modal-footer-group dynamic-view-builder__modal-footer-group--start\">\n @if (fieldModalSelectionStepActive && fieldModalCanSelectAll) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--primary\"\n (click)=\"selectAllFieldModalColumns()\"\n >\n {{ (config.translationPrefix + '.actions.selectAllColumns') | translate }}\n </button>\n }\n </div>\n <div class=\"dynamic-view-builder__modal-footer-group\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeFieldModal()\"\n (keydown.enter)=\"closeFieldModal()\"\n ></sdc-button>\n @if (fieldModalSelectionStepActive && fieldModalCanProceed) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.nextStep') | translate\"\n (click)=\"advanceFieldModalStep()\"\n (keydown.enter)=\"advanceFieldModalStep()\"\n ></sdc-button>\n }\n @if (fieldModalConfigurationStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveFieldModal\"\n (click)=\"saveField()\"\n (keydown.enter)=\"saveField()\"\n ></sdc-button>\n }\n </div>\n </div>\n </sdc-modal>\n }\n\n <div\n class=\"dynamic-view-builder__workspace\"\n [class.dynamic-view-builder__workspace--stacked]=\"layoutMode === 'stacked'\"\n [class.dynamic-view-builder__workspace--split]=\"layoutMode === 'split'\"\n [class.dynamic-view-builder__workspace--preview-hidden]=\"!previewVisible\"\n >\n <div class=\"dynamic-view-builder__builder-area\">\n <div\n #sectionsContainer\n class=\"dynamic-view-builder__sections\"\n [class.dynamic-view-builder__sections--stacked]=\"layoutMode === 'stacked'\"\n [class.dynamic-view-builder__sections--split]=\"layoutMode === 'split'\"\n >\n <section\n #builderSection\n data-section-id=\"tables\"\n class=\"dynamic-view-builder__section\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.sources.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n (click)=\"openSourceModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canOpenSourceConfiguration\"\n [title]=\"(config.translationPrefix + '.actions.configureAliases') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.configureAliases') | translate\"\n (click)=\"openSourceConfigurationModal()\"\n >\n <i class=\"fas fa-cog\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sourceItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearSources()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!sourceItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n (click)=\"openSourceModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectTables') | translate }}\n </button>\n }\n @if (sourceItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (source of sourceItems; track trackById(i, source); let i = $index) {\n <div\n class=\"dynamic-view-builder__row dynamic-view-builder__row--source\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-table-group\">\n <span class=\"dynamic-view-builder__row-db\">{{ source.dbLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-table\">\n {{ source.tableLabel }}\n </span>\n </span>\n @if (source.alias) {\n <span class=\"dynamic-view-builder__row-meta\">\n Alias {{ source.alias }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeSource(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n <div class=\"dynamic-view-builder__section-row\">\n <section\n #builderSection\n data-section-id=\"joins\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--fluid\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.joins.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canConfigureJoins\"\n [title]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n (click)=\"openJoinModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !joinItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearJoins()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!canConfigureJoins) {\n <div class=\"dynamic-view-builder__info-row\">\n {{ (config.translationPrefix + '.messages.joinRequiresTwoTables') | translate }}\n </div>\n }\n @if (canConfigureJoins && !joinItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n (click)=\"openJoinModal()\"\n >\n {{ (config.translationPrefix + '.actions.addJoin') | translate }}\n </button>\n }\n @if (joinItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of joinItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.sourceTable }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.sourceField }}</span>\n </span>\n <span class=\"dynamic-view-builder__join-operator\">{{ item.operator }}</span>\n <span class=\"dynamic-view-builder__join-arrow\" aria-hidden=\"true\">\n <i class=\"fas fa-long-arrow-alt-right\"></i>\n </span>\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.targetTable }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.targetField }}</span>\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openJoinModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeJoin(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n <section\n #builderSection\n data-section-id=\"groupBy\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--compact\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-heading\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.groupBy.title') | translate }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !groupBySelectableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n (click)=\"openSelectionModal('groupBy')\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !groupByItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearGroupBy()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!groupByItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n (click)=\"openSelectionModal('groupBy')\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n @if (groupByItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of groupByItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeGroupBy(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n </div>\n\n <section\n #builderSection\n data-section-id=\"fields\"\n class=\"dynamic-view-builder__section\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-heading\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.fields.title') | translate }}\n </div>\n <sdc-info-sign\n class=\"dynamic-view-builder__hint\"\n [tooltip]=\"'Voc\u00EA pode ordenar a sequ\u00EAncia dos campos arrastando e soltando.'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !fieldSelectableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n (click)=\"openFieldModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canOpenFieldConfiguration\"\n [title]=\"(config.translationPrefix + '.actions.configureField') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.configureField') | translate\"\n (click)=\"openFieldConfigurationModal()\"\n >\n <i class=\"fas fa-cog\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !fieldItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearFields()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!fieldItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n (click)=\"openFieldModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n @if (fieldItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of fieldItems; track trackById(i, item); let i = $index) {\n @if (isFieldDropIndicatorVisible(i)) {\n <div\n class=\"dynamic-view-builder__field-drop-indicator\"\n aria-hidden=\"true\"\n ></div>\n }\n <div\n class=\"dynamic-view-builder__row dynamic-view-builder__row--draggable\"\n [class.dynamic-view-builder__row--drag-origin]=\"draggingFieldIndex === item.sourceIndex\"\n [draggable]=\"!isReadonly\"\n (dragstart)=\"onFieldDragStart(item.sourceIndex)\"\n (dragover)=\"onFieldDragOver($event, i)\"\n (drop)=\"onFieldDrop()\"\n (dragend)=\"onFieldDragEnd()\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-order\">{{ item.orderLabel }}</span>\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n @if (item.alias) {\n <span class=\"dynamic-view-builder__row-meta\">\n Alias {{ item.alias }}\n </span>\n }\n @if (item.width) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.width }}\n </span>\n }\n @if (item.functionName) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n }\n @if (item.functionAlias) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.functionAlias }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeField(item.sourceIndex)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n @if (isFieldDropIndicatorAtEndVisible()) {\n <div\n class=\"dynamic-view-builder__field-drop-indicator\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n </section>\n\n <div class=\"dynamic-view-builder__section-row\">\n <section\n #builderSection\n data-section-id=\"sorting\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--compact\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.sorting.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sortSelectableItems.length\"\n [title]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n (click)=\"openSortModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sortItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearSorting()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!sortItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n (click)=\"openSortModal()\"\n >\n {{ (config.translationPrefix + '.actions.addSort') | translate }}\n </button>\n }\n @if (sortItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of sortItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n @if (item.functionName) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n }\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.direction }}\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openSortModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeSort(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n <section\n #builderSection\n data-section-id=\"filters\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--fluid\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.filters.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !availableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n (click)=\"openFilterModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !filterItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearFilters()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!filterItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n (click)=\"openFilterModal()\"\n >\n {{ (config.translationPrefix + '.actions.addFilter') | translate }}\n </button>\n }\n @if (filterItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of filterItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n @if (!item.isDomain) {\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n <span\n class=\"dynamic-view-builder__row-chip\n dynamic-view-builder__row-chip--operator\"\n >{{ item.operatorLabel }}</span>\n } @else {\n <span\n class=\"dynamic-view-builder__row-chip\n dynamic-view-builder__row-chip--domain\"\n >{{ item.tableLabel }}</span>\n }\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--value\">\n {{ item.subtitle }}\n </span>\n @if (item.optional) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--optional\">\n {{ (config.translationPrefix + '.states.optional') | translate }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openFilterModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeFilter(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n </div>\n\n @for (arrow of flowArrows; track trackByArrow($index, arrow)) {\n <div\n class=\"dynamic-view-builder__flow-arrow\"\n [class.dynamic-view-builder__flow-arrow--right]=\"arrow.direction === 'right'\"\n [class.dynamic-view-builder__flow-arrow--down]=\"arrow.direction === 'down'\"\n [style.left.px]=\"arrow.left\"\n [style.top.px]=\"arrow.top\"\n aria-hidden=\"true\"\n >\n <i\n [class]=\"arrow.direction === 'right'\n ? 'fas fa-angle-double-right'\n : 'fas fa-angle-double-down'\"\n ></i>\n </div>\n }\n </div>\n </div>\n\n @if (previewVisible) {\n <aside class=\"dynamic-view-builder__preview-area\">\n <div\n class=\"dynamic-view-builder__preview\"\n [style.height]=\"sqlPreviewPanelHeight\"\n >\n <div class=\"dynamic-view-builder__preview-header\">\n <div class=\"dynamic-view-builder__preview-title\">SQL Preview</div>\n <div class=\"dynamic-view-builder__preview-subtitle\">\n Consulta gerada automaticamente a partir da configuracao atual.\n </div>\n </div>\n <div class=\"dynamic-view-builder__preview-body\">\n <sdc-code-editor\n [sql]=\"sqlPreview\"\n language=\"sql\"\n [readOnly]=\"true\"\n [showCopy]=\"true\"\n [height]=\"sqlPreviewHeight\"\n ></sdc-code-editor>\n </div>\n </div>\n </aside>\n }\n </div>\n</div>\n", styles: [":host{display:block}::ng-deep .sdc-loading-state{overflow:auto!important}.dynamic-view-builder{display:flex;flex-direction:column;gap:.75rem;color:#243342}.dynamic-view-builder__toolbar{display:flex;justify-content:space-between;align-items:center;gap:1rem;padding:.25rem 0}.dynamic-view-builder__toolbar-copy{min-width:0}.dynamic-view-builder__title{font-size:1rem;font-weight:700;line-height:1.2;color:#243342}.dynamic-view-builder__subtitle{margin-top:.2rem;color:#70839a;font-size:.875rem;line-height:1.35}.dynamic-view-builder__toolbar-actions{display:flex;align-items:center;gap:.625rem;flex-shrink:0;flex-wrap:wrap}.dynamic-view-builder__toolbar-label{color:#70839a;font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__workspace{display:grid;gap:.875rem;min-width:0}.dynamic-view-builder__workspace--preview-hidden,.dynamic-view-builder__workspace--split.dynamic-view-builder__workspace--preview-hidden{grid-template-columns:1fr;grid-template-areas:\"builder\"}.dynamic-view-builder__workspace--stacked{grid-template-columns:1fr;grid-template-areas:\"preview\" \"builder\"}.dynamic-view-builder__workspace--split{grid-template-columns:minmax(0,62fr) minmax(20rem,38fr);grid-template-areas:\"builder preview\";align-items:start}.dynamic-view-builder__builder-area{grid-area:builder;display:flex;flex-direction:column;gap:.75rem;min-width:0}.dynamic-view-builder__sections{display:flex;flex-direction:column;gap:.5rem;min-width:0;position:relative}.dynamic-view-builder__section{display:flex;flex-direction:column;gap:.4rem;min-width:0;padding:.55rem .65rem;border:1px solid #dbe3ec;border-radius:.5rem;background:#fff;min-inline-size:0;max-inline-size:100%;position:relative;width:100%}.dynamic-view-builder__section-row{display:flex;flex-wrap:wrap;align-items:stretch;gap:.5rem;min-width:0}.dynamic-view-builder__section-row>.dynamic-view-builder__section{align-self:stretch}.dynamic-view-builder__section--half{flex:1 1 18rem;width:auto}.dynamic-view-builder__section--compact{flex:0 0 clamp(18rem,30%,22rem);width:auto}.dynamic-view-builder__section--fluid{flex:1 1 26rem;min-inline-size:min(100%,26rem);width:auto}.dynamic-view-builder__flow-arrow{position:absolute;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;border:1px solid #d9e3ed;border-radius:999px;background:#fff;color:#68809a;pointer-events:none;z-index:2;transform:translate(-50%,-50%)}.dynamic-view-builder__flow-arrow i{font-size:.74rem;line-height:1}.dynamic-view-builder__section-head{display:flex;justify-content:space-between;align-items:flex-start;gap:.75rem}.dynamic-view-builder__section-heading{display:inline-flex;align-items:center;gap:.4rem;min-width:0}.dynamic-view-builder__section-label{min-width:0;color:#516173;font-size:.78rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase}.dynamic-view-builder__section-actions{display:flex;align-items:center;justify-content:flex-end;gap:.5rem;flex-wrap:wrap;flex-shrink:0}.dynamic-view-builder__hint{display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;padding:0;border:0;background:transparent;color:#8ca0b6;cursor:help}.dynamic-view-builder__hint--legacy{display:none}.dynamic-view-builder__stack{display:flex;gap:.35rem;min-width:0}.dynamic-view-builder__stack--wrap{flex-direction:row;flex-wrap:wrap;align-items:flex-start}.dynamic-view-builder__row,.dynamic-view-builder__empty-row,.dynamic-view-builder__info-row{min-width:0;border:1px solid #e7edf4;border-radius:.4rem;background:#fbfcfe}.dynamic-view-builder__row{display:inline-flex;align-items:stretch;justify-content:space-between;gap:.45rem;padding:.5rem .6rem;inline-size:auto;min-inline-size:min(100%,12rem);max-inline-size:100%;flex:0 1 auto}.dynamic-view-builder__row-main{min-width:0;display:flex;align-items:center;gap:.3rem;flex-wrap:wrap;flex:1 1 auto}.dynamic-view-builder__row-label{color:#243342;font-weight:600;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-value{color:#627588;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-separator{color:#b0bcc9;flex-shrink:0}.dynamic-view-builder__row-actions{display:flex;align-items:center;justify-content:flex-end;gap:.2rem;flex-wrap:wrap;flex:0 0 auto}.dynamic-view-builder__row--source{align-items:center;min-inline-size:min(100%,16.5rem);padding-block:.45rem}.dynamic-view-builder__row--source .dynamic-view-builder__row-main{align-items:center;flex-wrap:nowrap;gap:.18rem}.dynamic-view-builder__row-table-group{display:inline-flex;align-items:center;gap:0;min-width:0;flex:0 1 auto}.dynamic-view-builder__row-db{color:#243342;font-weight:700;line-height:1.25;white-space:nowrap}.dynamic-view-builder__row-order{display:inline-flex;align-items:center;justify-content:center;min-width:2rem;padding:.1rem .35rem;border-radius:999px;background:#eef3f8;color:#516173;font-size:.75rem;font-weight:700}.dynamic-view-builder__row-path{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:wrap}.dynamic-view-builder__row-table{color:#425466;font-weight:500;line-height:1.35}.dynamic-view-builder__row-table--accent{color:#1f8a52;font-weight:700}.dynamic-view-builder__row-dot{color:#8fa1b3;flex:0 0 auto;margin-inline:.02rem}.dynamic-view-builder__row-field{color:#1f8a52;font-weight:700;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-meta{display:inline-flex;align-items:center;padding:.12rem .4rem;border-radius:999px;background:#f0f4f8;color:#627588;font-size:.74rem;line-height:1.2}.dynamic-view-builder__join-operator{display:inline-flex;align-items:center;padding:.1rem .35rem;border-radius:999px;background:#eef3f8;color:#627588;font-size:.73rem;font-weight:700;letter-spacing:.03em;text-transform:uppercase}.dynamic-view-builder__join-arrow{color:#9ab0c6;font-size:.85rem}.dynamic-view-builder__row--draggable{cursor:grab}.dynamic-view-builder__row--drag-origin{opacity:.6;border-color:#b8cae0;background:#f4f8fc}.dynamic-view-builder__row--draggable:active{cursor:grabbing}.dynamic-view-builder__alias-field{flex:0 1 5.4rem;min-inline-size:4.4rem;max-inline-size:5.8rem}.dynamic-view-builder__alias-field :where(.sdc-textbox__label-row){display:none}.dynamic-view-builder__action-link{padding:0;border:0;background:transparent;color:#6d7786;font:inherit;font-size:.82rem;font-weight:600;line-height:1.25;cursor:pointer;transition:color .18s ease;pointer-events:auto;position:relative;z-index:2;text-decoration:none}.dynamic-view-builder__action-link:disabled{opacity:.45;cursor:default}.dynamic-view-builder__action-link:hover:not(:disabled),.dynamic-view-builder__action-link:focus-visible:not(:disabled){color:#1b5cff}.dynamic-view-builder__action-link--primary{color:#1b5cff}.dynamic-view-builder__action-link--icon{display:inline-flex;align-items:center;justify-content:center;min-width:1.5rem;min-height:1.5rem}.dynamic-view-builder__action-link--icon i{font-size:.9rem;line-height:1}.dynamic-view-builder__preview-toggle{display:inline-flex;align-items:center;gap:.4rem;min-height:2rem;padding:0 .75rem;border:1px solid #dbe3ec;border-radius:999px;background:#f8fafc;color:#425466;font:inherit;font-size:.82rem;font-weight:600;cursor:pointer;transition:border-color .18s ease,background-color .18s ease,color .18s ease}.dynamic-view-builder__preview-toggle:focus-visible{outline:2px solid rgba(27,92,255,.18);outline-offset:2px}.dynamic-view-builder__preview-toggle:hover:not(:disabled),.dynamic-view-builder__preview-toggle:focus-visible:not(:disabled){border-color:#b9c7d6;background:#eef4fb;color:#1b5cff}.dynamic-view-builder__icon-action{display:inline-flex;align-items:center;justify-content:center;width:1.35rem;height:1.35rem;padding:0;border:0;background:transparent;color:#7b8ea2;cursor:pointer;transition:color .18s ease}.dynamic-view-builder__icon-action:focus-visible{outline:2px solid rgba(27,92,255,.18);outline-offset:2px;border-radius:999px}.dynamic-view-builder__icon-action:disabled{opacity:.45;cursor:default}.dynamic-view-builder__icon-action:hover:not(:disabled),.dynamic-view-builder__icon-action:focus-visible:not(:disabled){color:#1b5cff}.dynamic-view-builder__icon-action--active{color:#1c9b5f}.dynamic-view-builder__icon-action--danger{color:#8d9caf}.dynamic-view-builder__icon-action--danger:hover:not(:disabled),.dynamic-view-builder__icon-action--danger:focus-visible:not(:disabled){color:#d14343}.dynamic-view-builder__empty-row{width:auto;max-width:100%;padding:.45rem .55rem;text-align:left;color:#70839a;cursor:pointer;inline-size:fit-content;pointer-events:auto;position:relative;z-index:1}.dynamic-view-builder__info-row{padding:.45rem .55rem;color:#3d6ae8;line-height:1.35;inline-size:fit-content;max-inline-size:100%}.dynamic-view-builder__preview-area{grid-area:preview;min-width:0;display:flex;align-self:start}.dynamic-view-builder__preview{display:flex;flex:1 1 auto;flex-direction:column;border:1px solid #dbe3ec;border-radius:.5rem;background:#fff;overflow:hidden;min-height:0}.dynamic-view-builder__preview-header{padding:.75rem .9rem;border-bottom:1px solid #e7edf4;background:#f8fafc}.dynamic-view-builder__preview-title{color:#243342;font-weight:700;line-height:1.25}.dynamic-view-builder__preview-subtitle{margin-top:.2rem;color:#70839a;line-height:1.35}.dynamic-view-builder__preview-body{display:flex;flex:1 1 auto;min-height:0;padding:.55rem}.dynamic-view-builder__preview-body :where(sdc-code-editor){display:block;flex:1 1 auto;min-height:0;width:100%}.dynamic-view-builder__footer{display:flex;justify-content:flex-start;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-shell{display:flex;flex-direction:column;gap:.875rem;min-height:0;height:100%}.dynamic-view-builder__modal-shell--full{height:100%}.dynamic-view-builder__modal-stage{display:flex;flex-direction:column;gap:.75rem;min-height:0}.dynamic-view-builder__modal-stage-body{flex:1 1 auto;min-height:0}.dynamic-view-builder__modal-card{padding:.85rem .95rem;border:1px solid #dbe3ec;border-radius:.65rem;background:#fff;box-shadow:0 1px 2px #0f172a0a}.dynamic-view-builder__modal-card--compact{padding:.75rem .85rem}.dynamic-view-builder__modal-card--section{display:flex;flex-direction:column;gap:.875rem}.dynamic-view-builder__modal-card--soft{background:linear-gradient(180deg,#fbfdff,#f6f9fc)}.dynamic-view-builder__modal-inline-surface{display:flex;flex-direction:column;gap:.625rem;min-width:0}.dynamic-view-builder__modal-list-shell{flex:1 1 auto;min-height:0;overflow:hidden;padding:.8rem}.dynamic-view-builder__modal-card-title{color:#243342;font-size:.92rem;font-weight:700;line-height:1.25}.dynamic-view-builder__modal-card-text{margin-top:.2rem;color:#70839a;font-size:.8rem;line-height:1.35}.dynamic-view-builder__modal-panel-title{color:#425466;font-size:.78rem;font-weight:700;letter-spacing:.04em;line-height:1.25;text-transform:uppercase}.dynamic-view-builder__modal-panel-title--section{margin-bottom:-.1rem}.dynamic-view-builder__modal-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;align-items:start;min-height:0}.dynamic-view-builder__modal-grid>*{min-width:0}.dynamic-view-builder__modal-grid--single{grid-template-columns:1fr}.dynamic-view-builder__modal-grid--filter{grid-template-columns:repeat(2,minmax(0,1fr))}.dynamic-view-builder__modal-grid--filter-controls{grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem .75rem}.dynamic-view-builder__modal-grid-column-full{grid-column:1/-1}.dynamic-view-builder__modal-field,.dynamic-view-builder__modal-picker{display:flex;flex-direction:column;gap:.625rem;min-width:0;min-height:0}.dynamic-view-builder__modal-field--stretch,.dynamic-view-builder__modal-picker--stretch{height:100%}.dynamic-view-builder__modal-field--compact{gap:.5rem}.dynamic-view-builder__modal-field--full{width:100%}.dynamic-view-builder__modal-label-row{display:inline-flex;align-items:center;gap:.35rem;min-width:0}.dynamic-view-builder__modal-label{color:#425466;font-size:.875rem;font-weight:600;line-height:1.25}.dynamic-view-builder__join-modal{display:flex;flex-direction:column;gap:.875rem}.dynamic-view-builder__selection-flow{display:flex;flex-direction:column;gap:.75rem;height:100%;min-height:0}.dynamic-view-builder__filter-modal{display:flex;flex-direction:column;gap:.875rem;min-height:min(30rem,100vh - 14rem);height:100%;overflow:hidden}.dynamic-view-builder__filter-step{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0;flex:1 1 auto}.dynamic-view-builder__filter-toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:.875rem;flex-wrap:wrap}.dynamic-view-builder__filter-toolbar>*{min-width:0}.dynamic-view-builder__filter-heading{display:flex;align-items:center;justify-content:space-between;gap:.5rem;min-width:0}.dynamic-view-builder__filter-base-selector,.dynamic-view-builder__filter-domain-intro{min-width:0}.dynamic-view-builder__filter-base-selector{gap:.625rem;padding:.85rem 1rem}.dynamic-view-builder__filter-mode-row{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.dynamic-view-builder__filter-mode-copy{color:#70839a;font-size:.84rem;line-height:1.4}.dynamic-view-builder__filter-mode-selector{display:flex;min-width:0}.dynamic-view-builder__filter-mode-selector :where(.select-button){max-width:100%}.dynamic-view-builder__picklist-shell{flex:1 1 auto;min-height:0;overflow:hidden;display:flex;flex-direction:column}.dynamic-view-builder__picklist-shell :where(sdc-picklist){display:flex;flex:1 1 auto;height:100%;min-height:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist){display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__loading-state){display:flex;flex-direction:column;min-height:0;flex:1 1 auto}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__content){min-height:0;flex:1 1 auto;overflow:auto}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__list){margin:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__search),.dynamic-view-builder__picklist-shell :where(.sdc-picklist__selected),.dynamic-view-builder__picklist-shell :where(.sdc-picklist__footer){flex:0 0 auto}.dynamic-view-builder__filter-config-card{flex:1 1 auto;min-height:0;gap:.75rem;overflow:auto;padding:.85rem 1rem}.dynamic-view-builder__filter-panel{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0}.dynamic-view-builder__filter-context{display:flex;flex-direction:column;gap:.2rem;padding:0 .1rem;min-width:0}.dynamic-view-builder__filter-summary{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.625rem;min-width:0}.dynamic-view-builder__filter-summary-item{display:flex;flex-direction:column;gap:.22rem;padding:.7rem .8rem;border:1px solid #dbe3ec;border-radius:.55rem;background:#f8fafc;min-width:0}.dynamic-view-builder__sort-modal{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0;height:100%;overflow:hidden}.dynamic-view-builder__sort-direction{display:block;width:100%;max-width:18rem;min-width:0;overflow:hidden}.dynamic-view-builder__sort-direction :where(.select-button){width:100%;max-width:100%;overflow:hidden}.dynamic-view-builder__sort-direction :where(.select-button-item){min-width:0}.dynamic-view-builder__sort-modal>.dynamic-view-builder__modal-field{flex:0 0 auto}.dynamic-view-builder__sort-modal>.dynamic-view-builder__modal-picker{flex:1 1 auto;min-height:0}.dynamic-view-builder__sort-modal :where(.select-button--soft){padding:.25rem}.dynamic-view-builder__sort-modal :where(.select-button--soft .select-button-item){min-height:2rem;padding:.4rem .65rem}.dynamic-view-builder__modal-summary{display:flex;flex-direction:column;gap:.25rem;align-self:start}.dynamic-view-builder__modal-summary--filter{gap:.35rem}.dynamic-view-builder__modal-summary--compact{width:fit-content;max-width:100%}.dynamic-view-builder__modal-summary--field{min-width:min(100%,15rem)}.dynamic-view-builder__join-modal-top{display:grid;grid-template-columns:minmax(0,1fr) minmax(12rem,14rem) minmax(0,1fr);gap:.875rem;align-items:stretch}.dynamic-view-builder__join-modal-top>*{height:100%}.dynamic-view-builder__join-modal-top .dynamic-view-builder__modal-summary,.dynamic-view-builder__join-modal-top .dynamic-view-builder__modal-field{align-self:stretch}.dynamic-view-builder__modal-summary-label{color:#70839a;font-size:.73rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__modal-summary-value{color:#243342;font-weight:600;line-height:1.35;word-break:break-word}.dynamic-view-builder__modal-summary-value--path{color:#1f8a52;font-family:Consolas,Courier New,monospace;font-size:.86rem;font-weight:600}.dynamic-view-builder__picker-title{color:#425466;font-weight:700;line-height:1.35}.dynamic-view-builder__picker-title--path{font-family:Consolas,Courier New,monospace;font-size:.85rem;font-weight:600}.dynamic-view-builder__modal-footer{display:flex;justify-content:flex-end;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-footer--between{justify-content:space-between;align-items:center}.dynamic-view-builder__modal-footer-group{display:inline-flex;align-items:center;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-footer-group--start{margin-right:auto}.dynamic-view-builder__filter-config-section{display:flex;flex-direction:column;gap:.625rem;min-width:0}.dynamic-view-builder__filter-config-section--value,.dynamic-view-builder__filter-config-section--domain{padding-top:.25rem;border-top:1px solid #e8edf3}.dynamic-view-builder__filter-optional{display:flex;align-items:flex-end;gap:.35rem;min-height:100%;padding-bottom:.15rem}.dynamic-view-builder__filter-config-section :where(.sdc-checkbox){min-height:34px}.dynamic-view-builder__filter-domain-grid,.dynamic-view-builder__filter-review-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem}.dynamic-view-builder__filter-domain-item,.dynamic-view-builder__filter-review-item{display:flex;flex-direction:column;gap:.25rem;min-width:0;padding:.8rem .9rem;border:1px solid #e5ebf2;border-radius:.6rem;background:#f8fafc}.dynamic-view-builder__filter-domain-hint{color:#70839a;font-size:.82rem;line-height:1.45}.dynamic-view-builder__filter-review-preview{display:flex;flex-direction:column;gap:.35rem;min-width:0;padding-top:.25rem;border-top:1px solid #e8edf3}.dynamic-view-builder__filter-review-code{color:#243342;font-family:Consolas,Courier New,monospace;font-size:.84rem;line-height:1.45;white-space:pre-wrap;word-break:break-word}.dynamic-view-builder__sort-direction-field{gap:.4rem}.dynamic-view-builder__selection-table{display:flex;flex-direction:column;border:1px solid #d7dde5;background:#fff;overflow:hidden;border-radius:.5rem;min-height:0;flex:1 1 auto}.dynamic-view-builder__modal-stage-body>.dynamic-view-builder__selection-table,.dynamic-view-builder__modal-stage-body.dynamic-view-builder__picklist-shell{height:100%}.dynamic-view-builder__selection-table--chooser{min-height:0}.dynamic-view-builder__selection-head{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) 5rem;gap:.75rem;padding:.875rem 1rem;border-bottom:1px solid #e4e8ef;background:#f6f8fb}.dynamic-view-builder__selection-body{flex:1 1 auto;min-height:0;max-height:22rem;overflow:auto}.dynamic-view-builder__selection-table--fluid,.dynamic-view-builder__selection-table--fluid .dynamic-view-builder__selection-body{min-height:0;max-height:none;height:100%}.dynamic-view-builder__selection-row{width:100%;display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) 5rem;gap:.75rem;padding:.875rem 1rem;border:0;border-bottom:1px solid #eef2f7;background:transparent;text-align:left;cursor:pointer;transition:background-color .18s ease,box-shadow .18s ease}.dynamic-view-builder__selection-row:last-child{border-bottom:0}.dynamic-view-builder__selection-row:hover{background:#f9fbff}.dynamic-view-builder__selection-row--selected{background:#eef5ff}.dynamic-view-builder__selection-row:focus-visible{outline:2px solid rgba(27,92,255,.22);outline-offset:-2px}.dynamic-view-builder__selection-col,.dynamic-view-builder__selection-cell{min-width:0;color:#425466;line-height:1.4;word-break:break-word}.dynamic-view-builder__selection-col{font-weight:700}.dynamic-view-builder__selection-cell--meta{color:#70839a}.dynamic-view-builder__selection-path{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:nowrap}.dynamic-view-builder__selection-db{color:#243342;font-weight:700}.dynamic-view-builder__selection-table-label{color:#425466;font-weight:500}.dynamic-view-builder__selection-separator{color:#9aaaba;flex:0 0 auto;margin-inline:.02rem}.dynamic-view-builder__selection-accent{color:#1f8a52;font-weight:700}.dynamic-view-builder__selection-note{display:block;margin-top:.1rem;color:#8da0b4;font-size:.74rem}.dynamic-view-builder__selection-col--select,.dynamic-view-builder__selection-cell--select{display:flex;align-items:center;justify-content:center}.dynamic-view-builder__selection-marker{display:inline-flex;align-items:center;justify-content:center;width:1.2rem;height:1.2rem;border:1px solid #c8d4e0;border-radius:.3rem;background:#fff;color:transparent}.dynamic-view-builder__selection-marker i{font-size:.72rem;line-height:1}.dynamic-view-builder__selection-marker--selected{border-color:#1b5cff;background:#1b5cff;color:#fff}.dynamic-view-builder__selection-empty{padding:1rem;color:#70839a;text-align:center;line-height:1.4}.dynamic-view-builder__modal-picker--filter,.dynamic-view-builder__modal-picker--filter .dynamic-view-builder__selection-table{min-height:100%}.dynamic-view-builder__modal-picker--filter .dynamic-view-builder__selection-body{max-height:none}.dynamic-view-builder__field-modal{display:flex;flex-direction:column;gap:1rem;min-height:0;width:100%;height:100%}.dynamic-view-builder__field-config-shell{gap:.85rem;min-height:0;height:100%}.dynamic-view-builder__field-config-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__field-config-summary{color:#516173;font-size:.8rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__field-selection-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__field-config-list,.dynamic-view-builder__source-config-list{display:flex;flex-direction:column;flex:1 1 auto;gap:.75rem;width:100%;min-height:0;overflow:auto}.dynamic-view-builder__field-config-row{display:grid;grid-template-columns:minmax(13rem,1.1fr) minmax(0,1.9fr);gap:.9rem;align-items:start;width:100%;padding:.85rem .9rem;border:1px solid #dbe3ec;border-radius:.7rem;background:#fff}.dynamic-view-builder__source-config-row{display:grid;grid-template-columns:minmax(13rem,1fr) minmax(0,1.35fr);gap:.9rem;align-items:center;width:100%;padding:.85rem .9rem;border:1px solid #dbe3ec;border-radius:.7rem;background:#fff}.dynamic-view-builder__field-config-main,.dynamic-view-builder__source-config-main{display:flex;flex-direction:column;gap:.45rem;min-width:0}.dynamic-view-builder__field-config-title{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:wrap}.dynamic-view-builder__field-config-function{display:inline-flex;align-items:center;gap:.45rem;flex-wrap:wrap}.dynamic-view-builder__field-config-controls{display:grid;grid-template-columns:minmax(0,1fr) minmax(7rem,8rem) auto auto;gap:.75rem;align-items:end;min-width:0}.dynamic-view-builder__source-config-controls{display:grid;grid-template-columns:minmax(0,1fr);gap:.75rem;align-items:end;min-width:0}.dynamic-view-builder__field-config-controls--function{grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto auto}.dynamic-view-builder__field-form{display:grid;grid-template-columns:minmax(0,1fr) minmax(10rem,11rem);gap:.75rem 1rem;align-items:start}.dynamic-view-builder__field-form--balanced{grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr)}.dynamic-view-builder__field-width{display:flex;flex-direction:column;gap:.35rem;min-width:0}.dynamic-view-builder__between{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.625rem}.dynamic-view-builder__row-chip{display:inline-flex;align-items:center;padding:.14rem .45rem;border-radius:999px;font-size:.74rem;font-weight:600;line-height:1.2}.dynamic-view-builder__row-chip--operator{background:#eef4fb;color:#1b5cff}.dynamic-view-builder__row-chip--value{background:#f4f7fa;color:#5d7084}.dynamic-view-builder__row-chip--optional{background:#f2f7f3;color:#1f8a52}.dynamic-view-builder__row-chip--domain{background:#eef4fb;color:#425466}.dynamic-view-builder__field-drop-indicator{display:inline-flex;align-self:stretch;width:.2rem;min-height:2.2rem;border-radius:999px;background:#1b5cff;box-shadow:0 0 0 3px #1b5cff24;flex:0 0 auto}@media (max-width: 1120px){.dynamic-view-builder__workspace--split{grid-template-columns:1fr;grid-template-areas:\"builder\" \"preview\"}.dynamic-view-builder__workspace--split.dynamic-view-builder__workspace--preview-hidden{justify-items:stretch}.dynamic-view-builder__sections--split{padding-right:0}}@media (max-width: 900px){.dynamic-view-builder__field-form,.dynamic-view-builder__field-form--balanced,.dynamic-view-builder__field-config-toolbar,.dynamic-view-builder__field-config-row,.dynamic-view-builder__source-config-row,.dynamic-view-builder__field-config-controls,.dynamic-view-builder__source-config-controls,.dynamic-view-builder__field-config-controls--function{grid-template-columns:1fr}.dynamic-view-builder__section-row{flex-direction:column}.dynamic-view-builder__section--half,.dynamic-view-builder__section--compact,.dynamic-view-builder__section--fluid{width:100%}.dynamic-view-builder__toolbar,.dynamic-view-builder__section-head,.dynamic-view-builder__row,.dynamic-view-builder__footer,.dynamic-view-builder__modal-footer,.dynamic-view-builder__filter-toolbar,.dynamic-view-builder__field-selection-toolbar{flex-direction:column;align-items:stretch}.dynamic-view-builder__toolbar-actions,.dynamic-view-builder__section-actions,.dynamic-view-builder__row-actions{justify-content:flex-start}.dynamic-view-builder__alias-field{min-inline-size:6rem;max-inline-size:100%}.dynamic-view-builder__modal-grid,.dynamic-view-builder__modal-grid--filter,.dynamic-view-builder__modal-grid--filter-controls,.dynamic-view-builder__filter-modal,.dynamic-view-builder__filter-summary,.dynamic-view-builder__filter-domain-grid,.dynamic-view-builder__filter-review-grid,.dynamic-view-builder__between,.dynamic-view-builder__join-modal-top{grid-template-columns:1fr}.dynamic-view-builder__row{min-inline-size:100%}}:host ::ng-deep .sdc-modal__content{display:flex;flex-direction:column;min-height:0;overflow:hidden}:host ::ng-deep .sdc-modal__content>.dynamic-view-builder__modal-shell{flex:1 1 auto;min-height:0}@media (max-width: 768px){.dynamic-view-builder__selection-head,.dynamic-view-builder__selection-row{grid-template-columns:1fr}.dynamic-view-builder__selection-col--select,.dynamic-view-builder__selection-cell--select{justify-content:flex-start}}\n"] }]
|
|
2789
2331
|
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i0.ChangeDetectorRef }], propDecorators: { loading: [{
|
|
2790
2332
|
type: Input
|
|
@@ -2807,4 +2349,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
2807
2349
|
args: ["window:resize"]
|
|
2808
2350
|
}] } });
|
|
2809
2351
|
export { VisualSqlEditorComponent as DynamicViewBuilderComponent };
|
|
2810
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy92aXN1YWwtc3FsLWVkaXRvci92aXN1YWwtc3FsLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3Zpc3VhbC1zcWwtZWRpdG9yL3Zpc3VhbC1zcWwtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFvQixNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzFHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBd0IvRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7OztBQXlMbkUsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDO0FBQ3ZDLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDO0FBQ3RDLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQzlCLE1BQU0sNEJBQTRCLEdBQUcsR0FBRyxDQUFDO0FBQ3pDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDO0FBQ3hDLE1BQU0sd0JBQXdCLEdBQXNDLEtBQUssQ0FBQztBQUMxRSxNQUFNLHlCQUF5QixHQUFzQyxPQUFPLENBQUM7QUFDN0UsTUFBTSxrQkFBa0IsR0FBRyxRQUFpQixDQUFDO0FBQzdDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDO0FBQ3JDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0scUJBQXFCLEdBQUcscUJBQXFCLEdBQUcsb0JBQW9CLENBQUM7QUFDM0UsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFDL0IsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUM7QUFDekMsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUM7QUFDekMsTUFBTSw4QkFBOEIsR0FBZSxNQUFNLENBQUM7QUFDMUQsTUFBTSw2QkFBNkIsR0FBZSxNQUFNLENBQUM7QUFDekQsTUFBTSxzQkFBc0IsR0FBRyxvQkFBb0IsQ0FBQztBQUNwRCxNQUFNLHdCQUF3QixHQUFHLG9CQUFvQixDQUFDO0FBQ3RELE1BQU0sNkJBQTZCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLE1BQU0sb0JBQW9CLEdBQXNEO0lBQzlFLE1BQU0sRUFBRTtRQUNOLEdBQUcsRUFBRSxzQkFBc0I7UUFDM0IsUUFBUSxFQUFFLGFBQWE7S0FDeEI7SUFDRCxVQUFVLEVBQUU7UUFDVixHQUFHLEVBQUUseUJBQXlCO1FBQzlCLFFBQVEsRUFBRSxtQkFBbUI7S0FDOUI7SUFDRCxZQUFZLEVBQUU7UUFDWixHQUFHLEVBQUUsMkJBQTJCO1FBQ2hDLFFBQVEsRUFBRSxlQUFlO0tBQzFCO0lBQ0QscUJBQXFCLEVBQUU7UUFDckIsR0FBRyxFQUFFLGtDQUFrQztRQUN2QyxRQUFRLEVBQUUsdUJBQXVCO0tBQ2xDO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsR0FBRyxFQUFFLHdCQUF3QjtRQUM3QixRQUFRLEVBQUUsZUFBZTtLQUMxQjtJQUNELGtCQUFrQixFQUFFO1FBQ2xCLEdBQUcsRUFBRSwrQkFBK0I7UUFDcEMsUUFBUSxFQUFFLHVCQUF1QjtLQUNsQztDQUNGLENBQUM7QUFDRixNQUFNLHdCQUF3QixHQUE4QjtJQUMxRCxNQUFNLEVBQUU7UUFDTixLQUFLLEVBQUUsT0FBTztRQUNkLE1BQU0sRUFBRSxPQUFPO0tBQ2hCO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsS0FBSyxFQUFFLE9BQU87UUFDZCxNQUFNLEVBQUUsT0FBTztLQUNoQjtJQUNELElBQUksRUFBRTtRQUNKLEtBQUssRUFBRSxPQUFPO1FBQ2QsTUFBTSxFQUFFLE9BQU87S0FDaEI7SUFDRCxJQUFJLEVBQUU7UUFDSixLQUFLLEVBQUUsT0FBTztRQUNkLE1BQU0sRUFBRSxPQUFPO0tBQ2hCO0lBQ0QsTUFBTSxFQUFFO1FBQ04sS0FBSyxFQUFFLE9BQU87UUFDZCxNQUFNLEVBQUUsT0FBTztLQUNoQjtJQUNELEtBQUssRUFBRTtRQUNMLEtBQUssRUFBRSxPQUFPO1FBQ2QsTUFBTSxFQUFFLE9BQU87S0FDaEI7Q0FDRixDQUFDO0FBd0JGLE1BQU0sT0FBTyx3QkFBd0I7SUE0SGhCO0lBQ0E7SUE1SFgsY0FBYyxHQUFHLDhCQUE4QixFQUFFLENBQUM7SUFDekMsWUFBWSxHQUF1QjtRQUNsRCxRQUFRO1FBQ1IsT0FBTztRQUNQLFNBQVM7UUFDVCxRQUFRO1FBQ1IsU0FBUztRQUNULFNBQVM7S0FDVixDQUFDO0lBQ00sc0JBQXNCLEdBQWtCLElBQUksQ0FBQztJQUM3Qyx3QkFBd0IsR0FBeUMsSUFBSSxDQUFDO0lBQ3JFLGVBQWUsR0FBMEM7UUFDaEU7WUFDRSxLQUFLLEVBQUUsUUFBUTtZQUNmLEtBQUssRUFBRSxTQUFTO1lBQ2hCLFNBQVMsRUFBRSxpQkFBaUI7U0FDN0I7UUFDRDtZQUNFLEtBQUssRUFBRSxPQUFPO1lBQ2QsS0FBSyxFQUFFLE9BQU87WUFDZCxTQUFTLEVBQUUsYUFBYTtTQUN6QjtLQUNGLENBQUM7SUFDTyxlQUFlLEdBQXdDO1FBQzlEO1lBQ0UsS0FBSyxFQUFFLFFBQVE7WUFDZixLQUFLLEVBQUUsV0FBVztTQUNuQjtRQUNEO1lBQ0UsS0FBSyxFQUFFLHNCQUFzQjtZQUM3QixLQUFLLEVBQUUsa0JBQWtCO1NBQzFCO0tBQ0YsQ0FBQztJQUNPLHVCQUF1QixHQUF3QyxFQUFFLENBQUM7SUFDbEUsa0JBQWtCLEdBQStCLEVBQUUsQ0FBQztJQUNwRCx1QkFBdUIsR0FBMEMsRUFBRSxDQUFDO0lBQ3BFLDBCQUEwQixHQUErQixFQUFFLENBQUM7SUFDNUQsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFhLE1BQU0sQ0FBQyxLQUErQjtRQUNqRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUs7WUFDekIsQ0FBQyxDQUFDLDhCQUE4QixDQUFDLEtBQUssQ0FBQztZQUN2QyxDQUFDLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUNELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBQ2tCLFlBQVksR0FDN0IsSUFBSSxZQUFZLEVBQTRCLENBQUM7SUFDNUIsSUFBSSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO0lBQ3BELE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRXBDLGlCQUFpQixDQUEyQjtJQUU1QyxlQUFlLENBQXNDO0lBQ3RFLFVBQVUsR0FBc0IsU0FBUyxDQUFDO0lBQzFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsVUFBVSxHQUF1QixFQUFFLENBQUM7SUFDcEMsMEJBQTBCLEdBQUcsT0FBTyxDQUFDO0lBQ3JDLGtCQUFrQixHQUFrQixJQUFJLENBQUM7SUFDekMsZ0JBQWdCLEdBQWtCLElBQUksQ0FBQztJQUM5QixtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQztJQUM1QyxhQUFhLEdBQUcscUJBQXFCLENBQUM7SUFDdEMsZUFBZSxHQUFHLHdCQUF3QixDQUFDO0lBQzNDLGlCQUFpQixHQUFHLG1CQUFtQixDQUFDO0lBQ3hDLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO0lBQ25ELGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUMzQixlQUFlLEdBQW9CLFFBQVEsQ0FBQztJQUM1QyxpQkFBaUIsR0FBdUIsRUFBRSxDQUFDO0lBQzNDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztJQUM5QixrQkFBa0IsR0FBdUIsUUFBUSxDQUFDO0lBQ2xELGlCQUFpQixHQUFhLEVBQUUsQ0FBQztJQUNqQyxvQkFBb0IsR0FBRyxXQUFXLENBQUM7SUFDbkMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLGFBQWEsR0FBa0IsSUFBSSxDQUFDO0lBQ3BDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztJQUMvQixnQkFBZ0IsR0FBRyxXQUFXLENBQUM7SUFDL0IsU0FBUyxHQUFHO1FBQ1YsWUFBWSxFQUFFLFdBQVc7UUFDekIsWUFBWSxFQUFFLFdBQVc7UUFDekIsUUFBUSxFQUFFLHFCQUFxQjtLQUNoQyxDQUFDO0lBQ0YsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLGFBQWEsR0FBa0IsSUFBSSxDQUFDO0lBQ3BDLFVBQVUsR0FBRyxXQUFXLENBQUM7SUFDekIsU0FBUyxHQUFHO1FBQ1YsTUFBTSxFQUFFLFdBQVc7UUFDbkIsWUFBWSxFQUFFLFdBQVc7UUFDekIsU0FBUyxFQUFFLHNCQUFzQjtLQUNsQyxDQUFDO0lBQ0YsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQzFCLGNBQWMsR0FBbUIsUUFBUSxDQUFDO0lBQzFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztJQUMvQixnQkFBZ0IsR0FBOEIsRUFBRSxDQUFDO0lBQ2pELHVCQUF1QixHQUFrQixJQUFJLENBQUM7SUFDOUMsa0JBQWtCLEdBQUc7UUFDbkIsTUFBTSxFQUFFLFdBQVc7UUFDbkIsWUFBWSxFQUFFLFdBQVc7UUFDekIsYUFBYSxFQUFFLFdBQVc7S0FDM0IsQ0FBQztJQUNGLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUMzQixlQUFlLEdBQWtCLElBQUksQ0FBQztJQUN0QyxlQUFlLEdBQW9CLFFBQVEsQ0FBQztJQUM1QyxlQUFlLEdBQW9CLFdBQVcsQ0FBQztJQUMvQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQzNCLFdBQVcsR0FBRztRQUNaLElBQUksRUFBRSxXQUE4QjtRQUNwQyxNQUFNLEVBQUUsV0FBVztRQUNuQixRQUFRLEVBQUUsdUJBQXVCO1FBQ2pDLFNBQVMsRUFBRSx3QkFBd0I7UUFDbkMsUUFBUSxFQUFFLEtBQUs7UUFDZixTQUFTLEVBQUUseUJBQXlCO1FBQ3BDLEtBQUssRUFBRSxXQUFXO1FBQ2xCLFVBQVUsRUFBRSxXQUFXO1FBQ3ZCLFlBQVksRUFBRSxXQUFXO1FBQ3pCLFVBQVUsRUFBRSxXQUFXO1FBQ3ZCLGFBQWEsRUFBRSxXQUFXO1FBQzFCLGdCQUFnQixFQUFFLFdBQVc7S0FDOUIsQ0FBQztJQUNGLFlBQ21CLFNBQTJCLEVBQzNCLGlCQUFvQztRQURwQyxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBRXJELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDM0MsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3pDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMzQyxZQUFZLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksc0JBQXNCO1FBQ3hCLE9BQU8sQ0FDTCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ25FLElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxtQkFBbUI7UUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEUsR0FBRyxJQUFJO1lBQ1AsSUFBSSxFQUFFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUM7U0FDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFDRCxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTztZQUNMO2dCQUNFLElBQUksRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQzVCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsMkJBQTJCLEVBQzNELE9BQU8sQ0FDUjtnQkFDRCxLQUFLLEVBQUUsT0FBTzthQUNmO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDNUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQiwrQkFBK0IsRUFDL0QsV0FBVyxDQUNaO2dCQUNELEtBQUssRUFBRSxXQUFXO2FBQ25CO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLG1CQUFtQjtRQUNyQixPQUFPO1lBQ0w7Z0JBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDNUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQix1QkFBdUIsRUFDdkQsTUFBTSxDQUNQO2dCQUNELEtBQUssRUFBRSxNQUFNO2FBQ2Q7WUFDRDtnQkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM1QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHdCQUF3QixFQUN4RCxPQUFPLENBQ1I7Z0JBQ0QsS0FBSyxFQUFFLE9BQU87YUFDZjtTQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQ3hELENBQUM7UUFDRixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzlELEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksZ0JBQWdCO1FBQ2xCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FDeEQsQ0FBQztRQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDL0QsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FDakMsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLHNCQUFzQjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0IsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FDakMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxDQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksd0JBQXdCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsS0FBSyxLQUFLLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsSUFBSSxtQkFBbUI7UUFDckIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTFELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUMxQixnQkFBZ0I7YUFDYixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNmLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzFDLE9BQU8sTUFBTSxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUM7WUFDckMsQ0FBQztZQUVELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzlFLENBQUMsQ0FBQzthQUNELEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUM7WUFFeEUsT0FBTztnQkFDTCxZQUFZO2dCQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7Z0JBQ3hELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUM1QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLElBQUksRUFBRSxZQUFZO29CQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQztvQkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxJQUFJLFdBQVc7YUFDbkUsQ0FBQztRQUNKLENBQUMsQ0FBQyxFQUNKLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNsQixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELElBQUksT0FBTztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBQ0QsSUFBSSxXQUFXO1FBQ2IsSUFDRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWTtZQUM1QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWTtZQUM1QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUN4QixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckUsT0FBTyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQy9ELENBQUM7SUFDRCxJQUFJLFdBQVc7UUFDYixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDL0QsQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDekUsQ0FBQztJQUNELElBQUksYUFBYTtRQUNmLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxJQUFJLHlCQUF5QjtRQUMzQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsSUFBSSw4QkFBOEI7UUFDaEMsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLFFBQVEsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsSUFBSSxrQ0FBa0M7UUFDcEMsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLFdBQVcsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBSSwyQkFBMkI7UUFDN0IsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLFFBQVEsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsSUFBSSxxQkFBcUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLGtCQUFrQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUNsRixDQUFDO0lBQ0QsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUNELElBQUksdUJBQXVCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSw2QkFBNkI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixvQ0FBb0MsRUFDcEUsNEVBQTRFLENBQzdFLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSw0QkFBNEI7UUFDOUIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVCLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixtQ0FBbUMsRUFDbkUsc0ZBQXNGLENBQ3ZGLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQzVELENBQUM7SUFDRCxJQUFJLDZCQUE2QjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixpREFBaUQsRUFDakYsOEVBQThFLENBQy9FLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGdEQUFnRCxFQUNoRiw4RUFBOEUsQ0FDL0UsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBSSxxQkFBcUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsbUNBQW1DLEVBQ25FLDJEQUEyRCxDQUM1RCxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pFLElBQUksV0FBbUIsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDekMsV0FBVyxHQUFHLGlCQUFpQixDQUFDO1FBQ2xDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDN0MsV0FBVyxHQUFHLGNBQWMsQ0FBQztRQUMvQixDQUFDO2FBQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLElBQUksV0FBVyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekUsV0FBVyxHQUFHLGlCQUFpQixDQUFDO1FBQ2xDLENBQUM7YUFBTSxDQUFDO1lBQ04sV0FBVyxHQUFHLGNBQWMsQ0FBQztRQUMvQixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQTJCO1lBQzVDLGVBQWUsRUFBRSx5REFBeUQ7WUFDMUUsWUFBWSxFQUFFLHNFQUFzRTtZQUNwRixlQUFlLEVBQUUscUVBQXFFO1lBQ3RGLFlBQVksRUFBRSxxRUFBcUU7U0FDcEYsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHFCQUFxQixXQUFXLEVBQUUsRUFDbEUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUMzQixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksc0JBQXNCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLG9DQUFvQyxFQUNwRSw4RkFBOEYsQ0FDL0YsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsd0NBQXdDLEVBQ3hFLHVEQUF1RCxDQUN4RCxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLDZCQUE2QixFQUM3RCxxR0FBcUcsQ0FDdEcsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQiw2QkFBNkIsRUFDN0QsdUZBQXVGLENBQ3hGLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxxQkFBcUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsNEJBQTRCLEVBQzVELGtGQUFrRixDQUNuRixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksNkJBQTZCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLG9DQUFvQyxFQUNwRSxnSEFBZ0gsQ0FDakgsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLHVCQUF1QjtRQUN6QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQy9DLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGlDQUFpQyxFQUNqRSxnRkFBZ0YsQ0FDakYsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLDhCQUE4QixFQUM5RCxnRUFBZ0UsQ0FDakUsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLDJCQUEyQixFQUMzRCx5REFBeUQsQ0FDMUQsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQix5QkFBeUIsRUFDekQsZ0VBQWdFLENBQ2pFLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxzQkFBc0I7UUFDeEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNwRixPQUFPLENBQ0wsV0FBVztZQUNYLENBQUMsSUFBSSxDQUFDLHVCQUF1QjtZQUM3QixDQUFDLElBQUksQ0FBQyx1QkFBdUI7WUFDN0IsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQ2hDLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxDQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLE9BQU87WUFDdEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUNuQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksdUJBQXVCO1FBQ3pCLE9BQU8sQ0FDTCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsS0FBSyxPQUFPO1lBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FDeEMsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLDBCQUEwQjtRQUM1QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsSUFBSSx5QkFBeUI7UUFDM0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsT0FBTyxDQUNMLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ25CLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLEtBQUssa0JBQWtCO1lBQ2hFLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQ3hCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsc0JBQXNCLEVBQ3RELHNCQUFzQixDQUN2QjtZQUNELENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFL0UsTUFBTSxLQUFLLEdBQXVCO1lBQ2hDO2dCQUNFLEVBQUUsRUFBRSxNQUFNO2dCQUNWLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsY0FBYyxFQUM5QyxNQUFNLENBQ1A7Z0JBQ0QsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLEtBQUssa0JBQWtCO29CQUNoRCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUN4QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNCQUFzQixFQUN0RCxzQkFBc0IsQ0FDdkI7b0JBQ0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FDeEIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQiwwQkFBMEIsRUFDMUQsUUFBUSxDQUNUO2FBQ0o7WUFDRDtnQkFDRSxFQUFFLEVBQUUsV0FBVztnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLG1CQUFtQixFQUNuRCxVQUFVLENBQ1g7Z0JBQ0QsS0FBSyxFQUFFLElBQUksQ0FBQyx1QkFBdUI7b0JBQ2pDLENBQUMsQ0FBQyxPQUFPO29CQUNULENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDO2FBQ3JGO1NBQ0YsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2hELEtBQUssQ0FBQyxJQUFJLENBQ1I7Z0JBQ0UsRUFBRSxFQUFFLFlBQVk7Z0JBQ2hCLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsMEJBQTBCLEVBQzFELHNCQUFzQixDQUN2QjtnQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHO2dCQUN0RCxTQUFTLEVBQUUsTUFBTTthQUNsQixDQUNGLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssQ0FBQyxJQUFJLENBQ1I7Z0JBQ0UsRUFBRSxFQUFFLE9BQU87Z0JBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixlQUFlLEVBQy9DLE9BQU8sQ0FDUjtnQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO2dCQUN0RixTQUFTLEVBQUUsTUFBTTthQUNsQixFQUNEO2dCQUNFLEVBQUUsRUFBRSxVQUFVO2dCQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsa0JBQWtCLEVBQ2xELFVBQVUsQ0FDWDtnQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO2FBQ2xFLEVBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLFdBQVc7Z0JBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixtQkFBbUIsRUFDbkQsZUFBZSxDQUNoQjtnQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FDdEUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixjQUFjLEVBQzlDLFdBQVcsQ0FDWjthQUNGLEVBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLE9BQU87Z0JBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixlQUFlLEVBQy9DLE9BQU8sQ0FDUjtnQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLDhCQUE4QixFQUFFLElBQUksR0FBRztnQkFDbkQsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQzNFLENBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ1QsRUFBRSxFQUFFLFVBQVU7WUFDZCxLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGtCQUFrQixFQUNsRCxVQUFVLENBQ1g7WUFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRO2dCQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUN4QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGFBQWEsRUFDN0MsS0FBSyxDQUNOO2dCQUNELENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQ3hCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsWUFBWSxFQUM1QyxLQUFLLENBQ047U0FDSixDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxJQUFJLHdCQUF3QjtRQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNwRCxPQUFPLE9BQU8sSUFBSSxHQUFHLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQUksOEJBQThCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGVBQWUsS0FBSyxRQUFRLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQUksa0NBQWtDO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLGVBQWUsS0FBSyxXQUFXLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQUksMEJBQTBCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNkLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztnQkFDdEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUM1QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUM1RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSx3QkFBd0I7UUFDMUIsT0FBTztZQUNMO2dCQUNFLEVBQUUsRUFBRSxRQUFRO2dCQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsdUJBQXVCLEVBQ3ZELHNCQUFzQixDQUN2QjtnQkFDRCxXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUNuQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHVDQUF1QyxFQUN2RSxnRkFBZ0YsQ0FDakY7Z0JBQ0QsY0FBYyxFQUFFLEdBQUc7YUFDcEI7WUFDRDtnQkFDRSxFQUFFLEVBQUUsV0FBVztnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLDJCQUEyQixFQUMzRCxvQkFBb0IsQ0FDckI7Z0JBQ0QsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDbkMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQiwwQ0FBMEMsRUFDMUUsZ0ZBQWdGLENBQ2pGO2dCQUNELGNBQWMsRUFBRSxHQUFHO2dCQUNuQixRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCO2FBQ3RDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQix1QkFBdUIsRUFDdkQsc0JBQXNCLENBQ3ZCLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSw0QkFBNEI7UUFDOUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsb0NBQW9DLEVBQ3BFLG9DQUFvQyxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksd0JBQXdCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsSUFBSSw4QkFBOEI7UUFDaEMsT0FBTyxJQUFJLENBQUMsaUJBQWlCO2FBQzFCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0RCxNQUFNLENBQ0wsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxHQUFHLENBQUMsQ0FDL0QsQ0FBQztJQUNOLENBQUM7SUFDRCxJQUFJLDBCQUEwQjtRQUM1QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSzthQUNsQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3JELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxRCxPQUFPO2dCQUNMLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxLQUFLLEVBQUU7Z0JBQ3hELFdBQVcsRUFBRSxNQUFNLENBQUMsVUFBVTtnQkFDOUIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUM5QixRQUFRLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3RELFdBQVcsRUFBRSxNQUFNLENBQUMsVUFBVTtnQkFDOUIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxVQUFVO2FBQy9CLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEQsRUFBRSxFQUFFLElBQUk7WUFDUixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7U0FDakMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFELEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNoQixLQUFLLEVBQUUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUQsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFDRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN4RCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUM7WUFDekUsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDO1lBRW5FLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7Z0JBQzlCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUNwQixVQUFVLEVBQUUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHO2dCQUMzQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUN4QyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO2dCQUN6QyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO2dCQUN6QyxZQUFZO2dCQUNaLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVztnQkFDbkYsYUFBYTtnQkFDYixlQUFlLEVBQ2IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsYUFBYTtnQkFDckYsS0FBSyxFQUFFLEtBQUs7YUFDYixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQ2xDLElBQUksQ0FBQyxzQkFBc0IsRUFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUNoRCxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUkseUJBQXlCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVcsQ0FBQztZQUV4RSxPQUFPO2dCQUNMLFlBQVk7Z0JBQ1osRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7Z0JBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUM1QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7Z0JBQ3hDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7Z0JBQ3hDLGFBQWEsRUFBRSxZQUFZO29CQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQztvQkFDekMsQ0FBQyxDQUFDLFdBQVc7Z0JBQ2YsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7YUFDM0QsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELElBQUksOEJBQThCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FDckMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQzlFLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxzQkFBc0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELElBQUksNkJBQTZCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQjthQUN6QixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDeEQsTUFBTSxDQUNMLENBQUMsSUFBSSxFQUFrQixFQUFFLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksR0FBRyxDQUFDLENBQy9ELENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSw2QkFBNkI7UUFDL0IsT0FBTyxJQUFJLENBQUMsY0FBYyxLQUFLLFFBQVEsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsSUFBSSxpQ0FBaUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsY0FBYyxLQUFLLFdBQVcsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSwyQkFBMkI7UUFDN0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsbUNBQW1DLEVBQ25FLGlDQUFpQyxDQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksdUJBQXVCO1FBQ3pCLE9BQU87WUFDTDtnQkFDRSxFQUFFLEVBQUUsUUFBUTtnQkFDWixLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHdCQUF3QixFQUN4RCxvQkFBb0IsQ0FDckI7Z0JBQ0QsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDbkMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQix5QkFBeUIsRUFDekQsc0RBQXNELENBQ3ZEO2dCQUNELGNBQWMsRUFBRSxHQUFHO2FBQ3BCO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLFdBQVc7Z0JBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUMzQixXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUNuQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHdCQUF3QixFQUN4RCx5REFBeUQsQ0FDMUQ7Z0JBQ0QsY0FBYyxFQUFFLEdBQUc7Z0JBQ25CLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNO2FBQ3hDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLDRCQUE0QjtRQUM5QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixvQ0FBb0MsRUFDcEUsa0NBQWtDLENBQ25DLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSx3QkFBd0I7UUFDMUIsT0FBTztZQUNMO2dCQUNFLEVBQUUsRUFBRSxRQUFRO2dCQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsbUNBQW1DLEVBQ25FLGlCQUFpQixDQUNsQjtnQkFDRCxXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUNuQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNDQUFzQyxFQUN0RSx3RUFBd0UsQ0FDekU7Z0JBQ0QsY0FBYyxFQUFFLEdBQUc7YUFDcEI7WUFDRDtnQkFDRSxFQUFFLEVBQUUsV0FBVztnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNDQUFzQyxFQUN0RSxtQkFBbUIsQ0FDcEI7Z0JBQ0QsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDbkMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQix5Q0FBeUMsRUFDekUseURBQXlELENBQzFEO2dCQUNELGNBQWMsRUFBRSxHQUFHO2dCQUNuQixRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCO2FBQ3RDO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLFFBQVE7Z0JBQ1osS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixtQ0FBbUMsRUFDbkUsZUFBZSxDQUNoQjtnQkFDRCxXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUNuQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNDQUFzQyxFQUN0RSxtREFBbUQsQ0FDcEQ7Z0JBQ0QsY0FBYyxFQUFFLEdBQUc7Z0JBQ25CLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0I7YUFDckM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksK0JBQStCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLG1CQUFtQixFQUNuRCxlQUFlLENBQ2hCLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSw0QkFBNEI7UUFDOUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIscUJBQXFCLEVBQ3JELGVBQWUsQ0FDaEIsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLDhCQUE4QjtRQUNoQyxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixvQ0FBb0MsRUFDcEUsMkRBQTJELENBQzVELENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsdUNBQXVDLEVBQ3ZFLHFFQUFxRSxDQUN0RSxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUkseUJBQXlCO1FBQzNCLE9BQU87WUFDTDtnQkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM1QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGNBQWMsRUFDOUMsWUFBWSxDQUNiO2dCQUNELEtBQUssRUFBRSxXQUFXO2FBQ25CO1lBQ0QsR0FBRyxJQUFJLENBQUMsZUFBZTtTQUN4QixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekQsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssRUFBRTtZQUNuRixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7WUFDdEQsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQzlDLENBQUMsQ0FBQyxXQUFXO1lBQ2YsU0FBUyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FDaEMsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsb0JBQW9CLENBQzFCO1NBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RCxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFO1lBQy9DLEtBQUssRUFDSCxJQUFJLENBQUMsU0FBUyxLQUFLLGtCQUFrQjtnQkFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FDeEIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixzQkFBc0IsRUFDdEQsc0JBQXNCLENBQ3ZCO2dCQUNELENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDMUIsSUFBSSxDQUFDLE1BQU0sQ0FDWixNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDM0QsUUFBUSxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUM7WUFDOUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN2RCxNQUFNLEtBQUssR0FDVCxJQUFJLENBQUMsU0FBUyxLQUFLLGtCQUFrQjtnQkFDbkMsQ0FBQyxDQUFDO29CQUNBLE9BQU8sRUFBRSxXQUFXO29CQUNwQixVQUFVLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUNsQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNCQUFzQixFQUN0RCxzQkFBc0IsQ0FDdkI7b0JBQ0QsVUFBVSxFQUFFLFdBQVc7aUJBQ3hCO2dCQUNELENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTNDLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssRUFBRTtnQkFDL0MsR0FBRyxLQUFLO2dCQUNSLGFBQWEsRUFDWCxJQUFJLENBQUMsU0FBUyxLQUFLLGtCQUFrQjtvQkFDbkMsQ0FBQyxDQUFDLFdBQVc7b0JBQ2IsQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNwRCxRQUFRLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQztnQkFDOUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsS0FBSyxrQkFBa0I7YUFDaEQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELElBQUksbUJBQW1CO1FBQ3JCLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHVCQUF1QixFQUN2RCxzQkFBc0IsQ0FDdkIsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixzQkFBc0IsRUFDdEQsbUJBQW1CLENBQ3BCLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsdUJBQXVCLEVBQ3ZELHFCQUFxQixDQUN0QixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGdCQUFnQixFQUNoRCxRQUFRLENBQ1QsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQiwyQkFBMkIsRUFDM0QsUUFBUSxDQUNULENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGNBQWMsRUFDOUMsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGNBQWMsRUFDOUMsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsaUJBQWlCLEVBQ2pELFlBQVksQ0FDYixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNCQUFzQixFQUN0RCxTQUFTLENBQ1YsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsc0JBQXNCLEVBQ3RELFdBQVcsQ0FDWixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixxQkFBcUIsRUFDckQsa0JBQWtCLENBQ25CLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxrQkFBa0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDekMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQ2pDLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUMxQixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxJQUFJLENBQUMsc0JBQXNCLEVBQzNCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUMxQixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxJQUFJLENBQUMsd0JBQXdCLEVBQzdCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUMxQixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksMkJBQTJCO1FBQzdCLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsSUFBSSxpQ0FBaUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsaUJBQWlCO2FBQzFCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pELE1BQU0sQ0FDTCxDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUMvRCxDQUFDO0lBQ04sQ0FBQztJQUNELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FDbEMsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQ2hFLElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELElBQUksNkJBQTZCO1FBQy9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdFLE9BQU8sT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsR0FBRyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUNkLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sS0FBSyxHQUFHLE1BQU07WUFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNyRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxLQUFLLEVBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUNoRSxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLEtBQUssQ0FDTixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksMkJBQTJCO1FBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sTUFBTTtZQUNYLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDckUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNELElBQUksNkJBQTZCO1FBQy9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdFLE9BQU8sT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsR0FBRyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUNkLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQjthQUM1QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNmLElBQUksQ0FBQyxhQUFhLENBQ2hCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FDRjthQUNBLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNkLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtZQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixRQUFRLEVBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07Z0JBQ3JDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLElBQUksV0FBVyxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVk7WUFDcEUsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsUUFBUSxFQUFFLFFBQWlCO1NBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEQsRUFBRSxFQUFFLEtBQUssR0FBRyxDQUFDO1lBQ2IsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzlDLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUM1QixXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDNUIsZ0JBQWdCLEVBQUUsc0JBQXNCO1lBQ3hDLGdCQUFnQixFQUFFLHNCQUFzQjtZQUN4QyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDaEIsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUMzQixDQUFDLENBQUMsNkJBQTZCO2dCQUMvQixDQUFDLENBQUMsOEJBQThCO1lBQ2xDLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FDMUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNQLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNO1lBQ3JDLElBQUksQ0FBQyxXQUFXO2dCQUNoQixJQUFJLENBQUMsb0JBQW9CLENBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxtQkFBbUIsQ0FDbkQsQ0FDSixDQUFDO1FBRUYsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUNELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFDeEQsSUFBSSxDQUFDLFlBQVksRUFDakIsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSx3QkFBd0I7UUFDMUIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELElBQUksOEJBQThCO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsR0FBRyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUNkLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDO0lBQ0QsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07WUFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUN4QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHdCQUF3QixFQUN4RCx3QkFBd0IsQ0FDekIsQ0FBQztJQUNOLENBQUM7SUFDRCxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixzQkFBc0IsRUFDdEQsc0JBQXNCLENBQ3ZCLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUN4QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHdCQUF3QixFQUN4RCx3QkFBd0IsQ0FDekIsQ0FBQztJQUNOLENBQUM7SUFDRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWTtZQUNoQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO1lBQ3JELENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQ3hCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsd0JBQXdCLEVBQ3hELHdCQUF3QixDQUN6QixDQUFDO0lBQ04sQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO1lBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7WUFDckQsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FDeEIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQix3QkFBd0IsRUFDeEQsd0JBQXdCLENBQ3pCLENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSxxQkFBcUI7UUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNELEtBQUs7WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM1QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQ2Ysc0JBQXNCLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUN4QjtTQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQy9DLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FDbkMsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLHlCQUF5QjtRQUMzQixPQUFPLENBQ0wsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDMUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ2xELElBQUksSUFBSSxDQUNWLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDaEQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xELENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07WUFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUN4QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHdCQUF3QixFQUN4RCx3QkFBd0IsQ0FDekIsQ0FBQztRQUNKLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUTtZQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1lBQzVELENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQ3hCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsd0JBQXdCLEVBQ3hELHdCQUF3QixDQUN6QixDQUFDO1FBQ0osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDcEQsT0FBTyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsSUFBSSwrQkFBK0I7UUFDakMsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLGtCQUFrQjtZQUNoRCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUN4QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNCQUFzQixFQUN0RCxzQkFBc0IsQ0FDdkI7WUFDRCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQy9CLENBQUM7SUFDRCxJQUFJLDBCQUEwQjtRQUM1QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQiwwQkFBMEIsRUFDMUQscUJBQXFCLENBQ3RCLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSw4QkFBOEI7UUFDaEMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsOEJBQThCLEVBQzlELDBCQUEwQixDQUMzQixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksY0FBYztRQUNoQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNuRCxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQ2pDLElBQUksRUFBRyxJQUFJLENBQUMsSUFBNEIsSUFBSSxNQUFNO1NBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNELElBQUksV0FBVztRQUNiLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjO2FBQy9CLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUN6QixNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQW1CLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQztRQUNqRSxNQUFNLElBQUksR0FBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxFQUFFLENBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN4RSxNQUFNLElBQUksR0FBWSxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUNuRCxNQUFNLElBQUksR0FBWSxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPO1lBQ0wsSUFBSSxFQUFFLHVDQUF1QztZQUM3QyxzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGtCQUFrQixFQUFFLDZCQUE2QjtZQUNqRCxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixxQkFBcUI7WUFDakUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsb0JBQW9CO1NBQ3BELENBQUM7SUFDcEIsQ0FBQztJQUNELElBQUksVUFBVTtRQUNaLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzlDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLFdBQVcsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDeEQsQ0FBQztJQUNELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxPQUFPO1lBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCO1lBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDO0lBQ0QsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsWUFBWSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQ2xGLEVBQUUsRUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQy9ELENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxzQkFBc0I7UUFDeEIsT0FBTyxDQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDeEUsSUFBSSxDQUNMLENBQUM7SUFDSixDQUFDO0lBQ0QsU0FBUyxDQUFDLENBQVMsRUFBRSxJQUFvQjtRQUN2QyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUNELFlBQVksQ0FBQyxDQUFTLEVBQUUsSUFBc0I7UUFDNUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxLQUE0QztRQUM3RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQzdCLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFDRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDM0MsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUNELHFCQUFxQixDQUFDLEtBQWlDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDN0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUNoQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztJQUNELDJCQUEyQixDQUFDLEtBQWE7UUFDdkMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLENBQUM7SUFDN0UsQ0FBQztJQUNELGdDQUFnQztRQUM5QixPQUFPLENBQ0wsSUFBSSxDQUFDLGtCQUFrQixLQUFLLElBQUk7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUNqRCxDQUFDO0lBQ0osQ0FBQztJQUNELGdCQUFnQixDQUFDLEtBQWE7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDRCxlQUFlLENBQUMsS0FBZ0IsRUFBRSxLQUFhO1FBQzdDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBbUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNoRCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzVDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUM5QixLQUFLLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQ3ZCLENBQUM7SUFDSixDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdkUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQy9DLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQ3ZELENBQUM7UUFDRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUNELGNBQWMsQ0FBQyxLQUFjO1FBQzNCLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdkUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVztZQUN4QyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO1lBQ3hDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDckIsQ0FBQyxDQUFDO29CQUNBLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO29CQUMvRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVztpQkFDbEQ7Z0JBQ0QsQ0FBQyxDQUFDLElBQUk7U0FDVCxDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7UUFDcEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztRQUNwQyxJQUFJLENBQUMsa0JBQWtCLEdBQUc7WUFDeEIsTUFBTSxFQUFFLFdBQVc7WUFDbkIsWUFBWSxFQUFFLFdBQVc7WUFDekIsYUFBYSxFQUFFLFdBQVc7U0FDM0IsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjO1lBQ2pCLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUNELDJCQUEyQjtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDcEMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztRQUNwQyxJQUFJLENBQUMsa0JBQWtCLEdBQUc7WUFDeEIsTUFBTSxFQUFFLFdBQVc7WUFDbkIsWUFBWSxFQUFFLFdBQVc7WUFDekIsYUFBYSxFQUFFLFdBQVc7U0FDM0IsQ0FBQztJQUNKLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxJQUFvQjtRQUNyQyxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBQ0QscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsOEJBQThCLENBQUMsS0FBOEI7UUFDM0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBQ0Qsc0JBQXNCLENBQUMsTUFBYztRQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQzdFLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUc7WUFDdEIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3hCO2dCQUNFLE1BQU07Z0JBQ04sS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLEtBQUssRUFBRSxXQUFXO2dCQUNsQixRQUFRLEVBQUUsSUFBSTthQUNmO1NBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUNELDBCQUEwQjtRQUN4QixNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUNqRCxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FDckQsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQzNDLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHO1lBQ3RCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjtZQUN4QixHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDbEIsS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLEtBQUssRUFBRSxXQUFXO2dCQUNsQixRQUFRLEVBQUUsSUFBSTthQUNmLENBQUMsQ0FBQztTQUNKLENBQUM7UUFDRixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLENBQUM7SUFDRCx3QkFBd0I7UUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsNkJBQTZCLENBQUMsR0FBYTtRQUN6QyxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FDN0IsR0FBRzthQUNBLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FDNUMsQ0FBQztRQUNGLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUM1RCxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDakMsQ0FBQztRQUNGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQzlCLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDM0MsQ0FBQztRQUNGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0I7YUFDL0MsTUFBTSxDQUNMLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQ3ZFO2FBQ0EsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2xCLEtBQUssRUFBRSxXQUFXO1lBQ2xCLEtBQUssRUFBRSxXQUFXO1lBQ2xCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLGVBQWUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFDO1FBRWhFLElBQ0UsSUFBSSxDQUFDLHVCQUF1QjtZQUM1QixDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQ2xELENBQUM7WUFDRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUNELHVCQUF1QixDQUFDLE1BQWMsRUFBRSxLQUFhO1FBQ25ELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsdUJBQXVCLENBQUMsTUFBYyxFQUFFLEtBQWE7UUFDbkQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCxxQkFBcUIsQ0FBQyxNQUFjO1FBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUNsRCxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQ2pDLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUNELHNCQUFzQixDQUFDLE1BQWM7UUFDbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxNQUFNLENBQUM7UUFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHO1lBQ3hCLE1BQU07WUFDTixZQUFZLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVztZQUNuRSxhQUFhLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVztTQUM5RCxDQUFDO0lBQ0osQ0FBQztJQUNELHVCQUF1QjtRQUNyQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxrQkFBa0IsR0FBRztZQUN4QixNQUFNLEVBQUUsV0FBVztZQUNuQixZQUFZLEVBQUUsV0FBVztZQUN6QixhQUFhLEVBQUUsV0FBVztTQUMzQixDQUFDO0lBQ0osQ0FBQztJQUNELDhCQUE4QixDQUFDLEtBQWE7UUFDMUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDN0MsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUNELHFCQUFxQjtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDbEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ3RELFFBQVEsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUNELHNCQUFzQixDQUFDLE1BQWM7UUFDbkMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLEtBQUssTUFBTSxDQUFDO0lBQ2pELENBQUM7SUFDRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7WUFDeEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVztZQUN4QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO2dCQUMzQyxDQUFDLENBQUM7b0JBQ0EsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRTtvQkFDL0MsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7aUJBQ2xEO2dCQUNELENBQUMsQ0FBQyxJQUFJO1NBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELGVBQWUsQ0FBQyxPQUF3QixRQUFRO1FBQzlDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUN4RSxDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxlQUFlO1lBQ2xCLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU07Z0JBQ25ELENBQUMsQ0FBQyxXQUFXO2dCQUNiLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDZixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFDRCw0QkFBNEI7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxJQUFxQjtRQUN2QyxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0QsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDO0lBQ0Qsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsK0JBQStCLENBQUMsS0FBOEI7UUFDNUQsSUFBSSxDQUFDLG1CQUFtQixDQUN0QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUN2RCxDQUFDO0lBQ0osQ0FBQztJQUNELDhCQUE4QixDQUFDLEdBQWE7UUFDMUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlELE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDekQsQ0FBQztRQUVGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxPQUFPLENBQ0wsT0FBTyxJQUFJO2dCQUNULEtBQUs7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUM7YUFDN0MsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBQ0Qsd0JBQXdCLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDbkQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUMzRCxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUs7WUFDbEIsQ0FBQyxDQUFDO2dCQUNBLEdBQUcsSUFBSTtnQkFDUCxLQUFLLEVBQUUsS0FBSzthQUNiO1lBQ0QsQ0FBQyxDQUFDLElBQUksQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUNELGVBQWU7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xELE9BQU87Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVU7Z0JBQ25GLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTTtnQkFDckIsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLElBQUksS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVO2FBQ3JELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxJQUF3QjtRQUN6QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxXQUFXLENBQUM7UUFDeEMsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQ3hELENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUNyQixDQUFDO1FBQ0osQ0FBQzthQUFNLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO0lBQ3BDLENBQUM7SUFDRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxXQUFXLENBQUM7SUFDMUMsQ0FBQztJQUNELHVCQUF1QixDQUFDLEVBQVU7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FDL0MsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixFQUFFLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFDRCxpQ0FBaUMsQ0FBQyxHQUFhO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELHNCQUFzQixDQUFDLEtBQW9CO1FBQ3pDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMvQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsS0FBSyxDQUFDLGFBQW9DLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFDRCxxQkFBcUI7UUFDbkIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLENBQUMsS0FBSztnQkFDVjtvQkFDRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7b0JBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2lCQUNsQjthQUNGLENBQUMsQ0FDSCxDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztpQkFDckUsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDN0QsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsS0FBSyxFQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVTtnQkFDckYsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTTtnQkFDdEQsS0FBSyxFQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUs7b0JBQzlCLElBQUksQ0FBQyxXQUFXO29CQUNoQixJQUFJLENBQUMsSUFBSTthQUNaLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUN6RCxDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQ3ZELENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FDMUQsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELGFBQWEsQ0FBQyxLQUFjO1FBQzFCLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2YsWUFBWSxFQUFFLE9BQU8sRUFBRSxZQUFZLElBQUksV0FBVztZQUNsRCxZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksSUFBSSxXQUFXO1lBQ2xELFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLHFCQUFxQjtTQUNyRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBQ0QsY0FBYztRQUNaLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixZQUFZLEVBQUUsV0FBVztZQUN6QixZQUFZLEVBQUUsV0FBVztZQUN6QixRQUFRLEVBQUUscUJBQXFCO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsTUFBYztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVk7WUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBQ0QsNkJBQTZCLENBQUMsR0FBYTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO1lBQ3pCLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQztRQUV6RixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsTUFBYztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVk7WUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsRSxDQUFDO0lBQ0QsNkJBQTZCLENBQUMsR0FBYTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO1lBQ3pCLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQztJQUMzRixDQUFDO0lBQ0QsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLElBQUksR0FBMkI7WUFDbkMsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWTtZQUN6QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO1lBQ3pDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7U0FDbEMsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ25DLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQ2xFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ2hFLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELGFBQWEsQ0FBQyxLQUFjO1FBQzFCLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlELElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxXQUFXO1lBQ3RDLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7WUFDMUQsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLElBQUksc0JBQXNCO1NBQ3hELENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFDRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2YsTUFBTSxFQUFFLFdBQVc7WUFDbkIsWUFBWSxFQUFFLFdBQVc7WUFDekIsU0FBUyxFQUFFLHNCQUFzQjtTQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUNELGdCQUFnQixDQUFDLGVBQXVCO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4RCxNQUFNLGVBQWUsR0FDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07WUFDckMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRXJFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLGVBQWU7WUFDM0MsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBQ0QsdUJBQXVCLENBQUMsR0FBYTtRQUNuQyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsQ0FBQztRQUVuRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztZQUMxQyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQTJCO1lBQ25DLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07WUFDN0IsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxJQUFJLFNBQVM7WUFDdEQsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUztTQUNwQyxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDcEUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQzFFLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELGVBQWUsQ0FBQyxLQUFjO1FBQzVCLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxlQUFlO1lBQ2xCLE9BQU8sRUFBRSxTQUFTLEtBQUssa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDL0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUNyRixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHO1lBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZTtZQUMxQixNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxXQUFXO1lBQ3RDLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLHVCQUF1QjtZQUN0RCxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsSUFBSSx3QkFBd0I7WUFDekQsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLElBQUksS0FBSztZQUNwQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsSUFBSSx5QkFBeUI7WUFDMUQsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksV0FBVztZQUNwQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVztZQUN0RCxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVc7WUFDakQsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXO1lBQy9DLGFBQWEsRUFBRSxPQUFPLEVBQUUsYUFBYSxJQUFJLFdBQVc7WUFDcEQsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixJQUFJLFdBQVc7U0FDM0QsQ0FBQztRQUNGLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUNELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNqQixJQUFJLEVBQUUsV0FBVztZQUNqQixNQUFNLEVBQUUsV0FBVztZQUNuQixRQUFRLEVBQUUsdUJBQXVCO1lBQ2pDLFNBQVMsRUFBRSx3QkFBd0I7WUFDbkMsUUFBUSxFQUFFLEtBQUs7WUFDZixTQUFTLEVBQUUseUJBQXlCO1lBQ3BDLEtBQUssRUFBRSxXQUFXO1lBQ2xCLFVBQVUsRUFBRSxXQUFXO1lBQ3ZCLFlBQVksRUFBRSxXQUFXO1lBQ3pCLFVBQVUsRUFBRSxXQUFXO1lBQ3ZCLGFBQWEsRUFBRSxXQUFXO1lBQzFCLGdCQUFnQixFQUFFLFdBQVc7U0FDOUIsQ0FBQztRQUNGLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxNQUFjO1FBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTTtZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzVELElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFDRCw4QkFBOEIsQ0FBQyxHQUFhO1FBQzFDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FDZCxPQUFPLGNBQWMsS0FBSyxRQUFRO1lBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsY0FBYyxDQUFDLElBQUksV0FBVztZQUNqRSxDQUFDLENBQUMsV0FBVyxDQUFDO1FBRWxCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBQ08sMEJBQTBCO1FBQ2hDLE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLHVCQUF1QixDQUFDO1FBQ2xFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO0lBQy9DLENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxJQUFxQjtRQUN2QyxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN4RCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3BELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFFNUIsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFDRCxzQkFBc0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdEMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUNELHVCQUF1QjtRQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO0lBQy9DLENBQUM7SUFDRCxzQkFBc0I7UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQztRQUU3QyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcseUJBQXlCLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxJQUFxQjtRQUN0QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxHQUFHLHVCQUF1QixDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLHlCQUF5QixDQUFDO1FBQ3ZELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7UUFDaEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUNELCtCQUErQixDQUFDLEtBQThCO1FBQzVELElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBQ0QsVUFBVTtRQUNSLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRXpDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELG1CQUFtQixDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsT0FBTyxDQUFDLEtBQUs7WUFDWCxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxZQUFZLENBQUMsS0FBYTtRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsVUFBVSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELGFBQWEsQ0FBQyxLQUFhO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxXQUFXLENBQUMsS0FBYTtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsVUFBVSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELFlBQVksQ0FBQyxLQUFhO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsVUFBVTtRQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELFlBQVk7UUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsWUFBWTtRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELFlBQVk7UUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDTyxvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFDTyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNPLGVBQWU7UUFDckIsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQ3hCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQzNFLENBQUM7UUFDRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUM1QyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FDM0IsRUFDRCxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FDckIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsS0FBSyxFQUNILElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO2dCQUNsQixJQUFJLENBQUMsa0JBQWtCLENBQ3JCLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBa0MsQ0FDNUQ7WUFDSCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNO1lBQ3pELEtBQUssRUFDSCxJQUFJLENBQUMsS0FBSztnQkFDVixVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXO2dCQUN2QyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJO1NBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQztRQUNoRCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUN2RSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FDM0MsQ0FBQztRQUNGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQ2hDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQ25ELENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDNUMsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsY0FBYyxLQUFLLEtBQUssQ0FBQztRQUNyRCxDQUFDLENBQUMsRUFDRixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUNmLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FDMUQsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ2hDLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUNsRCxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMvQixNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMxQyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxJQUFJLE1BQU0sQ0FBQyxjQUFjLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDM0csQ0FBQyxDQUFDLEVBQ0YsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksSUFBSSxXQUFXLEVBQUUsQ0FDekUsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQy9ELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUMvRSxDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDaEQsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUM1QyxXQUFXLENBQUMsR0FBRyxDQUNiLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksV0FBVyxDQUFDLENBQ3pFLENBQ0YsRUFDRCxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FDakYsQ0FBQztRQUNGLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ25DLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMxQyxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN6RCxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDL0QsQ0FBQyxDQUFDLEVBQ0YsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FDdkUsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDbEUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNQLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDekMsQ0FBQztZQUNELE9BQU8sa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFDTyxxQkFBcUI7UUFDM0IsTUFBTSxjQUFjLEdBQ2xCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FDcEM7YUFDRSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO2FBQy9CLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSztZQUNqQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDaEIsQ0FBQyxDQUFDLENBQUM7UUFDTixJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQixPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxnQkFBZ0IsR0FBRztZQUN2QixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLEtBQUssRUFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVO29CQUMxQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFVBQVU7b0JBQ2hDLElBQUksQ0FBQyxNQUFNO2dCQUNiLE1BQU0sRUFDSixJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVO29CQUMxQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFVBQVU7b0JBQ2hDLENBQUMsSUFBSSxDQUFDLFFBQVE7d0JBQ1osQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDcEcsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzNDLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1NBQ0osQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNPLHVCQUF1QixDQUM3QixXQUFxQixFQUNyQixNQUFjO1FBRWQsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7YUFDNUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDWixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNkLElBQUksRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDdEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLFFBQVEsRUFBRSxPQUFnQjtnQkFDMUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsRUFBRSxVQUFVO2dCQUNyRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2hCLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQzFDLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUM7UUFDSixDQUFDLENBQUM7YUFDRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FDekcsQ0FBQztJQUNOLENBQUM7SUFDTyx3QkFBd0IsQ0FDOUIsS0FBdUMsRUFDdkMsV0FBcUIsRUFDckIsTUFBYyxFQUNkLFFBQVEsR0FBRyxJQUFJO1FBRWYsT0FBTyxLQUFLO2FBQ1QsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDWixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNkLElBQUksRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDdEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLFFBQVEsRUFBRSxRQUFpQjtnQkFDM0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUN4QixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDbkIsUUFBUSxFQUFFLFFBQVE7b0JBQ2hCLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ2xDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUs7Z0JBQ2pDLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUM7UUFDSixDQUFDLENBQUM7YUFDRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FDekcsQ0FBQztJQUNOLENBQUM7SUFDTyx3QkFBd0IsQ0FDOUIsS0FBdUM7UUFFdkMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDeEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRWxELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLFVBQVUsSUFBSSxDQUFDO2dCQUNuQixLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7Z0JBQ2hELFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDN0IsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUM3QixnQkFBZ0IsRUFBRSxzQkFBc0I7Z0JBQ3hDLGdCQUFnQixFQUFFLHNCQUFzQjtnQkFDeEMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksV0FBVztnQkFDbkMsVUFBVSxFQUFFLDhCQUE4QjtnQkFDMUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLO2FBQ25CLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDTyx1QkFBdUIsQ0FDN0IsS0FBc0M7UUFFdEMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFeEQsT0FBTztnQkFDTCxFQUFFLEVBQUUsS0FBSyxHQUFHLENBQUM7Z0JBQ2IsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO2dCQUM3QyxXQUFXLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQzFCLFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDN0IsZ0JBQWdCLEVBQUUsc0JBQXNCO2dCQUN4QyxnQkFBZ0IsRUFBRSxzQkFBc0I7Z0JBQ3hDLEtBQUssRUFDSCxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLFVBQVU7b0JBQ3ZELENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVztvQkFDbEIsQ0FBQyxDQUFDLFdBQVc7Z0JBQ2pCLFVBQVUsRUFBRSw4QkFBOEI7Z0JBQzFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSzthQUNsQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ08sNkJBQTZCLENBQUMsR0FBYTtRQUNqRCxPQUFPLEdBQUc7YUFDUCxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNqRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNPLGdDQUFnQyxDQUFDLEdBQWE7UUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBQ08sc0JBQXNCLENBQUMsVUFBa0I7UUFDL0MsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUNsRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQ3BDLENBQUM7UUFFRixPQUFPLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBQ08seUJBQXlCLENBQUMsRUFBVTtRQUMxQyxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3hELENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQ3BDLENBQUM7UUFFRixPQUFPLElBQUksRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFDTyw0QkFBNEIsQ0FBQyxHQUFhO1FBQ2hELE9BQU8sR0FBRzthQUNQLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQy9DLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ08sdUJBQXVCLENBQUMsTUFBYztRQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUMvQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQ2hDLENBQUM7UUFFRixPQUFPLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBQ08sMkJBQTJCLENBQUMsRUFBVTtRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUNPLGFBQWEsQ0FBQyxNQUFnQixFQUFFLE1BQWM7UUFDcEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQ2pELENBQUM7SUFDSixDQUFDO0lBQ08sU0FBUyxDQUFDLEtBQWE7UUFDN0IsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7YUFDakIsU0FBUyxDQUFDLEtBQUssQ0FBQzthQUNoQixPQUFPLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO2FBQy9CLFdBQVcsRUFBRTthQUNiLElBQUksRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNPLG1CQUFtQixDQUFDLE1BQWdCLEVBQUUsS0FBYTtRQUN6RCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDTywrQkFBK0IsQ0FDckMsWUFBb0I7UUFFcEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQzNDLENBQUM7UUFDRixJQUFJLFlBQVksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM3QixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDTyx3QkFBd0IsQ0FDOUIsTUFBc0M7UUFFdEMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFMUUsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUVELElBQUksa0JBQWtCLEtBQUssVUFBVSxJQUFJLGtCQUFrQixLQUFLLE1BQU0sSUFBSSxrQkFBa0IsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM3RyxPQUFPO2dCQUNMLE9BQU87Z0JBQ1AsV0FBVztnQkFDWCxjQUFjO2dCQUNkLHVCQUF1QjtnQkFDdkIsV0FBVztnQkFDWCxvQkFBb0I7Z0JBQ3BCLFNBQVM7Z0JBQ1QsT0FBTztnQkFDUCxXQUFXO2FBQ1osQ0FBQztRQUNKLENBQUM7UUFFRCxJQUNFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxrQkFBa0IsS0FBSyxNQUFNLEVBQzdCLENBQUM7WUFDRCxPQUFPO2dCQUNMLE9BQU87Z0JBQ1AsV0FBVztnQkFDWCxjQUFjO2dCQUNkLHVCQUF1QjtnQkFDdkIsV0FBVztnQkFDWCxvQkFBb0I7Z0JBQ3BCLFNBQVM7Z0JBQ1QsSUFBSTtnQkFDSixPQUFPO2dCQUNQLFdBQVc7YUFDWixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU87WUFDTCxPQUFPO1lBQ1AsV0FBVztZQUNYLFVBQVU7WUFDVixrQkFBa0I7WUFDbEIsYUFBYTtZQUNiLFdBQVc7WUFDWCxJQUFJO1lBQ0osT0FBTztZQUNQLFdBQVc7U0FDWixDQUFDO0lBQ0osQ0FBQztJQUNPLGFBQWEsQ0FBQyxLQUFjO1FBQ2xDLE9BQU87WUFDTCxRQUFRO1lBQ1IsU0FBUztZQUNULFNBQVM7WUFDVCxPQUFPO1lBQ1AsUUFBUTtZQUNSLE1BQU07WUFDTixPQUFPO1NBQ1IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ08sVUFBVSxDQUFDLEtBQWM7UUFDL0IsT0FBTyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FDdkQsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQzVCLENBQUM7SUFDSixDQUFDO0lBQ08sa0JBQWtCLENBQ3hCLEtBQWE7UUFFYixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDbEQsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUMvQixDQUFDO0lBQ0osQ0FBQztJQUNPLG1CQUFtQixDQUN6QixLQUFhO1FBRWIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ25ELENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FDL0IsQ0FBQztJQUNKLENBQUM7SUFDTyxpQkFBaUIsQ0FBQyxLQUFhO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksSUFBSSxLQUFLLENBQUM7SUFDdkQsQ0FBQztJQUNPLHdCQUF3QixDQUFDLEtBQWE7UUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELE9BQU87Z0JBQ0wsT0FBTyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtnQkFDckUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLO2FBQ3JDLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTztZQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRSxVQUFVO1lBQ3pDLFVBQVUsRUFBRSxLQUFLLENBQUMsS0FBSztTQUN4QixDQUFDO0lBQ0osQ0FBQztJQUNPLGdCQUFnQixDQUFDLEtBQWE7UUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25ELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNuRixDQUFDO0lBQ08sa0JBQWtCLENBQUUsOERBQThEO0lBQ3hGLEtBQXVDO1FBRXZDLE1BQU0sV0FBVyxHQUNmLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQztRQUNsRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdELE9BQU87Z0JBQ0wsT0FBTyxFQUFFLFFBQVEsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVztnQkFDekcsVUFBVSxFQUFFLFFBQVEsQ0FBQyxNQUFNLElBQUksbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVc7Z0JBQ2xILFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVzthQUMzQyxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFFLE9BQU87WUFDTCxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXO1lBQ25HLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNqSSxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLO1NBQ3pDLENBQUM7SUFDSixDQUFDO0lBQ08sa0JBQWtCLENBQUMsS0FBYTtRQUN0QyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ08scUJBQXFCO1FBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztJQUM5RSxDQUFDO0lBQ08sb0JBQW9CLENBQzFCLE1BQWMsRUFDZCxZQUFZLEdBQUcsV0FBVztRQUUxQixPQUFPLEdBQUcsTUFBTSxLQUFLLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFDTyxvQkFBb0IsQ0FDMUIsV0FBbUI7UUFFbkIsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdFLE9BQU87WUFDTCxNQUFNO1lBQ04sWUFBWSxFQUNWLFlBQVksS0FBSyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZO1NBQ3BFLENBQUM7SUFDSixDQUFDO0lBQ0QsaUJBQWlCLENBQUMsS0FBdUM7UUFDdkQsTUFBTSxXQUFXLEdBQ2YsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUUsT0FBTyxLQUFLLENBQUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUN4RyxDQUFDO0lBQ08sdUJBQXVCLENBQzdCLEtBQXVDO1FBRXZDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTztZQUNMLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO1lBQ3pDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7WUFDekMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO2dCQUN0QixDQUFDLENBQUM7b0JBQ0EsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7b0JBQ2hFLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO2lCQUNuRDtnQkFDRCxDQUFDLENBQUMsSUFBSTtTQUNULENBQUM7SUFDSixDQUFDO0lBQ08sc0JBQXNCO1FBRzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLEdBQUcsSUFBSTtZQUNQLFdBQVc7U0FDWixDQUFDLENBQUMsQ0FBQztRQUNKLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQzNELE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDTyw0QkFBNEI7UUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25FLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3JDLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQ3pDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUM3QyxDQUFDO1FBQ0YsTUFBTSxjQUFjLEdBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJO1lBQzVCLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUM5QyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0QsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDcEUsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBQ08sb0JBQW9CLENBQUMsS0FBYTtRQUN4QyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDTyx3QkFBd0IsQ0FBQyxLQUFhO1FBQzVDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ08sNkJBQTZCLENBQUMsTUFBZ0M7UUFDcEUsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxRQUFRLElBQUksZUFBZSxFQUFFLENBQUM7WUFDakMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3JCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFDbEQsUUFBUSxDQUFDLFFBQVEsQ0FDbEIsQ0FBQztJQUNKLENBQUM7SUFDTywwQkFBMEIsQ0FBQyxLQUFhO1FBQzlDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQ2Ysc0JBQXNCLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUN4QixDQUFDO0lBQ0osQ0FBQztJQUNPLGtCQUFrQixDQUN4QixLQUFhLEVBQ2IsT0FBbUM7UUFFbkMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxFQUFFLElBQUksSUFBSSxLQUFLLENBQUM7SUFDckUsQ0FBQztJQUNPLHlCQUF5QixDQUFDLE1BQWdDO1FBQ2hFLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVDLE9BQU8sTUFBTSxDQUFDLGdCQUFnQixJQUFJLFdBQVcsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxNQUFNLENBQUMsYUFBYSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQ3JFLEVBQUUsQ0FBQztRQUNQLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNyRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLElBQUksV0FBVyxDQUFDO0lBQ3JDLENBQUM7SUFDTyxpQkFBaUI7UUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEIsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0I7YUFDdEMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzNDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQixNQUFNLEdBQUcsR0FBRztZQUNWLFFBQVE7WUFDUixLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQy9ELFFBQVEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzNDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkIsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRTtTQUMxQixDQUFDO1FBQ0YsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFDTyxhQUFhO1FBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU87YUFDOUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3JCLE1BQU0sU0FBUyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUMzRCxPQUFPLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzNELENBQUMsQ0FBQzthQUNELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDakQsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBQ08sZUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU87WUFDTCxVQUFVO1lBQ1YsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPO2lCQUMvQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1NBQ25CLENBQUM7SUFDSixDQUFDO0lBQ08sZUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU87WUFDTCxVQUFVO1lBQ1YsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPO2lCQUMvQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7aUJBQy9ELElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtTQUNuQixDQUFDO0lBQ0osQ0FBQztJQUNPLGdCQUFnQixDQUFDLE1BR3hCO1FBQ0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2pGLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxPQUFPLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDbkUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMvRSxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLElBQUksV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUMvRCxDQUFDO0lBQ08sY0FBYyxDQUFDLElBQTRCO1FBQ2pELE9BQU8sUUFBUSxJQUFJLENBQUMscUJBQXFCLENBQ3ZDLElBQUksQ0FDTCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUM3RSxJQUFJLENBQUMsUUFBUSxDQUNkLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFDTyxxQkFBcUIsQ0FBQyxJQUE0QjtRQUN4RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDL0MsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLEtBQUssQ0FDOUMsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ08sZ0JBQWdCLENBQUMsS0FBYTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDOUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FDdEMsRUFBRSxLQUFLLENBQUM7UUFDVCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ25FLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUMzRCxDQUFDO0lBQ08sZUFBZSxDQUFDLEtBQXVDO1FBQzdELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUMzQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDN0IsWUFBWSxFQUFFLGVBQWUsQ0FBQyxRQUFRLENBQUMsWUFBWTtnQkFDbkQsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNO2dCQUM5QixLQUFLLEVBQ0gsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksVUFBVTtvQkFDcEQsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVO29CQUMzQyxXQUFXO2FBQ2QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDNUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDdEQsQ0FBQztJQUNPLGtCQUFrQixDQUFDLElBQWdDO1FBQ3pELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMzRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDakMsT0FBTyxLQUFLO1lBQ1YsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLElBQUksUUFBUSxRQUFRLEtBQUssRUFBRTtZQUNsRCxDQUFDLENBQUMsR0FBRyxrQkFBa0IsSUFBSSxRQUFRLEdBQUcsQ0FBQztJQUMzQyxDQUFDO0lBQ08sY0FBYyxDQUFDLElBQTRCO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7WUFDL0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQ1osR0FBRyxDQUFDO0lBQ1AsQ0FBQztJQUNPLHNCQUFzQixDQUFDLEtBQWE7UUFDMUMsT0FBTyxDQUNMO1lBQ0UsTUFBTSxFQUFFLEdBQUc7WUFDWCxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FDbEIsQ0FBQztJQUNKLENBQUM7SUFDTyxnQkFBZ0IsQ0FBQyxNQUFnQztRQUN2RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztZQUM1QyxPQUFPLElBQUksTUFBTSxDQUFDLGdCQUFnQixJQUFJLFdBQVcsR0FBRyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEMsT0FBTyxHQUFHLEtBQUssVUFBVSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsT0FBTyxHQUFHLEtBQUssY0FBYyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ2hELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQ2pFLENBQUM7WUFDRixPQUFPLEdBQUcsS0FBSyxRQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sR0FBRyxLQUFLLFlBQVksSUFBSSxDQUFDLHFCQUFxQixDQUNuRCxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxRQUFRLEVBQ2YsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNuQixRQUFRLElBQUksQ0FBQyxxQkFBcUIsQ0FDakMsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsUUFBUSxFQUNmLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDbkIsRUFBRSxDQUFDO1FBQ04sQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxPQUFPLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FDOUMsTUFBTSxDQUFDLFFBQVEsQ0FDaEIsS0FBSyxNQUFNLENBQUMsYUFBYSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFPLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FDOUMsTUFBTSxDQUFDLFFBQVEsQ0FDaEIsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQ2xGLENBQUM7SUFDTyx3QkFBd0IsQ0FBQyxLQUFhO1FBQzVDLE9BQU8sQ0FDTDtZQUNFLEtBQUssRUFBRSxHQUFHO1lBQ1YsU0FBUyxFQUFFLElBQUk7WUFDZixPQUFPLEVBQUUsR0FBRztZQUNaLFlBQVksRUFBRSxHQUFHO1lBQ2pCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixJQUFJLEVBQUUsR0FBRztZQUNULFNBQVMsRUFBRSxHQUFHO1lBQ2QsYUFBYSxFQUFFLElBQUk7WUFDbkIsa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixRQUFRLEVBQUUsTUFBTTtZQUNoQixnQkFBZ0IsRUFBRSxVQUFVO1lBQzVCLFdBQVcsRUFBRSxNQUFNO1lBQ25CLFNBQVMsRUFBRSxNQUFNO1NBQ2xCLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUNsQixDQUFDO0lBQ0osQ0FBQztJQUNPLHFCQUFxQixDQUMzQixXQUFtQixFQUNuQixRQUFnQixFQUNoQixLQUFjO1FBRWQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsQ0FBQztRQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckQsSUFBSSxNQUFNLEVBQUUsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sV0FBVyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDeEQsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FDdkUsUUFBUSxDQUNULEVBQUUsQ0FBQztZQUNGLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ08saUJBQWlCLENBQUMsUUFBZ0IsRUFBRSxLQUFhO1FBQ3ZELElBQUksUUFBUSxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQy9CLE9BQU8sR0FBRyxLQUFLLEdBQUcsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLFFBQVEsS0FBSyxVQUFVLElBQUksUUFBUSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDL0QsT0FBTyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDTyxhQUFhLENBQUMsS0FBYTtRQUNqQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUMxQyxDQUFDO0lBQ08sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FDdEQsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixzQkFBc0IsRUFDdEQsUUFBUSxDQUNULENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQ3RELEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsb0JBQW9CLEVBQ3BELE9BQU8sQ0FDUixDQUFDO1FBQ0YsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUNPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQ3RELEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsMEJBQTBCLEVBQzFELFFBQVEsQ0FDVCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUN0RCxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNCQUFzQixFQUN0RCxzQkFBc0IsQ0FDdkIsQ0FBQztRQUNGLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFDTyxzQkFBc0I7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FDNUIsQ0FBQyxFQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQzlCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDaEIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1NBQ2xCLENBQUMsQ0FBQyxDQUNKLENBQUM7UUFDRixJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBQ08sMkJBQTJCO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUN4QyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsVUFBVSxDQUN6QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FDakMsQ0FBQyxFQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQ25DLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUNPLDJCQUEyQjtRQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDeEMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FDOUMsQ0FBQztRQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQ2pDLENBQUMsRUFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUNuQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDaEMsQ0FBQztJQUNKLENBQUM7SUFDTyw4QkFBOEI7UUFDcEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDM0MsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ2xELENBQUM7UUFDRixJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUNwQyxDQUFDLEVBQ0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFDdEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ2hDLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBWSxtQkFBbUI7UUFDN0IsT0FBTyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDdEUsQ0FBQztJQUNPLG1CQUFtQixDQUFDLEtBQWE7UUFDdkMsT0FBTyxLQUFLO2FBQ1QsS0FBSyxDQUFDLEdBQUcsQ0FBQzthQUNWLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ08sa0JBQWtCLENBQUMsS0FBb0M7UUFDN0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUk7YUFDckIsS0FBSyxDQUFDLFVBQVUsQ0FBQzthQUNqQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkIsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sS0FBSztpQkFDVCxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxXQUFXLENBQUM7aUJBQ3BELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQzthQUNqRCxLQUFLLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDO2FBQzFCLFdBQVcsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFDTyx5QkFBeUIsQ0FBQyxVQUFrQjtRQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQzlELENBQUM7SUFDTyxjQUFjLENBQUMsVUFBa0IsRUFBRSxLQUFhO1FBQ3RELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QseUJBQXlCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7WUFDcEQsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hGLElBQ0UsY0FBYztZQUNkLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7aUJBQ3hFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztpQkFDekIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFDakMsQ0FBQztZQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1lBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO1lBQ3BELE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBQ08sa0JBQWtCO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQztRQUMzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sTUFBTTtZQUNYLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLElBQUksTUFBTSxFQUFFO1lBQ3JELENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDO0lBQzNDLENBQUM7SUFDTyx1QkFBdUI7UUFDN0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBQ08sdUJBQXVCO1FBQzdCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU87WUFDTCxZQUFZO1lBQ1osS0FBSyxFQUFFLENBQ0wsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FDeEUsQ0FBQyxJQUFJLEVBQUU7U0FDVCxDQUFDO0lBQ0osQ0FBQztJQUNPLG9CQUFvQixDQUMxQixNQUFjLEVBQ2QsS0FBdUM7UUFFdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUN6RCxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU07WUFDcEIsQ0FBQyxDQUFDO2dCQUNBLEdBQUcsSUFBSTtnQkFDUCxHQUFHLEtBQUs7YUFDVDtZQUNELENBQUMsQ0FBQyxJQUFJLENBQ1QsQ0FBQztJQUNKLENBQUM7SUFDTyw4QkFBOEIsQ0FDcEMsTUFBaUMsRUFDakMsU0FBdUM7UUFFdkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekIsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sQ0FBQyxRQUFRLEdBQUc7b0JBQ2pCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtvQkFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2lCQUNsQixDQUFDO1lBQ0osQ0FBQztZQUNELGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ08sMEJBQTBCLENBQ2hDLE1BQWlDO1FBRWpDLE9BQU8sTUFBTTthQUNWLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO2FBQ3ZELEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNkLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO1lBQ2hFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixLQUFLLEVBQ0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksaURBQWlEO2dCQUNqRixJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLGlEQUFpRDtnQkFDdkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDL0UsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBQ08sT0FBTyxDQUFDLEtBQWE7UUFDM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFFNUIsT0FBTyxLQUFLLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDdkQsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNiLENBQUM7UUFFRCxPQUFPLEdBQUcsR0FBRyxLQUFLLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDekQsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDTyxnQkFBZ0IsQ0FDdEIsS0FBVSxFQUNWLFdBQWdDO1FBRWhDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFhLENBQUM7UUFDakMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMxRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNPLFdBQVcsQ0FBQyxLQUFhO1FBQy9CLE9BQU8sS0FBSzthQUNULFdBQVcsRUFBRTthQUNiLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO0lBQ08sbUJBQW1CLENBQUMsR0FBVyxFQUFFLFFBQWdCO1FBQ3ZELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sVUFBVSxJQUFJLFVBQVUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ2xFLENBQUM7SUFDTyxvQkFBb0I7UUFDMUIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1lBRWxFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN0QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxPQUFPO2dCQUNMLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixRQUFRLEVBQUUsV0FBVztnQkFDckIsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUztnQkFDckMsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUTtnQkFDbkMsU0FBUyxFQUFFLGtCQUFrQjtnQkFDN0IsZ0JBQWdCO2FBQ2pCLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLElBQUksR0FBNkI7WUFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTTtZQUMvQixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRO1lBQ25DLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVM7WUFDckMsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUTtZQUNuQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMseUJBQXlCO1NBQzFGLENBQUM7UUFFRixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUMvQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUU1RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQ25DLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFckUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUUvQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFNUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ08sNEJBQTRCO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRXpDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ08sOEJBQThCO1FBQ3BDLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2hELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsRCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUMvQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYTtnQkFDbkMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDbEIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7aUJBQ2hFLE1BQU0sQ0FBQyxPQUFPLENBQUM7aUJBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsa0JBQWtCLEVBQ2xELFdBQVcsQ0FDWixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQUNPLHdCQUF3QjtRQUM5QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN6QyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDM0MsWUFBWSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7WUFDdkQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztZQUNuQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztnQkFDckMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsQ0FBQyxFQUFFLDRCQUE0QixDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ08saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUNPLDRCQUE0QjtRQUNsQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLDBCQUEwQjtZQUM3QixjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDekQsQ0FBQztJQUNPLGVBQWU7UUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGFBQWEsQ0FBQztRQUN4RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQWlDLENBQUM7UUFDNUQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQzlCLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUNoRCxXQUFXLENBQ29CLENBQUM7WUFDbEMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDeEQsT0FBTyxJQUFJLENBQUMsWUFBWTthQUNyQixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ1osR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDOUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDaEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEUsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUN2RCxNQUFNLFVBQVUsR0FDZCxVQUFVLEdBQUcsYUFBYTtnQkFDeEIsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUMvQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRztvQkFDaEIsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUN0QixDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdkMsQ0FBQyxDQUFDO1lBQ04sTUFBTSxRQUFRLEdBQ1osV0FBVyxHQUFHLFlBQVk7Z0JBQ3hCLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQztnQkFDaEQsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkUsT0FBTztnQkFDTCxFQUFFLEVBQUUsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2xELFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTTtnQkFDdkMsSUFBSSxFQUFFLFNBQVM7b0JBQ2IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsR0FBRyxhQUFhLEdBQUcsQ0FBQztvQkFDL0UsQ0FBQyxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsSUFBSTtnQkFDakMsR0FBRyxFQUFFLFNBQVM7b0JBQ1osQ0FBQyxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsR0FBRztvQkFDaEMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLEdBQUcsR0FBRyxnQkFBZ0IsR0FBRyxXQUFXLEdBQUcsQ0FBQzthQUNyRCxDQUFDO1FBQy9CLENBQUMsQ0FBQzthQUNELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBNEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RCxDQUFDO3dHQTd4R1Usd0JBQXdCOzRGQUF4Qix3QkFBd0IsMmRDdlZyQywyNHRGQW93REEsZzgwQkRoOENJLFdBQVcsaWdCQUNYLGVBQWUsNEZBQ2YsZUFBZSw4U0FDZixpQkFBaUIsMEtBQ2pCLG1CQUFtQixrUUFDbkIsaUJBQWlCLHdVQUNqQixpQkFBaUIsbU1BQ2pCLGNBQWMseVFBQ2QsaUJBQWlCLG9yQkFDakIscUJBQXFCLHNKQUVyQixpQkFBaUIsbUpBQ2pCLGdCQUFnQiw0SEFDaEIsaUJBQWlCOzs0RkFNUix3QkFBd0I7a0JBdkJwQyxTQUFTOytCQUNFLHVCQUF1QixjQUNyQixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixtQkFBbUI7d0JBQ25CLGlCQUFpQjt3QkFDakIsaUJBQWlCO3dCQUNqQixjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIscUJBQXFCO3dCQUNyQixjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsZ0JBQWdCO3dCQUNoQixpQkFBaUI7cUJBQ2xCLG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNO3FIQXdDdEMsT0FBTztzQkFBZixLQUFLO2dCQUNPLE1BQU07c0JBQWxCLEtBQUs7Z0JBWWEsWUFBWTtzQkFBOUIsTUFBTTtnQkFFWSxJQUFJO3NCQUF0QixNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBRVUsaUJBQWlCO3NCQURqQyxTQUFTO3VCQUFDLG1CQUFtQjtnQkFHYixlQUFlO3NCQUQvQixZQUFZO3VCQUFDLGdCQUFnQjtnQkEwRjlCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlOztBQThvRy9CLE9BQU8sRUFBRSx3QkFBd0IsSUFBSSwyQkFBMkIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IHsgRFlOQU1JQ19WSUVXX0JVSUxERVJfREVGQVVMVF9UQUJMRV9ST1dTIH0gZnJvbSBcIi4uLy4uL2NvcmUvY29uc3RhbnRzL2R5bmFtaWMtdmlldy1idWlsZGVyLmNvbnN0XCI7XG5pbXBvcnQgeyBERUZBVUxUX01PREFMX1pfSU5ERVggfSBmcm9tIFwiLi4vLi4vY29yZS9jb25zdGFudHMvbW9kYWwuY29uc3RcIjtcbmltcG9ydCB7IGNyZWF0ZUR5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyB9IGZyb20gXCIuLi8uLi9jb3JlL2NvbmZpZy9keW5hbWljLXZpZXctYnVpbGRlci5jb25maWdcIjtcbmltcG9ydCB0eXBlIHsgQmFkZ2VDb2xvciB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL2JhZGdlLnR5cGVcIjtcbmltcG9ydCB0eXBlIHsgU2VsZWN0QnV0dG9uSXRlbSB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL3NlbGVjdC1idXR0b24udHlwZVwiO1xuaW1wb3J0IHR5cGUgeyBQaWNrbGlzdFJlY29yZCB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL3BpY2tsaXN0LnR5cGVcIjtcbmltcG9ydCB0eXBlIHsgVGltZWxpbmVJdGVtLCBUaW1lbGluZVN0ZXBTZWxlY3RFdmVudCB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL3RpbWVsaW5lLnR5cGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgRHluYW1pY1ZpZXdCdWlsZGVyQ29sdW1uT3B0aW9uLFxuICBEeW5hbWljVmlld0J1aWxkZXJDb25maWcsXG4gIER5bmFtaWNWaWV3QnVpbGRlckZpZWxkLFxuICBEeW5hbWljVmlld0J1aWxkZXJGaWVsZEZ1bmN0aW9uLFxuICBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXIsXG4gIER5bmFtaWNWaWV3QnVpbGRlckZpbHRlckNvbm5lY3RvcixcbiAgRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyVmFsdWVUeXBlLFxuICBEeW5hbWljVmlld0J1aWxkZXJGdW5jdGlvbixcbiAgRHluYW1pY1ZpZXdCdWlsZGVySm9pbixcbiAgRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uLFxuICBEeW5hbWljVmlld0J1aWxkZXJTb3J0LFxuICBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbixcbn0gZnJvbSBcIi4uLy4uL2NvcmUvdHlwZXMvZHluYW1pYy12aWV3LWJ1aWxkZXIudHlwZVwiO1xuaW1wb3J0IHR5cGUge1xuICBSb3dCYXNlLFxuICBUYWJsZUNvbHVtbixcbiAgVGFibGVPcHRpb25zLFxufSBmcm9tIFwiLi4vLi4vY29yZS90eXBlcy90YWJsZS50eXBlXCI7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnRcIjtcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ29kZUVkaXRvckNvbXBvbmVudCB9IGZyb20gXCIuLi9jb2RlLWVkaXRvci9jb2RlLWVkaXRvci5jb21wb25lbnRcIjtcbmltcG9ydCB7IENvbWJvYm94Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSW5mb1NpZ25Db21wb25lbnQgfSBmcm9tIFwiLi4vaW5mby1zaWduL2luZm8tc2lnbi5jb21wb25lbnRcIjtcbmltcG9ydCB7IE1vZGFsQ29tcG9uZW50IH0gZnJvbSBcIi4uL21vZGFsL21vZGFsLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgUGlja2xpc3RDb21wb25lbnQgfSBmcm9tIFwiLi4vcGlja2xpc3QvcGlja2xpc3QuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTZWxlY3RCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiLi4vc2VsZWN0LWJ1dHRvbi9zZWxlY3QtYnV0dG9uLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVGFibGVDb21wb25lbnQgfSBmcm9tIFwiLi4vdGFibGUvdGFibGUuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBUZXh0YXJlYUNvbXBvbmVudCB9IGZyb20gXCIuLi90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRleHRib3hDb21wb25lbnQgfSBmcm9tIFwiLi4vdGV4dGJveC90ZXh0Ym94LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVGltZWxpbmVDb21wb25lbnQgfSBmcm9tIFwiLi4vdGltZWxpbmUvdGltZWxpbmUuY29tcG9uZW50XCI7XG50eXBlIFNlbGVjdGlvbk1vZGFsTW9kZSA9IFwidGFibGVzXCIgfCBcImZpZWxkc1wiIHwgXCJncm91cEJ5XCI7XG50eXBlIEJ1aWxkZXJMYXlvdXRNb2RlID0gXCJzdGFja2VkXCIgfCBcInNwbGl0XCI7XG50eXBlIFNvdXJjZU1vZGFsU3RlcCA9IFwic2VsZWN0XCIgfCBcImNvbmZpZ3VyZVwiO1xudHlwZSBGaWVsZE1vZGFsU3RlcCA9IFwic2VsZWN0XCIgfCBcImNvbmZpZ3VyZVwiO1xudHlwZSBGaWx0ZXJNb2RhbFN0ZXAgPSBcInNlbGVjdFwiIHwgXCJjb25maWd1cmVcIiB8IFwicmV2aWV3XCI7XG50eXBlIEJ1aWxkZXJTZWN0aW9uSWQgPVxuICB8IFwidGFibGVzXCJcbiAgfCBcImpvaW5zXCJcbiAgfCBcImdyb3VwQnlcIlxuICB8IFwiZmllbGRzXCJcbiAgfCBcInNvcnRpbmdcIlxuICB8IFwiZmlsdGVyc1wiO1xudHlwZSBGaWx0ZXJNb2RhbE1vZGUgPSBcImNvbmRpdGlvblwiIHwgXCJkb21haW5cIjtcbmludGVyZmFjZSBTZWxlY3Rpb25Sb3cge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIG1ldGE6IHN0cmluZztcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBkYkxhYmVsPzogc3RyaW5nO1xuICB0YWJsZUxhYmVsPzogc3RyaW5nO1xuICBwYXRoVHlwZT86IFwidGFibGVcIiB8IFwiY29sdW1uXCI7XG4gIHByZWZpeD86IHN0cmluZztcbiAgbm90ZT86IHN0cmluZztcbn1cbmludGVyZmFjZSBTb3VyY2VWaWV3SXRlbSB7XG4gIGlkOiBzdHJpbmc7XG4gIGRiTGFiZWw6IHN0cmluZztcbiAgdGFibGVMYWJlbDogc3RyaW5nO1xuICBhbGlhczogc3RyaW5nO1xuICBoYXNDdXN0b21BbGlhczogYm9vbGVhbjtcbn1cbmludGVyZmFjZSBTb3VyY2VNb2RhbERyYWZ0IHtcbiAgdGFibGU6IHN0cmluZztcbiAgYWxpYXM6IHN0cmluZztcbn1cbmludGVyZmFjZSBTb3VyY2VDb25maWd1cmVkSXRlbSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIGRiTGFiZWw6IHN0cmluZztcbiAgdGFibGVMYWJlbDogc3RyaW5nO1xuICBhbGlhczogc3RyaW5nO1xufVxuaW50ZXJmYWNlIEpvaW5WaWV3SXRlbSB7XG4gIGlkOiBzdHJpbmc7XG4gIHNvdXJjZVRhYmxlOiBzdHJpbmc7XG4gIHNvdXJjZUZpZWxkOiBzdHJpbmc7XG4gIG9wZXJhdG9yOiBzdHJpbmc7XG4gIHRhcmdldFRhYmxlOiBzdHJpbmc7XG4gIHRhcmdldEZpZWxkOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgU2ltcGxlVmlld0l0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xufVxuaW50ZXJmYWNlIEZpZWxkVmlld0l0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBzb3VyY2VJbmRleDogbnVtYmVyO1xuICBjb2x1bW46IHN0cmluZztcbiAgb3JkZXJMYWJlbDogc3RyaW5nO1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xuICBhbGlhczogc3RyaW5nO1xuICB3aWR0aDogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgZnVuY3Rpb25MYWJlbDogc3RyaW5nO1xuICBmdW5jdGlvbkFsaWFzOiBzdHJpbmc7XG4gIGhhc0N1c3RvbUNvbmZpZzogYm9vbGVhbjtcbiAgb3JkZXI6IG51bWJlcjtcbn1cbmludGVyZmFjZSBTb3J0Vmlld0l0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgZnVuY3Rpb25MYWJlbDogc3RyaW5nO1xuICBkaXJlY3Rpb246IHN0cmluZztcbn1cbmludGVyZmFjZSBTb3J0U2VsZWN0YWJsZUl0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBjb2x1bW46IHN0cmluZztcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xuICBtZXRhOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgRmlsdGVyVmlld0l0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xuICBvcGVyYXRvckxhYmVsOiBzdHJpbmc7XG4gIHN1YnRpdGxlOiBzdHJpbmc7XG4gIG9wdGlvbmFsOiBib29sZWFuO1xuICBpc0RvbWFpbjogYm9vbGVhbjtcbn1cbmludGVyZmFjZSBGaWx0ZXJSZXZpZXdJdGVtIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgZW1waGFzaXplPzogXCJwYXRoXCIgfCBcImNvZGVcIiB8IFwiZGVmYXVsdFwiO1xufVxuaW50ZXJmYWNlIENvbHVtbkRpc3BsYXlQYXJ0cyB7XG4gIGRiTGFiZWw6IHN0cmluZztcbiAgdGFibGVMYWJlbDogc3RyaW5nO1xuICBmaWVsZExhYmVsOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgVGFibGVEaXNwbGF5UGFydHMge1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbn1cbmludGVyZmFjZSBGaWVsZE1vZGFsQ29uZmlndXJlZEl0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBjb2x1bW46IHN0cmluZztcbiAgdGFibGVMYWJlbDogc3RyaW5nO1xuICBmaWVsZExhYmVsOiBzdHJpbmc7XG4gIGFsaWFzOiBzdHJpbmc7XG4gIHdpZHRoOiBzdHJpbmc7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbkxhYmVsOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQWxpYXM6IHN0cmluZztcbn1cbmludGVyZmFjZSBCdWlsZGVyRmxvd0Fycm93IHtcbiAgaWQ6IHN0cmluZztcbiAgZGlyZWN0aW9uOiBcInJpZ2h0XCIgfCBcImRvd25cIjtcbiAgbGVmdDogbnVtYmVyO1xuICB0b3A6IG51bWJlcjtcbn1cbmludGVyZmFjZSBDb2x1bW5QaWNrbGlzdEl0ZW0gZXh0ZW5kcyBQaWNrbGlzdFJlY29yZCB7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHRpdGxlUHJlZml4OiBzdHJpbmc7XG4gIHRpdGxlU3VmZml4OiBzdHJpbmc7XG4gIHRpdGxlUHJlZml4Q29sb3I6IHN0cmluZztcbiAgdGl0bGVTdWZmaXhDb2xvcjogc3RyaW5nO1xuICBiYWRnZTogc3RyaW5nO1xuICBiYWRnZUNvbG9yOiBCYWRnZUNvbG9yO1xuICBjb2x1bW46IHN0cmluZztcbn1cbmludGVyZmFjZSBTb3J0UGlja2xpc3RJdGVtIGV4dGVuZHMgUGlja2xpc3RSZWNvcmQge1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICB0aXRsZVByZWZpeDogc3RyaW5nO1xuICB0aXRsZVN1ZmZpeDogc3RyaW5nO1xuICB0aXRsZVByZWZpeENvbG9yOiBzdHJpbmc7XG4gIHRpdGxlU3VmZml4Q29sb3I6IHN0cmluZztcbiAgYmFkZ2U6IHN0cmluZztcbiAgYmFkZ2VDb2xvcjogQmFkZ2VDb2xvcjtcbiAgc2VsZWN0aW9uSWQ6IHN0cmluZztcbiAgY29sdW1uOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgVGFibGVQaWNrbGlzdEl0ZW0gZXh0ZW5kcyBQaWNrbGlzdFJlY29yZCB7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHRpdGxlUHJlZml4OiBzdHJpbmc7XG4gIHRpdGxlU3VmZml4OiBzdHJpbmc7XG4gIHRpdGxlUHJlZml4Q29sb3I6IHN0cmluZztcbiAgdGl0bGVTdWZmaXhDb2xvcjogc3RyaW5nO1xuICBiYWRnZTogc3RyaW5nO1xuICBiYWRnZUNvbG9yOiBCYWRnZUNvbG9yO1xuICB0YWJsZTogc3RyaW5nO1xufVxuaW50ZXJmYWNlIFByZXZpZXdDb2x1bW5MaWtlIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgaGVhZGVyPzogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xufVxudHlwZSBEeW5hbWljTW9kYWxEaW1lbnNpb24gPSB7XG4gIHdpZHRoOiBzdHJpbmc7XG4gIGhlaWdodDogc3RyaW5nO1xufTtcblxudHlwZSBEeW5hbWljTW9kYWxEaW1lbnNpb25zTWFwID0ge1xuICBzb3VyY2U6IER5bmFtaWNNb2RhbERpbWVuc2lvbjtcbiAgc2VsZWN0aW9uOiBEeW5hbWljTW9kYWxEaW1lbnNpb247XG4gIGpvaW46IER5bmFtaWNNb2RhbERpbWVuc2lvbjtcbiAgc29ydDogRHluYW1pY01vZGFsRGltZW5zaW9uO1xuICBmaWx0ZXI6IER5bmFtaWNNb2RhbERpbWVuc2lvbjtcbiAgZmllbGQ6IER5bmFtaWNNb2RhbERpbWVuc2lvbjtcbn07XG5jb25zdCBFTVBUWV9WQUxVRSA9IFwiXCI7XG5jb25zdCBERUZBVUxUX0pPSU5fT1BFUkFUT1IgPSBcIkVRVUFMU1wiO1xuY29uc3QgREVGQVVMVF9GVU5DVElPTl9OQU1FID0gXCJjb3VudFwiO1xuY29uc3QgREVGQVVMVF9TT1JUX0RJUkVDVElPTiA9IFwiQVNDXCI7XG5jb25zdCBFTVBUWV9TT1JUX0ZVTkNUSU9OID0gXCJfX2Jhc2VfX1wiO1xuY29uc3QgRkxPV19BUlJPV19JTlNFVCA9IDM7XG5jb25zdCBGTE9XX0FSUk9XX01JTl9HQVAgPSAxMjtcbmNvbnN0IEZMT1dfQVJST1dTX1JFRlJFU0hfREVMQVlfTVMgPSAxMjA7XG5jb25zdCBERUZBVUxUX0ZJTFRFUl9PUEVSQVRPUiA9IFwiRVFVQUxcIjtcbmNvbnN0IERFRkFVTFRfRklMVEVSX0NPTk5FQ1RPUjogRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyQ29ubmVjdG9yID0gXCJBTkRcIjtcbmNvbnN0IERFRkFVTFRfRklMVEVSX1ZBTFVFX1RZUEU6IER5bmFtaWNWaWV3QnVpbGRlckZpbHRlclZhbHVlVHlwZSA9IFwidmFsdWVcIjtcbmNvbnN0IEZJTFRFUl9NT0RFX0RPTUFJTiA9IFwiZG9tYWluXCIgYXMgY29uc3Q7XG5jb25zdCBPVkVSTEFZX0FQUEVORF9UQVJHRVQgPSBcImJvZHlcIjtcbmNvbnN0IE1PREFMX1pfSU5ERVhfT0ZGU0VUID0gMjA7XG5jb25zdCBNT0RBTF9PVkVSTEFZX1pfSU5ERVggPSBERUZBVUxUX01PREFMX1pfSU5ERVggKyBNT0RBTF9aX0lOREVYX09GRlNFVDtcbmNvbnN0IEZJRUxEX1BJQ0tMSVNUX1JPV1MgPSA4O1xuY29uc3QgRklMVEVSX1BJQ0tMSVNUX1JPV1MgPSA5O1xuY29uc3QgVklTVUFMX1NRTF9UQUJMRV9DT0xPUiA9IFwiIzQyNTQ2NlwiO1xuY29uc3QgVklTVUFMX1NRTF9GSUVMRF9DT0xPUiA9IFwiIzFmOGE1MlwiO1xuY29uc3QgUElDS0xJU1RfREFUQV9UWVBFX0JBREdFX0NPTE9SOiBCYWRnZUNvbG9yID0gXCJncmF5XCI7XG5jb25zdCBQSUNLTElTVF9GVU5DVElPTl9CQURHRV9DT0xPUjogQmFkZ2VDb2xvciA9IFwiYmx1ZVwiO1xuY29uc3QgRkFMTEJBQ0tfU0VMRUNUX1RBQkxFUyA9IFwiU2VsZWNpb25hciB0YWJlbGFzXCI7XG5jb25zdCBGQUxMQkFDS19FTVBUWV9TRUxFQ1RJT04gPSBcIk5lbmh1bSBzZWxlY2lvbmFkb1wiO1xuY29uc3QgUFJFVklFV19ST1dTX1BFUl9QQUdFX09QVElPTlMgPSBbNSwgMTAsIDIwXTtcbmNvbnN0IEFMSUFTX01BWF9MRU5HVEggPSAxMjtcbmNvbnN0IE1JTl9QQVJUU19GT1JfREIgPSAzO1xuY29uc3QgREJfUEFSVFNfT0ZGU0VUID0gLTI7XG5jb25zdCBNSU5fUEFSVFNfRk9SX1RBQkxFID0gMjtcbmNvbnN0IEpPSU5fT1BFUkFUT1JfTEFCRUxTOiBSZWNvcmQ8c3RyaW5nLCB7IGtleTogc3RyaW5nOyBmYWxsYmFjazogc3RyaW5nIH0+ID0ge1xuICBFUVVBTFM6IHtcbiAgICBrZXk6IFwiam9pbk9wZXJhdG9ycy5lcXVhbHNcIixcbiAgICBmYWxsYmFjazogXCJJZ3VhbCBhICg9KVwiLFxuICB9LFxuICBOT1RfRVFVQUxTOiB7XG4gICAga2V5OiBcImpvaW5PcGVyYXRvcnMubm90RXF1YWxzXCIsXG4gICAgZmFsbGJhY2s6IFwiRGlmZXJlbnRlIGRlICg8PilcIixcbiAgfSxcbiAgR1JFQVRFUl9USEFOOiB7XG4gICAga2V5OiBcImpvaW5PcGVyYXRvcnMuZ3JlYXRlclRoYW5cIixcbiAgICBmYWxsYmFjazogXCJNYWlvciBxdWUgKD4pXCIsXG4gIH0sXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTDoge1xuICAgIGtleTogXCJqb2luT3BlcmF0b3JzLmdyZWF0ZXJUaGFuT3JFcXVhbFwiLFxuICAgIGZhbGxiYWNrOiBcIk1haW9yIG91IGlndWFsIGEgKD49KVwiLFxuICB9LFxuICBMRVNTX1RIQU46IHtcbiAgICBrZXk6IFwiam9pbk9wZXJhdG9ycy5sZXNzVGhhblwiLFxuICAgIGZhbGxiYWNrOiBcIk1lbm9yIHF1ZSAoPClcIixcbiAgfSxcbiAgTEVTU19USEFOX09SX0VRVUFMOiB7XG4gICAga2V5OiBcImpvaW5PcGVyYXRvcnMubGVzc1RoYW5PckVxdWFsXCIsXG4gICAgZmFsbGJhY2s6IFwiTWVub3Igb3UgaWd1YWwgYSAoPD0pXCIsXG4gIH0sXG59O1xuY29uc3QgRFlOQU1JQ19NT0RBTF9ESU1FTlNJT05TOiBEeW5hbWljTW9kYWxEaW1lbnNpb25zTWFwID0ge1xuICBzb3VyY2U6IHtcbiAgICB3aWR0aDogXCI2NHJlbVwiLFxuICAgIGhlaWdodDogXCI0MHJlbVwiLFxuICB9LFxuICBzZWxlY3Rpb246IHtcbiAgICB3aWR0aDogXCI2NHJlbVwiLFxuICAgIGhlaWdodDogXCI0MHJlbVwiLFxuICB9LFxuICBqb2luOiB7XG4gICAgd2lkdGg6IFwiNzByZW1cIixcbiAgICBoZWlnaHQ6IFwiNDByZW1cIixcbiAgfSxcbiAgc29ydDoge1xuICAgIHdpZHRoOiBcIjU2cmVtXCIsXG4gICAgaGVpZ2h0OiBcIjM0cmVtXCIsXG4gIH0sXG4gIGZpbHRlcjoge1xuICAgIHdpZHRoOiBcIjY4cmVtXCIsXG4gICAgaGVpZ2h0OiBcIjU1cmVtXCIsXG4gIH0sXG4gIGZpZWxkOiB7XG4gICAgd2lkdGg6IFwiNjhyZW1cIixcbiAgICBoZWlnaHQ6IFwiNDJyZW1cIixcbiAgfSxcbn07XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwic2RjLXZpc3VhbC1zcWwtZWRpdG9yXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgIENvZGVFZGl0b3JDb21wb25lbnQsXG4gICAgQ29tYm9ib3hDb21wb25lbnQsXG4gICAgSW5mb1NpZ25Db21wb25lbnQsXG4gICAgTW9kYWxDb21wb25lbnQsXG4gICAgUGlja2xpc3RDb21wb25lbnQsXG4gICAgU2VsZWN0QnV0dG9uQ29tcG9uZW50LFxuICAgIFRhYmxlQ29tcG9uZW50LFxuICAgIFRleHRhcmVhQ29tcG9uZW50LFxuICAgIFRleHRib3hDb21wb25lbnQsXG4gICAgVGltZWxpbmVDb21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGVVcmw6IFwiLi92aXN1YWwtc3FsLWVkaXRvci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdmlzdWFsLXNxbC1lZGl0b3IuY29tcG9uZW50LnNjc3NcIl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBWaXN1YWxTcWxFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGludGVybmFsQ29uZmlnID0gY3JlYXRlRHluYW1pY1ZpZXdCdWlsZGVyQ29uZmlnKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvbk9yZGVyOiBCdWlsZGVyU2VjdGlvbklkW10gPSBbXG4gICAgXCJ0YWJsZXNcIixcbiAgICBcImpvaW5zXCIsXG4gICAgXCJncm91cEJ5XCIsXG4gICAgXCJmaWVsZHNcIixcbiAgICBcInNvcnRpbmdcIixcbiAgICBcImZpbHRlcnNcIixcbiAgXTtcbiAgcHJpdmF0ZSByZWZyZXNoRmxvd0Fycm93c0ZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWZyZXNoRmxvd0Fycm93c1RpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHJlYWRvbmx5IGxheW91dE1vZGVJdGVtczogU2VsZWN0QnV0dG9uSXRlbTxCdWlsZGVyTGF5b3V0TW9kZT5bXSA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogXCJCbG9jb3NcIixcbiAgICAgIHZhbHVlOiBcInN0YWNrZWRcIixcbiAgICAgIGljb25DbGFzczogXCJmYXMgZmEtdGgtbGFyZ2VcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBcIkxpc3RhXCIsXG4gICAgICB2YWx1ZTogXCJzcGxpdFwiLFxuICAgICAgaWNvbkNsYXNzOiBcImZhcyBmYS1saXN0XCIsXG4gICAgfSxcbiAgXTtcbiAgcmVhZG9ubHkgZmlsdGVyTW9kZUl0ZW1zOiBTZWxlY3RCdXR0b25JdGVtPEZpbHRlck1vZGFsTW9kZT5bXSA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogXCJGaWx0cm9cIixcbiAgICAgIHZhbHVlOiBcImNvbmRpdGlvblwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IFwiRXhwcmVzc2FvIGRlIGRvbWluaW9cIixcbiAgICAgIHZhbHVlOiBGSUxURVJfTU9ERV9ET01BSU4sXG4gICAgfSxcbiAgXTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRGaWx0ZXJNb2RlSXRlbXM6IFNlbGVjdEJ1dHRvbkl0ZW08RmlsdGVyTW9kYWxNb2RlPltdID0gW107XG4gIHJlYWRvbmx5IHNvcnREaXJlY3Rpb25JdGVtczogU2VsZWN0QnV0dG9uSXRlbTxzdHJpbmc+W10gPSBbXTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRMYXlvdXRNb2RlSXRlbXM6IFNlbGVjdEJ1dHRvbkl0ZW08QnVpbGRlckxheW91dE1vZGU+W10gPSBbXTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRTb3J0RGlyZWN0aW9uSXRlbXM6IFNlbGVjdEJ1dHRvbkl0ZW08c3RyaW5nPltdID0gW107XG4gIEBJbnB1dCgpIGxvYWRpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgc2V0IGNvbmZpZyh2YWx1ZTogRHluYW1pY1ZpZXdCdWlsZGVyQ29uZmlnKSB7XG4gICAgdGhpcy5pbnRlcm5hbENvbmZpZyA9IHZhbHVlXG4gICAgICA/IGNyZWF0ZUR5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyh2YWx1ZSlcbiAgICAgIDogY3JlYXRlRHluYW1pY1ZpZXdCdWlsZGVyQ29uZmlnKCk7XG4gICAgdGhpcy5zeW5jTGF5b3V0TW9kZUl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jRmlsdGVyTW9kZUl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jU29ydERpcmVjdGlvbkl0ZW1zKCk7XG4gICAgdGhpcy5zYW5pdGl6ZUJ1aWxkZXIoKTtcbiAgfVxuICBnZXQgY29uZmlnKCk6IER5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxDb25maWc7XG4gIH1cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNvbmZpZ0NoYW5nZSA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxEeW5hbWljVmlld0J1aWxkZXJDb25maWc+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBzYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxEeW5hbWljVmlld0J1aWxkZXJDb25maWc+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoXCJzZWN0aW9uc0NvbnRhaW5lclwiKVxuICBwcml2YXRlIHJlYWRvbmx5IHNlY3Rpb25zQ29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGRyZW4oXCJidWlsZGVyU2VjdGlvblwiKVxuICBwcml2YXRlIHJlYWRvbmx5IGJ1aWxkZXJTZWN0aW9ucz86IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj47XG4gIGxheW91dE1vZGU6IEJ1aWxkZXJMYXlvdXRNb2RlID0gXCJzdGFja2VkXCI7XG4gIHByZXZpZXdWaXNpYmxlID0gZmFsc2U7XG4gIGZsb3dBcnJvd3M6IEJ1aWxkZXJGbG93QXJyb3dbXSA9IFtdO1xuICBtZWFzdXJlZFNwbGl0UHJldmlld0hlaWdodCA9IFwiMjRyZW1cIjtcbiAgZHJhZ2dpbmdGaWVsZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgZHJhZ1ByZXZpZXdJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHJlYWRvbmx5IG92ZXJsYXlBcHBlbmRUYXJnZXQgPSBPVkVSTEFZX0FQUEVORF9UQVJHRVQ7XG4gIHJlYWRvbmx5IG92ZXJsYXlaSW5kZXggPSBNT0RBTF9PVkVSTEFZX1pfSU5ERVg7XG4gIHJlYWRvbmx5IG1vZGFsRGltZW5zaW9ucyA9IERZTkFNSUNfTU9EQUxfRElNRU5TSU9OUztcbiAgcmVhZG9ubHkgZmllbGRQaWNrbGlzdFJvd3MgPSBGSUVMRF9QSUNLTElTVF9ST1dTO1xuICByZWFkb25seSBmaWx0ZXJQaWNrbGlzdFJvd3MgPSBGSUxURVJfUElDS0xJU1RfUk9XUztcbiAgc291cmNlTW9kYWxWaXNpYmxlID0gZmFsc2U7XG4gIHNvdXJjZU1vZGFsU3RlcDogU291cmNlTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgc291cmNlTW9kYWxEcmFmdHM6IFNvdXJjZU1vZGFsRHJhZnRbXSA9IFtdO1xuICBzZWxlY3Rpb25Nb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgc2VsZWN0aW9uTW9kYWxNb2RlOiBTZWxlY3Rpb25Nb2RhbE1vZGUgPSBcInRhYmxlc1wiO1xuICBzZWxlY3Rpb25Nb2RhbElkczogc3RyaW5nW10gPSBbXTtcbiAgc2VsZWN0aW9uTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgam9pbk1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICBqb2luRWRpdEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgam9pblNvdXJjZVNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICBqb2luVGFyZ2V0U2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gIGpvaW5EcmFmdCA9IHtcbiAgICBzb3VyY2VDb2x1bW46IEVNUFRZX1ZBTFVFLFxuICAgIHRhcmdldENvbHVtbjogRU1QVFlfVkFMVUUsXG4gICAgb3BlcmF0b3I6IERFRkFVTFRfSk9JTl9PUEVSQVRPUixcbiAgfTtcbiAgc29ydE1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICBzb3J0RWRpdEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgc29ydFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICBzb3J0RHJhZnQgPSB7XG4gICAgY29sdW1uOiBFTVBUWV9WQUxVRSxcbiAgICBmdW5jdGlvbk5hbWU6IEVNUFRZX1ZBTFVFLFxuICAgIGRpcmVjdGlvbjogREVGQVVMVF9TT1JUX0RJUkVDVElPTixcbiAgfTtcbiAgZmllbGRNb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgZmllbGRNb2RhbFN0ZXA6IEZpZWxkTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgZmllbGRNb2RhbFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICBmaWVsZE1vZGFsRHJhZnRzOiBEeW5hbWljVmlld0J1aWxkZXJGaWVsZFtdID0gW107XG4gIGZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZmllbGRGdW5jdGlvbkRyYWZ0ID0ge1xuICAgIGNvbHVtbjogRU1QVFlfVkFMVUUsXG4gICAgZnVuY3Rpb25OYW1lOiBFTVBUWV9WQUxVRSxcbiAgICBmdW5jdGlvbkFsaWFzOiBFTVBUWV9WQUxVRSxcbiAgfTtcbiAgZmlsdGVyTW9kYWxWaXNpYmxlID0gZmFsc2U7XG4gIGZpbHRlckVkaXRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGZpbHRlck1vZGFsU3RlcDogRmlsdGVyTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgZmlsdGVyTW9kYWxNb2RlOiBGaWx0ZXJNb2RhbE1vZGUgPSBcImNvbmRpdGlvblwiO1xuICBmaWx0ZXJTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgZmlsdGVyRHJhZnQgPSB7XG4gICAgbW9kZTogXCJjb25kaXRpb25cIiBhcyBGaWx0ZXJNb2RhbE1vZGUsXG4gICAgY29sdW1uOiBFTVBUWV9WQUxVRSxcbiAgICBvcGVyYXRvcjogREVGQVVMVF9GSUxURVJfT1BFUkFUT1IsXG4gICAgY29ubmVjdG9yOiBERUZBVUxUX0ZJTFRFUl9DT05ORUNUT1IsXG4gICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgIHZhbHVlVHlwZTogREVGQVVMVF9GSUxURVJfVkFMVUVfVFlQRSxcbiAgICB2YWx1ZTogRU1QVFlfVkFMVUUsXG4gICAgdmFsdWVzVGV4dDogRU1QVFlfVkFMVUUsXG4gICAgYmV0d2VlblN0YXJ0OiBFTVBUWV9WQUxVRSxcbiAgICBiZXR3ZWVuRW5kOiBFTVBUWV9WQUxVRSxcbiAgICBwYXJhbWV0ZXJOYW1lOiBFTVBUWV9WQUxVRSxcbiAgICBkb21haW5FeHByZXNzaW9uOiBFTVBUWV9WQUxVRSxcbiAgfTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5zeW5jTGF5b3V0TW9kZUl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jRmlsdGVyTW9kZUl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jU29ydERpcmVjdGlvbkl0ZW1zKCk7XG4gICAgdGhpcy5zYW5pdGl6ZUJ1aWxkZXIoKTtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZGVyU2VjdGlvbnM/LmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2NoZWR1bGVGbG93QXJyb3dSZWZyZXNoKCk7XG4gICAgfSk7XG4gICAgdGhpcy5zY2hlZHVsZUZsb3dBcnJvd1JlZnJlc2goKTtcbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWZyZXNoRmxvd0Fycm93c0ZyYW1lICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnJlZnJlc2hGbG93QXJyb3dzRnJhbWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWZyZXNoRmxvd0Fycm93c1RpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hGbG93QXJyb3dzVGltZW91dCk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIpXG4gIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuc2NoZWR1bGVGbG93QXJyb3dSZWZyZXNoKCk7XG4gIH1cbiAgZ2V0IHNlbGVjdGVkTGF5b3V0TW9kZUl0ZW0oKTogU2VsZWN0QnV0dG9uSXRlbTxCdWlsZGVyTGF5b3V0TW9kZT4gfCBudWxsIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sYXlvdXRNb2RlSXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdGhpcy5sYXlvdXRNb2RlKSA/P1xuICAgICAgbnVsbFxuICAgICk7XG4gIH1cbiAgZ2V0IGlzUmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm1ldGFkYXRhLnZpZXdNb2RlID09PSBcInJlYWRvbmx5XCI7XG4gIH1cbiAgZ2V0IGpvaW5PcGVyYXRvck9wdGlvbnMoKTogRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uW10ge1xuICAgIHJldHVybiAodGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS5qb2luT3BlcmF0b3JzID8/IFtdKS5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAuLi5pdGVtLFxuICAgICAgdGV4dDogdGhpcy5yZXNvbHZlSm9pbk9wZXJhdG9yT3B0aW9uVGV4dChpdGVtKSxcbiAgICB9KSk7XG4gIH1cbiAgZ2V0IGZ1bmN0aW9uT3B0aW9ucygpOiBEeW5hbWljVmlld0J1aWxkZXJPcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEuZnVuY3Rpb25zID8/IFtdO1xuICB9XG4gIGdldCBzb3J0RGlyZWN0aW9uT3B0aW9ucygpOiBEeW5hbWljVmlld0J1aWxkZXJPcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEuc29ydERpcmVjdGlvbnMgPz8gW107XG4gIH1cbiAgZ2V0IGZpbHRlckNvbm5lY3Rvck9wdGlvbnMoKTogRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLmZpbHRlckNvbm5lY3RvcnMgPz8gW107XG4gIH1cbiAgZ2V0IHZhbHVlVHlwZU9wdGlvbnMoKTogRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uW10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRleHQ6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy52YWx1ZVR5cGVzLnZhbHVlYCxcbiAgICAgICAgICBcIlZhbG9yXCJcbiAgICAgICAgKSxcbiAgICAgICAgdmFsdWU6IFwidmFsdWVcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRleHQ6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy52YWx1ZVR5cGVzLnBhcmFtZXRlcmAsXG4gICAgICAgICAgXCJQYXJhbWV0cm9cIlxuICAgICAgICApLFxuICAgICAgICB2YWx1ZTogXCJwYXJhbWV0ZXJcIixcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuICBnZXQgYm9vbGVhblZhbHVlT3B0aW9ucygpOiBEeW5hbWljVmlld0J1aWxkZXJPcHRpb25bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGV4dDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmJvb2xlYW4udHJ1ZWAsXG4gICAgICAgICAgXCJUcnVlXCJcbiAgICAgICAgKSxcbiAgICAgICAgdmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGV4dDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmJvb2xlYW4uZmFsc2VgLFxuICAgICAgICAgIFwiRmFsc2VcIlxuICAgICAgICApLFxuICAgICAgICB2YWx1ZTogXCJmYWxzZVwiLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG4gIGdldCBzZWxlY3RlZFRhYmxlcygpOiBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbltdIHtcbiAgICBjb25zdCBpZHMgPSBuZXcgU2V0KFxuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMubWFwKChpdGVtKSA9PiBpdGVtLnRhYmxlKVxuICAgICk7XG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLnRhYmxlcyA/PyBbXSkuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgaWRzLmhhcyhpdGVtLnZhbHVlKVxuICAgICk7XG4gIH1cbiAgZ2V0IGF2YWlsYWJsZUNvbHVtbnMoKTogRHluYW1pY1ZpZXdCdWlsZGVyQ29sdW1uT3B0aW9uW10ge1xuICAgIGNvbnN0IHNlbGVjdGVkVGFibGVJZHMgPSBuZXcgU2V0KFxuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMubWFwKChpdGVtKSA9PiBpdGVtLnRhYmxlKVxuICAgICk7XG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLmNvbHVtbnMgPz8gW10pLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgIHNlbGVjdGVkVGFibGVJZHMuaGFzKGl0ZW0udGFibGUpXG4gICAgKTtcbiAgfVxuICBnZXQgZmllbGRTZWxlY3RhYmxlQ29sdW1ucygpOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXSB7XG4gICAgaWYgKCF0aGlzLmF2YWlsYWJsZUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmICghdGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVDb2x1bW5zO1xuICAgIH1cbiAgICBjb25zdCBncm91cEJ5ID0gbmV3IFNldCh0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeSk7XG4gICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlQ29sdW1ucy5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gZ3JvdXBCeS5oYXMoaXRlbS52YWx1ZSkgfHwgaXRlbS5pc0FnZ3JlZ2F0YWJsZSAhPT0gZmFsc2VcbiAgICApO1xuICB9XG4gIGdldCBncm91cEJ5U2VsZWN0YWJsZUNvbHVtbnMoKTogRHluYW1pY1ZpZXdCdWlsZGVyQ29sdW1uT3B0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUNvbHVtbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlzQWdncmVnYXRhYmxlICE9PSBmYWxzZSk7XG4gIH1cbiAgZ2V0IHNvcnRTZWxlY3RhYmxlSXRlbXMoKTogU29ydFNlbGVjdGFibGVJdGVtW10ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWVsZHMgPSB0aGlzLm5vcm1hbGl6ZWRGaWVsZHM7XG4gICAgaWYgKCFub3JtYWxpemVkRmllbGRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGdyb3VwQnlTZXQgPSBuZXcgU2V0KHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5KTtcblxuICAgIHJldHVybiB0aGlzLmRlZHVwbGljYXRlQnlLZXkoXG4gICAgICBub3JtYWxpemVkRmllbGRzXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24oaXRlbS5jb2x1bW4pO1xuICAgICAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2x1bW4uaXNTb3J0YWJsZSAhPT0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGdyb3VwQnlTZXQuaGFzKGl0ZW0uY29sdW1uKSB8fCAhIWl0ZW0uZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZT8udHJpbSgpO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnJlc29sdmVDb2x1bW5QYXJ0cyhpdGVtLmNvbHVtbik7XG4gICAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gaXRlbS5mdW5jdGlvbj8uZnVuY3Rpb25OYW1lPy50cmltKCkgPz8gRU1QVFlfVkFMVUU7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgaWQ6IHRoaXMuYnVpbGRTb3J0U2VsZWN0aW9uSWQoaXRlbS5jb2x1bW4sIGZ1bmN0aW9uTmFtZSksXG4gICAgICAgICAgICBjb2x1bW46IGl0ZW0uY29sdW1uLFxuICAgICAgICAgICAgdGFibGVMYWJlbDogcGFydHMudGFibGVMYWJlbCxcbiAgICAgICAgICAgIGZpZWxkTGFiZWw6IHBhcnRzLmZpZWxkTGFiZWwsXG4gICAgICAgICAgICBtZXRhOiBmdW5jdGlvbk5hbWVcbiAgICAgICAgICAgICAgPyB0aGlzLnJlc29sdmVGdW5jdGlvbkxhYmVsKGZ1bmN0aW9uTmFtZSlcbiAgICAgICAgICAgICAgOiB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24oaXRlbS5jb2x1bW4pPy5kYXRhVHlwZSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIChpdGVtKSA9PiBpdGVtLmlkXG4gICAgKTtcbiAgfVxuICBnZXQgY2FuQ29uZmlndXJlSm9pbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLmxlbmd0aCA+IDE7XG4gIH1cbiAgZ2V0IGNhblNhdmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEhKHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWVsZHMubGVuZ3RoIHx8IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5Lmxlbmd0aCk7XG4gIH1cbiAgZ2V0IGNhblNhdmVKb2luKCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmpvaW5EcmFmdC5zb3VyY2VDb2x1bW4gfHxcbiAgICAgICF0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4gfHxcbiAgICAgICF0aGlzLmpvaW5EcmFmdC5vcGVyYXRvclxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5qb2luRHJhZnQudGFyZ2V0Q29sdW1uKTtcbiAgICByZXR1cm4gISFzb3VyY2UgJiYgISF0YXJnZXQgJiYgc291cmNlLnRhYmxlICE9PSB0YXJnZXQudGFibGU7XG4gIH1cbiAgZ2V0IGNhblNhdmVTb3J0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc29ydERyYWZ0LmNvbHVtbiAmJiAhIXRoaXMuc29ydERyYWZ0LmRpcmVjdGlvbjtcbiAgfVxuICBnZXQgY2FuU2F2ZUZpZWxkTW9kYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5maWVsZE1vZGFsRHJhZnRzLmxlbmd0aCAmJiAhdGhpcy5maWVsZEZ1bmN0aW9uRWRpdENvbHVtbjtcbiAgfVxuICBnZXQgY2FuU2F2ZUZpbHRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmJ1aWxkRmlsdGVyRnJvbURyYWZ0KCk7XG4gIH1cbiAgZ2V0IGZpZWxkTW9kYWxDYW5Qcm9jZWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkTW9kYWxEcmFmdHMubGVuZ3RoID4gMDtcbiAgfVxuICBnZXQgY2FuT3BlbkZpZWxkQ29uZmlndXJhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZEl0ZW1zLmxlbmd0aCA+IDA7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNb2RhbFN0ZXAgPT09IFwic2VsZWN0XCI7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyTW9kYWxTdGVwID09PSBcImNvbmZpZ3VyZVwiO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbFJldmlld1N0ZXBBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyTW9kYWxTdGVwID09PSBcInJldmlld1wiO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbENhblByb2NlZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyTW9kYWxNb2RlID09PSBGSUxURVJfTU9ERV9ET01BSU4gfHwgISF0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbjtcbiAgfVxuICBnZXQgZmlsdGVyTW9kYWxDYW5SZXZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FuU2F2ZUZpbHRlcjtcbiAgfVxuICBnZXQgZmlsdGVyTmVlZHNWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIVtcIkVNUFRZXCIsIFwiTk9UX0VNUFRZXCJdLmluY2x1ZGVzKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IpO1xuICB9XG4gIGdldCBmaWx0ZXJDb25uZWN0b3JEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJTZXF1ZW5jZUluZGV4ID09PSAwO1xuICB9XG4gIGdldCBmaWx0ZXJDb25uZWN0b3JEaXNhYmxlZFJlYXNvbigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5maWx0ZXJDb25uZWN0b3JEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIEVNUFRZX1ZBTFVFO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy5kaXNhYmxlZFJlYXNvbnMuY29ubmVjdG9yYCxcbiAgICAgIFwiTyBwcmltZWlybyBmaWx0cm8gc2VtcHJlIGluaWNpYSBvIFdIRVJFLCBwb3IgaXNzbyBvIGNvbmVjdG9yIGZpY2EgdHJhdmFkby5cIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlck9wZXJhdG9yRGlzYWJsZWRSZWFzb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4pIHtcbiAgICAgIHJldHVybiBFTVBUWV9WQUxVRTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZGlzYWJsZWRSZWFzb25zLm9wZXJhdG9yYCxcbiAgICAgIFwiU2VsZWNpb25lIHVtIGNhbXBvIG5hIGV0YXBhIGFudGVyaW9yIHBhcmEgbGliZXJhciBzb21lbnRlIG9zIG9wZXJhZG9yZXMgY29tcGF0aXZlaXMuXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJWYWx1ZVR5cGVEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZmlsdGVyRHJhZnQuY29sdW1uIHx8ICF0aGlzLmZpbHRlck5lZWRzVmFsdWU7XG4gIH1cbiAgZ2V0IGZpbHRlclZhbHVlVHlwZURpc2FibGVkUmVhc29uKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbikge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZGlzYWJsZWRSZWFzb25zLnZhbHVlVHlwZVdpdGhvdXRDb2x1bW5gLFxuICAgICAgICBcIkVzY29saGEgdW0gY2FtcG8gZSB1bSBvcGVyYWRvciBhbnRlcyBkZSBkZWZpbmlyIGNvbW8gbyB2YWxvciBzZXJhIGluZm9ybWFkby5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZmlsdGVyTmVlZHNWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZGlzYWJsZWRSZWFzb25zLnZhbHVlVHlwZVdpdGhvdXRWYWx1ZWAsXG4gICAgICAgIFwiTyBvcGVyYWRvciBhdHVhbCBuYW8gdXNhIHZhbG9yLCBlbnRhbyB0aXBvIGRlIHZhbG9yIGUgZW50cmFkYSBmaWNhbSBvY3VsdG9zLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBFTVBUWV9WQUxVRTtcbiAgfVxuICBnZXQgZmlsdGVyT3BlcmF0b3JUb29sdGlwKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbikge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMudG9vbHRpcHMub3BlcmF0b3JEZWZhdWx0YCxcbiAgICAgICAgXCJPcyBvcGVyYWRvcmVzIG11ZGFtIGNvbmZvcm1lIG8gdGlwbyBkbyBjYW1wbyBzZWxlY2lvbmFkby5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4pO1xuICAgIGxldCBvcGVyYXRvcktleTogc3RyaW5nO1xuICAgIGlmICh0aGlzLmlzTnVtZXJpY1R5cGUoY29sdW1uPy5kYXRhVHlwZSkpIHtcbiAgICAgIG9wZXJhdG9yS2V5ID0gXCJvcGVyYXRvck51bWVyaWNcIjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEYXRlVHlwZShjb2x1bW4/LmRhdGFUeXBlKSkge1xuICAgICAgb3BlcmF0b3JLZXkgPSBcIm9wZXJhdG9yRGF0ZVwiO1xuICAgIH0gZWxzZSBpZiAoKGNvbHVtbj8uZGF0YVR5cGUgPz8gRU1QVFlfVkFMVUUpLnRvTG93ZXJDYXNlKCkgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBvcGVyYXRvcktleSA9IFwib3BlcmF0b3JCb29sZWFuXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wZXJhdG9yS2V5ID0gXCJvcGVyYXRvclRleHRcIjtcbiAgICB9XG5cbiAgICBjb25zdCBmYWxsYmFja0J5S2V5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgb3BlcmF0b3JOdW1lcmljOiBcIkNhbXBvcyBudW1lcmljb3MgcGVybWl0ZW0gY29tcGFyYWNvZXMsIGZhaXhhcyBlIGxpc3Rhcy5cIixcbiAgICAgIG9wZXJhdG9yRGF0ZTogXCJDYW1wb3MgZGUgZGF0YSBlIGhvcmEgcGVybWl0ZW0gY29tcGFyYWNvZXMgY3Jvbm9sb2dpY2FzIGUgaW50ZXJ2YWxvLlwiLFxuICAgICAgb3BlcmF0b3JCb29sZWFuOiBcIkNhbXBvcyBib29sZWFub3MgYWNlaXRhbSBjb21wYXJhY2FvIGRpcmV0YSBvdSB2ZXJpZmljYWNhbyBkZSB2YXppby5cIixcbiAgICAgIG9wZXJhdG9yVGV4dDogXCJDYW1wb3MgdGV4dHVhaXMgYWNlaXRhbSBidXNjYSBwb3IgdHJlY2hvLCBwcmVmaXhvLCBzdWZpeG8gZSBsaXN0YXMuXCJcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLiR7b3BlcmF0b3JLZXl9YCxcbiAgICAgIGZhbGxiYWNrQnlLZXlbb3BlcmF0b3JLZXldXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyVmFsdWVUeXBlVG9vbHRpcCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4pIHtcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLnZhbHVlVHlwZURlZmF1bHRgLFxuICAgICAgICBcIlVzZSB2YWxvciBkaWdpdGFkbyBwYXJhIGNvbXBhcmFyIGFnb3JhIG91IHBhcmFtZXRybyBwYXJhIHBlZGlyIG8gdmFsb3IgZW0gdGVtcG8gZGUgZXhlY3VjYW8uXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZpbHRlck5lZWRzVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLnZhbHVlVHlwZU5vdFJlcXVpcmVkYCxcbiAgICAgICAgXCJDb20gZXN0ZSBvcGVyYWRvciBvIGZpbHRybyBuYW8gcHJlY2lzYSByZWNlYmVyIHZhbG9yLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy50b29sdGlwcy52YWx1ZVR5cGVgLFxuICAgICAgXCJWYWxvciBkaWdpdGFkbyBzYWx2YSB1bWEgY29tcGFyYWNhbyBmaXhhLiBQYXJhbWV0cm8gZGVpeGEgbyB2YWxvciBhYmVydG8gcGFyYSBwcmVlbmNoaW1lbnRvIGZ1dHVyby5cIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlckNvbm5lY3RvclRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMudG9vbHRpcHMuY29ubmVjdG9yYCxcbiAgICAgIFwiQ29uZWN0b3IgZGVmaW5lIGNvbW8gZXN0YSByZWdyYSBzZSBsaWdhIGFvIGZpbHRybyBhbnRlcmlvcjogQU5EIHJlc3RyaW5nZSwgT1IgYW1wbGlhLlwiXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyT3B0aW9uYWxUb29sdGlwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLm9wdGlvbmFsYCxcbiAgICAgIFwiTWFycXVlIGNvbW8gb3BjaW9uYWwgcXVhbmRvIGEgcmVncmEgcHVkZXIgc2VyIGlnbm9yYWRhIHNlbSBpbnZhbGlkYXIgYSBleGVjdWNhby5cIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlckRvbWFpbkV4cHJlc3Npb25Ub29sdGlwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLmRvbWFpbkV4cHJlc3Npb25gLFxuICAgICAgXCJFeHByZXNzYW8gZGUgZG9taW5pbyBlbnRyYSBjb21vIGNvbmRpY2FvIG1hbnVhbCBubyBXSEVSRS4gVXNlIHF1YW5kbyBhIHJlZ3JhIG5hbyBjb3ViZXIgbm9zIG9wZXJhZG9yZXMgcGFkcmFvLlwiXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyVmFsdWVJbnB1dFRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUgPT09IFwicGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLnBhcmFtZXRlck5hbWVgLFxuICAgICAgICBcIkluZm9ybWUgbyBub21lIHRlY25pY28gcXVlIHNlcmEgdXNhZG8gcGFyYSBwZWRpciBvIHZhbG9yIGVtIHRlbXBvIGRlIGV4ZWN1Y2FvLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yID09PSBcIklOXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLnZhbHVlc0xpc3RgLFxuICAgICAgICBcIlNlcGFyZSBvcyB2YWxvcmVzIHBvciB2aXJndWxhIHBhcmEgbW9udGFyIGEgbGlzdGEgZmluYWwgZG8gSU4uXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IgPT09IFwiQkVUV0VFTlwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy50b29sdGlwcy5iZXR3ZWVuYCxcbiAgICAgICAgXCJQcmVlbmNoYSBpbmljaW8gZSBmaW0gcGFyYSBtb250YXIgbyBpbnRlcnZhbG8gY29tcGxldG8uXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLnZhbHVlYCxcbiAgICAgIFwiTyB2YWxvciBmaW5hbCByZXNwZWl0YSBvIHRpcG8gZG8gY2FtcG8gZSBvIG9wZXJhZG9yIGVzY29saGlkby5cIlxuICAgICk7XG4gIH1cbiAgZ2V0IHNob3dGaWx0ZXJWYWx1ZVRleHRib3goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXNWYWx1ZU1vZGUgPSB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlVHlwZSA9PT0gXCJ2YWx1ZVwiICYmIHRoaXMuZmlsdGVyTmVlZHNWYWx1ZTtcbiAgICByZXR1cm4gKFxuICAgICAgaXNWYWx1ZU1vZGUgJiZcbiAgICAgICF0aGlzLnNob3dGaWx0ZXJWYWx1ZXNUZXh0Ym94ICYmXG4gICAgICAhdGhpcy5zaG93RmlsdGVyQmV0d2VlbklucHV0cyAmJlxuICAgICAgIXRoaXMuc2hvd0ZpbHRlckJvb2xlYW5Db21ib2JveFxuICAgICk7XG4gIH1cbiAgZ2V0IHNob3dGaWx0ZXJWYWx1ZXNUZXh0Ym94KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlVHlwZSA9PT0gXCJ2YWx1ZVwiICYmXG4gICAgICB0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yID09PSBcIklOXCJcbiAgICApO1xuICB9XG4gIGdldCBzaG93RmlsdGVyQmV0d2VlbklucHV0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUgPT09IFwidmFsdWVcIiAmJlxuICAgICAgdGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvciA9PT0gXCJCRVRXRUVOXCJcbiAgICApO1xuICB9XG4gIGdldCBzaG93RmlsdGVyUGFyYW1ldGVyVGV4dGJveCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUgPT09IFwicGFyYW1ldGVyXCI7XG4gIH1cbiAgZ2V0IHNob3dGaWx0ZXJCb29sZWFuQ29tYm9ib3goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uKTtcbiAgICByZXR1cm4gKFxuICAgICAgISFjb2x1bW4gJiYgY29sdW1uLmRhdGFUeXBlID09PSBcImJvb2xlYW5cIiAmJiB0aGlzLnNob3dGaWx0ZXJWYWx1ZVRleHRib3hcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJSZXZpZXdJdGVtcygpOiBGaWx0ZXJSZXZpZXdJdGVtW10geyAvLyBOT1NPTkFSIC0gY29tcGxleGl0eTogZXh0cmFjdGlvbiB3b3VsZCByaXNrIGJlaGF2aW9yIGNoYW5nZVxuICAgIGNvbnN0IHZhbHVlVHlwZUxhYmVsID0gdGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTlxuICAgICAgPyB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmRvbWFpbkxhYmVsYCxcbiAgICAgICAgXCJFeHByZXNzYW8gZGUgZG9taW5pb1wiXG4gICAgICApXG4gICAgICA6IHRoaXMucmVzb2x2ZU9wdGlvbkxhYmVsKHRoaXMuZmlsdGVyRHJhZnQudmFsdWVUeXBlLCB0aGlzLnZhbHVlVHlwZU9wdGlvbnMpO1xuXG4gICAgY29uc3QgaXRlbXM6IEZpbHRlclJldmlld0l0ZW1bXSA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IFwibW9kZVwiLFxuICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWVsZHMudHlwZWAsXG4gICAgICAgICAgXCJUaXBvXCJcbiAgICAgICAgKSxcbiAgICAgICAgdmFsdWU6IHRoaXMuZmlsdGVyTW9kYWxNb2RlID09PSBGSUxURVJfTU9ERV9ET01BSU5cbiAgICAgICAgICA/IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmRvbWFpbkxhYmVsYCxcbiAgICAgICAgICAgIFwiRXhwcmVzc2FvIGRlIGRvbWluaW9cIlxuICAgICAgICAgIClcbiAgICAgICAgICA6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLm1vZGVzLmNvbmRpdGlvbmAsXG4gICAgICAgICAgICBcIkZpbHRyb1wiXG4gICAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBcImNvbm5lY3RvclwiLFxuICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWVsZHMuY29ubmVjdG9yYCxcbiAgICAgICAgICBcIkNvbmVjdG9yXCJcbiAgICAgICAgKSxcbiAgICAgICAgdmFsdWU6IHRoaXMuZmlsdGVyQ29ubmVjdG9yRGlzYWJsZWRcbiAgICAgICAgICA/IFwiV0hFUkVcIlxuICAgICAgICAgIDogdGhpcy5yZXNvbHZlT3B0aW9uTGFiZWwodGhpcy5maWx0ZXJEcmFmdC5jb25uZWN0b3IsIHRoaXMuZmlsdGVyQ29ubmVjdG9yT3B0aW9ucyksXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBpZiAodGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTikge1xuICAgICAgaXRlbXMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcImV4cHJlc3Npb25cIixcbiAgICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpZWxkcy5kb21haW5FeHByZXNzaW9uYCxcbiAgICAgICAgICAgIFwiRXhwcmVzc2FvIGRlIGRvbWluaW9cIlxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZmlsdGVyRHJhZnQuZG9tYWluRXhwcmVzc2lvbi50cmltKCkgfHwgXCItXCIsXG4gICAgICAgICAgZW1waGFzaXplOiBcImNvZGVcIixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJmaWVsZFwiLFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmllbGRzLmZpZWxkYCxcbiAgICAgICAgICAgIFwiQ2FtcG9cIlxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uID8gdGhpcy5yZXNvbHZlQ29sdW1uUGF0aCh0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbikgOiBcIi1cIixcbiAgICAgICAgICBlbXBoYXNpemU6IFwicGF0aFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwib3BlcmF0b3JcIixcbiAgICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpZWxkcy5vcGVyYXRvcmAsXG4gICAgICAgICAgICBcIk9wZXJhZG9yXCJcbiAgICAgICAgICApLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnJlc29sdmVGaWx0ZXJPcGVyYXRvckxhYmVsKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwidmFsdWVUeXBlXCIsXG4gICAgICAgICAgbGFiZWw6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWVsZHMudmFsdWVUeXBlYCxcbiAgICAgICAgICAgIFwiVGlwbyBkZSB2YWxvclwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5maWx0ZXJOZWVkc1ZhbHVlID8gdmFsdWVUeXBlTGFiZWwgOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLm5vbmVgLFxuICAgICAgICAgICAgXCJTZW0gdmFsb3JcIlxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJ2YWx1ZVwiLFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmllbGRzLnZhbHVlYCxcbiAgICAgICAgICAgIFwiVmFsb3JcIlxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWU6IHRoaXMucmVzb2x2ZUZpbHRlckRyYWZ0RGlzcGxheVZhbHVlKCkgfHwgXCItXCIsXG4gICAgICAgICAgZW1waGFzaXplOiB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlVHlwZSA9PT0gXCJwYXJhbWV0ZXJcIiA/IFwiY29kZVwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGl0ZW1zLnB1c2goe1xuICAgICAgaWQ6IFwib3B0aW9uYWxcIixcbiAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5zdGF0ZXMub3B0aW9uYWxgLFxuICAgICAgICBcIk9wY2lvbmFsXCJcbiAgICAgICksXG4gICAgICB2YWx1ZTogdGhpcy5maWx0ZXJEcmFmdC5vcHRpb25hbFxuICAgICAgICA/IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLnllc2AsXG4gICAgICAgICAgXCJTaW1cIlxuICAgICAgICApXG4gICAgICAgIDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5zdGF0ZXMubm9gLFxuICAgICAgICAgIFwiTmFvXCJcbiAgICAgICAgKSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuICBnZXQgZmlsdGVyUmV2aWV3UHJldmlld0xhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJldmlldyA9IHRoaXMucmVzb2x2ZUZpbHRlckRyYWZ0U3FsUHJldmlldygpO1xuICAgIHJldHVybiBwcmV2aWV3IHx8IFwiLVwiO1xuICB9XG4gIGdldCBzb3VyY2VNb2RhbFNlbGVjdGlvblN0ZXBBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlTW9kYWxTdGVwID09PSBcInNlbGVjdFwiO1xuICB9XG4gIGdldCBzb3VyY2VNb2RhbENvbmZpZ3VyYXRpb25TdGVwQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZU1vZGFsU3RlcCA9PT0gXCJjb25maWd1cmVcIjtcbiAgfVxuICBnZXQgc291cmNlTW9kYWxDYW5Qcm9jZWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZU1vZGFsRHJhZnRzLmxlbmd0aCA+IDA7XG4gIH1cbiAgZ2V0IGNhbk9wZW5Tb3VyY2VDb25maWd1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZUl0ZW1zLmxlbmd0aCA+IDA7XG4gIH1cbiAgZ2V0IHNvdXJjZUl0ZW1zKCk6IFNvdXJjZVZpZXdJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5yZXNvbHZlVGFibGVEaXNwbGF5UGFydHMoaXRlbS50YWJsZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaXRlbS50YWJsZSxcbiAgICAgICAgZGJMYWJlbDogcGFydHMuZGJMYWJlbCxcbiAgICAgICAgdGFibGVMYWJlbDogcGFydHMudGFibGVMYWJlbCxcbiAgICAgICAgYWxpYXM6IGl0ZW0uYWxpYXMsXG4gICAgICAgIGhhc0N1c3RvbUFsaWFzOiB0aGlzLmhhc0N1c3RvbUFsaWFzKGl0ZW0udGFibGUsIGl0ZW0uYWxpYXMpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBnZXQgc291cmNlTW9kYWxUaW1lbGluZUl0ZW1zKCk6IFRpbWVsaW5lSXRlbVtdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBpZDogXCJzZWxlY3RcIixcbiAgICAgICAgbGFiZWw6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uYWN0aW9ucy5zZWxlY3RUYWJsZXNgLFxuICAgICAgICAgIEZBTExCQUNLX1NFTEVDVF9UQUJMRVNcbiAgICAgICAgKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLnNvdXJjZXMuc3RlcHMuc2VsZWN0LnN1YnRpdGxlYCxcbiAgICAgICAgICBcIkVzY29saGEgYXMgdGFiZWxhcyBxdWUgZGV2ZW0gYWxpbWVudGFyIGEgdmlzYW8gYW50ZXMgZGUgY29uZmlndXJhciBvcyBhbGlhc2VzLlwiXG4gICAgICAgICksXG4gICAgICAgIGluZGljYXRvckxhYmVsOiBcIjFcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBcImNvbmZpZ3VyZVwiLFxuICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5hY3Rpb25zLmNvbmZpZ3VyZUFsaWFzZXNgLFxuICAgICAgICAgIFwiQ29uZmlndXJhciBhbGlhc2VzXCJcbiAgICAgICAgKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLnNvdXJjZXMuc3RlcHMuY29uZmlndXJlLnN1YnRpdGxlYCxcbiAgICAgICAgICBcIlJldmlzZSBvcyBhbGlhc2VzIHN1Z2VyaWRvcyBlIGFqdXN0ZSBvcyBub21lcyBmaW5haXMgZGFzIHRhYmVsYXMgc2VsZWNpb25hZGFzLlwiXG4gICAgICAgICksXG4gICAgICAgIGluZGljYXRvckxhYmVsOiBcIjJcIixcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLnNvdXJjZU1vZGFsQ2FuUHJvY2VlZCxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuICBnZXQgc291cmNlTW9kYWxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLnNvdXJjZXMudGl0bGVgLFxuICAgICAgRkFMTEJBQ0tfU0VMRUNUX1RBQkxFU1xuICAgICk7XG4gIH1cbiAgZ2V0IHNvdXJjZU1vZGFsVGltZWxpbmVBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjY2Vzc2liaWxpdHkuc291cmNlTW9kYWxUaW1lbGluZWAsXG4gICAgICBcIkV0YXBhcyBkYSBjb25maWd1cmFjYW8gZGFzIHRhYmVsYXNcIlxuICAgICk7XG4gIH1cbiAgZ2V0IHNvdXJjZU1vZGFsUGlja2xpc3RJdGVtcygpOiBUYWJsZVBpY2tsaXN0SXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFRhYmxlUGlja2xpc3RJdGVtcyh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLnRhYmxlcyA/PyBbXSk7XG4gIH1cbiAgZ2V0IHNvdXJjZU1vZGFsU2VsZWN0ZWRQaWNrbGlzdElkcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlTW9kYWxEcmFmdHNcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHRoaXMucmVzb2x2ZVRhYmxlUGlja2xpc3RJZChpdGVtLnRhYmxlKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChpdGVtKTogaXRlbSBpcyBudW1iZXIgPT4gdHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIgJiYgaXRlbSA+IDBcbiAgICAgICk7XG4gIH1cbiAgZ2V0IHNvdXJjZU1vZGFsQ29uZmlndXJlZEl0ZW1zKCk6IFNvdXJjZUNvbmZpZ3VyZWRJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZU1vZGFsRHJhZnRzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnJlc29sdmVUYWJsZURpc3BsYXlQYXJ0cyhpdGVtLnRhYmxlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpdGVtLnRhYmxlLFxuICAgICAgICB0YWJsZTogaXRlbS50YWJsZSxcbiAgICAgICAgZGJMYWJlbDogcGFydHMuZGJMYWJlbCxcbiAgICAgICAgdGFibGVMYWJlbDogcGFydHMudGFibGVMYWJlbCxcbiAgICAgICAgYWxpYXM6IGl0ZW0uYWxpYXMsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIGdldCBqb2luSXRlbXMoKTogSm9pblZpZXdJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuam9pbnMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbS5zb3VyY2VDb2x1bW4pO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbS50YXJnZXRDb2x1bW4pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGAke2l0ZW0uc291cmNlQ29sdW1ufS0ke2l0ZW0udGFyZ2V0Q29sdW1ufS0ke2luZGV4fWAsXG4gICAgICAgIHNvdXJjZVRhYmxlOiBzb3VyY2UudGFibGVMYWJlbCxcbiAgICAgICAgc291cmNlRmllbGQ6IHNvdXJjZS5maWVsZExhYmVsLFxuICAgICAgICBvcGVyYXRvcjogdGhpcy5yZXNvbHZlSm9pbk9wZXJhdG9yTGFiZWwoaXRlbS5vcGVyYXRvciksXG4gICAgICAgIHRhcmdldFRhYmxlOiB0YXJnZXQudGFibGVMYWJlbCxcbiAgICAgICAgdGFyZ2V0RmllbGQ6IHRhcmdldC5maWVsZExhYmVsLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBnZXQgZ3JvdXBCeUl0ZW1zKCk6IFNpbXBsZVZpZXdJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeS5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICBpZDogaXRlbSxcbiAgICAgIC4uLnRoaXMucmVzb2x2ZUNvbHVtblBhcnRzKGl0ZW0pLFxuICAgIH0pKTtcbiAgfVxuICBnZXQgZmllbGRJdGVtc0xlZ2FjeSgpOiB1bmtub3duW10ge1xuICAgIHJldHVybiB0aGlzLmdldE9yZGVyZWRGaWVsZEVudHJpZXMoKS5tYXAoKGVudHJ5LCBpbmRleCkgPT4gKHtcbiAgICAgIGlkOiBlbnRyeS5jb2x1bW4sXG4gICAgICBsYWJlbDogYCR7aW5kZXggKyAxfcKwICR7dGhpcy5yZXNvbHZlQ29sdW1uUGF0aChlbnRyeS5jb2x1bW4pfWAsXG4gICAgICBvcmRlcjogaW5kZXgsXG4gICAgfSkpO1xuICB9XG4gIGdldCBmaWVsZEl0ZW1zKCk6IEZpZWxkVmlld0l0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JkZXJlZEZpZWxkRW50cmllcygpLm1hcCgoZW50cnksIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBlbnRyeS5mdW5jdGlvbj8uZnVuY3Rpb25OYW1lPy50cmltKCkgPz8gRU1QVFlfVkFMVUU7XG4gICAgICBjb25zdCBmdW5jdGlvbkFsaWFzID0gZW50cnkuZnVuY3Rpb24/LmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBgJHtlbnRyeS5jb2x1bW59LSR7aW5kZXh9YCxcbiAgICAgICAgc291cmNlSW5kZXg6IGVudHJ5LnNvdXJjZUluZGV4LFxuICAgICAgICBjb2x1bW46IGVudHJ5LmNvbHVtbixcbiAgICAgICAgb3JkZXJMYWJlbDogYCR7aW5kZXggKyAxfcKwYCxcbiAgICAgICAgLi4udGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoZW50cnkuY29sdW1uKSxcbiAgICAgICAgYWxpYXM6IGVudHJ5LmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgIHdpZHRoOiBlbnRyeS53aWR0aD8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICBmdW5jdGlvbk5hbWUsXG4gICAgICAgIGZ1bmN0aW9uTGFiZWw6IGZ1bmN0aW9uTmFtZSA/IHRoaXMucmVzb2x2ZUZ1bmN0aW9uTGFiZWwoZnVuY3Rpb25OYW1lKSA6IEVNUFRZX1ZBTFVFLFxuICAgICAgICBmdW5jdGlvbkFsaWFzLFxuICAgICAgICBoYXNDdXN0b21Db25maWc6XG4gICAgICAgICAgISFlbnRyeS5hbGlhcz8udHJpbSgpIHx8ICEhZW50cnkud2lkdGg/LnRyaW0oKSB8fCAhIWZ1bmN0aW9uTmFtZSB8fCAhIWZ1bmN0aW9uQWxpYXMsXG4gICAgICAgIG9yZGVyOiBpbmRleCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgZ2V0IGZpZWxkTW9kYWxTZWxlY3Rpb25Sb3dzKCk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZENvbHVtblNlbGVjdGlvblJvd3MoXG4gICAgICB0aGlzLmZpZWxkU2VsZWN0YWJsZUNvbHVtbnMsXG4gICAgICB0aGlzLmZpZWxkTW9kYWxEcmFmdHMubWFwKChpdGVtKSA9PiBpdGVtLmNvbHVtbiksXG4gICAgICB0aGlzLmZpZWxkTW9kYWxTZWFyY2gsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxuICBnZXQgZmllbGRNb2RhbENvbmZpZ3VyZWRJdGVtcygpOiBGaWVsZE1vZGFsQ29uZmlndXJlZEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRNb2RhbERyYWZ0cy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHRoaXMucmVzb2x2ZUNvbHVtblBhcnRzKGl0ZW0uY29sdW1uKTtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGl0ZW0uZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmdW5jdGlvbk5hbWUsXG4gICAgICAgIGlkOiBgJHtpdGVtLmNvbHVtbn0tJHtpbmRleH1gLFxuICAgICAgICBjb2x1bW46IGl0ZW0uY29sdW1uLFxuICAgICAgICB0YWJsZUxhYmVsOiBwYXJ0cy50YWJsZUxhYmVsLFxuICAgICAgICBmaWVsZExhYmVsOiBwYXJ0cy5maWVsZExhYmVsLFxuICAgICAgICBhbGlhczogaXRlbS5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICB3aWR0aDogaXRlbS53aWR0aD8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICBmdW5jdGlvbkxhYmVsOiBmdW5jdGlvbk5hbWVcbiAgICAgICAgICA/IHRoaXMucmVzb2x2ZUZ1bmN0aW9uTGFiZWwoZnVuY3Rpb25OYW1lKVxuICAgICAgICAgIDogRU1QVFlfVkFMVUUsXG4gICAgICAgIGZ1bmN0aW9uQWxpYXM6IGl0ZW0uZnVuY3Rpb24/LmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsSGFzU2VsZWN0YWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRTZWxlY3RhYmxlQ29sdW1ucy5zb21lKFxuICAgICAgKGl0ZW0pID0+ICF0aGlzLmZpZWxkTW9kYWxEcmFmdHMuc29tZSgoZHJhZnQpID0+IGRyYWZ0LmNvbHVtbiA9PT0gaXRlbS52YWx1ZSlcbiAgICApO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsQ2FuU2VsZWN0QWxsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkTW9kYWxTZWxlY3Rpb25Sb3dzLnNvbWUoKGl0ZW0pID0+ICFpdGVtLnNlbGVjdGVkKTtcbiAgfVxuICBnZXQgZmllbGRNb2RhbFBpY2tsaXN0SXRlbXMoKTogQ29sdW1uUGlja2xpc3RJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29sdW1uUGlja2xpc3RJdGVtcyh0aGlzLmZpZWxkU2VsZWN0YWJsZUNvbHVtbnMpO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsU2VsZWN0ZWRQaWNrbGlzdElkcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRNb2RhbERyYWZ0c1xuICAgICAgLm1hcCgoaXRlbSkgPT4gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RJZChpdGVtLmNvbHVtbikpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoaXRlbSk6IGl0ZW0gaXMgbnVtYmVyID0+IHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiICYmIGl0ZW0gPiAwXG4gICAgICApO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZE1vZGFsU3RlcCA9PT0gXCJzZWxlY3RcIjtcbiAgfVxuICBnZXQgZmllbGRNb2RhbENvbmZpZ3VyYXRpb25TdGVwQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkTW9kYWxTdGVwID09PSBcImNvbmZpZ3VyZVwiO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsVGltZWxpbmVBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjY2Vzc2liaWxpdHkuZmllbGRNb2RhbFRpbWVsaW5lYCxcbiAgICAgIFwiRXRhcGFzIGRhIGNvbmZpZ3VyYWNhbyBkbyBjYW1wb1wiXG4gICAgKTtcbiAgfVxuICBnZXQgZmllbGRNb2RhbFRpbWVsaW5lSXRlbXMoKTogVGltZWxpbmVJdGVtW10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGlkOiBcInNlbGVjdFwiLFxuICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5hY3Rpb25zLnNlbGVjdENvbHVtbnNgLFxuICAgICAgICAgIFwiU2VsZWNpb25hciBjb2x1bmFzXCJcbiAgICAgICAgKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLmZpZWxkcy5zdWJ0aXRsZWAsXG4gICAgICAgICAgXCJFc2NvbGhhIHVtYSBvdSBtYWlzIGNvbHVuYXMgcGFyYSBleHBvciBubyByZXN1bHRhZG8uXCJcbiAgICAgICAgKSxcbiAgICAgICAgaW5kaWNhdG9yTGFiZWw6IFwiMVwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IFwiY29uZmlndXJlXCIsXG4gICAgICAgIGxhYmVsOiB0aGlzLmZpZWxkTW9kYWxUaXRsZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLmZpZWxkLnN1YnRpdGxlYCxcbiAgICAgICAgICBcIkFqdXN0ZSBhbGlhcywgbGFyZ3VyYSBlIGZ1bmNhbyBhbnRlcyBkZSBzYWx2YXIgbyBjYW1wby5cIlxuICAgICAgICApLFxuICAgICAgICBpbmRpY2F0b3JMYWJlbDogXCIyXCIsXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5maWVsZE1vZGFsRHJhZnRzLmxlbmd0aCxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuICBnZXQgZmlsdGVyTW9kYWxUaW1lbGluZUFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uYWNjZXNzaWJpbGl0eS5maWx0ZXJNb2RhbFRpbWVsaW5lYCxcbiAgICAgIFwiRXRhcGFzIGRhIGNvbmZpZ3VyYWNhbyBkbyBmaWx0cm9cIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsVGltZWxpbmVJdGVtcygpOiBUaW1lbGluZUl0ZW1bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IFwic2VsZWN0XCIsXG4gICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWx0ZXIuc3RlcHMuc2VsZWN0LnRpdGxlYCxcbiAgICAgICAgICBcIlNlbGVjaW9uYXIgYmFzZVwiXG4gICAgICAgICksXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWx0ZXIuc3RlcHMuc2VsZWN0LnN1YnRpdGxlYCxcbiAgICAgICAgICBcIkVzY29saGEgbyB0aXBvIGRlIGZpbHRybyBlIGRlZmluYSBvIGNhbXBvIGluaWNpYWwgYW50ZXMgZGUgY29uZmlndXJhci5cIlxuICAgICAgICApLFxuICAgICAgICBpbmRpY2F0b3JMYWJlbDogXCIxXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogXCJjb25maWd1cmVcIixcbiAgICAgICAgbGFiZWw6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLmZpbHRlci5zdGVwcy5jb25maWd1cmUudGl0bGVgLFxuICAgICAgICAgIFwiQ29uZmlndXJhciBmaWx0cm9cIlxuICAgICAgICApLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmlsdGVyLnN0ZXBzLmNvbmZpZ3VyZS5zdWJ0aXRsZWAsXG4gICAgICAgICAgXCJEZWZpbmEgb3BlcmFkb3IsIHZhbG9yIGUgY29tcG9ydGFtZW50byBmaW5hbCBkbyBmaWx0cm8uXCJcbiAgICAgICAgKSxcbiAgICAgICAgaW5kaWNhdG9yTGFiZWw6IFwiMlwiLFxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuZmlsdGVyTW9kYWxDYW5Qcm9jZWVkLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IFwicmV2aWV3XCIsXG4gICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWx0ZXIuc3RlcHMucmV2aWV3LnRpdGxlYCxcbiAgICAgICAgICBcIlJldmlzYXIgcmVncmFcIlxuICAgICAgICApLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmlsdGVyLnN0ZXBzLnJldmlldy5zdWJ0aXRsZWAsXG4gICAgICAgICAgXCJDb25maXJtZSBvIHJlc3VtbyBmaW5hbCBkYSByZWdyYSBhbnRlcyBkZSBzYWx2YXIuXCJcbiAgICAgICAgKSxcbiAgICAgICAgaW5kaWNhdG9yTGFiZWw6IFwiM1wiLFxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuZmlsdGVyTW9kYWxDYW5SZXZpZXcsXG4gICAgICB9LFxuICAgIF07XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsQ29uZmlndXJlQWN0aW9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjdGlvbnMubmV4dFN0ZXBgLFxuICAgICAgXCJQcm94aW1hIGV0YXBhXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbFJldmlld0FjdGlvbkxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5hY3Rpb25zLnJldmlld1J1bGVgLFxuICAgICAgXCJSZXZpc2FyIHJlZ3JhXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbFNlbGVjdGlvbkhlbHBlclRleHQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTikge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWx0ZXIuZG9tYWluU2VsZWN0aW9uSGludGAsXG4gICAgICAgIFwiQSBleHByZXNzYW8gZGUgZG9taW5pbyBzZXJhIGNvbmZpZ3VyYWRhIG5hIHByb3hpbWEgZXRhcGEuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmlsdGVyLmNvbmRpdGlvblNlbGVjdGlvbkhpbnRgLFxuICAgICAgXCJTZWxlY2lvbmUgdW0gY2FtcG8gcGFyYSBsaWJlcmFyIGEgY29uZmlndXJhY2FvIGRldGFsaGFkYSBkbyBmaWx0cm8uXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsRnVuY3Rpb25PcHRpb25zKCk6IER5bmFtaWNWaWV3QnVpbGRlck9wdGlvbltdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0ZXh0OiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LnN0YXRlcy5ub25lYCxcbiAgICAgICAgICBcIlNlbSBmdW5jYW9cIlxuICAgICAgICApLFxuICAgICAgICB2YWx1ZTogRU1QVFlfVkFMVUUsXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5mdW5jdGlvbk9wdGlvbnMsXG4gICAgXTtcbiAgfVxuICBnZXQgc29ydEl0ZW1zKCk6IFNvcnRWaWV3SXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvcnRpbmcubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcbiAgICAgIGlkOiBgJHtpdGVtLmNvbHVtbn0tJHtpdGVtLmZ1bmN0aW9uTmFtZSA/PyBFTVBUWV9WQUxVRX0tJHtpdGVtLmRpcmVjdGlvbn0tJHtpbmRleH1gLFxuICAgICAgLi4udGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbS5jb2x1bW4pLFxuICAgICAgZnVuY3Rpb25OYW1lOiBpdGVtLmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgZnVuY3Rpb25MYWJlbDogaXRlbS5mdW5jdGlvbk5hbWVcbiAgICAgICAgPyB0aGlzLnJlc29sdmVGdW5jdGlvbkxhYmVsKGl0ZW0uZnVuY3Rpb25OYW1lKVxuICAgICAgICA6IEVNUFRZX1ZBTFVFLFxuICAgICAgZGlyZWN0aW9uOiB0aGlzLnJlc29sdmVPcHRpb25MYWJlbChcbiAgICAgICAgaXRlbS5kaXJlY3Rpb24sXG4gICAgICAgIHRoaXMuc29ydERpcmVjdGlvbk9wdGlvbnNcbiAgICAgICksXG4gICAgfSkpO1xuICB9XG4gIGdldCBmaWx0ZXJJdGVtc0xlZ2FjeSgpOiB1bmtub3duW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmlsdGVycy5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xuICAgICAgaWQ6IGAke2l0ZW0udmFsdWVUeXBlfS0ke2l0ZW0uY29sdW1ufS0ke2luZGV4fWAsXG4gICAgICB0aXRsZTpcbiAgICAgICAgaXRlbS52YWx1ZVR5cGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTlxuICAgICAgICAgID8gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZG9tYWluTGFiZWxgLFxuICAgICAgICAgICAgXCJFeHByZXNzYW8gZGUgZG9taW5pb1wiXG4gICAgICAgICAgKVxuICAgICAgICAgIDogYCR7dGhpcy5yZXNvbHZlQ29sdW1uTGFiZWwoXG4gICAgICAgICAgICBpdGVtLmNvbHVtblxuICAgICAgICAgICl9IMK3ICR7dGhpcy5yZXNvbHZlRmlsdGVyT3BlcmF0b3JMYWJlbChpdGVtLm9wZXJhdG9yKX1gLFxuICAgICAgc3VidGl0bGU6IHRoaXMucmVzb2x2ZUZpbHRlckRpc3BsYXlWYWx1ZShpdGVtKSxcbiAgICAgIG9wdGlvbmFsOiBpdGVtLm9wdGlvbmFsLFxuICAgIH0pKTtcbiAgfVxuICBnZXQgZmlsdGVySXRlbXMoKTogRmlsdGVyVmlld0l0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWx0ZXJzLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID1cbiAgICAgICAgaXRlbS52YWx1ZVR5cGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTlxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgZGJMYWJlbDogRU1QVFlfVkFMVUUsXG4gICAgICAgICAgICB0YWJsZUxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmRvbWFpbkxhYmVsYCxcbiAgICAgICAgICAgICAgXCJFeHByZXNzYW8gZGUgZG9taW5pb1wiXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZmllbGRMYWJlbDogRU1QVFlfVkFMVUUsXG4gICAgICAgICAgfVxuICAgICAgICAgIDogdGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbS5jb2x1bW4pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogYCR7aXRlbS52YWx1ZVR5cGV9LSR7aXRlbS5jb2x1bW59LSR7aW5kZXh9YCxcbiAgICAgICAgLi4ucGFydHMsXG4gICAgICAgIG9wZXJhdG9yTGFiZWw6XG4gICAgICAgICAgaXRlbS52YWx1ZVR5cGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTlxuICAgICAgICAgICAgPyBFTVBUWV9WQUxVRVxuICAgICAgICAgICAgOiB0aGlzLnJlc29sdmVGaWx0ZXJPcGVyYXRvckxhYmVsKGl0ZW0ub3BlcmF0b3IpLFxuICAgICAgICBzdWJ0aXRsZTogdGhpcy5yZXNvbHZlRmlsdGVyRGlzcGxheVZhbHVlKGl0ZW0pLFxuICAgICAgICBvcHRpb25hbDogaXRlbS5vcHRpb25hbCxcbiAgICAgICAgaXNEb21haW46IGl0ZW0udmFsdWVUeXBlID09PSBGSUxURVJfTU9ERV9ET01BSU4sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIGdldCBzZWxlY3Rpb25Nb2RhbFRpdGxlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kYWxNb2RlID09PSBcInRhYmxlc1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLnNvdXJjZXMudGl0bGVgLFxuICAgICAgICBGQUxMQkFDS19TRUxFQ1RfVEFCTEVTXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RhbE1vZGUgPT09IFwiZmllbGRzXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmllbGRzLnRpdGxlYCxcbiAgICAgICAgXCJTZWxlY2lvbmFyIGNhbXBvc1wiXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5ncm91cEJ5LnRpdGxlYCxcbiAgICAgIFwiU2VsZWNpb25hciBHcm91cCBCeVwiXG4gICAgKTtcbiAgfVxuICBnZXQgbW9kYWxTZWFyY2hMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmllbGRzLnNlYXJjaGAsXG4gICAgICBcIkJ1c2NhclwiXG4gICAgKTtcbiAgfVxuICBnZXQgbW9kYWxTZWFyY2hQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyYCxcbiAgICAgIFwiQnVzY2FyXCJcbiAgICApO1xuICB9XG4gIGdldCBtb2RhbE5hbWVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmllbGRzLm5hbWVgLFxuICAgICAgXCJOb21lXCJcbiAgICApO1xuICB9XG4gIGdldCBtb2RhbFR5cGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmllbGRzLnR5cGVgLFxuICAgICAgXCJUaXBvXCJcbiAgICApO1xuICB9XG4gIGdldCBtb2RhbFNlbGVjdExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5hY3Rpb25zLnNlbGVjdGAsXG4gICAgICBcIlNlbGVjaW9uYXJcIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmNhcmRzLmZpbHRlcnMudGl0bGVgLFxuICAgICAgXCJGaWx0cm9zXCJcbiAgICApO1xuICB9XG4gIGdldCBzb3J0TW9kYWxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uY2FyZHMuc29ydGluZy50aXRsZWAsXG4gICAgICBcIk9yZGVuYWNhb1wiXG4gICAgKTtcbiAgfVxuICBnZXQgZmllbGRNb2RhbFRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmllbGQudGl0bGVgLFxuICAgICAgXCJDb25maWd1cmFyIGNhbXBvXCJcbiAgICApO1xuICB9XG4gIGdldCBzZWxlY3Rpb25Nb2RhbFJvd3MoKTogU2VsZWN0aW9uUm93W10ge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGFsTW9kZSA9PT0gXCJ0YWJsZXNcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRUYWJsZVNlbGVjdGlvblJvd3MoXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMsXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxTZWFyY2hcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGFsTW9kZSA9PT0gXCJmaWVsZHNcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRDb2x1bW5TZWxlY3Rpb25Sb3dzKFxuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0YWJsZUNvbHVtbnMsXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMsXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxTZWFyY2hcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29sdW1uU2VsZWN0aW9uUm93cyhcbiAgICAgIHRoaXMuZ3JvdXBCeVNlbGVjdGFibGVDb2x1bW5zLFxuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyxcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxTZWFyY2hcbiAgICApO1xuICB9XG4gIGdldCBzZWxlY3Rpb25Nb2RhbFBpY2tsaXN0SXRlbXMoKTogQ29sdW1uUGlja2xpc3RJdGVtW10ge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGFsTW9kZSA9PT0gXCJmaWVsZHNcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRDb2x1bW5QaWNrbGlzdEl0ZW1zKHRoaXMuZmllbGRTZWxlY3RhYmxlQ29sdW1ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRDb2x1bW5QaWNrbGlzdEl0ZW1zKHRoaXMuZ3JvdXBCeVNlbGVjdGFibGVDb2x1bW5zKTtcbiAgfVxuICBnZXQgc2VsZWN0aW9uTW9kYWxTZWxlY3RlZFBpY2tsaXN0SWRzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RhbElkc1xuICAgICAgLm1hcCgoaXRlbSkgPT4gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RJZChpdGVtKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChpdGVtKTogaXRlbSBpcyBudW1iZXIgPT4gdHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIgJiYgaXRlbSA+IDBcbiAgICAgICk7XG4gIH1cbiAgZ2V0IGpvaW5Tb3VyY2VSb3dzKCk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZENvbHVtblNlbGVjdGlvblJvd3MoXG4gICAgICB0aGlzLmF2YWlsYWJsZUNvbHVtbnMsXG4gICAgICB0aGlzLmpvaW5EcmFmdC5zb3VyY2VDb2x1bW4gPyBbdGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uXSA6IFtdLFxuICAgICAgdGhpcy5qb2luU291cmNlU2VhcmNoLFxuICAgICAgZmFsc2VcbiAgICApO1xuICB9XG4gIGdldCBqb2luU291cmNlUGlja2xpc3RJdGVtcygpOiBDb2x1bW5QaWNrbGlzdEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRDb2x1bW5QaWNrbGlzdEl0ZW1zKHRoaXMuYXZhaWxhYmxlQ29sdW1ucyk7XG4gIH1cbiAgZ2V0IGpvaW5Tb3VyY2VTZWxlY3RlZFBpY2tsaXN0SWRzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBzZWxlY3RlZElkID0gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RJZCh0aGlzLmpvaW5EcmFmdC5zb3VyY2VDb2x1bW4pO1xuICAgIHJldHVybiB0eXBlb2Ygc2VsZWN0ZWRJZCA9PT0gXCJudW1iZXJcIiAmJiBzZWxlY3RlZElkID4gMFxuICAgICAgPyBbc2VsZWN0ZWRJZF1cbiAgICAgIDogW107XG4gIH1cbiAgZ2V0IGpvaW5UYXJnZXRSb3dzKCk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uKTtcbiAgICBjb25zdCBpdGVtcyA9IHNvdXJjZVxuICAgICAgPyB0aGlzLmF2YWlsYWJsZUNvbHVtbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnRhYmxlICE9PSBzb3VyY2UudGFibGUpXG4gICAgICA6IHRoaXMuYXZhaWxhYmxlQ29sdW1ucztcbiAgICByZXR1cm4gdGhpcy5idWlsZENvbHVtblNlbGVjdGlvblJvd3MoXG4gICAgICBpdGVtcyxcbiAgICAgIHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbiA/IFt0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW5dIDogW10sXG4gICAgICB0aGlzLmpvaW5UYXJnZXRTZWFyY2gsXG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cbiAgZ2V0IGpvaW5UYXJnZXRTZWxlY3RhYmxlQ29sdW1ucygpOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXSB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbik7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgPyB0aGlzLmF2YWlsYWJsZUNvbHVtbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnRhYmxlICE9PSBzb3VyY2UudGFibGUpXG4gICAgICA6IHRoaXMuYXZhaWxhYmxlQ29sdW1ucztcbiAgfVxuICBnZXQgam9pblRhcmdldFBpY2tsaXN0SXRlbXMoKTogQ29sdW1uUGlja2xpc3RJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29sdW1uUGlja2xpc3RJdGVtcyh0aGlzLmpvaW5UYXJnZXRTZWxlY3RhYmxlQ29sdW1ucyk7XG4gIH1cbiAgZ2V0IGpvaW5UYXJnZXRTZWxlY3RlZFBpY2tsaXN0SWRzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBzZWxlY3RlZElkID0gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RJZCh0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4pO1xuICAgIHJldHVybiB0eXBlb2Ygc2VsZWN0ZWRJZCA9PT0gXCJudW1iZXJcIiAmJiBzZWxlY3RlZElkID4gMFxuICAgICAgPyBbc2VsZWN0ZWRJZF1cbiAgICAgIDogW107XG4gIH1cbiAgZ2V0IHNvcnRDb2x1bW5Sb3dzKCk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0U2VsZWN0YWJsZUl0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgICB0aGlzLm1hdGNoZXNTZWFyY2goXG4gICAgICAgICAgW2l0ZW0udGFibGVMYWJlbCwgaXRlbS5maWVsZExhYmVsLCBpdGVtLm1ldGFdLFxuICAgICAgICAgIHRoaXMuc29ydFNlYXJjaFxuICAgICAgICApXG4gICAgICApXG4gICAgICAubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgbmFtZTogaXRlbS5maWVsZExhYmVsLFxuICAgICAgICBtZXRhOiBpdGVtLm1ldGEsXG4gICAgICAgIHNlbGVjdGVkOlxuICAgICAgICAgIHRoaXMuc29ydERyYWZ0LmNvbHVtbiA9PT0gaXRlbS5jb2x1bW4gJiZcbiAgICAgICAgICAodGhpcy5zb3J0RHJhZnQuZnVuY3Rpb25OYW1lIHx8IEVNUFRZX1ZBTFVFKSA9PT0gaXRlbS5mdW5jdGlvbk5hbWUsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgdGFibGVMYWJlbDogaXRlbS50YWJsZUxhYmVsLFxuICAgICAgICBwYXRoVHlwZTogXCJjb2x1bW5cIiBhcyBjb25zdCxcbiAgICAgIH0pKTtcbiAgfVxuICBnZXQgc29ydFBpY2tsaXN0SXRlbXMoKTogU29ydFBpY2tsaXN0SXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0U2VsZWN0YWJsZUl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XG4gICAgICBpZDogaW5kZXggKyAxLFxuICAgICAgdGl0bGU6IGAke2l0ZW0udGFibGVMYWJlbH0uJHtpdGVtLmZpZWxkTGFiZWx9YCxcbiAgICAgIHRpdGxlUHJlZml4OiBpdGVtLnRhYmxlTGFiZWwsXG4gICAgICB0aXRsZVN1ZmZpeDogaXRlbS5maWVsZExhYmVsLFxuICAgICAgdGl0bGVQcmVmaXhDb2xvcjogVklTVUFMX1NRTF9UQUJMRV9DT0xPUixcbiAgICAgIHRpdGxlU3VmZml4Q29sb3I6IFZJU1VBTF9TUUxfRklFTERfQ09MT1IsXG4gICAgICBiYWRnZTogaXRlbS5tZXRhLFxuICAgICAgYmFkZ2VDb2xvcjogaXRlbS5mdW5jdGlvbk5hbWVcbiAgICAgICAgPyBQSUNLTElTVF9GVU5DVElPTl9CQURHRV9DT0xPUlxuICAgICAgICA6IFBJQ0tMSVNUX0RBVEFfVFlQRV9CQURHRV9DT0xPUixcbiAgICAgIHNlbGVjdGlvbklkOiBpdGVtLmlkLFxuICAgICAgY29sdW1uOiBpdGVtLmNvbHVtbixcbiAgICB9KSk7XG4gIH1cbiAgZ2V0IHNvcnRTZWxlY3RlZFBpY2tsaXN0SWRzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc29ydFBpY2tsaXN0SXRlbXMuZmluZChcbiAgICAgIChpdGVtKSA9PlxuICAgICAgICBpdGVtLmNvbHVtbiA9PT0gdGhpcy5zb3J0RHJhZnQuY29sdW1uICYmXG4gICAgICAgIGl0ZW0uc2VsZWN0aW9uSWQgPT09XG4gICAgICAgIHRoaXMuYnVpbGRTb3J0U2VsZWN0aW9uSWQoXG4gICAgICAgICAgdGhpcy5zb3J0RHJhZnQuY29sdW1uLFxuICAgICAgICAgIHRoaXMuc29ydERyYWZ0LmZ1bmN0aW9uTmFtZSB8fCBFTVBUWV9TT1JUX0ZVTkNUSU9OXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkID8gW3NlbGVjdGVkLmlkXSA6IFtdO1xuICB9XG4gIGdldCBmaWx0ZXJDb2x1bW5Sb3dzKCk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZENvbHVtblNlbGVjdGlvblJvd3MoXG4gICAgICB0aGlzLmF2YWlsYWJsZUNvbHVtbnMsXG4gICAgICB0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbiA/IFt0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbl0gOiBbXSxcbiAgICAgIHRoaXMuZmlsdGVyU2VhcmNoLFxuICAgICAgZmFsc2VcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbFBpY2tsaXN0SXRlbXMoKTogQ29sdW1uUGlja2xpc3RJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29sdW1uUGlja2xpc3RJdGVtcyh0aGlzLmF2YWlsYWJsZUNvbHVtbnMpO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbFNlbGVjdGVkUGlja2xpc3RJZHMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLnJlc29sdmVDb2x1bW5QaWNrbGlzdElkKHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uKTtcbiAgICByZXR1cm4gdHlwZW9mIHNlbGVjdGVkSWQgPT09IFwibnVtYmVyXCIgJiYgc2VsZWN0ZWRJZCA+IDBcbiAgICAgID8gW3NlbGVjdGVkSWRdXG4gICAgICA6IFtdO1xuICB9XG4gIGdldCBzb3J0Q29sdW1uU3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNvcnREcmFmdC5jb2x1bW5cbiAgICAgID8gdGhpcy5yZXNvbHZlU29ydERyYWZ0TGFiZWwoKVxuICAgICAgOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5zdGF0ZXMuZW1wdHlTZWxlY3Rpb25gLFxuICAgICAgICBGQUxMQkFDS19FTVBUWV9TRUxFQ1RJT05cbiAgICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlckNvbHVtblN1bW1hcnkoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTikge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZG9tYWluTGFiZWxgLFxuICAgICAgICBcIkV4cHJlc3NhbyBkZSBkb21pbmlvXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbHRlckRyYWZ0LmNvbHVtblxuICAgICAgPyB0aGlzLnJlc29sdmVDb2x1bW5QYXRoKHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uKVxuICAgICAgOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5zdGF0ZXMuZW1wdHlTZWxlY3Rpb25gLFxuICAgICAgICBGQUxMQkFDS19FTVBUWV9TRUxFQ1RJT05cbiAgICAgICk7XG4gIH1cbiAgZ2V0IGpvaW5Tb3VyY2VTdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtblxuICAgICAgPyB0aGlzLnJlc29sdmVDb2x1bW5QYXRoKHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbilcbiAgICAgIDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLmVtcHR5U2VsZWN0aW9uYCxcbiAgICAgICAgRkFMTEJBQ0tfRU1QVFlfU0VMRUNUSU9OXG4gICAgICApO1xuICB9XG4gIGdldCBqb2luVGFyZ2V0U3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW5cbiAgICAgID8gdGhpcy5yZXNvbHZlQ29sdW1uUGF0aCh0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4pXG4gICAgICA6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LnN0YXRlcy5lbXB0eVNlbGVjdGlvbmAsXG4gICAgICAgIEZBTExCQUNLX0VNUFRZX1NFTEVDVElPTlxuICAgICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyT3BlcmF0b3JPcHRpb25zKCk6IER5bmFtaWNWaWV3QnVpbGRlck9wdGlvbltdIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4pO1xuICAgIGlmICghY29sdW1uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbHRlck9wZXJhdG9yc0ZvckNvbHVtbihjb2x1bW4pLm1hcCgodmFsdWUpID0+ICh7XG4gICAgICB2YWx1ZSxcbiAgICAgIHRleHQ6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXhcbiAgICAgICAgfS5maWx0ZXJzLm9wZXJhdG9ycy4ke3ZhbHVlLnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgICAgdGhpcy5odW1hbml6ZUtleSh2YWx1ZSlcbiAgICAgICksXG4gICAgfSkpO1xuICB9XG4gIGdldCBub3JtYWxpemVkRmllbGRzKCk6IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzLm1hcCgoaXRlbSkgPT5cbiAgICAgIHRoaXMubm9ybWFsaXplR2VuZXJhdGVkRmllbGQoaXRlbSlcbiAgICApO1xuICB9XG4gIGdldCBzZWxlY3RlZFNvcnREaXJlY3Rpb25JdGVtKCk6IFNlbGVjdEJ1dHRvbkl0ZW08c3RyaW5nPiB8IG51bGwge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtcy5maW5kKFxuICAgICAgICAoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdGhpcy5zb3J0RHJhZnQuZGlyZWN0aW9uXG4gICAgICApID8/IG51bGxcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJFeHByZXNzaW9uU3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbHRlck1vZGFsTW9kZSA9PT0gRklMVEVSX01PREVfRE9NQUlOKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uLnRyaW0oKTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maWx0ZXJEcmFmdC5jb2x1bW5cbiAgICAgID8gdGhpcy5yZXNvbHZlQ29sdW1uUGF0aCh0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbilcbiAgICAgIDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLmVtcHR5U2VsZWN0aW9uYCxcbiAgICAgICAgRkFMTEJBQ0tfRU1QVFlfU0VMRUNUSU9OXG4gICAgICApO1xuICAgIGNvbnN0IG9wZXJhdG9yID0gdGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvclxuICAgICAgPyB0aGlzLnJlc29sdmVGaWx0ZXJPcGVyYXRvckxhYmVsKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IpXG4gICAgICA6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LnN0YXRlcy5lbXB0eVNlbGVjdGlvbmAsXG4gICAgICAgIEZBTExCQUNLX0VNUFRZX1NFTEVDVElPTlxuICAgICAgKTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVzb2x2ZUZpbHRlckRyYWZ0RGlzcGxheVZhbHVlKCk7XG4gICAgcmV0dXJuIFtjb2x1bW4sIG9wZXJhdG9yLCB2YWx1ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgfCBcIik7XG4gIH1cbiAgZ2V0IGZpbHRlckNvbmZpZ3VyYXRpb25TdW1tYXJ5TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTlxuICAgICAgPyB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmRvbWFpbkxhYmVsYCxcbiAgICAgICAgXCJFeHByZXNzYW8gZGUgZG9taW5pb1wiXG4gICAgICApXG4gICAgICA6IHRoaXMuZmlsdGVyQ29sdW1uU3VtbWFyeTtcbiAgfVxuICBnZXQgZmlsdGVyQmFja1RvU2VsZWN0aW9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjdGlvbnMuYmFja1RvU2VsZWN0aW9uYCxcbiAgICAgIFwiVm9sdGFyIHBhcmEgc2VsZWNhb1wiXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyQmFja1RvQ29uZmlndXJhdGlvbkxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5hY3Rpb25zLmJhY2tUb0NvbmZpZ3VyYXRpb25gLFxuICAgICAgXCJWb2x0YXIgcGFyYSBjb25maWd1cmFjYW9cIlxuICAgICk7XG4gIH1cbiAgZ2V0IHByZXZpZXdDb2x1bW5zKCk6IFRhYmxlQ29sdW1uW10ge1xuICAgIGNvbnN0IGNvbmZpZ0NvbHVtbnMgPSB0aGlzLnJlc29sdmVQcmV2aWV3Q29sdW1ucygpO1xuICAgIHJldHVybiBjb25maWdDb2x1bW5zLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIGZpZWxkOiBpdGVtLmZpZWxkLFxuICAgICAgaGVhZGVyOiBpdGVtLmhlYWRlciA/PyBpdGVtLmZpZWxkLFxuICAgICAgdHlwZTogKGl0ZW0udHlwZSBhcyBUYWJsZUNvbHVtbltcInR5cGVcIl0pID8/IFwidGV4dFwiLFxuICAgIH0pKTtcbiAgfVxuICBnZXQgcHJldmlld1Jvd3MoKTogUm93QmFzZVtdIHtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnByZXZpZXdDb2x1bW5zXG4gICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmZpZWxkKVxuICAgICAgLmZpbHRlcigoZmllbGQpOiBmaWVsZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGZpZWxkID09PSBcInN0cmluZ1wiKTtcbiAgICBjb25zdCByb3dzID0gKCh0aGlzLmNvbmZpZy5wcmV2aWV3Py5yb3dzID8/IFtdKSBhcyBSb3dCYXNlW10pLm1hcCgocm93KSA9PiB7XG4gICAgICBjb25zdCBuZXh0OiBSb3dCYXNlID0ge307XG4gICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgbmV4dFtmaWVsZF0gPSByb3dbZmllbGRdID8/IEVNUFRZX1ZBTFVFO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9KTtcbiAgICBpZiAocm93cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiByb3dzO1xuICAgIH1cbiAgICBpZiAoIWZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IDUgfSkubWFwKChfLCByb3dJbmRleCkgPT4ge1xuICAgICAgY29uc3QgbmV4dDogUm93QmFzZSA9IHt9O1xuICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgIG5leHRbZmllbGRdID0gYCR7ZmllbGR9XyR7cm93SW5kZXggKyAxfWA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0pO1xuICB9XG4gIGdldCBwcmV2aWV3VGFibGVDb25maWcoKTogVGFibGVPcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgcm93czogRFlOQU1JQ19WSUVXX0JVSUxERVJfREVGQVVMVF9UQUJMRV9ST1dTLFxuICAgICAgc2hvd1Jvd3NQZXJQYWdlT3B0aW9uczogdHJ1ZSxcbiAgICAgIHJvd3NQZXJQYWdlT3B0aW9uczogUFJFVklFV19ST1dTX1BFUl9QQUdFX09QVElPTlMsXG4gICAgICBlbXB0eVRpdGxlOiBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZW1wdHkucHJldmlld1RpdGxlYCxcbiAgICAgIGVtcHR5U3VidGl0bGU6IGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5lbXB0eS5wcmV2aWV3VGV4dGAsXG4gICAgfSBhcyBUYWJsZU9wdGlvbnM7XG4gIH1cbiAgZ2V0IHNxbFByZXZpZXcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBnZW5lcmF0ZWRTcWwgPSB0aGlzLmJ1aWxkR2VuZXJhdGVkU3FsKCk7XG4gICAgaWYgKGdlbmVyYXRlZFNxbCkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlZFNxbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm1hbnVhbD8uc3FsID8/IEVNUFRZX1ZBTFVFO1xuICB9XG4gIGdldCBzcWxQcmV2aWV3SGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0TW9kZSA9PT0gXCJzcGxpdFwiID8gXCIxMDAlXCIgOiBcIjI0cmVtXCI7XG4gIH1cbiAgZ2V0IHNxbFByZXZpZXdQYW5lbEhlaWdodCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXRNb2RlID09PSBcInNwbGl0XCJcbiAgICAgID8gdGhpcy5tZWFzdXJlZFNwbGl0UHJldmlld0hlaWdodFxuICAgICAgOiBudWxsO1xuICB9XG4gIGdldCBwcmV2aWV3VG9nZ2xlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjdGlvbnMuJHt0aGlzLnByZXZpZXdWaXNpYmxlID8gXCJoaWRlUHJldmlld1wiIDogXCJzaG93UHJldmlld1wiXG4gICAgICB9YCxcbiAgICAgIHRoaXMucHJldmlld1Zpc2libGUgPyBcIk9jdWx0YXIgcHJldmlld1wiIDogXCJWaXN1YWxpemFyIHByZXZpZXdcIlxuICAgICk7XG4gIH1cbiAgZ2V0IHNlbGVjdGVkRmlsdGVyTW9kZUl0ZW0oKTogU2VsZWN0QnV0dG9uSXRlbTxGaWx0ZXJNb2RhbE1vZGU+IHwgbnVsbCB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZmlsdGVyTW9kZUl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IHRoaXMuZmlsdGVyTW9kYWxNb2RlKSA/P1xuICAgICAgbnVsbFxuICAgICk7XG4gIH1cbiAgdHJhY2tCeUlkKF86IG51bWJlciwgaXRlbTogeyBpZDogc3RyaW5nIH0pOiBzdHJpbmcge1xuICAgIHJldHVybiBpdGVtLmlkO1xuICB9XG4gIHRyYWNrQnlBcnJvdyhfOiBudW1iZXIsIGl0ZW06IEJ1aWxkZXJGbG93QXJyb3cpOiBzdHJpbmcge1xuICAgIHJldHVybiBpdGVtLmlkO1xuICB9XG4gIG9uTGF5b3V0TW9kZUNoYW5nZShpdGVtczogU2VsZWN0QnV0dG9uSXRlbTxCdWlsZGVyTGF5b3V0TW9kZT5bXSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBpdGVtc1swXT8udmFsdWU7XG4gICAgaWYgKG5leHQgPT09IFwic3RhY2tlZFwiIHx8IG5leHQgPT09IFwic3BsaXRcIikge1xuICAgICAgdGhpcy5sYXlvdXRNb2RlID0gbmV4dDtcbiAgICAgIHRoaXMuc3luY1NlbGVjdGVkTGF5b3V0TW9kZUl0ZW1zKCk7XG4gICAgICB0aGlzLnNjaGVkdWxlRmxvd0Fycm93UmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuICB0b2dnbGVQcmV2aWV3KCk6IHZvaWQge1xuICAgIHRoaXMucHJldmlld1Zpc2libGUgPSAhdGhpcy5wcmV2aWV3VmlzaWJsZTtcbiAgICB0aGlzLnNjaGVkdWxlRmxvd0Fycm93UmVmcmVzaCgpO1xuICB9XG4gIG9uU29ydERpcmVjdGlvbkNoYW5nZShpdGVtczogU2VsZWN0QnV0dG9uSXRlbTxzdHJpbmc+W10pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gaXRlbXNbMF0/LnZhbHVlO1xuICAgIGlmIChuZXh0KSB7XG4gICAgICB0aGlzLnNvcnREcmFmdC5kaXJlY3Rpb24gPSBuZXh0O1xuICAgICAgdGhpcy5zeW5jU2VsZWN0ZWRTb3J0RGlyZWN0aW9uSXRlbXMoKTtcbiAgICB9XG4gIH1cbiAgaXNGaWVsZERyb3BJbmRpY2F0b3JWaXNpYmxlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggIT09IG51bGwgJiYgdGhpcy5kcmFnUHJldmlld0luZGV4ID09PSBpbmRleDtcbiAgfVxuICBpc0ZpZWxkRHJvcEluZGljYXRvckF0RW5kVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggIT09IG51bGwgJiZcbiAgICAgIHRoaXMuZHJhZ1ByZXZpZXdJbmRleCA9PT0gdGhpcy5maWVsZEl0ZW1zLmxlbmd0aFxuICAgICk7XG4gIH1cbiAgb25GaWVsZERyYWdTdGFydChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmRyYWdQcmV2aWV3SW5kZXggPSB0aGlzLmdldEZpZWxkUHJldmlld1NvdXJjZUluZGV4ZXMoKS5pbmRleE9mKGluZGV4KTtcbiAgfVxuICBvbkZpZWxkRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCF0YXJnZXQgfHwgdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzaG91bGRJbnNlcnRBZnRlciA9IGV2ZW50LmNsaWVudFggPiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMjtcbiAgICB0aGlzLmRyYWdQcmV2aWV3SW5kZXggPSBNYXRoLm1pbihcbiAgICAgIGluZGV4ICsgKHNob3VsZEluc2VydEFmdGVyID8gMSA6IDApLFxuICAgICAgdGhpcy5maWVsZEl0ZW1zLmxlbmd0aFxuICAgICk7XG4gIH1cbiAgb25GaWVsZERyb3AoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZHJhZ2dpbmdGaWVsZEluZGV4ID09PSBudWxsIHx8IHRoaXMuZHJhZ1ByZXZpZXdJbmRleCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggPSBudWxsO1xuICAgICAgdGhpcy5kcmFnUHJldmlld0luZGV4ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJldmlld0luZGV4ZXMgPSB0aGlzLmdldEZpZWxkUHJldmlld1NvdXJjZUluZGV4ZXMoKTtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzID0gcHJldmlld0luZGV4ZXMubWFwKFxuICAgICAgKGl0ZW1JbmRleCkgPT4gdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpZWxkc1tpdGVtSW5kZXhdXG4gICAgKTtcbiAgICB0aGlzLmRyYWdnaW5nRmllbGRJbmRleCA9IG51bGw7XG4gICAgdGhpcy5kcmFnUHJldmlld0luZGV4ID0gbnVsbDtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb25GaWVsZERyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggPSBudWxsO1xuICAgIHRoaXMuZHJhZ1ByZXZpZXdJbmRleCA9IG51bGw7XG4gIH1cbiAgb3BlbkZpZWxkTW9kYWwoaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID1cbiAgICAgIHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIiA/IHRoaXMubm9ybWFsaXplZEZpZWxkc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5maWVsZE1vZGFsRHJhZnRzID0gdGhpcy5nZXRPcmRlcmVkRmllbGRFbnRyaWVzKCkubWFwKChpdGVtKSA9PiAoe1xuICAgICAgY29sdW1uOiBpdGVtLmNvbHVtbixcbiAgICAgIGFsaWFzOiBpdGVtLmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICB3aWR0aDogaXRlbS53aWR0aD8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgZnVuY3Rpb246IGl0ZW0uZnVuY3Rpb25cbiAgICAgICAgPyB7XG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiBpdGVtLmZ1bmN0aW9uLmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICAgIGFsaWFzOiBpdGVtLmZ1bmN0aW9uLmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgIH1cbiAgICAgICAgOiBudWxsLFxuICAgIH0pKTtcbiAgICB0aGlzLmZpZWxkTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uID0gbnVsbDtcbiAgICB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdCA9IHtcbiAgICAgIGNvbHVtbjogRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbk5hbWU6IEVNUFRZX1ZBTFVFLFxuICAgICAgZnVuY3Rpb25BbGlhczogRU1QVFlfVkFMVUUsXG4gICAgfTtcbiAgICB0aGlzLmZpZWxkTW9kYWxTdGVwID1cbiAgICAgIHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIiAmJiBjdXJyZW50ID8gXCJjb25maWd1cmVcIiA6IFwic2VsZWN0XCI7XG4gICAgdGhpcy5maWVsZE1vZGFsVmlzaWJsZSA9IHRydWU7XG4gIH1cbiAgb3BlbkZpZWxkQ29uZmlndXJhdGlvbk1vZGFsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5PcGVuRmllbGRDb25maWd1cmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuRmllbGRNb2RhbCgwKTtcbiAgfVxuICBjbG9zZUZpZWxkTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5maWVsZE1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZmllbGRNb2RhbFN0ZXAgPSBcInNlbGVjdFwiO1xuICAgIHRoaXMuZmllbGRNb2RhbFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuZmllbGRNb2RhbERyYWZ0cyA9IFtdO1xuICAgIHRoaXMuZmllbGRGdW5jdGlvbkVkaXRDb2x1bW4gPSBudWxsO1xuICAgIHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0ID0ge1xuICAgICAgY29sdW1uOiBFTVBUWV9WQUxVRSxcbiAgICAgIGZ1bmN0aW9uTmFtZTogRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbkFsaWFzOiBFTVBUWV9WQUxVRSxcbiAgICB9O1xuICB9XG4gIGdvVG9GaWVsZE1vZGFsU3RlcChzdGVwOiBGaWVsZE1vZGFsU3RlcCk6IHZvaWQge1xuICAgIGlmIChzdGVwID09PSBcImNvbmZpZ3VyZVwiICYmICF0aGlzLmZpZWxkTW9kYWxEcmFmdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmllbGRNb2RhbFN0ZXAgPSBzdGVwO1xuICAgIGlmIChzdGVwID09PSBcInNlbGVjdFwiKSB7XG4gICAgICB0aGlzLmZpZWxkTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB9XG4gIH1cbiAgYWR2YW5jZUZpZWxkTW9kYWxTdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuZ29Ub0ZpZWxkTW9kYWxTdGVwKFwiY29uZmlndXJlXCIpO1xuICB9XG4gIG9uRmllbGRNb2RhbFRpbWVsaW5lU3RlcFNlbGVjdChldmVudDogVGltZWxpbmVTdGVwU2VsZWN0RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmdvVG9GaWVsZE1vZGFsU3RlcChldmVudC5pdGVtLmlkID09PSBcImNvbmZpZ3VyZVwiID8gXCJjb25maWd1cmVcIiA6IFwic2VsZWN0XCIpO1xuICB9XG4gIHNlbGVjdEZpZWxkTW9kYWxDb2x1bW4oY29sdW1uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5maWVsZE1vZGFsRHJhZnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29sdW1uID09PSBjb2x1bW4pO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICB0aGlzLnJlbW92ZUZpZWxkTW9kYWxEcmFmdChjb2x1bW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmllbGRNb2RhbERyYWZ0cyA9IFtcbiAgICAgIC4uLnRoaXMuZmllbGRNb2RhbERyYWZ0cyxcbiAgICAgIHtcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBhbGlhczogRU1QVFlfVkFMVUUsXG4gICAgICAgIHdpZHRoOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgZnVuY3Rpb246IG51bGwsXG4gICAgICB9LFxuICAgIF07XG4gICAgdGhpcy5maWVsZEZ1bmN0aW9uRWRpdENvbHVtbiA9IG51bGw7XG4gIH1cbiAgc2VsZWN0QWxsRmllbGRNb2RhbENvbHVtbnMoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gbmV3IFNldChcbiAgICAgIHRoaXMuZmllbGRNb2RhbERyYWZ0cy5tYXAoKGl0ZW0pID0+IGl0ZW0uY29sdW1uKVxuICAgICk7XG4gICAgY29uc3Qgcm93c1RvU2VsZWN0ID0gdGhpcy5maWVsZFNlbGVjdGFibGVDb2x1bW5zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiAhc2VsZWN0ZWRDb2x1bW5zLmhhcyhpdGVtLnZhbHVlKVxuICAgICk7XG5cbiAgICBpZiAoIXJvd3NUb1NlbGVjdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZpZWxkTW9kYWxEcmFmdHMgPSBbXG4gICAgICAuLi50aGlzLmZpZWxkTW9kYWxEcmFmdHMsXG4gICAgICAuLi5yb3dzVG9TZWxlY3QubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBjb2x1bW46IGl0ZW0udmFsdWUsXG4gICAgICAgIGFsaWFzOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgd2lkdGg6IEVNUFRZX1ZBTFVFLFxuICAgICAgICBmdW5jdGlvbjogbnVsbCxcbiAgICAgIH0pKSxcbiAgICBdO1xuICAgIHRoaXMuZmllbGRGdW5jdGlvbkVkaXRDb2x1bW4gPSBudWxsO1xuICB9XG4gIGFkZEFub3RoZXJGaWVsZEZyb21Nb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpZWxkTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgICB0aGlzLmZpZWxkTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgfVxuICBvbkZpZWxkTW9kYWxTZWxlY3RlZElkc0NoYW5nZShpZHM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gbmV3IFNldChcbiAgICAgIGlkc1xuICAgICAgICAubWFwKChpdGVtKSA9PiB0aGlzLnJlc29sdmVDb2x1bW5QaWNrbGlzdENvbHVtbihpdGVtKSlcbiAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+ICEhaXRlbSlcbiAgICApO1xuICAgIGNvbnN0IHByZXNlcnZlZERyYWZ0cyA9IHRoaXMuZmllbGRNb2RhbERyYWZ0cy5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICBzZWxlY3RlZENvbHVtbnMuaGFzKGl0ZW0uY29sdW1uKVxuICAgICk7XG4gICAgY29uc3QgcHJlc2VydmVkQ29sdW1ucyA9IG5ldyBTZXQoXG4gICAgICBwcmVzZXJ2ZWREcmFmdHMubWFwKChpdGVtKSA9PiBpdGVtLmNvbHVtbilcbiAgICApO1xuICAgIGNvbnN0IGFwcGVuZGVkRHJhZnRzID0gdGhpcy5maWVsZFNlbGVjdGFibGVDb2x1bW5zXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICBzZWxlY3RlZENvbHVtbnMuaGFzKGl0ZW0udmFsdWUpICYmICFwcmVzZXJ2ZWRDb2x1bW5zLmhhcyhpdGVtLnZhbHVlKVxuICAgICAgKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgY29sdW1uOiBpdGVtLnZhbHVlLFxuICAgICAgICBhbGlhczogRU1QVFlfVkFMVUUsXG4gICAgICAgIHdpZHRoOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgZnVuY3Rpb246IG51bGwsXG4gICAgICB9KSk7XG5cbiAgICB0aGlzLmZpZWxkTW9kYWxEcmFmdHMgPSBbLi4ucHJlc2VydmVkRHJhZnRzLCAuLi5hcHBlbmRlZERyYWZ0c107XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uICYmXG4gICAgICAhc2VsZWN0ZWRDb2x1bW5zLmhhcyh0aGlzLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uKVxuICAgICkge1xuICAgICAgdGhpcy5jYW5jZWxGaWVsZEZ1bmN0aW9uRWRpdCgpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5maWVsZE1vZGFsRHJhZnRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWVsZE1vZGFsU3RlcCA9IFwic2VsZWN0XCI7XG4gICAgfVxuICB9XG4gIG9uRmllbGRNb2RhbEFsaWFzQ2hhbmdlKGNvbHVtbjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXRjaEZpZWxkTW9kYWxEcmFmdChjb2x1bW4sIHsgYWxpYXM6IHZhbHVlIH0pO1xuICB9XG4gIG9uRmllbGRNb2RhbFdpZHRoQ2hhbmdlKGNvbHVtbjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXRjaEZpZWxkTW9kYWxEcmFmdChjb2x1bW4sIHsgd2lkdGg6IHZhbHVlIH0pO1xuICB9XG4gIHJlbW92ZUZpZWxkTW9kYWxEcmFmdChjb2x1bW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmllbGRNb2RhbERyYWZ0cyA9IHRoaXMuZmllbGRNb2RhbERyYWZ0cy5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gaXRlbS5jb2x1bW4gIT09IGNvbHVtblxuICAgICk7XG4gICAgaWYgKHRoaXMuZmllbGRGdW5jdGlvbkVkaXRDb2x1bW4gPT09IGNvbHVtbikge1xuICAgICAgdGhpcy5jYW5jZWxGaWVsZEZ1bmN0aW9uRWRpdCgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZmllbGRNb2RhbERyYWZ0cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmllbGRNb2RhbFN0ZXAgPSBcInNlbGVjdFwiO1xuICAgIH1cbiAgfVxuICBzdGFydEZpZWxkRnVuY3Rpb25FZGl0KGNvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZmllbGRNb2RhbERyYWZ0cy5maW5kKChpdGVtKSA9PiBpdGVtLmNvbHVtbiA9PT0gY29sdW1uKTtcbiAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5maWVsZEZ1bmN0aW9uRWRpdENvbHVtbiA9IGNvbHVtbjtcbiAgICB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdCA9IHtcbiAgICAgIGNvbHVtbixcbiAgICAgIGZ1bmN0aW9uTmFtZTogY3VycmVudC5mdW5jdGlvbj8uZnVuY3Rpb25OYW1lPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbkFsaWFzOiBjdXJyZW50LmZ1bmN0aW9uPy5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgIH07XG4gIH1cbiAgY2FuY2VsRmllbGRGdW5jdGlvbkVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5maWVsZEZ1bmN0aW9uRWRpdENvbHVtbiA9IG51bGw7XG4gICAgdGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQgPSB7XG4gICAgICBjb2x1bW46IEVNUFRZX1ZBTFVFLFxuICAgICAgZnVuY3Rpb25OYW1lOiBFTVBUWV9WQUxVRSxcbiAgICAgIGZ1bmN0aW9uQWxpYXM6IEVNUFRZX1ZBTFVFLFxuICAgIH07XG4gIH1cbiAgb25GaWVsZEZ1bmN0aW9uRHJhZnROYW1lQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbk5hbWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9uRmllbGRGdW5jdGlvbk5hbWVDaGFuZ2UoKTtcbiAgfVxuICBzYXZlRmllbGRGdW5jdGlvbkVkaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGF0Y2hGaWVsZE1vZGFsRHJhZnQodGhpcy5maWVsZEZ1bmN0aW9uRWRpdENvbHVtbiwge1xuICAgICAgZnVuY3Rpb246IHRoaXMuYnVpbGRGaWVsZEZ1bmN0aW9uRHJhZnQoKSxcbiAgICB9KTtcbiAgICB0aGlzLmNhbmNlbEZpZWxkRnVuY3Rpb25FZGl0KCk7XG4gIH1cbiAgaXNGaWVsZEZ1bmN0aW9uRWRpdGluZyhjb2x1bW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uID09PSBjb2x1bW47XG4gIH1cbiAgc2F2ZUZpZWxkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5TYXZlRmllbGRNb2RhbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzID0gdGhpcy5maWVsZE1vZGFsRHJhZnRzLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIGNvbHVtbjogaXRlbS5jb2x1bW4sXG4gICAgICBhbGlhczogaXRlbS5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgd2lkdGg6IGl0ZW0ud2lkdGg/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIGZ1bmN0aW9uOiBpdGVtLmZ1bmN0aW9uPy5mdW5jdGlvbk5hbWU/LnRyaW0oKVxuICAgICAgICA/IHtcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6IGl0ZW0uZnVuY3Rpb24uZnVuY3Rpb25OYW1lLnRyaW0oKSxcbiAgICAgICAgICBhbGlhczogaXRlbS5mdW5jdGlvbi5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICB9XG4gICAgICAgIDogbnVsbCxcbiAgICB9KSk7XG4gICAgdGhpcy5jbG9zZUZpZWxkTW9kYWwoKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb3BlblNvdXJjZU1vZGFsKHN0ZXA6IFNvdXJjZU1vZGFsU3RlcCA9IFwic2VsZWN0XCIpOiB2b2lkIHtcbiAgICB0aGlzLnNvdXJjZU1vZGFsRHJhZnRzID0gdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgdGFibGU6IGl0ZW0udGFibGUsXG4gICAgICBhbGlhczogaXRlbS5hbGlhcz8udHJpbSgpIHx8IHRoaXMucmVzb2x2ZURlZmF1bHRTb3VyY2VBbGlhcyhpdGVtLnRhYmxlKSxcbiAgICB9KSk7XG4gICAgdGhpcy5zb3VyY2VNb2RhbFN0ZXAgPVxuICAgICAgc3RlcCA9PT0gXCJjb25maWd1cmVcIiAmJiB0aGlzLnNvdXJjZU1vZGFsRHJhZnRzLmxlbmd0aFxuICAgICAgICA/IFwiY29uZmlndXJlXCJcbiAgICAgICAgOiBcInNlbGVjdFwiO1xuICAgIHRoaXMuc291cmNlTW9kYWxWaXNpYmxlID0gdHJ1ZTtcbiAgfVxuICBvcGVuU291cmNlQ29uZmlndXJhdGlvbk1vZGFsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5PcGVuU291cmNlQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3BlblNvdXJjZU1vZGFsKFwiY29uZmlndXJlXCIpO1xuICB9XG4gIGNsb3NlU291cmNlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zb3VyY2VNb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnNvdXJjZU1vZGFsU3RlcCA9IFwic2VsZWN0XCI7XG4gICAgdGhpcy5zb3VyY2VNb2RhbERyYWZ0cyA9IFtdO1xuICB9XG4gIGdvVG9Tb3VyY2VNb2RhbFN0ZXAoc3RlcDogU291cmNlTW9kYWxTdGVwKTogdm9pZCB7XG4gICAgaWYgKHN0ZXAgPT09IFwiY29uZmlndXJlXCIgJiYgIXRoaXMuc291cmNlTW9kYWxEcmFmdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zb3VyY2VNb2RhbFN0ZXAgPSBzdGVwO1xuICB9XG4gIGFkdmFuY2VTb3VyY2VNb2RhbFN0ZXAoKTogdm9pZCB7XG4gICAgdGhpcy5nb1RvU291cmNlTW9kYWxTdGVwKFwiY29uZmlndXJlXCIpO1xuICB9XG4gIG9uU291cmNlTW9kYWxUaW1lbGluZVN0ZXBTZWxlY3QoZXZlbnQ6IFRpbWVsaW5lU3RlcFNlbGVjdEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5nb1RvU291cmNlTW9kYWxTdGVwKFxuICAgICAgZXZlbnQuaXRlbS5pZCA9PT0gXCJjb25maWd1cmVcIiA/IFwiY29uZmlndXJlXCIgOiBcInNlbGVjdFwiXG4gICAgKTtcbiAgfVxuICBvblNvdXJjZU1vZGFsU2VsZWN0ZWRJZHNDaGFuZ2UoaWRzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkVGFibGVzID0gdGhpcy5yZXNvbHZlVGFibGVzRnJvbVBpY2tsaXN0SWRzKGlkcyk7XG4gICAgY29uc3QgZHJhZnRCeVRhYmxlID0gbmV3IE1hcChcbiAgICAgIHRoaXMuc291cmNlTW9kYWxEcmFmdHMubWFwKChpdGVtKSA9PiBbaXRlbS50YWJsZSwgaXRlbV0pXG4gICAgKTtcblxuICAgIHRoaXMuc291cmNlTW9kYWxEcmFmdHMgPSBzZWxlY3RlZFRhYmxlcy5tYXAoKHRhYmxlKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gZHJhZnRCeVRhYmxlLmdldCh0YWJsZSk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjdXJyZW50ID8/IHtcbiAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICBhbGlhczogdGhpcy5yZXNvbHZlRGVmYXVsdFNvdXJjZUFsaWFzKHRhYmxlKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5zb3VyY2VNb2RhbERyYWZ0cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc291cmNlTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgICB9XG4gIH1cbiAgb25Tb3VyY2VNb2RhbEFsaWFzQ2hhbmdlKHRhYmxlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNvdXJjZU1vZGFsRHJhZnRzID0gdGhpcy5zb3VyY2VNb2RhbERyYWZ0cy5tYXAoKGl0ZW0pID0+XG4gICAgICBpdGVtLnRhYmxlID09PSB0YWJsZVxuICAgICAgICA/IHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIGFsaWFzOiB2YWx1ZSxcbiAgICAgICAgfVxuICAgICAgICA6IGl0ZW1cbiAgICApO1xuICB9XG4gIHNhdmVTb3VyY2VNb2RhbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc291cmNlTW9kYWxEcmFmdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMgPSB0aGlzLnNvdXJjZU1vZGFsRHJhZnRzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSB0aGlzLnJlc29sdmVUYWJsZU9wdGlvbihpdGVtLnRhYmxlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhYmxlOiBpdGVtLnRhYmxlLFxuICAgICAgICBhbGlhczogaXRlbS5hbGlhcz8udHJpbSgpIHx8IHRoaXMucmVzb2x2ZURlZmF1bHRTb3VyY2VBbGlhcyhpdGVtLnRhYmxlKSwgLy8gTk9TT05BUlxuICAgICAgICBzY2hlbWE6IHRhYmxlPy5zY2hlbWEsXG4gICAgICAgIGxhYmVsOiB0YWJsZT8uZGlzcGxheU5hbWUgfHwgdGFibGU/LnRleHQsIC8vIE5PU09OQVJcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmNsb3NlU291cmNlTW9kYWwoKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb3BlblNlbGVjdGlvbk1vZGFsKG1vZGU6IFNlbGVjdGlvbk1vZGFsTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxNb2RlID0gbW9kZTtcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGFsU2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgaWYgKG1vZGUgPT09IFwidGFibGVzXCIpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMgPSB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcy5tYXAoXG4gICAgICAgIChpdGVtKSA9PiBpdGVtLnRhYmxlXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gXCJmaWVsZHNcIikge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyA9IHRoaXMubm9ybWFsaXplZEZpZWxkcy5tYXAoKGl0ZW0pID0+IGl0ZW0uY29sdW1uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyA9IFsuLi50aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeV07XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxWaXNpYmxlID0gdHJ1ZTtcbiAgfVxuICBjbG9zZVNlbGVjdGlvbk1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgfVxuICB0b2dnbGVTZWxlY3Rpb25Nb2RhbFJvdyhpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyA9IHRoaXMudG9nZ2xlTXVsdGlwbGVWYWx1ZShcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMsXG4gICAgICBpZFxuICAgICk7XG4gIH1cbiAgb25TZWxlY3Rpb25Nb2RhbFNlbGVjdGVkSWRzQ2hhbmdlKGlkczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGFsSWRzID0gdGhpcy5yZXNvbHZlQ29sdW1uc0Zyb21QaWNrbGlzdElkcyhpZHMpO1xuICB9XG4gIG9uU2VsZWN0YWJsZVJvd0tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIiBcIiB8fCBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbCk/LmNsaWNrKCk7XG4gICAgfVxuICB9XG4gIGNvbmZpcm1TZWxlY3Rpb25Nb2RhbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RhbE1vZGUgPT09IFwidGFibGVzXCIpIHtcbiAgICAgIGNvbnN0IGFsaWFzZXMgPSBuZXcgTWFwKFxuICAgICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcy5tYXAoKGl0ZW0pID0+IFtcbiAgICAgICAgICBpdGVtLnRhYmxlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFsaWFzOiBpdGVtLmFsaWFzLFxuICAgICAgICAgICAgc2NoZW1hOiBpdGVtLnNjaGVtYSxcbiAgICAgICAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMgPSAodGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS50YWJsZXMgPz8gW10pXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMuaW5jbHVkZXMoaXRlbS52YWx1ZSkpXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgdGFibGU6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgYWxpYXM6XG4gICAgICAgICAgICBhbGlhc2VzLmdldChpdGVtLnZhbHVlKT8uYWxpYXM/LnRyaW0oKSB8fCB0aGlzLmJ1aWxkQWxpYXNGb3JUYWJsZShpdGVtKSwgLy8gTk9TT05BUlxuICAgICAgICAgIHNjaGVtYTogYWxpYXNlcy5nZXQoaXRlbS52YWx1ZSk/LnNjaGVtYSA/PyBpdGVtLnNjaGVtYSxcbiAgICAgICAgICBsYWJlbDpcbiAgICAgICAgICAgIGFsaWFzZXMuZ2V0KGl0ZW0udmFsdWUpPy5sYWJlbCA/P1xuICAgICAgICAgICAgaXRlbS5kaXNwbGF5TmFtZSA/P1xuICAgICAgICAgICAgaXRlbS50ZXh0LFxuICAgICAgICB9KSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGFsTW9kZSA9PT0gXCJmaWVsZHNcIikge1xuICAgICAgY29uc3QgZmllbGRDb25maWdCeUNvbHVtbiA9IG5ldyBNYXAoXG4gICAgICAgIHRoaXMubm9ybWFsaXplZEZpZWxkcy5tYXAoKGl0ZW0pID0+IFtpdGVtLmNvbHVtbiwgaXRlbV0pXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpZWxkcyA9IHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMubWFwKFxuICAgICAgICAoY29sdW1uKSA9PiBmaWVsZENvbmZpZ0J5Q29sdW1uLmdldChjb2x1bW4pID8/IHsgY29sdW1uIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5ID0gWy4uLnRoaXMuc2VsZWN0aW9uTW9kYWxJZHNdO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlU2VsZWN0aW9uTW9kYWwoKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb3BlbkpvaW5Nb2RhbChpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPVxuICAgICAgdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiID8gdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zW2luZGV4XSA6IG51bGw7XG4gICAgdGhpcy5qb2luRWRpdEluZGV4ID0gdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiID8gaW5kZXggOiBudWxsO1xuICAgIHRoaXMuam9pblNvdXJjZVNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuam9pblRhcmdldFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuam9pbkRyYWZ0ID0ge1xuICAgICAgc291cmNlQ29sdW1uOiBjdXJyZW50Py5zb3VyY2VDb2x1bW4gPz8gRU1QVFlfVkFMVUUsXG4gICAgICB0YXJnZXRDb2x1bW46IGN1cnJlbnQ/LnRhcmdldENvbHVtbiA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIG9wZXJhdG9yOiBjdXJyZW50Py5vcGVyYXRvciA/PyBERUZBVUxUX0pPSU5fT1BFUkFUT1IsXG4gICAgfTtcbiAgICB0aGlzLmpvaW5Nb2RhbFZpc2libGUgPSB0cnVlO1xuICB9XG4gIGNsb3NlSm9pbk1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuam9pbk1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuam9pbkVkaXRJbmRleCA9IG51bGw7XG4gICAgdGhpcy5qb2luU291cmNlU2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5qb2luVGFyZ2V0U2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5qb2luRHJhZnQgPSB7XG4gICAgICBzb3VyY2VDb2x1bW46IEVNUFRZX1ZBTFVFLFxuICAgICAgdGFyZ2V0Q29sdW1uOiBFTVBUWV9WQUxVRSxcbiAgICAgIG9wZXJhdG9yOiBERUZBVUxUX0pPSU5fT1BFUkFUT1IsXG4gICAgfTtcbiAgfVxuICBzZWxlY3RKb2luU291cmNlKGNvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uID1cbiAgICAgIHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbiA9PT0gY29sdW1uID8gRU1QVFlfVkFMVUUgOiBjb2x1bW47XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbik7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbik7XG4gICAgaWYgKHNvdXJjZSAmJiB0YXJnZXQgJiYgc291cmNlLnRhYmxlID09PSB0YXJnZXQudGFibGUpIHtcbiAgICAgIHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbiA9IEVNUFRZX1ZBTFVFO1xuICAgIH1cbiAgfVxuICBvbkpvaW5Tb3VyY2VTZWxlY3RlZElkc0NoYW5nZShpZHM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlTGFzdENvbHVtbkZyb21QaWNrbGlzdElkcyhpZHMpO1xuXG4gICAgdGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uID1cbiAgICAgIGNvbHVtbiAmJiBjb2x1bW4gPT09IHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbiA/IEVNUFRZX1ZBTFVFIDogY29sdW1uID8/IEVNUFRZX1ZBTFVFO1xuXG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbik7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbik7XG4gICAgaWYgKHNvdXJjZSAmJiB0YXJnZXQgJiYgc291cmNlLnRhYmxlID09PSB0YXJnZXQudGFibGUpIHtcbiAgICAgIHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbiA9IEVNUFRZX1ZBTFVFO1xuICAgIH1cbiAgfVxuICBzZWxlY3RKb2luVGFyZ2V0KGNvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5qb2luRHJhZnQudGFyZ2V0Q29sdW1uID1cbiAgICAgIHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbiA9PT0gY29sdW1uID8gRU1QVFlfVkFMVUUgOiBjb2x1bW47XG4gIH1cbiAgb25Kb2luVGFyZ2V0U2VsZWN0ZWRJZHNDaGFuZ2UoaWRzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMucmVzb2x2ZUxhc3RDb2x1bW5Gcm9tUGlja2xpc3RJZHMoaWRzKTtcbiAgICB0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4gPVxuICAgICAgY29sdW1uICYmIGNvbHVtbiA9PT0gdGhpcy5qb2luRHJhZnQudGFyZ2V0Q29sdW1uID8gRU1QVFlfVkFMVUUgOiBjb2x1bW4gPz8gRU1QVFlfVkFMVUU7XG4gIH1cbiAgc2F2ZUpvaW4oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblNhdmVKb2luKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHQ6IER5bmFtaWNWaWV3QnVpbGRlckpvaW4gPSB7XG4gICAgICBzb3VyY2VDb2x1bW46IHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbixcbiAgICAgIHRhcmdldENvbHVtbjogdGhpcy5qb2luRHJhZnQudGFyZ2V0Q29sdW1uLFxuICAgICAgb3BlcmF0b3I6IHRoaXMuam9pbkRyYWZ0Lm9wZXJhdG9yLFxuICAgIH07XG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zXTtcbiAgICBpZiAodGhpcy5qb2luRWRpdEluZGV4ID09PSBudWxsKSB7XG4gICAgICBpdGVtcy5wdXNoKG5leHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtc1t0aGlzLmpvaW5FZGl0SW5kZXhdID0gbmV4dDtcbiAgICB9XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zID0gdGhpcy5kZWR1cGxpY2F0ZUJ5S2V5KGl0ZW1zLCAoaXRlbSkgPT5cbiAgICAgIFtpdGVtLnNvdXJjZUNvbHVtbiwgaXRlbS50YXJnZXRDb2x1bW4sIGl0ZW0ub3BlcmF0b3JdLmpvaW4oXCJ8XCIpXG4gICAgKTtcbiAgICB0aGlzLmNsb3NlSm9pbk1vZGFsKCk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIG9wZW5Tb3J0TW9kYWwoaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID1cbiAgICAgIHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIiA/IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3J0aW5nW2luZGV4XSA6IG51bGw7XG4gICAgdGhpcy5zb3J0RWRpdEluZGV4ID0gdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiID8gaW5kZXggOiBudWxsO1xuICAgIHRoaXMuc29ydFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuc29ydERyYWZ0ID0ge1xuICAgICAgY29sdW1uOiBjdXJyZW50Py5jb2x1bW4gPz8gRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbk5hbWU6IGN1cnJlbnQ/LmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgZGlyZWN0aW9uOiBjdXJyZW50Py5kaXJlY3Rpb24gPz8gREVGQVVMVF9TT1JUX0RJUkVDVElPTixcbiAgICB9O1xuICAgIHRoaXMuc29ydE1vZGFsVmlzaWJsZSA9IHRydWU7XG4gIH1cbiAgY2xvc2VTb3J0TW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zb3J0TW9kYWxWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5zb3J0RWRpdEluZGV4ID0gbnVsbDtcbiAgICB0aGlzLnNvcnRTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLnNvcnREcmFmdCA9IHtcbiAgICAgIGNvbHVtbjogRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbk5hbWU6IEVNUFRZX1ZBTFVFLFxuICAgICAgZGlyZWN0aW9uOiBERUZBVUxUX1NPUlRfRElSRUNUSU9OLFxuICAgIH07XG4gIH1cbiAgc2VsZWN0U29ydENvbHVtbihzb3J0U2VsZWN0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLnBhcnNlU29ydFNlbGVjdGlvbklkKHNvcnRTZWxlY3Rpb25JZCk7XG4gICAgY29uc3QgaXNTYW1lU2VsZWN0aW9uID1cbiAgICAgIHRoaXMuc29ydERyYWZ0LmNvbHVtbiA9PT0gbmV4dC5jb2x1bW4gJiZcbiAgICAgICh0aGlzLnNvcnREcmFmdC5mdW5jdGlvbk5hbWUgfHwgRU1QVFlfVkFMVUUpID09PSBuZXh0LmZ1bmN0aW9uTmFtZTtcblxuICAgIHRoaXMuc29ydERyYWZ0LmNvbHVtbiA9IGlzU2FtZVNlbGVjdGlvbiA/IEVNUFRZX1ZBTFVFIDogbmV4dC5jb2x1bW47XG4gICAgdGhpcy5zb3J0RHJhZnQuZnVuY3Rpb25OYW1lID0gaXNTYW1lU2VsZWN0aW9uXG4gICAgICA/IEVNUFRZX1ZBTFVFXG4gICAgICA6IG5leHQuZnVuY3Rpb25OYW1lO1xuICB9XG4gIG9uU29ydFNlbGVjdGVkSWRzQ2hhbmdlKGlkczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZElkID0gaWRzLmF0KC0xKTtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLnNvcnRQaWNrbGlzdEl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHNlbGVjdGVkSWQpO1xuXG4gICAgaWYgKCFzZWxlY3RlZEl0ZW0pIHtcbiAgICAgIHRoaXMuc29ydERyYWZ0LmNvbHVtbiA9IEVNUFRZX1ZBTFVFO1xuICAgICAgdGhpcy5zb3J0RHJhZnQuZnVuY3Rpb25OYW1lID0gRU1QVFlfVkFMVUU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RTb3J0Q29sdW1uKHNlbGVjdGVkSXRlbS5zZWxlY3Rpb25JZCk7XG4gIH1cbiAgc2F2ZVNvcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblNhdmVTb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHQ6IER5bmFtaWNWaWV3QnVpbGRlclNvcnQgPSB7XG4gICAgICBjb2x1bW46IHRoaXMuc29ydERyYWZ0LmNvbHVtbixcbiAgICAgIGZ1bmN0aW9uTmFtZTogdGhpcy5zb3J0RHJhZnQuZnVuY3Rpb25OYW1lIHx8IHVuZGVmaW5lZCxcbiAgICAgIGRpcmVjdGlvbjogdGhpcy5zb3J0RHJhZnQuZGlyZWN0aW9uLFxuICAgIH07XG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvcnRpbmddO1xuICAgIGlmICh0aGlzLnNvcnRFZGl0SW5kZXggPT09IG51bGwpIHtcbiAgICAgIGl0ZW1zLnB1c2gobmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zW3RoaXMuc29ydEVkaXRJbmRleF0gPSBuZXh0O1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc29ydGluZyA9IHRoaXMuZGVkdXBsaWNhdGVCeUtleShpdGVtcywgKGl0ZW0pID0+XG4gICAgICBbaXRlbS5jb2x1bW4sIGl0ZW0uZnVuY3Rpb25OYW1lID8/IEVNUFRZX1ZBTFVFLCBpdGVtLmRpcmVjdGlvbl0uam9pbihcInxcIilcbiAgICApO1xuICAgIHRoaXMuY2xvc2VTb3J0TW9kYWwoKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb3BlbkZpbHRlck1vZGFsKGluZGV4PzogbnVtYmVyKTogdm9pZCB7IC8vIE5PU09OQVIgLSBjb21wbGV4aXR5OiBleHRyYWN0aW9uIHdvdWxkIHJpc2sgYmVoYXZpb3IgY2hhbmdlXG4gICAgY29uc3QgY3VycmVudCA9XG4gICAgICB0eXBlb2YgaW5kZXggPT09IFwibnVtYmVyXCIgPyB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmlsdGVyc1tpbmRleF0gOiBudWxsO1xuICAgIHRoaXMuZmlsdGVyRWRpdEluZGV4ID0gdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiID8gaW5kZXggOiBudWxsO1xuICAgIHRoaXMuZmlsdGVyTW9kYWxNb2RlID1cbiAgICAgIGN1cnJlbnQ/LnZhbHVlVHlwZSA9PT0gRklMVEVSX01PREVfRE9NQUlOID8gRklMVEVSX01PREVfRE9NQUlOIDogXCJjb25kaXRpb25cIjtcbiAgICB0aGlzLmZpbHRlck1vZGFsU3RlcCA9IHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIiAmJiBjdXJyZW50ID8gXCJjb25maWd1cmVcIiA6IFwic2VsZWN0XCI7XG4gICAgdGhpcy5maWx0ZXJTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0ID0ge1xuICAgICAgbW9kZTogdGhpcy5maWx0ZXJNb2RhbE1vZGUsXG4gICAgICBjb2x1bW46IGN1cnJlbnQ/LmNvbHVtbiA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIG9wZXJhdG9yOiBjdXJyZW50Py5vcGVyYXRvciA/PyBERUZBVUxUX0ZJTFRFUl9PUEVSQVRPUixcbiAgICAgIGNvbm5lY3RvcjogY3VycmVudD8uY29ubmVjdG9yID8/IERFRkFVTFRfRklMVEVSX0NPTk5FQ1RPUixcbiAgICAgIG9wdGlvbmFsOiBjdXJyZW50Py5vcHRpb25hbCA/PyBmYWxzZSxcbiAgICAgIHZhbHVlVHlwZTogY3VycmVudD8udmFsdWVUeXBlID8/IERFRkFVTFRfRklMVEVSX1ZBTFVFX1RZUEUsXG4gICAgICB2YWx1ZTogY3VycmVudD8udmFsdWUgPz8gRU1QVFlfVkFMVUUsXG4gICAgICB2YWx1ZXNUZXh0OiBjdXJyZW50Py52YWx1ZXM/LmpvaW4oXCIsIFwiKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIGJldHdlZW5TdGFydDogY3VycmVudD8udmFsdWVzPy5bMF0gPz8gRU1QVFlfVkFMVUUsXG4gICAgICBiZXR3ZWVuRW5kOiBjdXJyZW50Py52YWx1ZXM/LlsxXSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIHBhcmFtZXRlck5hbWU6IGN1cnJlbnQ/LnBhcmFtZXRlck5hbWUgPz8gRU1QVFlfVkFMVUUsXG4gICAgICBkb21haW5FeHByZXNzaW9uOiBjdXJyZW50Py5kb21haW5FeHByZXNzaW9uID8/IEVNUFRZX1ZBTFVFLFxuICAgIH07XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRGaWx0ZXJNb2RlSXRlbXMoKTtcbiAgICB0aGlzLmZpbHRlck1vZGFsVmlzaWJsZSA9IHRydWU7XG4gIH1cbiAgY2xvc2VGaWx0ZXJNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlck1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZmlsdGVyRWRpdEluZGV4ID0gbnVsbDtcbiAgICB0aGlzLmZpbHRlck1vZGFsU3RlcCA9IFwic2VsZWN0XCI7XG4gICAgdGhpcy5maWx0ZXJNb2RhbE1vZGUgPSBcImNvbmRpdGlvblwiO1xuICAgIHRoaXMuZmlsdGVyU2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdCA9IHtcbiAgICAgIG1vZGU6IFwiY29uZGl0aW9uXCIsXG4gICAgICBjb2x1bW46IEVNUFRZX1ZBTFVFLFxuICAgICAgb3BlcmF0b3I6IERFRkFVTFRfRklMVEVSX09QRVJBVE9SLFxuICAgICAgY29ubmVjdG9yOiBERUZBVUxUX0ZJTFRFUl9DT05ORUNUT1IsXG4gICAgICBvcHRpb25hbDogZmFsc2UsXG4gICAgICB2YWx1ZVR5cGU6IERFRkFVTFRfRklMVEVSX1ZBTFVFX1RZUEUsXG4gICAgICB2YWx1ZTogRU1QVFlfVkFMVUUsXG4gICAgICB2YWx1ZXNUZXh0OiBFTVBUWV9WQUxVRSxcbiAgICAgIGJldHdlZW5TdGFydDogRU1QVFlfVkFMVUUsXG4gICAgICBiZXR3ZWVuRW5kOiBFTVBUWV9WQUxVRSxcbiAgICAgIHBhcmFtZXRlck5hbWU6IEVNUFRZX1ZBTFVFLFxuICAgICAgZG9tYWluRXhwcmVzc2lvbjogRU1QVFlfVkFMVUUsXG4gICAgfTtcbiAgICB0aGlzLnN5bmNTZWxlY3RlZEZpbHRlck1vZGVJdGVtcygpO1xuICB9XG4gIHNlbGVjdEZpbHRlckNvbHVtbihjb2x1bW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uID1cbiAgICAgIHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uID09PSBjb2x1bW4gPyBFTVBUWV9WQUxVRSA6IGNvbHVtbjtcbiAgICB0aGlzLnJlc2V0RmlsdGVyRHJhZnRWYWx1ZVN0YXRlKCk7XG4gIH1cbiAgb25GaWx0ZXJNb2RhbFNlbGVjdGVkSWRzQ2hhbmdlKGlkczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0U2VsZWN0ZWRJZCA9IGlkcy5hdCgtMSk7XG4gICAgY29uc3QgbmV4dENvbHVtbiA9XG4gICAgICB0eXBlb2YgbmV4dFNlbGVjdGVkSWQgPT09IFwibnVtYmVyXCJcbiAgICAgICAgPyB0aGlzLnJlc29sdmVDb2x1bW5QaWNrbGlzdENvbHVtbihuZXh0U2VsZWN0ZWRJZCkgPz8gRU1QVFlfVkFMVUVcbiAgICAgICAgOiBFTVBUWV9WQUxVRTtcblxuICAgIHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uID0gbmV4dENvbHVtbjtcbiAgICB0aGlzLnJlc2V0RmlsdGVyRHJhZnRWYWx1ZVN0YXRlKCk7XG4gIH1cbiAgcHJpdmF0ZSByZXNldEZpbHRlckRyYWZ0VmFsdWVTdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdE9wZXJhdG9yID1cbiAgICAgIHRoaXMuZmlsdGVyT3BlcmF0b3JPcHRpb25zWzBdPy52YWx1ZSA/PyBERUZBVUxUX0ZJTFRFUl9PUEVSQVRPUjtcbiAgICB0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yID0gZmlyc3RPcGVyYXRvcjtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC52YWx1ZXNUZXh0ID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC5iZXR3ZWVuU3RhcnQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5FbmQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWUgPSBFTVBUWV9WQUxVRTtcbiAgfVxuICBnb1RvRmlsdGVyTW9kYWxTdGVwKHN0ZXA6IEZpbHRlck1vZGFsU3RlcCk6IHZvaWQge1xuICAgIGlmIChzdGVwID09PSBcImNvbmZpZ3VyZVwiICYmICF0aGlzLmZpbHRlck1vZGFsQ2FuUHJvY2VlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdGVwID09PSBcInJldmlld1wiICYmICF0aGlzLmZpbHRlck1vZGFsQ2FuUmV2aWV3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJNb2RhbFN0ZXAgPSBzdGVwO1xuXG4gICAgaWYgKHN0ZXAgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgIHRoaXMuZmlsdGVyU2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgfVxuICB9XG4gIGFkdmFuY2VGaWx0ZXJNb2RhbFN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmlsdGVyTW9kYWxTZWxlY3Rpb25TdGVwQWN0aXZlKSB7XG4gICAgICB0aGlzLmdvVG9GaWx0ZXJNb2RhbFN0ZXAoXCJjb25maWd1cmVcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyTW9kYWxDb25maWd1cmF0aW9uU3RlcEFjdGl2ZSkge1xuICAgICAgdGhpcy5nb1RvRmlsdGVyTW9kYWxTdGVwKFwicmV2aWV3XCIpO1xuICAgIH1cbiAgfVxuICBvbkZpbHRlclZhbHVlVHlwZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC52YWx1ZXNUZXh0ID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC5iZXR3ZWVuU3RhcnQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5FbmQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWUgPSBFTVBUWV9WQUxVRTtcbiAgfVxuICBvbkZpbHRlck9wZXJhdG9yQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRHJhZnQudmFsdWUgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlc1RleHQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5TdGFydCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuZmlsdGVyRHJhZnQuYmV0d2VlbkVuZCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuZmlsdGVyRHJhZnQucGFyYW1ldGVyTmFtZSA9IEVNUFRZX1ZBTFVFO1xuXG4gICAgaWYgKCF0aGlzLmZpbHRlck5lZWRzVmFsdWUpIHtcbiAgICAgIHRoaXMuZmlsdGVyRHJhZnQudmFsdWVUeXBlID0gREVGQVVMVF9GSUxURVJfVkFMVUVfVFlQRTtcbiAgICB9XG4gIH1cbiAgb25GaWx0ZXJNb2RlQ2hhbmdlKG1vZGU6IEZpbHRlck1vZGFsTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyTW9kYWxNb2RlID0gbW9kZTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0Lm1vZGUgPSBtb2RlO1xuICAgIHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvciA9IERFRkFVTFRfRklMVEVSX09QRVJBVE9SO1xuICAgIHRoaXMuZmlsdGVyRHJhZnQudmFsdWVUeXBlID0gREVGQVVMVF9GSUxURVJfVkFMVUVfVFlQRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC52YWx1ZXNUZXh0ID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC5iZXR3ZWVuU3RhcnQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5FbmQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWUgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LmRvbWFpbkV4cHJlc3Npb24gPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlck1vZGFsU3RlcCA9IFwic2VsZWN0XCI7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRGaWx0ZXJNb2RlSXRlbXMoKTtcbiAgfVxuICBvbkZpbHRlck1vZGFsVGltZWxpbmVTdGVwU2VsZWN0KGV2ZW50OiBUaW1lbGluZVN0ZXBTZWxlY3RFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5pdGVtLmlkID09PSBcInJldmlld1wiKSB7XG4gICAgICB0aGlzLmdvVG9GaWx0ZXJNb2RhbFN0ZXAoXCJyZXZpZXdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5nb1RvRmlsdGVyTW9kYWxTdGVwKGV2ZW50Lml0ZW0uaWQgPT09IFwiY29uZmlndXJlXCIgPyBcImNvbmZpZ3VyZVwiIDogXCJzZWxlY3RcIik7XG4gIH1cbiAgc2F2ZUZpbHRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5idWlsZEZpbHRlckZyb21EcmFmdCgpO1xuXG4gICAgaWYgKCFuZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnNdO1xuICAgIGlmICh0aGlzLmZpbHRlckVkaXRJbmRleCA9PT0gbnVsbCkge1xuICAgICAgaXRlbXMucHVzaChuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNbdGhpcy5maWx0ZXJFZGl0SW5kZXhdID0gbmV4dDtcbiAgICB9XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMgPSBpdGVtcztcbiAgICB0aGlzLmNsb3NlRmlsdGVyTW9kYWwoKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb25Tb3VyY2VBbGlhc0NoYW5nZShpbmRleDogbnVtYmVyLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzW2luZGV4XTtcbiAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnJlc29sdmVUYWJsZU9wdGlvbihjdXJyZW50LnRhYmxlKTtcbiAgICBjdXJyZW50LmFsaWFzID1cbiAgICAgIHZhbHVlLnRyaW0oKSB8fCAodGFibGUgPyB0aGlzLmJ1aWxkQWxpYXNGb3JUYWJsZSh0YWJsZSkgOiBjdXJyZW50LmFsaWFzKTtcbiAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoKTtcbiAgICB0aGlzLnNjaGVkdWxlRmxvd0Fycm93UmVmcmVzaCgpO1xuICB9XG4gIHJlbW92ZVNvdXJjZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgcmVtb3ZlSm9pbihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIHJlbW92ZUdyb3VwQnkoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5LnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIHJlbW92ZUZpZWxkKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIHJlbW92ZVNvcnQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3J0aW5nLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIHJlbW92ZUZpbHRlcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgY2xlYXJTb3VyY2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzID0gW107XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIGNsZWFySm9pbnMoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zID0gW107XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIGNsZWFyR3JvdXBCeSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeSA9IFtdO1xuICAgIHRoaXMuYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTtcbiAgfVxuICBjbGVhckZpZWxkcygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzID0gW107XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIGNsZWFyU29ydGluZygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc29ydGluZyA9IFtdO1xuICAgIHRoaXMuYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTtcbiAgfVxuICBjbGVhckZpbHRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMgPSBbXTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgaGFuZGxlU2F2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNhbml0aXplQnVpbGRlcigpO1xuICAgIHRoaXMuc2F2ZS5lbWl0KGNyZWF0ZUR5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyh0aGlzLmNvbmZpZykpO1xuICB9XG4gIHByaXZhdGUgYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zYW5pdGl6ZUJ1aWxkZXIoKTtcbiAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoKTtcbiAgICB0aGlzLnNjaGVkdWxlRmxvd0Fycm93UmVmcmVzaCgpO1xuICB9XG4gIHByaXZhdGUgZW1pdENvbmZpZ0NoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ0NoYW5nZS5lbWl0KGNyZWF0ZUR5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyh0aGlzLmNvbmZpZykpO1xuICB9XG4gIHByaXZhdGUgc2FuaXRpemVCdWlsZGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYmxlc0J5SWQgPSBuZXcgTWFwKFxuICAgICAgKHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEudGFibGVzID8/IFtdKS5tYXAoKGl0ZW0pID0+IFtpdGVtLnZhbHVlLCBpdGVtXSlcbiAgICApO1xuICAgIGNvbnN0IHNlbGVjdGVkU291cmNlcyA9IHRoaXMuZGVkdXBsaWNhdGVCeUtleShcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgICAgdGFibGVzQnlJZC5oYXMoaXRlbS50YWJsZSlcbiAgICAgICksXG4gICAgICAoaXRlbSkgPT4gaXRlbS50YWJsZVxuICAgICkubWFwKChpdGVtKSA9PiAoe1xuICAgICAgdGFibGU6IGl0ZW0udGFibGUsXG4gICAgICBhbGlhczpcbiAgICAgICAgaXRlbS5hbGlhcz8udHJpbSgpIHx8XG4gICAgICAgIHRoaXMuYnVpbGRBbGlhc0ZvclRhYmxlKFxuICAgICAgICAgIHRhYmxlc0J5SWQuZ2V0KGl0ZW0udGFibGUpIGFzIER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uXG4gICAgICAgICksXG4gICAgICBzY2hlbWE6IGl0ZW0uc2NoZW1hID8/IHRhYmxlc0J5SWQuZ2V0KGl0ZW0udGFibGUpPy5zY2hlbWEsXG4gICAgICBsYWJlbDpcbiAgICAgICAgaXRlbS5sYWJlbCA/P1xuICAgICAgICB0YWJsZXNCeUlkLmdldChpdGVtLnRhYmxlKT8uZGlzcGxheU5hbWUgPz9cbiAgICAgICAgdGFibGVzQnlJZC5nZXQoaXRlbS50YWJsZSk/LnRleHQsXG4gICAgfSkpO1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzID0gc2VsZWN0ZWRTb3VyY2VzO1xuICAgIGNvbnN0IHNlbGVjdGVkVGFibGVJZHMgPSBuZXcgU2V0KHNlbGVjdGVkU291cmNlcy5tYXAoKGl0ZW0pID0+IGl0ZW0udGFibGUpKTtcbiAgICBjb25zdCBhdmFpbGFibGVDb2x1bW5zID0gKHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEuY29sdW1ucyA/PyBbXSkuZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+IHNlbGVjdGVkVGFibGVJZHMuaGFzKGl0ZW0udGFibGUpXG4gICAgKTtcbiAgICBjb25zdCBhdmFpbGFibGVDb2x1bW5NYXAgPSBuZXcgTWFwKFxuICAgICAgYXZhaWxhYmxlQ29sdW1ucy5tYXAoKGl0ZW0pID0+IFtpdGVtLnZhbHVlLCBpdGVtXSlcbiAgICApO1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5ID0gdGhpcy5kZWR1cGxpY2F0ZUJ5S2V5KFxuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnkuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF2YWlsYWJsZUNvbHVtbk1hcC5nZXQoaXRlbSk7XG4gICAgICAgIHJldHVybiAhIWNvbHVtbiAmJiBjb2x1bW4uaXNBZ2dyZWdhdGFibGUgIT09IGZhbHNlO1xuICAgICAgfSksXG4gICAgICAoaXRlbSkgPT4gaXRlbVxuICAgICk7XG4gICAgY29uc3QgZ3JvdXBCeVNldCA9IG5ldyBTZXQodGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnkpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWVsZHMgPSB0aGlzLm1lcmdlTGVnYWN5RnVuY3Rpb25zSW50b0ZpZWxkcyhcbiAgICAgIHRoaXMubm9ybWFsaXplZEZpZWxkcyxcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5mdW5jdGlvbnNcbiAgICApO1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWVsZHMgPSB0aGlzLmRlZHVwbGljYXRlQnlLZXkoXG4gICAgICBub3JtYWxpemVkRmllbGRzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBhdmFpbGFibGVDb2x1bW5NYXAuZ2V0KGl0ZW0uY29sdW1uKTtcbiAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ3JvdXBCeVNldC5oYXMoaXRlbS5jb2x1bW4pIHx8ICghIWl0ZW0uZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZSAmJiBjb2x1bW4uaXNBZ2dyZWdhdGFibGUgIT09IGZhbHNlKTtcbiAgICAgIH0pLFxuICAgICAgKGl0ZW0pID0+IGAke2l0ZW0uY29sdW1ufXwke2l0ZW0uZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZSA/PyBFTVBUWV9WQUxVRX1gXG4gICAgKTtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZnVuY3Rpb25zID0gdGhpcy5leHRyYWN0RnVuY3Rpb25zRnJvbUZpZWxkcyhcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWVsZHMubWFwKChpdGVtKSA9PiB0aGlzLm5vcm1hbGl6ZUdlbmVyYXRlZEZpZWxkKGl0ZW0pKVxuICAgICk7XG4gICAgY29uc3Qgc29ydEFsbG93ZWQgPSBuZXcgU2V0KFxuICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5pZClcbiAgICApO1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3J0aW5nID0gdGhpcy5kZWR1cGxpY2F0ZUJ5S2V5KFxuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvcnRpbmcuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgICBzb3J0QWxsb3dlZC5oYXMoXG4gICAgICAgICAgdGhpcy5idWlsZFNvcnRTZWxlY3Rpb25JZChpdGVtLmNvbHVtbiwgaXRlbS5mdW5jdGlvbk5hbWUgPz8gRU1QVFlfVkFMVUUpXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICAoaXRlbSkgPT4gYCR7aXRlbS5jb2x1bW59fCR7aXRlbS5mdW5jdGlvbk5hbWUgPz8gRU1QVFlfVkFMVUV9fCR7aXRlbS5kaXJlY3Rpb259YFxuICAgICk7XG4gICAgaWYgKHNlbGVjdGVkU291cmNlcy5sZW5ndGggPCAyKSB7XG4gICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuam9pbnMgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zID0gdGhpcy5kZWR1cGxpY2F0ZUJ5S2V5KFxuICAgICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuam9pbnMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gYXZhaWxhYmxlQ29sdW1uTWFwLmdldChpdGVtLnNvdXJjZUNvbHVtbik7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gYXZhaWxhYmxlQ29sdW1uTWFwLmdldChpdGVtLnRhcmdldENvbHVtbik7XG4gICAgICAgICAgcmV0dXJuICEhc291cmNlICYmICEhdGFyZ2V0ICYmIHNvdXJjZS50YWJsZSAhPT0gdGFyZ2V0LnRhYmxlO1xuICAgICAgICB9KSxcbiAgICAgICAgKGl0ZW0pID0+IGAke2l0ZW0uc291cmNlQ29sdW1ufXwke2l0ZW0udGFyZ2V0Q29sdW1ufXwke2l0ZW0ub3BlcmF0b3J9YFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMgPSB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmlsdGVycy5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS52YWx1ZVR5cGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTikge1xuICAgICAgICAgIHJldHVybiAhIWl0ZW0uZG9tYWluRXhwcmVzc2lvbj8udHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhdmFpbGFibGVDb2x1bW5NYXAuaGFzKGl0ZW0uY29sdW1uKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZVByZXZpZXdDb2x1bW5zKCk6IFByZXZpZXdDb2x1bW5MaWtlW10ge1xuICAgIGNvbnN0IHByZXZpZXdDb2x1bW5zID0gKFxuICAgICAgKHRoaXMuY29uZmlnLnByZXZpZXc/LmNvbHVtbnMgPz8gW10pIGFzIFByZXZpZXdDb2x1bW5MaWtlW11cbiAgICApXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0/LmZpZWxkKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgZmllbGQ6IGl0ZW0uZmllbGQsXG4gICAgICAgIGhlYWRlcjogaXRlbS5oZWFkZXIgPz8gaXRlbS5maWVsZCxcbiAgICAgICAgdHlwZTogaXRlbS50eXBlLFxuICAgICAgfSkpO1xuICAgIGlmIChwcmV2aWV3Q29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBwcmV2aWV3Q29sdW1ucztcbiAgICB9XG4gICAgY29uc3QgZ2VuZXJhdGVkQ29sdW1ucyA9IFtcbiAgICAgIC4uLnRoaXMubm9ybWFsaXplZEZpZWxkcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgIGZpZWxkOlxuICAgICAgICAgIGl0ZW0uZnVuY3Rpb24/LmFsaWFzPy50cmltKCkgfHwgLy8gTk9TT05BUlxuICAgICAgICAgIGl0ZW0uYWxpYXM/LnRyaW0oKSB8fCAvLyBOT1NPTkFSXG4gICAgICAgICAgaXRlbS5jb2x1bW4sXG4gICAgICAgIGhlYWRlcjpcbiAgICAgICAgICBpdGVtLmZ1bmN0aW9uPy5hbGlhcz8udHJpbSgpIHx8IC8vIE5PU09OQVJcbiAgICAgICAgICBpdGVtLmFsaWFzPy50cmltKCkgfHwgLy8gTk9TT05BUlxuICAgICAgICAgIChpdGVtLmZ1bmN0aW9uXG4gICAgICAgICAgICA/IGAke3RoaXMucmVzb2x2ZUZ1bmN0aW9uTGFiZWwoaXRlbS5mdW5jdGlvbi5mdW5jdGlvbk5hbWUpfSAke3RoaXMucmVzb2x2ZUNvbHVtbkxhYmVsKGl0ZW0uY29sdW1uKX1gXG4gICAgICAgICAgICA6IHRoaXMucmVzb2x2ZUNvbHVtbkxhYmVsKGl0ZW0uY29sdW1uKSksXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgfSkpLFxuICAgIF07XG4gICAgcmV0dXJuIHRoaXMuZGVkdXBsaWNhdGVCeUtleShnZW5lcmF0ZWRDb2x1bW5zLCAoaXRlbSkgPT4gaXRlbS5maWVsZCk7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZFRhYmxlU2VsZWN0aW9uUm93cyhcbiAgICBzZWxlY3RlZElkczogc3RyaW5nW10sXG4gICAgc2VhcmNoOiBzdHJpbmdcbiAgKTogU2VsZWN0aW9uUm93W10ge1xuICAgIHJldHVybiAodGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS50YWJsZXMgPz8gW10pXG4gICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5yZXNvbHZlVGFibGVEaXNwbGF5UGFydHMoaXRlbS52YWx1ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgbmFtZTogcGFydHMudGFibGVMYWJlbCxcbiAgICAgICAgICBkYkxhYmVsOiBwYXJ0cy5kYkxhYmVsLFxuICAgICAgICAgIHRhYmxlTGFiZWw6IHBhcnRzLnRhYmxlTGFiZWwsXG4gICAgICAgICAgcGF0aFR5cGU6IFwidGFibGVcIiBhcyBjb25zdCxcbiAgICAgICAgICBwcmVmaXg6IHBhcnRzLmRiTGFiZWwsXG4gICAgICAgICAgbWV0YTogaXRlbS5kZXNjcmlwdGlvbiB8fCBpdGVtLmRpc3BsYXlOYW1lIHx8IEVNUFRZX1ZBTFVFLCAvLyBOT1NPTkFSXG4gICAgICAgICAgbm90ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWRJZHMuaW5jbHVkZXMoaXRlbS52YWx1ZSksXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICAgIHRoaXMubWF0Y2hlc1NlYXJjaChbaXRlbS5wcmVmaXggPz8gRU1QVFlfVkFMVUUsIGl0ZW0ubmFtZSwgaXRlbS5tZXRhLCBpdGVtLm5vdGUgPz8gRU1QVFlfVkFMVUVdLCBzZWFyY2gpXG4gICAgICApO1xuICB9XG4gIHByaXZhdGUgYnVpbGRDb2x1bW5TZWxlY3Rpb25Sb3dzKFxuICAgIGl0ZW1zOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXSxcbiAgICBzZWxlY3RlZElkczogc3RyaW5nW10sXG4gICAgc2VhcmNoOiBzdHJpbmcsXG4gICAgbXVsdGlwbGUgPSB0cnVlXG4gICk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICByZXR1cm4gaXRlbXNcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnJlc29sdmVDb2x1bW5QYXJ0cyhpdGVtLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogaXRlbS52YWx1ZSxcbiAgICAgICAgICBuYW1lOiBwYXJ0cy5maWVsZExhYmVsLFxuICAgICAgICAgIGRiTGFiZWw6IHBhcnRzLmRiTGFiZWwsXG4gICAgICAgICAgdGFibGVMYWJlbDogcGFydHMudGFibGVMYWJlbCxcbiAgICAgICAgICBwYXRoVHlwZTogXCJjb2x1bW5cIiBhcyBjb25zdCxcbiAgICAgICAgICBwcmVmaXg6IHBhcnRzLnRhYmxlTGFiZWwsXG4gICAgICAgICAgbWV0YTogaXRlbS5kYXRhVHlwZSxcbiAgICAgICAgICBub3RlOiBpdGVtLmZ1bGxOYW1lLFxuICAgICAgICAgIHNlbGVjdGVkOiBtdWx0aXBsZVxuICAgICAgICAgICAgPyBzZWxlY3RlZElkcy5pbmNsdWRlcyhpdGVtLnZhbHVlKVxuICAgICAgICAgICAgOiBzZWxlY3RlZElkc1swXSA9PT0gaXRlbS52YWx1ZSxcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgICAgdGhpcy5tYXRjaGVzU2VhcmNoKFtpdGVtLnByZWZpeCA/PyBFTVBUWV9WQUxVRSwgaXRlbS5uYW1lLCBpdGVtLm1ldGEsIGl0ZW0ubm90ZSA/PyBFTVBUWV9WQUxVRV0sIHNlYXJjaClcbiAgICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZENvbHVtblBpY2tsaXN0SXRlbXMoXG4gICAgaXRlbXM6IER5bmFtaWNWaWV3QnVpbGRlckNvbHVtbk9wdGlvbltdXG4gICk6IENvbHVtblBpY2tsaXN0SXRlbVtdIHtcbiAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBwaWNrbGlzdElkID0gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RJZChpdGVtLnZhbHVlKTtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbS52YWx1ZSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBwaWNrbGlzdElkID8/IDAsXG4gICAgICAgIHRpdGxlOiBgJHtwYXJ0cy50YWJsZUxhYmVsfS4ke3BhcnRzLmZpZWxkTGFiZWx9YCxcbiAgICAgICAgdGl0bGVQcmVmaXg6IHBhcnRzLnRhYmxlTGFiZWwsXG4gICAgICAgIHRpdGxlU3VmZml4OiBwYXJ0cy5maWVsZExhYmVsLFxuICAgICAgICB0aXRsZVByZWZpeENvbG9yOiBWSVNVQUxfU1FMX1RBQkxFX0NPTE9SLFxuICAgICAgICB0aXRsZVN1ZmZpeENvbG9yOiBWSVNVQUxfU1FMX0ZJRUxEX0NPTE9SLFxuICAgICAgICBiYWRnZTogaXRlbS5kYXRhVHlwZSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgICAgYmFkZ2VDb2xvcjogUElDS0xJU1RfREFUQV9UWVBFX0JBREdFX0NPTE9SLFxuICAgICAgICBjb2x1bW46IGl0ZW0udmFsdWUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgYnVpbGRUYWJsZVBpY2tsaXN0SXRlbXMoXG4gICAgaXRlbXM6IER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uW11cbiAgKTogVGFibGVQaWNrbGlzdEl0ZW1bXSB7XG4gICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5yZXNvbHZlVGFibGVEaXNwbGF5UGFydHMoaXRlbS52YWx1ZSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpbmRleCArIDEsXG4gICAgICAgIHRpdGxlOiBgJHtwYXJ0cy5kYkxhYmVsfS4ke3BhcnRzLnRhYmxlTGFiZWx9YCxcbiAgICAgICAgdGl0bGVQcmVmaXg6IHBhcnRzLmRiTGFiZWwsXG4gICAgICAgIHRpdGxlU3VmZml4OiBwYXJ0cy50YWJsZUxhYmVsLFxuICAgICAgICB0aXRsZVByZWZpeENvbG9yOiBWSVNVQUxfU1FMX1RBQkxFX0NPTE9SLFxuICAgICAgICB0aXRsZVN1ZmZpeENvbG9yOiBWSVNVQUxfU1FMX0ZJRUxEX0NPTE9SLFxuICAgICAgICBiYWRnZTpcbiAgICAgICAgICBpdGVtLmRpc3BsYXlOYW1lICYmIGl0ZW0uZGlzcGxheU5hbWUgIT09IHBhcnRzLnRhYmxlTGFiZWxcbiAgICAgICAgICAgID8gaXRlbS5kaXNwbGF5TmFtZVxuICAgICAgICAgICAgOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgYmFkZ2VDb2xvcjogUElDS0xJU1RfREFUQV9UWVBFX0JBREdFX0NPTE9SLFxuICAgICAgICB0YWJsZTogaXRlbS52YWx1ZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uc0Zyb21QaWNrbGlzdElkcyhpZHM6IG51bWJlcltdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBpZHNcbiAgICAgIC5tYXAoKGlkKSA9PiB0aGlzLnJlc29sdmVDb2x1bW5QaWNrbGlzdENvbHVtbihpZCkpXG4gICAgICAuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gISFpdGVtKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVMYXN0Q29sdW1uRnJvbVBpY2tsaXN0SWRzKGlkczogbnVtYmVyW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5yZXNvbHZlQ29sdW1uc0Zyb21QaWNrbGlzdElkcyhpZHMpO1xuICAgIHJldHVybiBjb2x1bW5zLmF0KC0xKSA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZVRhYmxlUGlja2xpc3RJZCh0YWJsZVZhbHVlOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBpdGVtSW5kZXggPSAodGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS50YWJsZXMgPz8gW10pLmZpbmRJbmRleChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSB0YWJsZVZhbHVlXG4gICAgKTtcblxuICAgIHJldHVybiBpdGVtSW5kZXggPj0gMCA/IGl0ZW1JbmRleCArIDEgOiBudWxsO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZVRhYmxlUGlja2xpc3RUYWJsZShpZDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaXRlbSA9ICh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLnRhYmxlcyA/PyBbXSkuZmluZChcbiAgICAgIChfZW50cnksIGluZGV4KSA9PiBpbmRleCArIDEgPT09IGlkXG4gICAgKTtcblxuICAgIHJldHVybiBpdGVtPy52YWx1ZSA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZVRhYmxlc0Zyb21QaWNrbGlzdElkcyhpZHM6IG51bWJlcltdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBpZHNcbiAgICAgIC5tYXAoKGlkKSA9PiB0aGlzLnJlc29sdmVUYWJsZVBpY2tsaXN0VGFibGUoaWQpKVxuICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+ICEhaXRlbSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uUGlja2xpc3RJZChjb2x1bW46IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGl0ZW1JbmRleCA9IHRoaXMuYXZhaWxhYmxlQ29sdW1ucy5maW5kSW5kZXgoXG4gICAgICAoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gY29sdW1uXG4gICAgKTtcblxuICAgIHJldHVybiBpdGVtSW5kZXggPj0gMCA/IGl0ZW1JbmRleCArIDEgOiBudWxsO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtblBpY2tsaXN0Q29sdW1uKGlkOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5hdmFpbGFibGVDb2x1bW5zW2lkIC0gMV07XG4gICAgcmV0dXJuIGl0ZW0/LnZhbHVlID8/IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBtYXRjaGVzU2VhcmNoKHZhbHVlczogc3RyaW5nW10sIHNlYXJjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IHRoaXMubm9ybWFsaXplKHNlYXJjaCk7XG4gICAgaWYgKCFub3JtYWxpemVkU2VhcmNoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcy5zb21lKCh2YWx1ZSkgPT5cbiAgICAgIHRoaXMubm9ybWFsaXplKHZhbHVlKS5pbmNsdWRlcyhub3JtYWxpemVkU2VhcmNoKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBub3JtYWxpemUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh2YWx1ZSA/PyBcIlwiKVxuICAgICAgLm5vcm1hbGl6ZShcIk5GRFwiKVxuICAgICAgLnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csIFwiXCIpXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnRyaW0oKTtcbiAgfVxuICBwcml2YXRlIHRvZ2dsZU11bHRpcGxlVmFsdWUodmFsdWVzOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHZhbHVlKVxuICAgICAgPyB2YWx1ZXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB2YWx1ZSlcbiAgICAgIDogWy4uLnZhbHVlcywgdmFsdWVdO1xuICB9XG4gIHByaXZhdGUgZmlsdGVyRnVuY3Rpb25TZWxlY3RhYmxlQ29sdW1ucyhcbiAgICBmdW5jdGlvbk5hbWU6IHN0cmluZ1xuICApOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cEJ5ID0gbmV3IFNldCh0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeSk7XG4gICAgY29uc3QgYWxsID0gdGhpcy5hdmFpbGFibGVDb2x1bW5zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiAhc2VsZWN0ZWRHcm91cEJ5LmhhcyhpdGVtLnZhbHVlKVxuICAgICk7XG4gICAgaWYgKGZ1bmN0aW9uTmFtZSA9PT0gXCJjb3VudFwiKSB7XG4gICAgICByZXR1cm4gYWxsO1xuICAgIH1cbiAgICBpZiAoW1wic3VtXCIsIFwiYXZnXCIsIFwibWluXCIsIFwibWF4XCJdLmluY2x1ZGVzKGZ1bmN0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgcmV0dXJuIGFsbC5maWx0ZXIoKGl0ZW0pID0+IHRoaXMuaXNOdW1lcmljVHlwZShpdGVtLmRhdGFUeXBlKSk7XG4gICAgfVxuICAgIHJldHVybiBhbGw7XG4gIH1cbiAgcHJpdmF0ZSBmaWx0ZXJPcGVyYXRvcnNGb3JDb2x1bW4oXG4gICAgY29sdW1uOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25cbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhVHlwZSA9IChjb2x1bW4uZGF0YVR5cGUgPz8gRU1QVFlfVkFMVUUpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAobm9ybWFsaXplZERhdGFUeXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIFtcIkVRVUFMXCIsIFwiTk9UX0VRVUFMXCIsIFwiRU1QVFlcIiwgXCJOT1RfRU1QVFlcIl07XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWREYXRhVHlwZSA9PT0gXCJkYXRldGltZVwiIHx8IG5vcm1hbGl6ZWREYXRhVHlwZSA9PT0gXCJ0aW1lXCIgfHwgbm9ybWFsaXplZERhdGFUeXBlID09PSBcInRpbWVzdGFtcFwiKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcIkVRVUFMXCIsXG4gICAgICAgIFwiTk9UX0VRVUFMXCIsXG4gICAgICAgIFwiR1JFQVRFUl9USEFOXCIsXG4gICAgICAgIFwiR1JFQVRFUl9USEFOX09SX0VRVUFMXCIsXG4gICAgICAgIFwiTEVTU19USEFOXCIsXG4gICAgICAgIFwiTEVTU19USEFOX09SX0VRVUFMXCIsXG4gICAgICAgIFwiQkVUV0VFTlwiLFxuICAgICAgICBcIkVNUFRZXCIsXG4gICAgICAgIFwiTk9UX0VNUFRZXCIsXG4gICAgICBdO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuaXNOdW1lcmljVHlwZShjb2x1bW4uZGF0YVR5cGUpIHx8XG4gICAgICBub3JtYWxpemVkRGF0YVR5cGUgPT09IFwiZGF0ZVwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcIkVRVUFMXCIsXG4gICAgICAgIFwiTk9UX0VRVUFMXCIsXG4gICAgICAgIFwiR1JFQVRFUl9USEFOXCIsXG4gICAgICAgIFwiR1JFQVRFUl9USEFOX09SX0VRVUFMXCIsXG4gICAgICAgIFwiTEVTU19USEFOXCIsXG4gICAgICAgIFwiTEVTU19USEFOX09SX0VRVUFMXCIsXG4gICAgICAgIFwiQkVUV0VFTlwiLFxuICAgICAgICBcIklOXCIsXG4gICAgICAgIFwiRU1QVFlcIixcbiAgICAgICAgXCJOT1RfRU1QVFlcIixcbiAgICAgIF07XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICBcIkVRVUFMXCIsXG4gICAgICBcIk5PVF9FUVVBTFwiLFxuICAgICAgXCJDT05UQUlOU1wiLFxuICAgICAgXCJET0VTX05PVF9DT05UQUlOXCIsXG4gICAgICBcIlNUQVJUU19XSVRIXCIsXG4gICAgICBcIkVORFNfV0lUSFwiLFxuICAgICAgXCJJTlwiLFxuICAgICAgXCJFTVBUWVwiLFxuICAgICAgXCJOT1RfRU1QVFlcIixcbiAgICBdO1xuICB9XG4gIHByaXZhdGUgaXNOdW1lcmljVHlwZSh2YWx1ZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBbXG4gICAgICBcIm51bWJlclwiLFxuICAgICAgXCJpbnRlZ2VyXCIsXG4gICAgICBcImRlY2ltYWxcIixcbiAgICAgIFwiZmxvYXRcIixcbiAgICAgIFwiZG91YmxlXCIsXG4gICAgICBcImxvbmdcIixcbiAgICAgIFwic2hvcnRcIixcbiAgICBdLmluY2x1ZGVzKCh2YWx1ZSA/PyBcIlwiKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICBwcml2YXRlIGlzRGF0ZVR5cGUodmFsdWU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwidGltZXN0YW1wXCIsIFwidGltZVwiXS5pbmNsdWRlcyhcbiAgICAgICh2YWx1ZSA/PyBcIlwiKS50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVUYWJsZU9wdGlvbihcbiAgICB2YWx1ZTogc3RyaW5nXG4gICk6IER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEudGFibGVzID8/IFtdKS5maW5kKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IHZhbHVlXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVDb2x1bW5PcHRpb24oXG4gICAgdmFsdWU6IHN0cmluZ1xuICApOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiAodGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS5jb2x1bW5zID8/IFtdKS5maW5kKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IHZhbHVlXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVUYWJsZUxhYmVsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVUYWJsZU9wdGlvbih2YWx1ZSk/LnRleHQgPz8gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlVGFibGVEaXNwbGF5UGFydHModmFsdWU6IHN0cmluZyk6IFRhYmxlRGlzcGxheVBhcnRzIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMucmVzb2x2ZVRhYmxlT3B0aW9uKHZhbHVlKTtcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICBjb25zdCByYXdQYXJ0cyA9IHZhbHVlLnNwbGl0KFwiLlwiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYkxhYmVsOiByYXdQYXJ0cy5sZW5ndGggPiAxID8gcmF3UGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oXCIuXCIpIDogXCJkYlwiLFxuICAgICAgICB0YWJsZUxhYmVsOiByYXdQYXJ0cy5hdCgtMSkgPz8gdmFsdWUsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGJMYWJlbDogdGFibGUuc2NoZW1hIHx8IFwiZGJcIiwgLy8gTk9TT05BUlxuICAgICAgdGFibGVMYWJlbDogdGFibGUudmFsdWUsXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVUYWJsZVBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnJlc29sdmVUYWJsZURpc3BsYXlQYXJ0cyh2YWx1ZSk7XG4gICAgcmV0dXJuIHBhcnRzLmRiTGFiZWwgPyBgJHtwYXJ0cy5kYkxhYmVsfS4ke3BhcnRzLnRhYmxlTGFiZWx9YCA6IHBhcnRzLnRhYmxlTGFiZWw7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uUGFydHMoIC8vIE5PU09OQVIgLSBjb21wbGV4aXR5OiBleHRyYWN0aW9uIHdvdWxkIHJpc2sgYmVoYXZpb3IgY2hhbmdlXG4gICAgdmFsdWU6IHN0cmluZyB8IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkXG4gICk6IENvbHVtbkRpc3BsYXlQYXJ0cyB7XG4gICAgY29uc3QgY29sdW1uVmFsdWUgPVxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS5jb2x1bW4gPz8gRU1QVFlfVkFMVUU7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKGNvbHVtblZhbHVlKTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSBgJHtjb2x1bW5WYWx1ZX1gLnNwbGl0KFwiLlwiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYkxhYmVsOiBmYWxsYmFjay5sZW5ndGggPj0gTUlOX1BBUlRTX0ZPUl9EQiA/IGZhbGxiYWNrLnNsaWNlKDAsIERCX1BBUlRTX09GRlNFVCkuam9pbihcIi5cIikgOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgdGFibGVMYWJlbDogZmFsbGJhY2subGVuZ3RoID49IE1JTl9QQVJUU19GT1JfVEFCTEUgPyBmYWxsYmFja1tmYWxsYmFjay5sZW5ndGggLSBNSU5fUEFSVFNfRk9SX1RBQkxFXSA6IGNvbHVtblZhbHVlLFxuICAgICAgICBmaWVsZExhYmVsOiBmYWxsYmFjay5hdCgtMSkgPz8gY29sdW1uVmFsdWUsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IChjb2x1bW4uZnVsbE5hbWUgPz8gY29sdW1uVmFsdWUpLnNwbGl0KFwiLlwiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRiTGFiZWw6IHBhcnRzLmxlbmd0aCA+PSBNSU5fUEFSVFNfRk9SX0RCID8gcGFydHMuc2xpY2UoMCwgREJfUEFSVFNfT0ZGU0VUKS5qb2luKFwiLlwiKSA6IEVNUFRZX1ZBTFVFLFxuICAgICAgdGFibGVMYWJlbDogcGFydHMubGVuZ3RoID49IE1JTl9QQVJUU19GT1JfVEFCTEUgPyBwYXJ0c1twYXJ0cy5sZW5ndGggLSBNSU5fUEFSVFNfRk9SX1RBQkxFXSA6IHRoaXMucmVzb2x2ZVRhYmxlUGF0aChjb2x1bW4udGFibGUpLFxuICAgICAgZmllbGRMYWJlbDogcGFydHMuYXQoLTEpID8/IGNvbHVtbi52YWx1ZSxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtbkxhYmVsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVDb2x1bW5QYXRoKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVTb3J0RHJhZnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLnJlc29sdmVDb2x1bW5QYXRoKHRoaXMuc29ydERyYWZ0LmNvbHVtbik7XG4gICAgaWYgKCF0aGlzLnNvcnREcmFmdC5mdW5jdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBiYXNlO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5yZXNvbHZlRnVuY3Rpb25MYWJlbCh0aGlzLnNvcnREcmFmdC5mdW5jdGlvbk5hbWUpfSgke2Jhc2V9KWA7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZFNvcnRTZWxlY3Rpb25JZChcbiAgICBjb2x1bW46IHN0cmluZyxcbiAgICBmdW5jdGlvbk5hbWUgPSBFTVBUWV9WQUxVRVxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtjb2x1bW59Ojoke2Z1bmN0aW9uTmFtZSB8fCBFTVBUWV9TT1JUX0ZVTkNUSU9OfWA7XG4gIH1cbiAgcHJpdmF0ZSBwYXJzZVNvcnRTZWxlY3Rpb25JZChcbiAgICBzZWxlY3Rpb25JZDogc3RyaW5nXG4gICk6IHsgY29sdW1uOiBzdHJpbmc7IGZ1bmN0aW9uTmFtZTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IFtjb2x1bW4sIGZ1bmN0aW9uTmFtZSA9IEVNUFRZX1NPUlRfRlVOQ1RJT05dID0gc2VsZWN0aW9uSWQuc3BsaXQoXCI6OlwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uLFxuICAgICAgZnVuY3Rpb25OYW1lOlxuICAgICAgICBmdW5jdGlvbk5hbWUgPT09IEVNUFRZX1NPUlRfRlVOQ1RJT04gPyBFTVBUWV9WQUxVRSA6IGZ1bmN0aW9uTmFtZSxcbiAgICB9O1xuICB9XG4gIHJlc29sdmVDb2x1bW5QYXRoKHZhbHVlOiBzdHJpbmcgfCBEeW5hbWljVmlld0J1aWxkZXJGaWVsZCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29sdW1uVmFsdWUgPVxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS5jb2x1bW4gPz8gRU1QVFlfVkFMVUU7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKGNvbHVtblZhbHVlKTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgcmV0dXJuIGNvbHVtblZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IChjb2x1bW4uZnVsbE5hbWUgPz8gY29sdW1uVmFsdWUpLnNwbGl0KFwiLlwiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+PSBNSU5fUEFSVFNfRk9SX1RBQkxFID8gcGFydHMuc2xpY2UoREJfUEFSVFNfT0ZGU0VUKS5qb2luKFwiLlwiKSA6IGNvbHVtbi5mdWxsTmFtZTtcbiAgfVxuICBwcml2YXRlIG5vcm1hbGl6ZUdlbmVyYXRlZEZpZWxkKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBEeW5hbWljVmlld0J1aWxkZXJGaWVsZFxuICApOiBEeW5hbWljVmlld0J1aWxkZXJGaWVsZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHsgY29sdW1uOiB2YWx1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uOiB2YWx1ZS5jb2x1bW4sXG4gICAgICBhbGlhczogdmFsdWUuYWxpYXM/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIHdpZHRoOiB2YWx1ZS53aWR0aD8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgZnVuY3Rpb246IHZhbHVlLmZ1bmN0aW9uXG4gICAgICAgID8ge1xuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogdmFsdWUuZnVuY3Rpb24uZnVuY3Rpb25OYW1lPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgICAgYWxpYXM6IHZhbHVlLmZ1bmN0aW9uLmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgIH1cbiAgICAgICAgOiBudWxsLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBnZXRPcmRlcmVkRmllbGRFbnRyaWVzKCk6IEFycmF5PFxuICAgIER5bmFtaWNWaWV3QnVpbGRlckZpZWxkICYgeyBzb3VyY2VJbmRleDogbnVtYmVyIH1cbiAgPiB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubm9ybWFsaXplZEZpZWxkcy5tYXAoKGl0ZW0sIHNvdXJjZUluZGV4KSA9PiAoe1xuICAgICAgLi4uaXRlbSxcbiAgICAgIHNvdXJjZUluZGV4LFxuICAgIH0pKTtcbiAgICBjb25zdCBwcmV2aWV3SW5kZXhlcyA9IHRoaXMuZ2V0RmllbGRQcmV2aWV3U291cmNlSW5kZXhlcygpO1xuICAgIHJldHVybiBwcmV2aWV3SW5kZXhlcy5tYXAoKGluZGV4KSA9PiBlbnRyaWVzW2luZGV4XSkuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG4gIHByaXZhdGUgZ2V0RmllbGRQcmV2aWV3U291cmNlSW5kZXhlcygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgYmFzZUluZGV4ZXMgPSB0aGlzLm5vcm1hbGl6ZWRGaWVsZHMubWFwKChfLCBpbmRleCkgPT4gaW5kZXgpO1xuICAgIGlmICh0aGlzLmRyYWdnaW5nRmllbGRJbmRleCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGJhc2VJbmRleGVzO1xuICAgIH1cbiAgICBjb25zdCByZW1haW5pbmdJbmRleGVzID0gYmFzZUluZGV4ZXMuZmlsdGVyKFxuICAgICAgKGluZGV4KSA9PiBpbmRleCAhPT0gdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXhcbiAgICApO1xuICAgIGNvbnN0IGluc2VydGlvbkluZGV4ID1cbiAgICAgIHRoaXMuZHJhZ1ByZXZpZXdJbmRleCA9PT0gbnVsbFxuICAgICAgICA/IGJhc2VJbmRleGVzLmluZGV4T2YodGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXgpXG4gICAgICAgIDogTWF0aC5taW4odGhpcy5kcmFnUHJldmlld0luZGV4LCByZW1haW5pbmdJbmRleGVzLmxlbmd0aCk7XG4gICAgcmVtYWluaW5nSW5kZXhlcy5zcGxpY2UoaW5zZXJ0aW9uSW5kZXgsIDAsIHRoaXMuZHJhZ2dpbmdGaWVsZEluZGV4KTtcbiAgICByZXR1cm4gcmVtYWluaW5nSW5kZXhlcztcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGdW5jdGlvbkxhYmVsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVPcHRpb25MYWJlbCh2YWx1ZSwgdGhpcy5mdW5jdGlvbk9wdGlvbnMpO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUpvaW5PcGVyYXRvckxhYmVsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVPcHRpb25MYWJlbCh2YWx1ZSwgdGhpcy5qb2luT3BlcmF0b3JPcHRpb25zKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVKb2luT3BlcmF0b3JPcHRpb25UZXh0KG9wdGlvbjogRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBmYWxsYmFjayA9IEpPSU5fT1BFUkFUT1JfTEFCRUxTW29wdGlvbi52YWx1ZV07XG4gICAgY29uc3QgaGFzUmVhZGFibGVUZXh0ID0gL1tBLVphLXrDgC3Dv10vLnRlc3Qob3B0aW9uLnRleHQpO1xuXG4gICAgaWYgKCFmYWxsYmFjayB8fCBoYXNSZWFkYWJsZVRleHQpIHtcbiAgICAgIHJldHVybiBvcHRpb24udGV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LiR7ZmFsbGJhY2sua2V5fWAsXG4gICAgICBmYWxsYmFjay5mYWxsYmFja1xuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlRmlsdGVyT3BlcmF0b3JMYWJlbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXhcbiAgICAgIH0uZmlsdGVycy5vcGVyYXRvcnMuJHt2YWx1ZS50b0xvd2VyQ2FzZSgpfWAsXG4gICAgICB0aGlzLmh1bWFuaXplS2V5KHZhbHVlKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlT3B0aW9uTGFiZWwoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBEeW5hbWljVmlld0J1aWxkZXJPcHRpb25bXVxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBvcHRpb25zLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IHZhbHVlKT8udGV4dCA/PyB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGaWx0ZXJEaXNwbGF5VmFsdWUoZmlsdGVyOiBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXIpOiBzdHJpbmcgeyAvLyBOT1NPTkFSIC0gY29tcGxleGl0eTogZXh0cmFjdGlvbiB3b3VsZCByaXNrIGJlaGF2aW9yIGNoYW5nZVxuICAgIGlmIChmaWx0ZXIudmFsdWVUeXBlID09PSBGSUxURVJfTU9ERV9ET01BSU4pIHtcbiAgICAgIHJldHVybiBmaWx0ZXIuZG9tYWluRXhwcmVzc2lvbiA/PyBFTVBUWV9WQUxVRTtcbiAgICB9XG4gICAgaWYgKGZpbHRlci52YWx1ZVR5cGUgPT09IFwicGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiBgOiR7ZmlsdGVyLnBhcmFtZXRlck5hbWUgPz8gRU1QVFlfVkFMVUV9YDtcbiAgICB9XG4gICAgaWYgKGZpbHRlci5vcGVyYXRvciA9PT0gXCJJTlwiKSB7XG4gICAgICByZXR1cm4gKGZpbHRlci52YWx1ZXMgPz8gW10pLmpvaW4oXCIsIFwiKTtcbiAgICB9XG4gICAgaWYgKGZpbHRlci5vcGVyYXRvciA9PT0gXCJCRVRXRUVOXCIpIHtcbiAgICAgIHJldHVybiBgJHtmaWx0ZXIudmFsdWVzPy5bMF0gPz8gRU1QVFlfVkFMVUV9IC0gJHtmaWx0ZXIudmFsdWVzPy5bMV0gPz8gRU1QVFlfVkFMVUVcbiAgICAgICAgfWA7XG4gICAgfVxuICAgIGlmIChbXCJFTVBUWVwiLCBcIk5PVF9FTVBUWVwiXS5pbmNsdWRlcyhmaWx0ZXIub3BlcmF0b3IpKSB7XG4gICAgICByZXR1cm4gXCItXCI7XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXIudmFsdWUgPz8gRU1QVFlfVkFMVUU7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEdlbmVyYXRlZFNxbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNvdXJjZXMgPSB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcztcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdFBhcnRzID0gdGhpcy5ub3JtYWxpemVkRmllbGRzXG4gICAgICAubWFwKChmaWVsZCkgPT4gdGhpcy5yZXNvbHZlRmllbGRTcWwoZmllbGQpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBzcWwgPSBbXG4gICAgICBcIlNFTEVDVFwiLFxuICAgICAgYCAgJHsoc2VsZWN0UGFydHMubGVuZ3RoID8gc2VsZWN0UGFydHMgOiBbXCIqXCJdKS5qb2luKFwiLFxcbiAgXCIpfWAsXG4gICAgICBgRlJPTSAke3RoaXMucmVzb2x2ZVNvdXJjZVNxbChzb3VyY2VzWzBdKX1gLFxuICAgICAgLi4udGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zLm1hcCgoaXRlbSkgPT4gdGhpcy5yZXNvbHZlSm9pblNxbChpdGVtKSksXG4gICAgICAuLi50aGlzLmJ1aWxkV2hlcmVTcWwoKSxcbiAgICAgIC4uLnRoaXMuYnVpbGRHcm91cEJ5U3FsKCksXG4gICAgICAuLi50aGlzLmJ1aWxkT3JkZXJCeVNxbCgpLFxuICAgIF07XG4gICAgcmV0dXJuIHNxbC5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHByaXZhdGUgYnVpbGRXaGVyZVNxbCgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbnMgPSB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmlsdGVyc1xuICAgICAgLm1hcCgoZmlsdGVyLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjb25uZWN0b3IgPSBpbmRleCA9PT0gMCA/IFwiV0hFUkVcIiA6IGZpbHRlci5jb25uZWN0b3I7XG4gICAgICAgIHJldHVybiBgICAke2Nvbm5lY3Rvcn0gJHt0aGlzLnJlc29sdmVGaWx0ZXJTcWwoZmlsdGVyKX1gO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmVuZHNXaXRoKEVNUFRZX1ZBTFVFKSk7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25zLmxlbmd0aCA/IGV4cHJlc3Npb25zIDogW107XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEdyb3VwQnlTcWwoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICBcIkdST1VQIEJZXCIsXG4gICAgICBgICAke3RoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5XG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IHRoaXMucmVzb2x2ZUNvbHVtblNxbChpdGVtKSlcbiAgICAgICAgLmpvaW4oXCIsXFxuICBcIil9YCxcbiAgICBdO1xuICB9XG4gIHByaXZhdGUgYnVpbGRPcmRlckJ5U3FsKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3J0aW5nLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgXCJPUkRFUiBCWVwiLFxuICAgICAgYCAgJHt0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc29ydGluZ1xuICAgICAgICAubWFwKChpdGVtKSA9PiBgJHt0aGlzLnJlc29sdmVTb3J0U3FsKGl0ZW0pfSAke2l0ZW0uZGlyZWN0aW9ufWApXG4gICAgICAgIC5qb2luKFwiLFxcbiAgXCIpfWAsXG4gICAgXTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVTb3VyY2VTcWwoc291cmNlOiBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbiB8IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIGFsaWFzOiBzdHJpbmc7XG4gIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhYmxlID0gXCJ0YWJsZVwiIGluIHNvdXJjZSA/IHRoaXMucmVzb2x2ZVRhYmxlT3B0aW9uKHNvdXJjZS50YWJsZSkgOiBzb3VyY2U7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgcmV0dXJuIEVNUFRZX1ZBTFVFO1xuICAgIH1cbiAgICBjb25zdCBzb3VyY2VBbGlhcyA9IFwidGFibGVcIiBpbiBzb3VyY2UgPyBzb3VyY2UuYWxpYXMgOiBFTVBUWV9WQUxVRTtcbiAgICBjb25zdCBmdWxsTmFtZSA9IHRhYmxlLnNjaGVtYSA/IGAke3RhYmxlLnNjaGVtYX0uJHt0YWJsZS52YWx1ZX1gIDogdGFibGUudmFsdWU7XG4gICAgcmV0dXJuIHNvdXJjZUFsaWFzID8gYCR7ZnVsbE5hbWV9ICR7c291cmNlQWxpYXN9YCA6IGZ1bGxOYW1lO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUpvaW5TcWwoaXRlbTogRHluYW1pY1ZpZXdCdWlsZGVySm9pbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBKT0lOICR7dGhpcy5yZXNvbHZlSm9pbmVkVGFibGVTcWwoXG4gICAgICBpdGVtXG4gICAgKX0gT04gJHt0aGlzLnJlc29sdmVDb2x1bW5TcWwoaXRlbS5zb3VyY2VDb2x1bW4pfSAke3RoaXMucmVzb2x2ZUpvaW5PcGVyYXRvclNxbChcbiAgICAgIGl0ZW0ub3BlcmF0b3JcbiAgICApfSAke3RoaXMucmVzb2x2ZUNvbHVtblNxbChpdGVtLnRhcmdldENvbHVtbil9YDtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVKb2luZWRUYWJsZVNxbChpdGVtOiBEeW5hbWljVmlld0J1aWxkZXJKb2luKTogc3RyaW5nIHtcbiAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24oaXRlbS50YXJnZXRDb2x1bW4pO1xuICAgIGlmICghdGFyZ2V0Q29sdW1uKSB7XG4gICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLmZpbmQoXG4gICAgICAoZW50cnkpID0+IGVudHJ5LnRhYmxlID09PSB0YXJnZXRDb2x1bW4udGFibGVcbiAgICApO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc29sdmVTb3VyY2VTcWwoc291cmNlKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVDb2x1bW5TcWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHZhbHVlKTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBhbGlhcyA9IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLmZpbmQoXG4gICAgICAoaXRlbSkgPT4gaXRlbS50YWJsZSA9PT0gY29sdW1uLnRhYmxlXG4gICAgKT8uYWxpYXM7XG4gICAgY29uc3QgZmllbGROYW1lID0gY29sdW1uLmZ1bGxOYW1lLnNwbGl0KFwiLlwiKS5wb3AoKSA/PyBjb2x1bW4udmFsdWU7XG4gICAgcmV0dXJuIGFsaWFzID8gYCR7YWxpYXN9LiR7ZmllbGROYW1lfWAgOiBjb2x1bW4uZnVsbE5hbWU7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlRmllbGRTcWwoZmllbGQ6IHN0cmluZyB8IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkRmllbGQgPSB0aGlzLm5vcm1hbGl6ZUdlbmVyYXRlZEZpZWxkKGZpZWxkKTtcbiAgICBjb25zdCBmaWVsZFNxbCA9IHRoaXMucmVzb2x2ZUNvbHVtblNxbChub3JtYWxpemVkRmllbGQuY29sdW1uKTtcbiAgICBpZiAobm9ybWFsaXplZEZpZWxkLmZ1bmN0aW9uPy5mdW5jdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVGdW5jdGlvblNxbCh7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogbm9ybWFsaXplZEZpZWxkLmZ1bmN0aW9uLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgY29sdW1uOiBub3JtYWxpemVkRmllbGQuY29sdW1uLFxuICAgICAgICBhbGlhczpcbiAgICAgICAgICBub3JtYWxpemVkRmllbGQuZnVuY3Rpb24uYWxpYXM/LnRyaW0oKSB8fCAvLyBOT1NPTkFSXG4gICAgICAgICAgbm9ybWFsaXplZEZpZWxkLmFsaWFzPy50cmltKCkgfHwgLy8gTk9TT05BUlxuICAgICAgICAgIEVNUFRZX1ZBTFVFLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGFsaWFzID0gbm9ybWFsaXplZEZpZWxkLmFsaWFzPy50cmltKCk7XG4gICAgcmV0dXJuIGFsaWFzID8gYCR7ZmllbGRTcWx9IEFTICR7YWxpYXN9YCA6IGZpZWxkU3FsO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUZ1bmN0aW9uU3FsKGl0ZW06IER5bmFtaWNWaWV3QnVpbGRlckZ1bmN0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkRnVuY3Rpb24gPSBpdGVtLmZ1bmN0aW9uTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IGFyZ3VtZW50ID0gdGhpcy5yZXNvbHZlQ29sdW1uU3FsKGl0ZW0uY29sdW1uKTtcbiAgICBjb25zdCBhbGlhcyA9IGl0ZW0uYWxpYXM/LnRyaW0oKTtcbiAgICByZXR1cm4gYWxpYXNcbiAgICAgID8gYCR7bm9ybWFsaXplZEZ1bmN0aW9ufSgke2FyZ3VtZW50fSkgQVMgJHthbGlhc31gXG4gICAgICA6IGAke25vcm1hbGl6ZWRGdW5jdGlvbn0oJHthcmd1bWVudH0pYDtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVTb3J0U3FsKGl0ZW06IER5bmFtaWNWaWV3QnVpbGRlclNvcnQpOiBzdHJpbmcge1xuICAgIGlmICghaXRlbS5mdW5jdGlvbk5hbWU/LnRyaW0oKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNvbHVtblNxbChpdGVtLmNvbHVtbik7XG4gICAgfVxuICAgIHJldHVybiBgJHtpdGVtLmZ1bmN0aW9uTmFtZS50cmltKCkudG9VcHBlckNhc2UoKX0oJHt0aGlzLnJlc29sdmVDb2x1bW5TcWwoXG4gICAgICBpdGVtLmNvbHVtblxuICAgICl9KWA7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlSm9pbk9wZXJhdG9yU3FsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB7XG4gICAgICAgIEVRVUFMUzogXCI9XCIsXG4gICAgICAgIE5PVF9FUVVBTFM6IFwiPD5cIixcbiAgICAgIH1bdmFsdWVdID8/IHZhbHVlXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGaWx0ZXJTcWwoZmlsdGVyOiBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXIpOiBzdHJpbmcgeyAvLyBOT1NPTkFSIC0gY29tcGxleGl0eTogZXh0cmFjdGlvbiB3b3VsZCByaXNrIGJlaGF2aW9yIGNoYW5nZVxuICAgIGlmIChmaWx0ZXIudmFsdWVUeXBlID09PSBGSUxURVJfTU9ERV9ET01BSU4pIHtcbiAgICAgIHJldHVybiBgKCR7ZmlsdGVyLmRvbWFpbkV4cHJlc3Npb24gPz8gRU1QVFlfVkFMVUV9KWA7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5yZXNvbHZlQ29sdW1uU3FsKGZpbHRlci5jb2x1bW4pO1xuICAgIGlmICghZmllbGQpIHtcbiAgICAgIHJldHVybiBFTVBUWV9WQUxVRTtcbiAgICB9XG4gICAgaWYgKGZpbHRlci5vcGVyYXRvciA9PT0gXCJFTVBUWVwiKSB7XG4gICAgICByZXR1cm4gYCR7ZmllbGR9IElTIE5VTExgO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLm9wZXJhdG9yID09PSBcIk5PVF9FTVBUWVwiKSB7XG4gICAgICByZXR1cm4gYCR7ZmllbGR9IElTIE5PVCBOVUxMYDtcbiAgICB9XG4gICAgaWYgKGZpbHRlci5vcGVyYXRvciA9PT0gXCJJTlwiKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSAoZmlsdGVyLnZhbHVlcyA/PyBbXSkubWFwKChpdGVtKSA9PlxuICAgICAgICB0aGlzLnJlc29sdmVGaWx0ZXJWYWx1ZVNxbChmaWx0ZXIuY29sdW1uLCBmaWx0ZXIub3BlcmF0b3IsIGl0ZW0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIGAke2ZpZWxkfSBJTiAoJHt2YWx1ZXMuam9pbihcIiwgXCIpfSlgO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLm9wZXJhdG9yID09PSBcIkJFVFdFRU5cIikge1xuICAgICAgcmV0dXJuIGAke2ZpZWxkfSBCRVRXRUVOICR7dGhpcy5yZXNvbHZlRmlsdGVyVmFsdWVTcWwoXG4gICAgICAgIGZpbHRlci5jb2x1bW4sXG4gICAgICAgIGZpbHRlci5vcGVyYXRvcixcbiAgICAgICAgZmlsdGVyLnZhbHVlcz8uWzBdXG4gICAgICApfSBBTkQgJHt0aGlzLnJlc29sdmVGaWx0ZXJWYWx1ZVNxbChcbiAgICAgICAgZmlsdGVyLmNvbHVtbixcbiAgICAgICAgZmlsdGVyLm9wZXJhdG9yLFxuICAgICAgICBmaWx0ZXIudmFsdWVzPy5bMV1cbiAgICAgICl9YDtcbiAgICB9XG4gICAgaWYgKGZpbHRlci52YWx1ZVR5cGUgPT09IFwicGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiBgJHtmaWVsZH0gJHt0aGlzLnJlc29sdmVGaWx0ZXJPcGVyYXRvclNxbChcbiAgICAgICAgZmlsdGVyLm9wZXJhdG9yXG4gICAgICApfSA6JHtmaWx0ZXIucGFyYW1ldGVyTmFtZSA/PyBFTVBUWV9WQUxVRX1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7ZmllbGR9ICR7dGhpcy5yZXNvbHZlRmlsdGVyT3BlcmF0b3JTcWwoXG4gICAgICBmaWx0ZXIub3BlcmF0b3JcbiAgICApfSAke3RoaXMucmVzb2x2ZUZpbHRlclZhbHVlU3FsKGZpbHRlci5jb2x1bW4sIGZpbHRlci5vcGVyYXRvciwgZmlsdGVyLnZhbHVlKX1gO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUZpbHRlck9wZXJhdG9yU3FsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB7XG4gICAgICAgIEVRVUFMOiBcIj1cIixcbiAgICAgICAgTk9UX0VRVUFMOiBcIjw+XCIsXG4gICAgICAgIEdSRUFURVI6IFwiPlwiLFxuICAgICAgICBHUkVBVEVSX1RIQU46IFwiPlwiLFxuICAgICAgICBHUkVBVEVSX09SX0VRVUFMOiBcIj49XCIsXG4gICAgICAgIEdSRUFURVJfVEhBTl9PUl9FUVVBTDogXCI+PVwiLFxuICAgICAgICBMRVNTOiBcIjxcIixcbiAgICAgICAgTEVTU19USEFOOiBcIjxcIixcbiAgICAgICAgTEVTU19PUl9FUVVBTDogXCI8PVwiLFxuICAgICAgICBMRVNTX1RIQU5fT1JfRVFVQUw6IFwiPD1cIixcbiAgICAgICAgQ09OVEFJTlM6IFwiTElLRVwiLFxuICAgICAgICBET0VTX05PVF9DT05UQUlOOiBcIk5PVCBMSUtFXCIsXG4gICAgICAgIFNUQVJUU19XSVRIOiBcIkxJS0VcIixcbiAgICAgICAgRU5EU19XSVRIOiBcIkxJS0VcIixcbiAgICAgIH1bdmFsdWVdID8/IHZhbHVlXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGaWx0ZXJWYWx1ZVNxbChcbiAgICBjb2x1bW5WYWx1ZTogc3RyaW5nLFxuICAgIG9wZXJhdG9yOiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd25cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IFN0cmluZyh2YWx1ZSA/PyBFTVBUWV9WQUxVRSk7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKGNvbHVtblZhbHVlKTtcbiAgICBpZiAoY29sdW1uPy5kYXRhVHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBzdHJpbmdWYWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIiA/IFwiVFJVRVwiIDogXCJGQUxTRVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc051bWVyaWNUeXBlKGNvbHVtbj8uZGF0YVR5cGUpICYmIHN0cmluZ1ZhbHVlKSB7XG4gICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgfVxuICAgIGlmIChbXCJDT05UQUlOU1wiLCBcIkRPRVNfTk9UX0NPTlRBSU5cIiwgXCJTVEFSVFNfV0lUSFwiLCBcIkVORFNfV0lUSFwiXS5pbmNsdWRlcyhcbiAgICAgIG9wZXJhdG9yXG4gICAgKSkge1xuICAgICAgcmV0dXJuIHRoaXMucXVvdGVTcWxWYWx1ZSh0aGlzLmRlY29yYXRlTGlrZVZhbHVlKG9wZXJhdG9yLCBzdHJpbmdWYWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5xdW90ZVNxbFZhbHVlKHN0cmluZ1ZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGRlY29yYXRlTGlrZVZhbHVlKG9wZXJhdG9yOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChvcGVyYXRvciA9PT0gXCJTVEFSVFNfV0lUSFwiKSB7XG4gICAgICByZXR1cm4gYCR7dmFsdWV9JWA7XG4gICAgfVxuICAgIGlmIChvcGVyYXRvciA9PT0gXCJFTkRTX1dJVEhcIikge1xuICAgICAgcmV0dXJuIGAlJHt2YWx1ZX1gO1xuICAgIH1cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiQ09OVEFJTlNcIiB8fCBvcGVyYXRvciA9PT0gXCJET0VTX05PVF9DT05UQUlOXCIpIHtcbiAgICAgIHJldHVybiBgJSR7dmFsdWV9JWA7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIHF1b3RlU3FsVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAnJHt2YWx1ZS5yZXBsYWNlKC8nL2csIFwiJydcIil9J2A7XG4gIH1cbiAgcHJpdmF0ZSBzeW5jTGF5b3V0TW9kZUl0ZW1zKCk6IHZvaWQge1xuICAgIHRoaXMubGF5b3V0TW9kZUl0ZW1zWzBdLmxhYmVsID0gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmxheW91dE1vZGVzLnN0YWNrZWRgLFxuICAgICAgXCJCbG9jb3NcIlxuICAgICk7XG4gICAgdGhpcy5sYXlvdXRNb2RlSXRlbXNbMV0ubGFiZWwgPSB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubGF5b3V0TW9kZXMuc3BsaXRgLFxuICAgICAgXCJMaXN0YVwiXG4gICAgKTtcbiAgICB0aGlzLnN5bmNTZWxlY3RlZExheW91dE1vZGVJdGVtcygpO1xuICB9XG4gIHByaXZhdGUgc3luY0ZpbHRlck1vZGVJdGVtcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlck1vZGVJdGVtc1swXS5sYWJlbCA9IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLm1vZGVzLmNvbmRpdGlvbmAsXG4gICAgICBcIkZpbHRyb1wiXG4gICAgKTtcbiAgICB0aGlzLmZpbHRlck1vZGVJdGVtc1sxXS5sYWJlbCA9IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmRvbWFpbkxhYmVsYCxcbiAgICAgIFwiRXhwcmVzc2FvIGRlIGRvbWluaW9cIlxuICAgICk7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRGaWx0ZXJNb2RlSXRlbXMoKTtcbiAgfVxuICBwcml2YXRlIHN5bmNTb3J0RGlyZWN0aW9uSXRlbXMoKTogdm9pZCB7XG4gICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbXMuc3BsaWNlKFxuICAgICAgMCxcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW1zLmxlbmd0aCxcbiAgICAgIC4uLnRoaXMuc29ydERpcmVjdGlvbk9wdGlvbnMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBsYWJlbDogaXRlbS50ZXh0LFxuICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgIH0pKVxuICAgICk7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRTb3J0RGlyZWN0aW9uSXRlbXMoKTtcbiAgfVxuICBwcml2YXRlIHN5bmNTZWxlY3RlZExheW91dE1vZGVJdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMubGF5b3V0TW9kZUl0ZW1zLmZpbmQoXG4gICAgICAoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdGhpcy5sYXlvdXRNb2RlXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdGVkTGF5b3V0TW9kZUl0ZW1zLnNwbGljZShcbiAgICAgIDAsXG4gICAgICB0aGlzLnNlbGVjdGVkTGF5b3V0TW9kZUl0ZW1zLmxlbmd0aCxcbiAgICAgIC4uLihzZWxlY3RlZCA/IFtzZWxlY3RlZF0gOiBbXSlcbiAgICApO1xuICB9XG4gIHByaXZhdGUgc3luY1NlbGVjdGVkRmlsdGVyTW9kZUl0ZW1zKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5maWx0ZXJNb2RlSXRlbXMuZmluZChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSB0aGlzLmZpbHRlck1vZGFsTW9kZVxuICAgICk7XG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlck1vZGVJdGVtcy5zcGxpY2UoXG4gICAgICAwLFxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlck1vZGVJdGVtcy5sZW5ndGgsXG4gICAgICAuLi4oc2VsZWN0ZWQgPyBbc2VsZWN0ZWRdIDogW10pXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHN5bmNTZWxlY3RlZFNvcnREaXJlY3Rpb25JdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc29ydERpcmVjdGlvbkl0ZW1zLmZpbmQoXG4gICAgICAoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdGhpcy5zb3J0RHJhZnQuZGlyZWN0aW9uXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdGVkU29ydERpcmVjdGlvbkl0ZW1zLnNwbGljZShcbiAgICAgIDAsXG4gICAgICB0aGlzLnNlbGVjdGVkU29ydERpcmVjdGlvbkl0ZW1zLmxlbmd0aCxcbiAgICAgIC4uLihzZWxlY3RlZCA/IFtzZWxlY3RlZF0gOiBbXSlcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0IGZpbHRlclNlcXVlbmNlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJFZGl0SW5kZXggPz8gdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMubGVuZ3RoO1xuICB9XG4gIHByaXZhdGUgcGFyc2VNdWx0aVZhbHVlVGV4dCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB2YWx1ZVxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG4gIHByaXZhdGUgYnVpbGRBbGlhc0ZvclRhYmxlKHRhYmxlOiBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3Qgd29yZHMgPSB0YWJsZS50ZXh0XG4gICAgICAuc3BsaXQoL1tcXHNfLi1dKy8pXG4gICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKHdvcmRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiB3b3Jkc1xuICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtWzBdPy50b0xvd2VyQ2FzZSgpID8/IEVNUFRZX1ZBTFVFKVxuICAgICAgICAuam9pbihcIlwiKTtcbiAgICB9XG4gICAgcmV0dXJuICh0YWJsZS52YWx1ZS5zcGxpdChcIi5cIikucG9wKCkgPz8gdGFibGUudmFsdWUpXG4gICAgICAuc2xpY2UoMCwgQUxJQVNfTUFYX0xFTkdUSClcbiAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZURlZmF1bHRTb3VyY2VBbGlhcyh0YWJsZVZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5yZXNvbHZlVGFibGVPcHRpb24odGFibGVWYWx1ZSk7XG4gICAgcmV0dXJuIHRhYmxlID8gdGhpcy5idWlsZEFsaWFzRm9yVGFibGUodGFibGUpIDogRU1QVFlfVkFMVUU7XG4gIH1cbiAgcHJpdmF0ZSBoYXNDdXN0b21BbGlhcyh0YWJsZVZhbHVlOiBzdHJpbmcsIGFsaWFzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMucmVzb2x2ZVRhYmxlT3B0aW9uKHRhYmxlVmFsdWUpO1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEhYWxpYXMudHJpbSgpICYmIGFsaWFzLnRyaW0oKSAhPT0gdGhpcy5idWlsZEFsaWFzRm9yVGFibGUodGFibGUpO1xuICB9XG4gIG9uRmllbGRGdW5jdGlvbk5hbWVDaGFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbk5hbWUpIHtcbiAgICAgIHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uQWxpYXMgPSBFTVBUWV9WQUxVRTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW4gPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuY29sdW1uKTtcbiAgICBpZiAoXG4gICAgICBzZWxlY3RlZENvbHVtbiAmJlxuICAgICAgIXRoaXMuZmlsdGVyRnVuY3Rpb25TZWxlY3RhYmxlQ29sdW1ucyh0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbk5hbWUpXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0udmFsdWUpXG4gICAgICAgIC5pbmNsdWRlcyhzZWxlY3RlZENvbHVtbi52YWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uTmFtZSA9IEVNUFRZX1ZBTFVFO1xuICAgICAgdGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuZnVuY3Rpb25BbGlhcyA9IEVNUFRZX1ZBTFVFO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uQWxpYXMudHJpbSgpKSB7XG4gICAgICB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbkFsaWFzID0gdGhpcy5idWlsZEZpZWxkRnVuY3Rpb25BbGlhcygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGJ1aWxkRnVuY3Rpb25BbGlhcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbih0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5jb2x1bW4pO1xuICAgIGNvbnN0IGJhc2UgPSBjb2x1bW4/LnRleHQgPz8gdGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuY29sdW1uID8/IEVNUFRZX1ZBTFVFO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHRoaXMuc2x1Z2lmeShiYXNlKTtcbiAgICByZXR1cm4gc3VmZml4XG4gICAgICA/IGAke3RoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uTmFtZX1fJHtzdWZmaXh9YFxuICAgICAgOiB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbk5hbWU7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEZpZWxkRnVuY3Rpb25BbGlhcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkRnVuY3Rpb25BbGlhcygpO1xuICB9XG4gIHByaXZhdGUgYnVpbGRGaWVsZEZ1bmN0aW9uRHJhZnQoKTogRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRGdW5jdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uTmFtZS50cmltKCk7XG4gICAgaWYgKCFmdW5jdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgYWxpYXM6IChcbiAgICAgICAgdGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuZnVuY3Rpb25BbGlhcyB8fCB0aGlzLmJ1aWxkRmllbGRGdW5jdGlvbkFsaWFzKClcbiAgICAgICkudHJpbSgpLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBwYXRjaEZpZWxkTW9kYWxEcmFmdChcbiAgICBjb2x1bW46IHN0cmluZyxcbiAgICBwYXRjaDogUGFydGlhbDxEeW5hbWljVmlld0J1aWxkZXJGaWVsZD5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5maWVsZE1vZGFsRHJhZnRzID0gdGhpcy5maWVsZE1vZGFsRHJhZnRzLm1hcCgoaXRlbSkgPT5cbiAgICAgIGl0ZW0uY29sdW1uID09PSBjb2x1bW5cbiAgICAgICAgPyB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAuLi5wYXRjaCxcbiAgICAgICAgfVxuICAgICAgICA6IGl0ZW1cbiAgICApO1xuICB9XG4gIHByaXZhdGUgbWVyZ2VMZWdhY3lGdW5jdGlvbnNJbnRvRmllbGRzKFxuICAgIGZpZWxkczogRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRbXSxcbiAgICBmdW5jdGlvbnM6IER5bmFtaWNWaWV3QnVpbGRlckZ1bmN0aW9uW11cbiAgKTogRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRbXSB7XG4gICAgY29uc3QgZmllbGRCeUNvbHVtbiA9IG5ldyBNYXAoZmllbGRzLm1hcCgoaXRlbSkgPT4gW2l0ZW0uY29sdW1uLCB7IC4uLml0ZW0gfV0pKTtcblxuICAgIGZ1bmN0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gZmllbGRCeUNvbHVtbi5nZXQoaXRlbS5jb2x1bW4pID8/IHsgY29sdW1uOiBpdGVtLmNvbHVtbiB9O1xuICAgICAgaWYgKCFjdXJyZW50LmZ1bmN0aW9uKSB7XG4gICAgICAgIGN1cnJlbnQuZnVuY3Rpb24gPSB7XG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiBpdGVtLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICBhbGlhczogaXRlbS5hbGlhcyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGZpZWxkQnlDb2x1bW4uc2V0KGl0ZW0uY29sdW1uLCBjdXJyZW50KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKGZpZWxkQnlDb2x1bW4udmFsdWVzKCkpO1xuICB9XG4gIHByaXZhdGUgZXh0cmFjdEZ1bmN0aW9uc0Zyb21GaWVsZHMoXG4gICAgZmllbGRzOiBEeW5hbWljVmlld0J1aWxkZXJGaWVsZFtdXG4gICk6IER5bmFtaWNWaWV3QnVpbGRlckZ1bmN0aW9uW10ge1xuICAgIHJldHVybiBmaWVsZHNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICEhaXRlbS5mdW5jdGlvbj8uZnVuY3Rpb25OYW1lPy50cmltKCkpXG4gICAgICAubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGl0ZW0uZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICBjb2x1bW46IGl0ZW0uY29sdW1uLFxuICAgICAgICBhbGlhczpcbiAgICAgICAgICBpdGVtLmZ1bmN0aW9uPy5hbGlhcz8udHJpbSgpIHx8IC8vIE5PU09OQVIgLSBlbXB0eSBzdHJpbmcgZmFsbGJhY2sgaXMgaW50ZW50aW9uYWxcbiAgICAgICAgICBpdGVtLmFsaWFzPy50cmltKCkgfHwgLy8gTk9TT05BUiAtIGVtcHR5IHN0cmluZyBmYWxsYmFjayBpcyBpbnRlbnRpb25hbFxuICAgICAgICAgIHRoaXMuc2x1Z2lmeShgJHtpdGVtLmZ1bmN0aW9uPy5mdW5jdGlvbk5hbWUgPz8gRU1QVFlfVkFMVUV9XyR7aXRlbS5jb2x1bW59YCksXG4gICAgICB9KSk7XG4gIH1cbiAgcHJpdmF0ZSBzbHVnaWZ5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZSh2YWx1ZSkucmVwbGFjZSgvW15hLXowLTldKy9nLCBcIl9cIik7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBsZXQgZW5kID0gbm9ybWFsaXplZC5sZW5ndGg7XG5cbiAgICB3aGlsZSAoc3RhcnQgPCBlbmQgJiYgbm9ybWFsaXplZC5jaGFyQXQoc3RhcnQpID09PSBcIl9cIikge1xuICAgICAgc3RhcnQgKz0gMTtcbiAgICB9XG5cbiAgICB3aGlsZSAoZW5kID4gc3RhcnQgJiYgbm9ybWFsaXplZC5jaGFyQXQoZW5kIC0gMSkgPT09IFwiX1wiKSB7XG4gICAgICBlbmQgLT0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZC5zbGljZShzdGFydCwgZW5kKTtcbiAgfVxuICBwcml2YXRlIGRlZHVwbGljYXRlQnlLZXk8VD4oXG4gICAgaXRlbXM6IFRbXSxcbiAgICBrZXlSZXNvbHZlcjogKGl0ZW06IFQpID0+IHN0cmluZ1xuICApOiBUW10ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IG1hcC5zZXQoa2V5UmVzb2x2ZXIoaXRlbSksIGl0ZW0pKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShtYXAudmFsdWVzKCkpO1xuICB9XG4gIHByaXZhdGUgaHVtYW5pemVLZXkodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnNwbGl0KFwiX1wiKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGl0ZW0uc2xpY2UoMSkpXG4gICAgICAuam9pbihcIiBcIik7XG4gIH1cbiAgcHJpdmF0ZSBpbnN0YW50V2l0aEZhbGxiYWNrKGtleTogc3RyaW5nLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0cmFuc2xhdGVkID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChrZXkpO1xuICAgIHJldHVybiB0cmFuc2xhdGVkICYmIHRyYW5zbGF0ZWQgIT09IGtleSA/IHRyYW5zbGF0ZWQgOiBmYWxsYmFjaztcbiAgfVxuICBwcml2YXRlIGJ1aWxkRmlsdGVyRnJvbURyYWZ0KCk6IER5bmFtaWNWaWV3QnVpbGRlckZpbHRlciB8IG51bGwgeyAvLyBOT1NPTkFSIC0gY29tcGxleGl0eTogZXh0cmFjdGlvbiB3b3VsZCByaXNrIGJlaGF2aW9yIGNoYW5nZVxuICAgIGlmICh0aGlzLmZpbHRlck1vZGFsTW9kZSA9PT0gRklMVEVSX01PREVfRE9NQUlOKSB7XG4gICAgICBjb25zdCBkb21haW5FeHByZXNzaW9uID0gdGhpcy5maWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uLnRyaW0oKTtcblxuICAgICAgaWYgKCFkb21haW5FeHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW46IEVNUFRZX1ZBTFVFLFxuICAgICAgICBvcGVyYXRvcjogRU1QVFlfVkFMVUUsXG4gICAgICAgIGNvbm5lY3RvcjogdGhpcy5maWx0ZXJEcmFmdC5jb25uZWN0b3IsXG4gICAgICAgIG9wdGlvbmFsOiB0aGlzLmZpbHRlckRyYWZ0Lm9wdGlvbmFsLFxuICAgICAgICB2YWx1ZVR5cGU6IEZJTFRFUl9NT0RFX0RPTUFJTixcbiAgICAgICAgZG9tYWluRXhwcmVzc2lvbixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbiB8fCAhdGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dDogRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyID0ge1xuICAgICAgY29sdW1uOiB0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbixcbiAgICAgIG9wZXJhdG9yOiB0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yLFxuICAgICAgY29ubmVjdG9yOiB0aGlzLmZpbHRlckRyYWZ0LmNvbm5lY3RvcixcbiAgICAgIG9wdGlvbmFsOiB0aGlzLmZpbHRlckRyYWZ0Lm9wdGlvbmFsLFxuICAgICAgdmFsdWVUeXBlOiB0aGlzLmZpbHRlck5lZWRzVmFsdWUgPyB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlVHlwZSA6IERFRkFVTFRfRklMVEVSX1ZBTFVFX1RZUEUsXG4gICAgfTtcblxuICAgIGlmICghdGhpcy5maWx0ZXJOZWVkc1ZhbHVlKSB7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUgPT09IFwicGFyYW1ldGVyXCIpIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlck5hbWUgPSB0aGlzLmZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWUudHJpbSgpO1xuXG4gICAgICBpZiAoIXBhcmFtZXRlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5leHQucGFyYW1ldGVyTmFtZSA9IHBhcmFtZXRlck5hbWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvciA9PT0gXCJJTlwiKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnBhcnNlTXVsdGlWYWx1ZVRleHQodGhpcy5maWx0ZXJEcmFmdC52YWx1ZXNUZXh0KTtcblxuICAgICAgaWYgKCF2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBuZXh0LnZhbHVlcyA9IHZhbHVlcztcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yID09PSBcIkJFVFdFRU5cIikge1xuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5TdGFydC50cmltKCk7XG4gICAgICBjb25zdCBlbmQgPSB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5FbmQudHJpbSgpO1xuXG4gICAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5leHQudmFsdWVzID0gW3N0YXJ0LCBlbmRdO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlLnRyaW0oKTtcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIG5leHQudmFsdWUgPSB2YWx1ZTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGaWx0ZXJEcmFmdFNxbFByZXZpZXcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5idWlsZEZpbHRlckZyb21EcmFmdCgpO1xuXG4gICAgaWYgKCFuZXh0KSB7XG4gICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUZpbHRlclNxbChuZXh0KTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGaWx0ZXJEcmFmdERpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbHRlck1vZGFsTW9kZSA9PT0gRklMVEVSX01PREVfRE9NQUlOKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uLnRyaW0oKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUgPT09IFwicGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWVcbiAgICAgICAgPyBgOiR7dGhpcy5maWx0ZXJEcmFmdC5wYXJhbWV0ZXJOYW1lfWBcbiAgICAgICAgOiBFTVBUWV9WQUxVRTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IgPT09IFwiSU5cIikge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyRHJhZnQudmFsdWVzVGV4dDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IgPT09IFwiQkVUV0VFTlwiKSB7XG4gICAgICByZXR1cm4gW3RoaXMuZmlsdGVyRHJhZnQuYmV0d2VlblN0YXJ0LCB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5FbmRdXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmpvaW4oXCIgLSBcIik7XG4gICAgfVxuICAgIGlmICghdGhpcy5maWx0ZXJOZWVkc1ZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLm9wdGlvbmFsYCxcbiAgICAgICAgXCJTZW0gdmFsb3JcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyRHJhZnQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBzY2hlZHVsZUZsb3dBcnJvd1JlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVmcmVzaEZsb3dBcnJvd3NGcmFtZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yZWZyZXNoRmxvd0Fycm93c0ZyYW1lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVmcmVzaEZsb3dBcnJvd3NUaW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoRmxvd0Fycm93c1RpbWVvdXQpO1xuICAgICAgdGhpcy5yZWZyZXNoRmxvd0Fycm93c1RpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hGbG93QXJyb3dzRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoRmxvd0Fycm93c0ZyYW1lID0gbnVsbDtcbiAgICAgIHRoaXMucmVmcmVzaEZsb3dBcnJvd3MoKTtcbiAgICAgIHRoaXMucmVmcmVzaEZsb3dBcnJvd3NUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVmcmVzaEZsb3dBcnJvd3NUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWZyZXNoRmxvd0Fycm93cygpO1xuICAgICAgfSwgRkxPV19BUlJPV1NfUkVGUkVTSF9ERUxBWV9NUyk7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSByZWZyZXNoRmxvd0Fycm93cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hNZWFzdXJlZFByZXZpZXdIZWlnaHQoKTtcbiAgICBjb25zdCBuZXh0QXJyb3dzID0gdGhpcy5idWlsZEZsb3dBcnJvd3MoKTtcbiAgICB0aGlzLmZsb3dBcnJvd3MgPSBuZXh0QXJyb3dzO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgcHJpdmF0ZSByZWZyZXNoTWVhc3VyZWRQcmV2aWV3SGVpZ2h0KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlY3Rpb25zSGVpZ2h0ID0gdGhpcy5zZWN0aW9uc0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPz8gMDtcbiAgICB0aGlzLm1lYXN1cmVkU3BsaXRQcmV2aWV3SGVpZ2h0ID1cbiAgICAgIHNlY3Rpb25zSGVpZ2h0ID4gMCA/IGAke3NlY3Rpb25zSGVpZ2h0fXB4YCA6IFwiMjRyZW1cIjtcbiAgfVxuICBwcml2YXRlIGJ1aWxkRmxvd0Fycm93cygpOiBCdWlsZGVyRmxvd0Fycm93W10ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2VjdGlvbnNDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLmJ1aWxkZXJTZWN0aW9ucz8udG9BcnJheSgpID8/IFtdO1xuICAgIGlmICghY29udGFpbmVyIHx8IHNlY3Rpb25zLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qgc2VjdGlvbk1hcCA9IG5ldyBNYXA8QnVpbGRlclNlY3Rpb25JZCwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgc2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvblJlZikgPT4ge1xuICAgICAgY29uc3Qgc2VjdGlvbklkID0gc2VjdGlvblJlZi5uYXRpdmVFbGVtZW50LmRhdGFzZXRbXG4gICAgICAgIFwic2VjdGlvbklkXCJcbiAgICAgIF0gYXMgQnVpbGRlclNlY3Rpb25JZCB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChzZWN0aW9uSWQpIHtcbiAgICAgICAgc2VjdGlvbk1hcC5zZXQoc2VjdGlvbklkLCBzZWN0aW9uUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHRoaXMuc2VjdGlvbk9yZGVyXG4gICAgICAuc2xpY2UoMCwgLTEpXG4gICAgICAubWFwKChzZWN0aW9uSWQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBzZWN0aW9uTWFwLmdldChzZWN0aW9uSWQpO1xuICAgICAgICBjb25zdCBuZXh0ID0gc2VjdGlvbk1hcC5nZXQodGhpcy5zZWN0aW9uT3JkZXJbaW5kZXggKyAxXSk7XG4gICAgICAgIGlmICghY3VycmVudCB8fCAhbmV4dCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZWN0ID0gY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgbmV4dFJlY3QgPSBuZXh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBpc1NhbWVSb3cgPSBNYXRoLmFicyhjdXJyZW50UmVjdC50b3AgLSBuZXh0UmVjdC50b3ApIDwgMTY7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxHYXAgPSBNYXRoLm1heChGTE9XX0FSUk9XX01JTl9HQVAsIG5leHRSZWN0LmxlZnQgLSBjdXJyZW50UmVjdC5yaWdodCk7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsR2FwID0gTWF0aC5tYXgoRkxPV19BUlJPV19NSU5fR0FQLCBuZXh0UmVjdC50b3AgLSBjdXJyZW50UmVjdC5ib3R0b20pO1xuICAgICAgICBjb25zdCBvdmVybGFwTGVmdCA9IE1hdGgubWF4KGN1cnJlbnRSZWN0LmxlZnQsIG5leHRSZWN0LmxlZnQpO1xuICAgICAgICBjb25zdCBvdmVybGFwUmlnaHQgPSBNYXRoLm1pbihjdXJyZW50UmVjdC5yaWdodCwgbmV4dFJlY3QucmlnaHQpO1xuICAgICAgICBjb25zdCBvdmVybGFwVG9wID0gTWF0aC5tYXgoY3VycmVudFJlY3QudG9wLCBuZXh0UmVjdC50b3ApO1xuICAgICAgICBjb25zdCBvdmVybGFwQm90dG9tID0gTWF0aC5taW4oY3VycmVudFJlY3QuYm90dG9tLCBuZXh0UmVjdC5ib3R0b20pO1xuICAgICAgICBjb25zdCBuZXh0Q2VudGVyWCA9IG5leHRSZWN0LmxlZnQgKyBuZXh0UmVjdC53aWR0aCAvIDI7XG4gICAgICAgIGNvbnN0IHNhbWVSb3dUb3AgPVxuICAgICAgICAgIG92ZXJsYXBUb3AgPCBvdmVybGFwQm90dG9tXG4gICAgICAgICAgICA/IG92ZXJsYXBUb3AgKyAob3ZlcmxhcEJvdHRvbSAtIG92ZXJsYXBUb3ApIC8gMlxuICAgICAgICAgICAgOiAoY3VycmVudFJlY3QudG9wICtcbiAgICAgICAgICAgICAgY3VycmVudFJlY3QuaGVpZ2h0IC8gMiArXG4gICAgICAgICAgICAgIChuZXh0UmVjdC50b3AgKyBuZXh0UmVjdC5oZWlnaHQgLyAyKSkgL1xuICAgICAgICAgICAgMjtcbiAgICAgICAgY29uc3QgZG93bkxlZnQgPVxuICAgICAgICAgIG92ZXJsYXBMZWZ0IDwgb3ZlcmxhcFJpZ2h0XG4gICAgICAgICAgICA/IG92ZXJsYXBMZWZ0ICsgKG92ZXJsYXBSaWdodCAtIG92ZXJsYXBMZWZ0KSAvIDJcbiAgICAgICAgICAgIDogKGN1cnJlbnRSZWN0LmxlZnQgKyBjdXJyZW50UmVjdC53aWR0aCAvIDIgKyBuZXh0Q2VudGVyWCkgLyAyO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiBgJHtzZWN0aW9uSWR9LSR7dGhpcy5zZWN0aW9uT3JkZXJbaW5kZXggKyAxXX1gLFxuICAgICAgICAgIGRpcmVjdGlvbjogaXNTYW1lUm93ID8gXCJyaWdodFwiIDogXCJkb3duXCIsXG4gICAgICAgICAgbGVmdDogaXNTYW1lUm93XG4gICAgICAgICAgICA/IGN1cnJlbnRSZWN0LnJpZ2h0IC0gY29udGFpbmVyUmVjdC5sZWZ0IC0gRkxPV19BUlJPV19JTlNFVCArIGhvcml6b250YWxHYXAgLyAyXG4gICAgICAgICAgICA6IGRvd25MZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0LFxuICAgICAgICAgIHRvcDogaXNTYW1lUm93XG4gICAgICAgICAgICA/IHNhbWVSb3dUb3AgLSBjb250YWluZXJSZWN0LnRvcFxuICAgICAgICAgICAgOiBjdXJyZW50UmVjdC5ib3R0b20gLSBjb250YWluZXJSZWN0LnRvcCAtIEZMT1dfQVJST1dfSU5TRVQgKyB2ZXJ0aWNhbEdhcCAvIDIsXG4gICAgICAgIH0gc2F0aXNmaWVzIEJ1aWxkZXJGbG93QXJyb3c7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgQnVpbGRlckZsb3dBcnJvdyA9PiAhIWl0ZW0pO1xuICB9XG59XG5cbmV4cG9ydCB7IFZpc3VhbFNxbEVkaXRvckNvbXBvbmVudCBhcyBEeW5hbWljVmlld0J1aWxkZXJDb21wb25lbnQgfTtcbiIsIjxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlclwiIFthdHRyLmFyaWEtYnVzeV09XCJsb2FkaW5nXCI+XG4gIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fdG9vbGJhclwiPlxuICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fdG9vbGJhci1jb3B5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3RpdGxlXCI+XG4gICAgICAgIHt7IGNvbmZpZy5tZXRhZGF0YS50aXRsZSB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3N1YnRpdGxlXCI+XG4gICAgICAgIHt7IGNvbmZpZy5tZXRhZGF0YS5kZXNjcmlwdGlvbiB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX190b29sYmFyLWFjdGlvbnNcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Rvb2xiYXItbGFiZWxcIj5cbiAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmxheW91dE1vZGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNkYy1zZWxlY3QtYnV0dG9uXG4gICAgICAgIFtpdGVtc109XCJsYXlvdXRNb2RlSXRlbXNcIlxuICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZExheW91dE1vZGVJdGVtc1wiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTGF5b3V0TW9kZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgID48L3NkYy1zZWxlY3QtYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcHJldmlldy10b2dnbGVcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlUHJldmlldygpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInByZXZpZXdWaXNpYmxlXCJcbiAgICAgICAgW3RpdGxlXT1cInByZXZpZXdUb2dnbGVMYWJlbFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicHJldmlld1RvZ2dsZUxhYmVsXCJcbiAgICAgICAgPlxuICAgICAgICA8aVxuICAgICAgICAgIFtjbGFzc109XCJwcmV2aWV3VmlzaWJsZSA/ICdmYXMgZmEtZXllLXNsYXNoJyA6ICdmYXMgZmEtZXllJ1wiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvaT5cbiAgICAgICAge3sgcHJldmlld1RvZ2dsZUxhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgQGlmIChzZWxlY3Rpb25Nb2RhbFZpc2libGUpIHtcbiAgICA8c2RjLW1vZGFsXG4gICAgICBbdmlzaWJsZV09XCJzZWxlY3Rpb25Nb2RhbFZpc2libGVcIlxuICAgICAgKHZpc2libGVDaGFuZ2UpPVwiJGV2ZW50ID8gKHNlbGVjdGlvbk1vZGFsVmlzaWJsZSA9IHRydWUpIDogY2xvc2VTZWxlY3Rpb25Nb2RhbCgpXCJcbiAgICAgIFtoZWFkZXJdPVwic2VsZWN0aW9uTW9kYWxUaXRsZVwiXG4gICAgICBbd2lkdGhdPVwibW9kYWxEaW1lbnNpb25zLnNlbGVjdGlvbi53aWR0aFwiXG4gICAgICBbaGVpZ2h0XT1cIm1vZGFsRGltZW5zaW9ucy5zZWxlY3Rpb24uaGVpZ2h0XCJcbiAgICAgIFttYXhpbWl6YWJsZV09XCJmYWxzZVwiXG4gICAgICBbZm9vdGVyQnV0dG9uc109XCJbXVwiXG4gICAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXNoZWxsIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbC0tZnVsbFxuICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tZmxvdyBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3RhZ2VcIlxuICAgICAgICA+XG4gICAgICAgIEBpZiAoc2VsZWN0aW9uTW9kYWxNb2RlID09PSAndGFibGVzJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtaW5saW5lLXN1cmZhY2VcIj5cbiAgICAgICAgICAgIDxzZGMtdGV4dGJveFxuICAgICAgICAgICAgICBbbGFiZWxdPVwibW9kYWxTZWFyY2hMYWJlbFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJtb2RhbFNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0aW9uTW9kYWxTZWFyY2hcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3Rpb25Nb2RhbFNlYXJjaCA9ICRldmVudFwiXG4gICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1jYXJkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1jYXJkLS1zZWN0aW9uXG4gICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdGFnZS1ib2R5XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXRhYmxlXG4gICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi10YWJsZS0tY2hvb3NlclxuICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tdGFibGUtLWZsdWlkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1oZWFkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tY29sXCI+XG4gICAgICAgICAgICAgICAgICB7eyBtb2RhbE5hbWVMYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWNvbFwiPlxuICAgICAgICAgICAgICAgICAge3sgbW9kYWxUeXBlTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1jb2wgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1jb2wtLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAge3sgbW9kYWxTZWxlY3RMYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tYm9keVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBzZWxlY3Rpb25Nb2RhbFJvd3M7IHRyYWNrIHRyYWNrQnlJZCgkaW5kZXgsIHJvdykpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXJvd1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5keW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXJvdy0tc2VsZWN0ZWRdPVwicm93LnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCInYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInJvdy5kaXNhYmxlZCA/IC0xIDogMFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJyb3cuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInJvdy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb25Nb2RhbFJvdyhyb3cuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25TZWxlY3RhYmxlUm93S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cudGFibGVMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXBhdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cucGF0aFR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvdy5kYkxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tZGJcIj57eyByb3cuZGJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cuZGJMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXNlcGFyYXRvclwiPi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi10YWJsZS1sYWJlbFwiPnt7IHJvdy50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tdGFibGUtbGFiZWxcIj57eyByb3cudGFibGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tc2VwYXJhdG9yXCI+Ljwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tYWNjZW50XCI+e3sgcm93Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvdy5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tY2VsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWNlbGwtLW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyByb3cubWV0YSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvdy5ub3RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tbm90ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cubm90ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWNlbGwgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1jZWxsLS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLW1hcmtlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1tYXJrZXItLXNlbGVjdGVkXT1cInJvdy5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hlY2tcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGwgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN0YWdlLWJvZHlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPHNkYy1waWNrbGlzdFxuICAgICAgICAgICAgICBbaXRlbXNdPVwic2VsZWN0aW9uTW9kYWxQaWNrbGlzdEl0ZW1zXCJcbiAgICAgICAgICAgICAgW3NlbGVjdGVkSWRzXT1cInNlbGVjdGlvbk1vZGFsU2VsZWN0ZWRQaWNrbGlzdElkc1wiXG4gICAgICAgICAgICAgIGlkS2V5PVwiaWRcIlxuICAgICAgICAgICAgICB0aXRsZUtleT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgdGl0bGVQcmVmaXhLZXk9XCJ0aXRsZVByZWZpeFwiXG4gICAgICAgICAgICAgIHRpdGxlU3VmZml4S2V5PVwidGl0bGVTdWZmaXhcIlxuICAgICAgICAgICAgICB0aXRsZVByZWZpeENvbG9yS2V5PVwidGl0bGVQcmVmaXhDb2xvclwiXG4gICAgICAgICAgICAgIHRpdGxlU3VmZml4Q29sb3JLZXk9XCJ0aXRsZVN1ZmZpeENvbG9yXCJcbiAgICAgICAgICAgICAgYmFkZ2VLZXk9XCJiYWRnZVwiXG4gICAgICAgICAgICAgIGJhZGdlQ29sb3JLZXk9XCJiYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbc2hvd0l0ZW1JY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db3VudGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tb2RhbHMuc2VhcmNoUGxhY2Vob2xkZXInXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uU2VsZWN0aW9uTW9kYWxTZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3NkYy1waWNrbGlzdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGZvb3RlciBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1mb290ZXJcIj5cbiAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jYW5jZWwnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgcHJpb3JpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZVNlbGVjdGlvbk1vZGFsKClcIlxuICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNsb3NlU2VsZWN0aW9uTW9kYWwoKVwiXG4gICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY29uZmlybVNlbGVjdGlvbicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAoY2xpY2spPVwiY29uZmlybVNlbGVjdGlvbk1vZGFsKClcIlxuICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNvbmZpcm1TZWxlY3Rpb25Nb2RhbCgpXCJcbiAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvc2RjLW1vZGFsPlxuICB9XG5cbiAgQGlmIChzb3VyY2VNb2RhbFZpc2libGUpIHtcbiAgICA8c2RjLW1vZGFsXG4gICAgICBbdmlzaWJsZV09XCJzb3VyY2VNb2RhbFZpc2libGVcIlxuICAgICAgKHZpc2libGVDaGFuZ2UpPVwiJGV2ZW50ID8gKHNvdXJjZU1vZGFsVmlzaWJsZSA9IHRydWUpIDogY2xvc2VTb3VyY2VNb2RhbCgpXCJcbiAgICAgIFtoZWFkZXJdPVwic291cmNlTW9kYWxUaXRsZVwiXG4gICAgICBbd2lkdGhdPVwibW9kYWxEaW1lbnNpb25zLnNvdXJjZS53aWR0aFwiXG4gICAgICBbaGVpZ2h0XT1cIm1vZGFsRGltZW5zaW9ucy5zb3VyY2UuaGVpZ2h0XCJcbiAgICAgIFttYXhpbWl6YWJsZV09XCJmYWxzZVwiXG4gICAgICBbZm9vdGVyQnV0dG9uc109XCJbXVwiXG4gICAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXNoZWxsIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1tb2RhbFwiPlxuICAgICAgICA8c2RjLXRpbWVsaW5lXG4gICAgICAgICAgW2l0ZW1zXT1cInNvdXJjZU1vZGFsVGltZWxpbmVJdGVtc1wiXG4gICAgICAgICAgW2FjdGl2ZUluZGV4XT1cInNvdXJjZU1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUgPyAxIDogMFwiXG4gICAgICAgICAgW2ludGVyYWN0aXZlXT1cInRydWVcIlxuICAgICAgICAgIFtzaG93RGVzY3JpcHRpb25zXT1cImZhbHNlXCJcbiAgICAgICAgICBbYXJpYUxhYmVsXT1cInNvdXJjZU1vZGFsVGltZWxpbmVBcmlhTGFiZWxcIlxuICAgICAgICAgIChzdGVwU2VsZWN0KT1cIm9uU291cmNlTW9kYWxUaW1lbGluZVN0ZXBTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgID48L3NkYy10aW1lbGluZT5cbiAgICAgICAgQGlmIChzb3VyY2VNb2RhbFNlbGVjdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc2hlbGwtLWZ1bGxcbiAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1mbG93IGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdGFnZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGwgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN0YWdlLWJvZHlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzZGMtcGlja2xpc3RcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwic291cmNlTW9kYWxQaWNrbGlzdEl0ZW1zXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRJZHNdPVwic291cmNlTW9kYWxTZWxlY3RlZFBpY2tsaXN0SWRzXCJcbiAgICAgICAgICAgICAgICBpZEtleT1cImlkXCJcbiAgICAgICAgICAgICAgICB0aXRsZUtleT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICB0aXRsZVByZWZpeEtleT1cInRpdGxlUHJlZml4XCJcbiAgICAgICAgICAgICAgICB0aXRsZVN1ZmZpeEtleT1cInRpdGxlU3VmZml4XCJcbiAgICAgICAgICAgICAgICB0aXRsZVByZWZpeENvbG9yS2V5PVwidGl0bGVQcmVmaXhDb2xvclwiXG4gICAgICAgICAgICAgICAgdGl0bGVTdWZmaXhDb2xvcktleT1cInRpdGxlU3VmZml4Q29sb3JcIlxuICAgICAgICAgICAgICAgIGJhZGdlS2V5PVwiYmFkZ2VcIlxuICAgICAgICAgICAgICAgIGJhZGdlQ29sb3JLZXk9XCJiYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgICBbc2hvd1BhZ2luYXRvcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dJdGVtSWNvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db3VudGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbYXV0b1Jlc2l6ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uU291cmNlTW9kYWxTZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPjwvc2RjLXBpY2tsaXN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZpZWxkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZC0tc3RyZXRjaFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fZmllbGQtY29uZmlnLXNoZWxsXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1saXN0LXNoZWxsXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NvdXJjZS1jb25maWctbGlzdFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygc291cmNlTW9kYWxDb25maWd1cmVkSXRlbXM7IHRyYWNrIHRyYWNrQnlJZCgkaW5kZXgsIGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NvdXJjZS1jb25maWctcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc291cmNlLWNvbmZpZy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi10YWJsZS1sYWJlbFwiPnt7IGl0ZW0uZGJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1zZXBhcmF0b3JcIj4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWFjY2VudFwiPnt7IGl0ZW0udGFibGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc291cmNlLWNvbmZpZy1jb250cm9sc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGV4dGJveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmFsaWFzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpdGVtLmFsaWFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU291cmNlTW9kYWxBbGlhc0NoYW5nZShpdGVtLnRhYmxlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBmb290ZXIgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyXCI+XG4gICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2FuY2VsJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHByaW9yaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2VTb3VyY2VNb2RhbCgpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjbG9zZVNvdXJjZU1vZGFsKClcIlxuICAgICAgICA+PC9zZGMtYnV0dG9uPlxuICAgICAgICBAaWYgKHNvdXJjZU1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSAmJiBzb3VyY2VNb2RhbENhblByb2NlZWQpIHtcbiAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMubmV4dFN0ZXAnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWR2YW5jZVNvdXJjZU1vZGFsU3RlcCgpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImFkdmFuY2VTb3VyY2VNb2RhbFN0ZXAoKVwiXG4gICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKHNvdXJjZU1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2F2ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc291cmNlTW9kYWxDYW5Qcm9jZWVkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzYXZlU291cmNlTW9kYWwoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlU291cmNlTW9kYWwoKVwiXG4gICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9zZGMtbW9kYWw+XG4gIH1cblxuICBAaWYgKGpvaW5Nb2RhbFZpc2libGUpIHtcbiAgICA8c2RjLW1vZGFsXG4gICAgICBbdmlzaWJsZV09XCJqb2luTW9kYWxWaXNpYmxlXCJcbiAgICAgICh2aXNpYmxlQ2hhbmdlKT1cIiRldmVudCA/IChqb2luTW9kYWxWaXNpYmxlID0gdHJ1ZSkgOiBjbG9zZUpvaW5Nb2RhbCgpXCJcbiAgICAgIFtoZWFkZXJdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuY2FyZHMuam9pbnMudGl0bGUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICBbd2lkdGhdPVwibW9kYWxEaW1lbnNpb25zLmpvaW4ud2lkdGhcIlxuICAgICAgW2hlaWdodF09XCJtb2RhbERpbWVuc2lvbnMuam9pbi5oZWlnaHRcIlxuICAgICAgW21heGltaXphYmxlXT1cImZhbHNlXCJcbiAgICAgIFtmb290ZXJCdXR0b25zXT1cIltdXCJcbiAgICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc2hlbGwgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2pvaW4tbW9kYWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19qb2luLW1vZGFsLXRvcFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeSBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LWxhYmVsXCI+XG4gICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy5sZWZ0JykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LXZhbHVlXG4gICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWUtLXBhdGhcIlxuICAgICAgICAgICAgICA+e3sgam9pblNvdXJjZVN1bW1hcnkgfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZmllbGQtLWNvbXBhY3RcbiAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPHNkYy1jb21ib2JveFxuICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMub3BlcmF0b3InXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiam9pbkRyYWZ0Lm9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiam9pbkRyYWZ0Lm9wZXJhdG9yID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiam9pbk9wZXJhdG9yT3B0aW9uc1wiXG4gICAgICAgICAgICAgIFthcHBlbmRUb109XCJvdmVybGF5QXBwZW5kVGFyZ2V0XCJcbiAgICAgICAgICAgICAgW3pJbmRleF09XCJvdmVybGF5WkluZGV4XCJcbiAgICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgID48L3NkYy1jb21ib2JveD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnkgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS1sYWJlbFwiPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMucmlnaHQnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcbiAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS12YWx1ZS0tcGF0aFwiXG4gICAgICAgICAgICAgID57eyBqb2luVGFyZ2V0U3VtbWFyeSB9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkLS1maXRcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXIgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXBpY2tlci0tc3RyZXRjaFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1wYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMubGVmdCcpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzZGMtcGlja2xpc3RcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cImpvaW5Tb3VyY2VQaWNrbGlzdEl0ZW1zXCJcbiAgICAgICAgICAgICAgW3NlbGVjdGVkSWRzXT1cImpvaW5Tb3VyY2VTZWxlY3RlZFBpY2tsaXN0SWRzXCJcbiAgICAgICAgICAgICAgaWRLZXk9XCJpZFwiXG4gICAgICAgICAgICAgIHRpdGxlS2V5PVwidGl0bGVcIlxuICAgICAgICAgICAgICB0aXRsZVByZWZpeEtleT1cInRpdGxlUHJlZml4XCJcbiAgICAgICAgICAgICAgdGl0bGVTdWZmaXhLZXk9XCJ0aXRsZVN1ZmZpeFwiXG4gICAgICAgICAgICAgIHRpdGxlUHJlZml4Q29sb3JLZXk9XCJ0aXRsZVByZWZpeENvbG9yXCJcbiAgICAgICAgICAgICAgdGl0bGVTdWZmaXhDb2xvcktleT1cInRpdGxlU3VmZml4Q29sb3JcIlxuICAgICAgICAgICAgICBiYWRnZUtleT1cImJhZGdlXCJcbiAgICAgICAgICAgICAgYmFkZ2VDb2xvcktleT1cImJhZGdlQ29sb3JcIlxuICAgICAgICAgICAgICBbc2hvd1BhZ2luYXRvcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtzaG93SXRlbUljb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbc2hvd1NlbGVjdGlvbkNvdW50ZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbYXV0b1Jlc2l6ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFttYXhWaXNpYmxlU2VsZWN0ZWRJdGVtc109XCIxXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgICAgIChzZWxlY3RlZElkc0NoYW5nZSk9XCJvbkpvaW5Tb3VyY2VTZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3NkYy1waWNrbGlzdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXIgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXBpY2tlci0tc3RyZXRjaFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1wYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMucmlnaHQnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c2RjLXBpY2tsaXN0XG4gICAgICAgICAgICAgIFtpdGVtc109XCJqb2luVGFyZ2V0UGlja2xpc3RJdGVtc1wiXG4gICAgICAgICAgICAgIFtzZWxlY3RlZElkc109XCJqb2luVGFyZ2V0U2VsZWN0ZWRQaWNrbGlzdElkc1wiXG4gICAgICAgICAgICAgIGlkS2V5PVwiaWRcIlxuICAgICAgICAgICAgICB0aXRsZUtleT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgdGl0bGVQcmVmaXhLZXk9XCJ0aXRsZVByZWZpeFwiXG4gICAgICAgICAgICAgIHRpdGxlU3VmZml4S2V5PVwidGl0bGVTdWZmaXhcIlxuICAgICAgICAgICAgICB0aXRsZVByZWZpeENvbG9yS2V5PVwidGl0bGVQcmVmaXhDb2xvclwiXG4gICAgICAgICAgICAgIHRpdGxlU3VmZml4Q29sb3JLZXk9XCJ0aXRsZVN1ZmZpeENvbG9yXCJcbiAgICAgICAgICAgICAgYmFkZ2VLZXk9XCJiYWRnZVwiXG4gICAgICAgICAgICAgIGJhZGdlQ29sb3JLZXk9XCJiYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbc2hvd0l0ZW1JY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db3VudGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbbWF4VmlzaWJsZVNlbGVjdGVkSXRlbXNdPVwiMVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLm1vZGFscy5zZWFyY2hQbGFjZWhvbGRlcidcIlxuICAgICAgICAgICAgICAoc2VsZWN0ZWRJZHNDaGFuZ2UpPVwib25Kb2luVGFyZ2V0U2VsZWN0ZWRJZHNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9zZGMtcGlja2xpc3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGZvb3RlciBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1mb290ZXJcIj5cbiAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jYW5jZWwnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgcHJpb3JpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZUpvaW5Nb2RhbCgpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjbG9zZUpvaW5Nb2RhbCgpXCJcbiAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zYXZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuU2F2ZUpvaW5cIlxuICAgICAgICAgIChjbGljayk9XCJzYXZlSm9pbigpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlSm9pbigpXCJcbiAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvc2RjLW1vZGFsPlxuICB9XG5cbiAgQGlmIChzb3J0TW9kYWxWaXNpYmxlKSB7XG4gICAgPHNkYy1tb2RhbFxuICAgICAgW3Zpc2libGVdPVwic29ydE1vZGFsVmlzaWJsZVwiXG4gICAgICAodmlzaWJsZUNoYW5nZSk9XCIkZXZlbnQgPyAoc29ydE1vZGFsVmlzaWJsZSA9IHRydWUpIDogY2xvc2VTb3J0TW9kYWwoKVwiXG4gICAgICBbaGVhZGVyXT1cInNvcnRNb2RhbFRpdGxlXCJcbiAgICAgIFt3aWR0aF09XCJtb2RhbERpbWVuc2lvbnMuc29ydC53aWR0aFwiXG4gICAgICBbaGVpZ2h0XT1cIm1vZGFsRGltZW5zaW9ucy5zb3J0LmhlaWdodFwiXG4gICAgICBbbWF4aW1pemFibGVdPVwiZmFsc2VcIlxuICAgICAgW2Zvb3RlckJ1dHRvbnNdPVwiW11cIlxuICAgICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fc29ydC1tb2RhbFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZmllbGRcbiAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZC0tZnVsbFxuICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NvcnQtZGlyZWN0aW9uLWZpZWxkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1sYWJlbFwiPlxuICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmRpcmVjdGlvbicpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNkYy1zZWxlY3QtYnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zb3J0LWRpcmVjdGlvblwiXG4gICAgICAgICAgICBbaXRlbXNdPVwic29ydERpcmVjdGlvbkl0ZW1zXCJcbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzb2Z0XCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkU29ydERpcmVjdGlvbkl0ZW1zXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU29ydERpcmVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9zZGMtc2VsZWN0LWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1jYXJkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1jYXJkLS1zZWN0aW9uXG4gICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtcGlja2VyIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXItLXN0cmV0Y2hcbiAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tZmxvdyBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGxcbiAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdGFnZS1ib2R5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPHNkYy1waWNrbGlzdFxuICAgICAgICAgICAgW2l0ZW1zXT1cInNvcnRQaWNrbGlzdEl0ZW1zXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZElkc109XCJzb3J0U2VsZWN0ZWRQaWNrbGlzdElkc1wiXG4gICAgICAgICAgICBpZEtleT1cImlkXCJcbiAgICAgICAgICAgIHRpdGxlS2V5PVwidGl0bGVcIlxuICAgICAgICAgICAgdGl0bGVQcmVmaXhLZXk9XCJ0aXRsZVByZWZpeFwiXG4gICAgICAgICAgICB0aXRsZVN1ZmZpeEtleT1cInRpdGxlU3VmZml4XCJcbiAgICAgICAgICAgIHRpdGxlUHJlZml4Q29sb3JLZXk9XCJ0aXRsZVByZWZpeENvbG9yXCJcbiAgICAgICAgICAgIHRpdGxlU3VmZml4Q29sb3JLZXk9XCJ0aXRsZVN1ZmZpeENvbG9yXCJcbiAgICAgICAgICAgIGJhZGdlS2V5PVwiYmFkZ2VcIlxuICAgICAgICAgICAgYmFkZ2VDb2xvcktleT1cImJhZGdlQ29sb3JcIlxuICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW3Nob3dJdGVtSWNvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICBbc2hvd1NlbGVjdGlvbkNvdW50ZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW21heFZpc2libGVTZWxlY3RlZEl0ZW1zXT1cIjFcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgICAoc2VsZWN0ZWRJZHNDaGFuZ2UpPVwib25Tb3J0U2VsZWN0ZWRJZHNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvc2RjLXBpY2tsaXN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBmb290ZXIgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyXCI+XG4gICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2FuY2VsJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHByaW9yaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2VTb3J0TW9kYWwoKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2xvc2VTb3J0TW9kYWwoKVwiXG4gICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2F2ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhblNhdmVTb3J0XCJcbiAgICAgICAgICAoY2xpY2spPVwic2F2ZVNvcnQoKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2F2ZVNvcnQoKVwiXG4gICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L3NkYy1tb2RhbD5cbiAgfVxuXG4gIEBpZiAoZmlsdGVyTW9kYWxWaXNpYmxlKSB7XG4gICAgPHNkYy1tb2RhbFxuICAgICAgW3Zpc2libGVdPVwiZmlsdGVyTW9kYWxWaXNpYmxlXCJcbiAgICAgICh2aXNpYmxlQ2hhbmdlKT1cIiRldmVudCA/IChmaWx0ZXJNb2RhbFZpc2libGUgPSB0cnVlKSA6IGNsb3NlRmlsdGVyTW9kYWwoKVwiXG4gICAgICBbaGVhZGVyXT1cImZpbHRlck1vZGFsVGl0bGVcIlxuICAgICAgW3dpZHRoXT1cIm1vZGFsRGltZW5zaW9ucy5maWx0ZXIud2lkdGhcIlxuICAgICAgW2hlaWdodF09XCJtb2RhbERpbWVuc2lvbnMuZmlsdGVyLmhlaWdodFwiXG4gICAgICBbbWF4aW1pemFibGVdPVwiZmFsc2VcIlxuICAgICAgW2Zvb3RlckJ1dHRvbnNdPVwiW11cIlxuICAgICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLW1vZGFsXCI+XG4gICAgICAgIDxzZGMtdGltZWxpbmVcbiAgICAgICAgICBbaXRlbXNdPVwiZmlsdGVyTW9kYWxUaW1lbGluZUl0ZW1zXCJcbiAgICAgICAgICBbYWN0aXZlSW5kZXhdPVwiZmlsdGVyTW9kYWxSZXZpZXdTdGVwQWN0aXZlID8gMiA6IChmaWx0ZXJNb2RhbENvbmZpZ3VyYXRpb25TdGVwQWN0aXZlID8gMSA6IDApXCJcbiAgICAgICAgICBbaW50ZXJhY3RpdmVdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Nob3dEZXNjcmlwdGlvbnNdPVwiZmFsc2VcIlxuICAgICAgICAgIFthcmlhTGFiZWxdPVwiZmlsdGVyTW9kYWxUaW1lbGluZUFyaWFMYWJlbFwiXG4gICAgICAgICAgKHN0ZXBTZWxlY3QpPVwib25GaWx0ZXJNb2RhbFRpbWVsaW5lU3RlcFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgPjwvc2RjLXRpbWVsaW5lPlxuICAgICAgICBAaWYgKGZpbHRlck1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLXN0ZXBcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItYmFzZS1zZWxlY3RvclwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtcGFuZWwtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLm1vZGFscy5maWx0ZXIuc3RlcHMuc2VsZWN0LnRpdGxlJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c2RjLWluZm8tc2lnblxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWx0ZXJzLnRvb2x0aXBzLm1vZGUnXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICA+PC9zZGMtaW5mby1zaWduPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItbW9kZS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1tb2RlLWNvcHlcIj5cbiAgICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLm1vZGFscy5maWx0ZXIudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItbW9kZS1zZWxlY3RvclwiPlxuICAgICAgICAgICAgICAgIDxzZGMtc2VsZWN0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpbHRlck1vZGVJdGVtc1wiXG4gICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwic29mdFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZEZpbHRlck1vZGVJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpbHRlck1vZGVDaGFuZ2UoJGV2ZW50WzBdPy52YWx1ZSB8fCAnY29uZGl0aW9uJylcIlxuICAgICAgICAgICAgICAgID48L3NkYy1zZWxlY3QtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmIChmaWx0ZXJNb2RhbE1vZGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXJcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXItLWZpbHRlclxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXBpY2tlci0tc3RyZXRjaFxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1mbG93XG4gICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3RhZ2UtYm9keVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3BpY2tsaXN0LXNoZWxsXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzZGMtcGlja2xpc3RcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpbHRlck1vZGFsUGlja2xpc3RJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZElkc109XCJmaWx0ZXJNb2RhbFNlbGVjdGVkUGlja2xpc3RJZHNcIlxuICAgICAgICAgICAgICAgICAgICBpZEtleT1cImlkXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVLZXk9XCJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlUHJlZml4S2V5PVwidGl0bGVQcmVmaXhcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZVN1ZmZpeEtleT1cInRpdGxlU3VmZml4XCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVQcmVmaXhDb2xvcktleT1cInRpdGxlUHJlZml4Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZVN1ZmZpeENvbG9yS2V5PVwidGl0bGVTdWZmaXhDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIGJhZGdlS2V5PVwiYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgICBiYWRnZUNvbG9yS2V5PVwiYmFkZ2VDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIFthdXRvUmVzaXplXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0l0ZW1JY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db3VudGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW21heFZpc2libGVTZWxlY3RlZEl0ZW1zXT1cIjFcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tb2RhbHMuc2VhcmNoUGxhY2Vob2xkZXInXCJcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uRmlsdGVyTW9kYWxTZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgID48L3NkYy1waWNrbGlzdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItZG9tYWluLWludHJvXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1wYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWx0ZXJzLmRvbWFpbkxhYmVsJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNkYy1pbmZvLXNpZ25cbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiZmlsdGVyRG9tYWluRXhwcmVzc2lvblRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIidsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICA+PC9zZGMtaW5mby1zaWduPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLWRvbWFpbi1ncmlkXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1kb21haW4taXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMuZG9tYWluRXhwcmVzc2lvbicpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJEb21haW5FeHByZXNzaW9uVG9vbHRpcCB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItZG9tYWluLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmNvbm5lY3RvcicpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJDb25uZWN0b3JUb29sdGlwIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICBAaWYgKGZpbHRlck1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLXN0ZXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItdG9vbGJhclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeSBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS0tZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLmZpbHRlci5zdGVwcy5jb25maWd1cmUudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS12YWx1ZS0tcGF0aFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyQ29uZmlndXJhdGlvblN1bW1hcnlMYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGlua1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub0ZpbHRlck1vZGFsU3RlcCgnc2VsZWN0JylcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgZmlsdGVyQmFja1RvU2VsZWN0aW9uTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIEBpZiAoZmlsdGVyTW9kYWxNb2RlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZpZWxkXG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZC0tc3RyZXRjaFxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZFxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLWNvbmZpZy1jYXJkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLWNvbmZpZy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXBhbmVsLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tb2RhbHMuZmlsdGVyLnN0ZXBzLmNvbmZpZ3VyZS50aXRsZScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPHNkYy1pbmZvLXNpZ25cbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmlsdGVycy50b29sdGlwcy5jb25maWd1cmUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaW5mby1zaWduPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkLS1maWx0ZXItY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNvbWJvYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMuY29ubmVjdG9yJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5jb25uZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyRHJhZnQuY29ubmVjdG9yID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpbHRlckNvbm5lY3Rvck9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FwcGVuZFRvXT1cIm92ZXJsYXlBcHBlbmRUYXJnZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJvdmVybGF5WkluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJDb25uZWN0b3JEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5mb1Rvb2x0aXBdPVwiZmlsdGVyQ29ubmVjdG9yVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jb21ib2JveD5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNvbWJvYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMub3BlcmF0b3InXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckRyYWZ0Lm9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0Lm9wZXJhdG9yID0gJGV2ZW50OyBvbkZpbHRlck9wZXJhdG9yQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZmlsdGVyT3BlcmF0b3JPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlbmRUb109XCJvdmVybGF5QXBwZW5kVGFyZ2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwib3ZlcmxheVpJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWx0ZXJEcmFmdC5jb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZm9Ub29sdGlwXT1cImZpbHRlck9wZXJhdG9yVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNvbWJvYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtY29tYm9ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy52YWx1ZVR5cGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckRyYWZ0LnZhbHVlVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC52YWx1ZVR5cGUgPSAkZXZlbnQ7IG9uRmlsdGVyVmFsdWVUeXBlQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwidmFsdWVUeXBlT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwib3ZlcmxheUFwcGVuZFRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4XT1cIm92ZXJsYXlaSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclZhbHVlVHlwZURpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmZvVG9vbHRpcF09XCJmaWx0ZXJWYWx1ZVR5cGVUb29sdGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNvbWJvYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLW9wdGlvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLnN0YXRlcy5vcHRpb25hbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5vcHRpb25hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0Lm9wdGlvbmFsID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtaW5mby1zaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cImZpbHRlck9wdGlvbmFsVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pbmZvLXNpZ24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1jb25maWctc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItY29uZmlnLXNlY3Rpb24tLXZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWdyaWQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWdyaWQtLXNpbmdsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd0ZpbHRlckJvb2xlYW5Db21ib2JveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1jb21ib2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMudmFsdWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyRHJhZnQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC52YWx1ZSA9ICRldmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImJvb2xlYW5WYWx1ZU9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwib3ZlcmxheUFwcGVuZFRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwib3ZlcmxheVpJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtY29tYm9ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd0ZpbHRlclZhbHVlVGV4dGJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10ZXh0Ym94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy52YWx1ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0LnZhbHVlID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10ZXh0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dGaWx0ZXJWYWx1ZXNUZXh0Ym94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLnZhbHVlcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC52YWx1ZXNUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyRHJhZnQudmFsdWVzVGV4dCA9ICRldmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93RmlsdGVyQmV0d2VlbklucHV0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19iZXR3ZWVuIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkLWNvbHVtbi1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGV4dGJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy52YWx1ZVN0YXJ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyRHJhZnQuYmV0d2VlblN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC5iZXR3ZWVuU3RhcnQgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10ZXh0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMudmFsdWVFbmQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5iZXR3ZWVuRW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC5iZXR3ZWVuRW5kID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dGaWx0ZXJQYXJhbWV0ZXJUZXh0Ym94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLnBhcmFtZXRlck5hbWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyRHJhZnQucGFyYW1ldGVyTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWUgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRleHRib3g+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZFxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZmllbGQtLXN0cmV0Y2hcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmRcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1jb25maWctY2FyZFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1jb25maWctc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWdyaWQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWdyaWQtLWZpbHRlci1jb250cm9sc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtY29tYm9ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy5jb25uZWN0b3InXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckRyYWZ0LmNvbm5lY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC5jb25uZWN0b3IgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZmlsdGVyQ29ubmVjdG9yT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwib3ZlcmxheUFwcGVuZFRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4XT1cIm92ZXJsYXlaSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlckNvbm5lY3RvckRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmZvVG9vbHRpcF09XCJmaWx0ZXJDb25uZWN0b3JUb29sdGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNvbWJvYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLW9wdGlvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLnN0YXRlcy5vcHRpb25hbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5vcHRpb25hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0Lm9wdGlvbmFsID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtaW5mby1zaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cImZpbHRlck9wdGlvbmFsVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pbmZvLXNpZ24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1jb25maWctc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItY29uZmlnLXNlY3Rpb24tLWRvbWFpblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtcGFuZWwtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy5kb21haW5FeHByZXNzaW9uJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLWluZm8tc2lnblxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiZmlsdGVyRG9tYWluRXhwcmVzc2lvblRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCInbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pbmZvLXNpZ24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1kb21haW4taGludFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlckRvbWFpbkV4cHJlc3Npb25Ub29sdGlwIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItc3RlcFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci10b29sYmFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5IGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LS1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tb2RhbHMuZmlsdGVyLnN0ZXBzLnJldmlldy50aXRsZScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS12YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LXZhbHVlLS1wYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJDb25maWd1cmF0aW9uU3VtbWFyeUxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvRmlsdGVyTW9kYWxTdGVwKCdjb25maWd1cmUnKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJCYWNrVG9Db25maWd1cmF0aW9uTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZFxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZpZWxkLS1zdHJldGNoXG4gICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZFxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItY29uZmlnLWNhcmRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1yZXZpZXctZ3JpZFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBmaWx0ZXJSZXZpZXdJdGVtczsgdHJhY2sgdHJhY2tCeUlkKCRpbmRleCwgaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1yZXZpZXctaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LXZhbHVlLS1wYXRoXT1cIml0ZW0uZW1waGFzaXplID09PSAncGF0aCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItcmV2aWV3LWNvZGVdPVwiaXRlbS5lbXBoYXNpemUgPT09ICdjb2RlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLXJldmlldy1wcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLnNxbFByZXZpZXcnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c2RjLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlclJldmlld1ByZXZpZXdMYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjZcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgZm9vdGVyIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZvb3RlclwiPlxuICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgIFtsYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNhbmNlbCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBwcmlvcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsb3NlRmlsdGVyTW9kYWwoKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2xvc2VGaWx0ZXJNb2RhbCgpXCJcbiAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgQGlmIChmaWx0ZXJNb2RhbFNlbGVjdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cImZpbHRlck1vZGFsQ29uZmlndXJlQWN0aW9uTGFiZWxcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWx0ZXJNb2RhbENhblByb2NlZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VGaWx0ZXJNb2RhbFN0ZXAoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJhZHZhbmNlRmlsdGVyTW9kYWxTdGVwKClcIlxuICAgICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChmaWx0ZXJNb2RhbENvbmZpZ3VyYXRpb25TdGVwQWN0aXZlKSB7XG4gICAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICAgIFtsYWJlbF09XCJmaWx0ZXJNb2RhbFJldmlld0FjdGlvbkxhYmVsXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZmlsdGVyTW9kYWxDYW5SZXZpZXdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VGaWx0ZXJNb2RhbFN0ZXAoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJhZHZhbmNlRmlsdGVyTW9kYWxTdGVwKClcIlxuICAgICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChmaWx0ZXJNb2RhbFJldmlld1N0ZXBBY3RpdmUpIHtcbiAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2F2ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuU2F2ZUZpbHRlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2F2ZUZpbHRlcigpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNhdmVGaWx0ZXIoKVwiXG4gICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9zZGMtbW9kYWw+XG4gIH1cblxuICBAaWYgKGZpZWxkTW9kYWxWaXNpYmxlKSB7XG4gICAgPHNkYy1tb2RhbFxuICAgICAgW3Zpc2libGVdPVwiZmllbGRNb2RhbFZpc2libGVcIlxuICAgICAgKHZpc2libGVDaGFuZ2UpPVwiJGV2ZW50ID8gKGZpZWxkTW9kYWxWaXNpYmxlID0gdHJ1ZSkgOiBjbG9zZUZpZWxkTW9kYWwoKVwiXG4gICAgICBbaGVhZGVyXT1cImZpZWxkTW9kYWxUaXRsZVwiXG4gICAgICBbd2lkdGhdPVwibW9kYWxEaW1lbnNpb25zLmZpZWxkLndpZHRoXCJcbiAgICAgIFtoZWlnaHRdPVwibW9kYWxEaW1lbnNpb25zLmZpZWxkLmhlaWdodFwiXG4gICAgICBbbWF4aW1pemFibGVdPVwiZmFsc2VcIlxuICAgICAgW2Zvb3RlckJ1dHRvbnNdPVwiW11cIlxuICAgICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fZmllbGQtbW9kYWxcIj5cbiAgICAgICAgPHNkYy10aW1lbGluZVxuICAgICAgICAgIFtpdGVtc109XCJmaWVsZE1vZGFsVGltZWxpbmVJdGVtc1wiXG4gICAgICAgICAgW2FjdGl2ZUluZGV4XT1cImZpZWxkTW9kYWxDb25maWd1cmF0aW9uU3RlcEFjdGl2ZSA/IDEgOiAwXCJcbiAgICAgICAgICBbaW50ZXJhY3RpdmVdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Nob3dEZXNjcmlwdGlvbnNdPVwiZmFsc2VcIlxuICAgICAgICAgIFthcmlhTGFiZWxdPVwiZmllbGRNb2RhbFRpbWVsaW5lQXJpYUxhYmVsXCJcbiAgICAgICAgICAoc3RlcFNlbGVjdCk9XCJvbkZpZWxkTW9kYWxUaW1lbGluZVN0ZXBTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgID48L3NkYy10aW1lbGluZT5cbiAgICAgICAgQGlmIChmaWVsZE1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXNoZWxsIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbC0tZnVsbFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWZsb3cgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN0YWdlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19waWNrbGlzdC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3RhZ2UtYm9keVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNkYy1waWNrbGlzdFxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZE1vZGFsUGlja2xpc3RJdGVtc1wiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkSWRzXT1cImZpZWxkTW9kYWxTZWxlY3RlZFBpY2tsaXN0SWRzXCJcbiAgICAgICAgICAgICAgICBpZEtleT1cImlkXCJcbiAgICAgICAgICAgICAgICB0aXRsZUtleT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICB0aXRsZVByZWZpeEtleT1cInRpdGxlUHJlZml4XCJcbiAgICAgICAgICAgICAgICB0aXRsZVN1ZmZpeEtleT1cInRpdGxlU3VmZml4XCJcbiAgICAgICAgICAgICAgICB0aXRsZVByZWZpeENvbG9yS2V5PVwidGl0bGVQcmVmaXhDb2xvclwiXG4gICAgICAgICAgICAgICAgdGl0bGVTdWZmaXhDb2xvcktleT1cInRpdGxlU3VmZml4Q29sb3JcIlxuICAgICAgICAgICAgICAgIGJhZGdlS2V5PVwiYmFkZ2VcIlxuICAgICAgICAgICAgICAgIGJhZGdlQ29sb3JLZXk9XCJiYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgICBbYXV0b1Jlc2l6ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtzaG93SXRlbUljb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtzaG93U2VsZWN0aW9uQ291bnRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uRmllbGRNb2RhbFNlbGVjdGVkSWRzQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICA+PC9zZGMtcGlja2xpc3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZmllbGQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZpZWxkLS1zdHJldGNoXG4gICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctc2hlbGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctdG9vbGJhclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpZWxkLWNvbmZpZy1zdW1tYXJ5XCI+XG4gICAgICAgICAgICAgICAge3sgZmllbGRNb2RhbENvbmZpZ3VyZWRJdGVtcy5sZW5ndGggfX1cbiAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5jYXJkcy5maWVsZHMudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChmaWVsZE1vZGFsSGFzU2VsZWN0YWJsZUNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQW5vdGhlckZpZWxkRnJvbU1vZGFsKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RDb2x1bW5zJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtbGlzdC1zaGVsbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctbGlzdFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZmllbGRNb2RhbENvbmZpZ3VyZWRJdGVtczsgdHJhY2sgdHJhY2tCeUlkKCRpbmRleCwgaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmllbGQtY29uZmlnLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpZWxkLWNvbmZpZy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi10YWJsZS1sYWJlbFwiPnt7IGl0ZW0udGFibGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1zZXBhcmF0b3JcIj4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWFjY2VudFwiPnt7IGl0ZW0uZmllbGRMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uZnVuY3Rpb25OYW1lICYmICFpc0ZpZWxkRnVuY3Rpb25FZGl0aW5nKGl0ZW0uY29sdW1uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctZnVuY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwLS1vcGVyYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZnVuY3Rpb25MYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5mdW5jdGlvbkFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZnVuY3Rpb25BbGlhcyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICghaXNGaWVsZEZ1bmN0aW9uRWRpdGluZyhpdGVtLmNvbHVtbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpZWxkLWNvbmZpZy1jb250cm9sc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10ZXh0Ym94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy5hbGlhcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpdGVtLmFsaWFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25GaWVsZE1vZGFsQWxpYXNDaGFuZ2UoaXRlbS5jb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10ZXh0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWxhYmVsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMud2lkdGgnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWluZm8tc2lnblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tZXNzYWdlcy5maWVsZFdpZHRoSW5mbydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pbmZvLXNpZ24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIml0ZW0ud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRmllbGRNb2RhbFdpZHRoQ2hhbmdlKGl0ZW0uY29sdW1uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhsZW5ndGhdPVwiMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRleHRib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN0YXJ0RmllbGRGdW5jdGlvbkVkaXQoaXRlbS5jb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmZ1bmN0aW9uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY29uZmlndXJlRmllbGQnKSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMuZnVuY3Rpb25OYW1lJykgfCB0cmFuc2xhdGUpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWVsZE1vZGFsRHJhZnQoaXRlbS5jb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctY29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpZWxkLWNvbmZpZy1jb250cm9scy0tZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1jb21ib2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMuZnVuY3Rpb25OYW1lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbk5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpZWxkRnVuY3Rpb25EcmFmdE5hbWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpZWxkTW9kYWxGdW5jdGlvbk9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwib3ZlcmxheUFwcGVuZFRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwib3ZlcmxheVpJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtY29tYm9ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmFsaWFzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbkFsaWFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uQWxpYXMgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWVsZEZ1bmN0aW9uRHJhZnQuZnVuY3Rpb25OYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10ZXh0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24tLWRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNhbmNlbCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNhbmNlbCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbEZpZWxkRnVuY3Rpb25FZGl0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19pY29uLWFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19pY29uLWFjdGlvbi0tYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2F2ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNhdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlRmllbGRGdW5jdGlvbkVkaXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hlY2tcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgZm9vdGVyIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZvb3RlciBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyLS1iZXR3ZWVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyLWdyb3VwIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1mb290ZXItZ3JvdXAtLXN0YXJ0XCI+XG4gICAgICAgICAgQGlmIChmaWVsZE1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSAmJiBmaWVsZE1vZGFsQ2FuU2VsZWN0QWxsKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLXByaW1hcnlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QWxsRmllbGRNb2RhbENvbHVtbnMoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RBbGxDb2x1bW5zJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyLWdyb3VwXCI+XG4gICAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICAgIFtsYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNhbmNlbCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIHByaW9yaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbG9zZUZpZWxkTW9kYWwoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjbG9zZUZpZWxkTW9kYWwoKVwiXG4gICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgICBAaWYgKGZpZWxkTW9kYWxTZWxlY3Rpb25TdGVwQWN0aXZlICYmIGZpZWxkTW9kYWxDYW5Qcm9jZWVkKSB7XG4gICAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5uZXh0U3RlcCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VGaWVsZE1vZGFsU3RlcCgpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWR2YW5jZUZpZWxkTW9kYWxTdGVwKClcIlxuICAgICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChmaWVsZE1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgICAgIFtsYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNhdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuU2F2ZUZpZWxkTW9kYWxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZUZpZWxkKClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlRmllbGQoKVwiXG4gICAgICAgICAgICA+PC9zZGMtYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3NkYy1tb2RhbD5cbiAgfVxuXG4gIDxkaXZcbiAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX193b3Jrc3BhY2VcIlxuICAgIFtjbGFzcy5keW5hbWljLXZpZXctYnVpbGRlcl9fd29ya3NwYWNlLS1zdGFja2VkXT1cImxheW91dE1vZGUgPT09ICdzdGFja2VkJ1wiXG4gICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX193b3Jrc3BhY2UtLXNwbGl0XT1cImxheW91dE1vZGUgPT09ICdzcGxpdCdcIlxuICAgIFtjbGFzcy5keW5hbWljLXZpZXctYnVpbGRlcl9fd29ya3NwYWNlLS1wcmV2aWV3LWhpZGRlbl09XCIhcHJldmlld1Zpc2libGVcIlxuICAgID5cbiAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2J1aWxkZXItYXJlYVwiPlxuICAgICAgPGRpdlxuICAgICAgICAjc2VjdGlvbnNDb250YWluZXJcbiAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbnNcIlxuICAgICAgICBbY2xhc3MuZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb25zLS1zdGFja2VkXT1cImxheW91dE1vZGUgPT09ICdzdGFja2VkJ1wiXG4gICAgICAgIFtjbGFzcy5keW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbnMtLXNwbGl0XT1cImxheW91dE1vZGUgPT09ICdzcGxpdCdcIlxuICAgICAgICA+XG4gICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgI2J1aWxkZXJTZWN0aW9uXG4gICAgICAgICAgZGF0YS1zZWN0aW9uLWlkPVwidGFibGVzXCJcbiAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1sYWJlbFwiPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5jYXJkcy5zb3VyY2VzLnRpdGxlJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXG4gICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLXByaW1hcnlcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0taWNvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdFRhYmxlcycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2VsZWN0VGFibGVzJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuU291cmNlTW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmsgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSB8fCAhY2FuT3BlblNvdXJjZUNvbmZpZ3VyYXRpb25cIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNvbmZpZ3VyZUFsaWFzZXMnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNvbmZpZ3VyZUFsaWFzZXMnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Tb3VyY2VDb25maWd1cmF0aW9uTW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5IHx8ICFzb3VyY2VJdGVtcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNsZWFyJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTb3VyY2VzKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaC1hbHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICghc291cmNlSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19lbXB0eS1yb3dcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdFRhYmxlcycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdFRhYmxlcycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Tb3VyY2VNb2RhbCgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdFRhYmxlcycpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChzb3VyY2VJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc3RhY2sgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3N0YWNrLS13cmFwXCI+XG4gICAgICAgICAgICAgIEBmb3IgKHNvdXJjZSBvZiBzb3VyY2VJdGVtczsgdHJhY2sgdHJhY2tCeUlkKGksIHNvdXJjZSk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93IGR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctLXNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy10YWJsZS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1kYlwiPnt7IHNvdXJjZS5kYkxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1kb3RcIj4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy10YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc291cmNlLnRhYmxlTGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzb3VyY2UuYWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctbWV0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXMge3sgc291cmNlLmFsaWFzIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uIGR5bmFtaWMtdmlldy1idWlsZGVyX19pY29uLWFjdGlvbi0tZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMucmVtb3ZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVNvdXJjZShpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tcm93XCI+XG4gICAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICAgICNidWlsZGVyU2VjdGlvblxuICAgICAgICAgICAgZGF0YS1zZWN0aW9uLWlkPVwiam9pbnNcIlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbiBkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi0tZmx1aWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuY2FyZHMuam9pbnMudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0tcHJpbWFyeVxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWNhbkNvbmZpZ3VyZUpvaW5zXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmFkZEpvaW4nKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkSm9pbicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSm9pbk1vZGFsKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGx1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0taWNvblwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSB8fCAham9pbkl0ZW1zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckpvaW5zKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2gtYWx0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmICghY2FuQ29uZmlndXJlSm9pbnMpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19pbmZvLXJvd1wiPlxuICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLm1lc3NhZ2VzLmpvaW5SZXF1aXJlc1R3b1RhYmxlcycpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChjYW5Db25maWd1cmVKb2lucyAmJiAham9pbkl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZW1wdHktcm93XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkSm9pbicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkSm9pbicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkpvaW5Nb2RhbCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5hZGRKb2luJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGpvaW5JdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjayBkeW5hbWljLXZpZXctYnVpbGRlcl9fc3RhY2stLXdyYXBcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGpvaW5JdGVtczsgdHJhY2sgdHJhY2tCeUlkKGksIGl0ZW0pOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3dcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctcGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXRhYmxlXCI+e3sgaXRlbS5zb3VyY2VUYWJsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1kb3RcIj4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWZpZWxkXCI+e3sgaXRlbS5zb3VyY2VGaWVsZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fam9pbi1vcGVyYXRvclwiPnt7IGl0ZW0ub3BlcmF0b3IgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fam9pbi1hcnJvd1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtbG9uZy1hcnJvdy1hbHQtcmlnaHRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1wYXRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctdGFibGVcIj57eyBpdGVtLnRhcmdldFRhYmxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWRvdFwiPi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZmllbGRcIj57eyBpdGVtLnRhcmdldEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmVkaXQnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuZWRpdCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSm9pbk1vZGFsKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBlblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uIGR5bmFtaWMtdmlldy1idWlsZGVyX19pY29uLWFjdGlvbi0tZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlSm9pbihpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICAgI2J1aWxkZXJTZWN0aW9uXG4gICAgICAgICAgICBkYXRhLXNlY3Rpb24taWQ9XCJncm91cEJ5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tLWNvbXBhY3RcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmNhcmRzLmdyb3VwQnkudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0tcHJpbWFyeVxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWdyb3VwQnlTZWxlY3RhYmxlQ29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2VsZWN0Q29sdW1ucycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RDb2x1bW5zJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TZWxlY3Rpb25Nb2RhbCgnZ3JvdXBCeScpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWdyb3VwQnlJdGVtcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2xlYXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2xlYXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJHcm91cEJ5KClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2gtYWx0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmICghZ3JvdXBCeUl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZW1wdHktcm93XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TZWxlY3Rpb25Nb2RhbCgnZ3JvdXBCeScpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RDb2x1bW5zJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGdyb3VwQnlJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjayBkeW5hbWljLXZpZXctYnVpbGRlcl9fc3RhY2stLXdyYXBcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGdyb3VwQnlJdGVtczsgdHJhY2sgdHJhY2tCeUlkKGksIGl0ZW0pOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3dcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctcGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXRhYmxlXCI+e3sgaXRlbS50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWRvdFwiPi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZmllbGRcIj57eyBpdGVtLmZpZWxkTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMucmVtb3ZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVHcm91cEJ5KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgI2J1aWxkZXJTZWN0aW9uXG4gICAgICAgICAgZGF0YS1zZWN0aW9uLWlkPVwiZmllbGRzXCJcbiAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmNhcmRzLmZpZWxkcy50aXRsZScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8c2RjLWluZm8tc2lnblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2hpbnRcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidWb2PDqiBwb2RlIG9yZGVuYXIgYSBzZXF1w6puY2lhIGRvcyBjYW1wb3MgYXJyYXN0YW5kbyBlIHNvbHRhbmRvLidcIlxuICAgICAgICAgICAgICA+PC9zZGMtaW5mby1zaWduPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmtcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0tcHJpbWFyeVxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSB8fCAhZmllbGRTZWxlY3RhYmxlQ29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdENvbHVtbnMnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdENvbHVtbnMnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GaWVsZE1vZGFsKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0taWNvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWNhbk9wZW5GaWVsZENvbmZpZ3VyYXRpb25cIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNvbmZpZ3VyZUZpZWxkJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jb25maWd1cmVGaWVsZCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZpZWxkQ29uZmlndXJhdGlvbk1vZGFsKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmsgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSB8fCAhZmllbGRJdGVtcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNsZWFyJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWVsZHMoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRyYXNoLWFsdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKCFmaWVsZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZW1wdHktcm93XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZpZWxkTW9kYWwoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RDb2x1bW5zJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGZpZWxkSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3N0YWNrIGR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjay0td3JhcFwiPlxuICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGZpZWxkSXRlbXM7IHRyYWNrIHRyYWNrQnlJZChpLCBpdGVtKTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBAaWYgKGlzRmllbGREcm9wSW5kaWNhdG9yVmlzaWJsZShpKSkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1kcm9wLWluZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3JvdyBkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LS1kcmFnZ2FibGVcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctLWRyYWctb3JpZ2luXT1cImRyYWdnaW5nRmllbGRJbmRleCA9PT0gaXRlbS5zb3VyY2VJbmRleFwiXG4gICAgICAgICAgICAgICAgICBbZHJhZ2dhYmxlXT1cIiFpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgIChkcmFnc3RhcnQpPVwib25GaWVsZERyYWdTdGFydChpdGVtLnNvdXJjZUluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAoZHJhZ292ZXIpPVwib25GaWVsZERyYWdPdmVyKCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgICAgKGRyb3ApPVwib25GaWVsZERyb3AoKVwiXG4gICAgICAgICAgICAgICAgICAoZHJhZ2VuZCk9XCJvbkZpZWxkRHJhZ0VuZCgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW9yZGVyXCI+e3sgaXRlbS5vcmRlckxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctcGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy10YWJsZVwiPnt7IGl0ZW0udGFibGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZG90XCI+Ljwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZmllbGRcIj57eyBpdGVtLmZpZWxkTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzIHt7IGl0ZW0uYWxpYXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ud2lkdGggfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmZ1bmN0aW9uTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwIGR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctY2hpcC0tb3BlcmF0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZnVuY3Rpb25MYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uZnVuY3Rpb25BbGlhcykge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1tZXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmZ1bmN0aW9uQWxpYXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRmllbGQoaXRlbS5zb3VyY2VJbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGlzRmllbGREcm9wSW5kaWNhdG9yQXRFbmRWaXNpYmxlKCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1kcm9wLWluZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLXJvd1wiPlxuICAgICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgICAjYnVpbGRlclNlY3Rpb25cbiAgICAgICAgICAgIGRhdGEtc2VjdGlvbi1pZD1cInNvcnRpbmdcIlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbiBkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi0tY29tcGFjdFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24taGVhZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5jYXJkcy5zb3J0aW5nLnRpdGxlJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGlua1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLXByaW1hcnlcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5IHx8ICFzb3J0U2VsZWN0YWJsZUl0ZW1zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5hZGRTb3J0JykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmFkZFNvcnQnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblNvcnRNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIXNvcnRJdGVtcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2xlYXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2xlYXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTb3J0aW5nKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2gtYWx0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmICghc29ydEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZW1wdHktcm93XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkU29ydCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkU29ydCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblNvcnRNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5hZGRTb3J0JykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKHNvcnRJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjayBkeW5hbWljLXZpZXctYnVpbGRlcl9fc3RhY2stLXdyYXBcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNvcnRJdGVtczsgdHJhY2sgdHJhY2tCeUlkKGksIGl0ZW0pOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3dcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uZnVuY3Rpb25OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctY2hpcCBkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAtLW9wZXJhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZnVuY3Rpb25MYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctcGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXRhYmxlXCI+e3sgaXRlbS50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWRvdFwiPi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZmllbGRcIj57eyBpdGVtLmZpZWxkTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwIGR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctY2hpcC0tb3BlcmF0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGlyZWN0aW9uIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuZWRpdCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5lZGl0JykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Tb3J0TW9kYWwoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGVuXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMucmVtb3ZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTb3J0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICAgICNidWlsZGVyU2VjdGlvblxuICAgICAgICAgICAgZGF0YS1zZWN0aW9uLWlkPVwiZmlsdGVyc1wiXG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uIGR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLS1mbHVpZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24taGVhZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5jYXJkcy5maWx0ZXJzLnRpdGxlJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGlua1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLXByaW1hcnlcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5IHx8ICFhdmFpbGFibGVDb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5hZGRGaWx0ZXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkRmlsdGVyJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GaWx0ZXJNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWZpbHRlckl0ZW1zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaC1hbHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKCFmaWx0ZXJJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2VtcHR5LXJvd1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmFkZEZpbHRlcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkRmlsdGVyJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRmlsdGVyTW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkRmlsdGVyJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGZpbHRlckl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3N0YWNrIGR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjay0td3JhcFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZmlsdGVySXRlbXM7IHRyYWNrIHRyYWNrQnlJZChpLCBpdGVtKTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmICghaXRlbS5pc0RvbWFpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXBhdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXRhYmxlXCI+e3sgaXRlbS50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZG90XCI+Ljwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWZpZWxkXCI+e3sgaXRlbS5maWVsZExhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAtLW9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGl0ZW0ub3BlcmF0b3JMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwLS1kb21haW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgaXRlbS50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctY2hpcCBkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAtLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnN1YnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwLS1vcHRpb25hbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5zdGF0ZXMub3B0aW9uYWwnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmVkaXQnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuZWRpdCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRmlsdGVyTW9kYWwoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGVuXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMucmVtb3ZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBmb3IgKGFycm93IG9mIGZsb3dBcnJvd3M7IHRyYWNrIHRyYWNrQnlBcnJvdygkaW5kZXgsIGFycm93KSkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2Zsb3ctYXJyb3dcIlxuICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19mbG93LWFycm93LS1yaWdodF09XCJhcnJvdy5kaXJlY3Rpb24gPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19mbG93LWFycm93LS1kb3duXT1cImFycm93LmRpcmVjdGlvbiA9PT0gJ2Rvd24nXCJcbiAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImFycm93LmxlZnRcIlxuICAgICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJhcnJvdy50b3BcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIFtjbGFzc109XCJhcnJvdy5kaXJlY3Rpb24gPT09ICdyaWdodCdcbiAgICAgICAgICAgICAgICA/ICdmYXMgZmEtYW5nbGUtZG91YmxlLXJpZ2h0J1xuICAgICAgICAgICAgICAgIDogJ2ZhcyBmYS1hbmdsZS1kb3VibGUtZG93bidcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKHByZXZpZXdWaXNpYmxlKSB7XG4gICAgICA8YXNpZGUgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcHJldmlldy1hcmVhXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19wcmV2aWV3XCJcbiAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cInNxbFByZXZpZXdQYW5lbEhlaWdodFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcHJldmlldy1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcHJldmlldy10aXRsZVwiPlNRTCBQcmV2aWV3PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3ByZXZpZXctc3VidGl0bGVcIj5cbiAgICAgICAgICAgICAgQ29uc3VsdGEgZ2VyYWRhIGF1dG9tYXRpY2FtZW50ZSBhIHBhcnRpciBkYSBjb25maWd1cmFjYW8gYXR1YWwuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3ByZXZpZXctYm9keVwiPlxuICAgICAgICAgICAgPHNkYy1jb2RlLWVkaXRvclxuICAgICAgICAgICAgICBbc3FsXT1cInNxbFByZXZpZXdcIlxuICAgICAgICAgICAgICBsYW5ndWFnZT1cInNxbFwiXG4gICAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3Nob3dDb3B5XT1cInRydWVcIlxuICAgICAgICAgICAgICBbaGVpZ2h0XT1cInNxbFByZXZpZXdIZWlnaHRcIlxuICAgICAgICAgICAgPjwvc2RjLWNvZGUtZWRpdG9yPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYXNpZGU+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
2352
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy92aXN1YWwtc3FsLWVkaXRvci92aXN1YWwtc3FsLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3Zpc3VhbC1zcWwtZWRpdG9yL3Zpc3VhbC1zcWwtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMxRyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQW9CL0YsT0FBTyxFQUNMLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsOEJBQThCLEVBQzlCLDZCQUE2QixFQUM3QixzQkFBc0IsRUFDdEIsd0JBQXdCLEVBQ3hCLDZCQUE2QixFQUM3QixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLHdCQUF3QixHQUN6QixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFB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RSxJQUFJLE1BQU0sRUFBRSxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBQ0QsNkJBQTZCLENBQUMsR0FBYTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO1lBQ3pCLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQztRQUV6RixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxJQUFJLE1BQU0sRUFBRSxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsTUFBYztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVk7WUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsRSxDQUFDO0lBQ0QsNkJBQTZCLENBQUMsR0FBYTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFD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RSx3QkFBd0IsSUFBSSwyQkFBMkIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgaW5qZWN0LFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQgeyBEWU5BTUlDX1ZJRVdfQlVJTERFUl9ERUZBVUxUX1RBQkxFX1JPV1MgfSBmcm9tIFwiLi4vLi4vY29yZS9jb25zdGFudHMvZHluYW1pYy12aWV3LWJ1aWxkZXIuY29uc3RcIjtcbmltcG9ydCB7IGNyZWF0ZUR5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyB9IGZyb20gXCIuLi8uLi9jb3JlL2NvbmZpZy9keW5hbWljLXZpZXctYnVpbGRlci5jb25maWdcIjtcbmltcG9ydCB0eXBlIHsgU2VsZWN0QnV0dG9uSXRlbSB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL3NlbGVjdC1idXR0b24udHlwZVwiO1xuaW1wb3J0IHR5cGUgeyBUaW1lbGluZUl0ZW0sIFRpbWVsaW5lU3RlcFNlbGVjdEV2ZW50IH0gZnJvbSBcIi4uLy4uL2NvcmUvdHlwZXMvdGltZWxpbmUudHlwZVwiO1xuaW1wb3J0IHR5cGUge1xuICBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb24sXG4gIER5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyxcbiAgRHluYW1pY1ZpZXdCdWlsZGVyRmllbGQsXG4gIER5bmFtaWNWaWV3QnVpbGRlckZpZWxkRnVuY3Rpb24sXG4gIER5bmFtaWNWaWV3QnVpbGRlckZpbHRlcixcbiAgRHluYW1pY1ZpZXdCdWlsZGVyRnVuY3Rpb24sXG4gIER5bmFtaWNWaWV3QnVpbGRlckpvaW4sXG4gIER5bmFtaWNWaWV3QnVpbGRlck9wdGlvbixcbiAgRHluYW1pY1ZpZXdCdWlsZGVyU29ydCxcbiAgRHluYW1pY1ZpZXdCdWlsZGVyVGFibGVPcHRpb24sXG59IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL2R5bmFtaWMtdmlldy1idWlsZGVyLnR5cGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgUm93QmFzZSxcbiAgVGFibGVDb2x1bW4sXG4gIFRhYmxlT3B0aW9ucyxcbn0gZnJvbSBcIi4uLy4uL2NvcmUvdHlwZXMvdGFibGUudHlwZVwiO1xuaW1wb3J0IHtcbiAgRU1QVFlfVkFMVUUsXG4gIEVNUFRZX1NPUlRfRlVOQ1RJT04sXG4gIERFRkFVTFRfRklMVEVSX09QRVJBVE9SLFxuICBERUZBVUxUX0ZJTFRFUl9WQUxVRV9UWVBFLFxuICBGSUxURVJfTU9ERV9ET01BSU4sXG4gIE9WRVJMQVlfQVBQRU5EX1RBUkdFVCxcbiAgTU9EQUxfT1ZFUkxBWV9aX0lOREVYLFxuICBGSUVMRF9QSUNLTElTVF9ST1dTLFxuICBGSUxURVJfUElDS0xJU1RfUk9XUyxcbiAgVklTVUFMX1NRTF9UQUJMRV9DT0xPUixcbiAgVklTVUFMX1NRTF9GSUVMRF9DT0xPUixcbiAgUElDS0xJU1RfREFUQV9UWVBFX0JBREdFX0NPTE9SLFxuICBQSUNLTElTVF9GVU5DVElPTl9CQURHRV9DT0xPUixcbiAgRkFMTEJBQ0tfU0VMRUNUX1RBQkxFUyxcbiAgRkFMTEJBQ0tfRU1QVFlfU0VMRUNUSU9OLFxuICBQUkVWSUVXX1JPV1NfUEVSX1BBR0VfT1BUSU9OUyxcbiAgQUxJQVNfTUFYX0xFTkdUSCxcbiAgTUlOX1BBUlRTX0ZPUl9EQixcbiAgREJfUEFSVFNfT0ZGU0VULFxuICBNSU5fUEFSVFNfRk9SX1RBQkxFLFxuICBKT0lOX09QRVJBVE9SX0xBQkVMUyxcbiAgRFlOQU1JQ19NT0RBTF9ESU1FTlNJT05TLFxufSBmcm9tIFwiLi91dGlscy92aXN1YWwtc3FsLWVkaXRvci5jb25zdGFudHNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZSwgc2x1Z2lmeSwgZGVkdXBsaWNhdGVCeUtleSB9IGZyb20gXCIuL3V0aWxzL3Zpc3VhbC1zcWwtZWRpdG9yLXRleHQudXRpbFwiO1xuaW1wb3J0IHtcbiAgYnVpbGRHZW5lcmF0ZWRTcWwsXG4gIGJ1aWxkV2hlcmVTcWwsXG4gIGJ1aWxkR3JvdXBCeVNxbCxcbiAgYnVpbGRPcmRlckJ5U3FsLFxuICByZXNvbHZlU291cmNlU3FsLFxuICByZXNvbHZlSm9pblNxbCxcbiAgcmVzb2x2ZUNvbHVtblNxbCxcbiAgcmVzb2x2ZUZpZWxkU3FsLFxuICByZXNvbHZlRnVuY3Rpb25TcWwsXG4gIHJlc29sdmVTb3J0U3FsLFxuICByZXNvbHZlRmlsdGVyU3FsLFxuICByZXNvbHZlRmlsdGVyT3BlcmF0b3JTcWwsXG4gIHJlc29sdmVGaWx0ZXJWYWx1ZVNxbCxcbiAgcXVvdGVTcWxWYWx1ZSxcbiAgZGVjb3JhdGVMaWtlVmFsdWUsXG4gIHR5cGUgU3FsQ29udGV4dCxcbn0gZnJvbSBcIi4vdXRpbHMvdmlzdWFsLXNxbC1lZGl0b3Itc3FsLnV0aWxcIjtcbmltcG9ydCB7IGlzTnVtZXJpY1R5cGUsIGlzRGF0ZVR5cGUsIGZpbHRlck9wZXJhdG9yc0ZvckNvbHVtbiB9IGZyb20gXCIuL3V0aWxzL3Zpc3VhbC1zcWwtZWRpdG9yLXNhbml0aXplLnV0aWxcIjtcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tIFwiLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50XCI7XG5pbXBvcnQgeyBDb2RlRWRpdG9yQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvZGUtZWRpdG9yL2NvZGUtZWRpdG9yLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ29tYm9ib3hDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tYm9ib3gvY29tYm9ib3guY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJbmZvU2lnbkNvbXBvbmVudCB9IGZyb20gXCIuLi9pbmZvLXNpZ24vaW5mby1zaWduLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTW9kYWxDb21wb25lbnQgfSBmcm9tIFwiLi4vbW9kYWwvbW9kYWwuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBQaWNrbGlzdENvbXBvbmVudCB9IGZyb20gXCIuLi9waWNrbGlzdC9waWNrbGlzdC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFNlbGVjdEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9zZWxlY3QtYnV0dG9uL3NlbGVjdC1idXR0b24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBUYWJsZUNvbXBvbmVudCB9IGZyb20gXCIuLi90YWJsZS90YWJsZS5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRleHRhcmVhQ29tcG9uZW50IH0gZnJvbSBcIi4uL3RleHRhcmVhL3RleHRhcmVhLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVGV4dGJveENvbXBvbmVudCB9IGZyb20gXCIuLi90ZXh0Ym94L3RleHRib3guY29tcG9uZW50XCI7XG5pbXBvcnQgeyBUaW1lbGluZUNvbXBvbmVudCB9IGZyb20gXCIuLi90aW1lbGluZS90aW1lbGluZS5jb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHtcbiAgU2VsZWN0aW9uTW9kYWxNb2RlLFxuICBCdWlsZGVyTGF5b3V0TW9kZSxcbiAgU291cmNlTW9kYWxTdGVwLFxuICBGaWVsZE1vZGFsU3RlcCxcbiAgRmlsdGVyTW9kYWxTdGVwLFxuICBCdWlsZGVyU2VjdGlvbklkLFxuICBGaWx0ZXJNb2RhbE1vZGUsXG4gIFNlbGVjdGlvblJvdyxcbiAgU291cmNlVmlld0l0ZW0sXG4gIFNvdXJjZU1vZGFsRHJhZnQsXG4gIFNvdXJjZUNvbmZpZ3VyZWRJdGVtLFxuICBKb2luVmlld0l0ZW0sXG4gIFNpbXBsZVZpZXdJdGVtLFxuICBGaWVsZFZpZXdJdGVtLFxuICBTb3J0Vmlld0l0ZW0sXG4gIFNvcnRTZWxlY3RhYmxlSXRlbSxcbiAgRmlsdGVyVmlld0l0ZW0sXG4gIEZpbHRlclJldmlld0l0ZW0sXG4gIENvbHVtbkRpc3BsYXlQYXJ0cyxcbiAgVGFibGVEaXNwbGF5UGFydHMsXG4gIEZpZWxkTW9kYWxDb25maWd1cmVkSXRlbSxcbiAgQnVpbGRlckZsb3dBcnJvdyxcbiAgQ29sdW1uUGlja2xpc3RJdGVtLFxuICBTb3J0UGlja2xpc3RJdGVtLFxuICBUYWJsZVBpY2tsaXN0SXRlbSxcbiAgUHJldmlld0NvbHVtbkxpa2UsXG59IGZyb20gXCIuL3R5cGVzL3Zpc3VhbC1zcWwtZWRpdG9yLnR5cGVzXCI7XG5pbXBvcnQgeyBWaXN1YWxTcWxFZGl0b3JGbG93U2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL3Zpc3VhbC1zcWwtZWRpdG9yLWZsb3cuc2VydmljZVwiO1xuaW1wb3J0IHsgVmlzdWFsU3FsRWRpdG9yU3RhdGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvdmlzdWFsLXNxbC1lZGl0b3Itc3RhdGUuc2VydmljZVwiO1xuaW1wb3J0IHsgVmlzdWFsU3FsRWRpdG9yU291cmNlTW9kYWxDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL3Zpc3VhbC1zcWwtZWRpdG9yLXNvdXJjZS1tb2RhbC92aXN1YWwtc3FsLWVkaXRvci1zb3VyY2UtbW9kYWwuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBWaXN1YWxTcWxFZGl0b3JKb2luTW9kYWxDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL3Zpc3VhbC1zcWwtZWRpdG9yLWpvaW4tbW9kYWwvdmlzdWFsLXNxbC1lZGl0b3Itam9pbi1tb2RhbC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFZpc3VhbFNxbEVkaXRvclNvcnRNb2RhbENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvdmlzdWFsLXNxbC1lZGl0b3Itc29ydC1tb2RhbC92aXN1YWwtc3FsLWVkaXRvci1zb3J0LW1vZGFsLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVmlzdWFsU3FsRWRpdG9yRmllbGRNb2RhbENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvdmlzdWFsLXNxbC1lZGl0b3ItZmllbGQtbW9kYWwvdmlzdWFsLXNxbC1lZGl0b3ItZmllbGQtbW9kYWwuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBWaXN1YWxTcWxFZGl0b3JGaWx0ZXJNb2RhbENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvdmlzdWFsLXNxbC1lZGl0b3ItZmlsdGVyLW1vZGFsL3Zpc3VhbC1zcWwtZWRpdG9yLWZpbHRlci1tb2RhbC5jb21wb25lbnRcIjtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJzZGMtdmlzdWFsLXNxbC1lZGl0b3JcIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbVmlzdWFsU3FsRWRpdG9yRmxvd1NlcnZpY2UsIFZpc3VhbFNxbEVkaXRvclN0YXRlU2VydmljZV0sXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgIENvZGVFZGl0b3JDb21wb25lbnQsXG4gICAgQ29tYm9ib3hDb21wb25lbnQsXG4gICAgSW5mb1NpZ25Db21wb25lbnQsXG4gICAgTW9kYWxDb21wb25lbnQsXG4gICAgUGlja2xpc3RDb21wb25lbnQsXG4gICAgU2VsZWN0QnV0dG9uQ29tcG9uZW50LFxuICAgIFRhYmxlQ29tcG9uZW50LFxuICAgIFRleHRhcmVhQ29tcG9uZW50LFxuICAgIFRleHRib3hDb21wb25lbnQsXG4gICAgVGltZWxpbmVDb21wb25lbnQsXG4gICAgVmlzdWFsU3FsRWRpdG9yU291cmNlTW9kYWxDb21wb25lbnQsXG4gICAgVmlzdWFsU3FsRWRpdG9ySm9pbk1vZGFsQ29tcG9uZW50LFxuICAgIFZpc3VhbFNxbEVkaXRvclNvcnRNb2RhbENvbXBvbmVudCxcbiAgICBWaXN1YWxTcWxFZGl0b3JGaWVsZE1vZGFsQ29tcG9uZW50LFxuICAgIFZpc3VhbFNxbEVkaXRvckZpbHRlck1vZGFsQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogXCIuL3Zpc3VhbC1zcWwtZWRpdG9yLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi92aXN1YWwtc3FsLWVkaXRvci5jb21wb25lbnQuc2Nzc1wiXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFZpc3VhbFNxbEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd1NlcnZpY2UgPSBpbmplY3QoVmlzdWFsU3FsRWRpdG9yRmxvd1NlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlU2VydmljZSA9IGluamVjdChWaXN1YWxTcWxFZGl0b3JTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIGludGVybmFsQ29uZmlnID0gY3JlYXRlRHluYW1pY1ZpZXdCdWlsZGVyQ29uZmlnKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvbk9yZGVyOiBCdWlsZGVyU2VjdGlvbklkW10gPSBbXG4gICAgXCJ0YWJsZXNcIixcbiAgICBcImpvaW5zXCIsXG4gICAgXCJncm91cEJ5XCIsXG4gICAgXCJmaWVsZHNcIixcbiAgICBcInNvcnRpbmdcIixcbiAgICBcImZpbHRlcnNcIixcbiAgXTtcbiAgcmVhZG9ubHkgbGF5b3V0TW9kZUl0ZW1zOiBTZWxlY3RCdXR0b25JdGVtPEJ1aWxkZXJMYXlvdXRNb2RlPltdID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBcIkJsb2Nvc1wiLFxuICAgICAgdmFsdWU6IFwic3RhY2tlZFwiLFxuICAgICAgaWNvbkNsYXNzOiBcImZhcyBmYS10aC1sYXJnZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IFwiTGlzdGFcIixcbiAgICAgIHZhbHVlOiBcInNwbGl0XCIsXG4gICAgICBpY29uQ2xhc3M6IFwiZmFzIGZhLWxpc3RcIixcbiAgICB9LFxuICBdO1xuICByZWFkb25seSBmaWx0ZXJNb2RlSXRlbXM6IFNlbGVjdEJ1dHRvbkl0ZW08RmlsdGVyTW9kYWxNb2RlPltdID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBcIkZpbHRyb1wiLFxuICAgICAgdmFsdWU6IFwiY29uZGl0aW9uXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCJFeHByZXNzYW8gZGUgZG9taW5pb1wiLFxuICAgICAgdmFsdWU6IEZJTFRFUl9NT0RFX0RPTUFJTixcbiAgICB9LFxuICBdO1xuICByZWFkb25seSBzZWxlY3RlZEZpbHRlck1vZGVJdGVtczogU2VsZWN0QnV0dG9uSXRlbTxGaWx0ZXJNb2RhbE1vZGU+W10gPSBbXTtcbiAgcmVhZG9ubHkgc29ydERpcmVjdGlvbkl0ZW1zOiBTZWxlY3RCdXR0b25JdGVtPHN0cmluZz5bXSA9IFtdO1xuICByZWFkb25seSBzZWxlY3RlZExheW91dE1vZGVJdGVtczogU2VsZWN0QnV0dG9uSXRlbTxCdWlsZGVyTGF5b3V0TW9kZT5bXSA9IFtdO1xuICByZWFkb25seSBzZWxlY3RlZFNvcnREaXJlY3Rpb25JdGVtczogU2VsZWN0QnV0dG9uSXRlbTxzdHJpbmc+W10gPSBbXTtcbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xuICBASW5wdXQoKSBzZXQgY29uZmlnKHZhbHVlOiBEeW5hbWljVmlld0J1aWxkZXJDb25maWcpIHtcbiAgICB0aGlzLmludGVybmFsQ29uZmlnID0gdmFsdWVcbiAgICAgID8gY3JlYXRlRHluYW1pY1ZpZXdCdWlsZGVyQ29uZmlnKHZhbHVlKVxuICAgICAgOiBjcmVhdGVEeW5hbWljVmlld0J1aWxkZXJDb25maWcoKTtcbiAgICB0aGlzLnN5bmNMYXlvdXRNb2RlSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNGaWx0ZXJNb2RlSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNTb3J0RGlyZWN0aW9uSXRlbXMoKTtcbiAgICB0aGlzLnNhbml0aXplQnVpbGRlcigpO1xuICB9XG4gIGdldCBjb25maWcoKTogRHluYW1pY1ZpZXdCdWlsZGVyQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcm5hbENvbmZpZztcbiAgfVxuICBAT3V0cHV0KCkgcmVhZG9ubHkgY29uZmlnQ2hhbmdlID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNWaWV3QnVpbGRlckNvbmZpZz4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNWaWV3QnVpbGRlckNvbmZpZz4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQFZpZXdDaGlsZChcInNlY3Rpb25zQ29udGFpbmVyXCIpXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvbnNDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZHJlbihcImJ1aWxkZXJTZWN0aW9uXCIpXG4gIHByaXZhdGUgcmVhZG9ubHkgYnVpbGRlclNlY3Rpb25zPzogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcbiAgbGF5b3V0TW9kZTogQnVpbGRlckxheW91dE1vZGUgPSBcInN0YWNrZWRcIjtcbiAgcHJldmlld1Zpc2libGUgPSBmYWxzZTtcbiAgZmxvd0Fycm93czogQnVpbGRlckZsb3dBcnJvd1tdID0gW107XG4gIG1lYXN1cmVkU3BsaXRQcmV2aWV3SGVpZ2h0ID0gXCIyNHJlbVwiO1xuICBkcmFnZ2luZ0ZpZWxkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBkcmFnUHJldmlld0luZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcmVhZG9ubHkgb3ZlcmxheUFwcGVuZFRhcmdldCA9IE9WRVJMQVlfQVBQRU5EX1RBUkdFVDtcbiAgcmVhZG9ubHkgb3ZlcmxheVpJbmRleCA9IE1PREFMX09WRVJMQVlfWl9JTkRFWDtcbiAgcmVhZG9ubHkgbW9kYWxEaW1lbnNpb25zID0gRFlOQU1JQ19NT0RBTF9ESU1FTlNJT05TO1xuICByZWFkb25seSBmaWVsZFBpY2tsaXN0Um93cyA9IEZJRUxEX1BJQ0tMSVNUX1JPV1M7XG4gIHJlYWRvbmx5IGZpbHRlclBpY2tsaXN0Um93cyA9IEZJTFRFUl9QSUNLTElTVF9ST1dTO1xuXG4gIC8vIOKUgOKUgOKUgCBTZWxlY3Rpb24gbW9kYWwgc3RhdGUgKG5vdCBvd25lZCBieSBzdGF0ZVNlcnZpY2UpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBzZWxlY3Rpb25Nb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgc2VsZWN0aW9uTW9kYWxNb2RlOiBTZWxlY3Rpb25Nb2RhbE1vZGUgPSBcInRhYmxlc1wiO1xuICBzZWxlY3Rpb25Nb2RhbElkczogc3RyaW5nW10gPSBbXTtcbiAgc2VsZWN0aW9uTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcblxuICAvLyDilIDilIDilIAgU2VhcmNoIHN0YXRlIChsb2NhbCB0byBjb21wb25lbnQsIG5vdCBvd25lZCBieSBzdGF0ZVNlcnZpY2UpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBqb2luU291cmNlU2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gIGpvaW5UYXJnZXRTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgc29ydFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICBmaWVsZE1vZGFsU2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gIGZpbHRlclNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuXG4gIC8vIOKUgOKUgOKUgCBEZWxlZ2F0ZSBnZXR0ZXJzOiBtb2RhbCBzdGF0ZSBpcyBvd25lZCBieSBzdGF0ZVNlcnZpY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGdldCBzb3VyY2VNb2RhbFZpc2libGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnN0YXRlU2VydmljZS5zb3VyY2VNb2RhbFZpc2libGU7IH1cbiAgc2V0IHNvdXJjZU1vZGFsVmlzaWJsZSh2YWx1ZTogYm9vbGVhbikgeyB0aGlzLnN0YXRlU2VydmljZS5zb3VyY2VNb2RhbFZpc2libGUgPSB2YWx1ZTsgfVxuICBnZXQgc291cmNlTW9kYWxTdGVwKCk6IFNvdXJjZU1vZGFsU3RlcCB7IHJldHVybiB0aGlzLnN0YXRlU2VydmljZS5zb3VyY2VNb2RhbFN0ZXA7IH1cbiAgZ2V0IHNvdXJjZU1vZGFsRHJhZnRzKCk6IFNvdXJjZU1vZGFsRHJhZnRbXSB7IHJldHVybiB0aGlzLnN0YXRlU2VydmljZS5zb3VyY2VNb2RhbERyYWZ0czsgfVxuXG4gIGdldCBqb2luTW9kYWxWaXNpYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2Uuam9pbk1vZGFsVmlzaWJsZTsgfVxuICBzZXQgam9pbk1vZGFsVmlzaWJsZSh2YWx1ZTogYm9vbGVhbikgeyB0aGlzLnN0YXRlU2VydmljZS5qb2luTW9kYWxWaXNpYmxlID0gdmFsdWU7IH1cbiAgZ2V0IGpvaW5FZGl0SW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7IHJldHVybiB0aGlzLnN0YXRlU2VydmljZS5qb2luRWRpdEluZGV4OyB9XG4gIGdldCBqb2luRHJhZnQoKSB7IHJldHVybiB0aGlzLnN0YXRlU2VydmljZS5qb2luRHJhZnQ7IH1cblxuICBnZXQgc29ydE1vZGFsVmlzaWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc3RhdGVTZXJ2aWNlLnNvcnRNb2RhbFZpc2libGU7IH1cbiAgc2V0IHNvcnRNb2RhbFZpc2libGUodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5zdGF0ZVNlcnZpY2Uuc29ydE1vZGFsVmlzaWJsZSA9IHZhbHVlOyB9XG4gIGdldCBzb3J0RWRpdEluZGV4KCk6IG51bWJlciB8IG51bGwgeyByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2Uuc29ydEVkaXRJbmRleDsgfVxuICBnZXQgc29ydERyYWZ0KCkgeyByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2Uuc29ydERyYWZ0OyB9XG5cbiAgZ2V0IGZpZWxkTW9kYWxWaXNpYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRNb2RhbFZpc2libGU7IH1cbiAgc2V0IGZpZWxkTW9kYWxWaXNpYmxlKHZhbHVlOiBib29sZWFuKSB7IHRoaXMuc3RhdGVTZXJ2aWNlLmZpZWxkTW9kYWxWaXNpYmxlID0gdmFsdWU7IH1cbiAgZ2V0IGZpZWxkTW9kYWxTdGVwKCk6IEZpZWxkTW9kYWxTdGVwIHsgcmV0dXJuIHRoaXMuc3RhdGVTZXJ2aWNlLmZpZWxkTW9kYWxTdGVwOyB9XG4gIGdldCBmaWVsZE1vZGFsRHJhZnRzKCk6IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkW10geyByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRNb2RhbERyYWZ0czsgfVxuICBnZXQgZmllbGRGdW5jdGlvbkVkaXRDb2x1bW4oKTogc3RyaW5nIHwgbnVsbCB7IHJldHVybiB0aGlzLnN0YXRlU2VydmljZS5maWVsZEZ1bmN0aW9uRWRpdENvbHVtbjsgfVxuICBnZXQgZmllbGRGdW5jdGlvbkRyYWZ0KCkgeyByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRGdW5jdGlvbkRyYWZ0OyB9XG5cbiAgZ2V0IGZpbHRlck1vZGFsVmlzaWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc3RhdGVTZXJ2aWNlLmZpbHRlck1vZGFsVmlzaWJsZTsgfVxuICBzZXQgZmlsdGVyTW9kYWxWaXNpYmxlKHZhbHVlOiBib29sZWFuKSB7IHRoaXMuc3RhdGVTZXJ2aWNlLmZpbHRlck1vZGFsVmlzaWJsZSA9IHZhbHVlOyB9XG4gIGdldCBmaWx0ZXJFZGl0SW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7IHJldHVybiB0aGlzLnN0YXRlU2VydmljZS5maWx0ZXJFZGl0SW5kZXg7IH1cbiAgZ2V0IGZpbHRlck1vZGFsU3RlcCgpOiBGaWx0ZXJNb2RhbFN0ZXAgeyByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2UuZmlsdGVyTW9kYWxTdGVwOyB9XG4gIGdldCBmaWx0ZXJNb2RhbE1vZGUoKTogRmlsdGVyTW9kYWxNb2RlIHsgcmV0dXJuIHRoaXMuc3RhdGVTZXJ2aWNlLmZpbHRlck1vZGFsTW9kZTsgfVxuICBnZXQgZmlsdGVyRHJhZnQoKSB7IHJldHVybiB0aGlzLnN0YXRlU2VydmljZS5maWx0ZXJEcmFmdDsgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuc3luY0xheW91dE1vZGVJdGVtcygpO1xuICAgIHRoaXMuc3luY0ZpbHRlck1vZGVJdGVtcygpO1xuICAgIHRoaXMuc3luY1NvcnREaXJlY3Rpb25JdGVtcygpO1xuICAgIHRoaXMuc2FuaXRpemVCdWlsZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBmbG93Q29udGV4dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VjdGlvbnNDb250YWluZXI6IHRoaXMuc2VjdGlvbnNDb250YWluZXIsXG4gICAgICBidWlsZGVyU2VjdGlvbnM6IHRoaXMuYnVpbGRlclNlY3Rpb25zLFxuICAgICAgc2VjdGlvbk9yZGVyOiB0aGlzLnNlY3Rpb25PcmRlcixcbiAgICAgIGNoYW5nZURldGVjdG9yUmVmOiB0aGlzLmNoYW5nZURldGVjdG9yUmVmLFxuICAgICAgb25GbG93QXJyb3dzQ2hhbmdlOiAoYXJyb3dzOiBCdWlsZGVyRmxvd0Fycm93W10sIG1lYXN1cmVkSGVpZ2h0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5mbG93QXJyb3dzID0gYXJyb3dzO1xuICAgICAgICB0aGlzLm1lYXN1cmVkU3BsaXRQcmV2aWV3SGVpZ2h0ID0gbWVhc3VyZWRIZWlnaHQ7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZGVyU2VjdGlvbnM/LmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZmxvd1NlcnZpY2Uuc2NoZWR1bGVGbG93QXJyb3dSZWZyZXNoKHRoaXMuZmxvd0NvbnRleHQpO1xuICAgIH0pO1xuICAgIHRoaXMuZmxvd1NlcnZpY2Uuc2NoZWR1bGVGbG93QXJyb3dSZWZyZXNoKHRoaXMuZmxvd0NvbnRleHQpO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZmxvd1NlcnZpY2UubmdPbkRlc3Ryb3koKTtcbiAgfVxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxuICBvbldpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dTZXJ2aWNlLnNjaGVkdWxlRmxvd0Fycm93UmVmcmVzaCh0aGlzLmZsb3dDb250ZXh0KTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRMYXlvdXRNb2RlSXRlbSgpOiBTZWxlY3RCdXR0b25JdGVtPEJ1aWxkZXJMYXlvdXRNb2RlPiB8IG51bGwge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmxheW91dE1vZGVJdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSB0aGlzLmxheW91dE1vZGUpID8/XG4gICAgICBudWxsXG4gICAgKTtcbiAgfVxuICBnZXQgaXNSZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubWV0YWRhdGEudmlld01vZGUgPT09IFwicmVhZG9ubHlcIjtcbiAgfVxuICBnZXQgam9pbk9wZXJhdG9yT3B0aW9ucygpOiBEeW5hbWljVmlld0J1aWxkZXJPcHRpb25bXSB7XG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLmpvaW5PcGVyYXRvcnMgPz8gW10pLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIC4uLml0ZW0sXG4gICAgICB0ZXh0OiB0aGlzLnJlc29sdmVKb2luT3BlcmF0b3JPcHRpb25UZXh0KGl0ZW0pLFxuICAgIH0pKTtcbiAgfVxuICBnZXQgZnVuY3Rpb25PcHRpb25zKCk6IER5bmFtaWNWaWV3QnVpbGRlck9wdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS5mdW5jdGlvbnMgPz8gW107XG4gIH1cbiAgZ2V0IHNvcnREaXJlY3Rpb25PcHRpb25zKCk6IER5bmFtaWNWaWV3QnVpbGRlck9wdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS5zb3J0RGlyZWN0aW9ucyA/PyBbXTtcbiAgfVxuICBnZXQgZmlsdGVyQ29ubmVjdG9yT3B0aW9ucygpOiBEeW5hbWljVmlld0J1aWxkZXJPcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEuZmlsdGVyQ29ubmVjdG9ycyA/PyBbXTtcbiAgfVxuICBnZXQgdmFsdWVUeXBlT3B0aW9ucygpOiBEeW5hbWljVmlld0J1aWxkZXJPcHRpb25bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGV4dDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnZhbHVlVHlwZXMudmFsdWVgLFxuICAgICAgICAgIFwiVmFsb3JcIlxuICAgICAgICApLFxuICAgICAgICB2YWx1ZTogXCJ2YWx1ZVwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGV4dDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnZhbHVlVHlwZXMucGFyYW1ldGVyYCxcbiAgICAgICAgICBcIlBhcmFtZXRyb1wiXG4gICAgICAgICksXG4gICAgICAgIHZhbHVlOiBcInBhcmFtZXRlclwiLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG4gIGdldCBib29sZWFuVmFsdWVPcHRpb25zKCk6IER5bmFtaWNWaWV3QnVpbGRlck9wdGlvbltdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0ZXh0OiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuYm9vbGVhbi50cnVlYCxcbiAgICAgICAgICBcIlRydWVcIlxuICAgICAgICApLFxuICAgICAgICB2YWx1ZTogXCJ0cnVlXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0ZXh0OiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuYm9vbGVhbi5mYWxzZWAsXG4gICAgICAgICAgXCJGYWxzZVwiXG4gICAgICAgICksXG4gICAgICAgIHZhbHVlOiBcImZhbHNlXCIsXG4gICAgICB9LFxuICAgIF07XG4gIH1cbiAgZ2V0IHNlbGVjdGVkVGFibGVzKCk6IER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uW10ge1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQoXG4gICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcy5tYXAoKGl0ZW0pID0+IGl0ZW0udGFibGUpXG4gICAgKTtcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEudGFibGVzID8/IFtdKS5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICBpZHMuaGFzKGl0ZW0udmFsdWUpXG4gICAgKTtcbiAgfVxuICBnZXQgYXZhaWxhYmxlQ29sdW1ucygpOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRUYWJsZUlkcyA9IG5ldyBTZXQoXG4gICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcy5tYXAoKGl0ZW0pID0+IGl0ZW0udGFibGUpXG4gICAgKTtcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEuY29sdW1ucyA/PyBbXSkuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgc2VsZWN0ZWRUYWJsZUlkcy5oYXMoaXRlbS50YWJsZSlcbiAgICApO1xuICB9XG4gIGdldCBmaWVsZFNlbGVjdGFibGVDb2x1bW5zKCk6IER5bmFtaWNWaWV3QnVpbGRlckNvbHVtbk9wdGlvbltdIHtcbiAgICBpZiAoIXRoaXMuYXZhaWxhYmxlQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUNvbHVtbnM7XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwQnkgPSBuZXcgU2V0KHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5KTtcbiAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVDb2x1bW5zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiBncm91cEJ5LmhhcyhpdGVtLnZhbHVlKSB8fCBpdGVtLmlzQWdncmVnYXRhYmxlICE9PSBmYWxzZVxuICAgICk7XG4gIH1cbiAgZ2V0IGdyb3VwQnlTZWxlY3RhYmxlQ29sdW1ucygpOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlQ29sdW1ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaXNBZ2dyZWdhdGFibGUgIT09IGZhbHNlKTtcbiAgfVxuICBnZXQgc29ydFNlbGVjdGFibGVJdGVtcygpOiBTb3J0U2VsZWN0YWJsZUl0ZW1bXSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZpZWxkcyA9IHRoaXMubm9ybWFsaXplZEZpZWxkcztcbiAgICBpZiAoIW5vcm1hbGl6ZWRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBCeVNldCA9IG5ldyBTZXQodGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnkpO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVkdXBsaWNhdGVCeUtleShcbiAgICAgIG5vcm1hbGl6ZWRGaWVsZHNcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbihpdGVtLmNvbHVtbik7XG4gICAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5pc1NvcnRhYmxlICE9PSBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZ3JvdXBCeVNldC5oYXMoaXRlbS5jb2x1bW4pIHx8ICEhaXRlbS5mdW5jdGlvbj8uZnVuY3Rpb25OYW1lPy50cmltKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJ0cyA9IHRoaXMucmVzb2x2ZUNvbHVtblBhcnRzKGl0ZW0uY29sdW1uKTtcbiAgICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBpdGVtLmZ1bmN0aW9uPy5mdW5jdGlvbk5hbWU/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBpZDogdGhpcy5idWlsZFNvcnRTZWxlY3Rpb25JZChpdGVtLmNvbHVtbiwgZnVuY3Rpb25OYW1lKSxcbiAgICAgICAgICAgIGNvbHVtbjogaXRlbS5jb2x1bW4sXG4gICAgICAgICAgICB0YWJsZUxhYmVsOiBwYXJ0cy50YWJsZUxhYmVsLFxuICAgICAgICAgICAgZmllbGRMYWJlbDogcGFydHMuZmllbGRMYWJlbCxcbiAgICAgICAgICAgIG1ldGE6IGZ1bmN0aW9uTmFtZVxuICAgICAgICAgICAgICA/IHRoaXMucmVzb2x2ZUZ1bmN0aW9uTGFiZWwoZnVuY3Rpb25OYW1lKVxuICAgICAgICAgICAgICA6IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbihpdGVtLmNvbHVtbik/LmRhdGFUeXBlID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKGl0ZW0pID0+IGl0ZW0uaWRcbiAgICApO1xuICB9XG4gIGdldCBjYW5Db25maWd1cmVKb2lucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMubGVuZ3RoID4gMTtcbiAgfVxuICBnZXQgY2FuU2F2ZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gISEodGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpZWxkcy5sZW5ndGggfHwgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnkubGVuZ3RoKTtcbiAgfVxuICBnZXQgY2FuU2F2ZUpvaW4oKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbiB8fFxuICAgICAgIXRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbiB8fFxuICAgICAgIXRoaXMuam9pbkRyYWZ0Lm9wZXJhdG9yXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbih0aGlzLmpvaW5EcmFmdC5zb3VyY2VDb2x1bW4pO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbih0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4pO1xuICAgIHJldHVybiAhIXNvdXJjZSAmJiAhIXRhcmdldCAmJiBzb3VyY2UudGFibGUgIT09IHRhcmdldC50YWJsZTtcbiAgfVxuICBnZXQgY2FuU2F2ZVNvcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zb3J0RHJhZnQuY29sdW1uICYmICEhdGhpcy5zb3J0RHJhZnQuZGlyZWN0aW9uO1xuICB9XG4gIGdldCBjYW5TYXZlRmllbGRNb2RhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmZpZWxkTW9kYWxEcmFmdHMubGVuZ3RoICYmICF0aGlzLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uO1xuICB9XG4gIGdldCBjYW5TYXZlRmlsdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuYnVpbGRGaWx0ZXJGcm9tRHJhZnQoKTtcbiAgfVxuICBnZXQgZmllbGRNb2RhbENhblByb2NlZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRNb2RhbERyYWZ0cy5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBjYW5PcGVuRmllbGRDb25maWd1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkSXRlbXMubGVuZ3RoID4gMDtcbiAgfVxuICBnZXQgZmlsdGVyTW9kYWxTZWxlY3Rpb25TdGVwQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlck1vZGFsU3RlcCA9PT0gXCJzZWxlY3RcIjtcbiAgfVxuICBnZXQgZmlsdGVyTW9kYWxDb25maWd1cmF0aW9uU3RlcEFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNb2RhbFN0ZXAgPT09IFwiY29uZmlndXJlXCI7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsUmV2aWV3U3RlcEFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNb2RhbFN0ZXAgPT09IFwicmV2aWV3XCI7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsQ2FuUHJvY2VlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTiB8fCAhIXRoaXMuZmlsdGVyRHJhZnQuY29sdW1uO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbENhblJldmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYW5TYXZlRmlsdGVyO1xuICB9XG4gIGdldCBmaWx0ZXJOZWVkc1ZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhW1wiRU1QVFlcIiwgXCJOT1RfRU1QVFlcIl0uaW5jbHVkZXModGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvcik7XG4gIH1cbiAgZ2V0IGZpbHRlckNvbm5lY3RvckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlclNlcXVlbmNlSW5kZXggPT09IDA7XG4gIH1cbiAgZ2V0IGZpbHRlckNvbm5lY3RvckRpc2FibGVkUmVhc29uKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmZpbHRlckNvbm5lY3RvckRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmRpc2FibGVkUmVhc29ucy5jb25uZWN0b3JgLFxuICAgICAgXCJPIHByaW1laXJvIGZpbHRybyBzZW1wcmUgaW5pY2lhIG8gV0hFUkUsIHBvciBpc3NvIG8gY29uZWN0b3IgZmljYSB0cmF2YWRvLlwiXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyT3BlcmF0b3JEaXNhYmxlZFJlYXNvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbikge1xuICAgICAgcmV0dXJuIEVNUFRZX1ZBTFVFO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy5kaXNhYmxlZFJlYXNvbnMub3BlcmF0b3JgLFxuICAgICAgXCJTZWxlY2lvbmUgdW0gY2FtcG8gbmEgZXRhcGEgYW50ZXJpb3IgcGFyYSBsaWJlcmFyIHNvbWVudGUgb3Mgb3BlcmFkb3JlcyBjb21wYXRpdmVpcy5cIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlclZhbHVlVHlwZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4gfHwgIXRoaXMuZmlsdGVyTmVlZHNWYWx1ZTtcbiAgfVxuICBnZXQgZmlsdGVyVmFsdWVUeXBlRGlzYWJsZWRSZWFzb24oKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVyRHJhZnQuY29sdW1uKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy5kaXNhYmxlZFJlYXNvbnMudmFsdWVUeXBlV2l0aG91dENvbHVtbmAsXG4gICAgICAgIFwiRXNjb2xoYSB1bSBjYW1wbyBlIHVtIG9wZXJhZG9yIGFudGVzIGRlIGRlZmluaXIgY29tbyBvIHZhbG9yIHNlcmEgaW5mb3JtYWRvLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5maWx0ZXJOZWVkc1ZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy5kaXNhYmxlZFJlYXNvbnMudmFsdWVUeXBlV2l0aG91dFZhbHVlYCxcbiAgICAgICAgXCJPIG9wZXJhZG9yIGF0dWFsIG5hbyB1c2EgdmFsb3IsIGVudGFvIHRpcG8gZGUgdmFsb3IgZSBlbnRyYWRhIGZpY2FtIG9jdWx0b3MuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEVNUFRZX1ZBTFVFO1xuICB9XG4gIGdldCBmaWx0ZXJPcGVyYXRvclRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVyRHJhZnQuY29sdW1uKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy50b29sdGlwcy5vcGVyYXRvckRlZmF1bHRgLFxuICAgICAgICBcIk9zIG9wZXJhZG9yZXMgbXVkYW0gY29uZm9ybWUgbyB0aXBvIGRvIGNhbXBvIHNlbGVjaW9uYWRvLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbih0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbik7XG4gICAgbGV0IG9wZXJhdG9yS2V5OiBzdHJpbmc7XG4gICAgaWYgKHRoaXMuaXNOdW1lcmljVHlwZShjb2x1bW4/LmRhdGFUeXBlKSkge1xuICAgICAgb3BlcmF0b3JLZXkgPSBcIm9wZXJhdG9yTnVtZXJpY1wiO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0RhdGVUeXBlKGNvbHVtbj8uZGF0YVR5cGUpKSB7XG4gICAgICBvcGVyYXRvcktleSA9IFwib3BlcmF0b3JEYXRlXCI7XG4gICAgfSBlbHNlIGlmICgoY29sdW1uPy5kYXRhVHlwZSA/PyBFTVBUWV9WQUxVRSkudG9Mb3dlckNhc2UoKSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIG9wZXJhdG9yS2V5ID0gXCJvcGVyYXRvckJvb2xlYW5cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgb3BlcmF0b3JLZXkgPSBcIm9wZXJhdG9yVGV4dFwiO1xuICAgIH1cblxuICAgIGNvbnN0IGZhbGxiYWNrQnlLZXk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBvcGVyYXRvck51bWVyaWM6IFwiQ2FtcG9zIG51bWVyaWNvcyBwZXJtaXRlbSBjb21wYXJhY29lcywgZmFpeGFzIGUgbGlzdGFzLlwiLFxuICAgICAgb3BlcmF0b3JEYXRlOiBcIkNhbXBvcyBkZSBkYXRhIGUgaG9yYSBwZXJtaXRlbSBjb21wYXJhY29lcyBjcm9ub2xvZ2ljYXMgZSBpbnRlcnZhbG8uXCIsXG4gICAgICBvcGVyYXRvckJvb2xlYW46IFwiQ2FtcG9zIGJvb2xlYW5vcyBhY2VpdGFtIGNvbXBhcmFjYW8gZGlyZXRhIG91IHZlcmlmaWNhY2FvIGRlIHZhemlvLlwiLFxuICAgICAgb3BlcmF0b3JUZXh0OiBcIkNhbXBvcyB0ZXh0dWFpcyBhY2VpdGFtIGJ1c2NhIHBvciB0cmVjaG8sIHByZWZpeG8sIHN1Zml4byBlIGxpc3Rhcy5cIlxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMudG9vbHRpcHMuJHtvcGVyYXRvcktleX1gLFxuICAgICAgZmFsbGJhY2tCeUtleVtvcGVyYXRvcktleV1cbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJWYWx1ZVR5cGVUb29sdGlwKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbikge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMudG9vbHRpcHMudmFsdWVUeXBlRGVmYXVsdGAsXG4gICAgICAgIFwiVXNlIHZhbG9yIGRpZ2l0YWRvIHBhcmEgY29tcGFyYXIgYWdvcmEgb3UgcGFyYW1ldHJvIHBhcmEgcGVkaXIgbyB2YWxvciBlbSB0ZW1wbyBkZSBleGVjdWNhby5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZmlsdGVyTmVlZHNWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMudG9vbHRpcHMudmFsdWVUeXBlTm90UmVxdWlyZWRgLFxuICAgICAgICBcIkNvbSBlc3RlIG9wZXJhZG9yIG8gZmlsdHJvIG5hbyBwcmVjaXNhIHJlY2ViZXIgdmFsb3IuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLnZhbHVlVHlwZWAsXG4gICAgICBcIlZhbG9yIGRpZ2l0YWRvIHNhbHZhIHVtYSBjb21wYXJhY2FvIGZpeGEuIFBhcmFtZXRybyBkZWl4YSBvIHZhbG9yIGFiZXJ0byBwYXJhIHByZWVuY2hpbWVudG8gZnV0dXJvLlwiXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyQ29ubmVjdG9yVG9vbHRpcCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy50b29sdGlwcy5jb25uZWN0b3JgLFxuICAgICAgXCJDb25lY3RvciBkZWZpbmUgY29tbyBlc3RhIHJlZ3JhIHNlIGxpZ2EgYW8gZmlsdHJvIGFudGVyaW9yOiBBTkQgcmVzdHJpbmdlLCBPUiBhbXBsaWEuXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJPcHRpb25hbFRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMudG9vbHRpcHMub3B0aW9uYWxgLFxuICAgICAgXCJNYXJxdWUgY29tbyBvcGNpb25hbCBxdWFuZG8gYSByZWdyYSBwdWRlciBzZXIgaWdub3JhZGEgc2VtIGludmFsaWRhciBhIGV4ZWN1Y2FvLlwiXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyRG9tYWluRXhwcmVzc2lvblRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMudG9vbHRpcHMuZG9tYWluRXhwcmVzc2lvbmAsXG4gICAgICBcIkV4cHJlc3NhbyBkZSBkb21pbmlvIGVudHJhIGNvbW8gY29uZGljYW8gbWFudWFsIG5vIFdIRVJFLiBVc2UgcXVhbmRvIGEgcmVncmEgbmFvIGNvdWJlciBub3Mgb3BlcmFkb3JlcyBwYWRyYW8uXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJWYWx1ZUlucHV0VG9vbHRpcCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbHRlckRyYWZ0LnZhbHVlVHlwZSA9PT0gXCJwYXJhbWV0ZXJcIikge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMudG9vbHRpcHMucGFyYW1ldGVyTmFtZWAsXG4gICAgICAgIFwiSW5mb3JtZSBvIG5vbWUgdGVjbmljbyBxdWUgc2VyYSB1c2FkbyBwYXJhIHBlZGlyIG8gdmFsb3IgZW0gdGVtcG8gZGUgZXhlY3VjYW8uXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IgPT09IFwiSU5cIikge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMudG9vbHRpcHMudmFsdWVzTGlzdGAsXG4gICAgICAgIFwiU2VwYXJlIG9zIHZhbG9yZXMgcG9yIHZpcmd1bGEgcGFyYSBtb250YXIgYSBsaXN0YSBmaW5hbCBkbyBJTi5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvciA9PT0gXCJCRVRXRUVOXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLmJldHdlZW5gLFxuICAgICAgICBcIlByZWVuY2hhIGluaWNpbyBlIGZpbSBwYXJhIG1vbnRhciBvIGludGVydmFsbyBjb21wbGV0by5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMudG9vbHRpcHMudmFsdWVgLFxuICAgICAgXCJPIHZhbG9yIGZpbmFsIHJlc3BlaXRhIG8gdGlwbyBkbyBjYW1wbyBlIG8gb3BlcmFkb3IgZXNjb2xoaWRvLlwiXG4gICAgKTtcbiAgfVxuICBnZXQgc2hvd0ZpbHRlclZhbHVlVGV4dGJveCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBpc1ZhbHVlTW9kZSA9IHRoaXMuZmlsdGVyRHJhZnQudmFsdWVUeXBlID09PSBcInZhbHVlXCIgJiYgdGhpcy5maWx0ZXJOZWVkc1ZhbHVlO1xuICAgIHJldHVybiAoXG4gICAgICBpc1ZhbHVlTW9kZSAmJlxuICAgICAgIXRoaXMuc2hvd0ZpbHRlclZhbHVlc1RleHRib3ggJiZcbiAgICAgICF0aGlzLnNob3dGaWx0ZXJCZXR3ZWVuSW5wdXRzICYmXG4gICAgICAhdGhpcy5zaG93RmlsdGVyQm9vbGVhbkNvbWJvYm94XG4gICAgKTtcbiAgfVxuICBnZXQgc2hvd0ZpbHRlclZhbHVlc1RleHRib3goKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZmlsdGVyRHJhZnQudmFsdWVUeXBlID09PSBcInZhbHVlXCIgJiZcbiAgICAgIHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IgPT09IFwiSU5cIlxuICAgICk7XG4gIH1cbiAgZ2V0IHNob3dGaWx0ZXJCZXR3ZWVuSW5wdXRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlVHlwZSA9PT0gXCJ2YWx1ZVwiICYmXG4gICAgICB0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yID09PSBcIkJFVFdFRU5cIlxuICAgICk7XG4gIH1cbiAgZ2V0IHNob3dGaWx0ZXJQYXJhbWV0ZXJUZXh0Ym94KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlVHlwZSA9PT0gXCJwYXJhbWV0ZXJcIjtcbiAgfVxuICBnZXQgc2hvd0ZpbHRlckJvb2xlYW5Db21ib2JveCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4pO1xuICAgIHJldHVybiAoXG4gICAgICAhIWNvbHVtbiAmJiBjb2x1bW4uZGF0YVR5cGUgPT09IFwiYm9vbGVhblwiICYmIHRoaXMuc2hvd0ZpbHRlclZhbHVlVGV4dGJveFxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlclJldmlld0l0ZW1zKCk6IEZpbHRlclJldmlld0l0ZW1bXSB7IC8vIE5PU09OQVIgLSBjb21wbGV4aXR5OiBleHRyYWN0aW9uIHdvdWxkIHJpc2sgYmVoYXZpb3IgY2hhbmdlXG4gICAgY29uc3QgdmFsdWVUeXBlTGFiZWwgPSB0aGlzLmZpbHRlck1vZGFsTW9kZSA9PT0gRklMVEVSX01PREVfRE9NQUlOXG4gICAgICA/IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZG9tYWluTGFiZWxgLFxuICAgICAgICBcIkV4cHJlc3NhbyBkZSBkb21pbmlvXCJcbiAgICAgIClcbiAgICAgIDogdGhpcy5yZXNvbHZlT3B0aW9uTGFiZWwodGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUsIHRoaXMudmFsdWVUeXBlT3B0aW9ucyk7XG5cbiAgICBjb25zdCBpdGVtczogRmlsdGVyUmV2aWV3SXRlbVtdID0gW1xuICAgICAge1xuICAgICAgICBpZDogXCJtb2RlXCIsXG4gICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpZWxkcy50eXBlYCxcbiAgICAgICAgICBcIlRpcG9cIlxuICAgICAgICApLFxuICAgICAgICB2YWx1ZTogdGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTlxuICAgICAgICAgID8gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZG9tYWluTGFiZWxgLFxuICAgICAgICAgICAgXCJFeHByZXNzYW8gZGUgZG9taW5pb1wiXG4gICAgICAgICAgKVxuICAgICAgICAgIDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMubW9kZXMuY29uZGl0aW9uYCxcbiAgICAgICAgICAgIFwiRmlsdHJvXCJcbiAgICAgICAgICApLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IFwiY29ubmVjdG9yXCIsXG4gICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpZWxkcy5jb25uZWN0b3JgLFxuICAgICAgICAgIFwiQ29uZWN0b3JcIlxuICAgICAgICApLFxuICAgICAgICB2YWx1ZTogdGhpcy5maWx0ZXJDb25uZWN0b3JEaXNhYmxlZFxuICAgICAgICAgID8gXCJXSEVSRVwiXG4gICAgICAgICAgOiB0aGlzLnJlc29sdmVPcHRpb25MYWJlbCh0aGlzLmZpbHRlckRyYWZ0LmNvbm5lY3RvciwgdGhpcy5maWx0ZXJDb25uZWN0b3JPcHRpb25zKSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGlmICh0aGlzLmZpbHRlck1vZGFsTW9kZSA9PT0gRklMVEVSX01PREVfRE9NQUlOKSB7XG4gICAgICBpdGVtcy5wdXNoKFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiZXhwcmVzc2lvblwiLFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmllbGRzLmRvbWFpbkV4cHJlc3Npb25gLFxuICAgICAgICAgICAgXCJFeHByZXNzYW8gZGUgZG9taW5pb1wiXG4gICAgICAgICAgKSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5maWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uLnRyaW0oKSB8fCBcIi1cIixcbiAgICAgICAgICBlbXBoYXNpemU6IFwiY29kZVwiLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcImZpZWxkXCIsXG4gICAgICAgICAgbGFiZWw6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWVsZHMuZmllbGRgLFxuICAgICAgICAgICAgXCJDYW1wb1wiXG4gICAgICAgICAgKSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4gPyB0aGlzLnJlc29sdmVDb2x1bW5QYXRoKHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uKSA6IFwiLVwiLFxuICAgICAgICAgIGVtcGhhc2l6ZTogXCJwYXRoXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJvcGVyYXRvclwiLFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmllbGRzLm9wZXJhdG9yYCxcbiAgICAgICAgICAgIFwiT3BlcmFkb3JcIlxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWU6IHRoaXMucmVzb2x2ZUZpbHRlck9wZXJhdG9yTGFiZWwodGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvciksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJ2YWx1ZVR5cGVcIixcbiAgICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpZWxkcy52YWx1ZVR5cGVgLFxuICAgICAgICAgICAgXCJUaXBvIGRlIHZhbG9yXCJcbiAgICAgICAgICApLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmZpbHRlck5lZWRzVmFsdWUgPyB2YWx1ZVR5cGVMYWJlbCA6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5zdGF0ZXMubm9uZWAsXG4gICAgICAgICAgICBcIlNlbSB2YWxvclwiXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcInZhbHVlXCIsXG4gICAgICAgICAgbGFiZWw6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWVsZHMudmFsdWVgLFxuICAgICAgICAgICAgXCJWYWxvclwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5yZXNvbHZlRmlsdGVyRHJhZnREaXNwbGF5VmFsdWUoKSB8fCBcIi1cIixcbiAgICAgICAgICBlbXBoYXNpemU6IHRoaXMuZmlsdGVyRHJhZnQudmFsdWVUeXBlID09PSBcInBhcmFtZXRlclwiID8gXCJjb2RlXCIgOiBcImRlZmF1bHRcIixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaXRlbXMucHVzaCh7XG4gICAgICBpZDogXCJvcHRpb25hbFwiLFxuICAgICAgbGFiZWw6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LnN0YXRlcy5vcHRpb25hbGAsXG4gICAgICAgIFwiT3BjaW9uYWxcIlxuICAgICAgKSxcbiAgICAgIHZhbHVlOiB0aGlzLmZpbHRlckRyYWZ0Lm9wdGlvbmFsXG4gICAgICAgID8gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5zdGF0ZXMueWVzYCxcbiAgICAgICAgICBcIlNpbVwiXG4gICAgICAgIClcbiAgICAgICAgOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LnN0YXRlcy5ub2AsXG4gICAgICAgICAgXCJOYW9cIlxuICAgICAgICApLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIGdldCBmaWx0ZXJSZXZpZXdQcmV2aWV3TGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmV2aWV3ID0gdGhpcy5yZXNvbHZlRmlsdGVyRHJhZnRTcWxQcmV2aWV3KCk7XG4gICAgcmV0dXJuIHByZXZpZXcgfHwgXCItXCI7XG4gIH1cbiAgZ2V0IHNvdXJjZU1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VNb2RhbFN0ZXAgPT09IFwic2VsZWN0XCI7XG4gIH1cbiAgZ2V0IHNvdXJjZU1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlTW9kYWxTdGVwID09PSBcImNvbmZpZ3VyZVwiO1xuICB9XG4gIGdldCBzb3VyY2VNb2RhbENhblByb2NlZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlTW9kYWxEcmFmdHMubGVuZ3RoID4gMDtcbiAgfVxuICBnZXQgY2FuT3BlblNvdXJjZUNvbmZpZ3VyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlSXRlbXMubGVuZ3RoID4gMDtcbiAgfVxuICBnZXQgc291cmNlSXRlbXMoKTogU291cmNlVmlld0l0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnJlc29sdmVUYWJsZURpc3BsYXlQYXJ0cyhpdGVtLnRhYmxlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpdGVtLnRhYmxlLFxuICAgICAgICBkYkxhYmVsOiBwYXJ0cy5kYkxhYmVsLFxuICAgICAgICB0YWJsZUxhYmVsOiBwYXJ0cy50YWJsZUxhYmVsLFxuICAgICAgICBhbGlhczogaXRlbS5hbGlhcyxcbiAgICAgICAgaGFzQ3VzdG9tQWxpYXM6IHRoaXMuaGFzQ3VzdG9tQWxpYXMoaXRlbS50YWJsZSwgaXRlbS5hbGlhcyksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIGdldCBzb3VyY2VNb2RhbFRpbWVsaW5lSXRlbXMoKTogVGltZWxpbmVJdGVtW10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGlkOiBcInNlbGVjdFwiLFxuICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5hY3Rpb25zLnNlbGVjdFRhYmxlc2AsXG4gICAgICAgICAgRkFMTEJBQ0tfU0VMRUNUX1RBQkxFU1xuICAgICAgICApLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuc291cmNlcy5zdGVwcy5zZWxlY3Quc3VidGl0bGVgLFxuICAgICAgICAgIFwiRXNjb2xoYSBhcyB0YWJlbGFzIHF1ZSBkZXZlbSBhbGltZW50YXIgYSB2aXNhbyBhbnRlcyBkZSBjb25maWd1cmFyIG9zIGFsaWFzZXMuXCJcbiAgICAgICAgKSxcbiAgICAgICAgaW5kaWNhdG9yTGFiZWw6IFwiMVwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IFwiY29uZmlndXJlXCIsXG4gICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjdGlvbnMuY29uZmlndXJlQWxpYXNlc2AsXG4gICAgICAgICAgXCJDb25maWd1cmFyIGFsaWFzZXNcIlxuICAgICAgICApLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuc291cmNlcy5zdGVwcy5jb25maWd1cmUuc3VidGl0bGVgLFxuICAgICAgICAgIFwiUmV2aXNlIG9zIGFsaWFzZXMgc3VnZXJpZG9zIGUgYWp1c3RlIG9zIG5vbWVzIGZpbmFpcyBkYXMgdGFiZWxhcyBzZWxlY2lvbmFkYXMuXCJcbiAgICAgICAgKSxcbiAgICAgICAgaW5kaWNhdG9yTGFiZWw6IFwiMlwiLFxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuc291cmNlTW9kYWxDYW5Qcm9jZWVkLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG4gIGdldCBzb3VyY2VNb2RhbFRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuc291cmNlcy50aXRsZWAsXG4gICAgICBGQUxMQkFDS19TRUxFQ1RfVEFCTEVTXG4gICAgKTtcbiAgfVxuICBnZXQgc291cmNlTW9kYWxUaW1lbGluZUFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uYWNjZXNzaWJpbGl0eS5zb3VyY2VNb2RhbFRpbWVsaW5lYCxcbiAgICAgIFwiRXRhcGFzIGRhIGNvbmZpZ3VyYWNhbyBkYXMgdGFiZWxhc1wiXG4gICAgKTtcbiAgfVxuICBnZXQgc291cmNlTW9kYWxQaWNrbGlzdEl0ZW1zKCk6IFRhYmxlUGlja2xpc3RJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkVGFibGVQaWNrbGlzdEl0ZW1zKHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEudGFibGVzID8/IFtdKTtcbiAgfVxuICBnZXQgc291cmNlTW9kYWxTZWxlY3RlZFBpY2tsaXN0SWRzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VNb2RhbERyYWZ0c1xuICAgICAgLm1hcCgoaXRlbSkgPT4gdGhpcy5yZXNvbHZlVGFibGVQaWNrbGlzdElkKGl0ZW0udGFibGUpKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGl0ZW0pOiBpdGVtIGlzIG51bWJlciA9PiB0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIiAmJiBpdGVtID4gMFxuICAgICAgKTtcbiAgfVxuICBnZXQgc291cmNlTW9kYWxDb25maWd1cmVkSXRlbXMoKTogU291cmNlQ29uZmlndXJlZEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlTW9kYWxEcmFmdHMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHRoaXMucmVzb2x2ZVRhYmxlRGlzcGxheVBhcnRzKGl0ZW0udGFibGUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGl0ZW0udGFibGUsXG4gICAgICAgIHRhYmxlOiBpdGVtLnRhYmxlLFxuICAgICAgICBkYkxhYmVsOiBwYXJ0cy5kYkxhYmVsLFxuICAgICAgICB0YWJsZUxhYmVsOiBwYXJ0cy50YWJsZUxhYmVsLFxuICAgICAgICBhbGlhczogaXRlbS5hbGlhcyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgZ2V0IGpvaW5JdGVtcygpOiBKb2luVmlld0l0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5qb2lucy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlc29sdmVDb2x1bW5QYXJ0cyhpdGVtLnNvdXJjZUNvbHVtbik7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnJlc29sdmVDb2x1bW5QYXJ0cyhpdGVtLnRhcmdldENvbHVtbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogYCR7aXRlbS5zb3VyY2VDb2x1bW59LSR7aXRlbS50YXJnZXRDb2x1bW59LSR7aW5kZXh9YCxcbiAgICAgICAgc291cmNlVGFibGU6IHNvdXJjZS50YWJsZUxhYmVsLFxuICAgICAgICBzb3VyY2VGaWVsZDogc291cmNlLmZpZWxkTGFiZWwsXG4gICAgICAgIG9wZXJhdG9yOiB0aGlzLnJlc29sdmVKb2luT3BlcmF0b3JMYWJlbChpdGVtLm9wZXJhdG9yKSxcbiAgICAgICAgdGFyZ2V0VGFibGU6IHRhcmdldC50YWJsZUxhYmVsLFxuICAgICAgICB0YXJnZXRGaWVsZDogdGFyZ2V0LmZpZWxkTGFiZWwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIGdldCBncm91cEJ5SXRlbXMoKTogU2ltcGxlVmlld0l0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5Lm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIGlkOiBpdGVtLFxuICAgICAgLi4udGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbSksXG4gICAgfSkpO1xuICB9XG4gIGdldCBmaWVsZEl0ZW1zTGVnYWN5KCk6IHVua25vd25bXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JkZXJlZEZpZWxkRW50cmllcygpLm1hcCgoZW50cnksIGluZGV4KSA9PiAoe1xuICAgICAgaWQ6IGVudHJ5LmNvbHVtbixcbiAgICAgIGxhYmVsOiBgJHtpbmRleCArIDF9wrAgJHt0aGlzLnJlc29sdmVDb2x1bW5QYXRoKGVudHJ5LmNvbHVtbil9YCxcbiAgICAgIG9yZGVyOiBpbmRleCxcbiAgICB9KSk7XG4gIH1cbiAgZ2V0IGZpZWxkSXRlbXMoKTogRmllbGRWaWV3SXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPcmRlcmVkRmllbGRFbnRyaWVzKCkubWFwKChlbnRyeSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGVudHJ5LmZ1bmN0aW9uPy5mdW5jdGlvbk5hbWU/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRTtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uQWxpYXMgPSBlbnRyeS5mdW5jdGlvbj8uYWxpYXM/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGAke2VudHJ5LmNvbHVtbn0tJHtpbmRleH1gLFxuICAgICAgICBzb3VyY2VJbmRleDogZW50cnkuc291cmNlSW5kZXgsXG4gICAgICAgIGNvbHVtbjogZW50cnkuY29sdW1uLFxuICAgICAgICBvcmRlckxhYmVsOiBgJHtpbmRleCArIDF9wrBgLFxuICAgICAgICAuLi50aGlzLnJlc29sdmVDb2x1bW5QYXJ0cyhlbnRyeS5jb2x1bW4pLFxuICAgICAgICBhbGlhczogZW50cnkuYWxpYXM/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgICAgd2lkdGg6IGVudHJ5LndpZHRoPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgZnVuY3Rpb25MYWJlbDogZnVuY3Rpb25OYW1lID8gdGhpcy5yZXNvbHZlRnVuY3Rpb25MYWJlbChmdW5jdGlvbk5hbWUpIDogRU1QVFlfVkFMVUUsXG4gICAgICAgIGZ1bmN0aW9uQWxpYXMsXG4gICAgICAgIGhhc0N1c3RvbUNvbmZpZzpcbiAgICAgICAgICAhIWVudHJ5LmFsaWFzPy50cmltKCkgfHwgISFlbnRyeS53aWR0aD8udHJpbSgpIHx8ICEhZnVuY3Rpb25OYW1lIHx8ICEhZnVuY3Rpb25BbGlhcyxcbiAgICAgICAgb3JkZXI6IGluZGV4LFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBnZXQgZmllbGRNb2RhbFNlbGVjdGlvblJvd3MoKTogU2VsZWN0aW9uUm93W10ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29sdW1uU2VsZWN0aW9uUm93cyhcbiAgICAgIHRoaXMuZmllbGRTZWxlY3RhYmxlQ29sdW1ucyxcbiAgICAgIHRoaXMuZmllbGRNb2RhbERyYWZ0cy5tYXAoKGl0ZW0pID0+IGl0ZW0uY29sdW1uKSxcbiAgICAgIHRoaXMuZmllbGRNb2RhbFNlYXJjaCxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsQ29uZmlndXJlZEl0ZW1zKCk6IEZpZWxkTW9kYWxDb25maWd1cmVkSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZE1vZGFsRHJhZnRzLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbS5jb2x1bW4pO1xuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gaXRlbS5mdW5jdGlvbj8uZnVuY3Rpb25OYW1lPy50cmltKCkgPz8gRU1QVFlfVkFMVUU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgaWQ6IGAke2l0ZW0uY29sdW1ufS0ke2luZGV4fWAsXG4gICAgICAgIGNvbHVtbjogaXRlbS5jb2x1bW4sXG4gICAgICAgIHRhYmxlTGFiZWw6IHBhcnRzLnRhYmxlTGFiZWwsXG4gICAgICAgIGZpZWxkTGFiZWw6IHBhcnRzLmZpZWxkTGFiZWwsXG4gICAgICAgIGFsaWFzOiBpdGVtLmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgIHdpZHRoOiBpdGVtLndpZHRoPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgIGZ1bmN0aW9uTGFiZWw6IGZ1bmN0aW9uTmFtZVxuICAgICAgICAgID8gdGhpcy5yZXNvbHZlRnVuY3Rpb25MYWJlbChmdW5jdGlvbk5hbWUpXG4gICAgICAgICAgOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgZnVuY3Rpb25BbGlhczogaXRlbS5mdW5jdGlvbj8uYWxpYXM/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgZ2V0IGZpZWxkTW9kYWxIYXNTZWxlY3RhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZFNlbGVjdGFibGVDb2x1bW5zLnNvbWUoXG4gICAgICAoaXRlbSkgPT4gIXRoaXMuZmllbGRNb2RhbERyYWZ0cy5zb21lKChkcmFmdCkgPT4gZHJhZnQuY29sdW1uID09PSBpdGVtLnZhbHVlKVxuICAgICk7XG4gIH1cbiAgZ2V0IGZpZWxkTW9kYWxDYW5TZWxlY3RBbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRNb2RhbFNlbGVjdGlvblJvd3Muc29tZSgoaXRlbSkgPT4gIWl0ZW0uc2VsZWN0ZWQpO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsUGlja2xpc3RJdGVtcygpOiBDb2x1bW5QaWNrbGlzdEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRDb2x1bW5QaWNrbGlzdEl0ZW1zKHRoaXMuZmllbGRTZWxlY3RhYmxlQ29sdW1ucyk7XG4gIH1cbiAgZ2V0IGZpZWxkTW9kYWxTZWxlY3RlZFBpY2tsaXN0SWRzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZE1vZGFsRHJhZnRzXG4gICAgICAubWFwKChpdGVtKSA9PiB0aGlzLnJlc29sdmVDb2x1bW5QaWNrbGlzdElkKGl0ZW0uY29sdW1uKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChpdGVtKTogaXRlbSBpcyBudW1iZXIgPT4gdHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIgJiYgaXRlbSA+IDBcbiAgICAgICk7XG4gIH1cbiAgZ2V0IGZpZWxkTW9kYWxTZWxlY3Rpb25TdGVwQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkTW9kYWxTdGVwID09PSBcInNlbGVjdFwiO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRNb2RhbFN0ZXAgPT09IFwiY29uZmlndXJlXCI7XG4gIH1cbiAgZ2V0IGZpZWxkTW9kYWxUaW1lbGluZUFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uYWNjZXNzaWJpbGl0eS5maWVsZE1vZGFsVGltZWxpbmVgLFxuICAgICAgXCJFdGFwYXMgZGEgY29uZmlndXJhY2FvIGRvIGNhbXBvXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsVGltZWxpbmVJdGVtcygpOiBUaW1lbGluZUl0ZW1bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IFwic2VsZWN0XCIsXG4gICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjdGlvbnMuc2VsZWN0Q29sdW1uc2AsXG4gICAgICAgICAgXCJTZWxlY2lvbmFyIGNvbHVuYXNcIlxuICAgICAgICApLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmllbGRzLnN1YnRpdGxlYCxcbiAgICAgICAgICBcIkVzY29saGEgdW1hIG91IG1haXMgY29sdW5hcyBwYXJhIGV4cG9yIG5vIHJlc3VsdGFkby5cIlxuICAgICAgICApLFxuICAgICAgICBpbmRpY2F0b3JMYWJlbDogXCIxXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogXCJjb25maWd1cmVcIixcbiAgICAgICAgbGFiZWw6IHRoaXMuZmllbGRNb2RhbFRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmllbGQuc3VidGl0bGVgLFxuICAgICAgICAgIFwiQWp1c3RlIGFsaWFzLCBsYXJndXJhIGUgZnVuY2FvIGFudGVzIGRlIHNhbHZhciBvIGNhbXBvLlwiXG4gICAgICAgICksXG4gICAgICAgIGluZGljYXRvckxhYmVsOiBcIjJcIixcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmZpZWxkTW9kYWxEcmFmdHMubGVuZ3RoLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbFRpbWVsaW5lQXJpYUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5hY2Nlc3NpYmlsaXR5LmZpbHRlck1vZGFsVGltZWxpbmVgLFxuICAgICAgXCJFdGFwYXMgZGEgY29uZmlndXJhY2FvIGRvIGZpbHRyb1wiXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyTW9kYWxUaW1lbGluZUl0ZW1zKCk6IFRpbWVsaW5lSXRlbVtdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBpZDogXCJzZWxlY3RcIixcbiAgICAgICAgbGFiZWw6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLmZpbHRlci5zdGVwcy5zZWxlY3QudGl0bGVgLFxuICAgICAgICAgIFwiU2VsZWNpb25hciBiYXNlXCJcbiAgICAgICAgKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLmZpbHRlci5zdGVwcy5zZWxlY3Quc3VidGl0bGVgLFxuICAgICAgICAgIFwiRXNjb2xoYSBvIHRpcG8gZGUgZmlsdHJvIGUgZGVmaW5hIG8gY2FtcG8gaW5pY2lhbCBhbnRlcyBkZSBjb25maWd1cmFyLlwiXG4gICAgICAgICksXG4gICAgICAgIGluZGljYXRvckxhYmVsOiBcIjFcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBcImNvbmZpZ3VyZVwiLFxuICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmlsdGVyLnN0ZXBzLmNvbmZpZ3VyZS50aXRsZWAsXG4gICAgICAgICAgXCJDb25maWd1cmFyIGZpbHRyb1wiXG4gICAgICAgICksXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWx0ZXIuc3RlcHMuY29uZmlndXJlLnN1YnRpdGxlYCxcbiAgICAgICAgICBcIkRlZmluYSBvcGVyYWRvciwgdmFsb3IgZSBjb21wb3J0YW1lbnRvIGZpbmFsIGRvIGZpbHRyby5cIlxuICAgICAgICApLFxuICAgICAgICBpbmRpY2F0b3JMYWJlbDogXCIyXCIsXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5maWx0ZXJNb2RhbENhblByb2NlZWQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogXCJyZXZpZXdcIixcbiAgICAgICAgbGFiZWw6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLmZpbHRlci5zdGVwcy5yZXZpZXcudGl0bGVgLFxuICAgICAgICAgIFwiUmV2aXNhciByZWdyYVwiXG4gICAgICAgICksXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWx0ZXIuc3RlcHMucmV2aWV3LnN1YnRpdGxlYCxcbiAgICAgICAgICBcIkNvbmZpcm1lIG8gcmVzdW1vIGZpbmFsIGRhIHJlZ3JhIGFudGVzIGRlIHNhbHZhci5cIlxuICAgICAgICApLFxuICAgICAgICBpbmRpY2F0b3JMYWJlbDogXCIzXCIsXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5maWx0ZXJNb2RhbENhblJldmlldyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuICBnZXQgZmlsdGVyTW9kYWxDb25maWd1cmVBY3Rpb25MYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uYWN0aW9ucy5uZXh0U3RlcGAsXG4gICAgICBcIlByb3hpbWEgZXRhcGFcIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsUmV2aWV3QWN0aW9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjdGlvbnMucmV2aWV3UnVsZWAsXG4gICAgICBcIlJldmlzYXIgcmVncmFcIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsU2VsZWN0aW9uSGVscGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbHRlck1vZGFsTW9kZSA9PT0gRklMVEVSX01PREVfRE9NQUlOKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLmZpbHRlci5kb21haW5TZWxlY3Rpb25IaW50YCxcbiAgICAgICAgXCJBIGV4cHJlc3NhbyBkZSBkb21pbmlvIHNlcmEgY29uZmlndXJhZGEgbmEgcHJveGltYSBldGFwYS5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWx0ZXIuY29uZGl0aW9uU2VsZWN0aW9uSGludGAsXG4gICAgICBcIlNlbGVjaW9uZSB1bSBjYW1wbyBwYXJhIGxpYmVyYXIgYSBjb25maWd1cmFjYW8gZGV0YWxoYWRhIGRvIGZpbHRyby5cIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpZWxkTW9kYWxGdW5jdGlvbk9wdGlvbnMoKTogRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uW10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRleHQ6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLm5vbmVgLFxuICAgICAgICAgIFwiU2VtIGZ1bmNhb1wiXG4gICAgICAgICksXG4gICAgICAgIHZhbHVlOiBFTVBUWV9WQUxVRSxcbiAgICAgIH0sXG4gICAgICAuLi50aGlzLmZ1bmN0aW9uT3B0aW9ucyxcbiAgICBdO1xuICB9XG4gIGdldCBzb3J0SXRlbXMoKTogU29ydFZpZXdJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc29ydGluZy5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xuICAgICAgaWQ6IGAke2l0ZW0uY29sdW1ufS0ke2l0ZW0uZnVuY3Rpb25OYW1lID8/IEVNUFRZX1ZBTFVFfS0ke2l0ZW0uZGlyZWN0aW9ufS0ke2luZGV4fWAsXG4gICAgICAuLi50aGlzLnJlc29sdmVDb2x1bW5QYXJ0cyhpdGVtLmNvbHVtbiksXG4gICAgICBmdW5jdGlvbk5hbWU6IGl0ZW0uZnVuY3Rpb25OYW1lPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbkxhYmVsOiBpdGVtLmZ1bmN0aW9uTmFtZVxuICAgICAgICA/IHRoaXMucmVzb2x2ZUZ1bmN0aW9uTGFiZWwoaXRlbS5mdW5jdGlvbk5hbWUpXG4gICAgICAgIDogRU1QVFlfVkFMVUUsXG4gICAgICBkaXJlY3Rpb246IHRoaXMucmVzb2x2ZU9wdGlvbkxhYmVsKFxuICAgICAgICBpdGVtLmRpcmVjdGlvbixcbiAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uT3B0aW9uc1xuICAgICAgKSxcbiAgICB9KSk7XG4gIH1cbiAgZ2V0IGZpbHRlckl0ZW1zTGVnYWN5KCk6IHVua25vd25bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWx0ZXJzLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XG4gICAgICBpZDogYCR7aXRlbS52YWx1ZVR5cGV9LSR7aXRlbS5jb2x1bW59LSR7aW5kZXh9YCxcbiAgICAgIHRpdGxlOlxuICAgICAgICBpdGVtLnZhbHVlVHlwZSA9PT0gRklMVEVSX01PREVfRE9NQUlOXG4gICAgICAgICAgPyB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy5kb21haW5MYWJlbGAsXG4gICAgICAgICAgICBcIkV4cHJlc3NhbyBkZSBkb21pbmlvXCJcbiAgICAgICAgICApXG4gICAgICAgICAgOiBgJHt0aGlzLnJlc29sdmVDb2x1bW5MYWJlbChcbiAgICAgICAgICAgIGl0ZW0uY29sdW1uXG4gICAgICAgICAgKX0gwrcgJHt0aGlzLnJlc29sdmVGaWx0ZXJPcGVyYXRvckxhYmVsKGl0ZW0ub3BlcmF0b3IpfWAsXG4gICAgICBzdWJ0aXRsZTogdGhpcy5yZXNvbHZlRmlsdGVyRGlzcGxheVZhbHVlKGl0ZW0pLFxuICAgICAgb3B0aW9uYWw6IGl0ZW0ub3B0aW9uYWwsXG4gICAgfSkpO1xuICB9XG4gIGdldCBmaWx0ZXJJdGVtcygpOiBGaWx0ZXJWaWV3SXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPVxuICAgICAgICBpdGVtLnZhbHVlVHlwZSA9PT0gRklMVEVSX01PREVfRE9NQUlOXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICBkYkxhYmVsOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgICAgIHRhYmxlTGFiZWw6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZG9tYWluTGFiZWxgLFxuICAgICAgICAgICAgICBcIkV4cHJlc3NhbyBkZSBkb21pbmlvXCJcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBmaWVsZExhYmVsOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgICB9XG4gICAgICAgICAgOiB0aGlzLnJlc29sdmVDb2x1bW5QYXJ0cyhpdGVtLmNvbHVtbik7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBgJHtpdGVtLnZhbHVlVHlwZX0tJHtpdGVtLmNvbHVtbn0tJHtpbmRleH1gLFxuICAgICAgICAuLi5wYXJ0cyxcbiAgICAgICAgb3BlcmF0b3JMYWJlbDpcbiAgICAgICAgICBpdGVtLnZhbHVlVHlwZSA9PT0gRklMVEVSX01PREVfRE9NQUlOXG4gICAgICAgICAgICA/IEVNUFRZX1ZBTFVFXG4gICAgICAgICAgICA6IHRoaXMucmVzb2x2ZUZpbHRlck9wZXJhdG9yTGFiZWwoaXRlbS5vcGVyYXRvciksXG4gICAgICAgIHN1YnRpdGxlOiB0aGlzLnJlc29sdmVGaWx0ZXJEaXNwbGF5VmFsdWUoaXRlbSksXG4gICAgICAgIG9wdGlvbmFsOiBpdGVtLm9wdGlvbmFsLFxuICAgICAgICBpc0RvbWFpbjogaXRlbS52YWx1ZVR5cGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTixcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgZ2V0IHNlbGVjdGlvbk1vZGFsVGl0bGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RhbE1vZGUgPT09IFwidGFibGVzXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuc291cmNlcy50aXRsZWAsXG4gICAgICAgIEZBTExCQUNLX1NFTEVDVF9UQUJMRVNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGFsTW9kZSA9PT0gXCJmaWVsZHNcIikge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWVsZHMudGl0bGVgLFxuICAgICAgICBcIlNlbGVjaW9uYXIgY2FtcG9zXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLmdyb3VwQnkudGl0bGVgLFxuICAgICAgXCJTZWxlY2lvbmFyIEdyb3VwIEJ5XCJcbiAgICApO1xuICB9XG4gIGdldCBtb2RhbFNlYXJjaExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWVsZHMuc2VhcmNoYCxcbiAgICAgIFwiQnVzY2FyXCJcbiAgICApO1xuICB9XG4gIGdldCBtb2RhbFNlYXJjaFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuc2VhcmNoUGxhY2Vob2xkZXJgLFxuICAgICAgXCJCdXNjYXJcIlxuICAgICk7XG4gIH1cbiAgZ2V0IG1vZGFsTmFtZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWVsZHMubmFtZWAsXG4gICAgICBcIk5vbWVcIlxuICAgICk7XG4gIH1cbiAgZ2V0IG1vZGFsVHlwZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWVsZHMudHlwZWAsXG4gICAgICBcIlRpcG9cIlxuICAgICk7XG4gIH1cbiAgZ2V0IG1vZGFsU2VsZWN0TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjdGlvbnMuc2VsZWN0YCxcbiAgICAgIFwiU2VsZWNpb25hclwiXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyTW9kYWxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uY2FyZHMuZmlsdGVycy50aXRsZWAsXG4gICAgICBcIkZpbHRyb3NcIlxuICAgICk7XG4gIH1cbiAgZ2V0IHNvcnRNb2RhbFRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5jYXJkcy5zb3J0aW5nLnRpdGxlYCxcbiAgICAgIFwiT3JkZW5hY2FvXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWVsZC50aXRsZWAsXG4gICAgICBcIkNvbmZpZ3VyYXIgY2FtcG9cIlxuICAgICk7XG4gIH1cbiAgZ2V0IHNlbGVjdGlvbk1vZGFsUm93cygpOiBTZWxlY3Rpb25Sb3dbXSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kYWxNb2RlID09PSBcInRhYmxlc1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFRhYmxlU2VsZWN0aW9uUm93cyhcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyxcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbFNlYXJjaFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kYWxNb2RlID09PSBcImZpZWxkc1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZENvbHVtblNlbGVjdGlvblJvd3MoXG4gICAgICAgIHRoaXMuZmllbGRTZWxlY3RhYmxlQ29sdW1ucyxcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyxcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbFNlYXJjaFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRDb2x1bW5TZWxlY3Rpb25Sb3dzKFxuICAgICAgdGhpcy5ncm91cEJ5U2VsZWN0YWJsZUNvbHVtbnMsXG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGFsSWRzLFxuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbFNlYXJjaFxuICAgICk7XG4gIH1cbiAgZ2V0IHNlbGVjdGlvbk1vZGFsUGlja2xpc3RJdGVtcygpOiBDb2x1bW5QaWNrbGlzdEl0ZW1bXSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kYWxNb2RlID09PSBcImZpZWxkc1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZENvbHVtblBpY2tsaXN0SXRlbXModGhpcy5maWVsZFNlbGVjdGFibGVDb2x1bW5zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5idWlsZENvbHVtblBpY2tsaXN0SXRlbXModGhpcy5ncm91cEJ5U2VsZWN0YWJsZUNvbHVtbnMpO1xuICB9XG4gIGdldCBzZWxlY3Rpb25Nb2RhbFNlbGVjdGVkUGlja2xpc3RJZHMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGFsSWRzXG4gICAgICAubWFwKChpdGVtKSA9PiB0aGlzLnJlc29sdmVDb2x1bW5QaWNrbGlzdElkKGl0ZW0pKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGl0ZW0pOiBpdGVtIGlzIG51bWJlciA9PiB0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIiAmJiBpdGVtID4gMFxuICAgICAgKTtcbiAgfVxuICBnZXQgam9pblNvdXJjZVJvd3MoKTogU2VsZWN0aW9uUm93W10ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29sdW1uU2VsZWN0aW9uUm93cyhcbiAgICAgIHRoaXMuYXZhaWxhYmxlQ29sdW1ucyxcbiAgICAgIHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbiA/IFt0aGlzLmpvaW5EcmFmdC5zb3VyY2VDb2x1bW5dIDogW10sXG4gICAgICB0aGlzLmpvaW5Tb3VyY2VTZWFyY2gsXG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cbiAgZ2V0IGpvaW5Tb3VyY2VQaWNrbGlzdEl0ZW1zKCk6IENvbHVtblBpY2tsaXN0SXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZENvbHVtblBpY2tsaXN0SXRlbXModGhpcy5hdmFpbGFibGVDb2x1bW5zKTtcbiAgfVxuICBnZXQgam9pblNvdXJjZVNlbGVjdGVkUGlja2xpc3RJZHMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLnJlc29sdmVDb2x1bW5QaWNrbGlzdElkKHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbik7XG4gICAgcmV0dXJuIHR5cGVvZiBzZWxlY3RlZElkID09PSBcIm51bWJlclwiICYmIHNlbGVjdGVkSWQgPiAwXG4gICAgICA/IFtzZWxlY3RlZElkXVxuICAgICAgOiBbXTtcbiAgfVxuICBnZXQgam9pblRhcmdldFJvd3MoKTogU2VsZWN0aW9uUm93W10ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbih0aGlzLmpvaW5EcmFmdC5zb3VyY2VDb2x1bW4pO1xuICAgIGNvbnN0IGl0ZW1zID0gc291cmNlXG4gICAgICA/IHRoaXMuYXZhaWxhYmxlQ29sdW1ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udGFibGUgIT09IHNvdXJjZS50YWJsZSlcbiAgICAgIDogdGhpcy5hdmFpbGFibGVDb2x1bW5zO1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29sdW1uU2VsZWN0aW9uUm93cyhcbiAgICAgIGl0ZW1zLFxuICAgICAgdGhpcy5qb2luRHJhZnQudGFyZ2V0Q29sdW1uID8gW3RoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbl0gOiBbXSxcbiAgICAgIHRoaXMuam9pblRhcmdldFNlYXJjaCxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgfVxuICBnZXQgam9pblRhcmdldFNlbGVjdGFibGVDb2x1bW5zKCk6IER5bmFtaWNWaWV3QnVpbGRlckNvbHVtbk9wdGlvbltdIHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uKTtcbiAgICByZXR1cm4gc291cmNlXG4gICAgICA/IHRoaXMuYXZhaWxhYmxlQ29sdW1ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udGFibGUgIT09IHNvdXJjZS50YWJsZSlcbiAgICAgIDogdGhpcy5hdmFpbGFibGVDb2x1bW5zO1xuICB9XG4gIGdldCBqb2luVGFyZ2V0UGlja2xpc3RJdGVtcygpOiBDb2x1bW5QaWNrbGlzdEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRDb2x1bW5QaWNrbGlzdEl0ZW1zKHRoaXMuam9pblRhcmdldFNlbGVjdGFibGVDb2x1bW5zKTtcbiAgfVxuICBnZXQgam9pblRhcmdldFNlbGVjdGVkUGlja2xpc3RJZHMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLnJlc29sdmVDb2x1bW5QaWNrbGlzdElkKHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbik7XG4gICAgcmV0dXJuIHR5cGVvZiBzZWxlY3RlZElkID09PSBcIm51bWJlclwiICYmIHNlbGVjdGVkSWQgPiAwXG4gICAgICA/IFtzZWxlY3RlZElkXVxuICAgICAgOiBbXTtcbiAgfVxuICBnZXQgc29ydENvbHVtblJvd3MoKTogU2VsZWN0aW9uUm93W10ge1xuICAgIHJldHVybiB0aGlzLnNvcnRTZWxlY3RhYmxlSXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICAgIHRoaXMubWF0Y2hlc1NlYXJjaChcbiAgICAgICAgICBbaXRlbS50YWJsZUxhYmVsLCBpdGVtLmZpZWxkTGFiZWwsIGl0ZW0ubWV0YV0sXG4gICAgICAgICAgdGhpcy5zb3J0U2VhcmNoXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgICBuYW1lOiBpdGVtLmZpZWxkTGFiZWwsXG4gICAgICAgIG1ldGE6IGl0ZW0ubWV0YSxcbiAgICAgICAgc2VsZWN0ZWQ6XG4gICAgICAgICAgdGhpcy5zb3J0RHJhZnQuY29sdW1uID09PSBpdGVtLmNvbHVtbiAmJlxuICAgICAgICAgICh0aGlzLnNvcnREcmFmdC5mdW5jdGlvbk5hbWUgfHwgRU1QVFlfVkFMVUUpID09PSBpdGVtLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWJsZUxhYmVsOiBpdGVtLnRhYmxlTGFiZWwsXG4gICAgICAgIHBhdGhUeXBlOiBcImNvbHVtblwiIGFzIGNvbnN0LFxuICAgICAgfSkpO1xuICB9XG4gIGdldCBzb3J0UGlja2xpc3RJdGVtcygpOiBTb3J0UGlja2xpc3RJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLnNvcnRTZWxlY3RhYmxlSXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcbiAgICAgIGlkOiBpbmRleCArIDEsXG4gICAgICB0aXRsZTogYCR7aXRlbS50YWJsZUxhYmVsfS4ke2l0ZW0uZmllbGRMYWJlbH1gLFxuICAgICAgdGl0bGVQcmVmaXg6IGl0ZW0udGFibGVMYWJlbCxcbiAgICAgIHRpdGxlU3VmZml4OiBpdGVtLmZpZWxkTGFiZWwsXG4gICAgICB0aXRsZVByZWZpeENvbG9yOiBWSVNVQUxfU1FMX1RBQkxFX0NPTE9SLFxuICAgICAgdGl0bGVTdWZmaXhDb2xvcjogVklTVUFMX1NRTF9GSUVMRF9DT0xPUixcbiAgICAgIGJhZGdlOiBpdGVtLm1ldGEsXG4gICAgICBiYWRnZUNvbG9yOiBpdGVtLmZ1bmN0aW9uTmFtZVxuICAgICAgICA/IFBJQ0tMSVNUX0ZVTkNUSU9OX0JBREdFX0NPTE9SXG4gICAgICAgIDogUElDS0xJU1RfREFUQV9UWVBFX0JBREdFX0NPTE9SLFxuICAgICAgc2VsZWN0aW9uSWQ6IGl0ZW0uaWQsXG4gICAgICBjb2x1bW46IGl0ZW0uY29sdW1uLFxuICAgIH0pKTtcbiAgfVxuICBnZXQgc29ydFNlbGVjdGVkUGlja2xpc3RJZHMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zb3J0UGlja2xpc3RJdGVtcy5maW5kKFxuICAgICAgKGl0ZW0pID0+XG4gICAgICAgIGl0ZW0uY29sdW1uID09PSB0aGlzLnNvcnREcmFmdC5jb2x1bW4gJiZcbiAgICAgICAgaXRlbS5zZWxlY3Rpb25JZCA9PT1cbiAgICAgICAgdGhpcy5idWlsZFNvcnRTZWxlY3Rpb25JZChcbiAgICAgICAgICB0aGlzLnNvcnREcmFmdC5jb2x1bW4sXG4gICAgICAgICAgdGhpcy5zb3J0RHJhZnQuZnVuY3Rpb25OYW1lIHx8IEVNUFRZX1NPUlRfRlVOQ1RJT05cbiAgICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWQgPyBbc2VsZWN0ZWQuaWRdIDogW107XG4gIH1cbiAgZ2V0IGZpbHRlckNvbHVtblJvd3MoKTogU2VsZWN0aW9uUm93W10ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29sdW1uU2VsZWN0aW9uUm93cyhcbiAgICAgIHRoaXMuYXZhaWxhYmxlQ29sdW1ucyxcbiAgICAgIHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uID8gW3RoaXMuZmlsdGVyRHJhZnQuY29sdW1uXSA6IFtdLFxuICAgICAgdGhpcy5maWx0ZXJTZWFyY2gsXG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsUGlja2xpc3RJdGVtcygpOiBDb2x1bW5QaWNrbGlzdEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRDb2x1bW5QaWNrbGlzdEl0ZW1zKHRoaXMuYXZhaWxhYmxlQ29sdW1ucyk7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsU2VsZWN0ZWRQaWNrbGlzdElkcygpOiBudW1iZXJbXSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZCA9IHRoaXMucmVzb2x2ZUNvbHVtblBpY2tsaXN0SWQodGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4pO1xuICAgIHJldHVybiB0eXBlb2Ygc2VsZWN0ZWRJZCA9PT0gXCJudW1iZXJcIiAmJiBzZWxlY3RlZElkID4gMFxuICAgICAgPyBbc2VsZWN0ZWRJZF1cbiAgICAgIDogW107XG4gIH1cbiAgZ2V0IHNvcnRDb2x1bW5TdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc29ydERyYWZ0LmNvbHVtblxuICAgICAgPyB0aGlzLnJlc29sdmVTb3J0RHJhZnRMYWJlbCgpXG4gICAgICA6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LnN0YXRlcy5lbXB0eVNlbGVjdGlvbmAsXG4gICAgICAgIEZBTExCQUNLX0VNUFRZX1NFTEVDVElPTlxuICAgICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyQ29sdW1uU3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbHRlck1vZGFsTW9kZSA9PT0gRklMVEVSX01PREVfRE9NQUlOKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy5kb21haW5MYWJlbGAsXG4gICAgICAgIFwiRXhwcmVzc2FvIGRlIGRvbWluaW9cIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uXG4gICAgICA/IHRoaXMucmVzb2x2ZUNvbHVtblBhdGgodGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4pXG4gICAgICA6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LnN0YXRlcy5lbXB0eVNlbGVjdGlvbmAsXG4gICAgICAgIEZBTExCQUNLX0VNUFRZX1NFTEVDVElPTlxuICAgICAgKTtcbiAgfVxuICBnZXQgam9pblNvdXJjZVN1bW1hcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uXG4gICAgICA/IHRoaXMucmVzb2x2ZUNvbHVtblBhdGgodGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uKVxuICAgICAgOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5zdGF0ZXMuZW1wdHlTZWxlY3Rpb25gLFxuICAgICAgICBGQUxMQkFDS19FTVBUWV9TRUxFQ1RJT05cbiAgICAgICk7XG4gIH1cbiAgZ2V0IGpvaW5UYXJnZXRTdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtblxuICAgICAgPyB0aGlzLnJlc29sdmVDb2x1bW5QYXRoKHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbilcbiAgICAgIDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLmVtcHR5U2VsZWN0aW9uYCxcbiAgICAgICAgRkFMTEJBQ0tfRU1QVFlfU0VMRUNUSU9OXG4gICAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJPcGVyYXRvck9wdGlvbnMoKTogRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uW10ge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbih0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbik7XG4gICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyT3BlcmF0b3JzRm9yQ29sdW1uKGNvbHVtbikubWFwKCh2YWx1ZSkgPT4gKHtcbiAgICAgIHZhbHVlLFxuICAgICAgdGV4dDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeFxuICAgICAgICB9LmZpbHRlcnMub3BlcmF0b3JzLiR7dmFsdWUudG9Mb3dlckNhc2UoKX1gLFxuICAgICAgICB0aGlzLmh1bWFuaXplS2V5KHZhbHVlKVxuICAgICAgKSxcbiAgICB9KSk7XG4gIH1cbiAgZ2V0IG5vcm1hbGl6ZWRGaWVsZHMoKTogRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWVsZHMubWFwKChpdGVtKSA9PlxuICAgICAgdGhpcy5ub3JtYWxpemVHZW5lcmF0ZWRGaWVsZChpdGVtKVxuICAgICk7XG4gIH1cbiAgZ2V0IHNlbGVjdGVkU29ydERpcmVjdGlvbkl0ZW0oKTogU2VsZWN0QnV0dG9uSXRlbTxzdHJpbmc+IHwgbnVsbCB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW1zLmZpbmQoXG4gICAgICAgIChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSB0aGlzLnNvcnREcmFmdC5kaXJlY3Rpb25cbiAgICAgICkgPz8gbnVsbFxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlckV4cHJlc3Npb25TdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmlsdGVyTW9kYWxNb2RlID09PSBGSUxURVJfTU9ERV9ET01BSU4pIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlckRyYWZ0LmRvbWFpbkV4cHJlc3Npb24udHJpbSgpO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbHRlckRyYWZ0LmNvbHVtblxuICAgICAgPyB0aGlzLnJlc29sdmVDb2x1bW5QYXRoKHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uKVxuICAgICAgOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5zdGF0ZXMuZW1wdHlTZWxlY3Rpb25gLFxuICAgICAgICBGQUxMQkFDS19FTVBUWV9TRUxFQ1RJT05cbiAgICAgICk7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSB0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yXG4gICAgICA/IHRoaXMucmVzb2x2ZUZpbHRlck9wZXJhdG9yTGFiZWwodGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvcilcbiAgICAgIDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLmVtcHR5U2VsZWN0aW9uYCxcbiAgICAgICAgRkFMTEJBQ0tfRU1QVFlfU0VMRUNUSU9OXG4gICAgICApO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZXNvbHZlRmlsdGVyRHJhZnREaXNwbGF5VmFsdWUoKTtcbiAgICByZXR1cm4gW2NvbHVtbiwgb3BlcmF0b3IsIHZhbHVlXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiB8IFwiKTtcbiAgfVxuICBnZXQgZmlsdGVyQ29uZmlndXJhdGlvblN1bW1hcnlMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZpbHRlck1vZGFsTW9kZSA9PT0gRklMVEVSX01PREVfRE9NQUlOXG4gICAgICA/IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZG9tYWluTGFiZWxgLFxuICAgICAgICBcIkV4cHJlc3NhbyBkZSBkb21pbmlvXCJcbiAgICAgIClcbiAgICAgIDogdGhpcy5maWx0ZXJDb2x1bW5TdW1tYXJ5O1xuICB9XG4gIGdldCBmaWx0ZXJCYWNrVG9TZWxlY3Rpb25MYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uYWN0aW9ucy5iYWNrVG9TZWxlY3Rpb25gLFxuICAgICAgXCJWb2x0YXIgcGFyYSBzZWxlY2FvXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJCYWNrVG9Db25maWd1cmF0aW9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjdGlvbnMuYmFja1RvQ29uZmlndXJhdGlvbmAsXG4gICAgICBcIlZvbHRhciBwYXJhIGNvbmZpZ3VyYWNhb1wiXG4gICAgKTtcbiAgfVxuICBnZXQgcHJldmlld0NvbHVtbnMoKTogVGFibGVDb2x1bW5bXSB7XG4gICAgY29uc3QgY29uZmlnQ29sdW1ucyA9IHRoaXMucmVzb2x2ZVByZXZpZXdDb2x1bW5zKCk7XG4gICAgcmV0dXJuIGNvbmZpZ0NvbHVtbnMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgZmllbGQ6IGl0ZW0uZmllbGQsXG4gICAgICBoZWFkZXI6IGl0ZW0uaGVhZGVyID8/IGl0ZW0uZmllbGQsXG4gICAgICB0eXBlOiAoaXRlbS50eXBlIGFzIFRhYmxlQ29sdW1uW1widHlwZVwiXSkgPz8gXCJ0ZXh0XCIsXG4gICAgfSkpO1xuICB9XG4gIGdldCBwcmV2aWV3Um93cygpOiBSb3dCYXNlW10ge1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMucHJldmlld0NvbHVtbnNcbiAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uZmllbGQpXG4gICAgICAuZmlsdGVyKChmaWVsZCk6IGZpZWxkIGlzIHN0cmluZyA9PiB0eXBlb2YgZmllbGQgPT09IFwic3RyaW5nXCIpO1xuICAgIGNvbnN0IHJvd3MgPSAoKHRoaXMuY29uZmlnLnByZXZpZXc/LnJvd3MgPz8gW10pIGFzIFJvd0Jhc2VbXSkubWFwKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IG5leHQ6IFJvd0Jhc2UgPSB7fTtcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICBuZXh0W2ZpZWxkXSA9IHJvd1tmaWVsZF0gPz8gRU1QVFlfVkFMVUU7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0pO1xuICAgIGlmIChyb3dzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfVxuICAgIGlmICghZmllbGRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogNSB9KS5tYXAoKF8sIHJvd0luZGV4KSA9PiB7XG4gICAgICBjb25zdCBuZXh0OiBSb3dCYXNlID0ge307XG4gICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgbmV4dFtmaWVsZF0gPSBgJHtmaWVsZH1fJHtyb3dJbmRleCArIDF9YDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfSk7XG4gIH1cbiAgZ2V0IHByZXZpZXdUYWJsZUNvbmZpZygpOiBUYWJsZU9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICByb3dzOiBEWU5BTUlDX1ZJRVdfQlVJTERFUl9ERUZBVUxUX1RBQkxFX1JPV1MsXG4gICAgICBzaG93Um93c1BlclBhZ2VPcHRpb25zOiB0cnVlLFxuICAgICAgcm93c1BlclBhZ2VPcHRpb25zOiBQUkVWSUVXX1JPV1NfUEVSX1BBR0VfT1BUSU9OUyxcbiAgICAgIGVtcHR5VGl0bGU6IGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5lbXB0eS5wcmV2aWV3VGl0bGVgLFxuICAgICAgZW1wdHlTdWJ0aXRsZTogYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmVtcHR5LnByZXZpZXdUZXh0YCxcbiAgICB9IGFzIFRhYmxlT3B0aW9ucztcbiAgfVxuICBnZXQgc3FsUHJldmlldygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGdlbmVyYXRlZFNxbCA9IHRoaXMuYnVpbGRHZW5lcmF0ZWRTcWwoKTtcbiAgICBpZiAoZ2VuZXJhdGVkU3FsKSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVkU3FsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWcubWFudWFsPy5zcWwgPz8gRU1QVFlfVkFMVUU7XG4gIH1cbiAgZ2V0IHNxbFByZXZpZXdIZWlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXRNb2RlID09PSBcInNwbGl0XCIgPyBcIjEwMCVcIiA6IFwiMjRyZW1cIjtcbiAgfVxuICBnZXQgc3FsUHJldmlld1BhbmVsSGVpZ2h0KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmxheW91dE1vZGUgPT09IFwic3BsaXRcIlxuICAgICAgPyB0aGlzLm1lYXN1cmVkU3BsaXRQcmV2aWV3SGVpZ2h0XG4gICAgICA6IG51bGw7XG4gIH1cbiAgZ2V0IHByZXZpZXdUb2dnbGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uYWN0aW9ucy4ke3RoaXMucHJldmlld1Zpc2libGUgPyBcImhpZGVQcmV2aWV3XCIgOiBcInNob3dQcmV2aWV3XCJcbiAgICAgIH1gLFxuICAgICAgdGhpcy5wcmV2aWV3VmlzaWJsZSA/IFwiT2N1bHRhciBwcmV2aWV3XCIgOiBcIlZpc3VhbGl6YXIgcHJldmlld1wiXG4gICAgKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRGaWx0ZXJNb2RlSXRlbSgpOiBTZWxlY3RCdXR0b25JdGVtPEZpbHRlck1vZGFsTW9kZT4gfCBudWxsIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5maWx0ZXJNb2RlSXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdGhpcy5maWx0ZXJNb2RhbE1vZGUpID8/XG4gICAgICBudWxsXG4gICAgKTtcbiAgfVxuICB0cmFja0J5SWQoXzogbnVtYmVyLCBpdGVtOiB7IGlkOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0uaWQ7XG4gIH1cbiAgdHJhY2tCeUFycm93KF86IG51bWJlciwgaXRlbTogQnVpbGRlckZsb3dBcnJvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0uaWQ7XG4gIH1cbiAgb25MYXlvdXRNb2RlQ2hhbmdlKGl0ZW1zOiBTZWxlY3RCdXR0b25JdGVtPEJ1aWxkZXJMYXlvdXRNb2RlPltdKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IGl0ZW1zWzBdPy52YWx1ZTtcbiAgICBpZiAobmV4dCA9PT0gXCJzdGFja2VkXCIgfHwgbmV4dCA9PT0gXCJzcGxpdFwiKSB7XG4gICAgICB0aGlzLmxheW91dE1vZGUgPSBuZXh0O1xuICAgICAgdGhpcy5zeW5jU2VsZWN0ZWRMYXlvdXRNb2RlSXRlbXMoKTtcbiAgICAgIHRoaXMuZmxvd1NlcnZpY2Uuc2NoZWR1bGVGbG93QXJyb3dSZWZyZXNoKHRoaXMuZmxvd0NvbnRleHQpO1xuICAgIH1cbiAgfVxuICB0b2dnbGVQcmV2aWV3KCk6IHZvaWQge1xuICAgIHRoaXMucHJldmlld1Zpc2libGUgPSAhdGhpcy5wcmV2aWV3VmlzaWJsZTtcbiAgICB0aGlzLmZsb3dTZXJ2aWNlLnNjaGVkdWxlRmxvd0Fycm93UmVmcmVzaCh0aGlzLmZsb3dDb250ZXh0KTtcbiAgfVxuICBvblNvcnREaXJlY3Rpb25DaGFuZ2UoaXRlbXM6IFNlbGVjdEJ1dHRvbkl0ZW08c3RyaW5nPltdKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IGl0ZW1zWzBdPy52YWx1ZTtcbiAgICBpZiAobmV4dCkge1xuICAgICAgdGhpcy5zb3J0RHJhZnQuZGlyZWN0aW9uID0gbmV4dDtcbiAgICAgIHRoaXMuc3luY1NlbGVjdGVkU29ydERpcmVjdGlvbkl0ZW1zKCk7XG4gICAgfVxuICB9XG4gIGlzRmllbGREcm9wSW5kaWNhdG9yVmlzaWJsZShpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ2dpbmdGaWVsZEluZGV4ICE9PSBudWxsICYmIHRoaXMuZHJhZ1ByZXZpZXdJbmRleCA9PT0gaW5kZXg7XG4gIH1cbiAgaXNGaWVsZERyb3BJbmRpY2F0b3JBdEVuZFZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZHJhZ2dpbmdGaWVsZEluZGV4ICE9PSBudWxsICYmXG4gICAgICB0aGlzLmRyYWdQcmV2aWV3SW5kZXggPT09IHRoaXMuZmllbGRJdGVtcy5sZW5ndGhcbiAgICApO1xuICB9XG4gIG9uRmllbGREcmFnU3RhcnQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZHJhZ2dpbmdGaWVsZEluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5kcmFnUHJldmlld0luZGV4ID0gdGhpcy5nZXRGaWVsZFByZXZpZXdTb3VyY2VJbmRleGVzKCkuaW5kZXhPZihpbmRleCk7XG4gIH1cbiAgb25GaWVsZERyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghdGFyZ2V0IHx8IHRoaXMuZHJhZ2dpbmdGaWVsZEluZGV4ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgc2hvdWxkSW5zZXJ0QWZ0ZXIgPSBldmVudC5jbGllbnRYID4gcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDI7XG4gICAgdGhpcy5kcmFnUHJldmlld0luZGV4ID0gTWF0aC5taW4oXG4gICAgICBpbmRleCArIChzaG91bGRJbnNlcnRBZnRlciA/IDEgOiAwKSxcbiAgICAgIHRoaXMuZmllbGRJdGVtcy5sZW5ndGhcbiAgICApO1xuICB9XG4gIG9uRmllbGREcm9wKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyYWdnaW5nRmllbGRJbmRleCA9PT0gbnVsbCB8fCB0aGlzLmRyYWdQcmV2aWV3SW5kZXggPT09IG51bGwpIHtcbiAgICAgIHRoaXMuZHJhZ2dpbmdGaWVsZEluZGV4ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhZ1ByZXZpZXdJbmRleCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByZXZpZXdJbmRleGVzID0gdGhpcy5nZXRGaWVsZFByZXZpZXdTb3VyY2VJbmRleGVzKCk7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpZWxkcyA9IHByZXZpZXdJbmRleGVzLm1hcChcbiAgICAgIChpdGVtSW5kZXgpID0+IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWVsZHNbaXRlbUluZGV4XVxuICAgICk7XG4gICAgdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggPSBudWxsO1xuICAgIHRoaXMuZHJhZ1ByZXZpZXdJbmRleCA9IG51bGw7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIG9uRmllbGREcmFnRW5kKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhZ2dpbmdGaWVsZEluZGV4ID0gbnVsbDtcbiAgICB0aGlzLmRyYWdQcmV2aWV3SW5kZXggPSBudWxsO1xuICB9XG4gIG9wZW5GaWVsZE1vZGFsKGluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9XG4gICAgICB0eXBlb2YgaW5kZXggPT09IFwibnVtYmVyXCIgPyB0aGlzLm5vcm1hbGl6ZWRGaWVsZHNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRyYWZ0cyA9IHRoaXMuZ2V0T3JkZXJlZEZpZWxkRW50cmllcygpLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIGNvbHVtbjogaXRlbS5jb2x1bW4sXG4gICAgICBhbGlhczogaXRlbS5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgd2lkdGg6IGl0ZW0ud2lkdGg/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIGZ1bmN0aW9uOiBpdGVtLmZ1bmN0aW9uXG4gICAgICAgID8ge1xuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogaXRlbS5mdW5jdGlvbi5mdW5jdGlvbk5hbWU/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgICAgICBhbGlhczogaXRlbS5mdW5jdGlvbi5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICB9XG4gICAgICAgIDogbnVsbCxcbiAgICB9KSk7XG4gICAgY29uc3Qgb3BlbkF0U3RlcDogRmllbGRNb2RhbFN0ZXAgPVxuICAgICAgdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiICYmIGN1cnJlbnQgPyBcImNvbmZpZ3VyZVwiIDogXCJzZWxlY3RcIjtcbiAgICB0aGlzLmZpZWxkTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5vcGVuRmllbGRNb2RhbChkcmFmdHMsIG9wZW5BdFN0ZXApO1xuICB9XG4gIG9wZW5GaWVsZENvbmZpZ3VyYXRpb25Nb2RhbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuT3BlbkZpZWxkQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3BlbkZpZWxkTW9kYWwoMCk7XG4gIH1cbiAgY2xvc2VGaWVsZE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuZmllbGRNb2RhbFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmNsb3NlRmllbGRNb2RhbCgpO1xuICB9XG4gIGdvVG9GaWVsZE1vZGFsU3RlcChzdGVwOiBGaWVsZE1vZGFsU3RlcCk6IHZvaWQge1xuICAgIGlmIChzdGVwID09PSBcInNlbGVjdFwiKSB7XG4gICAgICB0aGlzLmZpZWxkTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZ29Ub0ZpZWxkTW9kYWxTdGVwKHN0ZXApO1xuICB9XG4gIGFkdmFuY2VGaWVsZE1vZGFsU3RlcCgpOiB2b2lkIHtcbiAgICB0aGlzLmdvVG9GaWVsZE1vZGFsU3RlcChcImNvbmZpZ3VyZVwiKTtcbiAgfVxuICBvbkZpZWxkTW9kYWxUaW1lbGluZVN0ZXBTZWxlY3QoZXZlbnQ6IFRpbWVsaW5lU3RlcFNlbGVjdEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5nb1RvRmllbGRNb2RhbFN0ZXAoZXZlbnQuaXRlbS5pZCA9PT0gXCJjb25maWd1cmVcIiA/IFwiY29uZmlndXJlXCIgOiBcInNlbGVjdFwiKTtcbiAgfVxuICBzZWxlY3RGaWVsZE1vZGFsQ29sdW1uKGNvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RhdGVTZXJ2aWNlLmZpZWxkTW9kYWxEcmFmdHMuZmluZCgoaXRlbSkgPT4gaXRlbS5jb2x1bW4gPT09IGNvbHVtbik7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHRoaXMucmVtb3ZlRmllbGRNb2RhbERyYWZ0KGNvbHVtbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRNb2RhbERyYWZ0cyA9IFtcbiAgICAgIC4uLnRoaXMuc3RhdGVTZXJ2aWNlLmZpZWxkTW9kYWxEcmFmdHMsXG4gICAgICB7XG4gICAgICAgIGNvbHVtbixcbiAgICAgICAgYWxpYXM6IEVNUFRZX1ZBTFVFLFxuICAgICAgICB3aWR0aDogRU1QVFlfVkFMVUUsXG4gICAgICAgIGZ1bmN0aW9uOiBudWxsLFxuICAgICAgfSxcbiAgICBdO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uID0gbnVsbDtcbiAgfVxuICBzZWxlY3RBbGxGaWVsZE1vZGFsQ29sdW1ucygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZENvbHVtbnMgPSBuZXcgU2V0KFxuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRNb2RhbERyYWZ0cy5tYXAoKGl0ZW0pID0+IGl0ZW0uY29sdW1uKVxuICAgICk7XG4gICAgY29uc3Qgcm93c1RvU2VsZWN0ID0gdGhpcy5maWVsZFNlbGVjdGFibGVDb2x1bW5zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiAhc2VsZWN0ZWRDb2x1bW5zLmhhcyhpdGVtLnZhbHVlKVxuICAgICk7XG5cbiAgICBpZiAoIXJvd3NUb1NlbGVjdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlU2VydmljZS5maWVsZE1vZGFsRHJhZnRzID0gW1xuICAgICAgLi4udGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRNb2RhbERyYWZ0cyxcbiAgICAgIC4uLnJvd3NUb1NlbGVjdC5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgIGNvbHVtbjogaXRlbS52YWx1ZSxcbiAgICAgICAgYWxpYXM6IEVNUFRZX1ZBTFVFLFxuICAgICAgICB3aWR0aDogRU1QVFlfVkFMVUUsXG4gICAgICAgIGZ1bmN0aW9uOiBudWxsLFxuICAgICAgfSkpLFxuICAgIF07XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRGdW5jdGlvbkVkaXRDb2x1bW4gPSBudWxsO1xuICB9XG4gIGFkZEFub3RoZXJGaWVsZEZyb21Nb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpZWxkTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5maWVsZE1vZGFsU3RlcCA9IFwic2VsZWN0XCI7XG4gIH1cbiAgb25GaWVsZE1vZGFsU2VsZWN0ZWRJZHNDaGFuZ2UoaWRzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IG5ldyBTZXQoXG4gICAgICBpZHNcbiAgICAgICAgLm1hcCgoaXRlbSkgPT4gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RDb2x1bW4oaXRlbSkpXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiAhIWl0ZW0pXG4gICAgKTtcbiAgICBjb25zdCBwcmVzZXJ2ZWREcmFmdHMgPSB0aGlzLnN0YXRlU2VydmljZS5maWVsZE1vZGFsRHJhZnRzLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgIHNlbGVjdGVkQ29sdW1ucy5oYXMoaXRlbS5jb2x1bW4pXG4gICAgKTtcbiAgICBjb25zdCBwcmVzZXJ2ZWRDb2x1bW5zID0gbmV3IFNldChcbiAgICAgIHByZXNlcnZlZERyYWZ0cy5tYXAoKGl0ZW0pID0+IGl0ZW0uY29sdW1uKVxuICAgICk7XG4gICAgY29uc3QgYXBwZW5kZWREcmFmdHMgPSB0aGlzLmZpZWxkU2VsZWN0YWJsZUNvbHVtbnNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgIHNlbGVjdGVkQ29sdW1ucy5oYXMoaXRlbS52YWx1ZSkgJiYgIXByZXNlcnZlZENvbHVtbnMuaGFzKGl0ZW0udmFsdWUpXG4gICAgICApXG4gICAgICAubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBjb2x1bW46IGl0ZW0udmFsdWUsXG4gICAgICAgIGFsaWFzOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgd2lkdGg6IEVNUFRZX1ZBTFVFLFxuICAgICAgICBmdW5jdGlvbjogbnVsbCxcbiAgICAgIH0pKTtcblxuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmZpZWxkTW9kYWxEcmFmdHMgPSBbLi4ucHJlc2VydmVkRHJhZnRzLCAuLi5hcHBlbmRlZERyYWZ0c107XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlU2VydmljZS5maWVsZEZ1bmN0aW9uRWRpdENvbHVtbiAmJlxuICAgICAgIXNlbGVjdGVkQ29sdW1ucy5oYXModGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRGdW5jdGlvbkVkaXRDb2x1bW4pXG4gICAgKSB7XG4gICAgICB0aGlzLmNhbmNlbEZpZWxkRnVuY3Rpb25FZGl0KCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YXRlU2VydmljZS5maWVsZE1vZGFsRHJhZnRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRNb2RhbFN0ZXAgPSBcInNlbGVjdFwiO1xuICAgIH1cbiAgfVxuICBvbkZpZWxkTW9kYWxBbGlhc0NoYW5nZShjb2x1bW46IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucGF0Y2hGaWVsZE1vZGFsRHJhZnQoY29sdW1uLCB7IGFsaWFzOiB2YWx1ZSB9KTtcbiAgfVxuICBvbkZpZWxkTW9kYWxXaWR0aENoYW5nZShjb2x1bW46IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucGF0Y2hGaWVsZE1vZGFsRHJhZnQoY29sdW1uLCB7IHdpZHRoOiB2YWx1ZSB9KTtcbiAgfVxuICByZW1vdmVGaWVsZE1vZGFsRHJhZnQoY29sdW1uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5maWVsZE1vZGFsRHJhZnRzID0gdGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRNb2RhbERyYWZ0cy5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gaXRlbS5jb2x1bW4gIT09IGNvbHVtblxuICAgICk7XG4gICAgaWYgKHRoaXMuc3RhdGVTZXJ2aWNlLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uID09PSBjb2x1bW4pIHtcbiAgICAgIHRoaXMuY2FuY2VsRmllbGRGdW5jdGlvbkVkaXQoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnN0YXRlU2VydmljZS5maWVsZE1vZGFsRHJhZnRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRNb2RhbFN0ZXAgPSBcInNlbGVjdFwiO1xuICAgIH1cbiAgfVxuICBzdGFydEZpZWxkRnVuY3Rpb25FZGl0KGNvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RhdGVTZXJ2aWNlLmZpZWxkTW9kYWxEcmFmdHMuZmluZCgoaXRlbSkgPT4gaXRlbS5jb2x1bW4gPT09IGNvbHVtbik7XG4gICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uID0gY29sdW1uO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmZpZWxkRnVuY3Rpb25EcmFmdCA9IHtcbiAgICAgIGNvbHVtbixcbiAgICAgIGZ1bmN0aW9uTmFtZTogY3VycmVudC5mdW5jdGlvbj8uZnVuY3Rpb25OYW1lPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbkFsaWFzOiBjdXJyZW50LmZ1bmN0aW9uPy5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgIH07XG4gIH1cbiAgY2FuY2VsRmllbGRGdW5jdGlvbkVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRGdW5jdGlvbkVkaXRDb2x1bW4gPSBudWxsO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmZpZWxkRnVuY3Rpb25EcmFmdCA9IHtcbiAgICAgIGNvbHVtbjogRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbk5hbWU6IEVNUFRZX1ZBTFVFLFxuICAgICAgZnVuY3Rpb25BbGlhczogRU1QVFlfVkFMVUUsXG4gICAgfTtcbiAgfVxuICBvbkZpZWxkRnVuY3Rpb25EcmFmdE5hbWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uTmFtZSA9IHZhbHVlO1xuICAgIHRoaXMub25GaWVsZEZ1bmN0aW9uTmFtZUNoYW5nZSgpO1xuICB9XG4gIHNhdmVGaWVsZEZ1bmN0aW9uRWRpdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZmllbGRGdW5jdGlvbkVkaXRDb2x1bW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXRjaEZpZWxkTW9kYWxEcmFmdCh0aGlzLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uLCB7XG4gICAgICBmdW5jdGlvbjogdGhpcy5idWlsZEZpZWxkRnVuY3Rpb25EcmFmdCgpLFxuICAgIH0pO1xuICAgIHRoaXMuY2FuY2VsRmllbGRGdW5jdGlvbkVkaXQoKTtcbiAgfVxuICBpc0ZpZWxkRnVuY3Rpb25FZGl0aW5nKGNvbHVtbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRGdW5jdGlvbkVkaXRDb2x1bW4gPT09IGNvbHVtbjtcbiAgfVxuICBzYXZlRmllbGQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblNhdmVGaWVsZE1vZGFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWVsZHMgPSB0aGlzLnN0YXRlU2VydmljZS5maWVsZE1vZGFsRHJhZnRzLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIGNvbHVtbjogaXRlbS5jb2x1bW4sXG4gICAgICBhbGlhczogaXRlbS5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgd2lkdGg6IGl0ZW0ud2lkdGg/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIGZ1bmN0aW9uOiBpdGVtLmZ1bmN0aW9uPy5mdW5jdGlvbk5hbWU/LnRyaW0oKVxuICAgICAgICA/IHtcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6IGl0ZW0uZnVuY3Rpb24uZnVuY3Rpb25OYW1lLnRyaW0oKSxcbiAgICAgICAgICBhbGlhczogaXRlbS5mdW5jdGlvbi5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICB9XG4gICAgICAgIDogbnVsbCxcbiAgICB9KSk7XG4gICAgdGhpcy5jbG9zZUZpZWxkTW9kYWwoKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb3BlblNvdXJjZU1vZGFsKHN0ZXA6IFNvdXJjZU1vZGFsU3RlcCA9IFwic2VsZWN0XCIpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5vcGVuU291cmNlTW9kYWwoXG4gICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcyxcbiAgICAgICh0YWJsZSkgPT4gdGhpcy5yZXNvbHZlRGVmYXVsdFNvdXJjZUFsaWFzKHRhYmxlKSxcbiAgICAgIHN0ZXBcbiAgICApO1xuICB9XG4gIG9wZW5Tb3VyY2VDb25maWd1cmF0aW9uTW9kYWwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbk9wZW5Tb3VyY2VDb25maWd1cmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuU291cmNlTW9kYWwoXCJjb25maWd1cmVcIik7XG4gIH1cbiAgY2xvc2VTb3VyY2VNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbG9zZVNvdXJjZU1vZGFsKCk7XG4gIH1cbiAgZ29Ub1NvdXJjZU1vZGFsU3RlcChzdGVwOiBTb3VyY2VNb2RhbFN0ZXApOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5nb1RvU291cmNlTW9kYWxTdGVwKHN0ZXApO1xuICB9XG4gIGFkdmFuY2VTb3VyY2VNb2RhbFN0ZXAoKTogdm9pZCB7XG4gICAgdGhpcy5nb1RvU291cmNlTW9kYWxTdGVwKFwiY29uZmlndXJlXCIpO1xuICB9XG4gIG9uU291cmNlTW9kYWxUaW1lbGluZVN0ZXBTZWxlY3QoZXZlbnQ6IFRpbWVsaW5lU3RlcFNlbGVjdEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5nb1RvU291cmNlTW9kYWxTdGVwKFxuICAgICAgZXZlbnQuaXRlbS5pZCA9PT0gXCJjb25maWd1cmVcIiA/IFwiY29uZmlndXJlXCIgOiBcInNlbGVjdFwiXG4gICAgKTtcbiAgfVxuICBvblNvdXJjZU1vZGFsU2VsZWN0ZWRJZHNDaGFuZ2UoaWRzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkVGFibGVzID0gdGhpcy5yZXNvbHZlVGFibGVzRnJvbVBpY2tsaXN0SWRzKGlkcyk7XG4gICAgY29uc3QgZHJhZnRCeVRhYmxlID0gbmV3IE1hcChcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNvdXJjZU1vZGFsRHJhZnRzLm1hcCgoaXRlbSkgPT4gW2l0ZW0udGFibGUsIGl0ZW1dKVxuICAgICk7XG5cbiAgICB0aGlzLnN0YXRlU2VydmljZS5zb3VyY2VNb2RhbERyYWZ0cyA9IHNlbGVjdGVkVGFibGVzLm1hcCgodGFibGUpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkcmFmdEJ5VGFibGUuZ2V0KHRhYmxlKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGN1cnJlbnQgPz8ge1xuICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgIGFsaWFzOiB0aGlzLnJlc29sdmVEZWZhdWx0U291cmNlQWxpYXModGFibGUpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLnN0YXRlU2VydmljZS5zb3VyY2VNb2RhbERyYWZ0cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNvdXJjZU1vZGFsU3RlcCA9IFwic2VsZWN0XCI7XG4gICAgfVxuICB9XG4gIG9uU291cmNlTW9kYWxBbGlhc0NoYW5nZSh0YWJsZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc291cmNlTW9kYWxEcmFmdHMgPSB0aGlzLnN0YXRlU2VydmljZS5zb3VyY2VNb2RhbERyYWZ0cy5tYXAoKGl0ZW0pID0+XG4gICAgICBpdGVtLnRhYmxlID09PSB0YWJsZVxuICAgICAgICA/IHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIGFsaWFzOiB2YWx1ZSxcbiAgICAgICAgfVxuICAgICAgICA6IGl0ZW1cbiAgICApO1xuICB9XG4gIHNhdmVTb3VyY2VNb2RhbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhdGVTZXJ2aWNlLnNvdXJjZU1vZGFsRHJhZnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzID0gdGhpcy5zdGF0ZVNlcnZpY2Uuc291cmNlTW9kYWxEcmFmdHMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHRoaXMucmVzb2x2ZVRhYmxlT3B0aW9uKGl0ZW0udGFibGUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFibGU6IGl0ZW0udGFibGUsXG4gICAgICAgIGFsaWFzOiBpdGVtLmFsaWFzPy50cmltKCkgfHwgdGhpcy5yZXNvbHZlRGVmYXVsdFNvdXJjZUFsaWFzKGl0ZW0udGFibGUpLCAvLyBOT1NPTkFSXG4gICAgICAgIHNjaGVtYTogdGFibGU/LnNjaGVtYSxcbiAgICAgICAgbGFiZWw6IHRhYmxlPy5kaXNwbGF5TmFtZSB8fCB0YWJsZT8udGV4dCwgLy8gTk9TT05BUlxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2xvc2VTb3VyY2VNb2RhbCgpO1xuICAgIHRoaXMuYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTtcbiAgfVxuICBvcGVuU2VsZWN0aW9uTW9kYWwobW9kZTogU2VsZWN0aW9uTW9kYWxNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RhbE1vZGUgPSBtb2RlO1xuICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICBpZiAobW9kZSA9PT0gXCJ0YWJsZXNcIikge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyA9IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLm1hcChcbiAgICAgICAgKGl0ZW0pID0+IGl0ZW0udGFibGVcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSBcImZpZWxkc1wiKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGFsSWRzID0gdGhpcy5ub3JtYWxpemVkRmllbGRzLm1hcCgoaXRlbSkgPT4gaXRlbS5jb2x1bW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGFsSWRzID0gWy4uLnRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5XTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RhbFZpc2libGUgPSB0cnVlO1xuICB9XG4gIGNsb3NlU2VsZWN0aW9uTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGFsSWRzID0gW107XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RhbFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICB9XG4gIHRvZ2dsZVNlbGVjdGlvbk1vZGFsUm93KGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGFsSWRzID0gdGhpcy50b2dnbGVNdWx0aXBsZVZhbHVlKFxuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyxcbiAgICAgIGlkXG4gICAgKTtcbiAgfVxuICBvblNlbGVjdGlvbk1vZGFsU2VsZWN0ZWRJZHNDaGFuZ2UoaWRzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMgPSB0aGlzLnJlc29sdmVDb2x1bW5zRnJvbVBpY2tsaXN0SWRzKGlkcyk7XG4gIH1cbiAgb25TZWxlY3RhYmxlUm93S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiIFwiIHx8IGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsKT8uY2xpY2soKTtcbiAgICB9XG4gIH1cbiAgY29uZmlybVNlbGVjdGlvbk1vZGFsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGFsTW9kZSA9PT0gXCJ0YWJsZXNcIikge1xuICAgICAgY29uc3QgYWxpYXNlcyA9IG5ldyBNYXAoXG4gICAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLm1hcCgoaXRlbSkgPT4gW1xuICAgICAgICAgIGl0ZW0udGFibGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWxpYXM6IGl0ZW0uYWxpYXMsXG4gICAgICAgICAgICBzY2hlbWE6IGl0ZW0uc2NoZW1hLFxuICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcyA9ICh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLnRhYmxlcyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gdGhpcy5zZWxlY3Rpb25Nb2RhbElkcy5pbmNsdWRlcyhpdGVtLnZhbHVlKSlcbiAgICAgICAgLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICB0YWJsZTogaXRlbS52YWx1ZSxcbiAgICAgICAgICBhbGlhczpcbiAgICAgICAgICAgIGFsaWFzZXMuZ2V0KGl0ZW0udmFsdWUpPy5hbGlhcz8udHJpbSgpIHx8IHRoaXMuYnVpbGRBbGlhc0ZvclRhYmxlKGl0ZW0pLCAvLyBOT1NPTkFSXG4gICAgICAgICAgc2NoZW1hOiBhbGlhc2VzLmdldChpdGVtLnZhbHVlKT8uc2NoZW1hID8/IGl0ZW0uc2NoZW1hLFxuICAgICAgICAgIGxhYmVsOlxuICAgICAgICAgICAgYWxpYXNlcy5nZXQoaXRlbS52YWx1ZSk/LmxhYmVsID8/XG4gICAgICAgICAgICBpdGVtLmRpc3BsYXlOYW1lID8/XG4gICAgICAgICAgICBpdGVtLnRleHQsXG4gICAgICAgIH0pKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kYWxNb2RlID09PSBcImZpZWxkc1wiKSB7XG4gICAgICBjb25zdCBmaWVsZENvbmZpZ0J5Q29sdW1uID0gbmV3IE1hcChcbiAgICAgICAgdGhpcy5ub3JtYWxpemVkRmllbGRzLm1hcCgoaXRlbSkgPT4gW2l0ZW0uY29sdW1uLCBpdGVtXSlcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzID0gdGhpcy5zZWxlY3Rpb25Nb2RhbElkcy5tYXAoXG4gICAgICAgIChjb2x1bW4pID0+IGZpZWxkQ29uZmlnQnlDb2x1bW4uZ2V0KGNvbHVtbikgPz8geyBjb2x1bW4gfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnkgPSBbLi4udGhpcy5zZWxlY3Rpb25Nb2RhbElkc107XG4gICAgfVxuICAgIHRoaXMuY2xvc2VTZWxlY3Rpb25Nb2RhbCgpO1xuICAgIHRoaXMuYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTtcbiAgfVxuICBvcGVuSm9pbk1vZGFsKGluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9XG4gICAgICB0eXBlb2YgaW5kZXggPT09IFwibnVtYmVyXCIgPyB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuam9pbnNbaW5kZXhdIDogbnVsbDtcbiAgICB0aGlzLmpvaW5Tb3VyY2VTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmpvaW5UYXJnZXRTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5vcGVuSm9pbk1vZGFsKGN1cnJlbnQsIHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIiA/IGluZGV4IDogbnVsbCk7XG4gIH1cbiAgY2xvc2VKb2luTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5qb2luU291cmNlU2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5qb2luVGFyZ2V0U2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xvc2VKb2luTW9kYWwoKTtcbiAgfVxuICBzZWxlY3RKb2luU291cmNlKGNvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uID1cbiAgICAgIHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbiA9PT0gY29sdW1uID8gRU1QVFlfVkFMVUUgOiBjb2x1bW47XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbik7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbik7XG4gICAgaWYgKHNvdXJjZT8udGFibGUgJiYgc291cmNlLnRhYmxlID09PSB0YXJnZXQ/LnRhYmxlKSB7XG4gICAgICB0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4gPSBFTVBUWV9WQUxVRTtcbiAgICB9XG4gIH1cbiAgb25Kb2luU291cmNlU2VsZWN0ZWRJZHNDaGFuZ2UoaWRzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMucmVzb2x2ZUxhc3RDb2x1bW5Gcm9tUGlja2xpc3RJZHMoaWRzKTtcblxuICAgIHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbiA9XG4gICAgICBjb2x1bW4gJiYgY29sdW1uID09PSB0aGlzLmpvaW5EcmFmdC5zb3VyY2VDb2x1bW4gPyBFTVBUWV9WQUxVRSA6IGNvbHVtbiA/PyBFTVBUWV9WQUxVRTtcblxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbih0aGlzLmpvaW5EcmFmdC5zb3VyY2VDb2x1bW4pO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbih0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4pO1xuICAgIGlmIChzb3VyY2U/LnRhYmxlICYmIHNvdXJjZS50YWJsZSA9PT0gdGFyZ2V0Py50YWJsZSkge1xuICAgICAgdGhpcy5qb2luRHJhZnQudGFyZ2V0Q29sdW1uID0gRU1QVFlfVkFMVUU7XG4gICAgfVxuICB9XG4gIHNlbGVjdEpvaW5UYXJnZXQoY29sdW1uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4gPVxuICAgICAgdGhpcy5qb2luRHJhZnQudGFyZ2V0Q29sdW1uID09PSBjb2x1bW4gPyBFTVBUWV9WQUxVRSA6IGNvbHVtbjtcbiAgfVxuICBvbkpvaW5UYXJnZXRTZWxlY3RlZElkc0NoYW5nZShpZHM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlTGFzdENvbHVtbkZyb21QaWNrbGlzdElkcyhpZHMpO1xuICAgIHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbiA9XG4gICAgICBjb2x1bW4gJiYgY29sdW1uID09PSB0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4gPyBFTVBUWV9WQUxVRSA6IGNvbHVtbiA/PyBFTVBUWV9WQUxVRTtcbiAgfVxuICBzYXZlSm9pbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuU2F2ZUpvaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dDogRHluYW1pY1ZpZXdCdWlsZGVySm9pbiA9IHtcbiAgICAgIHNvdXJjZUNvbHVtbjogdGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uLFxuICAgICAgdGFyZ2V0Q29sdW1uOiB0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4sXG4gICAgICBvcGVyYXRvcjogdGhpcy5qb2luRHJhZnQub3BlcmF0b3IsXG4gICAgfTtcbiAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLmNvbmZpZy5nZW5lcmF0ZWQuam9pbnNdO1xuICAgIGlmICh0aGlzLmpvaW5FZGl0SW5kZXggPT09IG51bGwpIHtcbiAgICAgIGl0ZW1zLnB1c2gobmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zW3RoaXMuam9pbkVkaXRJbmRleF0gPSBuZXh0O1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuam9pbnMgPSB0aGlzLmRlZHVwbGljYXRlQnlLZXkoaXRlbXMsIChpdGVtKSA9PlxuICAgICAgW2l0ZW0uc291cmNlQ29sdW1uLCBpdGVtLnRhcmdldENvbHVtbiwgaXRlbS5vcGVyYXRvcl0uam9pbihcInxcIilcbiAgICApO1xuICAgIHRoaXMuY2xvc2VKb2luTW9kYWwoKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb3BlblNvcnRNb2RhbChpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPVxuICAgICAgdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiID8gdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvcnRpbmdbaW5kZXhdIDogbnVsbDtcbiAgICB0aGlzLnNvcnRTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5vcGVuU29ydE1vZGFsKGN1cnJlbnQsIHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIiA/IGluZGV4IDogbnVsbCk7XG4gIH1cbiAgY2xvc2VTb3J0TW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zb3J0U2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuY2xvc2VTb3J0TW9kYWwoKTtcbiAgfVxuICBzZWxlY3RTb3J0Q29sdW1uKHNvcnRTZWxlY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMucGFyc2VTb3J0U2VsZWN0aW9uSWQoc29ydFNlbGVjdGlvbklkKTtcbiAgICBjb25zdCBpc1NhbWVTZWxlY3Rpb24gPVxuICAgICAgdGhpcy5zb3J0RHJhZnQuY29sdW1uID09PSBuZXh0LmNvbHVtbiAmJlxuICAgICAgKHRoaXMuc29ydERyYWZ0LmZ1bmN0aW9uTmFtZSB8fCBFTVBUWV9WQUxVRSkgPT09IG5leHQuZnVuY3Rpb25OYW1lO1xuXG4gICAgdGhpcy5zb3J0RHJhZnQuY29sdW1uID0gaXNTYW1lU2VsZWN0aW9uID8gRU1QVFlfVkFMVUUgOiBuZXh0LmNvbHVtbjtcbiAgICB0aGlzLnNvcnREcmFmdC5mdW5jdGlvbk5hbWUgPSBpc1NhbWVTZWxlY3Rpb25cbiAgICAgID8gRU1QVFlfVkFMVUVcbiAgICAgIDogbmV4dC5mdW5jdGlvbk5hbWU7XG4gIH1cbiAgb25Tb3J0U2VsZWN0ZWRJZHNDaGFuZ2UoaWRzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBpZHMuYXQoLTEpO1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuc29ydFBpY2tsaXN0SXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gc2VsZWN0ZWRJZCk7XG5cbiAgICBpZiAoIXNlbGVjdGVkSXRlbSkge1xuICAgICAgdGhpcy5zb3J0RHJhZnQuY29sdW1uID0gRU1QVFlfVkFMVUU7XG4gICAgICB0aGlzLnNvcnREcmFmdC5mdW5jdGlvbk5hbWUgPSBFTVBUWV9WQUxVRTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdFNvcnRDb2x1bW4oc2VsZWN0ZWRJdGVtLnNlbGVjdGlvbklkKTtcbiAgfVxuICBzYXZlU29ydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuU2F2ZVNvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dDogRHluYW1pY1ZpZXdCdWlsZGVyU29ydCA9IHtcbiAgICAgIGNvbHVtbjogdGhpcy5zb3J0RHJhZnQuY29sdW1uLFxuICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLnNvcnREcmFmdC5mdW5jdGlvbk5hbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgZGlyZWN0aW9uOiB0aGlzLnNvcnREcmFmdC5kaXJlY3Rpb24sXG4gICAgfTtcbiAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc29ydGluZ107XG4gICAgaWYgKHRoaXMuc29ydEVkaXRJbmRleCA9PT0gbnVsbCkge1xuICAgICAgaXRlbXMucHVzaChuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNbdGhpcy5zb3J0RWRpdEluZGV4XSA9IG5leHQ7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3J0aW5nID0gdGhpcy5kZWR1cGxpY2F0ZUJ5S2V5KGl0ZW1zLCAoaXRlbSkgPT5cbiAgICAgIFtpdGVtLmNvbHVtbiwgaXRlbS5mdW5jdGlvbk5hbWUgPz8gRU1QVFlfVkFMVUUsIGl0ZW0uZGlyZWN0aW9uXS5qb2luKFwifFwiKVxuICAgICk7XG4gICAgdGhpcy5jbG9zZVNvcnRNb2RhbCgpO1xuICAgIHRoaXMuYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTtcbiAgfVxuICBvcGVuRmlsdGVyTW9kYWwoaW5kZXg/OiBudW1iZXIpOiB2b2lkIHsgLy8gTk9TT05BUiAtIGNvbXBsZXhpdHk6IGV4dHJhY3Rpb24gd291bGQgcmlzayBiZWhhdmlvciBjaGFuZ2VcbiAgICBjb25zdCBjdXJyZW50ID1cbiAgICAgIHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIiA/IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWx0ZXJzW2luZGV4XSA6IG51bGw7XG4gICAgdGhpcy5maWx0ZXJTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5vcGVuRmlsdGVyTW9kYWwoY3VycmVudCwgdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiID8gaW5kZXggOiBudWxsKTtcbiAgICB0aGlzLnN5bmNTZWxlY3RlZEZpbHRlck1vZGVJdGVtcygpO1xuICB9XG4gIGNsb3NlRmlsdGVyTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5jbG9zZUZpbHRlck1vZGFsKCk7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRGaWx0ZXJNb2RlSXRlbXMoKTtcbiAgfVxuICBzZWxlY3RGaWx0ZXJDb2x1bW4oY29sdW1uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbiA9XG4gICAgICB0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbiA9PT0gY29sdW1uID8gRU1QVFlfVkFMVUUgOiBjb2x1bW47XG4gICAgdGhpcy5yZXNldEZpbHRlckRyYWZ0VmFsdWVTdGF0ZSgpO1xuICB9XG4gIG9uRmlsdGVyTW9kYWxTZWxlY3RlZElkc0NoYW5nZShpZHM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dFNlbGVjdGVkSWQgPSBpZHMuYXQoLTEpO1xuICAgIGNvbnN0IG5leHRDb2x1bW4gPVxuICAgICAgdHlwZW9mIG5leHRTZWxlY3RlZElkID09PSBcIm51bWJlclwiXG4gICAgICAgID8gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RDb2x1bW4obmV4dFNlbGVjdGVkSWQpID8/IEVNUFRZX1ZBTFVFXG4gICAgICAgIDogRU1QVFlfVkFMVUU7XG5cbiAgICB0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbiA9IG5leHRDb2x1bW47XG4gICAgdGhpcy5yZXNldEZpbHRlckRyYWZ0VmFsdWVTdGF0ZSgpO1xuICB9XG4gIHByaXZhdGUgcmVzZXRGaWx0ZXJEcmFmdFZhbHVlU3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgZmlyc3RPcGVyYXRvciA9XG4gICAgICB0aGlzLmZpbHRlck9wZXJhdG9yT3B0aW9uc1swXT8udmFsdWUgPz8gREVGQVVMVF9GSUxURVJfT1BFUkFUT1I7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmlsdGVyRHJhZnQub3BlcmF0b3IgPSBmaXJzdE9wZXJhdG9yO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmZpbHRlckRyYWZ0LnZhbHVlID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmlsdGVyRHJhZnQudmFsdWVzVGV4dCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmZpbHRlckRyYWZ0LmJldHdlZW5TdGFydCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmZpbHRlckRyYWZ0LmJldHdlZW5FbmQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5maWx0ZXJEcmFmdC5wYXJhbWV0ZXJOYW1lID0gRU1QVFlfVkFMVUU7XG4gIH1cbiAgZ29Ub0ZpbHRlck1vZGFsU3RlcChzdGVwOiBGaWx0ZXJNb2RhbFN0ZXApOiB2b2lkIHtcbiAgICBpZiAoc3RlcCA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgdGhpcy5maWx0ZXJTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZ29Ub0ZpbHRlck1vZGFsU3RlcChzdGVwLCB0aGlzLmZpbHRlck1vZGFsQ2FuUHJvY2VlZCwgdGhpcy5maWx0ZXJNb2RhbENhblJldmlldyk7XG4gIH1cbiAgYWR2YW5jZUZpbHRlck1vZGFsU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maWx0ZXJNb2RhbFNlbGVjdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgIHRoaXMuZ29Ub0ZpbHRlck1vZGFsU3RlcChcImNvbmZpZ3VyZVwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJNb2RhbENvbmZpZ3VyYXRpb25TdGVwQWN0aXZlKSB7XG4gICAgICB0aGlzLmdvVG9GaWx0ZXJNb2RhbFN0ZXAoXCJyZXZpZXdcIik7XG4gICAgfVxuICB9XG4gIG9uRmlsdGVyVmFsdWVUeXBlQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRHJhZnQudmFsdWUgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlc1RleHQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5TdGFydCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuZmlsdGVyRHJhZnQuYmV0d2VlbkVuZCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuZmlsdGVyRHJhZnQucGFyYW1ldGVyTmFtZSA9IEVNUFRZX1ZBTFVFO1xuICB9XG4gIG9uRmlsdGVyT3BlcmF0b3JDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC52YWx1ZSA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuZmlsdGVyRHJhZnQudmFsdWVzVGV4dCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuZmlsdGVyRHJhZnQuYmV0d2VlblN0YXJ0ID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC5iZXR3ZWVuRW5kID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC5wYXJhbWV0ZXJOYW1lID0gRU1QVFlfVkFMVUU7XG5cbiAgICBpZiAoIXRoaXMuZmlsdGVyTmVlZHNWYWx1ZSkge1xuICAgICAgdGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUgPSBERUZBVUxUX0ZJTFRFUl9WQUxVRV9UWVBFO1xuICAgIH1cbiAgfVxuICBvbkZpbHRlck1vZGVDaGFuZ2UobW9kZTogRmlsdGVyTW9kYWxNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmlsdGVyTW9kYWxNb2RlID0gbW9kZTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5maWx0ZXJEcmFmdC5tb2RlID0gbW9kZTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5maWx0ZXJEcmFmdC5jb2x1bW4gPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5maWx0ZXJEcmFmdC5vcGVyYXRvciA9IERFRkFVTFRfRklMVEVSX09QRVJBVE9SO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmZpbHRlckRyYWZ0LnZhbHVlVHlwZSA9IERFRkFVTFRfRklMVEVSX1ZBTFVFX1RZUEU7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmlsdGVyRHJhZnQudmFsdWUgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5maWx0ZXJEcmFmdC52YWx1ZXNUZXh0ID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmlsdGVyRHJhZnQuYmV0d2VlblN0YXJ0ID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmlsdGVyRHJhZnQuYmV0d2VlbkVuZCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWUgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5maWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZmlsdGVyTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgICB0aGlzLnN5bmNTZWxlY3RlZEZpbHRlck1vZGVJdGVtcygpO1xuICB9XG4gIG9uRmlsdGVyTW9kYWxUaW1lbGluZVN0ZXBTZWxlY3QoZXZlbnQ6IFRpbWVsaW5lU3RlcFNlbGVjdEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Lml0ZW0uaWQgPT09IFwicmV2aWV3XCIpIHtcbiAgICAgIHRoaXMuZ29Ub0ZpbHRlck1vZGFsU3RlcChcInJldmlld1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmdvVG9GaWx0ZXJNb2RhbFN0ZXAoZXZlbnQuaXRlbS5pZCA9PT0gXCJjb25maWd1cmVcIiA/IFwiY29uZmlndXJlXCIgOiBcInNlbGVjdFwiKTtcbiAgfVxuICBzYXZlRmlsdGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmJ1aWxkRmlsdGVyRnJvbURyYWZ0KCk7XG5cbiAgICBpZiAoIW5leHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmlsdGVyc107XG4gICAgaWYgKHRoaXMuZmlsdGVyRWRpdEluZGV4ID09PSBudWxsKSB7XG4gICAgICBpdGVtcy5wdXNoKG5leHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtc1t0aGlzLmZpbHRlckVkaXRJbmRleF0gPSBuZXh0O1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmlsdGVycyA9IGl0ZW1zO1xuICAgIHRoaXMuY2xvc2VGaWx0ZXJNb2RhbCgpO1xuICAgIHRoaXMuYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTtcbiAgfVxuICBvblNvdXJjZUFsaWFzQ2hhbmdlKGluZGV4OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXNbaW5kZXhdO1xuICAgIGlmICghY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMucmVzb2x2ZVRhYmxlT3B0aW9uKGN1cnJlbnQudGFibGUpO1xuICAgIGN1cnJlbnQuYWxpYXMgPVxuICAgICAgdmFsdWUudHJpbSgpIHx8ICh0YWJsZSA/IHRoaXMuYnVpbGRBbGlhc0ZvclRhYmxlKHRhYmxlKSA6IGN1cnJlbnQuYWxpYXMpO1xuICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZSgpO1xuICAgIHRoaXMuZmxvd1NlcnZpY2Uuc2NoZWR1bGVGbG93QXJyb3dSZWZyZXNoKHRoaXMuZmxvd0NvbnRleHQpO1xuICB9XG4gIHJlbW92ZVNvdXJjZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgcmVtb3ZlSm9pbihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIHJlbW92ZUdyb3VwQnkoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5LnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIHJlbW92ZUZpZWxkKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIHJlbW92ZVNvcnQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3J0aW5nLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIHJlbW92ZUZpbHRlcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgY2xlYXJTb3VyY2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzID0gW107XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIGNsZWFySm9pbnMoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zID0gW107XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIGNsZWFyR3JvdXBCeSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeSA9IFtdO1xuICAgIHRoaXMuYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTtcbiAgfVxuICBjbGVhckZpZWxkcygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzID0gW107XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIGNsZWFyU29ydGluZygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc29ydGluZyA9IFtdO1xuICAgIHRoaXMuYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTtcbiAgfVxuICBjbGVhckZpbHRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMgPSBbXTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgaGFuZGxlU2F2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNhbml0aXplQnVpbGRlcigpO1xuICAgIHRoaXMuc2F2ZS5lbWl0KGNyZWF0ZUR5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyh0aGlzLmNvbmZpZykpO1xuICB9XG4gIHByaXZhdGUgYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zYW5pdGl6ZUJ1aWxkZXIoKTtcbiAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoKTtcbiAgICB0aGlzLmZsb3dTZXJ2aWNlLnNjaGVkdWxlRmxvd0Fycm93UmVmcmVzaCh0aGlzLmZsb3dDb250ZXh0KTtcbiAgfVxuICBwcml2YXRlIGVtaXRDb25maWdDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWdDaGFuZ2UuZW1pdChjcmVhdGVEeW5hbWljVmlld0J1aWxkZXJDb25maWcodGhpcy5jb25maWcpKTtcbiAgfVxuICBwcml2YXRlIHNhbml0aXplQnVpbGRlcigpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJsZXNCeUlkID0gbmV3IE1hcChcbiAgICAgICh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLnRhYmxlcyA/PyBbXSkubWFwKChpdGVtKSA9PiBbaXRlbS52YWx1ZSwgaXRlbV0pXG4gICAgKTtcbiAgICBjb25zdCBzZWxlY3RlZFNvdXJjZXMgPSB0aGlzLmRlZHVwbGljYXRlQnlLZXkoXG4gICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcy5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICAgIHRhYmxlc0J5SWQuaGFzKGl0ZW0udGFibGUpXG4gICAgICApLFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udGFibGVcbiAgICApLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIHRhYmxlOiBpdGVtLnRhYmxlLFxuICAgICAgYWxpYXM6XG4gICAgICAgIGl0ZW0uYWxpYXM/LnRyaW0oKSB8fFxuICAgICAgICB0aGlzLmJ1aWxkQWxpYXNGb3JUYWJsZShcbiAgICAgICAgICB0YWJsZXNCeUlkLmdldChpdGVtLnRhYmxlKSBhcyBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvblxuICAgICAgICApLFxuICAgICAgc2NoZW1hOiBpdGVtLnNjaGVtYSA/PyB0YWJsZXNCeUlkLmdldChpdGVtLnRhYmxlKT8uc2NoZW1hLFxuICAgICAgbGFiZWw6XG4gICAgICAgIGl0ZW0ubGFiZWwgPz9cbiAgICAgICAgdGFibGVzQnlJZC5nZXQoaXRlbS50YWJsZSk/LmRpc3BsYXlOYW1lID8/XG4gICAgICAgIHRhYmxlc0J5SWQuZ2V0KGl0ZW0udGFibGUpPy50ZXh0LFxuICAgIH0pKTtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcyA9IHNlbGVjdGVkU291cmNlcztcbiAgICBjb25zdCBzZWxlY3RlZFRhYmxlSWRzID0gbmV3IFNldChzZWxlY3RlZFNvdXJjZXMubWFwKChpdGVtKSA9PiBpdGVtLnRhYmxlKSk7XG4gICAgY29uc3QgYXZhaWxhYmxlQ29sdW1ucyA9ICh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLmNvbHVtbnMgPz8gW10pLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiBzZWxlY3RlZFRhYmxlSWRzLmhhcyhpdGVtLnRhYmxlKVxuICAgICk7XG4gICAgY29uc3QgYXZhaWxhYmxlQ29sdW1uTWFwID0gbmV3IE1hcChcbiAgICAgIGF2YWlsYWJsZUNvbHVtbnMubWFwKChpdGVtKSA9PiBbaXRlbS52YWx1ZSwgaXRlbV0pXG4gICAgKTtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeSA9IHRoaXMuZGVkdXBsaWNhdGVCeUtleShcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5LmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBhdmFpbGFibGVDb2x1bW5NYXAuZ2V0KGl0ZW0pO1xuICAgICAgICByZXR1cm4gISFjb2x1bW4gJiYgY29sdW1uLmlzQWdncmVnYXRhYmxlICE9PSBmYWxzZTtcbiAgICAgIH0pLFxuICAgICAgKGl0ZW0pID0+IGl0ZW1cbiAgICApO1xuICAgIGNvbnN0IGdyb3VwQnlTZXQgPSBuZXcgU2V0KHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5KTtcbiAgICBjb25zdCBub3JtYWxpemVkRmllbGRzID0gdGhpcy5tZXJnZUxlZ2FjeUZ1bmN0aW9uc0ludG9GaWVsZHMoXG4gICAgICB0aGlzLm5vcm1hbGl6ZWRGaWVsZHMsXG4gICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZnVuY3Rpb25zXG4gICAgKTtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzID0gdGhpcy5kZWR1cGxpY2F0ZUJ5S2V5KFxuICAgICAgbm9ybWFsaXplZEZpZWxkcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gYXZhaWxhYmxlQ29sdW1uTWFwLmdldChpdGVtLmNvbHVtbik7XG4gICAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnkubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyb3VwQnlTZXQuaGFzKGl0ZW0uY29sdW1uKSB8fCAoISFpdGVtLmZ1bmN0aW9uPy5mdW5jdGlvbk5hbWUgJiYgY29sdW1uLmlzQWdncmVnYXRhYmxlICE9PSBmYWxzZSk7XG4gICAgICB9KSxcbiAgICAgIChpdGVtKSA9PiBgJHtpdGVtLmNvbHVtbn18JHtpdGVtLmZ1bmN0aW9uPy5mdW5jdGlvbk5hbWUgPz8gRU1QVFlfVkFMVUV9YFxuICAgICk7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZ1bmN0aW9ucyA9IHRoaXMuZXh0cmFjdEZ1bmN0aW9uc0Zyb21GaWVsZHMoXG4gICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzLm1hcCgoaXRlbSkgPT4gdGhpcy5ub3JtYWxpemVHZW5lcmF0ZWRGaWVsZChpdGVtKSlcbiAgICApO1xuICAgIGNvbnN0IHNvcnRBbGxvd2VkID0gbmV3IFNldChcbiAgICAgIHRoaXMuc29ydFNlbGVjdGFibGVJdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0uaWQpXG4gICAgKTtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc29ydGluZyA9IHRoaXMuZGVkdXBsaWNhdGVCeUtleShcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3J0aW5nLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgICAgc29ydEFsbG93ZWQuaGFzKFxuICAgICAgICAgIHRoaXMuYnVpbGRTb3J0U2VsZWN0aW9uSWQoaXRlbS5jb2x1bW4sIGl0ZW0uZnVuY3Rpb25OYW1lID8/IEVNUFRZX1ZBTFVFKVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgKGl0ZW0pID0+IGAke2l0ZW0uY29sdW1ufXwke2l0ZW0uZnVuY3Rpb25OYW1lID8/IEVNUFRZX1ZBTFVFfXwke2l0ZW0uZGlyZWN0aW9ufWBcbiAgICApO1xuICAgIGlmIChzZWxlY3RlZFNvdXJjZXMubGVuZ3RoIDwgMikge1xuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5qb2lucyA9IHRoaXMuZGVkdXBsaWNhdGVCeUtleShcbiAgICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF2YWlsYWJsZUNvbHVtbk1hcC5nZXQoaXRlbS5zb3VyY2VDb2x1bW4pO1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGF2YWlsYWJsZUNvbHVtbk1hcC5nZXQoaXRlbS50YXJnZXRDb2x1bW4pO1xuICAgICAgICAgIHJldHVybiAhIXNvdXJjZSAmJiAhIXRhcmdldCAmJiBzb3VyY2UudGFibGUgIT09IHRhcmdldC50YWJsZTtcbiAgICAgICAgfSksXG4gICAgICAgIChpdGVtKSA9PiBgJHtpdGVtLnNvdXJjZUNvbHVtbn18JHtpdGVtLnRhcmdldENvbHVtbn18JHtpdGVtLm9wZXJhdG9yfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWx0ZXJzID0gdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMuZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udmFsdWVUeXBlID09PSBGSUxURVJfTU9ERV9ET01BSU4pIHtcbiAgICAgICAgICByZXR1cm4gISFpdGVtLmRvbWFpbkV4cHJlc3Npb24/LnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXZhaWxhYmxlQ29sdW1uTWFwLmhhcyhpdGVtLmNvbHVtbik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVQcmV2aWV3Q29sdW1ucygpOiBQcmV2aWV3Q29sdW1uTGlrZVtdIHtcbiAgICBjb25zdCBwcmV2aWV3Q29sdW1ucyA9IChcbiAgICAgICh0aGlzLmNvbmZpZy5wcmV2aWV3Py5jb2x1bW5zID8/IFtdKSBhcyBQcmV2aWV3Q29sdW1uTGlrZVtdXG4gICAgKVxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gISFpdGVtPy5maWVsZClcbiAgICAgIC5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgIGZpZWxkOiBpdGVtLmZpZWxkLFxuICAgICAgICBoZWFkZXI6IGl0ZW0uaGVhZGVyID8/IGl0ZW0uZmllbGQsXG4gICAgICAgIHR5cGU6IGl0ZW0udHlwZSxcbiAgICAgIH0pKTtcbiAgICBpZiAocHJldmlld0NvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gcHJldmlld0NvbHVtbnM7XG4gICAgfVxuICAgIGNvbnN0IGdlbmVyYXRlZENvbHVtbnMgPSBbXG4gICAgICAuLi50aGlzLm5vcm1hbGl6ZWRGaWVsZHMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBmaWVsZDpcbiAgICAgICAgICBpdGVtLmZ1bmN0aW9uPy5hbGlhcz8udHJpbSgpIHx8IC8vIE5PU09OQVJcbiAgICAgICAgICBpdGVtLmFsaWFzPy50cmltKCkgfHwgLy8gTk9TT05BUlxuICAgICAgICAgIGl0ZW0uY29sdW1uLFxuICAgICAgICBoZWFkZXI6XG4gICAgICAgICAgaXRlbS5mdW5jdGlvbj8uYWxpYXM/LnRyaW0oKSB8fCAvLyBOT1NPTkFSXG4gICAgICAgICAgaXRlbS5hbGlhcz8udHJpbSgpIHx8IC8vIE5PU09OQVJcbiAgICAgICAgICAoaXRlbS5mdW5jdGlvblxuICAgICAgICAgICAgPyBgJHt0aGlzLnJlc29sdmVGdW5jdGlvbkxhYmVsKGl0ZW0uZnVuY3Rpb24uZnVuY3Rpb25OYW1lKX0gJHt0aGlzLnJlc29sdmVDb2x1bW5MYWJlbChpdGVtLmNvbHVtbil9YFxuICAgICAgICAgICAgOiB0aGlzLnJlc29sdmVDb2x1bW5MYWJlbChpdGVtLmNvbHVtbikpLFxuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgIH0pKSxcbiAgICBdO1xuICAgIHJldHVybiB0aGlzLmRlZHVwbGljYXRlQnlLZXkoZ2VuZXJhdGVkQ29sdW1ucywgKGl0ZW0pID0+IGl0ZW0uZmllbGQpO1xuICB9XG4gIHByaXZhdGUgYnVpbGRUYWJsZVNlbGVjdGlvblJvd3MoXG4gICAgc2VsZWN0ZWRJZHM6IHN0cmluZ1tdLFxuICAgIHNlYXJjaDogc3RyaW5nXG4gICk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEudGFibGVzID8/IFtdKVxuICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHRoaXMucmVzb2x2ZVRhYmxlRGlzcGxheVBhcnRzKGl0ZW0udmFsdWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiBpdGVtLnZhbHVlLFxuICAgICAgICAgIG5hbWU6IHBhcnRzLnRhYmxlTGFiZWwsXG4gICAgICAgICAgZGJMYWJlbDogcGFydHMuZGJMYWJlbCxcbiAgICAgICAgICB0YWJsZUxhYmVsOiBwYXJ0cy50YWJsZUxhYmVsLFxuICAgICAgICAgIHBhdGhUeXBlOiBcInRhYmxlXCIgYXMgY29uc3QsXG4gICAgICAgICAgcHJlZml4OiBwYXJ0cy5kYkxhYmVsLFxuICAgICAgICAgIG1ldGE6IGl0ZW0uZGVzY3JpcHRpb24gfHwgaXRlbS5kaXNwbGF5TmFtZSB8fCBFTVBUWV9WQUxVRSwgLy8gTk9TT05BUlxuICAgICAgICAgIG5vdGU6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgc2VsZWN0ZWQ6IHNlbGVjdGVkSWRzLmluY2x1ZGVzKGl0ZW0udmFsdWUpLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgICB0aGlzLm1hdGNoZXNTZWFyY2goW2l0ZW0ucHJlZml4ID8/IEVNUFRZX1ZBTFVFLCBpdGVtLm5hbWUsIGl0ZW0ubWV0YSwgaXRlbS5ub3RlID8/IEVNUFRZX1ZBTFVFXSwgc2VhcmNoKVxuICAgICAgKTtcbiAgfVxuICBwcml2YXRlIGJ1aWxkQ29sdW1uU2VsZWN0aW9uUm93cyhcbiAgICBpdGVtczogRHluYW1pY1ZpZXdCdWlsZGVyQ29sdW1uT3B0aW9uW10sXG4gICAgc2VsZWN0ZWRJZHM6IHN0cmluZ1tdLFxuICAgIHNlYXJjaDogc3RyaW5nLFxuICAgIG11bHRpcGxlID0gdHJ1ZVxuICApOiBTZWxlY3Rpb25Sb3dbXSB7XG4gICAgcmV0dXJuIGl0ZW1zXG4gICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbS52YWx1ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgbmFtZTogcGFydHMuZmllbGRMYWJlbCxcbiAgICAgICAgICBkYkxhYmVsOiBwYXJ0cy5kYkxhYmVsLFxuICAgICAgICAgIHRhYmxlTGFiZWw6IHBhcnRzLnRhYmxlTGFiZWwsXG4gICAgICAgICAgcGF0aFR5cGU6IFwiY29sdW1uXCIgYXMgY29uc3QsXG4gICAgICAgICAgcHJlZml4OiBwYXJ0cy50YWJsZUxhYmVsLFxuICAgICAgICAgIG1ldGE6IGl0ZW0uZGF0YVR5cGUsXG4gICAgICAgICAgbm90ZTogaXRlbS5mdWxsTmFtZSxcbiAgICAgICAgICBzZWxlY3RlZDogbXVsdGlwbGVcbiAgICAgICAgICAgID8gc2VsZWN0ZWRJZHMuaW5jbHVkZXMoaXRlbS52YWx1ZSlcbiAgICAgICAgICAgIDogc2VsZWN0ZWRJZHNbMF0gPT09IGl0ZW0udmFsdWUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICAgIHRoaXMubWF0Y2hlc1NlYXJjaChbaXRlbS5wcmVmaXggPz8gRU1QVFlfVkFMVUUsIGl0ZW0ubmFtZSwgaXRlbS5tZXRhLCBpdGVtLm5vdGUgPz8gRU1QVFlfVkFMVUVdLCBzZWFyY2gpXG4gICAgICApO1xuICB9XG4gIHByaXZhdGUgYnVpbGRDb2x1bW5QaWNrbGlzdEl0ZW1zKFxuICAgIGl0ZW1zOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXVxuICApOiBDb2x1bW5QaWNrbGlzdEl0ZW1bXSB7XG4gICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgcGlja2xpc3RJZCA9IHRoaXMucmVzb2x2ZUNvbHVtblBpY2tsaXN0SWQoaXRlbS52YWx1ZSk7XG4gICAgICBjb25zdCBwYXJ0cyA9IHRoaXMucmVzb2x2ZUNvbHVtblBhcnRzKGl0ZW0udmFsdWUpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogcGlja2xpc3RJZCA/PyAwLFxuICAgICAgICB0aXRsZTogYCR7cGFydHMudGFibGVMYWJlbH0uJHtwYXJ0cy5maWVsZExhYmVsfWAsXG4gICAgICAgIHRpdGxlUHJlZml4OiBwYXJ0cy50YWJsZUxhYmVsLFxuICAgICAgICB0aXRsZVN1ZmZpeDogcGFydHMuZmllbGRMYWJlbCxcbiAgICAgICAgdGl0bGVQcmVmaXhDb2xvcjogVklTVUFMX1NRTF9UQUJMRV9DT0xPUixcbiAgICAgICAgdGl0bGVTdWZmaXhDb2xvcjogVklTVUFMX1NRTF9GSUVMRF9DT0xPUixcbiAgICAgICAgYmFkZ2U6IGl0ZW0uZGF0YVR5cGUgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgIGJhZGdlQ29sb3I6IFBJQ0tMSVNUX0RBVEFfVFlQRV9CQURHRV9DT0xPUixcbiAgICAgICAgY29sdW1uOiBpdGVtLnZhbHVlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGJ1aWxkVGFibGVQaWNrbGlzdEl0ZW1zKFxuICAgIGl0ZW1zOiBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbltdXG4gICk6IFRhYmxlUGlja2xpc3RJdGVtW10ge1xuICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHRoaXMucmVzb2x2ZVRhYmxlRGlzcGxheVBhcnRzKGl0ZW0udmFsdWUpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaW5kZXggKyAxLFxuICAgICAgICB0aXRsZTogYCR7cGFydHMuZGJMYWJlbH0uJHtwYXJ0cy50YWJsZUxhYmVsfWAsXG4gICAgICAgIHRpdGxlUHJlZml4OiBwYXJ0cy5kYkxhYmVsLFxuICAgICAgICB0aXRsZVN1ZmZpeDogcGFydHMudGFibGVMYWJlbCxcbiAgICAgICAgdGl0bGVQcmVmaXhDb2xvcjogVklTVUFMX1NRTF9UQUJMRV9DT0xPUixcbiAgICAgICAgdGl0bGVTdWZmaXhDb2xvcjogVklTVUFMX1NRTF9GSUVMRF9DT0xPUixcbiAgICAgICAgYmFkZ2U6XG4gICAgICAgICAgaXRlbS5kaXNwbGF5TmFtZSAmJiBpdGVtLmRpc3BsYXlOYW1lICE9PSBwYXJ0cy50YWJsZUxhYmVsXG4gICAgICAgICAgICA/IGl0ZW0uZGlzcGxheU5hbWVcbiAgICAgICAgICAgIDogRU1QVFlfVkFMVUUsXG4gICAgICAgIGJhZGdlQ29sb3I6IFBJQ0tMSVNUX0RBVEFfVFlQRV9CQURHRV9DT0xPUixcbiAgICAgICAgdGFibGU6IGl0ZW0udmFsdWUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtbnNGcm9tUGlja2xpc3RJZHMoaWRzOiBudW1iZXJbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gaWRzXG4gICAgICAubWFwKChpZCkgPT4gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RDb2x1bW4oaWQpKVxuICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+ICEhaXRlbSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlTGFzdENvbHVtbkZyb21QaWNrbGlzdElkcyhpZHM6IG51bWJlcltdKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMucmVzb2x2ZUNvbHVtbnNGcm9tUGlja2xpc3RJZHMoaWRzKTtcbiAgICByZXR1cm4gY29sdW1ucy5hdCgtMSkgPz8gbnVsbDtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVUYWJsZVBpY2tsaXN0SWQodGFibGVWYWx1ZTogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgaXRlbUluZGV4ID0gKHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEudGFibGVzID8/IFtdKS5maW5kSW5kZXgoXG4gICAgICAoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdGFibGVWYWx1ZVxuICAgICk7XG5cbiAgICByZXR1cm4gaXRlbUluZGV4ID49IDAgPyBpdGVtSW5kZXggKyAxIDogbnVsbDtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVUYWJsZVBpY2tsaXN0VGFibGUoaWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGl0ZW0gPSAodGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS50YWJsZXMgPz8gW10pLmZpbmQoXG4gICAgICAoX2VudHJ5LCBpbmRleCkgPT4gaW5kZXggKyAxID09PSBpZFxuICAgICk7XG5cbiAgICByZXR1cm4gaXRlbT8udmFsdWUgPz8gbnVsbDtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVUYWJsZXNGcm9tUGlja2xpc3RJZHMoaWRzOiBudW1iZXJbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gaWRzXG4gICAgICAubWFwKChpZCkgPT4gdGhpcy5yZXNvbHZlVGFibGVQaWNrbGlzdFRhYmxlKGlkKSlcbiAgICAgIC5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiAhIWl0ZW0pO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtblBpY2tsaXN0SWQoY29sdW1uOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBpdGVtSW5kZXggPSB0aGlzLmF2YWlsYWJsZUNvbHVtbnMuZmluZEluZGV4KFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IGNvbHVtblxuICAgICk7XG5cbiAgICByZXR1cm4gaXRlbUluZGV4ID49IDAgPyBpdGVtSW5kZXggKyAxIDogbnVsbDtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVDb2x1bW5QaWNrbGlzdENvbHVtbihpZDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuYXZhaWxhYmxlQ29sdW1uc1tpZCAtIDFdO1xuICAgIHJldHVybiBpdGVtPy52YWx1ZSA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgbWF0Y2hlc1NlYXJjaCh2YWx1ZXM6IHN0cmluZ1tdLCBzZWFyY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSB0aGlzLm5vcm1hbGl6ZShzZWFyY2gpO1xuICAgIGlmICghbm9ybWFsaXplZFNlYXJjaCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXMuc29tZSgodmFsdWUpID0+XG4gICAgICB0aGlzLm5vcm1hbGl6ZSh2YWx1ZSkuaW5jbHVkZXMobm9ybWFsaXplZFNlYXJjaClcbiAgICApO1xuICB9XG4gIHByaXZhdGUgbm9ybWFsaXplKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBub3JtYWxpemUodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgdG9nZ2xlTXVsdGlwbGVWYWx1ZSh2YWx1ZXM6IHN0cmluZ1tdLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB2YWx1ZXMuaW5jbHVkZXModmFsdWUpXG4gICAgICA/IHZhbHVlcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHZhbHVlKVxuICAgICAgOiBbLi4udmFsdWVzLCB2YWx1ZV07XG4gIH1cbiAgcHJpdmF0ZSBmaWx0ZXJGdW5jdGlvblNlbGVjdGFibGVDb2x1bW5zKFxuICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nXG4gICk6IER5bmFtaWNWaWV3QnVpbGRlckNvbHVtbk9wdGlvbltdIHtcbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwQnkgPSBuZXcgU2V0KHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5KTtcbiAgICBjb25zdCBhbGwgPSB0aGlzLmF2YWlsYWJsZUNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+ICFzZWxlY3RlZEdyb3VwQnkuaGFzKGl0ZW0udmFsdWUpXG4gICAgKTtcbiAgICBpZiAoZnVuY3Rpb25OYW1lID09PSBcImNvdW50XCIpIHtcbiAgICAgIHJldHVybiBhbGw7XG4gICAgfVxuICAgIGlmIChbXCJzdW1cIiwgXCJhdmdcIiwgXCJtaW5cIiwgXCJtYXhcIl0uaW5jbHVkZXMoZnVuY3Rpb25OYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICByZXR1cm4gYWxsLmZpbHRlcigoaXRlbSkgPT4gdGhpcy5pc051bWVyaWNUeXBlKGl0ZW0uZGF0YVR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbDtcbiAgfVxuICBwcml2YXRlIGlzTnVtZXJpY1R5cGUodmFsdWU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOdW1lcmljVHlwZSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBpc0RhdGVUeXBlKHZhbHVlPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzRGF0ZVR5cGUodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgZmlsdGVyT3BlcmF0b3JzRm9yQ29sdW1uKFxuICAgIGNvbHVtbjogRHluYW1pY1ZpZXdCdWlsZGVyQ29sdW1uT3B0aW9uXG4gICk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gZmlsdGVyT3BlcmF0b3JzRm9yQ29sdW1uKGNvbHVtbik7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlVGFibGVPcHRpb24oXG4gICAgdmFsdWU6IHN0cmluZ1xuICApOiBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLnRhYmxlcyA/PyBbXSkuZmluZChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSB2YWx1ZVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uT3B0aW9uKFxuICAgIHZhbHVlOiBzdHJpbmdcbiAgKTogRHluYW1pY1ZpZXdCdWlsZGVyQ29sdW1uT3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEuY29sdW1ucyA/PyBbXSkuZmluZChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSB2YWx1ZVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlVGFibGVMYWJlbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlVGFibGVPcHRpb24odmFsdWUpPy50ZXh0ID8/IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZVRhYmxlRGlzcGxheVBhcnRzKHZhbHVlOiBzdHJpbmcpOiBUYWJsZURpc3BsYXlQYXJ0cyB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnJlc29sdmVUYWJsZU9wdGlvbih2YWx1ZSk7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgY29uc3QgcmF3UGFydHMgPSB2YWx1ZS5zcGxpdChcIi5cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGJMYWJlbDogcmF3UGFydHMubGVuZ3RoID4gMSA/IHJhd1BhcnRzLnNsaWNlKDAsIC0xKS5qb2luKFwiLlwiKSA6IFwiZGJcIixcbiAgICAgICAgdGFibGVMYWJlbDogcmF3UGFydHMuYXQoLTEpID8/IHZhbHVlLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRiTGFiZWw6IHRhYmxlLnNjaGVtYSB8fCBcImRiXCIsIC8vIE5PU09OQVJcbiAgICAgIHRhYmxlTGFiZWw6IHRhYmxlLnZhbHVlLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlVGFibGVQYXRoKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzID0gdGhpcy5yZXNvbHZlVGFibGVEaXNwbGF5UGFydHModmFsdWUpO1xuICAgIHJldHVybiBwYXJ0cy5kYkxhYmVsID8gYCR7cGFydHMuZGJMYWJlbH0uJHtwYXJ0cy50YWJsZUxhYmVsfWAgOiBwYXJ0cy50YWJsZUxhYmVsO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtblBhcnRzKCAvLyBOT1NPTkFSIC0gY29tcGxleGl0eTogZXh0cmFjdGlvbiB3b3VsZCByaXNrIGJlaGF2aW9yIGNoYW5nZVxuICAgIHZhbHVlOiBzdHJpbmcgfCBEeW5hbWljVmlld0J1aWxkZXJGaWVsZFxuICApOiBDb2x1bW5EaXNwbGF5UGFydHMge1xuICAgIGNvbnN0IGNvbHVtblZhbHVlID1cbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUuY29sdW1uID8/IEVNUFRZX1ZBTFVFO1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbihjb2x1bW5WYWx1ZSk7XG4gICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrID0gYCR7Y29sdW1uVmFsdWV9YC5zcGxpdChcIi5cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGJMYWJlbDogZmFsbGJhY2subGVuZ3RoID49IE1JTl9QQVJUU19GT1JfREIgPyBmYWxsYmFjay5zbGljZSgwLCBEQl9QQVJUU19PRkZTRVQpLmpvaW4oXCIuXCIpIDogRU1QVFlfVkFMVUUsXG4gICAgICAgIHRhYmxlTGFiZWw6IGZhbGxiYWNrLmxlbmd0aCA+PSBNSU5fUEFSVFNfRk9SX1RBQkxFID8gZmFsbGJhY2tbZmFsbGJhY2subGVuZ3RoIC0gTUlOX1BBUlRTX0ZPUl9UQUJMRV0gOiBjb2x1bW5WYWx1ZSxcbiAgICAgICAgZmllbGRMYWJlbDogZmFsbGJhY2suYXQoLTEpID8/IGNvbHVtblZhbHVlLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcGFydHMgPSAoY29sdW1uLmZ1bGxOYW1lID8/IGNvbHVtblZhbHVlKS5zcGxpdChcIi5cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIHJldHVybiB7XG4gICAgICBkYkxhYmVsOiBwYXJ0cy5sZW5ndGggPj0gTUlOX1BBUlRTX0ZPUl9EQiA/IHBhcnRzLnNsaWNlKDAsIERCX1BBUlRTX09GRlNFVCkuam9pbihcIi5cIikgOiBFTVBUWV9WQUxVRSxcbiAgICAgIHRhYmxlTGFiZWw6IHBhcnRzLmxlbmd0aCA+PSBNSU5fUEFSVFNfRk9SX1RBQkxFID8gcGFydHNbcGFydHMubGVuZ3RoIC0gTUlOX1BBUlRTX0ZPUl9UQUJMRV0gOiB0aGlzLnJlc29sdmVUYWJsZVBhdGgoY29sdW1uLnRhYmxlKSxcbiAgICAgIGZpZWxkTGFiZWw6IHBhcnRzLmF0KC0xKSA/PyBjb2x1bW4udmFsdWUsXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVDb2x1bW5MYWJlbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ29sdW1uUGF0aCh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlU29ydERyYWZ0TGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5yZXNvbHZlQ29sdW1uUGF0aCh0aGlzLnNvcnREcmFmdC5jb2x1bW4pO1xuICAgIGlmICghdGhpcy5zb3J0RHJhZnQuZnVuY3Rpb25OYW1lKSB7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMucmVzb2x2ZUZ1bmN0aW9uTGFiZWwodGhpcy5zb3J0RHJhZnQuZnVuY3Rpb25OYW1lKX0oJHtiYXNlfSlgO1xuICB9XG4gIHByaXZhdGUgYnVpbGRTb3J0U2VsZWN0aW9uSWQoXG4gICAgY29sdW1uOiBzdHJpbmcsXG4gICAgZnVuY3Rpb25OYW1lID0gRU1QVFlfVkFMVUVcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7Y29sdW1ufTo6JHtmdW5jdGlvbk5hbWUgfHwgRU1QVFlfU09SVF9GVU5DVElPTn1gO1xuICB9XG4gIHByaXZhdGUgcGFyc2VTb3J0U2VsZWN0aW9uSWQoXG4gICAgc2VsZWN0aW9uSWQ6IHN0cmluZ1xuICApOiB7IGNvbHVtbjogc3RyaW5nOyBmdW5jdGlvbk5hbWU6IHN0cmluZyB9IHtcbiAgICBjb25zdCBbY29sdW1uLCBmdW5jdGlvbk5hbWUgPSBFTVBUWV9TT1JUX0ZVTkNUSU9OXSA9IHNlbGVjdGlvbklkLnNwbGl0KFwiOjpcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHVtbixcbiAgICAgIGZ1bmN0aW9uTmFtZTpcbiAgICAgICAgZnVuY3Rpb25OYW1lID09PSBFTVBUWV9TT1JUX0ZVTkNUSU9OID8gRU1QVFlfVkFMVUUgOiBmdW5jdGlvbk5hbWUsXG4gICAgfTtcbiAgfVxuICByZXNvbHZlQ29sdW1uUGF0aCh2YWx1ZTogc3RyaW5nIHwgRHluYW1pY1ZpZXdCdWlsZGVyRmllbGQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbHVtblZhbHVlID1cbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUuY29sdW1uID8/IEVNUFRZX1ZBTFVFO1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbihjb2x1bW5WYWx1ZSk7XG4gICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgIHJldHVybiBjb2x1bW5WYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgcGFydHMgPSAoY29sdW1uLmZ1bGxOYW1lID8/IGNvbHVtblZhbHVlKS5zcGxpdChcIi5cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPj0gTUlOX1BBUlRTX0ZPUl9UQUJMRSA/IHBhcnRzLnNsaWNlKERCX1BBUlRTX09GRlNFVCkuam9pbihcIi5cIikgOiBjb2x1bW4uZnVsbE5hbWU7XG4gIH1cbiAgcHJpdmF0ZSBub3JtYWxpemVHZW5lcmF0ZWRGaWVsZChcbiAgICB2YWx1ZTogc3RyaW5nIHwgRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRcbiAgKTogRHluYW1pY1ZpZXdCdWlsZGVyRmllbGQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IGNvbHVtbjogdmFsdWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHVtbjogdmFsdWUuY29sdW1uLFxuICAgICAgYWxpYXM6IHZhbHVlLmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICB3aWR0aDogdmFsdWUud2lkdGg/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIGZ1bmN0aW9uOiB2YWx1ZS5mdW5jdGlvblxuICAgICAgICA/IHtcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6IHZhbHVlLmZ1bmN0aW9uLmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICAgIGFsaWFzOiB2YWx1ZS5mdW5jdGlvbi5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICB9XG4gICAgICAgIDogbnVsbCxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgZ2V0T3JkZXJlZEZpZWxkRW50cmllcygpOiBBcnJheTxcbiAgICBEeW5hbWljVmlld0J1aWxkZXJGaWVsZCAmIHsgc291cmNlSW5kZXg6IG51bWJlciB9XG4gID4ge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLm5vcm1hbGl6ZWRGaWVsZHMubWFwKChpdGVtLCBzb3VyY2VJbmRleCkgPT4gKHtcbiAgICAgIC4uLml0ZW0sXG4gICAgICBzb3VyY2VJbmRleCxcbiAgICB9KSk7XG4gICAgY29uc3QgcHJldmlld0luZGV4ZXMgPSB0aGlzLmdldEZpZWxkUHJldmlld1NvdXJjZUluZGV4ZXMoKTtcbiAgICByZXR1cm4gcHJldmlld0luZGV4ZXMubWFwKChpbmRleCkgPT4gZW50cmllc1tpbmRleF0pLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuICBwcml2YXRlIGdldEZpZWxkUHJldmlld1NvdXJjZUluZGV4ZXMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGJhc2VJbmRleGVzID0gdGhpcy5ub3JtYWxpemVkRmllbGRzLm1hcCgoXywgaW5kZXgpID0+IGluZGV4KTtcbiAgICBpZiAodGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBiYXNlSW5kZXhlcztcbiAgICB9XG4gICAgY29uc3QgcmVtYWluaW5nSW5kZXhlcyA9IGJhc2VJbmRleGVzLmZpbHRlcihcbiAgICAgIChpbmRleCkgPT4gaW5kZXggIT09IHRoaXMuZHJhZ2dpbmdGaWVsZEluZGV4XG4gICAgKTtcbiAgICBjb25zdCBpbnNlcnRpb25JbmRleCA9XG4gICAgICB0aGlzLmRyYWdQcmV2aWV3SW5kZXggPT09IG51bGxcbiAgICAgICAgPyBiYXNlSW5kZXhlcy5pbmRleE9mKHRoaXMuZHJhZ2dpbmdGaWVsZEluZGV4KVxuICAgICAgICA6IE1hdGgubWluKHRoaXMuZHJhZ1ByZXZpZXdJbmRleCwgcmVtYWluaW5nSW5kZXhlcy5sZW5ndGgpO1xuICAgIHJlbWFpbmluZ0luZGV4ZXMuc3BsaWNlKGluc2VydGlvbkluZGV4LCAwLCB0aGlzLmRyYWdnaW5nRmllbGRJbmRleCk7XG4gICAgcmV0dXJuIHJlbWFpbmluZ0luZGV4ZXM7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlRnVuY3Rpb25MYWJlbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3B0aW9uTGFiZWwodmFsdWUsIHRoaXMuZnVuY3Rpb25PcHRpb25zKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVKb2luT3BlcmF0b3JMYWJlbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3B0aW9uTGFiZWwodmFsdWUsIHRoaXMuam9pbk9wZXJhdG9yT3B0aW9ucyk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlSm9pbk9wZXJhdG9yT3B0aW9uVGV4dChvcHRpb246IER5bmFtaWNWaWV3QnVpbGRlck9wdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgZmFsbGJhY2sgPSBKT0lOX09QRVJBVE9SX0xBQkVMU1tvcHRpb24udmFsdWVdO1xuICAgIGNvbnN0IGhhc1JlYWRhYmxlVGV4dCA9IC9bQS1aYS16w4Atw79dLy50ZXN0KG9wdGlvbi50ZXh0KTtcblxuICAgIGlmICghZmFsbGJhY2sgfHwgaGFzUmVhZGFibGVUZXh0KSB7XG4gICAgICByZXR1cm4gb3B0aW9uLnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS4ke2ZhbGxiYWNrLmtleX1gLFxuICAgICAgZmFsbGJhY2suZmFsbGJhY2tcbiAgICApO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUZpbHRlck9wZXJhdG9yTGFiZWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4XG4gICAgICB9LmZpbHRlcnMub3BlcmF0b3JzLiR7dmFsdWUudG9Mb3dlckNhc2UoKX1gLFxuICAgICAgdGhpcy5odW1hbml6ZUtleSh2YWx1ZSlcbiAgICApO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZU9wdGlvbkxhYmVsKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uW11cbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gb3B0aW9ucy5maW5kKChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSB2YWx1ZSk/LnRleHQgPz8gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlRmlsdGVyRGlzcGxheVZhbHVlKGZpbHRlcjogRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyKTogc3RyaW5nIHsgLy8gTk9TT05BUiAtIGNvbXBsZXhpdHk6IGV4dHJhY3Rpb24gd291bGQgcmlzayBiZWhhdmlvciBjaGFuZ2VcbiAgICBpZiAoZmlsdGVyLnZhbHVlVHlwZSA9PT0gRklMVEVSX01PREVfRE9NQUlOKSB7XG4gICAgICByZXR1cm4gZmlsdGVyLmRvbWFpbkV4cHJlc3Npb24gPz8gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIGlmIChmaWx0ZXIudmFsdWVUeXBlID09PSBcInBhcmFtZXRlclwiKSB7XG4gICAgICByZXR1cm4gYDoke2ZpbHRlci5wYXJhbWV0ZXJOYW1lID8/IEVNUFRZX1ZBTFVFfWA7XG4gICAgfVxuICAgIGlmIChmaWx0ZXIub3BlcmF0b3IgPT09IFwiSU5cIikge1xuICAgICAgcmV0dXJuIChmaWx0ZXIudmFsdWVzID8/IFtdKS5qb2luKFwiLCBcIik7XG4gICAgfVxuICAgIGlmIChmaWx0ZXIub3BlcmF0b3IgPT09IFwiQkVUV0VFTlwiKSB7XG4gICAgICByZXR1cm4gYCR7ZmlsdGVyLnZhbHVlcz8uWzBdID8/IEVNUFRZX1ZBTFVFfSAtICR7ZmlsdGVyLnZhbHVlcz8uWzFdID8/IEVNUFRZX1ZBTFVFXG4gICAgICAgIH1gO1xuICAgIH1cbiAgICBpZiAoW1wiRU1QVFlcIiwgXCJOT1RfRU1QVFlcIl0uaW5jbHVkZXMoZmlsdGVyLm9wZXJhdG9yKSkge1xuICAgICAgcmV0dXJuIFwiLVwiO1xuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyLnZhbHVlID8/IEVNUFRZX1ZBTFVFO1xuICB9XG4gIHByaXZhdGUgYnVpbGRHZW5lcmF0ZWRTcWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGRHZW5lcmF0ZWRTcWwoXG4gICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcyxcbiAgICAgIHRoaXMubm9ybWFsaXplZEZpZWxkcyxcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5qb2lucyxcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWx0ZXJzLFxuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnksXG4gICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc29ydGluZyxcbiAgICAgIHRoaXMuZ2V0U3FsQ29udGV4dCgpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGJ1aWxkV2hlcmVTcWwoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBidWlsZFdoZXJlU3FsKHRoaXMuZ2V0U3FsQ29udGV4dCgpLCB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmlsdGVycyk7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEdyb3VwQnlTcWwoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBidWlsZEdyb3VwQnlTcWwodGhpcy5nZXRTcWxDb250ZXh0KCksIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5KTtcbiAgfVxuICBwcml2YXRlIGJ1aWxkT3JkZXJCeVNxbCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGJ1aWxkT3JkZXJCeVNxbCh0aGlzLmdldFNxbENvbnRleHQoKSwgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvcnRpbmcpO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZVNvdXJjZVNxbChzb3VyY2U6IER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uIHwge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgYWxpYXM6IHN0cmluZztcbiAgfSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVTb3VyY2VTcWwodGhpcy5nZXRTcWxDb250ZXh0KCksIHNvdXJjZSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlSm9pblNxbChpdGVtOiBEeW5hbWljVmlld0J1aWxkZXJKb2luKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUpvaW5TcWwodGhpcy5nZXRTcWxDb250ZXh0KCksIGl0ZW0pO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtblNxbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUNvbHVtblNxbCh0aGlzLmdldFNxbENvbnRleHQoKSwgdmFsdWUpO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUZpZWxkU3FsKGZpZWxkOiBzdHJpbmcgfCBEeW5hbWljVmlld0J1aWxkZXJGaWVsZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVGaWVsZFNxbCh0aGlzLmdldFNxbENvbnRleHQoKSwgZmllbGQpO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUZ1bmN0aW9uU3FsKGl0ZW06IER5bmFtaWNWaWV3QnVpbGRlckZ1bmN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUZ1bmN0aW9uU3FsKHRoaXMuZ2V0U3FsQ29udGV4dCgpLCBpdGVtKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVTb3J0U3FsKGl0ZW06IER5bmFtaWNWaWV3QnVpbGRlclNvcnQpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlU29ydFNxbCh0aGlzLmdldFNxbENvbnRleHQoKSwgaXRlbSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlRmlsdGVyU3FsKGZpbHRlcjogRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyKTogc3RyaW5nIHsgLy8gTk9TT05BUiAtIGNvbXBsZXhpdHk6IGV4dHJhY3Rpb24gd291bGQgcmlzayBiZWhhdmlvciBjaGFuZ2VcbiAgICByZXR1cm4gcmVzb2x2ZUZpbHRlclNxbCh0aGlzLmdldFNxbENvbnRleHQoKSwgZmlsdGVyKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGaWx0ZXJPcGVyYXRvclNxbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUZpbHRlck9wZXJhdG9yU3FsKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGaWx0ZXJWYWx1ZVNxbChcbiAgICBjb2x1bW5WYWx1ZTogc3RyaW5nLFxuICAgIG9wZXJhdG9yOiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd25cbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUZpbHRlclZhbHVlU3FsKHRoaXMuZ2V0U3FsQ29udGV4dCgpLCBjb2x1bW5WYWx1ZSwgb3BlcmF0b3IsIHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGRlY29yYXRlTGlrZVZhbHVlKG9wZXJhdG9yOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkZWNvcmF0ZUxpa2VWYWx1ZShvcGVyYXRvciwgdmFsdWUpO1xuICB9XG4gIHByaXZhdGUgcXVvdGVTcWxWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcXVvdGVTcWxWYWx1ZSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBzeW5jTGF5b3V0TW9kZUl0ZW1zKCk6IHZvaWQge1xuICAgIHRoaXMubGF5b3V0TW9kZUl0ZW1zWzBdLmxhYmVsID0gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmxheW91dE1vZGVzLnN0YWNrZWRgLFxuICAgICAgXCJCbG9jb3NcIlxuICAgICk7XG4gICAgdGhpcy5sYXlvdXRNb2RlSXRlbXNbMV0ubGFiZWwgPSB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubGF5b3V0TW9kZXMuc3BsaXRgLFxuICAgICAgXCJMaXN0YVwiXG4gICAgKTtcbiAgICB0aGlzLnN5bmNTZWxlY3RlZExheW91dE1vZGVJdGVtcygpO1xuICB9XG4gIHByaXZhdGUgc3luY0ZpbHRlck1vZGVJdGVtcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlck1vZGVJdGVtc1swXS5sYWJlbCA9IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLm1vZGVzLmNvbmRpdGlvbmAsXG4gICAgICBcIkZpbHRyb1wiXG4gICAgKTtcbiAgICB0aGlzLmZpbHRlck1vZGVJdGVtc1sxXS5sYWJlbCA9IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmRvbWFpbkxhYmVsYCxcbiAgICAgIFwiRXhwcmVzc2FvIGRlIGRvbWluaW9cIlxuICAgICk7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRGaWx0ZXJNb2RlSXRlbXMoKTtcbiAgfVxuICBwcml2YXRlIHN5bmNTb3J0RGlyZWN0aW9uSXRlbXMoKTogdm9pZCB7XG4gICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbXMuc3BsaWNlKFxuICAgICAgMCxcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW1zLmxlbmd0aCxcbiAgICAgIC4uLnRoaXMuc29ydERpcmVjdGlvbk9wdGlvbnMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBsYWJlbDogaXRlbS50ZXh0LFxuICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgIH0pKVxuICAgICk7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRTb3J0RGlyZWN0aW9uSXRlbXMoKTtcbiAgfVxuICBwcml2YXRlIHN5bmNTZWxlY3RlZExheW91dE1vZGVJdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMubGF5b3V0TW9kZUl0ZW1zLmZpbmQoXG4gICAgICAoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdGhpcy5sYXlvdXRNb2RlXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdGVkTGF5b3V0TW9kZUl0ZW1zLnNwbGljZShcbiAgICAgIDAsXG4gICAgICB0aGlzLnNlbGVjdGVkTGF5b3V0TW9kZUl0ZW1zLmxlbmd0aCxcbiAgICAgIC4uLihzZWxlY3RlZCA/IFtzZWxlY3RlZF0gOiBbXSlcbiAgICApO1xuICB9XG4gIHByaXZhdGUgc3luY1NlbGVjdGVkRmlsdGVyTW9kZUl0ZW1zKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5maWx0ZXJNb2RlSXRlbXMuZmluZChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSB0aGlzLmZpbHRlck1vZGFsTW9kZVxuICAgICk7XG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlck1vZGVJdGVtcy5zcGxpY2UoXG4gICAgICAwLFxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlck1vZGVJdGVtcy5sZW5ndGgsXG4gICAgICAuLi4oc2VsZWN0ZWQgPyBbc2VsZWN0ZWRdIDogW10pXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHN5bmNTZWxlY3RlZFNvcnREaXJlY3Rpb25JdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc29ydERpcmVjdGlvbkl0ZW1zLmZpbmQoXG4gICAgICAoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdGhpcy5zb3J0RHJhZnQuZGlyZWN0aW9uXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdGVkU29ydERpcmVjdGlvbkl0ZW1zLnNwbGljZShcbiAgICAgIDAsXG4gICAgICB0aGlzLnNlbGVjdGVkU29ydERpcmVjdGlvbkl0ZW1zLmxlbmd0aCxcbiAgICAgIC4uLihzZWxlY3RlZCA/IFtzZWxlY3RlZF0gOiBbXSlcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0IGZpbHRlclNlcXVlbmNlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJFZGl0SW5kZXggPz8gdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMubGVuZ3RoO1xuICB9XG4gIHByaXZhdGUgZ2V0U3FsQ29udGV4dCgpOiBTcWxDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uczogdGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS5jb2x1bW5zID8/IFtdLFxuICAgICAgdGFibGVzOiB0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLnRhYmxlcyA/PyBbXSxcbiAgICAgIHNvdXJjZXM6IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBwYXJzZU11bHRpVmFsdWVUZXh0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEFsaWFzRm9yVGFibGUodGFibGU6IER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCB3b3JkcyA9IHRhYmxlLnRleHRcbiAgICAgIC5zcGxpdCgvW1xcc18uLV0rLylcbiAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0udHJpbSgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAod29yZHMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHdvcmRzXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW1bMF0/LnRvTG93ZXJDYXNlKCkgPz8gRU1QVFlfVkFMVUUpXG4gICAgICAgIC5qb2luKFwiXCIpO1xuICAgIH1cbiAgICByZXR1cm4gKHRhYmxlLnZhbHVlLnNwbGl0KFwiLlwiKS5wb3AoKSA/PyB0YWJsZS52YWx1ZSlcbiAgICAgIC5zbGljZSgwLCBBTElBU19NQVhfTEVOR1RIKVxuICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlRGVmYXVsdFNvdXJjZUFsaWFzKHRhYmxlVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnJlc29sdmVUYWJsZU9wdGlvbih0YWJsZVZhbHVlKTtcbiAgICByZXR1cm4gdGFibGUgPyB0aGlzLmJ1aWxkQWxpYXNGb3JUYWJsZSh0YWJsZSkgOiBFTVBUWV9WQUxVRTtcbiAgfVxuICBwcml2YXRlIGhhc0N1c3RvbUFsaWFzKHRhYmxlVmFsdWU6IHN0cmluZywgYWxpYXM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5yZXNvbHZlVGFibGVPcHRpb24odGFibGVWYWx1ZSk7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gISFhbGlhcy50cmltKCkgJiYgYWxpYXMudHJpbSgpICE9PSB0aGlzLmJ1aWxkQWxpYXNGb3JUYWJsZSh0YWJsZSk7XG4gIH1cbiAgb25GaWVsZEZ1bmN0aW9uTmFtZUNoYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uTmFtZSkge1xuICAgICAgdGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuZnVuY3Rpb25BbGlhcyA9IEVNUFRZX1ZBTFVFO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZENvbHVtbiA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbih0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5jb2x1bW4pO1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkQ29sdW1uICYmXG4gICAgICAhdGhpcy5maWx0ZXJGdW5jdGlvblNlbGVjdGFibGVDb2x1bW5zKHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uTmFtZSlcbiAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS52YWx1ZSlcbiAgICAgICAgLmluY2x1ZGVzKHNlbGVjdGVkQ29sdW1uLnZhbHVlKVxuICAgICkge1xuICAgICAgdGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuZnVuY3Rpb25OYW1lID0gRU1QVFlfVkFMVUU7XG4gICAgICB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbkFsaWFzID0gRU1QVFlfVkFMVUU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuZnVuY3Rpb25BbGlhcy50cmltKCkpIHtcbiAgICAgIHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uQWxpYXMgPSB0aGlzLmJ1aWxkRmllbGRGdW5jdGlvbkFsaWFzKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYnVpbGRGdW5jdGlvbkFsaWFzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmNvbHVtbik7XG4gICAgY29uc3QgYmFzZSA9IGNvbHVtbj8udGV4dCA/PyB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5jb2x1bW4gPz8gRU1QVFlfVkFMVUU7XG4gICAgY29uc3Qgc3VmZml4ID0gdGhpcy5zbHVnaWZ5KGJhc2UpO1xuICAgIHJldHVybiBzdWZmaXhcbiAgICAgID8gYCR7dGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuZnVuY3Rpb25OYW1lfV8ke3N1ZmZpeH1gXG4gICAgICA6IHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uTmFtZTtcbiAgfVxuICBwcml2YXRlIGJ1aWxkRmllbGRGdW5jdGlvbkFsaWFzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRGdW5jdGlvbkFsaWFzKCk7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEZpZWxkRnVuY3Rpb25EcmFmdCgpOiBEeW5hbWljVmlld0J1aWxkZXJGaWVsZEZ1bmN0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gdGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuZnVuY3Rpb25OYW1lLnRyaW0oKTtcbiAgICBpZiAoIWZ1bmN0aW9uTmFtZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBmdW5jdGlvbk5hbWUsXG4gICAgICBhbGlhczogKFxuICAgICAgICB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbkFsaWFzIHx8IHRoaXMuYnVpbGRGaWVsZEZ1bmN0aW9uQWxpYXMoKVxuICAgICAgKS50cmltKCksXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIHBhdGNoRmllbGRNb2RhbERyYWZ0KFxuICAgIGNvbHVtbjogc3RyaW5nLFxuICAgIHBhdGNoOiBQYXJ0aWFsPER5bmFtaWNWaWV3QnVpbGRlckZpZWxkPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5maWVsZE1vZGFsRHJhZnRzID0gdGhpcy5zdGF0ZVNlcnZpY2UuZmllbGRNb2RhbERyYWZ0cy5tYXAoKGl0ZW0pID0+XG4gICAgICBpdGVtLmNvbHVtbiA9PT0gY29sdW1uXG4gICAgICAgID8ge1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgIH1cbiAgICAgICAgOiBpdGVtXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIG1lcmdlTGVnYWN5RnVuY3Rpb25zSW50b0ZpZWxkcyhcbiAgICBmaWVsZHM6IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkW10sXG4gICAgZnVuY3Rpb25zOiBEeW5hbWljVmlld0J1aWxkZXJGdW5jdGlvbltdXG4gICk6IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkW10ge1xuICAgIGNvbnN0IGZpZWxkQnlDb2x1bW4gPSBuZXcgTWFwKGZpZWxkcy5tYXAoKGl0ZW0pID0+IFtpdGVtLmNvbHVtbiwgeyAuLi5pdGVtIH1dKSk7XG5cbiAgICBmdW5jdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudCA9IGZpZWxkQnlDb2x1bW4uZ2V0KGl0ZW0uY29sdW1uKSA/PyB7IGNvbHVtbjogaXRlbS5jb2x1bW4gfTtcbiAgICAgIGN1cnJlbnQuZnVuY3Rpb24gPz89IHtcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBpdGVtLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgYWxpYXM6IGl0ZW0uYWxpYXMsXG4gICAgICB9O1xuICAgICAgZmllbGRCeUNvbHVtbi5zZXQoaXRlbS5jb2x1bW4sIGN1cnJlbnQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZmllbGRCeUNvbHVtbi52YWx1ZXMoKSk7XG4gIH1cbiAgcHJpdmF0ZSBleHRyYWN0RnVuY3Rpb25zRnJvbUZpZWxkcyhcbiAgICBmaWVsZHM6IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkW11cbiAgKTogRHluYW1pY1ZpZXdCdWlsZGVyRnVuY3Rpb25bXSB7XG4gICAgcmV0dXJuIGZpZWxkc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gISFpdGVtLmZ1bmN0aW9uPy5mdW5jdGlvbk5hbWU/LnRyaW0oKSlcbiAgICAgIC5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogaXRlbS5mdW5jdGlvbj8uZnVuY3Rpb25OYW1lPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgIGNvbHVtbjogaXRlbS5jb2x1bW4sXG4gICAgICAgIGFsaWFzOlxuICAgICAgICAgIGl0ZW0uZnVuY3Rpb24/LmFsaWFzPy50cmltKCkgfHwgLy8gTk9TT05BUiAtIGVtcHR5IHN0cmluZyBmYWxsYmFjayBpcyBpbnRlbnRpb25hbFxuICAgICAgICAgIGl0ZW0uYWxpYXM/LnRyaW0oKSB8fCAvLyBOT1NPTkFSIC0gZW1wdHkgc3RyaW5nIGZhbGxiYWNrIGlzIGludGVudGlvbmFsXG4gICAgICAgICAgdGhpcy5zbHVnaWZ5KGAke2l0ZW0uZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZSA/PyBFTVBUWV9WQUxVRX1fJHtpdGVtLmNvbHVtbn1gKSxcbiAgICAgIH0pKTtcbiAgfVxuICBwcml2YXRlIHNsdWdpZnkodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNsdWdpZnkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgZGVkdXBsaWNhdGVCeUtleTxUPihcbiAgICBpdGVtczogVFtdLFxuICAgIGtleVJlc29sdmVyOiAoaXRlbTogVCkgPT4gc3RyaW5nXG4gICk6IFRbXSB7XG4gICAgcmV0dXJuIGRlZHVwbGljYXRlQnlLZXkoaXRlbXMsIGtleVJlc29sdmVyKTtcbiAgfVxuICBwcml2YXRlIGh1bWFuaXplS2V5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5zcGxpdChcIl9cIilcbiAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBpdGVtLnNsaWNlKDEpKVxuICAgICAgLmpvaW4oXCIgXCIpO1xuICB9XG4gIHByaXZhdGUgaW5zdGFudFdpdGhGYWxsYmFjayhrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoa2V5KTtcbiAgICByZXR1cm4gdHJhbnNsYXRlZCAmJiB0cmFuc2xhdGVkICE9PSBrZXkgPyB0cmFuc2xhdGVkIDogZmFsbGJhY2s7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEZpbHRlckZyb21EcmFmdCgpOiBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXIgfCBudWxsIHsgLy8gTk9TT05BUiAtIGNvbXBsZXhpdHk6IGV4dHJhY3Rpb24gd291bGQgcmlzayBiZWhhdmlvciBjaGFuZ2VcbiAgICBpZiAodGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTikge1xuICAgICAgY29uc3QgZG9tYWluRXhwcmVzc2lvbiA9IHRoaXMuZmlsdGVyRHJhZnQuZG9tYWluRXhwcmVzc2lvbi50cmltKCk7XG5cbiAgICAgIGlmICghZG9tYWluRXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgb3BlcmF0b3I6IEVNUFRZX1ZBTFVFLFxuICAgICAgICBjb25uZWN0b3I6IHRoaXMuZmlsdGVyRHJhZnQuY29ubmVjdG9yLFxuICAgICAgICBvcHRpb25hbDogdGhpcy5maWx0ZXJEcmFmdC5vcHRpb25hbCxcbiAgICAgICAgdmFsdWVUeXBlOiBGSUxURVJfTU9ERV9ET01BSU4sXG4gICAgICAgIGRvbWFpbkV4cHJlc3Npb24sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4gfHwgIXRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQ6IER5bmFtaWNWaWV3QnVpbGRlckZpbHRlciA9IHtcbiAgICAgIGNvbHVtbjogdGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4sXG4gICAgICBvcGVyYXRvcjogdGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvcixcbiAgICAgIGNvbm5lY3RvcjogdGhpcy5maWx0ZXJEcmFmdC5jb25uZWN0b3IsXG4gICAgICBvcHRpb25hbDogdGhpcy5maWx0ZXJEcmFmdC5vcHRpb25hbCxcbiAgICAgIHZhbHVlVHlwZTogdGhpcy5maWx0ZXJOZWVkc1ZhbHVlID8gdGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUgOiBERUZBVUxUX0ZJTFRFUl9WQUxVRV9UWVBFLFxuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuZmlsdGVyTmVlZHNWYWx1ZSkge1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyRHJhZnQudmFsdWVUeXBlID09PSBcInBhcmFtZXRlclwiKSB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJOYW1lID0gdGhpcy5maWx0ZXJEcmFmdC5wYXJhbWV0ZXJOYW1lLnRyaW0oKTtcblxuICAgICAgaWYgKCFwYXJhbWV0ZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBuZXh0LnBhcmFtZXRlck5hbWUgPSBwYXJhbWV0ZXJOYW1lO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IgPT09IFwiSU5cIikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5wYXJzZU11bHRpVmFsdWVUZXh0KHRoaXMuZmlsdGVyRHJhZnQudmFsdWVzVGV4dCk7XG5cbiAgICAgIGlmICghdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbmV4dC52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvciA9PT0gXCJCRVRXRUVOXCIpIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5maWx0ZXJEcmFmdC5iZXR3ZWVuU3RhcnQudHJpbSgpO1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5maWx0ZXJEcmFmdC5iZXR3ZWVuRW5kLnRyaW0oKTtcblxuICAgICAgaWYgKCFzdGFydCB8fCAhZW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBuZXh0LnZhbHVlcyA9IFtzdGFydCwgZW5kXTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWx0ZXJEcmFmdC52YWx1ZS50cmltKCk7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBuZXh0LnZhbHVlID0gdmFsdWU7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlRmlsdGVyRHJhZnRTcWxQcmV2aWV3KCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuYnVpbGRGaWx0ZXJGcm9tRHJhZnQoKTtcblxuICAgIGlmICghbmV4dCkge1xuICAgICAgcmV0dXJuIEVNUFRZX1ZBTFVFO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlc29sdmVGaWx0ZXJTcWwobmV4dCk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlRmlsdGVyRHJhZnREaXNwbGF5VmFsdWUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTikge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyRHJhZnQuZG9tYWluRXhwcmVzc2lvbi50cmltKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyRHJhZnQudmFsdWVUeXBlID09PSBcInBhcmFtZXRlclwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJEcmFmdC5wYXJhbWV0ZXJOYW1lXG4gICAgICAgID8gYDoke3RoaXMuZmlsdGVyRHJhZnQucGFyYW1ldGVyTmFtZX1gXG4gICAgICAgIDogRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIGlmICh0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yID09PSBcIklOXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlc1RleHQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yID09PSBcIkJFVFdFRU5cIikge1xuICAgICAgcmV0dXJuIFt0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5TdGFydCwgdGhpcy5maWx0ZXJEcmFmdC5iZXR3ZWVuRW5kXVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5qb2luKFwiIC0gXCIpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZmlsdGVyTmVlZHNWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LnN0YXRlcy5vcHRpb25hbGAsXG4gICAgICAgIFwiU2VtIHZhbG9yXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCB7IFZpc3VhbFNxbEVkaXRvckNvbXBvbmVudCBhcyBEeW5hbWljVmlld0J1aWxkZXJDb21wb25lbnQgfTtcbiIsIjxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlclwiIFthdHRyLmFyaWEtYnVzeV09XCJsb2FkaW5nXCI+XG4gIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fdG9vbGJhclwiPlxuICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fdG9vbGJhci1jb3B5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3RpdGxlXCI+XG4gICAgICAgIHt7IGNvbmZpZy5tZXRhZGF0YS50aXRsZSB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3N1YnRpdGxlXCI+XG4gICAgICAgIHt7IGNvbmZpZy5tZXRhZGF0YS5kZXNjcmlwdGlvbiB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX190b29sYmFyLWFjdGlvbnNcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Rvb2xiYXItbGFiZWxcIj5cbiAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmxheW91dE1vZGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNkYy1zZWxlY3QtYnV0dG9uXG4gICAgICAgIFtpdGVtc109XCJsYXlvdXRNb2RlSXRlbXNcIlxuICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZExheW91dE1vZGVJdGVtc1wiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTGF5b3V0TW9kZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgID48L3NkYy1zZWxlY3QtYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcHJldmlldy10b2dnbGVcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlUHJldmlldygpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInByZXZpZXdWaXNpYmxlXCJcbiAgICAgICAgW3RpdGxlXT1cInByZXZpZXdUb2dnbGVMYWJlbFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicHJldmlld1RvZ2dsZUxhYmVsXCJcbiAgICAgICAgPlxuICAgICAgICA8aVxuICAgICAgICAgIFtjbGFzc109XCJwcmV2aWV3VmlzaWJsZSA/ICdmYXMgZmEtZXllLXNsYXNoJyA6ICdmYXMgZmEtZXllJ1wiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvaT5cbiAgICAgICAge3sgcHJldmlld1RvZ2dsZUxhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgQGlmIChzZWxlY3Rpb25Nb2RhbFZpc2libGUpIHtcbiAgICA8c2RjLW1vZGFsXG4gICAgICBbdmlzaWJsZV09XCJzZWxlY3Rpb25Nb2RhbFZpc2libGVcIlxuICAgICAgKHZpc2libGVDaGFuZ2UpPVwiJGV2ZW50ID8gKHNlbGVjdGlvbk1vZGFsVmlzaWJsZSA9IHRydWUpIDogY2xvc2VTZWxlY3Rpb25Nb2RhbCgpXCJcbiAgICAgIFtoZWFkZXJdPVwic2VsZWN0aW9uTW9kYWxUaXRsZVwiXG4gICAgICBbd2lkdGhdPVwibW9kYWxEaW1lbnNpb25zLnNlbGVjdGlvbi53aWR0aFwiXG4gICAgICBbaGVpZ2h0XT1cIm1vZGFsRGltZW5zaW9ucy5zZWxlY3Rpb24uaGVpZ2h0XCJcbiAgICAgIFttYXhpbWl6YWJsZV09XCJmYWxzZVwiXG4gICAgICBbZm9vdGVyQnV0dG9uc109XCJbXVwiXG4gICAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXNoZWxsIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbC0tZnVsbFxuICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tZmxvdyBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3RhZ2VcIlxuICAgICAgICA+XG4gICAgICAgIEBpZiAoc2VsZWN0aW9uTW9kYWxNb2RlID09PSAndGFibGVzJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtaW5saW5lLXN1cmZhY2VcIj5cbiAgICAgICAgICAgIDxzZGMtdGV4dGJveFxuICAgICAgICAgICAgICBbbGFiZWxdPVwibW9kYWxTZWFyY2hMYWJlbFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJtb2RhbFNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0aW9uTW9kYWxTZWFyY2hcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3Rpb25Nb2RhbFNlYXJjaCA9ICRldmVudFwiXG4gICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1jYXJkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1jYXJkLS1zZWN0aW9uXG4gICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdGFnZS1ib2R5XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXRhYmxlXG4gICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi10YWJsZS0tY2hvb3NlclxuICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tdGFibGUtLWZsdWlkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1oZWFkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tY29sXCI+XG4gICAgICAgICAgICAgICAgICB7eyBtb2RhbE5hbWVMYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWNvbFwiPlxuICAgICAgICAgICAgICAgICAge3sgbW9kYWxUeXBlTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1jb2wgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1jb2wtLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAge3sgbW9kYWxTZWxlY3RMYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tYm9keVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBzZWxlY3Rpb25Nb2RhbFJvd3M7IHRyYWNrIHRyYWNrQnlJZCgkaW5kZXgsIHJvdykpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXJvd1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5keW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXJvdy0tc2VsZWN0ZWRdPVwicm93LnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCInYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInJvdy5kaXNhYmxlZCA/IC0xIDogMFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJyb3cuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInJvdy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb25Nb2RhbFJvdyhyb3cuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25TZWxlY3RhYmxlUm93S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cudGFibGVMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXBhdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cucGF0aFR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvdy5kYkxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tZGJcIj57eyByb3cuZGJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cuZGJMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXNlcGFyYXRvclwiPi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi10YWJsZS1sYWJlbFwiPnt7IHJvdy50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tdGFibGUtbGFiZWxcIj57eyByb3cudGFibGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tc2VwYXJhdG9yXCI+Ljwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tYWNjZW50XCI+e3sgcm93Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvdy5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tY2VsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWNlbGwtLW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyByb3cubWV0YSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvdy5ub3RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tbm90ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cubm90ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWNlbGwgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1jZWxsLS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLW1hcmtlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1tYXJrZXItLXNlbGVjdGVkXT1cInJvdy5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hlY2tcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGwgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN0YWdlLWJvZHlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPHNkYy1waWNrbGlzdFxuICAgICAgICAgICAgICBbaXRlbXNdPVwic2VsZWN0aW9uTW9kYWxQaWNrbGlzdEl0ZW1zXCJcbiAgICAgICAgICAgICAgW3NlbGVjdGVkSWRzXT1cInNlbGVjdGlvbk1vZGFsU2VsZWN0ZWRQaWNrbGlzdElkc1wiXG4gICAgICAgICAgICAgIGlkS2V5PVwiaWRcIlxuICAgICAgICAgICAgICB0aXRsZUtleT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgdGl0bGVQcmVmaXhLZXk9XCJ0aXRsZVByZWZpeFwiXG4gICAgICAgICAgICAgIHRpdGxlU3VmZml4S2V5PVwidGl0bGVTdWZmaXhcIlxuICAgICAgICAgICAgICB0aXRsZVByZWZpeENvbG9yS2V5PVwidGl0bGVQcmVmaXhDb2xvclwiXG4gICAgICAgICAgICAgIHRpdGxlU3VmZml4Q29sb3JLZXk9XCJ0aXRsZVN1ZmZpeENvbG9yXCJcbiAgICAgICAgICAgICAgYmFkZ2VLZXk9XCJiYWRnZVwiXG4gICAgICAgICAgICAgIGJhZGdlQ29sb3JLZXk9XCJiYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbc2hvd0l0ZW1JY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db3VudGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tb2RhbHMuc2VhcmNoUGxhY2Vob2xkZXInXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uU2VsZWN0aW9uTW9kYWxTZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3NkYy1waWNrbGlzdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGZvb3RlciBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1mb290ZXJcIj5cbiAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jYW5jZWwnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgcHJpb3JpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZVNlbGVjdGlvbk1vZGFsKClcIlxuICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNsb3NlU2VsZWN0aW9uTW9kYWwoKVwiXG4gICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY29uZmlybVNlbGVjdGlvbicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAoY2xpY2spPVwiY29uZmlybVNlbGVjdGlvbk1vZGFsKClcIlxuICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNvbmZpcm1TZWxlY3Rpb25Nb2RhbCgpXCJcbiAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvc2RjLW1vZGFsPlxuICB9XG5cbiAgQGlmIChzb3VyY2VNb2RhbFZpc2libGUpIHtcbiAgICA8c2RjLW1vZGFsXG4gICAgICBbdmlzaWJsZV09XCJzb3VyY2VNb2RhbFZpc2libGVcIlxuICAgICAgKHZpc2libGVDaGFuZ2UpPVwiJGV2ZW50ID8gKHNvdXJjZU1vZGFsVmlzaWJsZSA9IHRydWUpIDogY2xvc2VTb3VyY2VNb2RhbCgpXCJcbiAgICAgIFtoZWFkZXJdPVwic291cmNlTW9kYWxUaXRsZVwiXG4gICAgICBbd2lkdGhdPVwibW9kYWxEaW1lbnNpb25zLnNvdXJjZS53aWR0aFwiXG4gICAgICBbaGVpZ2h0XT1cIm1vZGFsRGltZW5zaW9ucy5zb3VyY2UuaGVpZ2h0XCJcbiAgICAgIFttYXhpbWl6YWJsZV09XCJmYWxzZVwiXG4gICAgICBbZm9vdGVyQnV0dG9uc109XCJbXVwiXG4gICAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXNoZWxsIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1tb2RhbFwiPlxuICAgICAgICA8c2RjLXRpbWVsaW5lXG4gICAgICAgICAgW2l0ZW1zXT1cInNvdXJjZU1vZGFsVGltZWxpbmVJdGVtc1wiXG4gICAgICAgICAgW2FjdGl2ZUluZGV4XT1cInNvdXJjZU1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUgPyAxIDogMFwiXG4gICAgICAgICAgW2ludGVyYWN0aXZlXT1cInRydWVcIlxuICAgICAgICAgIFtzaG93RGVzY3JpcHRpb25zXT1cImZhbHNlXCJcbiAgICAgICAgICBbYXJpYUxhYmVsXT1cInNvdXJjZU1vZGFsVGltZWxpbmVBcmlhTGFiZWxcIlxuICAgICAgICAgIChzdGVwU2VsZWN0KT1cIm9uU291cmNlTW9kYWxUaW1lbGluZVN0ZXBTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgID48L3NkYy10aW1lbGluZT5cbiAgICAgICAgQGlmIChzb3VyY2VNb2RhbFNlbGVjdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc2hlbGwtLWZ1bGxcbiAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1mbG93IGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdGFnZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGwgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN0YWdlLWJvZHlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzZGMtcGlja2xpc3RcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwic291cmNlTW9kYWxQaWNrbGlzdEl0ZW1zXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRJZHNdPVwic291cmNlTW9kYWxTZWxlY3RlZFBpY2tsaXN0SWRzXCJcbiAgICAgICAgICAgICAgICBpZEtleT1cImlkXCJcbiAgICAgICAgICAgICAgICB0aXRsZUtleT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICB0aXRsZVByZWZpeEtleT1cInRpdGxlUHJlZml4XCJcbiAgICAgICAgICAgICAgICB0aXRsZVN1ZmZpeEtleT1cInRpdGxlU3VmZml4XCJcbiAgICAgICAgICAgICAgICB0aXRsZVByZWZpeENvbG9yS2V5PVwidGl0bGVQcmVmaXhDb2xvclwiXG4gICAgICAgICAgICAgICAgdGl0bGVTdWZmaXhDb2xvcktleT1cInRpdGxlU3VmZml4Q29sb3JcIlxuICAgICAgICAgICAgICAgIGJhZGdlS2V5PVwiYmFkZ2VcIlxuICAgICAgICAgICAgICAgIGJhZGdlQ29sb3JLZXk9XCJiYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgICBbc2hvd1BhZ2luYXRvcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dJdGVtSWNvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db3VudGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbYXV0b1Jlc2l6ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uU291cmNlTW9kYWxTZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPjwvc2RjLXBpY2tsaXN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZpZWxkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZC0tc3RyZXRjaFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fZmllbGQtY29uZmlnLXNoZWxsXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1saXN0LXNoZWxsXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NvdXJjZS1jb25maWctbGlzdFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygc291cmNlTW9kYWxDb25maWd1cmVkSXRlbXM7IHRyYWNrIHRyYWNrQnlJZCgkaW5kZXgsIGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NvdXJjZS1jb25maWctcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc291cmNlLWNvbmZpZy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi10YWJsZS1sYWJlbFwiPnt7IGl0ZW0uZGJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1zZXBhcmF0b3JcIj4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWFjY2VudFwiPnt7IGl0ZW0udGFibGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc291cmNlLWNvbmZpZy1jb250cm9sc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGV4dGJveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmFsaWFzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpdGVtLmFsaWFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU291cmNlTW9kYWxBbGlhc0NoYW5nZShpdGVtLnRhYmxlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBmb290ZXIgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyXCI+XG4gICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2FuY2VsJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHByaW9yaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2VTb3VyY2VNb2RhbCgpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjbG9zZVNvdXJjZU1vZGFsKClcIlxuICAgICAgICA+PC9zZGMtYnV0dG9uPlxuICAgICAgICBAaWYgKHNvdXJjZU1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSAmJiBzb3VyY2VNb2RhbENhblByb2NlZWQpIHtcbiAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMubmV4dFN0ZXAnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWR2YW5jZVNvdXJjZU1vZGFsU3RlcCgpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImFkdmFuY2VTb3VyY2VNb2RhbFN0ZXAoKVwiXG4gICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKHNvdXJjZU1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2F2ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc291cmNlTW9kYWxDYW5Qcm9jZWVkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzYXZlU291cmNlTW9kYWwoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlU291cmNlTW9kYWwoKVwiXG4gICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9zZGMtbW9kYWw+XG4gIH1cblxuICBAaWYgKGpvaW5Nb2RhbFZpc2libGUpIHtcbiAgICA8c2RjLW1vZGFsXG4gICAgICBbdmlzaWJsZV09XCJqb2luTW9kYWxWaXNpYmxlXCJcbiAgICAgICh2aXNpYmxlQ2hhbmdlKT1cIiRldmVudCA/IChqb2luTW9kYWxWaXNpYmxlID0gdHJ1ZSkgOiBjbG9zZUpvaW5Nb2RhbCgpXCJcbiAgICAgIFtoZWFkZXJdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuY2FyZHMuam9pbnMudGl0bGUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICBbd2lkdGhdPVwibW9kYWxEaW1lbnNpb25zLmpvaW4ud2lkdGhcIlxuICAgICAgW2hlaWdodF09XCJtb2RhbERpbWVuc2lvbnMuam9pbi5oZWlnaHRcIlxuICAgICAgW21heGltaXphYmxlXT1cImZhbHNlXCJcbiAgICAgIFtmb290ZXJCdXR0b25zXT1cIltdXCJcbiAgICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc2hlbGwgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2pvaW4tbW9kYWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19qb2luLW1vZGFsLXRvcFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeSBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LWxhYmVsXCI+XG4gICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy5sZWZ0JykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LXZhbHVlXG4gICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWUtLXBhdGhcIlxuICAgICAgICAgICAgICA+e3sgam9pblNvdXJjZVN1bW1hcnkgfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZmllbGQtLWNvbXBhY3RcbiAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPHNkYy1jb21ib2JveFxuICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMub3BlcmF0b3InXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiam9pbkRyYWZ0Lm9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiam9pbkRyYWZ0Lm9wZXJhdG9yID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiam9pbk9wZXJhdG9yT3B0aW9uc1wiXG4gICAgICAgICAgICAgIFthcHBlbmRUb109XCJvdmVybGF5QXBwZW5kVGFyZ2V0XCJcbiAgICAgICAgICAgICAgW3pJbmRleF09XCJvdmVybGF5WkluZGV4XCJcbiAgICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgID48L3NkYy1jb21ib2JveD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnkgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS1sYWJlbFwiPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMucmlnaHQnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcbiAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS12YWx1ZS0tcGF0aFwiXG4gICAgICAgICAgICAgID57eyBqb2luVGFyZ2V0U3VtbWFyeSB9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkLS1maXRcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXIgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXBpY2tlci0tc3RyZXRjaFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1wYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMubGVmdCcpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzZGMtcGlja2xpc3RcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cImpvaW5Tb3VyY2VQaWNrbGlzdEl0ZW1zXCJcbiAgICAgICAgICAgICAgW3NlbGVjdGVkSWRzXT1cImpvaW5Tb3VyY2VTZWxlY3RlZFBpY2tsaXN0SWRzXCJcbiAgICAgICAgICAgICAgaWRLZXk9XCJpZFwiXG4gICAgICAgICAgICAgIHRpdGxlS2V5PVwidGl0bGVcIlxuICAgICAgICAgICAgICB0aXRsZVByZWZpeEtleT1cInRpdGxlUHJlZml4XCJcbiAgICAgICAgICAgICAgdGl0bGVTdWZmaXhLZXk9XCJ0aXRsZVN1ZmZpeFwiXG4gICAgICAgICAgICAgIHRpdGxlUHJlZml4Q29sb3JLZXk9XCJ0aXRsZVByZWZpeENvbG9yXCJcbiAgICAgICAgICAgICAgdGl0bGVTdWZmaXhDb2xvcktleT1cInRpdGxlU3VmZml4Q29sb3JcIlxuICAgICAgICAgICAgICBiYWRnZUtleT1cImJhZGdlXCJcbiAgICAgICAgICAgICAgYmFkZ2VDb2xvcktleT1cImJhZGdlQ29sb3JcIlxuICAgICAgICAgICAgICBbc2hvd1BhZ2luYXRvcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtzaG93SXRlbUljb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbc2hvd1NlbGVjdGlvbkNvdW50ZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbYXV0b1Jlc2l6ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFttYXhWaXNpYmxlU2VsZWN0ZWRJdGVtc109XCIxXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgICAgIChzZWxlY3RlZElkc0NoYW5nZSk9XCJvbkpvaW5Tb3VyY2VTZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3NkYy1waWNrbGlzdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXIgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXBpY2tlci0tc3RyZXRjaFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1wYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMucmlnaHQnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c2RjLXBpY2tsaXN0XG4gICAgICAgICAgICAgIFtpdGVtc109XCJqb2luVGFyZ2V0UGlja2xpc3RJdGVtc1wiXG4gICAgICAgICAgICAgIFtzZWxlY3RlZElkc109XCJqb2luVGFyZ2V0U2VsZWN0ZWRQaWNrbGlzdElkc1wiXG4gICAgICAgICAgICAgIGlkS2V5PVwiaWRcIlxuICAgICAgICAgICAgICB0aXRsZUtleT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgdGl0bGVQcmVmaXhLZXk9XCJ0aXRsZVByZWZpeFwiXG4gICAgICAgICAgICAgIHRpdGxlU3VmZml4S2V5PVwidGl0bGVTdWZmaXhcIlxuICAgICAgICAgICAgICB0aXRsZVByZWZpeENvbG9yS2V5PVwidGl0bGVQcmVmaXhDb2xvclwiXG4gICAgICAgICAgICAgIHRpdGxlU3VmZml4Q29sb3JLZXk9XCJ0aXRsZVN1ZmZpeENvbG9yXCJcbiAgICAgICAgICAgICAgYmFkZ2VLZXk9XCJiYWRnZVwiXG4gICAgICAgICAgICAgIGJhZGdlQ29sb3JLZXk9XCJiYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbc2hvd0l0ZW1JY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db3VudGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbbWF4VmlzaWJsZVNlbGVjdGVkSXRlbXNdPVwiMVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLm1vZGFscy5zZWFyY2hQbGFjZWhvbGRlcidcIlxuICAgICAgICAgICAgICAoc2VsZWN0ZWRJZHNDaGFuZ2UpPVwib25Kb2luVGFyZ2V0U2VsZWN0ZWRJZHNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9zZGMtcGlja2xpc3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGZvb3RlciBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1mb290ZXJcIj5cbiAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jYW5jZWwnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgcHJpb3JpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZUpvaW5Nb2RhbCgpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjbG9zZUpvaW5Nb2RhbCgpXCJcbiAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zYXZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuU2F2ZUpvaW5cIlxuICAgICAgICAgIChjbGljayk9XCJzYXZlSm9pbigpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlSm9pbigpXCJcbiAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvc2RjLW1vZGFsPlxuICB9XG5cbiAgQGlmIChzb3J0TW9kYWxWaXNpYmxlKSB7XG4gICAgPHNkYy1tb2RhbFxuICAgICAgW3Zpc2libGVdPVwic29ydE1vZGFsVmlzaWJsZVwiXG4gICAgICAodmlzaWJsZUNoYW5nZSk9XCIkZXZlbnQgPyAoc29ydE1vZGFsVmlzaWJsZSA9IHRydWUpIDogY2xvc2VTb3J0TW9kYWwoKVwiXG4gICAgICBbaGVhZGVyXT1cInNvcnRNb2RhbFRpdGxlXCJcbiAgICAgIFt3aWR0aF09XCJtb2RhbERpbWVuc2lvbnMuc29ydC53aWR0aFwiXG4gICAgICBbaGVpZ2h0XT1cIm1vZGFsRGltZW5zaW9ucy5zb3J0LmhlaWdodFwiXG4gICAgICBbbWF4aW1pemFibGVdPVwiZmFsc2VcIlxuICAgICAgW2Zvb3RlckJ1dHRvbnNdPVwiW11cIlxuICAgICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fc29ydC1tb2RhbFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZmllbGRcbiAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZC0tZnVsbFxuICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NvcnQtZGlyZWN0aW9uLWZpZWxkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1sYWJlbFwiPlxuICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmRpcmVjdGlvbicpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNkYy1zZWxlY3QtYnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zb3J0LWRpcmVjdGlvblwiXG4gICAgICAgICAgICBbaXRlbXNdPVwic29ydERpcmVjdGlvbkl0ZW1zXCJcbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzb2Z0XCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkU29ydERpcmVjdGlvbkl0ZW1zXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU29ydERpcmVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9zZGMtc2VsZWN0LWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1jYXJkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1jYXJkLS1zZWN0aW9uXG4gICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtcGlja2VyIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXItLXN0cmV0Y2hcbiAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tZmxvdyBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGxcbiAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdGFnZS1ib2R5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPHNkYy1waWNrbGlzdFxuICAgICAgICAgICAgW2l0ZW1zXT1cInNvcnRQaWNrbGlzdEl0ZW1zXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZElkc109XCJzb3J0U2VsZWN0ZWRQaWNrbGlzdElkc1wiXG4gICAgICAgICAgICBpZEtleT1cImlkXCJcbiAgICAgICAgICAgIHRpdGxlS2V5PVwidGl0bGVcIlxuICAgICAgICAgICAgdGl0bGVQcmVmaXhLZXk9XCJ0aXRsZVByZWZpeFwiXG4gICAgICAgICAgICB0aXRsZVN1ZmZpeEtleT1cInRpdGxlU3VmZml4XCJcbiAgICAgICAgICAgIHRpdGxlUHJlZml4Q29sb3JLZXk9XCJ0aXRsZVByZWZpeENvbG9yXCJcbiAgICAgICAgICAgIHRpdGxlU3VmZml4Q29sb3JLZXk9XCJ0aXRsZVN1ZmZpeENvbG9yXCJcbiAgICAgICAgICAgIGJhZGdlS2V5PVwiYmFkZ2VcIlxuICAgICAgICAgICAgYmFkZ2VDb2xvcktleT1cImJhZGdlQ29sb3JcIlxuICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW3Nob3dJdGVtSWNvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICBbc2hvd1NlbGVjdGlvbkNvdW50ZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW21heFZpc2libGVTZWxlY3RlZEl0ZW1zXT1cIjFcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgICAoc2VsZWN0ZWRJZHNDaGFuZ2UpPVwib25Tb3J0U2VsZWN0ZWRJZHNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvc2RjLXBpY2tsaXN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBmb290ZXIgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyXCI+XG4gICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2FuY2VsJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHByaW9yaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2VTb3J0TW9kYWwoKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2xvc2VTb3J0TW9kYWwoKVwiXG4gICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2F2ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhblNhdmVTb3J0XCJcbiAgICAgICAgICAoY2xpY2spPVwic2F2ZVNvcnQoKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2F2ZVNvcnQoKVwiXG4gICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L3NkYy1tb2RhbD5cbiAgfVxuXG4gIEBpZiAoZmlsdGVyTW9kYWxWaXNpYmxlKSB7XG4gICAgPHNkYy1tb2RhbFxuICAgICAgW3Zpc2libGVdPVwiZmlsdGVyTW9kYWxWaXNpYmxlXCJcbiAgICAgICh2aXNpYmxlQ2hhbmdlKT1cIiRldmVudCA/IChmaWx0ZXJNb2RhbFZpc2libGUgPSB0cnVlKSA6IGNsb3NlRmlsdGVyTW9kYWwoKVwiXG4gICAgICBbaGVhZGVyXT1cImZpbHRlck1vZGFsVGl0bGVcIlxuICAgICAgW3dpZHRoXT1cIm1vZGFsRGltZW5zaW9ucy5maWx0ZXIud2lkdGhcIlxuICAgICAgW2hlaWdodF09XCJtb2RhbERpbWVuc2lvbnMuZmlsdGVyLmhlaWdodFwiXG4gICAgICBbbWF4aW1pemFibGVdPVwiZmFsc2VcIlxuICAgICAgW2Zvb3RlckJ1dHRvbnNdPVwiW11cIlxuICAgICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLW1vZGFsXCI+XG4gICAgICAgIDxzZGMtdGltZWxpbmVcbiAgICAgICAgICBbaXRlbXNdPVwiZmlsdGVyTW9kYWxUaW1lbGluZUl0ZW1zXCJcbiAgICAgICAgICBbYWN0aXZlSW5kZXhdPVwiZmlsdGVyTW9kYWxSZXZpZXdTdGVwQWN0aXZlID8gMiA6IChmaWx0ZXJNb2RhbENvbmZpZ3VyYXRpb25TdGVwQWN0aXZlID8gMSA6IDApXCJcbiAgICAgICAgICBbaW50ZXJhY3RpdmVdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Nob3dEZXNjcmlwdGlvbnNdPVwiZmFsc2VcIlxuICAgICAgICAgIFthcmlhTGFiZWxdPVwiZmlsdGVyTW9kYWxUaW1lbGluZUFyaWFMYWJlbFwiXG4gICAgICAgICAgKHN0ZXBTZWxlY3QpPVwib25GaWx0ZXJNb2RhbFRpbWVsaW5lU3RlcFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgPjwvc2RjLXRpbWVsaW5lPlxuICAgICAgICBAaWYgKGZpbHRlck1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLXN0ZXBcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItYmFzZS1zZWxlY3RvclwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtcGFuZWwtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLm1vZGFscy5maWx0ZXIuc3RlcHMuc2VsZWN0LnRpdGxlJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c2RjLWluZm8tc2lnblxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWx0ZXJzLnRvb2x0aXBzLm1vZGUnXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICA+PC9zZGMtaW5mby1zaWduPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItbW9kZS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1tb2RlLWNvcHlcIj5cbiAgICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLm1vZGFscy5maWx0ZXIudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItbW9kZS1zZWxlY3RvclwiPlxuICAgICAgICAgICAgICAgIDxzZGMtc2VsZWN0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpbHRlck1vZGVJdGVtc1wiXG4gICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwic29mdFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZEZpbHRlck1vZGVJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpbHRlck1vZGVDaGFuZ2UoJGV2ZW50WzBdPy52YWx1ZSB8fCAnY29uZGl0aW9uJylcIlxuICAgICAgICAgICAgICAgID48L3NkYy1zZWxlY3QtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmIChmaWx0ZXJNb2RhbE1vZGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXJcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXItLWZpbHRlclxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXBpY2tlci0tc3RyZXRjaFxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1mbG93XG4gICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3RhZ2UtYm9keVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3BpY2tsaXN0LXNoZWxsXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzZGMtcGlja2xpc3RcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpbHRlck1vZGFsUGlja2xpc3RJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZElkc109XCJmaWx0ZXJNb2RhbFNlbGVjdGVkUGlja2xpc3RJZHNcIlxuICAgICAgICAgICAgICAgICAgICBpZEtleT1cImlkXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVLZXk9XCJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlUHJlZml4S2V5PVwidGl0bGVQcmVmaXhcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZVN1ZmZpeEtleT1cInRpdGxlU3VmZml4XCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVQcmVmaXhDb2xvcktleT1cInRpdGxlUHJlZml4Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZVN1ZmZpeENvbG9yS2V5PVwidGl0bGVTdWZmaXhDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIGJhZGdlS2V5PVwiYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgICBiYWRnZUNvbG9yS2V5PVwiYmFkZ2VDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIFthdXRvUmVzaXplXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0l0ZW1JY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db3VudGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW21heFZpc2libGVTZWxlY3RlZEl0ZW1zXT1cIjFcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tb2RhbHMuc2VhcmNoUGxhY2Vob2xkZXInXCJcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uRmlsdGVyTW9kYWxTZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgID48L3NkYy1waWNrbGlzdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItZG9tYWluLWludHJvXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1wYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWx0ZXJzLmRvbWFpbkxhYmVsJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNkYy1pbmZvLXNpZ25cbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiZmlsdGVyRG9tYWluRXhwcmVzc2lvblRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIidsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICA+PC9zZGMtaW5mby1zaWduPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLWRvbWFpbi1ncmlkXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1kb21haW4taXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMuZG9tYWluRXhwcmVzc2lvbicpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJEb21haW5FeHByZXNzaW9uVG9vbHRpcCB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItZG9tYWluLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmNvbm5lY3RvcicpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJDb25uZWN0b3JUb29sdGlwIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICBAaWYgKGZpbHRlck1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLXN0ZXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItdG9vbGJhclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeSBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS0tZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLmZpbHRlci5zdGVwcy5jb25maWd1cmUudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS12YWx1ZS0tcGF0aFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyQ29uZmlndXJhdGlvblN1bW1hcnlMYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGlua1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub0ZpbHRlck1vZGFsU3RlcCgnc2VsZWN0JylcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgZmlsdGVyQmFja1RvU2VsZWN0aW9uTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIEBpZiAoZmlsdGVyTW9kYWxNb2RlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZpZWxkXG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZC0tc3RyZXRjaFxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZFxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLWNvbmZpZy1jYXJkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLWNvbmZpZy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXBhbmVsLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tb2RhbHMuZmlsdGVyLnN0ZXBzLmNvbmZpZ3VyZS50aXRsZScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPHNkYy1pbmZvLXNpZ25cbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmlsdGVycy50b29sdGlwcy5jb25maWd1cmUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaW5mby1zaWduPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkLS1maWx0ZXItY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNvbWJvYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMuY29ubmVjdG9yJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5jb25uZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyRHJhZnQuY29ubmVjdG9yID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpbHRlckNvbm5lY3Rvck9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FwcGVuZFRvXT1cIm92ZXJsYXlBcHBlbmRUYXJnZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJvdmVybGF5WkluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJDb25uZWN0b3JEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5mb1Rvb2x0aXBdPVwiZmlsdGVyQ29ubmVjdG9yVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jb21ib2JveD5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNvbWJvYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMub3BlcmF0b3InXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckRyYWZ0Lm9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0Lm9wZXJhdG9yID0gJGV2ZW50OyBvbkZpbHRlck9wZXJhdG9yQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZmlsdGVyT3BlcmF0b3JPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlbmRUb109XCJvdmVybGF5QXBwZW5kVGFyZ2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwib3ZlcmxheVpJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWx0ZXJEcmFmdC5jb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZm9Ub29sdGlwXT1cImZpbHRlck9wZXJhdG9yVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNvbWJvYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtY29tYm9ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy52YWx1ZVR5cGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckRyYWZ0LnZhbHVlVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC52YWx1ZVR5cGUgPSAkZXZlbnQ7IG9uRmlsdGVyVmFsdWVUeXBlQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwidmFsdWVUeXBlT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwib3ZlcmxheUFwcGVuZFRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4XT1cIm92ZXJsYXlaSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclZhbHVlVHlwZURpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmZvVG9vbHRpcF09XCJmaWx0ZXJWYWx1ZVR5cGVUb29sdGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNvbWJvYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLW9wdGlvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLnN0YXRlcy5vcHRpb25hbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5vcHRpb25hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0Lm9wdGlvbmFsID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtaW5mby1zaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cImZpbHRlck9wdGlvbmFsVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pbmZvLXNpZ24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1jb25maWctc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItY29uZmlnLXNlY3Rpb24tLXZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWdyaWQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWdyaWQtLXNpbmdsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd0ZpbHRlckJvb2xlYW5Db21ib2JveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1jb21ib2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMudmFsdWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyRHJhZnQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC52YWx1ZSA9ICRldmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImJvb2xlYW5WYWx1ZU9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwib3ZlcmxheUFwcGVuZFRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwib3ZlcmxheVpJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtY29tYm9ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd0ZpbHRlclZhbHVlVGV4dGJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10ZXh0Ym94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy52YWx1ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0LnZhbHVlID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10ZXh0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dGaWx0ZXJWYWx1ZXNUZXh0Ym94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLnZhbHVlcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC52YWx1ZXNUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyRHJhZnQudmFsdWVzVGV4dCA9ICRldmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93RmlsdGVyQmV0d2VlbklucHV0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19iZXR3ZWVuIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkLWNvbHVtbi1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGV4dGJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy52YWx1ZVN0YXJ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyRHJhZnQuYmV0d2VlblN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC5iZXR3ZWVuU3RhcnQgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10ZXh0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMudmFsdWVFbmQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5iZXR3ZWVuRW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC5iZXR3ZWVuRW5kID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dGaWx0ZXJQYXJhbWV0ZXJUZXh0Ym94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLnBhcmFtZXRlck5hbWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyRHJhZnQucGFyYW1ldGVyTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWUgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRleHRib3g+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZFxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZmllbGQtLXN0cmV0Y2hcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmRcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1jb25maWctY2FyZFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1jb25maWctc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWdyaWQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWdyaWQtLWZpbHRlci1jb250cm9sc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtY29tYm9ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy5jb25uZWN0b3InXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckRyYWZ0LmNvbm5lY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC5jb25uZWN0b3IgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZmlsdGVyQ29ubmVjdG9yT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwib3ZlcmxheUFwcGVuZFRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4XT1cIm92ZXJsYXlaSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlckNvbm5lY3RvckRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmZvVG9vbHRpcF09XCJmaWx0ZXJDb25uZWN0b3JUb29sdGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNvbWJvYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLW9wdGlvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLnN0YXRlcy5vcHRpb25hbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5vcHRpb25hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0Lm9wdGlvbmFsID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtaW5mby1zaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cImZpbHRlck9wdGlvbmFsVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pbmZvLXNpZ24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1jb25maWctc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItY29uZmlnLXNlY3Rpb24tLWRvbWFpblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtcGFuZWwtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy5kb21haW5FeHByZXNzaW9uJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLWluZm8tc2lnblxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiZmlsdGVyRG9tYWluRXhwcmVzc2lvblRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCInbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pbmZvLXNpZ24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1kb21haW4taGludFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlckRvbWFpbkV4cHJlc3Npb25Ub29sdGlwIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItc3RlcFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci10b29sYmFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5IGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LS1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tb2RhbHMuZmlsdGVyLnN0ZXBzLnJldmlldy50aXRsZScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS12YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LXZhbHVlLS1wYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJDb25maWd1cmF0aW9uU3VtbWFyeUxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvRmlsdGVyTW9kYWxTdGVwKCdjb25maWd1cmUnKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJCYWNrVG9Db25maWd1cmF0aW9uTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZFxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZpZWxkLS1zdHJldGNoXG4gICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZFxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItY29uZmlnLWNhcmRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1yZXZpZXctZ3JpZFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBmaWx0ZXJSZXZpZXdJdGVtczsgdHJhY2sgdHJhY2tCeUlkKCRpbmRleCwgaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1yZXZpZXctaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LXZhbHVlLS1wYXRoXT1cIml0ZW0uZW1waGFzaXplID09PSAncGF0aCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItcmV2aWV3LWNvZGVdPVwiaXRlbS5lbXBoYXNpemUgPT09ICdjb2RlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLXJldmlldy1wcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLnNxbFByZXZpZXcnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c2RjLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlclJldmlld1ByZXZpZXdMYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjZcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgZm9vdGVyIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZvb3RlclwiPlxuICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgIFtsYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNhbmNlbCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBwcmlvcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsb3NlRmlsdGVyTW9kYWwoKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2xvc2VGaWx0ZXJNb2RhbCgpXCJcbiAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgQGlmIChmaWx0ZXJNb2RhbFNlbGVjdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cImZpbHRlck1vZGFsQ29uZmlndXJlQWN0aW9uTGFiZWxcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWx0ZXJNb2RhbENhblByb2NlZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VGaWx0ZXJNb2RhbFN0ZXAoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJhZHZhbmNlRmlsdGVyTW9kYWxTdGVwKClcIlxuICAgICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChmaWx0ZXJNb2RhbENvbmZpZ3VyYXRpb25TdGVwQWN0aXZlKSB7XG4gICAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICAgIFtsYWJlbF09XCJmaWx0ZXJNb2RhbFJldmlld0FjdGlvbkxhYmVsXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZmlsdGVyTW9kYWxDYW5SZXZpZXdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VGaWx0ZXJNb2RhbFN0ZXAoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJhZHZhbmNlRmlsdGVyTW9kYWxTdGVwKClcIlxuICAgICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChmaWx0ZXJNb2RhbFJldmlld1N0ZXBBY3RpdmUpIHtcbiAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2F2ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuU2F2ZUZpbHRlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2F2ZUZpbHRlcigpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNhdmVGaWx0ZXIoKVwiXG4gICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9zZGMtbW9kYWw+XG4gIH1cblxuICBAaWYgKGZpZWxkTW9kYWxWaXNpYmxlKSB7XG4gICAgPHNkYy1tb2RhbFxuICAgICAgW3Zpc2libGVdPVwiZmllbGRNb2RhbFZpc2libGVcIlxuICAgICAgKHZpc2libGVDaGFuZ2UpPVwiJGV2ZW50ID8gKGZpZWxkTW9kYWxWaXNpYmxlID0gdHJ1ZSkgOiBjbG9zZUZpZWxkTW9kYWwoKVwiXG4gICAgICBbaGVhZGVyXT1cImZpZWxkTW9kYWxUaXRsZVwiXG4gICAgICBbd2lkdGhdPVwibW9kYWxEaW1lbnNpb25zLmZpZWxkLndpZHRoXCJcbiAgICAgIFtoZWlnaHRdPVwibW9kYWxEaW1lbnNpb25zLmZpZWxkLmhlaWdodFwiXG4gICAgICBbbWF4aW1pemFibGVdPVwiZmFsc2VcIlxuICAgICAgW2Zvb3RlckJ1dHRvbnNdPVwiW11cIlxuICAgICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fZmllbGQtbW9kYWxcIj5cbiAgICAgICAgPHNkYy10aW1lbGluZVxuICAgICAgICAgIFtpdGVtc109XCJmaWVsZE1vZGFsVGltZWxpbmVJdGVtc1wiXG4gICAgICAgICAgW2FjdGl2ZUluZGV4XT1cImZpZWxkTW9kYWxDb25maWd1cmF0aW9uU3RlcEFjdGl2ZSA/IDEgOiAwXCJcbiAgICAgICAgICBbaW50ZXJhY3RpdmVdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Nob3dEZXNjcmlwdGlvbnNdPVwiZmFsc2VcIlxuICAgICAgICAgIFthcmlhTGFiZWxdPVwiZmllbGRNb2RhbFRpbWVsaW5lQXJpYUxhYmVsXCJcbiAgICAgICAgICAoc3RlcFNlbGVjdCk9XCJvbkZpZWxkTW9kYWxUaW1lbGluZVN0ZXBTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgID48L3NkYy10aW1lbGluZT5cbiAgICAgICAgQGlmIChmaWVsZE1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXNoZWxsIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbC0tZnVsbFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWZsb3cgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN0YWdlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19waWNrbGlzdC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3RhZ2UtYm9keVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNkYy1waWNrbGlzdFxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZE1vZGFsUGlja2xpc3RJdGVtc1wiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkSWRzXT1cImZpZWxkTW9kYWxTZWxlY3RlZFBpY2tsaXN0SWRzXCJcbiAgICAgICAgICAgICAgICBpZEtleT1cImlkXCJcbiAgICAgICAgICAgICAgICB0aXRsZUtleT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICB0aXRsZVByZWZpeEtleT1cInRpdGxlUHJlZml4XCJcbiAgICAgICAgICAgICAgICB0aXRsZVN1ZmZpeEtleT1cInRpdGxlU3VmZml4XCJcbiAgICAgICAgICAgICAgICB0aXRsZVByZWZpeENvbG9yS2V5PVwidGl0bGVQcmVmaXhDb2xvclwiXG4gICAgICAgICAgICAgICAgdGl0bGVTdWZmaXhDb2xvcktleT1cInRpdGxlU3VmZml4Q29sb3JcIlxuICAgICAgICAgICAgICAgIGJhZGdlS2V5PVwiYmFkZ2VcIlxuICAgICAgICAgICAgICAgIGJhZGdlQ29sb3JLZXk9XCJiYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgICBbYXV0b1Jlc2l6ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtzaG93SXRlbUljb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtzaG93U2VsZWN0aW9uQ291bnRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uRmllbGRNb2RhbFNlbGVjdGVkSWRzQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICA+PC9zZGMtcGlja2xpc3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZmllbGQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZpZWxkLS1zdHJldGNoXG4gICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctc2hlbGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctdG9vbGJhclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpZWxkLWNvbmZpZy1zdW1tYXJ5XCI+XG4gICAgICAgICAgICAgICAge3sgZmllbGRNb2RhbENvbmZpZ3VyZWRJdGVtcy5sZW5ndGggfX1cbiAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5jYXJkcy5maWVsZHMudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChmaWVsZE1vZGFsSGFzU2VsZWN0YWJsZUNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQW5vdGhlckZpZWxkRnJvbU1vZGFsKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RDb2x1bW5zJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtbGlzdC1zaGVsbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctbGlzdFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZmllbGRNb2RhbENvbmZpZ3VyZWRJdGVtczsgdHJhY2sgdHJhY2tCeUlkKCRpbmRleCwgaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmllbGQtY29uZmlnLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpZWxkLWNvbmZpZy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi10YWJsZS1sYWJlbFwiPnt7IGl0ZW0udGFibGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1zZXBhcmF0b3JcIj4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWFjY2VudFwiPnt7IGl0ZW0uZmllbGRMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uZnVuY3Rpb25OYW1lICYmICFpc0ZpZWxkRnVuY3Rpb25FZGl0aW5nKGl0ZW0uY29sdW1uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctZnVuY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwLS1vcGVyYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZnVuY3Rpb25MYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5mdW5jdGlvbkFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZnVuY3Rpb25BbGlhcyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICghaXNGaWVsZEZ1bmN0aW9uRWRpdGluZyhpdGVtLmNvbHVtbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpZWxkLWNvbmZpZy1jb250cm9sc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10ZXh0Ym94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy5hbGlhcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpdGVtLmFsaWFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25GaWVsZE1vZGFsQWxpYXNDaGFuZ2UoaXRlbS5jb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10ZXh0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWxhYmVsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMud2lkdGgnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWluZm8tc2lnblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tZXNzYWdlcy5maWVsZFdpZHRoSW5mbydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pbmZvLXNpZ24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIml0ZW0ud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRmllbGRNb2RhbFdpZHRoQ2hhbmdlKGl0ZW0uY29sdW1uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhsZW5ndGhdPVwiMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRleHRib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN0YXJ0RmllbGRGdW5jdGlvbkVkaXQoaXRlbS5jb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmZ1bmN0aW9uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY29uZmlndXJlRmllbGQnKSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMuZnVuY3Rpb25OYW1lJykgfCB0cmFuc2xhdGUpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWVsZE1vZGFsRHJhZnQoaXRlbS5jb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctY29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpZWxkLWNvbmZpZy1jb250cm9scy0tZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1jb21ib2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMuZnVuY3Rpb25OYW1lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbk5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpZWxkRnVuY3Rpb25EcmFmdE5hbWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpZWxkTW9kYWxGdW5jdGlvbk9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwib3ZlcmxheUFwcGVuZFRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwib3ZlcmxheVpJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtY29tYm9ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmFsaWFzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbkFsaWFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uQWxpYXMgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWVsZEZ1bmN0aW9uRHJhZnQuZnVuY3Rpb25OYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10ZXh0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24tLWRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNhbmNlbCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNhbmNlbCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbEZpZWxkRnVuY3Rpb25FZGl0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19pY29uLWFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19pY29uLWFjdGlvbi0tYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2F2ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNhdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlRmllbGRGdW5jdGlvbkVkaXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hlY2tcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgZm9vdGVyIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZvb3RlciBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyLS1iZXR3ZWVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyLWdyb3VwIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1mb290ZXItZ3JvdXAtLXN0YXJ0XCI+XG4gICAgICAgICAgQGlmIChmaWVsZE1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSAmJiBmaWVsZE1vZGFsQ2FuU2VsZWN0QWxsKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLXByaW1hcnlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QWxsRmllbGRNb2RhbENvbHVtbnMoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RBbGxDb2x1bW5zJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyLWdyb3VwXCI+XG4gICAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICAgIFtsYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNhbmNlbCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIHByaW9yaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbG9zZUZpZWxkTW9kYWwoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjbG9zZUZpZWxkTW9kYWwoKVwiXG4gICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgICBAaWYgKGZpZWxkTW9kYWxTZWxlY3Rpb25TdGVwQWN0aXZlICYmIGZpZWxkTW9kYWxDYW5Qcm9jZWVkKSB7XG4gICAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5uZXh0U3RlcCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VGaWVsZE1vZGFsU3RlcCgpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWR2YW5jZUZpZWxkTW9kYWxTdGVwKClcIlxuICAgICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChmaWVsZE1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgICAgIFtsYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNhdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuU2F2ZUZpZWxkTW9kYWxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZUZpZWxkKClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlRmllbGQoKVwiXG4gICAgICAgICAgICA+PC9zZGMtYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3NkYy1tb2RhbD5cbiAgfVxuXG4gIDxkaXZcbiAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX193b3Jrc3BhY2VcIlxuICAgIFtjbGFzcy5keW5hbWljLXZpZXctYnVpbGRlcl9fd29ya3NwYWNlLS1zdGFja2VkXT1cImxheW91dE1vZGUgPT09ICdzdGFja2VkJ1wiXG4gICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX193b3Jrc3BhY2UtLXNwbGl0XT1cImxheW91dE1vZGUgPT09ICdzcGxpdCdcIlxuICAgIFtjbGFzcy5keW5hbWljLXZpZXctYnVpbGRlcl9fd29ya3NwYWNlLS1wcmV2aWV3LWhpZGRlbl09XCIhcHJldmlld1Zpc2libGVcIlxuICAgID5cbiAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2J1aWxkZXItYXJlYVwiPlxuICAgICAgPGRpdlxuICAgICAgICAjc2VjdGlvbnNDb250YWluZXJcbiAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbnNcIlxuICAgICAgICBbY2xhc3MuZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb25zLS1zdGFja2VkXT1cImxheW91dE1vZGUgPT09ICdzdGFja2VkJ1wiXG4gICAgICAgIFtjbGFzcy5keW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbnMtLXNwbGl0XT1cImxheW91dE1vZGUgPT09ICdzcGxpdCdcIlxuICAgICAgICA+XG4gICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgI2J1aWxkZXJTZWN0aW9uXG4gICAgICAgICAgZGF0YS1zZWN0aW9uLWlkPVwidGFibGVzXCJcbiAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1sYWJlbFwiPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5jYXJkcy5zb3VyY2VzLnRpdGxlJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXG4gICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLXByaW1hcnlcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0taWNvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdFRhYmxlcycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2VsZWN0VGFibGVzJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuU291cmNlTW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmsgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSB8fCAhY2FuT3BlblNvdXJjZUNvbmZpZ3VyYXRpb25cIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNvbmZpZ3VyZUFsaWFzZXMnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNvbmZpZ3VyZUFsaWFzZXMnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Tb3VyY2VDb25maWd1cmF0aW9uTW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5IHx8ICFzb3VyY2VJdGVtcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNsZWFyJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTb3VyY2VzKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaC1hbHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICghc291cmNlSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19lbXB0eS1yb3dcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdFRhYmxlcycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdFRhYmxlcycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Tb3VyY2VNb2RhbCgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdFRhYmxlcycpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChzb3VyY2VJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc3RhY2sgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3N0YWNrLS13cmFwXCI+XG4gICAgICAgICAgICAgIEBmb3IgKHNvdXJjZSBvZiBzb3VyY2VJdGVtczsgdHJhY2sgdHJhY2tCeUlkKGksIHNvdXJjZSk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93IGR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctLXNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy10YWJsZS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1kYlwiPnt7IHNvdXJjZS5kYkxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1kb3RcIj4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy10YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc291cmNlLnRhYmxlTGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzb3VyY2UuYWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctbWV0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXMge3sgc291cmNlLmFsaWFzIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uIGR5bmFtaWMtdmlldy1idWlsZGVyX19pY29uLWFjdGlvbi0tZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMucmVtb3ZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVNvdXJjZShpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tcm93XCI+XG4gICAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICAgICNidWlsZGVyU2VjdGlvblxuICAgICAgICAgICAgZGF0YS1zZWN0aW9uLWlkPVwiam9pbnNcIlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbiBkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi0tZmx1aWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuY2FyZHMuam9pbnMudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0tcHJpbWFyeVxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWNhbkNvbmZpZ3VyZUpvaW5zXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmFkZEpvaW4nKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkSm9pbicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSm9pbk1vZGFsKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGx1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0taWNvblwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSB8fCAham9pbkl0ZW1zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckpvaW5zKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2gtYWx0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmICghY2FuQ29uZmlndXJlSm9pbnMpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19pbmZvLXJvd1wiPlxuICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLm1lc3NhZ2VzLmpvaW5SZXF1aXJlc1R3b1RhYmxlcycpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChjYW5Db25maWd1cmVKb2lucyAmJiAham9pbkl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZW1wdHktcm93XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkSm9pbicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkSm9pbicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkpvaW5Nb2RhbCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5hZGRKb2luJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGpvaW5JdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjayBkeW5hbWljLXZpZXctYnVpbGRlcl9fc3RhY2stLXdyYXBcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGpvaW5JdGVtczsgdHJhY2sgdHJhY2tCeUlkKGksIGl0ZW0pOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3dcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctcGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXRhYmxlXCI+e3sgaXRlbS5zb3VyY2VUYWJsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1kb3RcIj4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWZpZWxkXCI+e3sgaXRlbS5zb3VyY2VGaWVsZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fam9pbi1vcGVyYXRvclwiPnt7IGl0ZW0ub3BlcmF0b3IgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fam9pbi1hcnJvd1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtbG9uZy1hcnJvdy1hbHQtcmlnaHRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1wYXRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctdGFibGVcIj57eyBpdGVtLnRhcmdldFRhYmxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWRvdFwiPi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZmllbGRcIj57eyBpdGVtLnRhcmdldEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmVkaXQnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuZWRpdCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSm9pbk1vZGFsKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBlblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uIGR5bmFtaWMtdmlldy1idWlsZGVyX19pY29uLWFjdGlvbi0tZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlSm9pbihpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICAgI2J1aWxkZXJTZWN0aW9uXG4gICAgICAgICAgICBkYXRhLXNlY3Rpb24taWQ9XCJncm91cEJ5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tLWNvbXBhY3RcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmNhcmRzLmdyb3VwQnkudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0tcHJpbWFyeVxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWdyb3VwQnlTZWxlY3RhYmxlQ29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2VsZWN0Q29sdW1ucycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RDb2x1bW5zJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TZWxlY3Rpb25Nb2RhbCgnZ3JvdXBCeScpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWdyb3VwQnlJdGVtcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2xlYXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2xlYXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJHcm91cEJ5KClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2gtYWx0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmICghZ3JvdXBCeUl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZW1wdHktcm93XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TZWxlY3Rpb25Nb2RhbCgnZ3JvdXBCeScpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RDb2x1bW5zJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGdyb3VwQnlJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjayBkeW5hbWljLXZpZXctYnVpbGRlcl9fc3RhY2stLXdyYXBcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGdyb3VwQnlJdGVtczsgdHJhY2sgdHJhY2tCeUlkKGksIGl0ZW0pOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3dcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctcGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXRhYmxlXCI+e3sgaXRlbS50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWRvdFwiPi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZmllbGRcIj57eyBpdGVtLmZpZWxkTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMucmVtb3ZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVHcm91cEJ5KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgI2J1aWxkZXJTZWN0aW9uXG4gICAgICAgICAgZGF0YS1zZWN0aW9uLWlkPVwiZmllbGRzXCJcbiAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmNhcmRzLmZpZWxkcy50aXRsZScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8c2RjLWluZm8tc2lnblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2hpbnRcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidWb2PDqiBwb2RlIG9yZGVuYXIgYSBzZXF1w6puY2lhIGRvcyBjYW1wb3MgYXJyYXN0YW5kbyBlIHNvbHRhbmRvLidcIlxuICAgICAgICAgICAgICA+PC9zZGMtaW5mby1zaWduPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmtcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0tcHJpbWFyeVxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSB8fCAhZmllbGRTZWxlY3RhYmxlQ29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdENvbHVtbnMnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdENvbHVtbnMnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GaWVsZE1vZGFsKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0taWNvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWNhbk9wZW5GaWVsZENvbmZpZ3VyYXRpb25cIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNvbmZpZ3VyZUZpZWxkJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jb25maWd1cmVGaWVsZCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZpZWxkQ29uZmlndXJhdGlvbk1vZGFsKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmsgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSB8fCAhZmllbGRJdGVtcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNsZWFyJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWVsZHMoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRyYXNoLWFsdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKCFmaWVsZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZW1wdHktcm93XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZpZWxkTW9kYWwoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RDb2x1bW5zJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGZpZWxkSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3N0YWNrIGR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjay0td3JhcFwiPlxuICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGZpZWxkSXRlbXM7IHRyYWNrIHRyYWNrQnlJZChpLCBpdGVtKTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBAaWYgKGlzRmllbGREcm9wSW5kaWNhdG9yVmlzaWJsZShpKSkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1kcm9wLWluZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3JvdyBkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LS1kcmFnZ2FibGVcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctLWRyYWctb3JpZ2luXT1cImRyYWdnaW5nRmllbGRJbmRleCA9PT0gaXRlbS5zb3VyY2VJbmRleFwiXG4gICAgICAgICAgICAgICAgICBbZHJhZ2dhYmxlXT1cIiFpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgIChkcmFnc3RhcnQpPVwib25GaWVsZERyYWdTdGFydChpdGVtLnNvdXJjZUluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAoZHJhZ292ZXIpPVwib25GaWVsZERyYWdPdmVyKCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgICAgKGRyb3ApPVwib25GaWVsZERyb3AoKVwiXG4gICAgICAgICAgICAgICAgICAoZHJhZ2VuZCk9XCJvbkZpZWxkRHJhZ0VuZCgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW9yZGVyXCI+e3sgaXRlbS5vcmRlckxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctcGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy10YWJsZVwiPnt7IGl0ZW0udGFibGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZG90XCI+Ljwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZmllbGRcIj57eyBpdGVtLmZpZWxkTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzIHt7IGl0ZW0uYWxpYXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ud2lkdGggfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmZ1bmN0aW9uTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwIGR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctY2hpcC0tb3BlcmF0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZnVuY3Rpb25MYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uZnVuY3Rpb25BbGlhcykge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1tZXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmZ1bmN0aW9uQWxpYXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRmllbGQoaXRlbS5zb3VyY2VJbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGlzRmllbGREcm9wSW5kaWNhdG9yQXRFbmRWaXNpYmxlKCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1kcm9wLWluZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLXJvd1wiPlxuICAgICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgICAjYnVpbGRlclNlY3Rpb25cbiAgICAgICAgICAgIGRhdGEtc2VjdGlvbi1pZD1cInNvcnRpbmdcIlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbiBkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi0tY29tcGFjdFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24taGVhZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5jYXJkcy5zb3J0aW5nLnRpdGxlJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGlua1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLXByaW1hcnlcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5IHx8ICFzb3J0U2VsZWN0YWJsZUl0ZW1zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5hZGRTb3J0JykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmFkZFNvcnQnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblNvcnRNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIXNvcnRJdGVtcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2xlYXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2xlYXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTb3J0aW5nKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2gtYWx0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmICghc29ydEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZW1wdHktcm93XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkU29ydCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkU29ydCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblNvcnRNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5hZGRTb3J0JykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKHNvcnRJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjayBkeW5hbWljLXZpZXctYnVpbGRlcl9fc3RhY2stLXdyYXBcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNvcnRJdGVtczsgdHJhY2sgdHJhY2tCeUlkKGksIGl0ZW0pOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3dcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uZnVuY3Rpb25OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctY2hpcCBkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAtLW9wZXJhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZnVuY3Rpb25MYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctcGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXRhYmxlXCI+e3sgaXRlbS50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWRvdFwiPi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZmllbGRcIj57eyBpdGVtLmZpZWxkTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwIGR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctY2hpcC0tb3BlcmF0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGlyZWN0aW9uIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuZWRpdCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5lZGl0JykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Tb3J0TW9kYWwoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGVuXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMucmVtb3ZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTb3J0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICAgICNidWlsZGVyU2VjdGlvblxuICAgICAgICAgICAgZGF0YS1zZWN0aW9uLWlkPVwiZmlsdGVyc1wiXG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uIGR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLS1mbHVpZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24taGVhZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5jYXJkcy5maWx0ZXJzLnRpdGxlJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGlua1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLXByaW1hcnlcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5IHx8ICFhdmFpbGFibGVDb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5hZGRGaWx0ZXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkRmlsdGVyJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GaWx0ZXJNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWZpbHRlckl0ZW1zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaC1hbHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKCFmaWx0ZXJJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2VtcHR5LXJvd1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmFkZEZpbHRlcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkRmlsdGVyJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRmlsdGVyTW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkRmlsdGVyJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGZpbHRlckl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3N0YWNrIGR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjay0td3JhcFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZmlsdGVySXRlbXM7IHRyYWNrIHRyYWNrQnlJZChpLCBpdGVtKTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmICghaXRlbS5pc0RvbWFpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXBhdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXRhYmxlXCI+e3sgaXRlbS50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZG90XCI+Ljwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWZpZWxkXCI+e3sgaXRlbS5maWVsZExhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAtLW9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGl0ZW0ub3BlcmF0b3JMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwLS1kb21haW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgaXRlbS50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctY2hpcCBkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAtLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnN1YnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwLS1vcHRpb25hbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5zdGF0ZXMub3B0aW9uYWwnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmVkaXQnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuZWRpdCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRmlsdGVyTW9kYWwoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGVuXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMucmVtb3ZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBmb3IgKGFycm93IG9mIGZsb3dBcnJvd3M7IHRyYWNrIHRyYWNrQnlBcnJvdygkaW5kZXgsIGFycm93KSkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2Zsb3ctYXJyb3dcIlxuICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19mbG93LWFycm93LS1yaWdodF09XCJhcnJvdy5kaXJlY3Rpb24gPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19mbG93LWFycm93LS1kb3duXT1cImFycm93LmRpcmVjdGlvbiA9PT0gJ2Rvd24nXCJcbiAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImFycm93LmxlZnRcIlxuICAgICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJhcnJvdy50b3BcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIFtjbGFzc109XCJhcnJvdy5kaXJlY3Rpb24gPT09ICdyaWdodCdcbiAgICAgICAgICAgICAgICA/ICdmYXMgZmEtYW5nbGUtZG91YmxlLXJpZ2h0J1xuICAgICAgICAgICAgICAgIDogJ2ZhcyBmYS1hbmdsZS1kb3VibGUtZG93bidcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKHByZXZpZXdWaXNpYmxlKSB7XG4gICAgICA8YXNpZGUgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcHJldmlldy1hcmVhXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19wcmV2aWV3XCJcbiAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cInNxbFByZXZpZXdQYW5lbEhlaWdodFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcHJldmlldy1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcHJldmlldy10aXRsZVwiPlNRTCBQcmV2aWV3PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3ByZXZpZXctc3VidGl0bGVcIj5cbiAgICAgICAgICAgICAgQ29uc3VsdGEgZ2VyYWRhIGF1dG9tYXRpY2FtZW50ZSBhIHBhcnRpciBkYSBjb25maWd1cmFjYW8gYXR1YWwuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3ByZXZpZXctYm9keVwiPlxuICAgICAgICAgICAgPHNkYy1jb2RlLWVkaXRvclxuICAgICAgICAgICAgICBbc3FsXT1cInNxbFByZXZpZXdcIlxuICAgICAgICAgICAgICBsYW5ndWFnZT1cInNxbFwiXG4gICAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3Nob3dDb3B5XT1cInRydWVcIlxuICAgICAgICAgICAgICBbaGVpZ2h0XT1cInNxbFByZXZpZXdIZWlnaHRcIlxuICAgICAgICAgICAgPjwvc2RjLWNvZGUtZWRpdG9yPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYXNpZGU+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|