barsa-sap-ui 2.2.2 → 2.2.3
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/esm2022/barsa-sap-ui.mjs +5 -0
- package/esm2022/lib/apply-conditional-formmatings.directive.mjs +90 -0
- package/esm2022/lib/avatar-size.pipe.mjs +41 -0
- package/esm2022/lib/barsa-answer-card/barsa-answer-card.component.mjs +41 -0
- package/esm2022/lib/barsa-asp-viewer/barsa-asp-viewer.component.mjs +145 -0
- package/esm2022/lib/barsa-bar-download-file/barsa-bar-download-file.component.mjs +23 -0
- package/esm2022/lib/barsa-bar-panel/barsa-bar-panel.component.mjs +23 -0
- package/esm2022/lib/barsa-base-panel/barsa-base-layout-panel.component.mjs +29 -0
- package/esm2022/lib/barsa-breadcrumbs/barsa-breadcrumbs.component.mjs +24 -0
- package/esm2022/lib/barsa-card-layout-panel/barsa-card-layout-panel.component.mjs +24 -0
- package/esm2022/lib/barsa-card-row-payam/barsa-card-row-payam.component.mjs +31 -0
- package/esm2022/lib/barsa-cartable-form/barsa-cartable-form.component.mjs +41 -0
- package/esm2022/lib/barsa-cartable-template/barsa-cartable-template.component.mjs +24 -0
- package/esm2022/lib/barsa-chat/barsa-chat.component.mjs +242 -0
- package/esm2022/lib/barsa-chat/chat.model.mjs +8 -0
- package/esm2022/lib/barsa-chat-content/barsa-chat-content.component.mjs +13 -0
- package/esm2022/lib/barsa-chat-content-toolbar/barsa-chat-content-toolbar.component.mjs +22 -0
- package/esm2022/lib/barsa-chat-list/barsa-chat-list.component.mjs +66 -0
- package/esm2022/lib/barsa-chat-message/barsa-chat-message.component.mjs +78 -0
- package/esm2022/lib/barsa-chat-thread/barsa-chat-thread.component.mjs +22 -0
- package/esm2022/lib/barsa-chat-threads-list/barsa-chat-threads-list.component.mjs +13 -0
- package/esm2022/lib/barsa-chat-threads-list-toolbar/barsa-chat-threads-list-toolbar.component.mjs +15 -0
- package/esm2022/lib/barsa-chip/barsa-chip.component.mjs +72 -0
- package/esm2022/lib/barsa-column-indicator/barsa-column-indicator.component.mjs +23 -0
- package/esm2022/lib/barsa-column-rownumber/barsa-column-rownumber.component.mjs +14 -0
- package/esm2022/lib/barsa-custom-inline-edit/barsa-custom-inline-edit.component.mjs +14 -0
- package/esm2022/lib/barsa-custom-inline-edit-row/barsa-custom-inline-edit-row.component.mjs +26 -0
- package/esm2022/lib/barsa-date-time-picker/barsa-date-time-picker.component.mjs +71 -0
- package/esm2022/lib/barsa-dynamic-field/barsa-dynamic-field.component.mjs +40 -0
- package/esm2022/lib/barsa-enum-menu-button/barsa-enum-menu-button.component.mjs +61 -0
- package/esm2022/lib/barsa-field-key-value/barsa-field-key-value.component.mjs +45 -0
- package/esm2022/lib/barsa-form-side-content/barsa-form-side-content.component.mjs +58 -0
- package/esm2022/lib/barsa-grid-layout-panel/barsa-grid-layout-panel.component.mjs +27 -0
- package/esm2022/lib/barsa-group-cartable/barsa-cartable-group.component.mjs +94 -0
- package/esm2022/lib/barsa-horizontal-flex-panel/barsa-horizontal-flex-panel.component.mjs +22 -0
- package/esm2022/lib/barsa-linkable-items-panel/barsa-linkable-items-panel.component.mjs +37 -0
- package/esm2022/lib/barsa-list-file-linear/barsa-list-file-linear.component.mjs +41 -0
- package/esm2022/lib/barsa-list-file-linear-gmail/barsa-list-file-linear-gmail.component.mjs +29 -0
- package/esm2022/lib/barsa-list-layout-panel/barsa-list-layout-panel.component.mjs +23 -0
- package/esm2022/lib/barsa-modal/barsa-modal.component.mjs +43 -0
- package/esm2022/lib/barsa-monaco-editor/barsa-monaco-editor.component.mjs +83 -0
- package/esm2022/lib/barsa-network-offline/barsa-network-offline.component.mjs +57 -0
- package/esm2022/lib/barsa-pishnamayesh-payam/barsa-pishnamayesh-payam.component.mjs +159 -0
- package/esm2022/lib/barsa-question-answer-comments-section/barsa-question-answer-comments-section.component.mjs +17 -0
- package/esm2022/lib/barsa-question-answer-content-actions-section/barsa-question-answer-content-actions-section.component.mjs +30 -0
- package/esm2022/lib/barsa-question-answer-creator-time-section/barsa-question-answer-creator-time-section.component.mjs +14 -0
- package/esm2022/lib/barsa-question-answer-form/barsa-question-answer-form.component.mjs +34 -0
- package/esm2022/lib/barsa-question-answer-form-add-comment/barsa-question-answer-form-add-comment.component.mjs +46 -0
- package/esm2022/lib/barsa-question-answer-vote-section/barsa-question-answer-vote-section.component.mjs +79 -0
- package/esm2022/lib/barsa-question-post/barsa-question-post.component.mjs +30 -0
- package/esm2022/lib/barsa-report-card-flex-view/barsa-report-card-flex-view.component.mjs +31 -0
- package/esm2022/lib/barsa-report-checkbox-switch-button/barsa-report-checkbox-switch-button.component.mjs +28 -0
- package/esm2022/lib/barsa-report-one-of-list/barsa-report-one-of-list.component.mjs +102 -0
- package/esm2022/lib/barsa-row-inline-actionlist/barsa-row-inline-actionlist.component.mjs +26 -0
- package/esm2022/lib/barsa-sap-ui-routing.module.mjs +18 -0
- package/esm2022/lib/barsa-sap-ui.module.mjs +377 -0
- package/esm2022/lib/barsa-search-form/barsa-search-form.component.mjs +29 -0
- package/esm2022/lib/barsa-simple-form/barsa-simple-form.component.mjs +170 -0
- package/esm2022/lib/barsa-tab-route-manager/barsa-tab-route-manager.component.mjs +18 -0
- package/esm2022/lib/barsa-table-column/barsa-table-column.component.mjs +29 -0
- package/esm2022/lib/barsa-table-header/barsa-table-header.component.mjs +222 -0
- package/esm2022/lib/barsa-table-row/barsa-table-row.component.mjs +87 -0
- package/esm2022/lib/barsa-tag-categories/barsa-tag-categories.component.mjs +60 -0
- package/esm2022/lib/barsa-tag-chip/barsa-tag-chip.component.mjs +26 -0
- package/esm2022/lib/barsa-tags-category-row/barsa-tags-category-row.component.mjs +23 -0
- package/esm2022/lib/barsa-text-ellipsis/barsa-text-ellipsis.component.mjs +37 -0
- package/esm2022/lib/barsa-tinyemce/barsa-tinyemce.component.mjs +418 -0
- package/esm2022/lib/barsa-toolbaritem-search/barsa-toolbaritem-search.component.mjs +36 -0
- package/esm2022/lib/barsa-tree-item/barsa-tree-item.component.mjs +153 -0
- package/esm2022/lib/barsa-tree-item/node-has-one-depth-level.pipe.mjs +20 -0
- package/esm2022/lib/barsa-ulv-main/barsa-ulv-main.component.mjs +216 -0
- package/esm2022/lib/blob-viewer/blob-viewer.component.mjs +74 -0
- package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +50 -0
- package/esm2022/lib/captcha-field/captcha-field.component.mjs +28 -0
- package/esm2022/lib/card-item/card-item.component.mjs +74 -0
- package/esm2022/lib/card-view-content/card-view-content.component.mjs +46 -0
- package/esm2022/lib/col-renderer.directive.mjs +47 -0
- package/esm2022/lib/column-matrix-renderer/column-matrix-renderer.component.mjs +56 -0
- package/esm2022/lib/column-matrix-renderer/matrix-value.pipe.mjs +61 -0
- package/esm2022/lib/column-renderer/column-renderer.component.mjs +97 -0
- package/esm2022/lib/constants.mjs +450 -0
- package/esm2022/lib/custom-date-time/custom-date-time.component.mjs +41 -0
- package/esm2022/lib/device-info-field-base.mjs +24 -0
- package/esm2022/lib/dialog-handler.directive.mjs +29 -0
- package/esm2022/lib/download-files.directive.mjs +34 -0
- package/esm2022/lib/dynamic-page-size.pipe.mjs +27 -0
- package/esm2022/lib/file-in-dialog/file-in-dialog.component.mjs +44 -0
- package/esm2022/lib/file-viewer/file-viewer.component.mjs +47 -0
- package/esm2022/lib/file-viewer-content/file-viewer-content.component.mjs +71 -0
- package/esm2022/lib/file-viewer-popover/file-viewer-popover.component.mjs +37 -0
- package/esm2022/lib/form-dialog/form-dialog.component.mjs +171 -0
- package/esm2022/lib/form-dialog-less/form-dialog-less.component.mjs +50 -0
- package/esm2022/lib/form-toolbar/form-toolbar.component.mjs +62 -0
- package/esm2022/lib/form-toolbar-button/form-toolbar-button.component.mjs +45 -0
- package/esm2022/lib/form-wizard/form-wizard.component.mjs +21 -0
- package/esm2022/lib/fullscreen-dialog.directive.mjs +60 -0
- package/esm2022/lib/fullscreen-files.directive.mjs +43 -0
- package/esm2022/lib/fundamental-dynamic-form/fundamental-dynamic-form.component.mjs +217 -0
- package/esm2022/lib/gantt-dhtml-chart-view/gantt-dhtml-chart-view.component.mjs +215 -0
- package/esm2022/lib/global-search/global-search.component.mjs +27 -0
- package/esm2022/lib/global-search-module/global-search-module.component.mjs +29 -0
- package/esm2022/lib/global-search-panel/global-search-panel.component.mjs +25 -0
- package/esm2022/lib/header-avatar/header-avatar.component.mjs +18 -0
- package/esm2022/lib/htree-create-new/htree-create-new.component.mjs +48 -0
- package/esm2022/lib/hyperlink/hyperlink.component.mjs +23 -0
- package/esm2022/lib/index.mjs +549 -0
- package/esm2022/lib/inline-save-and-cancel/inline-save-and-cancel.component.mjs +32 -0
- package/esm2022/lib/layout-actions/layout-actions.component.mjs +70 -0
- package/esm2022/lib/layout-control/layout-control.component.mjs +302 -0
- package/esm2022/lib/layout-wizard/layout-wizard.component.mjs +180 -0
- package/esm2022/lib/list-item/list-item.component.mjs +34 -0
- package/esm2022/lib/ly-empty-space/ly-empty-space.component.mjs +42 -0
- package/esm2022/lib/ly-horizontal-layout/ly-horizontal-layout.component.mjs +82 -0
- package/esm2022/lib/ly-label/ly-label.component.mjs +37 -0
- package/esm2022/lib/ly-layout-container/ly-layout-container.component.mjs +83 -0
- package/esm2022/lib/ly-layout-container-of-root/ly-layout-container-of-root.component.mjs +17 -0
- package/esm2022/lib/ly-layout-field-label/ly-layout-field-label.component.mjs +24 -0
- package/esm2022/lib/ly-layout-panel/ly-layout-panel.component.mjs +83 -0
- package/esm2022/lib/ly-line/ly-line.component.mjs +56 -0
- package/esm2022/lib/ly-simple-label/ly-simple-label.component.mjs +22 -0
- package/esm2022/lib/ly-tab-container/ly-tab-container.component.mjs +44 -0
- package/esm2022/lib/ly-tab-page/ly-tab-page.component.mjs +44 -0
- package/esm2022/lib/ly-vertical-layout/ly-vertical-layout.component.mjs +51 -0
- package/esm2022/lib/manage-filters-report/manage-filters-report.component.mjs +43 -0
- package/esm2022/lib/mask/mask.component.mjs +22 -0
- package/esm2022/lib/message-strip/message-strip.component.mjs +28 -0
- package/esm2022/lib/models/grid-data-provider.mjs +114 -0
- package/esm2022/lib/models/grid-view.mjs +2 -0
- package/esm2022/lib/models/index.mjs +2 -0
- package/esm2022/lib/no-data/no-data.component.mjs +31 -0
- package/esm2022/lib/notification-item/notification-item.component.mjs +57 -0
- package/esm2022/lib/notification-item-actions/notification-item-actions.component.mjs +79 -0
- package/esm2022/lib/notification-popup.service.mjs +92 -0
- package/esm2022/lib/object-status-icon.pipe.mjs +27 -0
- package/esm2022/lib/progress-indicator/progress-indicator.component.mjs +18 -0
- package/esm2022/lib/report-navigator/report-navigator.component.mjs +68 -0
- package/esm2022/lib/report-new-top-form/report-new-top-form.component.mjs +60 -0
- package/esm2022/lib/report-search-fields-hidden-settings/report-search-fields-hidden-settings.component.mjs +35 -0
- package/esm2022/lib/report-search-fields-manage/report-search-fields-manage.component.mjs +97 -0
- package/esm2022/lib/report-search-panel-save/report-search-panel-save.component.mjs +88 -0
- package/esm2022/lib/report-tree-base.mjs +387 -0
- package/esm2022/lib/report-view-renderer.directive.mjs +392 -0
- package/esm2022/lib/responsive-toolbar/responsive-toolbar.component.mjs +50 -0
- package/esm2022/lib/responsive-toolbar-renderer/responsive-toolbar-renderer.component.mjs +84 -0
- package/esm2022/lib/rich-text-static/rich-text-static.component.mjs +72 -0
- package/esm2022/lib/sap-font-class.pipe.mjs +30 -0
- package/esm2022/lib/sap-font.pipe.mjs +30 -0
- package/esm2022/lib/sap-size.pipe.mjs +28 -0
- package/esm2022/lib/sap-ui-report-base.component.mjs +809 -0
- package/esm2022/lib/search-panel/search-panel.component.mjs +63 -0
- package/esm2022/lib/static-text/static-text.component.mjs +15 -0
- package/esm2022/lib/table-th.directive.mjs +87 -0
- package/esm2022/lib/title/title.component.mjs +15 -0
- package/esm2022/lib/ui-asp-report-viewer/ui-asp-report-viewer.component.mjs +34 -0
- package/esm2022/lib/ui-bpmn-viewer/ui-bpmn-viewer.component.mjs +33 -0
- package/esm2022/lib/ui-button/ui-button.component.mjs +32 -0
- package/esm2022/lib/ui-calendar/ui-calendar.component.mjs +53 -0
- package/esm2022/lib/ui-card-view/ui-card-view.component.mjs +58 -0
- package/esm2022/lib/ui-card-view-horizontal-group/ui-card-view-horizontal-group.component.mjs +42 -0
- package/esm2022/lib/ui-check-box/ui-check-box.component.mjs +39 -0
- package/esm2022/lib/ui-color-ui/ui-color-ui.component.mjs +50 -0
- package/esm2022/lib/ui-container-with-button/ui-container-with-button.component.mjs +38 -0
- package/esm2022/lib/ui-date-range-ex/ui-date-range-ex.component.mjs +191 -0
- package/esm2022/lib/ui-date-time/ui-date-time.component.mjs +150 -0
- package/esm2022/lib/ui-editable-grid/ui-editable-grid.component.mjs +108 -0
- package/esm2022/lib/ui-exception-form/ui-exception-form.component.mjs +53 -0
- package/esm2022/lib/ui-file-linear-list-box/ui-file-linear-list-box.component.mjs +124 -0
- package/esm2022/lib/ui-form-panel/ui-form-panel.component.mjs +103 -0
- package/esm2022/lib/ui-gantt-chart/ui-gantt-chart.component.mjs +32 -0
- package/esm2022/lib/ui-graph/ui-graph.component.mjs +17 -0
- package/esm2022/lib/ui-grid/ui-grid.component.mjs +25 -0
- package/esm2022/lib/ui-grid-columns/ui-grid-columns.component.mjs +43 -0
- package/esm2022/lib/ui-grid-filter-item/ui-grid-filter-item.component.mjs +66 -0
- package/esm2022/lib/ui-grid-filter-settings/ui-grid-filter-settings.component.mjs +75 -0
- package/esm2022/lib/ui-grid-sort-item/ui-grid-sort-item.component.mjs +58 -0
- package/esm2022/lib/ui-grid-sort-setting/ui-grid-sort-setting.component.mjs +123 -0
- package/esm2022/lib/ui-html-viewer/ui-html-viewer.component.mjs +16 -0
- package/esm2022/lib/ui-info-bar-panel/ui-info-bar-panel.component.mjs +11 -0
- package/esm2022/lib/ui-label/ui-label.component.mjs +12 -0
- package/esm2022/lib/ui-linear-list-container-with-button/ui-linear-list-container-with-button.component.mjs +379 -0
- package/esm2022/lib/ui-list-view/ui-list-view.component.mjs +84 -0
- package/esm2022/lib/ui-map/ui-map.component.mjs +68 -0
- package/esm2022/lib/ui-matrix-view/ui-matrix-view.component.mjs +124 -0
- package/esm2022/lib/ui-mo-info-combo-viewer/ui-mo-info-combo-viewer.component.mjs +19 -0
- package/esm2022/lib/ui-mo-info-general-object-ui/ui-mo-info-general-object-ui.component.mjs +14 -0
- package/esm2022/lib/ui-mo-info-sub-form-ui/ui-mo-info-sub-form-ui.component.mjs +55 -0
- package/esm2022/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.mjs +429 -0
- package/esm2022/lib/ui-monaco-editor/ui-monaco-editor.component.mjs +28 -0
- package/esm2022/lib/ui-multi-select-card/ui-multi-select-card.component.mjs +37 -0
- package/esm2022/lib/ui-multi-select-checkbox/ui-multi-select-checkbox.component.mjs +59 -0
- package/esm2022/lib/ui-multi-select-combo/ui-multi-select-combo.component.mjs +93 -0
- package/esm2022/lib/ui-multi-select-radio/ui-multi-select-radio.component.mjs +36 -0
- package/esm2022/lib/ui-multi-select-slider/ui-multi-select-slider.component.mjs +56 -0
- package/esm2022/lib/ui-multi-select-smile/ui-multi-select-smile.component.mjs +28 -0
- package/esm2022/lib/ui-notification-view/ui-notification-view.component.mjs +47 -0
- package/esm2022/lib/ui-num-decimal-ui/ui-num-decimal-ui.component.mjs +33 -0
- package/esm2022/lib/ui-num-int-slider/ui-num-int-slider.component.mjs +27 -0
- package/esm2022/lib/ui-num-int-ui/ui-num-int-ui.component.mjs +21 -0
- package/esm2022/lib/ui-pdf-viewer/ui-pdf-viewer.component.mjs +268 -0
- package/esm2022/lib/ui-picture-file/ui-picture-file.component.mjs +101 -0
- package/esm2022/lib/ui-pictures-info/ui-pictures-info.component.mjs +261 -0
- package/esm2022/lib/ui-radio-group/ui-radio-group.component.mjs +48 -0
- package/esm2022/lib/ui-read-only-field/ui-read-only-field.component.mjs +36 -0
- package/esm2022/lib/ui-report-container/ui-report-container.component.mjs +46 -0
- package/esm2022/lib/ui-search-command-info-ui/ui-search-command-info-ui.component.mjs +24 -0
- package/esm2022/lib/ui-simple-combo/ui-simple-combo.component.mjs +55 -0
- package/esm2022/lib/ui-single-picture/ui-single-picture.component.mjs +36 -0
- package/esm2022/lib/ui-switch-button/ui-switch-button.component.mjs +20 -0
- package/esm2022/lib/ui-table-view/ui-table-view.component.mjs +296 -0
- package/esm2022/lib/ui-text-area/ui-text-area.component.mjs +49 -0
- package/esm2022/lib/ui-text-field/ui-text-field.component.mjs +52 -0
- package/esm2022/lib/ui-text-field-auto-complete/ui-text-field-auto-complete.component.mjs +48 -0
- package/esm2022/lib/ui-time-span/ui-time-span.component.mjs +24 -0
- package/esm2022/lib/ui-tinymce/ui-tinymce.component.mjs +53 -0
- package/esm2022/lib/ui-tree/ui-tree.component.mjs +114 -0
- package/esm2022/lib/ui-tree-view/ui-tree-view.component.mjs +100 -0
- package/esm2022/lib/ui-ulv-form-multi-select-ui/ui-ulv-form-multi-select-ui.component.mjs +23 -0
- package/esm2022/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.mjs +310 -0
- package/esm2022/lib/ui-workflow-panel-ui/ui-workflow-panel-ui.component.mjs +25 -0
- package/esm2022/lib/ul-loading-mask-ui/ul-loading-mask-ui.component.mjs +93 -0
- package/esm2022/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.mjs +119 -0
- package/esm2022/lib/ul-notify-popup/ul-notify-popup.component.mjs +32 -0
- package/esm2022/lib/ul-toast-adapter/ul-toast-adapter.component.mjs +48 -0
- package/esm2022/lib/ulv-column-settings/ulv-column-settings.component.mjs +53 -0
- package/esm2022/lib/ulv-context-menu/ulv-context-menu.component.mjs +116 -0
- package/esm2022/lib/ulv-filter-settings/ulv-filter-settings.component.mjs +43 -0
- package/esm2022/lib/ulv-form-multi-select/ulv-form-multi-select.component.mjs +196 -0
- package/esm2022/lib/ulv-groupby-settings/ulv-groupby-settings.component.mjs +44 -0
- package/esm2022/lib/ulv-paging/ulv-paging.component.mjs +84 -0
- package/esm2022/lib/ulv-selection/ulv-selection.component.mjs +65 -0
- package/esm2022/lib/ulv-settings/ulv-settings.component.mjs +116 -0
- package/esm2022/lib/ulv-sort-settings/ulv-sort-settings.component.mjs +54 -0
- package/esm2022/lib/ulv-toolbar/ulv-toolbar.component.mjs +177 -0
- package/esm2022/lib/upload-file-status.pipe.mjs +29 -0
- package/esm2022/lib/util-chat-time-badge.pipe.mjs +18 -0
- package/esm2022/lib/util-date-to-hh-mm.pipe.mjs +23 -0
- package/esm2022/lib/wizard-layout.directive.mjs +104 -0
- package/esm2022/public-api.mjs +236 -0
- package/fesm2022/barsa-sap-ui.mjs +4 -4
- package/fesm2022/barsa-sap-ui.mjs.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Subject } from 'rxjs';
|
|
3
|
+
import { debounceTime, map, takeUntil } from 'rxjs/operators';
|
|
4
|
+
import { BarsaApi, getAllItemsPerChildren, setOneDepthLevel } from 'barsa-novin-ray-core';
|
|
5
|
+
import { SapUiReportBaseComponent } from './sap-ui-report-base.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class ReportTreeBaseComponent extends SapUiReportBaseComponent {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this._dragMove = new Subject();
|
|
11
|
+
this._selectedNodeSource = new BehaviorSubject(null);
|
|
12
|
+
this._rootSource = new BehaviorSubject(null);
|
|
13
|
+
}
|
|
14
|
+
get _root() {
|
|
15
|
+
return this._rootSource.getValue();
|
|
16
|
+
}
|
|
17
|
+
ngOnInit() {
|
|
18
|
+
this.selectedNode$ = this._selectedNodeSource.asObservable();
|
|
19
|
+
this.root$ = this._rootSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
20
|
+
super.ngOnInit();
|
|
21
|
+
this.rtl$ = this._portalService.rtl$;
|
|
22
|
+
this.contentDensity$ = this._contentDensityService.contentDensity;
|
|
23
|
+
this._rootSource.next(this.context.root);
|
|
24
|
+
if (this.viewSetting?.DefaultCollapsed) {
|
|
25
|
+
this.collapseAll();
|
|
26
|
+
}
|
|
27
|
+
this._selectedNodeSource.next(this.context.selNode);
|
|
28
|
+
this.context.on({
|
|
29
|
+
rootChanged: (root) => {
|
|
30
|
+
this._rootSource.next(root);
|
|
31
|
+
},
|
|
32
|
+
selectedNodeChange: (node) => {
|
|
33
|
+
this._selectedNodeSource.next(node);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
this._rootSource
|
|
37
|
+
.pipe(takeUntil(this._onDestroy$), map((root) => {
|
|
38
|
+
if (root) {
|
|
39
|
+
const moList = [];
|
|
40
|
+
const autoOpenLevels = BarsaApi.Common.Util.TryGetValue(this.context, 'Setting.View.TreeAutoOpenLevels', 1);
|
|
41
|
+
getAllItemsPerChildren(root, 0, moList, root, autoOpenLevels);
|
|
42
|
+
return moList;
|
|
43
|
+
}
|
|
44
|
+
return [];
|
|
45
|
+
}))
|
|
46
|
+
.subscribe((flatMoDataList) => {
|
|
47
|
+
this.flatMoDataList = flatMoDataList.map((c) => ({
|
|
48
|
+
...c,
|
|
49
|
+
parentNode: c.parentNode ? { ...c.parentNode } : null
|
|
50
|
+
}));
|
|
51
|
+
});
|
|
52
|
+
this._resetDropActionTodo();
|
|
53
|
+
this._dragMove
|
|
54
|
+
.asObservable()
|
|
55
|
+
.pipe(takeUntil(this._onDestroy$), debounceTime(50))
|
|
56
|
+
.subscribe((event) => {
|
|
57
|
+
this._doDragMove(event);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
onCreateNew(e) {
|
|
61
|
+
this.context.fireEvent('createNew', e);
|
|
62
|
+
}
|
|
63
|
+
dragMoved(event) {
|
|
64
|
+
this._dragMove.next(event);
|
|
65
|
+
}
|
|
66
|
+
drop(event) {
|
|
67
|
+
this._removeNoDrops();
|
|
68
|
+
this._clearDragInfo();
|
|
69
|
+
const dragAction = this.dropActionTodo.action;
|
|
70
|
+
if (!dragAction) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (dragAction === 'forbid') {
|
|
74
|
+
ReportTreeBaseComponent._showForbiddenMoveAlert();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const draggedItemId = event.item.data;
|
|
78
|
+
const targetItemId = this.dropActionTodo.targetId;
|
|
79
|
+
const draggedItem = this._getNodeById(draggedItemId);
|
|
80
|
+
const targetItem = this._getNodeById(targetItemId);
|
|
81
|
+
const oldParentNodeId = draggedItem.parentNode?.Data?.Id || '$Root';
|
|
82
|
+
const newParentNodeId = targetItem.parentNode?.Data?.Id || '$Root';
|
|
83
|
+
const oldParentNode = draggedItem.parentNode;
|
|
84
|
+
let newParentNode = targetItem.parentNode;
|
|
85
|
+
if (oldParentNode && newParentNode) {
|
|
86
|
+
switch (dragAction) {
|
|
87
|
+
case 'before':
|
|
88
|
+
case 'after': {
|
|
89
|
+
let serverTarget = targetItem;
|
|
90
|
+
if (dragAction === 'after') {
|
|
91
|
+
const targetIndex = this.flatMoDataList.findIndex((c) => c.Data.Id === targetItem.Data.Id);
|
|
92
|
+
if (targetIndex === this.flatMoDataList.length - 1) {
|
|
93
|
+
serverTarget = null;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const afterTarget = this.flatMoDataList[targetIndex + 1];
|
|
97
|
+
if (afterTarget.parentNode === targetItem.parentNode) {
|
|
98
|
+
serverTarget = afterTarget;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
serverTarget = null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
this._saveToServer(draggedItem.Data.Id, serverTarget, newParentNode);
|
|
106
|
+
this._changeDraggedItemsOrder(draggedItem, targetItem, newParentNode, oldParentNode, oldParentNodeId);
|
|
107
|
+
if (newParentNodeId !== '$Root') {
|
|
108
|
+
const i = this.flatMoDataList.indexOf(draggedItem) -
|
|
109
|
+
this.flatMoDataList.indexOf(targetItem.parentNode);
|
|
110
|
+
newParentNode?.children.splice(i, 0, draggedItem);
|
|
111
|
+
}
|
|
112
|
+
// send new moDataList To server:
|
|
113
|
+
// (draggedItem, draggedItem.parentNode, draggedItem.parentNode.children?.indexOf(draggedItem))
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
case 'inside': {
|
|
117
|
+
newParentNode = targetItem;
|
|
118
|
+
this._saveToServer(draggedItem.Data.Id, null, newParentNode);
|
|
119
|
+
this._moveNodeInsideAnother(draggedItem, targetItem);
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
setOneDepthLevel(newParentNode);
|
|
124
|
+
setOneDepthLevel(oldParentNode);
|
|
125
|
+
this._clearDragInfo(true);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
_rebindRoot() {
|
|
129
|
+
this._rootSource.next(this._root);
|
|
130
|
+
}
|
|
131
|
+
_saveToServer(draggedId, target, parent) {
|
|
132
|
+
const targetId = target ? target.Data.Id : '0';
|
|
133
|
+
const parentId = parent.Data.Id === '$Root' ? '0' : parent.Data.Id;
|
|
134
|
+
BarsaApi.Bw.RunBlMethod('MoveTreeNode', draggedId, targetId, parentId);
|
|
135
|
+
}
|
|
136
|
+
confirmDialog(selectedNode) {
|
|
137
|
+
this.dialogRef.close(selectedNode);
|
|
138
|
+
}
|
|
139
|
+
dismissDialog() {
|
|
140
|
+
this.dialogRef.dismiss();
|
|
141
|
+
}
|
|
142
|
+
collapseAll() {
|
|
143
|
+
this.context.fireEvent('collapseAll');
|
|
144
|
+
}
|
|
145
|
+
openMoveToDialog(sourceNode, device, dialogTmp) {
|
|
146
|
+
const config = {
|
|
147
|
+
...this.dialogConfig,
|
|
148
|
+
data: { context: this.context },
|
|
149
|
+
mobile: device === 'mobile',
|
|
150
|
+
minWidth: device === 'mobile' ? 'auto' : this.dialogConfig.minWidth,
|
|
151
|
+
minHeight: device === 'mobile' ? 'auto' : this.dialogConfig.minHeight
|
|
152
|
+
};
|
|
153
|
+
this.dialogRef = this._dialogService.open(dialogTmp, config);
|
|
154
|
+
this.dialogRef.afterClosed.subscribe((destinationNode) => {
|
|
155
|
+
if (!destinationNode) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const canMove = this._canMove(sourceNode, destinationNode);
|
|
159
|
+
if (canMove) {
|
|
160
|
+
this._moveNodeInsideAnother(sourceNode, destinationNode);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
ReportTreeBaseComponent._showForbiddenMoveAlert();
|
|
164
|
+
}
|
|
165
|
+
this._rootSource.next(this._root);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
selectNodeInMoveDialog(ev) {
|
|
169
|
+
this.dialogSelectedNode = ev.node;
|
|
170
|
+
}
|
|
171
|
+
loadChildren(node) {
|
|
172
|
+
this.context.fireEvent('loadNodeChildren', node);
|
|
173
|
+
}
|
|
174
|
+
/* eslint-disable */
|
|
175
|
+
updateGridSetting() { }
|
|
176
|
+
_selectNode(node) {
|
|
177
|
+
this.context.selNode = node;
|
|
178
|
+
this._selectedNodeSource.next(node);
|
|
179
|
+
this.context.fireEvent('click');
|
|
180
|
+
this.context.fireEvent('selectionchange');
|
|
181
|
+
}
|
|
182
|
+
/* eslint-disable */
|
|
183
|
+
_deselectNode() {
|
|
184
|
+
this.context.selNode = null;
|
|
185
|
+
this._selectedNodeSource.next(null);
|
|
186
|
+
}
|
|
187
|
+
_raiseRowClick(index, mo) {
|
|
188
|
+
this.context.selNode = mo;
|
|
189
|
+
this.context?.fireEvent('dblclick', this.context, index, mo);
|
|
190
|
+
}
|
|
191
|
+
_resetDropActionTodo() {
|
|
192
|
+
this.dropActionTodo = { targetId: null, action: null };
|
|
193
|
+
}
|
|
194
|
+
_changeDraggedItemsOrder(draggedItem, targetItem, newParentNode, oldParentNode, oldParentNodeId) {
|
|
195
|
+
this._removeDraggedItemFromMoDataList(draggedItem);
|
|
196
|
+
if (oldParentNodeId !== '$Root') {
|
|
197
|
+
// oldParentNode.children?.remove(draggedItem);
|
|
198
|
+
oldParentNode.children = oldParentNode.children.filter((c) => c.Data.Id !== draggedItem.Data.Id);
|
|
199
|
+
oldParentNode.leaf = !(oldParentNode.children?.length > 0);
|
|
200
|
+
oldParentNode.Data.$HasChildren = !oldParentNode.leaf;
|
|
201
|
+
}
|
|
202
|
+
draggedItem.parentNode = newParentNode;
|
|
203
|
+
this._setLevelForDraggedItems(draggedItem, newParentNode.level || 0);
|
|
204
|
+
const targetIndex = this.flatMoDataList.indexOf(targetItem);
|
|
205
|
+
const index = this.dropActionTodo.action === 'before' ? targetIndex : this._nextIndexInMoDataList(targetItem);
|
|
206
|
+
this._addDraggedItemsToMoDataList(draggedItem, index);
|
|
207
|
+
}
|
|
208
|
+
_addDraggedItemsToMoDataList(node, i) {
|
|
209
|
+
this.flatMoDataList.splice(i, 0, node);
|
|
210
|
+
node?.children?.forEach((child) => {
|
|
211
|
+
i++;
|
|
212
|
+
i = this._addDraggedItemsToMoDataList(child, i);
|
|
213
|
+
});
|
|
214
|
+
return i;
|
|
215
|
+
}
|
|
216
|
+
_removeDraggedItemFromMoDataList(node) {
|
|
217
|
+
node?.children?.forEach((child) => {
|
|
218
|
+
this._removeDraggedItemFromMoDataList(child);
|
|
219
|
+
});
|
|
220
|
+
this.flatMoDataList.remove(node);
|
|
221
|
+
}
|
|
222
|
+
_nextIndexInMoDataList(node) {
|
|
223
|
+
return this.flatMoDataList.indexOf(node) + this._allNestedChildesCount(node) + 1;
|
|
224
|
+
}
|
|
225
|
+
_allNestedChildesCount(node, i = 0) {
|
|
226
|
+
node.children?.forEach((child) => {
|
|
227
|
+
i++;
|
|
228
|
+
if (child.children?.length > 0) {
|
|
229
|
+
i = this._allNestedChildesCount(child, i);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
return i;
|
|
233
|
+
}
|
|
234
|
+
_getNodeById(id) {
|
|
235
|
+
let node;
|
|
236
|
+
for (const mo of this.flatMoDataList) {
|
|
237
|
+
if (mo.Data.Id === id) {
|
|
238
|
+
node = mo;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return node;
|
|
242
|
+
}
|
|
243
|
+
_setLevelForDraggedItems(node, parentLevel) {
|
|
244
|
+
parentLevel++;
|
|
245
|
+
node.level = parentLevel;
|
|
246
|
+
node?.children?.forEach((child) => {
|
|
247
|
+
this._setLevelForDraggedItems(child, parentLevel);
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
_moveNodeInsideAnother(sourceNode, destinationNode) {
|
|
251
|
+
const oldParentNode = sourceNode.parentNode;
|
|
252
|
+
const oldParentNodeId = oldParentNode?.Data?.Id || '$Root';
|
|
253
|
+
this._changeDraggedItemsOrder(sourceNode, destinationNode, destinationNode, oldParentNode, oldParentNodeId);
|
|
254
|
+
this.context.fireEvent('moveNodeInsideAnother', sourceNode, destinationNode);
|
|
255
|
+
}
|
|
256
|
+
_clearDragInfo(dropped = false) {
|
|
257
|
+
if (dropped) {
|
|
258
|
+
this._resetDropActionTodo();
|
|
259
|
+
}
|
|
260
|
+
this.el.nativeElement
|
|
261
|
+
.querySelectorAll('.drop-before')
|
|
262
|
+
.forEach((element) => this._renderer.removeClass(element, 'drop-before'));
|
|
263
|
+
this.el.nativeElement
|
|
264
|
+
.querySelectorAll('.drop-after')
|
|
265
|
+
.forEach((element) => this._renderer.removeClass(element, 'drop-after'));
|
|
266
|
+
this.el.nativeElement
|
|
267
|
+
.querySelectorAll('.drop-inside')
|
|
268
|
+
.forEach((element) => this._renderer.removeClass(element, 'drop-inside'));
|
|
269
|
+
}
|
|
270
|
+
_stopDragging() {
|
|
271
|
+
this._clearDragInfo();
|
|
272
|
+
this._resetDropActionTodo();
|
|
273
|
+
}
|
|
274
|
+
_showDragInfo() {
|
|
275
|
+
this._clearDragInfo();
|
|
276
|
+
if (this.dropActionTodo.targetId) {
|
|
277
|
+
const parent = this._getNodeById(this.dropActionTodo.targetId);
|
|
278
|
+
const newParentId = parent?.parentNode?.Data?.Id || '$Root';
|
|
279
|
+
const targetNodeElement = this.el.nativeElement.querySelector('#node-' + this.dropActionTodo.targetId);
|
|
280
|
+
if (!targetNodeElement) {
|
|
281
|
+
this._resetDropActionTodo();
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
else if (newParentId === '$Root' && this.dropActionTodo.action !== 'inside') {
|
|
285
|
+
const rootContainer = this.el.nativeElement.querySelector('fd-layout-panel');
|
|
286
|
+
this._renderer.addClass(rootContainer, 'drop-inside');
|
|
287
|
+
}
|
|
288
|
+
this._renderer.addClass(targetNodeElement, 'drop-' + this.dropActionTodo?.action);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
_doDragMove(event) {
|
|
292
|
+
const elementFromPoint = document.elementFromPoint(event.pointerPosition.x, event.pointerPosition.y);
|
|
293
|
+
if (!elementFromPoint) {
|
|
294
|
+
this._stopDragging();
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const targetNodeElement = elementFromPoint.classList.contains('node-item')
|
|
298
|
+
? elementFromPoint
|
|
299
|
+
: elementFromPoint.closest('.node-item');
|
|
300
|
+
if (!targetNodeElement) {
|
|
301
|
+
this._stopDragging();
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
this.dropActionTodo = {
|
|
305
|
+
targetId: targetNodeElement.getAttribute('data-id')
|
|
306
|
+
};
|
|
307
|
+
const targetRect = targetNodeElement.getBoundingClientRect();
|
|
308
|
+
const oneThird = targetRect.height / 3;
|
|
309
|
+
if (event.pointerPosition.y - targetRect.top < oneThird) {
|
|
310
|
+
// before
|
|
311
|
+
this.dropActionTodo.action = 'before';
|
|
312
|
+
}
|
|
313
|
+
else if (event.pointerPosition.y - targetRect.top > 2 * oneThird) {
|
|
314
|
+
// after
|
|
315
|
+
this.dropActionTodo.action = 'after';
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
// inside
|
|
319
|
+
this.dropActionTodo.action = 'inside';
|
|
320
|
+
}
|
|
321
|
+
this._setNoDropItems(event.source.data);
|
|
322
|
+
this._setNoDropStyle();
|
|
323
|
+
const targetNode = this._getNodeById(this.dropActionTodo.targetId);
|
|
324
|
+
if (targetNode.noDrop) {
|
|
325
|
+
this._stopDragging();
|
|
326
|
+
this.dropActionTodo.action = 'forbid';
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
this._showDragInfo();
|
|
330
|
+
}
|
|
331
|
+
_removeNoDrops() {
|
|
332
|
+
this.flatMoDataList
|
|
333
|
+
.filter((node) => node.noDrop)
|
|
334
|
+
.forEach((node) => {
|
|
335
|
+
node.noDrop = false;
|
|
336
|
+
const el = this.el.nativeElement.querySelector('#node-' + node.Data.Id);
|
|
337
|
+
if (el) {
|
|
338
|
+
this._renderer.removeClass(el, 'no-drop');
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
_setNoDropItems(draggedItemId) {
|
|
343
|
+
const node = this._getNodeById(draggedItemId);
|
|
344
|
+
node.noDrop = true;
|
|
345
|
+
node.children?.forEach((child) => {
|
|
346
|
+
this._setNoDropItems(child.Data.Id);
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
_setNoDropStyle() {
|
|
350
|
+
this.flatMoDataList
|
|
351
|
+
.filter((node) => node.noDrop)
|
|
352
|
+
.forEach((node) => {
|
|
353
|
+
const el = this.el.nativeElement.querySelector('#node-' + node.Data.Id);
|
|
354
|
+
if (el) {
|
|
355
|
+
this._renderer.addClass(el, 'no-drop');
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
_canMove(sourceNode, destinationNode) {
|
|
360
|
+
let canMove = true;
|
|
361
|
+
if (sourceNode.Data.Id === destinationNode.Data.Id) {
|
|
362
|
+
canMove = false;
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
sourceNode.children?.foreach((child) => {
|
|
366
|
+
canMove = this._canMove(sourceNode, child);
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
return canMove;
|
|
370
|
+
}
|
|
371
|
+
/* eslint-disable */
|
|
372
|
+
static _showForbiddenMoveAlert() {
|
|
373
|
+
BarsaApi.Bw.Msg.Error('نمیتوانید آیتم را به زیرشاخه خودش منتقل کنید.');
|
|
374
|
+
}
|
|
375
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReportTreeBaseComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
376
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ReportTreeBaseComponent, selector: "bsu-report-tree-base", usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
377
|
+
}
|
|
378
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReportTreeBaseComponent, decorators: [{
|
|
379
|
+
type: Component,
|
|
380
|
+
args: [{
|
|
381
|
+
selector: 'bsu-report-tree-base',
|
|
382
|
+
template: '',
|
|
383
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
384
|
+
standalone: false
|
|
385
|
+
}]
|
|
386
|
+
}] });
|
|
387
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXRyZWUtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL3JlcG9ydC10cmVlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc5RCxPQUFPLEVBQ0gsUUFBUSxFQUtSLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDbkIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFTMUUsTUFBTSxPQUFPLHVCQUF3QixTQUFRLHdCQUFpRDtJQU45Rjs7UUFhSSxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUlyQix3QkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBcUIsSUFBSSxDQUFDLENBQUM7UUFDcEUsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBcUIsSUFBSSxDQUFDLENBQUM7S0F3WnpFO0lBdlpHLElBQVksS0FBSztRQUNiLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsUUFBUTtRQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQy9FLEtBQUssQ0FBQyxRQUFRLEVBQUUs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UUFBUSxDQUFDLFVBQVUsRUFBRSxlQUFlO1FBQ3hDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakQsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixDQUFDO2FBQU0sQ0FBQztZQUNKLFVBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ25DLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBQ0Qsb0JBQW9CO0lBQ1osTUFBTSxDQUFDLHVCQUF1QjtRQUNsQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUMzRSxDQUFDOytHQW5hUSx1QkFBdUI7bUdBQXZCLHVCQUF1QixtRkFKdEIsRUFBRTs7NEZBSUgsdUJBQXVCO2tCQU5uQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFFBQVEsRUFBRSxFQUFFO29CQUNaLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxVQUFVLEVBQUUsS0FBSztpQkFDcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvbnRlbnREZW5zaXR5LCBEaWFsb2dDb25maWcgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIEJhcnNhQXBpLFxyXG4gICAgTWV0YW9iamVjdERhdGFNb2RlbCxcclxuICAgIFVpUmVwb3J0Vmlld0Jhc2VTZXR0aW5nLFxyXG4gICAgVHJlZU5vZGVPYmosXHJcbiAgICBSZWxhdGlvbkl0ZW1UeXBlLFxyXG4gICAgZ2V0QWxsSXRlbXNQZXJDaGlsZHJlbixcclxuICAgIHNldE9uZURlcHRoTGV2ZWxcclxufSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XHJcbmltcG9ydCB7IFNhcFVpUmVwb3J0QmFzZUNvbXBvbmVudCB9IGZyb20gJy4vc2FwLXVpLXJlcG9ydC1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERyb3BJbmZvIH0gZnJvbSAnLi91aS10cmVlLXZpZXcvdWktdHJlZS12aWV3LmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYnN1LXJlcG9ydC10cmVlLWJhc2UnLFxyXG4gICAgdGVtcGxhdGU6ICcnLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBzdGFuZGFsb25lOiBmYWxzZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVwb3J0VHJlZUJhc2VDb21wb25lbnQgZXh0ZW5kcyBTYXBVaVJlcG9ydEJhc2VDb21wb25lbnQ8VWlSZXBvcnRWaWV3QmFzZVNldHRpbmc+IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgIGNvbnRlbnREZW5zaXR5JDogT2JzZXJ2YWJsZTxDb250ZW50RGVuc2l0eT47XHJcbiAgICBydGwkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgZGlhbG9nU2VsZWN0ZWROb2RlO1xyXG4gICAgc2VsZWN0ZWROb2RlJDogT2JzZXJ2YWJsZTxUcmVlTm9kZU9iaiB8IG51bGw+O1xyXG4gICAgcm9vdCQ6IE9ic2VydmFibGU8VHJlZU5vZGVPYmogfCBudWxsPjtcclxuICAgIGRyb3BBY3Rpb25Ub2RvOiBEcm9wSW5mbztcclxuICAgIF9kcmFnTW92ZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAgIGZsYXRNb0RhdGFMaXN0O1xyXG4gICAgZGlhbG9nUmVmO1xyXG5cclxuICAgIHByb3RlY3RlZCBfc2VsZWN0ZWROb2RlU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUcmVlTm9kZU9iaiB8IG51bGw+KG51bGwpO1xyXG4gICAgcHJvdGVjdGVkIF9yb290U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUcmVlTm9kZU9iaiB8IG51bGw+KG51bGwpO1xyXG4gICAgcHJpdmF0ZSBnZXQgX3Jvb3QoKTogVHJlZU5vZGVPYmogfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdFNvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUkID0gdGhpcy5fc2VsZWN0ZWROb2RlU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHRoaXMucm9vdCQgPSB0aGlzLl9yb290U291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKTtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgICAgIHRoaXMucnRsJCA9IHRoaXMuX3BvcnRhbFNlcnZpY2UucnRsJDtcclxuICAgICAgICB0aGlzLmNvbnRlbnREZW5zaXR5JCA9IHRoaXMuX2NvbnRlbnREZW5zaXR5U2VydmljZS5jb250ZW50RGVuc2l0eTtcclxuICAgICAgICB0aGlzLl9yb290U291cmNlLm5leHQodGhpcy5jb250ZXh0LnJvb3QpO1xyXG4gICAgICAgIGlmICh0aGlzLnZpZXdTZXR0aW5nPy5EZWZhdWx0Q29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sbGFwc2VBbGwoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWROb2RlU291cmNlLm5leHQodGhpcy5jb250ZXh0LnNlbE5vZGUpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5vbih7XHJcbiAgICAgICAgICAgIHJvb3RDaGFuZ2VkOiAocm9vdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcm9vdFNvdXJjZS5uZXh0KHJvb3QpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZWxlY3RlZE5vZGVDaGFuZ2U6IChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZE5vZGVTb3VyY2UubmV4dChub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX3Jvb3RTb3VyY2VcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCksXHJcbiAgICAgICAgICAgICAgICBtYXAoKHJvb3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocm9vdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb0xpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvT3BlbkxldmVscyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NldHRpbmcuVmlldy5UcmVlQXV0b09wZW5MZXZlbHMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRBbGxJdGVtc1BlckNoaWxkcmVuKHJvb3QsIDAsIG1vTGlzdCwgcm9vdCwgYXV0b09wZW5MZXZlbHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9MaXN0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGZsYXRNb0RhdGFMaXN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZsYXRNb0RhdGFMaXN0ID0gZmxhdE1vRGF0YUxpc3QubWFwKChjKSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmMsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZTogYy5wYXJlbnROb2RlID8geyAuLi5jLnBhcmVudE5vZGUgfSA6IG51bGxcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXREcm9wQWN0aW9uVG9kbygpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdNb3ZlXHJcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCksIGRlYm91bmNlVGltZSg1MCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kb0RyYWdNb3ZlKGV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DcmVhdGVOZXcoZTogUmVsYXRpb25JdGVtVHlwZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ2NyZWF0ZU5ldycsIGUpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGRyYWdNb3ZlZChldmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RyYWdNb3ZlLm5leHQoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGRyb3AoZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9yZW1vdmVOb0Ryb3BzKCk7XHJcbiAgICAgICAgdGhpcy5fY2xlYXJEcmFnSW5mbygpO1xyXG4gICAgICAgIGNvbnN0IGRyYWdBY3Rpb24gPSB0aGlzLmRyb3BBY3Rpb25Ub2RvLmFjdGlvbjtcclxuICAgICAgICBpZiAoIWRyYWdBY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZHJhZ0FjdGlvbiA9PT0gJ2ZvcmJpZCcpIHtcclxuICAgICAgICAgICAgUmVwb3J0VHJlZUJhc2VDb21wb25lbnQuX3Nob3dGb3JiaWRkZW5Nb3ZlQWxlcnQoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkcmFnZ2VkSXRlbUlkID0gZXZlbnQuaXRlbS5kYXRhO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEl0ZW1JZCA9IHRoaXMuZHJvcEFjdGlvblRvZG8udGFyZ2V0SWQ7XHJcbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW0gPSB0aGlzLl9nZXROb2RlQnlJZChkcmFnZ2VkSXRlbUlkKTtcclxuICAgICAgICBjb25zdCB0YXJnZXRJdGVtID0gdGhpcy5fZ2V0Tm9kZUJ5SWQodGFyZ2V0SXRlbUlkKTtcclxuICAgICAgICBjb25zdCBvbGRQYXJlbnROb2RlSWQgPSBkcmFnZ2VkSXRlbS5wYXJlbnROb2RlPy5EYXRhPy5JZCB8fCAnJFJvb3QnO1xyXG4gICAgICAgIGNvbnN0IG5ld1BhcmVudE5vZGVJZCA9IHRhcmdldEl0ZW0ucGFyZW50Tm9kZT8uRGF0YT8uSWQgfHwgJyRSb290JztcclxuICAgICAgICBjb25zdCBvbGRQYXJlbnROb2RlID0gZHJhZ2dlZEl0ZW0ucGFyZW50Tm9kZTtcclxuICAgICAgICBsZXQgbmV3UGFyZW50Tm9kZSA9IHRhcmdldEl0ZW0ucGFyZW50Tm9kZTtcclxuICAgICAgICBpZiAob2xkUGFyZW50Tm9kZSAmJiBuZXdQYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoZHJhZ0FjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnYmVmb3JlJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2FmdGVyJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZXJ2ZXJUYXJnZXQ6IFRyZWVOb2RlT2JqIHwgbnVsbCA9IHRhcmdldEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyYWdBY3Rpb24gPT09ICdhZnRlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLmZsYXRNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5EYXRhLklkID09PSB0YXJnZXRJdGVtLkRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IHRoaXMuZmxhdE1vRGF0YUxpc3QubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVGFyZ2V0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyVGFyZ2V0ID0gdGhpcy5mbGF0TW9EYXRhTGlzdFt0YXJnZXRJbmRleCArIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyVGFyZ2V0LnBhcmVudE5vZGUgPT09IHRhcmdldEl0ZW0ucGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRhcmdldCA9IGFmdGVyVGFyZ2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUYXJnZXQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhdmVUb1NlcnZlcihkcmFnZ2VkSXRlbS5EYXRhLklkLCBzZXJ2ZXJUYXJnZXQsIG5ld1BhcmVudE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURyYWdnZWRJdGVtc09yZGVyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50Tm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50Tm9kZUlkXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobmV3UGFyZW50Tm9kZUlkICE9PSAnJFJvb3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mbGF0TW9EYXRhTGlzdC5pbmRleE9mKGRyYWdnZWRJdGVtKSAtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZsYXRNb0RhdGFMaXN0LmluZGV4T2YodGFyZ2V0SXRlbS5wYXJlbnROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50Tm9kZT8uY2hpbGRyZW4uc3BsaWNlKGksIDAsIGRyYWdnZWRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgbmV3IG1vRGF0YUxpc3QgVG8gc2VydmVyOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIChkcmFnZ2VkSXRlbSwgZHJhZ2dlZEl0ZW0ucGFyZW50Tm9kZSwgZHJhZ2dlZEl0ZW0ucGFyZW50Tm9kZS5jaGlsZHJlbj8uaW5kZXhPZihkcmFnZ2VkSXRlbSkpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnaW5zaWRlJzoge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudE5vZGUgPSB0YXJnZXRJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhdmVUb1NlcnZlcihkcmFnZ2VkSXRlbS5EYXRhLklkLCBudWxsLCBuZXdQYXJlbnROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlTm9kZUluc2lkZUFub3RoZXIoZHJhZ2dlZEl0ZW0sIHRhcmdldEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNldE9uZURlcHRoTGV2ZWwobmV3UGFyZW50Tm9kZSk7XHJcbiAgICAgICAgICAgIHNldE9uZURlcHRoTGV2ZWwob2xkUGFyZW50Tm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyRHJhZ0luZm8odHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9yZWJpbmRSb290KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Jvb3RTb3VyY2UubmV4dCh0aGlzLl9yb290KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NhdmVUb1NlcnZlcihkcmFnZ2VkSWQ6IHN0cmluZywgdGFyZ2V0OiBUcmVlTm9kZU9iaiB8IG51bGwsIHBhcmVudDogVHJlZU5vZGVPYmopOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0YXJnZXRJZDogc3RyaW5nID0gdGFyZ2V0ID8gdGFyZ2V0LkRhdGEuSWQgOiAnMCc7XHJcbiAgICAgICAgY29uc3QgcGFyZW50SWQ6IHN0cmluZyA9IHBhcmVudC5EYXRhLklkID09PSAnJFJvb3QnID8gJzAnIDogcGFyZW50LkRhdGEuSWQ7XHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2QoJ01vdmVUcmVlTm9kZScsIGRyYWdnZWRJZCwgdGFyZ2V0SWQsIHBhcmVudElkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uZmlybURpYWxvZyhzZWxlY3RlZE5vZGU6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShzZWxlY3RlZE5vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkaXNtaXNzRGlhbG9nKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmRpc21pc3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29sbGFwc2VBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnY29sbGFwc2VBbGwnKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb3Blbk1vdmVUb0RpYWxvZyhzb3VyY2VOb2RlLCBkZXZpY2U6IHN0cmluZywgZGlhbG9nVG1wKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY29uZmlnOiBEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGlhbG9nQ29uZmlnLFxyXG4gICAgICAgICAgICBkYXRhOiB7IGNvbnRleHQ6IHRoaXMuY29udGV4dCB9LFxyXG4gICAgICAgICAgICBtb2JpbGU6IGRldmljZSA9PT0gJ21vYmlsZScsXHJcbiAgICAgICAgICAgIG1pbldpZHRoOiBkZXZpY2UgPT09ICdtb2JpbGUnID8gJ2F1dG8nIDogdGhpcy5kaWFsb2dDb25maWcubWluV2lkdGgsXHJcbiAgICAgICAgICAgIG1pbkhlaWdodDogZGV2aWNlID09PSAnbW9iaWxlJyA/ICdhdXRvJyA6IHRoaXMuZGlhbG9nQ29uZmlnLm1pbkhlaWdodFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLl9kaWFsb2dTZXJ2aWNlLm9wZW4oZGlhbG9nVG1wLCBjb25maWcpO1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmFmdGVyQ2xvc2VkLnN1YnNjcmliZSgoZGVzdGluYXRpb25Ob2RlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZGVzdGluYXRpb25Ob2RlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgY2FuTW92ZSA9IHRoaXMuX2Nhbk1vdmUoc291cmNlTm9kZSwgZGVzdGluYXRpb25Ob2RlKTtcclxuICAgICAgICAgICAgaWYgKGNhbk1vdmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVOb2RlSW5zaWRlQW5vdGhlcihzb3VyY2VOb2RlLCBkZXN0aW5hdGlvbk5vZGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgUmVwb3J0VHJlZUJhc2VDb21wb25lbnQuX3Nob3dGb3JiaWRkZW5Nb3ZlQWxlcnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9yb290U291cmNlLm5leHQodGhpcy5fcm9vdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNlbGVjdE5vZGVJbk1vdmVEaWFsb2coZXY6IHsgbm9kZTogVHJlZU5vZGVPYmo7IGluZGV4OiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nU2VsZWN0ZWROb2RlID0gZXYubm9kZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbG9hZENoaWxkcmVuKG5vZGU6IFRyZWVOb2RlT2JqKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnbG9hZE5vZGVDaGlsZHJlbicsIG5vZGUpO1xyXG4gICAgfVxyXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgIHByb3RlY3RlZCB1cGRhdGVHcmlkU2V0dGluZygpOiB2b2lkIHt9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zZWxlY3ROb2RlKG5vZGU6IFRyZWVOb2RlT2JqKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNlbE5vZGUgPSBub2RlO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkTm9kZVNvdXJjZS5uZXh0KG5vZGUpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ2NsaWNrJyk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnc2VsZWN0aW9uY2hhbmdlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgIHByb3RlY3RlZCBfZGVzZWxlY3ROb2RlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5zZWxOb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZE5vZGVTb3VyY2UubmV4dChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3JhaXNlUm93Q2xpY2soaW5kZXgsIG1vKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNlbE5vZGUgPSBtbztcclxuICAgICAgICB0aGlzLmNvbnRleHQ/LmZpcmVFdmVudCgnZGJsY2xpY2snLCB0aGlzLmNvbnRleHQsIGluZGV4LCBtbyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVzZXREcm9wQWN0aW9uVG9kbygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRyb3BBY3Rpb25Ub2RvID0geyB0YXJnZXRJZDogbnVsbCwgYWN0aW9uOiBudWxsIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2hhbmdlRHJhZ2dlZEl0ZW1zT3JkZXIoXHJcbiAgICAgICAgZHJhZ2dlZEl0ZW06IFRyZWVOb2RlT2JqLFxyXG4gICAgICAgIHRhcmdldEl0ZW06IFRyZWVOb2RlT2JqLFxyXG4gICAgICAgIG5ld1BhcmVudE5vZGU6IFRyZWVOb2RlT2JqLFxyXG4gICAgICAgIG9sZFBhcmVudE5vZGU6IFRyZWVOb2RlT2JqLFxyXG4gICAgICAgIG9sZFBhcmVudE5vZGVJZFxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlRHJhZ2dlZEl0ZW1Gcm9tTW9EYXRhTGlzdChkcmFnZ2VkSXRlbSk7XHJcbiAgICAgICAgaWYgKG9sZFBhcmVudE5vZGVJZCAhPT0gJyRSb290Jykge1xyXG4gICAgICAgICAgICAvLyBvbGRQYXJlbnROb2RlLmNoaWxkcmVuPy5yZW1vdmUoZHJhZ2dlZEl0ZW0pO1xyXG4gICAgICAgICAgICBvbGRQYXJlbnROb2RlLmNoaWxkcmVuID0gb2xkUGFyZW50Tm9kZS5jaGlsZHJlbi5maWx0ZXIoKGMpID0+IGMuRGF0YS5JZCAhPT0gZHJhZ2dlZEl0ZW0uRGF0YS5JZCk7XHJcblxyXG4gICAgICAgICAgICBvbGRQYXJlbnROb2RlLmxlYWYgPSAhKG9sZFBhcmVudE5vZGUuY2hpbGRyZW4/Lmxlbmd0aCA+IDApO1xyXG4gICAgICAgICAgICBvbGRQYXJlbnROb2RlLkRhdGEuJEhhc0NoaWxkcmVuID0gIW9sZFBhcmVudE5vZGUubGVhZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhZ2dlZEl0ZW0ucGFyZW50Tm9kZSA9IG5ld1BhcmVudE5vZGU7XHJcbiAgICAgICAgdGhpcy5fc2V0TGV2ZWxGb3JEcmFnZ2VkSXRlbXMoZHJhZ2dlZEl0ZW0sIG5ld1BhcmVudE5vZGUubGV2ZWwgfHwgMCk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLmZsYXRNb0RhdGFMaXN0LmluZGV4T2YodGFyZ2V0SXRlbSk7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmRyb3BBY3Rpb25Ub2RvLmFjdGlvbiA9PT0gJ2JlZm9yZScgPyB0YXJnZXRJbmRleCA6IHRoaXMuX25leHRJbmRleEluTW9EYXRhTGlzdCh0YXJnZXRJdGVtKTtcclxuICAgICAgICB0aGlzLl9hZGREcmFnZ2VkSXRlbXNUb01vRGF0YUxpc3QoZHJhZ2dlZEl0ZW0sIGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9hZGREcmFnZ2VkSXRlbXNUb01vRGF0YUxpc3Qobm9kZTogVHJlZU5vZGVPYmosIGkpOiBudW1iZXIge1xyXG4gICAgICAgIHRoaXMuZmxhdE1vRGF0YUxpc3Quc3BsaWNlKGksIDAsIG5vZGUpO1xyXG4gICAgICAgIG5vZGU/LmNoaWxkcmVuPy5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIGkgPSB0aGlzLl9hZGREcmFnZ2VkSXRlbXNUb01vRGF0YUxpc3QoY2hpbGQsIGkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3JlbW92ZURyYWdnZWRJdGVtRnJvbU1vRGF0YUxpc3Qobm9kZTogVHJlZU5vZGVPYmopOiB2b2lkIHtcclxuICAgICAgICBub2RlPy5jaGlsZHJlbj8uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlRHJhZ2dlZEl0ZW1Gcm9tTW9EYXRhTGlzdChjaGlsZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5mbGF0TW9EYXRhTGlzdC5yZW1vdmUobm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbmV4dEluZGV4SW5Nb0RhdGFMaXN0KG5vZGU6IFRyZWVOb2RlT2JqKTogQXJyYXk8TWV0YW9iamVjdERhdGFNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZsYXRNb0RhdGFMaXN0LmluZGV4T2Yobm9kZSkgKyB0aGlzLl9hbGxOZXN0ZWRDaGlsZGVzQ291bnQobm9kZSkgKyAxO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2FsbE5lc3RlZENoaWxkZXNDb3VudChub2RlOiBUcmVlTm9kZU9iaiwgaSA9IDApOiBudW1iZXIge1xyXG4gICAgICAgIG5vZGUuY2hpbGRyZW4/LmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpID0gdGhpcy5fYWxsTmVzdGVkQ2hpbGRlc0NvdW50KGNoaWxkLCBpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2dldE5vZGVCeUlkKGlkOiBhbnkpOiBUcmVlTm9kZU9iaiB7XHJcbiAgICAgICAgbGV0IG5vZGU7XHJcbiAgICAgICAgZm9yIChjb25zdCBtbyBvZiB0aGlzLmZsYXRNb0RhdGFMaXN0KSB7XHJcbiAgICAgICAgICAgIGlmIChtby5EYXRhLklkID09PSBpZCkge1xyXG4gICAgICAgICAgICAgICAgbm9kZSA9IG1vO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NldExldmVsRm9yRHJhZ2dlZEl0ZW1zKG5vZGUsIHBhcmVudExldmVsKTogdm9pZCB7XHJcbiAgICAgICAgcGFyZW50TGV2ZWwrKztcclxuICAgICAgICBub2RlLmxldmVsID0gcGFyZW50TGV2ZWw7XHJcbiAgICAgICAgbm9kZT8uY2hpbGRyZW4/LmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldExldmVsRm9yRHJhZ2dlZEl0ZW1zKGNoaWxkLCBwYXJlbnRMZXZlbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbW92ZU5vZGVJbnNpZGVBbm90aGVyKHNvdXJjZU5vZGUsIGRlc3RpbmF0aW9uTm9kZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG9sZFBhcmVudE5vZGUgPSBzb3VyY2VOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgY29uc3Qgb2xkUGFyZW50Tm9kZUlkID0gb2xkUGFyZW50Tm9kZT8uRGF0YT8uSWQgfHwgJyRSb290JztcclxuICAgICAgICB0aGlzLl9jaGFuZ2VEcmFnZ2VkSXRlbXNPcmRlcihzb3VyY2VOb2RlLCBkZXN0aW5hdGlvbk5vZGUsIGRlc3RpbmF0aW9uTm9kZSwgb2xkUGFyZW50Tm9kZSwgb2xkUGFyZW50Tm9kZUlkKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KCdtb3ZlTm9kZUluc2lkZUFub3RoZXInLCBzb3VyY2VOb2RlLCBkZXN0aW5hdGlvbk5vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NsZWFyRHJhZ0luZm8oZHJvcHBlZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGRyb3BwZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVzZXREcm9wQWN0aW9uVG9kbygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wLWJlZm9yZScpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChlbGVtZW50KSA9PiB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnZHJvcC1iZWZvcmUnKSk7XHJcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJvcC1hZnRlcicpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChlbGVtZW50KSA9PiB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnZHJvcC1hZnRlcicpKTtcclxuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wLWluc2lkZScpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChlbGVtZW50KSA9PiB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnZHJvcC1pbnNpZGUnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc3RvcERyYWdnaW5nKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NsZWFyRHJhZ0luZm8oKTtcclxuICAgICAgICB0aGlzLl9yZXNldERyb3BBY3Rpb25Ub2RvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2hvd0RyYWdJbmZvKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NsZWFyRHJhZ0luZm8oKTtcclxuICAgICAgICBpZiAodGhpcy5kcm9wQWN0aW9uVG9kby50YXJnZXRJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9nZXROb2RlQnlJZCh0aGlzLmRyb3BBY3Rpb25Ub2RvLnRhcmdldElkKTtcclxuICAgICAgICAgICAgY29uc3QgbmV3UGFyZW50SWQgPSBwYXJlbnQ/LnBhcmVudE5vZGU/LkRhdGE/LklkIHx8ICckUm9vdCc7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldE5vZGVFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNub2RlLScgKyB0aGlzLmRyb3BBY3Rpb25Ub2RvLnRhcmdldElkKTtcclxuICAgICAgICAgICAgaWYgKCF0YXJnZXROb2RlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzZXREcm9wQWN0aW9uVG9kbygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1BhcmVudElkID09PSAnJFJvb3QnICYmIHRoaXMuZHJvcEFjdGlvblRvZG8uYWN0aW9uICE9PSAnaW5zaWRlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm9vdENvbnRhaW5lciA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdmZC1sYXlvdXQtcGFuZWwnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKHJvb3RDb250YWluZXIsICdkcm9wLWluc2lkZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKHRhcmdldE5vZGVFbGVtZW50LCAnZHJvcC0nICsgdGhpcy5kcm9wQWN0aW9uVG9kbz8uYWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZG9EcmFnTW92ZShldmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRGcm9tUG9pbnQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGV2ZW50LnBvaW50ZXJQb3NpdGlvbi54LCBldmVudC5wb2ludGVyUG9zaXRpb24ueSk7XHJcblxyXG4gICAgICAgIGlmICghZWxlbWVudEZyb21Qb2ludCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zdG9wRHJhZ2dpbmcoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0YXJnZXROb2RlRWxlbWVudCA9IGVsZW1lbnRGcm9tUG9pbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdub2RlLWl0ZW0nKVxyXG4gICAgICAgICAgICA/IGVsZW1lbnRGcm9tUG9pbnRcclxuICAgICAgICAgICAgOiBlbGVtZW50RnJvbVBvaW50LmNsb3Nlc3QoJy5ub2RlLWl0ZW0nKTtcclxuICAgICAgICBpZiAoIXRhcmdldE5vZGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0b3BEcmFnZ2luZygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZHJvcEFjdGlvblRvZG8gPSB7XHJcbiAgICAgICAgICAgIHRhcmdldElkOiB0YXJnZXROb2RlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0UmVjdCA9IHRhcmdldE5vZGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IG9uZVRoaXJkID0gdGFyZ2V0UmVjdC5oZWlnaHQgLyAzO1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQucG9pbnRlclBvc2l0aW9uLnkgLSB0YXJnZXRSZWN0LnRvcCA8IG9uZVRoaXJkKSB7XHJcbiAgICAgICAgICAgIC8vIGJlZm9yZVxyXG4gICAgICAgICAgICB0aGlzLmRyb3BBY3Rpb25Ub2RvLmFjdGlvbiA9ICdiZWZvcmUnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQucG9pbnRlclBvc2l0aW9uLnkgLSB0YXJnZXRSZWN0LnRvcCA+IDIgKiBvbmVUaGlyZCkge1xyXG4gICAgICAgICAgICAvLyBhZnRlclxyXG4gICAgICAgICAgICB0aGlzLmRyb3BBY3Rpb25Ub2RvLmFjdGlvbiA9ICdhZnRlcic7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gaW5zaWRlXHJcbiAgICAgICAgICAgIHRoaXMuZHJvcEFjdGlvblRvZG8uYWN0aW9uID0gJ2luc2lkZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3NldE5vRHJvcEl0ZW1zKGV2ZW50LnNvdXJjZS5kYXRhKTtcclxuICAgICAgICB0aGlzLl9zZXROb0Ryb3BTdHlsZSgpO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0aGlzLl9nZXROb2RlQnlJZCh0aGlzLmRyb3BBY3Rpb25Ub2RvLnRhcmdldElkKTtcclxuICAgICAgICBpZiAodGFyZ2V0Tm9kZS5ub0Ryb3ApIHtcclxuICAgICAgICAgICAgdGhpcy5fc3RvcERyYWdnaW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcEFjdGlvblRvZG8uYWN0aW9uID0gJ2ZvcmJpZCc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2hvd0RyYWdJbmZvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVtb3ZlTm9Ecm9wcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZsYXRNb0RhdGFMaXN0XHJcbiAgICAgICAgICAgIC5maWx0ZXIoKG5vZGUpID0+IG5vZGUubm9Ecm9wKVxyXG4gICAgICAgICAgICAuZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5ub0Ryb3AgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNub2RlLScgKyBub2RlLkRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsICduby1kcm9wJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NldE5vRHJvcEl0ZW1zKGRyYWdnZWRJdGVtSWQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5fZ2V0Tm9kZUJ5SWQoZHJhZ2dlZEl0ZW1JZCk7XHJcbiAgICAgICAgbm9kZS5ub0Ryb3AgPSB0cnVlO1xyXG4gICAgICAgIG5vZGUuY2hpbGRyZW4/LmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldE5vRHJvcEl0ZW1zKGNoaWxkLkRhdGEuSWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NldE5vRHJvcFN0eWxlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZmxhdE1vRGF0YUxpc3RcclxuICAgICAgICAgICAgLmZpbHRlcigobm9kZSkgPT4gbm9kZS5ub0Ryb3ApXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjbm9kZS0nICsgbm9kZS5EYXRhLklkKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKGVsLCAnbm8tZHJvcCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jYW5Nb3ZlKHNvdXJjZU5vZGUsIGRlc3RpbmF0aW9uTm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjYW5Nb3ZlID0gdHJ1ZTtcclxuICAgICAgICBpZiAoc291cmNlTm9kZS5EYXRhLklkID09PSBkZXN0aW5hdGlvbk5vZGUuRGF0YS5JZCkge1xyXG4gICAgICAgICAgICBjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc291cmNlTm9kZS5jaGlsZHJlbj8uZm9yZWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNhbk1vdmUgPSB0aGlzLl9jYW5Nb3ZlKHNvdXJjZU5vZGUsIGNoaWxkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW5Nb3ZlO1xyXG4gICAgfVxyXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIF9zaG93Rm9yYmlkZGVuTW92ZUFsZXJ0KCk6IHZvaWQge1xyXG4gICAgICAgIEJhcnNhQXBpLkJ3Lk1zZy5FcnJvcign2YbZhduM2KrZiNin2YbbjNivINii24zYqtmFINix2Kcg2KjZhyDYstuM2LHYtNin2K7ZhyDYrtmI2K/YtCDZhdmG2KrZgtmEINqp2YbbjNivLicpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|