barsa-novin-ray-core 2.1.1 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/fesm2022/barsa-novin-ray-core.mjs +254 -135
  2. package/fesm2022/barsa-novin-ray-core.mjs.map +1 -1
  3. package/package.json +3 -5
  4. package/esm2022/barsa-novin-ray-core.mjs +0 -5
  5. package/esm2022/lib/abstract-classes/application-base.mjs +0 -24
  6. package/esm2022/lib/abstract-classes/barsa-api.mjs +0 -43
  7. package/esm2022/lib/abstract-classes/base-column-props.mjs +0 -84
  8. package/esm2022/lib/abstract-classes/base.component.mjs +0 -59
  9. package/esm2022/lib/abstract-classes/field-base.mjs +0 -232
  10. package/esm2022/lib/abstract-classes/files-validation-helper.mjs +0 -75
  11. package/esm2022/lib/abstract-classes/form-base.mjs +0 -163
  12. package/esm2022/lib/abstract-classes/form-field-report-page.component.mjs +0 -54
  13. package/esm2022/lib/abstract-classes/form-page-base.mjs +0 -129
  14. package/esm2022/lib/abstract-classes/form-page.component.mjs +0 -53
  15. package/esm2022/lib/abstract-classes/form-props.base.mjs +0 -97
  16. package/esm2022/lib/abstract-classes/form-toolbar-base.mjs +0 -56
  17. package/esm2022/lib/abstract-classes/index.mjs +0 -25
  18. package/esm2022/lib/abstract-classes/layout-item-base.mjs +0 -48
  19. package/esm2022/lib/abstract-classes/layout-panel-base.mjs +0 -63
  20. package/esm2022/lib/abstract-classes/linear-list-helper.mjs +0 -135
  21. package/esm2022/lib/abstract-classes/models.mjs +0 -184
  22. package/esm2022/lib/abstract-classes/module-with-dynamic-components.mjs +0 -2
  23. package/esm2022/lib/abstract-classes/number-base.mjs +0 -200
  24. package/esm2022/lib/abstract-classes/page-base.mjs +0 -97
  25. package/esm2022/lib/abstract-classes/page-with-form-handler-base.mjs +0 -40
  26. package/esm2022/lib/abstract-classes/report-base.mjs +0 -254
  27. package/esm2022/lib/abstract-classes/report-item-base.mjs +0 -53
  28. package/esm2022/lib/abstract-classes/report-view-base.component.mjs +0 -428
  29. package/esm2022/lib/abstract-classes/system-base.mjs +0 -24
  30. package/esm2022/lib/abstract-classes/tile-props.mjs +0 -46
  31. package/esm2022/lib/auth-guard.mjs +0 -48
  32. package/esm2022/lib/barsa-novin-ray-core-routing.module.mjs +0 -292
  33. package/esm2022/lib/barsa-novin-ray-core.module.mjs +0 -487
  34. package/esm2022/lib/base-ulv-setting.component.mjs +0 -45
  35. package/esm2022/lib/base.module.mjs +0 -28
  36. package/esm2022/lib/button-loading/button-loading.component.mjs +0 -18
  37. package/esm2022/lib/constants.mjs +0 -898
  38. package/esm2022/lib/container.component.mjs +0 -99
  39. package/esm2022/lib/controllers/base-controller.mjs +0 -30
  40. package/esm2022/lib/controllers/index.mjs +0 -5
  41. package/esm2022/lib/controllers/login-controller.mjs +0 -54
  42. package/esm2022/lib/controllers/login-verification-controller.mjs +0 -56
  43. package/esm2022/lib/controllers/models.mjs +0 -2
  44. package/esm2022/lib/custom-route-reuse-strategy.mjs +0 -32
  45. package/esm2022/lib/date-services/date-hijri.service.mjs +0 -146
  46. package/esm2022/lib/date-services/date-info.mjs +0 -2
  47. package/esm2022/lib/date-services/date-miladi.service.mjs +0 -124
  48. package/esm2022/lib/date-services/date-shamsi.service.mjs +0 -148
  49. package/esm2022/lib/date-services/date.service.mjs +0 -149
  50. package/esm2022/lib/date-services/index.mjs +0 -6
  51. package/esm2022/lib/device.mjs +0 -663
  52. package/esm2022/lib/directives/absolute-div-body.directive.mjs +0 -45
  53. package/esm2022/lib/directives/anchor-scroll.directive.mjs +0 -24
  54. package/esm2022/lib/directives/attr-rtl.directive.mjs +0 -35
  55. package/esm2022/lib/directives/base.directive.mjs +0 -55
  56. package/esm2022/lib/directives/body-click.directive.mjs +0 -35
  57. package/esm2022/lib/directives/column-resizer.directive.mjs +0 -39
  58. package/esm2022/lib/directives/copy.directive.mjs +0 -59
  59. package/esm2022/lib/directives/count-down.directive.mjs +0 -108
  60. package/esm2022/lib/directives/dynamic-command.directive.mjs +0 -42
  61. package/esm2022/lib/directives/dynamic-style.directive.mjs +0 -57
  62. package/esm2022/lib/directives/ellapsis-text.directive.mjs +0 -69
  63. package/esm2022/lib/directives/ellipsify.directive.mjs +0 -72
  64. package/esm2022/lib/directives/field-binding.directive.mjs +0 -17
  65. package/esm2022/lib/directives/fill-empty-space.mjs +0 -83
  66. package/esm2022/lib/directives/form-close.directive.mjs +0 -32
  67. package/esm2022/lib/directives/img-lazy.directive.mjs +0 -81
  68. package/esm2022/lib/directives/index.mjs +0 -35
  69. package/esm2022/lib/directives/intersection-observer.directive.mjs +0 -51
  70. package/esm2022/lib/directives/items-renderer.directive.mjs +0 -59
  71. package/esm2022/lib/directives/label-mandatory.directive.mjs +0 -48
  72. package/esm2022/lib/directives/load-external-files.directive.mjs +0 -37
  73. package/esm2022/lib/directives/mobile.directive.mjs +0 -29
  74. package/esm2022/lib/directives/nowraptext.directive.mjs +0 -26
  75. package/esm2022/lib/directives/numbers-only-input.directive.mjs +0 -26
  76. package/esm2022/lib/directives/placeHolder.directive.mjs +0 -15
  77. package/esm2022/lib/directives/prevent-default.directive.mjs +0 -20
  78. package/esm2022/lib/directives/render-ulv-paging.directive.mjs +0 -80
  79. package/esm2022/lib/directives/render-ulv-viewer.directive.mjs +0 -75
  80. package/esm2022/lib/directives/route-form-change.directive.mjs +0 -37
  81. package/esm2022/lib/directives/stop-propagation.directive.mjs +0 -20
  82. package/esm2022/lib/directives/table-resizer.directive.mjs +0 -235
  83. package/esm2022/lib/directives/ulv-command.directive.mjs +0 -42
  84. package/esm2022/lib/directives/until-inview.directive.mjs +0 -52
  85. package/esm2022/lib/directives/workflow-choice-command.directive.mjs +0 -60
  86. package/esm2022/lib/dynamic-component/base-dynamic.component.mjs +0 -96
  87. package/esm2022/lib/dynamic-component/base-form-toolbaritem-props.mjs +0 -52
  88. package/esm2022/lib/dynamic-component/base-item-content-props.mjs +0 -80
  89. package/esm2022/lib/dynamic-component/base-view-content-props.mjs +0 -20
  90. package/esm2022/lib/dynamic-component/base-view-item-props.mjs +0 -525
  91. package/esm2022/lib/dynamic-component/base-view-props.mjs +0 -162
  92. package/esm2022/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +0 -38
  93. package/esm2022/lib/dynamic-component/dynamic-form.component.mjs +0 -66
  94. package/esm2022/lib/dynamic-component/dynamic-item.component.mjs +0 -76
  95. package/esm2022/lib/dynamic-component/dynamic-layout.component.mjs +0 -63
  96. package/esm2022/lib/dynamic-component/index.mjs +0 -11
  97. package/esm2022/lib/empty-page/empty-page.component.mjs +0 -44
  98. package/esm2022/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +0 -16
  99. package/esm2022/lib/field-ui/field-ui.component.mjs +0 -146
  100. package/esm2022/lib/form/form.component.mjs +0 -211
  101. package/esm2022/lib/form-new/form-new.component.mjs +0 -30
  102. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page-routing.module.mjs +0 -54
  103. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page.module.mjs +0 -29
  104. package/esm2022/lib/form-page-routing/constants.mjs +0 -9
  105. package/esm2022/lib/form-page-routing/index.mjs +0 -3
  106. package/esm2022/lib/from-intersection-observer.mjs +0 -53
  107. package/esm2022/lib/global-error-handler.mjs +0 -26
  108. package/esm2022/lib/injdection-tokens.mjs +0 -8
  109. package/esm2022/lib/login-enter-mobile/login-enter-mobile.component.mjs +0 -64
  110. package/esm2022/lib/login-verification/login-verification.component.mjs +0 -79
  111. package/esm2022/lib/login2/login2.component.mjs +0 -60
  112. package/esm2022/lib/modal-root.component.mjs +0 -33
  113. package/esm2022/lib/not-found/not-found.component.mjs +0 -16
  114. package/esm2022/lib/not-internet/not-internet.component.mjs +0 -21
  115. package/esm2022/lib/pipes/barsa-icon-dict.pipe.mjs +0 -19
  116. package/esm2022/lib/pipes/bbb-translate.pipe.mjs +0 -35
  117. package/esm2022/lib/pipes/can-upload.pipe.mjs +0 -30
  118. package/esm2022/lib/pipes/column-custom-component.pipe.mjs +0 -40
  119. package/esm2022/lib/pipes/column-customui.pipe.mjs +0 -32
  120. package/esm2022/lib/pipes/column-icon.pipe.mjs +0 -22
  121. package/esm2022/lib/pipes/column-value.pipe.mjs +0 -34
  122. package/esm2022/lib/pipes/combo-row-img.pipe.mjs +0 -16
  123. package/esm2022/lib/pipes/context-menu.pipe.mjs +0 -40
  124. package/esm2022/lib/pipes/control-ui.pipe.mjs +0 -31
  125. package/esm2022/lib/pipes/convert-to-style.pipe.mjs +0 -32
  126. package/esm2022/lib/pipes/date-time-to-caption.pipe.mjs +0 -34
  127. package/esm2022/lib/pipes/fileinfo-count.pipe.mjs +0 -20
  128. package/esm2022/lib/pipes/filter-columns-by-details.pipe.mjs +0 -22
  129. package/esm2022/lib/pipes/filter-string.pipe.mjs +0 -44
  130. package/esm2022/lib/pipes/filter-tab.pipe.mjs +0 -19
  131. package/esm2022/lib/pipes/filter-toolbar-control.pipe.mjs +0 -16
  132. package/esm2022/lib/pipes/filter-workflow-mobile.pipe.mjs +0 -24
  133. package/esm2022/lib/pipes/filter.pipe.mjs +0 -33
  134. package/esm2022/lib/pipes/find-column-by-db-name.pipe.mjs +0 -27
  135. package/esm2022/lib/pipes/find-preview-column.pipe.mjs +0 -19
  136. package/esm2022/lib/pipes/fiori-icon.pipe.mjs +0 -42
  137. package/esm2022/lib/pipes/groupby.pipe.mjs +0 -63
  138. package/esm2022/lib/pipes/header-facet-value.pipe.mjs +0 -22
  139. package/esm2022/lib/pipes/hide-columns-inmobile.pipe.mjs +0 -22
  140. package/esm2022/lib/pipes/index.mjs +0 -48
  141. package/esm2022/lib/pipes/list-count.pipe.mjs +0 -17
  142. package/esm2022/lib/pipes/merge-fields-to-columns.pipe.mjs +0 -42
  143. package/esm2022/lib/pipes/mo-info-ulv-data.pipe.mjs +0 -58
  144. package/esm2022/lib/pipes/mo-info-ulv-paging.pipe.mjs +0 -16
  145. package/esm2022/lib/pipes/mo-report-value-concat.pipe.mjs +0 -35
  146. package/esm2022/lib/pipes/mo-report-value.pipe.mjs +0 -17
  147. package/esm2022/lib/pipes/mo-value.pipe.mjs +0 -18
  148. package/esm2022/lib/pipes/multiple-groupby.pipe.mjs +0 -90
  149. package/esm2022/lib/pipes/numeral.pipe.mjs +0 -43
  150. package/esm2022/lib/pipes/picture-field-source.pipe.mjs +0 -22
  151. package/esm2022/lib/pipes/remove-newline.pipe.mjs +0 -20
  152. package/esm2022/lib/pipes/replace.pipe.mjs +0 -17
  153. package/esm2022/lib/pipes/reverse.pipe.mjs +0 -22
  154. package/esm2022/lib/pipes/rownumber.pipe.mjs +0 -25
  155. package/esm2022/lib/pipes/sanitize-text.pipe.mjs +0 -20
  156. package/esm2022/lib/pipes/seperator-fix.pipe.mjs +0 -23
  157. package/esm2022/lib/pipes/sort.pipe.mjs +0 -48
  158. package/esm2022/lib/pipes/th-image-icon.pipe.mjs +0 -22
  159. package/esm2022/lib/pipes/tlbButtons.pipe.mjs +0 -59
  160. package/esm2022/lib/pipes/total-summary.pipe.mjs +0 -16
  161. package/esm2022/lib/pipes/tree-item-isexpanded.pipe.mjs +0 -25
  162. package/esm2022/lib/pipes/visible-value.pipe.mjs +0 -18
  163. package/esm2022/lib/portal-page/portal-page.component.mjs +0 -23
  164. package/esm2022/lib/portal-page/portal-sidebar.component.mjs +0 -36
  165. package/esm2022/lib/redirect-home-guard.mjs +0 -51
  166. package/esm2022/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +0 -12
  167. package/esm2022/lib/report-container/report-container.component.mjs +0 -63
  168. package/esm2022/lib/resizable-module/resizable.component.mjs +0 -31
  169. package/esm2022/lib/resizable-module/resizable.directive.mjs +0 -41
  170. package/esm2022/lib/resizable-module/resizable.module.mjs +0 -17
  171. package/esm2022/lib/resolvers/index.mjs +0 -6
  172. package/esm2022/lib/resolvers/portal-dynamic-page.resolver.mjs +0 -49
  173. package/esm2022/lib/resolvers/portal-form-page.resolver.mjs +0 -18
  174. package/esm2022/lib/resolvers/portal-page.resolver.mjs +0 -30
  175. package/esm2022/lib/resolvers/portal-report-page.resolver.mjs +0 -37
  176. package/esm2022/lib/resolvers/tile-group-breadcrumb.resolver.mjs +0 -30
  177. package/esm2022/lib/root-page/root-page.component.mjs +0 -21
  178. package/esm2022/lib/root-portal/root-portal.component.mjs +0 -164
  179. package/esm2022/lib/server-connection-error/server-connection-error.component.mjs +0 -19
  180. package/esm2022/lib/services/api.service.mjs +0 -63
  181. package/esm2022/lib/services/audio-recording.service.mjs +0 -95
  182. package/esm2022/lib/services/barsa-dialog.service.mjs +0 -80
  183. package/esm2022/lib/services/barsa-storage.service.mjs +0 -78
  184. package/esm2022/lib/services/breadcrumb.service.mjs +0 -64
  185. package/esm2022/lib/services/column.service.mjs +0 -20
  186. package/esm2022/lib/services/container.service.mjs +0 -69
  187. package/esm2022/lib/services/dynamic-component.service.mjs +0 -55
  188. package/esm2022/lib/services/form-panel.service.mjs +0 -380
  189. package/esm2022/lib/services/form.service.mjs +0 -14
  190. package/esm2022/lib/services/horizontal-layout.service.mjs +0 -16
  191. package/esm2022/lib/services/index.mjs +0 -29
  192. package/esm2022/lib/services/indexeddb.service.mjs +0 -34
  193. package/esm2022/lib/services/layout.service.mjs +0 -42
  194. package/esm2022/lib/services/local-storage.service.mjs +0 -32
  195. package/esm2022/lib/services/log.service.mjs +0 -50
  196. package/esm2022/lib/services/network-status.service.mjs +0 -15
  197. package/esm2022/lib/services/notification-popup.service.mjs +0 -2
  198. package/esm2022/lib/services/notification-sw.service.mjs +0 -180
  199. package/esm2022/lib/services/notification.service.mjs +0 -308
  200. package/esm2022/lib/services/portal.service.mjs +0 -929
  201. package/esm2022/lib/services/prompt-update.service.mjs +0 -56
  202. package/esm2022/lib/services/routing.service.mjs +0 -60
  203. package/esm2022/lib/services/save-scoll-position.service.mjs +0 -29
  204. package/esm2022/lib/services/service-worker-communication.service.mjs +0 -120
  205. package/esm2022/lib/services/toast.service.mjs +0 -2
  206. package/esm2022/lib/services/ui.service.mjs +0 -23
  207. package/esm2022/lib/services/ulvmain.service.mjs +0 -810
  208. package/esm2022/lib/services/upload.service.mjs +0 -161
  209. package/esm2022/lib/services/video-recording.service.mjs +0 -115
  210. package/esm2022/public-api.mjs +0 -44
@@ -1,525 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output, Self, SkipSelf, ViewChild } from '@angular/core';
2
- import { catchError, from, tap, Subject, switchMap, takeUntil, throwError, debounceTime } from 'rxjs';
3
- import { BarsaApi } from '../abstract-classes';
4
- import { PreventDefaulEvent, createGridEditorFormPanel } from '../constants';
5
- import { BaseViewPropsComponent } from './base-view-props';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/platform-browser";
8
- import * as i2 from "../pipes";
9
- import * as i3 from "../services";
10
- export class BaseViewItemPropsComponent extends BaseViewPropsComponent {
11
- set serializedRelatedMo(val) {
12
- this._serializedRelatedMo = val;
13
- this._updateCartableMo(val);
14
- this._createCartableParams();
15
- }
16
- set cartableTemplate(val) {
17
- this._cartableTemplate = val;
18
- this._createCartableParams();
19
- }
20
- set cartableMo(val) {
21
- this._cartableMo = val;
22
- this._updateCartableMo(this._serializedRelatedMo);
23
- this._createCartableParams();
24
- }
25
- set cartableWorkflowData(val) {
26
- this._cartableWorkflowData = val;
27
- this._createCartableParams();
28
- }
29
- constructor(_el, _domSanitizer, _cdr, _reportValuePipe, _parentFormPanelService, _formPanelService, _ulvMainService) {
30
- super();
31
- this._el = _el;
32
- this._domSanitizer = _domSanitizer;
33
- this._cdr = _cdr;
34
- this._reportValuePipe = _reportValuePipe;
35
- this._parentFormPanelService = _parentFormPanelService;
36
- this._formPanelService = _formPanelService;
37
- this._ulvMainService = _ulvMainService;
38
- this.actionListClick = new EventEmitter();
39
- this.events = new EventEmitter();
40
- // @HostListener('document:mousedown', ['$event'])
41
- // onMouseDown(e): void {
42
- // // we make sure only draggables on the document elements are selected
43
- // if (
44
- // !this._el.nativeElement.contains(e.target) &&
45
- // this.inlineEditMode &&
46
- // this.allowInlineEdit &&
47
- // this.isChecked &&
48
- // e.target.tagName.toLowerCase() === 'button'
49
- // ) {
50
- // this.deselectAll.emit();
51
- // // this._saveEditedMo$.next('MOUSEDOWN_OUTSIDE');
52
- // }
53
- // }
54
- this.hasError = false;
55
- this._focusToFirstEidtableColumn = false;
56
- this.inlineEditInReport = true;
57
- this.inRow = true;
58
- this.hasCartableTemplate = false;
59
- this.bruleActionMessage = null;
60
- this._saveEditedMo$ = new Subject();
61
- this._formpanelValueChanged$ = new Subject();
62
- this._saveEditedMo$
63
- .asObservable()
64
- .pipe(takeUntil(this._onDestroy$), debounceTime(500), switchMap((reason) => this._inlineEditSaveFormPanel(reason)), catchError((err) => throwError(() => err)))
65
- .subscribe((res) => {
66
- if (res.saved) {
67
- this.mo.$IsChecked = false;
68
- this._formpanelValueChanged$.next('');
69
- this._cdr.markForCheck();
70
- }
71
- if (res.reason === 'TAB' || res.reason === 'CTRL+ENTER') {
72
- this.selectNextInlineRecord.emit(this.mo);
73
- }
74
- else if (res.reason === 'ESC') {
75
- this.editFormPanelCancel.emit(this.mo);
76
- }
77
- });
78
- this._formpanelValueChanged$
79
- .asObservable()
80
- .pipe(takeUntil(this._onDestroy$),
81
- // switchMap(() => this._syncMo()),
82
- tap((c) => this._syncMo()), tap((c) => {
83
- if (typeof this.mo.$InlineMoChanged === 'undefined') {
84
- this.mo.$InlineMoChanged = true;
85
- }
86
- }))
87
- .subscribe((c) => {
88
- this.editFormPanelValueChange.emit({ mo: this.mo, fieldDbName: c });
89
- });
90
- }
91
- get _hasFormPanelService() {
92
- return this._formPanelService !== null && this.formSetting;
93
- }
94
- ngOnInit() {
95
- super.ngOnInit();
96
- if (this._hasFormPanelService) {
97
- this._formPanelService.context$.pipe(takeUntil(this._onDestroy$)).subscribe();
98
- this._formPanelService.view$.pipe(takeUntil(this._onDestroy$)).subscribe();
99
- this.layout$ = this._formPanelService.layout$;
100
- }
101
- }
102
- ngOnChanges(changes) {
103
- super.ngOnChanges(changes);
104
- const { isChecked, inlineEditMode } = changes;
105
- let needToLoadForm = false;
106
- if (this.inlineEditMode) {
107
- if (isChecked) {
108
- if (!isChecked.currentValue && isChecked.previousValue) {
109
- if (this._needToSave()) {
110
- this._saveEditedMo$.next('CHECK_CHANGED');
111
- }
112
- }
113
- else if (isChecked.currentValue) {
114
- needToLoadForm = true;
115
- }
116
- }
117
- }
118
- if (isChecked && !isChecked.firstChange) {
119
- this._raiseWorkflowShareButtons(isChecked.currentValue);
120
- }
121
- if (inlineEditMode?.currentValue && !inlineEditMode?.previousValue && this.isChecked) {
122
- needToLoadForm = true;
123
- }
124
- else if (!inlineEditMode?.currentValue && inlineEditMode?.previousValue && this.isChecked) {
125
- this._saveEditedMo$.next('ESC');
126
- }
127
- if (needToLoadForm) {
128
- this._loadAndCreateFormPanelCtrlr();
129
- }
130
- if (changes.mo && !changes.mo.firstChange && this.inlineEditMode) {
131
- if (this._formPanelLoaded) {
132
- this.formPanelCtrlr.SetValue(changes.mo.currentValue);
133
- }
134
- }
135
- // if (mo && !mo.firstChange && this._hasFormPanelService && this.isChecked && this.inlineEditMode) {
136
- // //this.formPanelCtrlr.SetValue(changes.mo.currentValue);
137
- // }
138
- }
139
- ngOnDestroy() {
140
- super.ngOnDestroy();
141
- if (this.formPanelCtrlr) {
142
- this.formPanelCtrlr.un('bruleShowMessageAction', this._handleBruleShowMessageAction);
143
- }
144
- }
145
- OnCartableFormClick(e) {
146
- if (this.isChecked) {
147
- e.preventDefault();
148
- e.stopPropagation();
149
- }
150
- }
151
- onRowCheck(onlyCheck) {
152
- this._rowCheck(onlyCheck);
153
- }
154
- onRowClick() {
155
- this.rowClick.emit({ mo: this.mo, index: this.index });
156
- }
157
- onColumnChangeToEditMode(elDom, index) {
158
- const focusables = elDom.querySelectorAll(`button,button:not([disabled]),[href],input:not([disabled]),input,
159
- select,select:not([disabled]),textarea,textarea:not([disabled]),[tabindex]:not([tabindex="-1"])`);
160
- this._lastEditableColumnIndex = index;
161
- if (!focusables.length || this._focusToFirstEidtableColumn) {
162
- return;
163
- }
164
- this._focusToFirstEidtableColumn = true;
165
- const lastFocusable = focusables[0];
166
- setTimeout(() => {
167
- lastFocusable?.focus();
168
- }, 0);
169
- }
170
- onTabKeyDown(e, index) {
171
- if (index === this._lastEditableColumnIndex) {
172
- PreventDefaulEvent(e);
173
- this._saveEditedMo$.next('TAB');
174
- }
175
- }
176
- onEditFormPanelSave(e) {
177
- this._saveEditedMo$.next('CTRL+ENTER');
178
- }
179
- onEditFormPanelCancel(e) {
180
- this.escapeKey.emit(this.mo);
181
- }
182
- onUlvCommand() {
183
- this.ulvCommand.emit({ mo: this.mo, index: this.index });
184
- }
185
- onAction(commandBody) {
186
- this.action.emit(commandBody);
187
- }
188
- onExpandClick() {
189
- this.expandClick.emit(this.mo);
190
- }
191
- onDynamicComponentEvents(e) {
192
- switch (e.title) {
193
- case 'rowCheck':
194
- this.onRowCheck();
195
- break;
196
- case 'rowClick':
197
- this.onRowClick();
198
- break;
199
- case 'ulvCommand':
200
- this.onUlvCommand();
201
- break;
202
- }
203
- }
204
- onCartableFormClosed() {
205
- this.cartableFormClosed.emit({ mo: this.mo, index: this.index });
206
- }
207
- onCartableBruleAction(bruleAction) {
208
- this._handleBruleShowMessageAction(bruleAction);
209
- }
210
- onCartableAfterTansition(e) {
211
- this.workflowState = {
212
- error: this.bruleActionMessage ? this.bruleActionMessage : e.error,
213
- state: 'Finish'
214
- };
215
- }
216
- onCartableBeforeTansition() {
217
- this.workflowState = { state: 'Pending', error: null };
218
- // this.workflowStateChanged.emit(this.workflowState);
219
- }
220
- onResetWorkflowState() {
221
- this._handleResetWorkflowState();
222
- }
223
- _trackByColumn(index, column) {
224
- return `${column.Name}${index}`;
225
- }
226
- _handleResetWorkflowState() {
227
- this.bruleActionMessage = null;
228
- this.workflowState = { state: '', error: null };
229
- }
230
- _updateCartableMo(serializeMo) {
231
- if (serializeMo && this._cartableMo) {
232
- serializeMo = `${serializeMo}`;
233
- const mo = BarsaApi.Ext.decode(serializeMo);
234
- this._cartableMo = { ...this._cartableMo, ...mo };
235
- }
236
- }
237
- _createCartableParams() {
238
- let cartableTemplate = this._cartableTemplate;
239
- const cartableMo = this._cartableMo;
240
- const cartableWorkflowData = this._cartableWorkflowData;
241
- if (this.hasCartableTemplate) {
242
- // TODO update cartable mo;
243
- return;
244
- }
245
- if (cartableTemplate &&
246
- cartableMo &&
247
- typeof cartableWorkflowData !== 'undefined' &&
248
- this._serializedRelatedMo) {
249
- cartableTemplate = JSON.parse(JSON.stringify(cartableTemplate));
250
- const view = cartableTemplate.View;
251
- cartableTemplate.Data = { Mo: { ...cartableMo } };
252
- cartableTemplate.Workflow = cartableWorkflowData === '' ? null : JSON.parse(cartableWorkflowData);
253
- if (!view.ExtraJsonProp) {
254
- view.ExtraJsonProp = {};
255
- }
256
- view.ExtraJsonProp.IsSimple = true;
257
- this.cartableParams = {
258
- formSetting: cartableTemplate,
259
- moId: cartableMo.Id,
260
- typeDefId: cartableMo.$TypeDefId,
261
- viewId: view.TypeViewId,
262
- inDialog: false,
263
- loadActivityView: true
264
- };
265
- this.hasCartableTemplate = true;
266
- this._cdr.markForCheck();
267
- }
268
- }
269
- _needToSave() {
270
- // if (!this.isChecked) {
271
- // return false;
272
- // }
273
- // const isChildNode = (this._el.nativeElement as HTMLElement).contains(e.target);
274
- // if (isChildNode) {
275
- // return false;
276
- // }
277
- const t = this.inlineEditMode && this._hasFormPanelService;
278
- if (!t) {
279
- return false;
280
- }
281
- return this.formPanelCtrlr && this.formPanelCtrlr.IsMoChanged();
282
- }
283
- _checkfocusOutFromRow(target) {
284
- // const focusable: NodeList = this._focusableControls;
285
- // let foundInFocusable = false;
286
- // focusable.forEach((c) => {
287
- // if (c === target) {
288
- // foundInFocusable = true;
289
- // }
290
- // });
291
- // if (!foundInFocusable) {
292
- // this._saveEditedMo$.next('TAB');
293
- // }
294
- }
295
- _rowCheck(onlyCheck) {
296
- this.rowCheck.emit({ mo: this.mo, index: this.index, onlyCheck });
297
- }
298
- _raiseWorkflowShareButtons(isChecked) {
299
- if (this.cartableParams) {
300
- const choiceList = this.cartableParams.formSetting?.Workflow?.ChoiceList;
301
- if (choiceList?.length) {
302
- setTimeout(() => {
303
- this.workflowShareButtons.emit({
304
- formPanelCtrlr: this._cartableFormRef.formPanelCtrl,
305
- mo: this.mo,
306
- choiceList,
307
- add: isChecked
308
- });
309
- });
310
- }
311
- }
312
- }
313
- _handleValueChange(formPanelCtrl, fieldCtrlr) {
314
- if (!this.isChecked) {
315
- this.onRowCheck();
316
- }
317
- this._formpanelValueChanged$.next(fieldCtrlr?.Setting?.ControlName);
318
- }
319
- _syncMo() {
320
- const syncWithFormpanelMo = this.mo;
321
- const _isChecked = this.mo.$IsChecked;
322
- const formPanelCtrlrMo = this.formPanelCtrlr.Mo;
323
- this._updateWithOriginalValues(formPanelCtrlrMo, syncWithFormpanelMo);
324
- syncWithFormpanelMo['$OriginalValues'] = formPanelCtrlrMo['$OriginalValues'];
325
- syncWithFormpanelMo['$FieldDict'] = formPanelCtrlrMo['$FieldDict'];
326
- syncWithFormpanelMo['$State'] = formPanelCtrlrMo['$State']; // this add because if we edit unchanged mo it does not reflect to mo of ulv.
327
- this.mo = { ...syncWithFormpanelMo };
328
- this.mo.$IsChecked = _isChecked;
329
- return from(Promise.resolve());
330
- }
331
- _updateWithOriginalValues(source, dest) {
332
- Object.keys(source.$OriginalValues).forEach((c) => {
333
- dest[c] = source[c];
334
- if (source[c + '$Caption']) {
335
- dest[c + '$Caption'] = source[c + '$Caption'];
336
- }
337
- if (source[c + '$Icon']) {
338
- dest[c + '$Icon'] = source[c + '$Icon'];
339
- }
340
- });
341
- }
342
- _raiseFormPanelValueChanged() {
343
- this.editFormPanelValueChange.emit({ mo: this.mo });
344
- }
345
- _handleBruleShowMessageAction(action) {
346
- action.MessageExpressionHtml = this._domSanitizer.bypassSecurityTrustHtml(action.MessageExpression);
347
- this.bruleActionMessage = action;
348
- }
349
- _createFormPanelCtrlr(mo, typeDefId) {
350
- if (!this.formPanelCtrlr) {
351
- this.formPanelCtrlr = createGridEditorFormPanel(this.formSetting, { ...mo }, typeDefId, this.extraRelation, this.inRow, this.UlvMainCtrlr
352
- // BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.Relation')
353
- );
354
- }
355
- this.formPanelCtrlr.InlineEditInReport = true;
356
- this.formPanelCtrlr.on({
357
- bruleShowMessageAction: this._handleBruleShowMessageAction.bind(this),
358
- valueChange: this._handleValueChange.bind(this)
359
- });
360
- return this.formPanelCtrlr;
361
- }
362
- _loadAndCreateFormPanelCtrlr() {
363
- const formSettingData = this.formSetting.Data;
364
- const formMo = {
365
- ...this.mo,
366
- $FieldDict: formSettingData.Mo.$FieldDict,
367
- $TypeDefId: formSettingData.Mo.$TypeDefId,
368
- $OriginalValues: {}
369
- };
370
- if (this._formPanelLoaded) {
371
- this.formPanelCtrlr.SetValue(formMo);
372
- return;
373
- }
374
- this._createFormPanelCtrlr(formMo, this.typeDefId);
375
- this._formPanelLoaded = true;
376
- const formPanelCtrlr = this.formPanelCtrlr;
377
- this.formPanelCtrlr.UlvMoDataListCount = this.moDataListCount - 1;
378
- formPanelCtrlr.LoadAndCreate(null, false, false, () => {
379
- const customFormPanelUi = formPanelCtrlr.Adapter.Control;
380
- const parentMo = this._parentFormPanelService ? this._parentFormPanelService.mo : null;
381
- if (this.extraRelation && parentMo && this.extraRelation.RelationType === 'Composition') {
382
- formPanelCtrlr.Mo.SetFValue(this.extraRelation.ParentFdName, parentMo);
383
- // newFormSettings.Data.Mo[relation.ParentFdName] = parentMo.GetChangedObject();
384
- // newFormSettings.Data.Mo[relation.ParentFdName].$State = parentMo.$State;
385
- }
386
- customFormPanelUi.Refresh = () => { };
387
- this._formPanelService.context = formPanelCtrlr.Adapter.Control;
388
- });
389
- }
390
- _resetSavingStates() {
391
- this.hasError = false;
392
- this.bruleActionMessage = null;
393
- this.saved = false;
394
- this._cdr.markForCheck();
395
- }
396
- _setSavingState(err) {
397
- if (err) {
398
- this.hasError = true;
399
- return;
400
- }
401
- this.hasError = false;
402
- this.saved = true;
403
- }
404
- _inlineEditSaveFormPanel(reason) {
405
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
406
- return new Promise((resolve, _) => {
407
- if (!this.formPanelCtrlr.IsMoChanged()) {
408
- // if state of mo is new or modidfied then it needs to update
409
- resolve({ reason, succeed: true, saved: false });
410
- }
411
- const formPanelCtrlrMo = this.formPanelCtrlr.Mo;
412
- delete formPanelCtrlrMo.json;
413
- // this.saving = true;
414
- this.mo.$InlineMoChanged = false;
415
- this.editFormPanelSave.emit(this.mo);
416
- this.bruleActionMessage = null;
417
- if (this.noSaveInlineEditInServer) {
418
- resolve({ reason, succeed: true, saved: true });
419
- return;
420
- }
421
- this.formPanelCtrlr.Save(false, (err) => {
422
- // this.saving = false;
423
- this.formPanelCtrlr.SetIsChanged(false);
424
- this._setSavingState(err);
425
- resolve({ reason, succeed: true, saved: true });
426
- });
427
- });
428
- }
429
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseViewItemPropsComponent, deps: [{ token: i0.ElementRef }, { token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: i2.MoReportValuePipe }, { token: i3.FormPanelService, optional: true, skipSelf: true }, { token: i3.FormPanelService, optional: true, self: true }, { token: i3.UlvMainService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
430
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BaseViewItemPropsComponent, selector: "bnrc-base-view-item-props", inputs: { checkboxComponent: "checkboxComponent", disableEllapsis: "disableEllapsis", detailsComponent: "detailsComponent", detailsColumns: "detailsColumns", detailsText: "detailsText", mo: "mo", moDataListCount: "moDataListCount", index: "index", last: "last", isdirty: "isdirty", isChecked: "isChecked", hideDetailsText: "hideDetailsText", showViewButton: "showViewButton", isNewInlineMo: "isNewInlineMo", extraRelation: "extraRelation", hideOpenIcon: "hideOpenIcon", inDialog: "inDialog", isMobile: "isMobile", isMultiSelect: "isMultiSelect", rowIndicator: "rowIndicator", groupSummary: "groupSummary", isLastChildGroup: "isLastChildGroup", showRowNumber: "showRowNumber", rowNumber: "rowNumber", coloringRow: "coloringRow", noSaveInlineEditInServer: "noSaveInlineEditInServer", rowIndicatorColor: "rowIndicatorColor", UlvMainCtrlr: "UlvMainCtrlr", fieldDict: "fieldDict", actionList: "actionList", serializedRelatedMo: "serializedRelatedMo", cartableTemplate: "cartableTemplate", cartableMo: "cartableMo", cartableWorkflowData: "cartableWorkflowData" }, outputs: { actionListClick: "actionListClick", events: "events" }, viewQueries: [{ propertyName: "_cartableFormRef", first: true, predicate: ["cartableFormRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
431
- }
432
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseViewItemPropsComponent, decorators: [{
433
- type: Component,
434
- args: [{
435
- selector: 'bnrc-base-view-item-props',
436
- template: ``,
437
- changeDetection: ChangeDetectionStrategy.OnPush
438
- }]
439
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: i2.MoReportValuePipe }, { type: i3.FormPanelService, decorators: [{
440
- type: Optional
441
- }, {
442
- type: SkipSelf
443
- }] }, { type: i3.FormPanelService, decorators: [{
444
- type: Optional
445
- }, {
446
- type: Self
447
- }] }, { type: i3.UlvMainService, decorators: [{
448
- type: Optional
449
- }] }], propDecorators: { actionListClick: [{
450
- type: Output
451
- }], events: [{
452
- type: Output
453
- }], _cartableFormRef: [{
454
- type: ViewChild,
455
- args: ['cartableFormRef', { static: false }]
456
- }], checkboxComponent: [{
457
- type: Input
458
- }], disableEllapsis: [{
459
- type: Input
460
- }], detailsComponent: [{
461
- type: Input
462
- }], detailsColumns: [{
463
- type: Input
464
- }], detailsText: [{
465
- type: Input
466
- }], mo: [{
467
- type: Input
468
- }], moDataListCount: [{
469
- type: Input
470
- }], index: [{
471
- type: Input
472
- }], last: [{
473
- type: Input
474
- }], isdirty: [{
475
- type: Input
476
- }], isChecked: [{
477
- type: Input
478
- }], hideDetailsText: [{
479
- type: Input
480
- }], showViewButton: [{
481
- type: Input
482
- }], isNewInlineMo: [{
483
- type: Input
484
- }], extraRelation: [{
485
- type: Input
486
- }], hideOpenIcon: [{
487
- type: Input
488
- }], inDialog: [{
489
- type: Input
490
- }], isMobile: [{
491
- type: Input
492
- }], isMultiSelect: [{
493
- type: Input
494
- }], rowIndicator: [{
495
- type: Input
496
- }], groupSummary: [{
497
- type: Input
498
- }], isLastChildGroup: [{
499
- type: Input
500
- }], showRowNumber: [{
501
- type: Input
502
- }], rowNumber: [{
503
- type: Input
504
- }], coloringRow: [{
505
- type: Input
506
- }], noSaveInlineEditInServer: [{
507
- type: Input
508
- }], rowIndicatorColor: [{
509
- type: Input
510
- }], UlvMainCtrlr: [{
511
- type: Input
512
- }], fieldDict: [{
513
- type: Input
514
- }], actionList: [{
515
- type: Input
516
- }], serializedRelatedMo: [{
517
- type: Input
518
- }], cartableTemplate: [{
519
- type: Input
520
- }], cartableMo: [{
521
- type: Input
522
- }], cartableWorkflowData: [{
523
- type: Input
524
- }] } });
525
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS12aWV3LWl0ZW0tcHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1ub3Zpbi1yYXktY29yZS9zcmMvbGliL2R5bmFtaWMtY29tcG9uZW50L2Jhc2Utdmlldy1pdGVtLXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBRUosUUFBUSxFQUNSLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQWMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsSCxPQUFPLEVBSUgsUUFBUSxFQUtYLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7OztBQVMzRCxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsc0JBQXNCO0lBb0NsRSxJQUFhLG1CQUFtQixDQUFDLEdBQVc7UUFDeEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztRQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUNELElBQWEsZ0JBQWdCLENBQUMsR0FBZ0I7UUFDMUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztRQUM3QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBYSxVQUFVLENBQUMsR0FBd0I7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QkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVPLG1CQUFtQjtzQkFBL0IsS0FBSztnQkFLTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBSU8sVUFBVTtzQkFBdEIsS0FBSztnQkFNTyxvQkFBb0I7c0JBQWhDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBTZWxmLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgU2tpcFNlbGYsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmcm9tLCB0YXAsIE9ic2VydmFibGUsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0aHJvd0Vycm9yLCBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgICBNZXRhb2JqZWN0RGF0YU1vZGVsLFxuICAgIFJlcG9ydFZpZXdDb2x1bW4sXG4gICAgRm9ybVNldHRpbmcsXG4gICAgQmFyc2FBcGksXG4gICAgQ2hvaWNlRGVmLFxuICAgIFR5cGVVbHZNYWluQ3RybHIsXG4gICAgQnJ1bGVBY3Rpb25NZXNzYWdlLFxuICAgIEVqcmF5T2xnb1xufSBmcm9tICcuLi9hYnN0cmFjdC1jbGFzc2VzJztcbmltcG9ydCB7IFByZXZlbnREZWZhdWxFdmVudCwgY3JlYXRlR3JpZEVkaXRvckZvcm1QYW5lbCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGb3JtUGFuZWxTZXJ2aWNlLCBVbHZNYWluU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IEJhc2VWaWV3UHJvcHNDb21wb25lbnQgfSBmcm9tICcuL2Jhc2Utdmlldy1wcm9wcyc7XG5pbXBvcnQgeyBNb1JlcG9ydFZhbHVlUGlwZSB9IGZyb20gJy4uL3BpcGVzJztcbmltcG9ydCB7IEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9mb3JtL2Zvcm0uY29tcG9uZW50JztcbnR5cGUgUmVhc29uVG9TYXZlID0gJ1RBQicgfCAnQ1RSTCtFTlRFUicgfCAnQ0hFQ0tfQ0hBTkdFRCcgfCAnRVNDJyB8ICdNT1VTRURPV05fT1VUU0lERSc7XG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2JucmMtYmFzZS12aWV3LWl0ZW0tcHJvcHMnLFxuICAgIHRlbXBsYXRlOiBgYCxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBCYXNlVmlld0l0ZW1Qcm9wc0NvbXBvbmVudCBleHRlbmRzIEJhc2VWaWV3UHJvcHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgQE91dHB1dCgpIGFjdGlvbkxpc3RDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAgIEBPdXRwdXQoKSBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHsgdGl0bGU6IHN0cmluZzsgZGF0YT86IGFueSB9PigpO1xuICAgIEBWaWV3Q2hpbGQoJ2NhcnRhYmxlRm9ybVJlZicsIHsgc3RhdGljOiBmYWxzZSB9KSBfY2FydGFibGVGb3JtUmVmOiBGb3JtQ29tcG9uZW50O1xuICAgIEBJbnB1dCgpIGNoZWNrYm94Q29tcG9uZW50OiBFanJheU9sZ287XG4gICAgQElucHV0KCkgZGlzYWJsZUVsbGFwc2lzOiBib29sZWFuO1xuXG4gICAgQElucHV0KCkgZGV0YWlsc0NvbXBvbmVudD86IEVqcmF5T2xnbztcbiAgICBASW5wdXQoKSBkZXRhaWxzQ29sdW1uczogUmVwb3J0Vmlld0NvbHVtbltdO1xuICAgIEBJbnB1dCgpIGRldGFpbHNUZXh0OiBzdHJpbmc7XG4gICAgQElucHV0KCkgbW86IE1ldGFvYmplY3REYXRhTW9kZWw7XG4gICAgQElucHV0KCkgbW9EYXRhTGlzdENvdW50OiBudW1iZXI7XG4gICAgQElucHV0KCkgaW5kZXg6IG51bWJlcjtcbiAgICBASW5wdXQoKSBsYXN0OiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzZGlydHk6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNDaGVja2VkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhpZGVEZXRhaWxzVGV4dDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaG93Vmlld0J1dHRvbjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpc05ld0lubGluZU1vOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGV4dHJhUmVsYXRpb246IGFueTtcbiAgICBASW5wdXQoKSBoaWRlT3Blbkljb246IGJvb2xlYW47XG4gICAgQElucHV0KCkgaW5EaWFsb2c6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNNb2JpbGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNNdWx0aVNlbGVjdDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByb3dJbmRpY2F0b3I6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZ3JvdXBTdW1tYXJ5OiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzTGFzdENoaWxkR3JvdXA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2hvd1Jvd051bWJlcjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByb3dOdW1iZXI6IHN0cmluZztcbiAgICBASW5wdXQoKSBjb2xvcmluZ1JvdzogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBub1NhdmVJbmxpbmVFZGl0SW5TZXJ2ZXI6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcm93SW5kaWNhdG9yQ29sb3I6IHN0cmluZztcbiAgICBASW5wdXQoKSBVbHZNYWluQ3RybHI6IFR5cGVVbHZNYWluQ3RybHI7XG4gICAgQElucHV0KCkgZmllbGREaWN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIEBJbnB1dCgpIGFjdGlvbkxpc3Q6IGFueVtdO1xuXG4gICAgQElucHV0KCkgc2V0IHNlcmlhbGl6ZWRSZWxhdGVkTW8odmFsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fc2VyaWFsaXplZFJlbGF0ZWRNbyA9IHZhbDtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FydGFibGVNbyh2YWwpO1xuICAgICAgICB0aGlzLl9jcmVhdGVDYXJ0YWJsZVBhcmFtcygpO1xuICAgIH1cbiAgICBASW5wdXQoKSBzZXQgY2FydGFibGVUZW1wbGF0ZSh2YWw6IEZvcm1TZXR0aW5nKSB7XG4gICAgICAgIHRoaXMuX2NhcnRhYmxlVGVtcGxhdGUgPSB2YWw7XG4gICAgICAgIHRoaXMuX2NyZWF0ZUNhcnRhYmxlUGFyYW1zKCk7XG4gICAgfVxuICAgIEBJbnB1dCgpIHNldCBjYXJ0YWJsZU1vKHZhbDogTWV0YW9iamVjdERhdGFNb2RlbCkge1xuICAgICAgICB0aGlzLl9jYXJ0YWJsZU1vID0gdmFsO1xuICAgICAgICB0aGlzLl91cGRhdGVDYXJ0YWJsZU1vKHRoaXMuX3NlcmlhbGl6ZWRSZWxhdGVkTW8pO1xuXG4gICAgICAgIHRoaXMuX2NyZWF0ZUNhcnRhYmxlUGFyYW1zKCk7XG4gICAgfVxuICAgIEBJbnB1dCgpIHNldCBjYXJ0YWJsZVdvcmtmbG93RGF0YSh2YWw6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jYXJ0YWJsZVdvcmtmbG93RGF0YSA9IHZhbDtcbiAgICAgICAgdGhpcy5fY3JlYXRlQ2FydGFibGVQYXJhbXMoKTtcbiAgICB9XG4gICAgLy8gQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgICAvLyBvbk1vdXNlRG93bihlKTogdm9pZCB7XG4gICAgLy8gICAgIC8vIHdlIG1ha2Ugc3VyZSBvbmx5IGRyYWdnYWJsZXMgb24gdGhlIGRvY3VtZW50IGVsZW1lbnRzIGFyZSBzZWxlY3RlZFxuICAgIC8vICAgICBpZiAoXG4gICAgLy8gICAgICAgICAhdGhpcy5fZWwubmF0aXZlRWxlbWVudC5jb250YWlucyhlLnRhcmdldCkgJiZcbiAgICAvLyAgICAgICAgIHRoaXMuaW5saW5lRWRpdE1vZGUgJiZcbiAgICAvLyAgICAgICAgIHRoaXMuYWxsb3dJbmxpbmVFZGl0ICYmXG4gICAgLy8gICAgICAgICB0aGlzLmlzQ2hlY2tlZCAmJlxuICAgIC8vICAgICAgICAgZS50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYnV0dG9uJ1xuICAgIC8vICAgICApIHtcbiAgICAvLyAgICAgICAgIHRoaXMuZGVzZWxlY3RBbGwuZW1pdCgpO1xuICAgIC8vICAgICAgICAgLy8gdGhpcy5fc2F2ZUVkaXRlZE1vJC5uZXh0KCdNT1VTRURPV05fT1VUU0lERScpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfVxuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgX2ZvY3VzVG9GaXJzdEVpZHRhYmxlQ29sdW1uID0gZmFsc2U7XG4gICAgX2xhc3RFZGl0YWJsZUNvbHVtbkluZGV4OiBudW1iZXI7XG4gICAgaW5saW5lRWRpdEluUmVwb3J0ID0gdHJ1ZTtcbiAgICBsYXlvdXQkOiBPYnNlcnZhYmxlPGFueT47XG4gICAgZm9ybVBhbmVsQ3RybHI6IGFueTtcbiAgICBzYXZpbmc6IGJvb2xlYW47XG4gICAgc2F2ZWQ6IGJvb2xlYW47XG4gICAgaW5Sb3cgPSB0cnVlO1xuICAgIGhhc0NhcnRhYmxlVGVtcGxhdGUgPSBmYWxzZTtcbiAgICBjYXJ0YWJsZVBhcmFtczoge1xuICAgICAgICBmb3JtU2V0dGluZzogRm9ybVNldHRpbmc7XG4gICAgICAgIG1vSWQ6IHN0cmluZztcbiAgICAgICAgdHlwZURlZklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIHZpZXdJZDogYW55O1xuICAgICAgICBpbkRpYWxvZzogYm9vbGVhbjtcbiAgICAgICAgbG9hZEFjdGl2aXR5VmlldzogYm9vbGVhbjtcbiAgICB9O1xuICAgIHdvcmtmbG93U3RhdGU6IHsgZXJyb3I6IGFueTsgc3RhdGU6ICdQZW5kaW5nJyB8ICdGaW5pc2gnIHwgJycgfTtcbiAgICBicnVsZUFjdGlvbk1lc3NhZ2U6IEJydWxlQWN0aW9uTWVzc2FnZSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX3NhdmVFZGl0ZWRNbyQgPSBuZXcgU3ViamVjdDxSZWFzb25Ub1NhdmU+KCk7XG4gICAgcHJpdmF0ZSBfZm9ybXBhbmVsVmFsdWVDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIF9mb3JtUGFuZWxMb2FkZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfY2FydGFibGVNbzogTWV0YW9iamVjdERhdGFNb2RlbDtcbiAgICBwcml2YXRlIF9jYXJ0YWJsZVRlbXBsYXRlOiBGb3JtU2V0dGluZztcbiAgICBwcml2YXRlIF9jYXJ0YWJsZVdvcmtmbG93RGF0YTogc3RyaW5nO1xuICAgIHByaXZhdGUgX3NlcmlhbGl6ZWRSZWxhdGVkTW86IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIF9lbDogRWxlbWVudFJlZixcbiAgICAgICAgcHJvdGVjdGVkIF9kb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICAgICAgcHJvdGVjdGVkIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgX3JlcG9ydFZhbHVlUGlwZTogTW9SZXBvcnRWYWx1ZVBpcGUsXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHByb3RlY3RlZCBfcGFyZW50Rm9ybVBhbmVsU2VydmljZTogRm9ybVBhbmVsU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBwcm90ZWN0ZWQgX2Zvcm1QYW5lbFNlcnZpY2U6IEZvcm1QYW5lbFNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfdWx2TWFpblNlcnZpY2U6IFVsdk1haW5TZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3NhdmVFZGl0ZWRNbyRcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgocmVhc29uOiBSZWFzb25Ub1NhdmUpID0+IHRoaXMuX2lubGluZUVkaXRTYXZlRm9ybVBhbmVsKHJlYXNvbikpLFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4gdGhyb3dFcnJvcigoKSA9PiBlcnIpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzOiB7IHJlYXNvbjogUmVhc29uVG9TYXZlOyBzdWNjZWVkOiBib29sZWFuOyBzYXZlZDogYm9vbGVhbiB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5zYXZlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vLiRJc0NoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9ybXBhbmVsVmFsdWVDaGFuZ2VkJC5uZXh0KCcnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzLnJlYXNvbiA9PT0gJ1RBQicgfHwgcmVzLnJlYXNvbiA9PT0gJ0NUUkwrRU5URVInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TmV4dElubGluZVJlY29yZC5lbWl0KHRoaXMubW8pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLnJlYXNvbiA9PT0gJ0VTQycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybVBhbmVsQ2FuY2VsLmVtaXQodGhpcy5tbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2Zvcm1wYW5lbFZhbHVlQ2hhbmdlZCRcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxuICAgICAgICAgICAgICAgIC8vIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9zeW5jTW8oKSksXG4gICAgICAgICAgICAgICAgdGFwKChjKSA9PiB0aGlzLl9zeW5jTW8oKSksXG4gICAgICAgICAgICAgICAgdGFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5tby4kSW5saW5lTW9DaGFuZ2VkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tby4kSW5saW5lTW9DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybVBhbmVsVmFsdWVDaGFuZ2UuZW1pdCh7IG1vOiB0aGlzLm1vLCBmaWVsZERiTmFtZTogYyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGdldCBfaGFzRm9ybVBhbmVsU2VydmljZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1QYW5lbFNlcnZpY2UgIT09IG51bGwgJiYgdGhpcy5mb3JtU2V0dGluZztcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgICAgICBpZiAodGhpcy5faGFzRm9ybVBhbmVsU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5fZm9ybVBhbmVsU2VydmljZS5jb250ZXh0JC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLl9mb3JtUGFuZWxTZXJ2aWNlLnZpZXckLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0JCA9IHRoaXMuX2Zvcm1QYW5lbFNlcnZpY2UubGF5b3V0JDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICBjb25zdCB7IGlzQ2hlY2tlZCwgaW5saW5lRWRpdE1vZGUgfSA9IGNoYW5nZXM7XG4gICAgICAgIGxldCBuZWVkVG9Mb2FkRm9ybSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5pbmxpbmVFZGl0TW9kZSkge1xuICAgICAgICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIGlmICghaXNDaGVja2VkLmN1cnJlbnRWYWx1ZSAmJiBpc0NoZWNrZWQucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbmVlZFRvU2F2ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYXZlRWRpdGVkTW8kLm5leHQoJ0NIRUNLX0NIQU5HRUQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDaGVja2VkLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBuZWVkVG9Mb2FkRm9ybSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0NoZWNrZWQgJiYgIWlzQ2hlY2tlZC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fcmFpc2VXb3JrZmxvd1NoYXJlQnV0dG9ucyhpc0NoZWNrZWQuY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5saW5lRWRpdE1vZGU/LmN1cnJlbnRWYWx1ZSAmJiAhaW5saW5lRWRpdE1vZGU/LnByZXZpb3VzVmFsdWUgJiYgdGhpcy5pc0NoZWNrZWQpIHtcbiAgICAgICAgICAgIG5lZWRUb0xvYWRGb3JtID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghaW5saW5lRWRpdE1vZGU/LmN1cnJlbnRWYWx1ZSAmJiBpbmxpbmVFZGl0TW9kZT8ucHJldmlvdXNWYWx1ZSAmJiB0aGlzLmlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2F2ZUVkaXRlZE1vJC5uZXh0KCdFU0MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmVlZFRvTG9hZEZvcm0pIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRBbmRDcmVhdGVGb3JtUGFuZWxDdHJscigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLm1vICYmICFjaGFuZ2VzLm1vLmZpcnN0Q2hhbmdlICYmIHRoaXMuaW5saW5lRWRpdE1vZGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9mb3JtUGFuZWxMb2FkZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyLlNldFZhbHVlKGNoYW5nZXMubW8uY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpZiAobW8gJiYgIW1vLmZpcnN0Q2hhbmdlICYmIHRoaXMuX2hhc0Zvcm1QYW5lbFNlcnZpY2UgJiYgdGhpcy5pc0NoZWNrZWQgJiYgdGhpcy5pbmxpbmVFZGl0TW9kZSkge1xuICAgICAgICAvLyAgICAgLy90aGlzLmZvcm1QYW5lbEN0cmxyLlNldFZhbHVlKGNoYW5nZXMubW8uY3VycmVudFZhbHVlKTtcbiAgICAgICAgLy8gfVxuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybVBhbmVsQ3RybHIpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybVBhbmVsQ3RybHIudW4oJ2JydWxlU2hvd01lc3NhZ2VBY3Rpb24nLCB0aGlzLl9oYW5kbGVCcnVsZVNob3dNZXNzYWdlQWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBPbkNhcnRhYmxlRm9ybUNsaWNrKGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDaGVja2VkKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Sb3dDaGVjayhvbmx5Q2hlY2s/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Jvd0NoZWNrKG9ubHlDaGVjayk7XG4gICAgfVxuICAgIG9uUm93Q2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMucm93Q2xpY2suZW1pdCh7IG1vOiB0aGlzLm1vLCBpbmRleDogdGhpcy5pbmRleCB9KTtcbiAgICB9XG4gICAgb25Db2x1bW5DaGFuZ2VUb0VkaXRNb2RlKGVsRG9tOiBIVE1MRWxlbWVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBmb2N1c2FibGVzID0gZWxEb20ucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgIGBidXR0b24sYnV0dG9uOm5vdChbZGlzYWJsZWRdKSxbaHJlZl0saW5wdXQ6bm90KFtkaXNhYmxlZF0pLGlucHV0LFxuICAgICAgICAgICAgICAgIHNlbGVjdCxzZWxlY3Q6bm90KFtkaXNhYmxlZF0pLHRleHRhcmVhLHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSxbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSlgXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2xhc3RFZGl0YWJsZUNvbHVtbkluZGV4ID0gaW5kZXg7XG4gICAgICAgIGlmICghZm9jdXNhYmxlcy5sZW5ndGggfHwgdGhpcy5fZm9jdXNUb0ZpcnN0RWlkdGFibGVDb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9mb2N1c1RvRmlyc3RFaWR0YWJsZUNvbHVtbiA9IHRydWU7XG4gICAgICAgIGNvbnN0IGxhc3RGb2N1c2FibGUgPSBmb2N1c2FibGVzWzBdO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIChsYXN0Rm9jdXNhYmxlIGFzIEhUTUxFbGVtZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuICAgIG9uVGFiS2V5RG93bihlLCBpbmRleCk6IHZvaWQge1xuICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuX2xhc3RFZGl0YWJsZUNvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICBQcmV2ZW50RGVmYXVsRXZlbnQoZSk7XG4gICAgICAgICAgICB0aGlzLl9zYXZlRWRpdGVkTW8kLm5leHQoJ1RBQicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uRWRpdEZvcm1QYW5lbFNhdmUoZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zYXZlRWRpdGVkTW8kLm5leHQoJ0NUUkwrRU5URVInKTtcbiAgICB9XG4gICAgb25FZGl0Rm9ybVBhbmVsQ2FuY2VsKGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lc2NhcGVLZXkuZW1pdCh0aGlzLm1vKTtcbiAgICB9XG4gICAgb25VbHZDb21tYW5kKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVsdkNvbW1hbmQuZW1pdCh7IG1vOiB0aGlzLm1vLCBpbmRleDogdGhpcy5pbmRleCB9KTtcbiAgICB9XG4gICAgb25BY3Rpb24oY29tbWFuZEJvZHk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGlvbi5lbWl0KGNvbW1hbmRCb2R5KTtcbiAgICB9XG4gICAgb25FeHBhbmRDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5leHBhbmRDbGljay5lbWl0KHRoaXMubW8pO1xuICAgIH1cbiAgICBvbkR5bmFtaWNDb21wb25lbnRFdmVudHMoZTogeyB0aXRsZTogc3RyaW5nOyBkYXRhPzogYW55IH0pOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChlLnRpdGxlKSB7XG4gICAgICAgICAgICBjYXNlICdyb3dDaGVjayc6XG4gICAgICAgICAgICAgICAgdGhpcy5vblJvd0NoZWNrKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdyb3dDbGljayc6XG4gICAgICAgICAgICAgICAgdGhpcy5vblJvd0NsaWNrKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd1bHZDb21tYW5kJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9uVWx2Q29tbWFuZCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DYXJ0YWJsZUZvcm1DbG9zZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FydGFibGVGb3JtQ2xvc2VkLmVtaXQoeyBtbzogdGhpcy5tbywgaW5kZXg6IHRoaXMuaW5kZXggfSk7XG4gICAgfVxuXG4gICAgb25DYXJ0YWJsZUJydWxlQWN0aW9uKGJydWxlQWN0aW9uOiBCcnVsZUFjdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFuZGxlQnJ1bGVTaG93TWVzc2FnZUFjdGlvbihicnVsZUFjdGlvbik7XG4gICAgfVxuICAgIG9uQ2FydGFibGVBZnRlclRhbnNpdGlvbihlKTogdm9pZCB7XG4gICAgICAgIHRoaXMud29ya2Zsb3dTdGF0ZSA9IHtcbiAgICAgICAgICAgIGVycm9yOiB0aGlzLmJydWxlQWN0aW9uTWVzc2FnZSA/IHRoaXMuYnJ1bGVBY3Rpb25NZXNzYWdlIDogZS5lcnJvcixcbiAgICAgICAgICAgIHN0YXRlOiAnRmluaXNoJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBvbkNhcnRhYmxlQmVmb3JlVGFuc2l0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLndvcmtmbG93U3RhdGUgPSB7IHN0YXRlOiAnUGVuZGluZycsIGVycm9yOiBudWxsIH07XG4gICAgICAgIC8vIHRoaXMud29ya2Zsb3dTdGF0ZUNoYW5nZWQuZW1pdCh0aGlzLndvcmtmbG93U3RhdGUpO1xuICAgIH1cbiAgICBvblJlc2V0V29ya2Zsb3dTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFuZGxlUmVzZXRXb3JrZmxvd1N0YXRlKCk7XG4gICAgfVxuICAgIF90cmFja0J5Q29sdW1uKGluZGV4OiBudW1iZXIsIGNvbHVtbjogUmVwb3J0Vmlld0NvbHVtbik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtjb2x1bW4uTmFtZX0ke2luZGV4fWA7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfaGFuZGxlUmVzZXRXb3JrZmxvd1N0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJydWxlQWN0aW9uTWVzc2FnZSA9IG51bGw7XG4gICAgICAgIHRoaXMud29ya2Zsb3dTdGF0ZSA9IHsgc3RhdGU6ICcnLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZUNhcnRhYmxlTW8oc2VyaWFsaXplTW86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoc2VyaWFsaXplTW8gJiYgdGhpcy5fY2FydGFibGVNbykge1xuICAgICAgICAgICAgc2VyaWFsaXplTW8gPSBgJHtzZXJpYWxpemVNb31gO1xuICAgICAgICAgICAgY29uc3QgbW8gPSBCYXJzYUFwaS5FeHQuZGVjb2RlKHNlcmlhbGl6ZU1vKTtcbiAgICAgICAgICAgIHRoaXMuX2NhcnRhYmxlTW8gPSB7IC4uLnRoaXMuX2NhcnRhYmxlTW8sIC4uLm1vIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIF9jcmVhdGVDYXJ0YWJsZVBhcmFtcygpOiB2b2lkIHtcbiAgICAgICAgbGV0IGNhcnRhYmxlVGVtcGxhdGUgPSB0aGlzLl9jYXJ0YWJsZVRlbXBsYXRlO1xuICAgICAgICBjb25zdCBjYXJ0YWJsZU1vID0gdGhpcy5fY2FydGFibGVNbztcbiAgICAgICAgY29uc3QgY2FydGFibGVXb3JrZmxvd0RhdGEgPSB0aGlzLl9jYXJ0YWJsZVdvcmtmbG93RGF0YTtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ2FydGFibGVUZW1wbGF0ZSkge1xuICAgICAgICAgICAgLy8gVE9ETyB1cGRhdGUgY2FydGFibGUgbW87XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2FydGFibGVUZW1wbGF0ZSAmJlxuICAgICAgICAgICAgY2FydGFibGVNbyAmJlxuICAgICAgICAgICAgdHlwZW9mIGNhcnRhYmxlV29ya2Zsb3dEYXRhICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdGhpcy5fc2VyaWFsaXplZFJlbGF0ZWRNb1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGNhcnRhYmxlVGVtcGxhdGUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNhcnRhYmxlVGVtcGxhdGUpKTtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBjYXJ0YWJsZVRlbXBsYXRlLlZpZXc7XG4gICAgICAgICAgICBjYXJ0YWJsZVRlbXBsYXRlLkRhdGEgPSB7IE1vOiB7IC4uLmNhcnRhYmxlTW8gfSB9O1xuICAgICAgICAgICAgY2FydGFibGVUZW1wbGF0ZS5Xb3JrZmxvdyA9IGNhcnRhYmxlV29ya2Zsb3dEYXRhID09PSAnJyA/IG51bGwgOiBKU09OLnBhcnNlKGNhcnRhYmxlV29ya2Zsb3dEYXRhKTtcbiAgICAgICAgICAgIGlmICghdmlldy5FeHRyYUpzb25Qcm9wKSB7XG4gICAgICAgICAgICAgICAgdmlldy5FeHRyYUpzb25Qcm9wID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2aWV3LkV4dHJhSnNvblByb3AuSXNTaW1wbGUgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmNhcnRhYmxlUGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGZvcm1TZXR0aW5nOiBjYXJ0YWJsZVRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIG1vSWQ6IGNhcnRhYmxlTW8uSWQsXG4gICAgICAgICAgICAgICAgdHlwZURlZklkOiBjYXJ0YWJsZU1vLiRUeXBlRGVmSWQsXG4gICAgICAgICAgICAgICAgdmlld0lkOiB2aWV3LlR5cGVWaWV3SWQsXG4gICAgICAgICAgICAgICAgaW5EaWFsb2c6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxvYWRBY3Rpdml0eVZpZXc6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmhhc0NhcnRhYmxlVGVtcGxhdGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBfbmVlZFRvU2F2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgLy8gaWYgKCF0aGlzLmlzQ2hlY2tlZCkge1xuICAgICAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGNvbnN0IGlzQ2hpbGROb2RlID0gKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNvbnRhaW5zKGUudGFyZ2V0KTtcbiAgICAgICAgLy8gaWYgKGlzQ2hpbGROb2RlKSB7XG4gICAgICAgIC8vICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIH1cbiAgICAgICAgY29uc3QgdCA9IHRoaXMuaW5saW5lRWRpdE1vZGUgJiYgdGhpcy5faGFzRm9ybVBhbmVsU2VydmljZTtcbiAgICAgICAgaWYgKCF0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtUGFuZWxDdHJsciAmJiB0aGlzLmZvcm1QYW5lbEN0cmxyLklzTW9DaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jaGVja2ZvY3VzT3V0RnJvbVJvdyh0YXJnZXQpOiB2b2lkIHtcbiAgICAgICAgLy8gY29uc3QgZm9jdXNhYmxlOiBOb2RlTGlzdCA9IHRoaXMuX2ZvY3VzYWJsZUNvbnRyb2xzO1xuICAgICAgICAvLyBsZXQgZm91bmRJbkZvY3VzYWJsZSA9IGZhbHNlO1xuICAgICAgICAvLyBmb2N1c2FibGUuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKGMgPT09IHRhcmdldCkge1xuICAgICAgICAvLyAgICAgICAgIGZvdW5kSW5Gb2N1c2FibGUgPSB0cnVlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9KTtcbiAgICAgICAgLy8gaWYgKCFmb3VuZEluRm9jdXNhYmxlKSB7XG4gICAgICAgIC8vICAgICB0aGlzLl9zYXZlRWRpdGVkTW8kLm5leHQoJ1RBQicpO1xuICAgICAgICAvLyB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBfcm93Q2hlY2sob25seUNoZWNrPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnJvd0NoZWNrLmVtaXQoeyBtbzogdGhpcy5tbywgaW5kZXg6IHRoaXMuaW5kZXgsIG9ubHlDaGVjayB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3JhaXNlV29ya2Zsb3dTaGFyZUJ1dHRvbnMoaXNDaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNhcnRhYmxlUGFyYW1zKSB7XG4gICAgICAgICAgICBjb25zdCBjaG9pY2VMaXN0OiBDaG9pY2VEZWZbXSA9IHRoaXMuY2FydGFibGVQYXJhbXMuZm9ybVNldHRpbmc/LldvcmtmbG93Py5DaG9pY2VMaXN0O1xuICAgICAgICAgICAgaWYgKGNob2ljZUxpc3Q/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtmbG93U2hhcmVCdXR0b25zLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVBhbmVsQ3RybHI6IHRoaXMuX2NhcnRhYmxlRm9ybVJlZi5mb3JtUGFuZWxDdHJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW86IHRoaXMubW8sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VMaXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkOiBpc0NoZWNrZWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2hhbmRsZVZhbHVlQ2hhbmdlKGZvcm1QYW5lbEN0cmwsIGZpZWxkQ3RybHIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5vblJvd0NoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9ybXBhbmVsVmFsdWVDaGFuZ2VkJC5uZXh0KGZpZWxkQ3RybHI/LlNldHRpbmc/LkNvbnRyb2xOYW1lKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9zeW5jTW8oKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN5bmNXaXRoRm9ybXBhbmVsTW8gPSB0aGlzLm1vO1xuICAgICAgICBjb25zdCBfaXNDaGVja2VkID0gdGhpcy5tby4kSXNDaGVja2VkO1xuICAgICAgICBjb25zdCBmb3JtUGFuZWxDdHJsck1vID0gdGhpcy5mb3JtUGFuZWxDdHJsci5NbztcbiAgICAgICAgdGhpcy5fdXBkYXRlV2l0aE9yaWdpbmFsVmFsdWVzKGZvcm1QYW5lbEN0cmxyTW8sIHN5bmNXaXRoRm9ybXBhbmVsTW8pO1xuICAgICAgICBzeW5jV2l0aEZvcm1wYW5lbE1vWyckT3JpZ2luYWxWYWx1ZXMnXSA9IGZvcm1QYW5lbEN0cmxyTW9bJyRPcmlnaW5hbFZhbHVlcyddO1xuICAgICAgICBzeW5jV2l0aEZvcm1wYW5lbE1vWyckRmllbGREaWN0J10gPSBmb3JtUGFuZWxDdHJsck1vWyckRmllbGREaWN0J107XG4gICAgICAgIHN5bmNXaXRoRm9ybXBhbmVsTW9bJyRTdGF0ZSddID0gZm9ybVBhbmVsQ3RybHJNb1snJFN0YXRlJ107IC8vIHRoaXMgYWRkIGJlY2F1c2UgaWYgd2UgZWRpdCB1bmNoYW5nZWQgbW8gaXQgZG9lcyBub3QgcmVmbGVjdCB0byBtbyBvZiB1bHYuXG4gICAgICAgIHRoaXMubW8gPSB7IC4uLnN5bmNXaXRoRm9ybXBhbmVsTW8gfTtcbiAgICAgICAgdGhpcy5tby4kSXNDaGVja2VkID0gX2lzQ2hlY2tlZDtcbiAgICAgICAgcmV0dXJuIGZyb20oUHJvbWlzZS5yZXNvbHZlKCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdXBkYXRlV2l0aE9yaWdpbmFsVmFsdWVzKHNvdXJjZTogTWV0YW9iamVjdERhdGFNb2RlbCwgZGVzdDogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICBPYmplY3Qua2V5cyhzb3VyY2UuJE9yaWdpbmFsVmFsdWVzKS5mb3JFYWNoKChjOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGRlc3RbY10gPSBzb3VyY2VbY107XG4gICAgICAgICAgICBpZiAoc291cmNlW2MgKyAnJENhcHRpb24nXSkge1xuICAgICAgICAgICAgICAgIGRlc3RbYyArICckQ2FwdGlvbiddID0gc291cmNlW2MgKyAnJENhcHRpb24nXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzb3VyY2VbYyArICckSWNvbiddKSB7XG4gICAgICAgICAgICAgICAgZGVzdFtjICsgJyRJY29uJ10gPSBzb3VyY2VbYyArICckSWNvbiddO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3JhaXNlRm9ybVBhbmVsVmFsdWVDaGFuZ2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRGb3JtUGFuZWxWYWx1ZUNoYW5nZS5lbWl0KHsgbW86IHRoaXMubW8gfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVCcnVsZVNob3dNZXNzYWdlQWN0aW9uKGFjdGlvbjogQnJ1bGVBY3Rpb25NZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIGFjdGlvbi5NZXNzYWdlRXhwcmVzc2lvbkh0bWwgPSB0aGlzLl9kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoYWN0aW9uLk1lc3NhZ2VFeHByZXNzaW9uKTtcbiAgICAgICAgdGhpcy5icnVsZUFjdGlvbk1lc3NhZ2UgPSBhY3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBfY3JlYXRlRm9ybVBhbmVsQ3RybHIobW86IE1ldGFvYmplY3REYXRhTW9kZWwsIHR5cGVEZWZJZDogc3RyaW5nKTogYW55IHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1QYW5lbEN0cmxyKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyID0gY3JlYXRlR3JpZEVkaXRvckZvcm1QYW5lbChcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1TZXR0aW5nLFxuICAgICAgICAgICAgICAgIHsgLi4ubW8gfSxcbiAgICAgICAgICAgICAgICB0eXBlRGVmSWQsXG4gICAgICAgICAgICAgICAgdGhpcy5leHRyYVJlbGF0aW9uLFxuICAgICAgICAgICAgICAgIHRoaXMuaW5Sb3csXG4gICAgICAgICAgICAgICAgdGhpcy5VbHZNYWluQ3RybHJcbiAgICAgICAgICAgICAgICAvLyBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZSh0aGlzLmNvbnRleHQuU2V0dGluZywgJ0V4dHJhLlJlbGF0aW9uJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JtUGFuZWxDdHJsci5JbmxpbmVFZGl0SW5SZXBvcnQgPSB0cnVlO1xuICAgICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyLm9uKHtcbiAgICAgICAgICAgIGJydWxlU2hvd01lc3NhZ2VBY3Rpb246IHRoaXMuX2hhbmRsZUJydWxlU2hvd01lc3NhZ2VBY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHZhbHVlQ2hhbmdlOiB0aGlzLl9oYW5kbGVWYWx1ZUNoYW5nZS5iaW5kKHRoaXMpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1QYW5lbEN0cmxyO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbG9hZEFuZENyZWF0ZUZvcm1QYW5lbEN0cmxyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBmb3JtU2V0dGluZ0RhdGEgPSB0aGlzLmZvcm1TZXR0aW5nLkRhdGE7XG4gICAgICAgIGNvbnN0IGZvcm1NbyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMubW8sXG4gICAgICAgICAgICAkRmllbGREaWN0OiBmb3JtU2V0dGluZ0RhdGEuTW8uJEZpZWxkRGljdCxcbiAgICAgICAgICAgICRUeXBlRGVmSWQ6IGZvcm1TZXR0aW5nRGF0YS5Nby4kVHlwZURlZklkLFxuICAgICAgICAgICAgJE9yaWdpbmFsVmFsdWVzOiB7fVxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5fZm9ybVBhbmVsTG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyLlNldFZhbHVlKGZvcm1Nbyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jcmVhdGVGb3JtUGFuZWxDdHJscihmb3JtTW8sIHRoaXMudHlwZURlZklkKTtcbiAgICAgICAgdGhpcy5fZm9ybVBhbmVsTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZm9ybVBhbmVsQ3RybHIgPSB0aGlzLmZvcm1QYW5lbEN0cmxyO1xuICAgICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyLlVsdk1vRGF0YUxpc3RDb3VudCA9IHRoaXMubW9EYXRhTGlzdENvdW50IC0gMTtcbiAgICAgICAgZm9ybVBhbmVsQ3RybHIuTG9hZEFuZENyZWF0ZShudWxsLCBmYWxzZSwgZmFsc2UsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUZvcm1QYW5lbFVpID0gZm9ybVBhbmVsQ3RybHIuQWRhcHRlci5Db250cm9sO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50TW8gPSB0aGlzLl9wYXJlbnRGb3JtUGFuZWxTZXJ2aWNlID8gdGhpcy5fcGFyZW50Rm9ybVBhbmVsU2VydmljZS5tbyA6IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5leHRyYVJlbGF0aW9uICYmIHBhcmVudE1vICYmIHRoaXMuZXh0cmFSZWxhdGlvbi5SZWxhdGlvblR5cGUgPT09ICdDb21wb3NpdGlvbicpIHtcbiAgICAgICAgICAgICAgICBmb3JtUGFuZWxDdHJsci5Nby5TZXRGVmFsdWUodGhpcy5leHRyYVJlbGF0aW9uLlBhcmVudEZkTmFtZSwgcGFyZW50TW8pO1xuICAgICAgICAgICAgICAgIC8vIG5ld0Zvcm1TZXR0aW5ncy5EYXRhLk1vW3JlbGF0aW9uLlBhcmVudEZkTmFtZV0gPSBwYXJlbnRNby5HZXRDaGFuZ2VkT2JqZWN0KCk7XG4gICAgICAgICAgICAgICAgLy8gbmV3Rm9ybVNldHRpbmdzLkRhdGEuTW9bcmVsYXRpb24uUGFyZW50RmROYW1lXS4kU3RhdGUgPSBwYXJlbnRNby4kU3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXN0b21Gb3JtUGFuZWxVaS5SZWZyZXNoID0gKCkgPT4ge307XG4gICAgICAgICAgICB0aGlzLl9mb3JtUGFuZWxTZXJ2aWNlLmNvbnRleHQgPSBmb3JtUGFuZWxDdHJsci5BZGFwdGVyLkNvbnRyb2w7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX3Jlc2V0U2F2aW5nU3RhdGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnJ1bGVBY3Rpb25NZXNzYWdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zYXZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfc2V0U2F2aW5nU3RhdGUoZXJyKTogdm9pZCB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zYXZlZCA9IHRydWU7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfaW5saW5lRWRpdFNhdmVGb3JtUGFuZWwocmVhc29uKTogUHJvbWlzZTx7IHJlYXNvbjogUmVhc29uVG9TYXZlOyBzdWNjZWVkOiBib29sZWFuOyBzYXZlZDogYm9vbGVhbiB9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHsgcmVhc29uOiBSZWFzb25Ub1NhdmU7IHN1Y2NlZWQ6IGJvb2xlYW47IHNhdmVkOiBib29sZWFuIH0+KChyZXNvbHZlLCBfKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZm9ybVBhbmVsQ3RybHIuSXNNb0NoYW5nZWQoKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHN0YXRlIG9mIG1vIGlzIG5ldyBvciBtb2RpZGZpZWQgdGhlbiBpdCBuZWVkcyB0byB1cGRhdGVcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgcmVhc29uLCBzdWNjZWVkOiB0cnVlLCBzYXZlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmb3JtUGFuZWxDdHJsck1vID0gdGhpcy5mb3JtUGFuZWxDdHJsci5NbztcbiAgICAgICAgICAgIGRlbGV0ZSBmb3JtUGFuZWxDdHJsck1vLmpzb247XG4gICAgICAgICAgICAvLyB0aGlzLnNhdmluZyA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMubW8uJElubGluZU1vQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybVBhbmVsU2F2ZS5lbWl0KHRoaXMubW8pO1xuICAgICAgICAgICAgdGhpcy5icnVsZUFjdGlvbk1lc3NhZ2UgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMubm9TYXZlSW5saW5lRWRpdEluU2VydmVyKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHJlYXNvbiwgc3VjY2VlZDogdHJ1ZSwgc2F2ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mb3JtUGFuZWxDdHJsci5TYXZlKGZhbHNlLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyLlNldElzQ2hhbmdlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0U2F2aW5nU3RhdGUoZXJyKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgcmVhc29uLCBzdWNjZWVkOiB0cnVlLCBzYXZlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=