barsa-novin-ray-core 2.2.73 → 2.2.74

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