barsa-novin-ray-core 2.2.72 → 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 (234) hide show
  1. package/fesm2022/barsa-novin-ray-core.mjs +671 -660
  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/directives/splide-slider.directive.d.ts +1 -0
  8. package/lib/dynamic-component/base-view-item-props.d.ts +4 -4
  9. package/lib/resolvers/login-settings.resolver.d.ts +1 -1
  10. package/lib/resolvers/tile-group-breadcrumb.resolver.d.ts +1 -1
  11. package/lib/root-portal/root-portal.component.d.ts +2 -0
  12. package/lib/services/notification.service.d.ts +2 -2
  13. package/lib/services/portal.service.d.ts +4 -1
  14. package/package.json +3 -5
  15. package/esm2022/barsa-novin-ray-core.mjs +0 -5
  16. package/esm2022/lib/abstract-classes/application-base.mjs +0 -25
  17. package/esm2022/lib/abstract-classes/barsa-api.mjs +0 -43
  18. package/esm2022/lib/abstract-classes/base-column-props.mjs +0 -89
  19. package/esm2022/lib/abstract-classes/base.component.mjs +0 -60
  20. package/esm2022/lib/abstract-classes/field-base.mjs +0 -244
  21. package/esm2022/lib/abstract-classes/files-validation-helper.mjs +0 -75
  22. package/esm2022/lib/abstract-classes/form-base.mjs +0 -164
  23. package/esm2022/lib/abstract-classes/form-field-report-page.component.mjs +0 -54
  24. package/esm2022/lib/abstract-classes/form-page-base.mjs +0 -132
  25. package/esm2022/lib/abstract-classes/form-page.component.mjs +0 -53
  26. package/esm2022/lib/abstract-classes/form-props.base.mjs +0 -100
  27. package/esm2022/lib/abstract-classes/form-toolbar-base.mjs +0 -57
  28. package/esm2022/lib/abstract-classes/index.mjs +0 -25
  29. package/esm2022/lib/abstract-classes/layout-item-base.mjs +0 -49
  30. package/esm2022/lib/abstract-classes/layout-panel-base.mjs +0 -68
  31. package/esm2022/lib/abstract-classes/linear-list-helper.mjs +0 -135
  32. package/esm2022/lib/abstract-classes/models.mjs +0 -184
  33. package/esm2022/lib/abstract-classes/module-with-dynamic-components.mjs +0 -2
  34. package/esm2022/lib/abstract-classes/number-base.mjs +0 -201
  35. package/esm2022/lib/abstract-classes/page-base.mjs +0 -98
  36. package/esm2022/lib/abstract-classes/page-with-form-handler-base.mjs +0 -41
  37. package/esm2022/lib/abstract-classes/report-base.mjs +0 -266
  38. package/esm2022/lib/abstract-classes/report-item-base.mjs +0 -54
  39. package/esm2022/lib/abstract-classes/report-view-base.component.mjs +0 -450
  40. package/esm2022/lib/abstract-classes/system-base.mjs +0 -25
  41. package/esm2022/lib/abstract-classes/tile-props.mjs +0 -49
  42. package/esm2022/lib/auth-guard.mjs +0 -48
  43. package/esm2022/lib/barsa-novin-ray-core-routing.module.mjs +0 -311
  44. package/esm2022/lib/barsa-novin-ray-core.module.mjs +0 -522
  45. package/esm2022/lib/base-ulv-setting.component.mjs +0 -46
  46. package/esm2022/lib/base.module.mjs +0 -28
  47. package/esm2022/lib/button-loading/button-loading.component.mjs +0 -20
  48. package/esm2022/lib/constants.mjs +0 -963
  49. package/esm2022/lib/container.component.mjs +0 -100
  50. package/esm2022/lib/controllers/base-controller.mjs +0 -9
  51. package/esm2022/lib/controllers/base-view.mjs +0 -24
  52. package/esm2022/lib/controllers/index.mjs +0 -4
  53. package/esm2022/lib/controllers/models.mjs +0 -2
  54. package/esm2022/lib/custom-route-reuse-strategy.mjs +0 -32
  55. package/esm2022/lib/date-services/date-hijri.service.mjs +0 -146
  56. package/esm2022/lib/date-services/date-info.mjs +0 -2
  57. package/esm2022/lib/date-services/date-miladi.service.mjs +0 -124
  58. package/esm2022/lib/date-services/date-shamsi.service.mjs +0 -148
  59. package/esm2022/lib/date-services/date.service.mjs +0 -149
  60. package/esm2022/lib/date-services/index.mjs +0 -6
  61. package/esm2022/lib/device.mjs +0 -663
  62. package/esm2022/lib/directives/absolute-div-body.directive.mjs +0 -46
  63. package/esm2022/lib/directives/anchor-scroll.directive.mjs +0 -25
  64. package/esm2022/lib/directives/attr-rtl.directive.mjs +0 -36
  65. package/esm2022/lib/directives/base.directive.mjs +0 -55
  66. package/esm2022/lib/directives/body-click.directive.mjs +0 -36
  67. package/esm2022/lib/directives/column-resizer.directive.mjs +0 -40
  68. package/esm2022/lib/directives/copy.directive.mjs +0 -60
  69. package/esm2022/lib/directives/count-down.directive.mjs +0 -109
  70. package/esm2022/lib/directives/dynamic-command.directive.mjs +0 -43
  71. package/esm2022/lib/directives/dynamic-style.directive.mjs +0 -66
  72. package/esm2022/lib/directives/ellapsis-text.directive.mjs +0 -70
  73. package/esm2022/lib/directives/ellipsify.directive.mjs +0 -73
  74. package/esm2022/lib/directives/field-binding.directive.mjs +0 -18
  75. package/esm2022/lib/directives/fill-empty-space.mjs +0 -89
  76. package/esm2022/lib/directives/form-close.directive.mjs +0 -33
  77. package/esm2022/lib/directives/img-lazy.directive.mjs +0 -82
  78. package/esm2022/lib/directives/index.mjs +0 -42
  79. package/esm2022/lib/directives/intersection-observer.directive.mjs +0 -52
  80. package/esm2022/lib/directives/items-renderer.directive.mjs +0 -60
  81. package/esm2022/lib/directives/label-mandatory.directive.mjs +0 -49
  82. package/esm2022/lib/directives/load-external-files.directive.mjs +0 -38
  83. package/esm2022/lib/directives/mobile.directive.mjs +0 -30
  84. package/esm2022/lib/directives/nowraptext.directive.mjs +0 -27
  85. package/esm2022/lib/directives/numbers-only-input.directive.mjs +0 -27
  86. package/esm2022/lib/directives/placeHolder.directive.mjs +0 -16
  87. package/esm2022/lib/directives/prevent-default.directive.mjs +0 -21
  88. package/esm2022/lib/directives/print-files.directive.mjs +0 -39
  89. package/esm2022/lib/directives/render-ulv-paging.directive.mjs +0 -81
  90. package/esm2022/lib/directives/render-ulv-viewer.directive.mjs +0 -76
  91. package/esm2022/lib/directives/render-ulv.directive.mjs +0 -52
  92. package/esm2022/lib/directives/route-form-change.directive.mjs +0 -38
  93. package/esm2022/lib/directives/save-image.directive.mjs +0 -28
  94. package/esm2022/lib/directives/splide-slider.directive.mjs +0 -103
  95. package/esm2022/lib/directives/stop-propagation.directive.mjs +0 -21
  96. package/esm2022/lib/directives/table-resizer.directive.mjs +0 -236
  97. package/esm2022/lib/directives/ulv-command.directive.mjs +0 -43
  98. package/esm2022/lib/directives/until-inview.directive.mjs +0 -53
  99. package/esm2022/lib/directives/webotp.directive.mjs +0 -49
  100. package/esm2022/lib/directives/workflow-choice-command.directive.mjs +0 -61
  101. package/esm2022/lib/dynamic-component/base-dynamic.component.mjs +0 -97
  102. package/esm2022/lib/dynamic-component/base-form-toolbaritem-props.mjs +0 -53
  103. package/esm2022/lib/dynamic-component/base-item-content-props.mjs +0 -83
  104. package/esm2022/lib/dynamic-component/base-view-content-props.mjs +0 -27
  105. package/esm2022/lib/dynamic-component/base-view-item-props.mjs +0 -552
  106. package/esm2022/lib/dynamic-component/base-view-props.mjs +0 -163
  107. package/esm2022/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +0 -38
  108. package/esm2022/lib/dynamic-component/dynamic-form.component.mjs +0 -69
  109. package/esm2022/lib/dynamic-component/dynamic-item.component.mjs +0 -78
  110. package/esm2022/lib/dynamic-component/dynamic-layout.component.mjs +0 -64
  111. package/esm2022/lib/dynamic-component/index.mjs +0 -11
  112. package/esm2022/lib/empty-page/empty-page.component.mjs +0 -49
  113. package/esm2022/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +0 -16
  114. package/esm2022/lib/field-ui/field-ui.component.mjs +0 -149
  115. package/esm2022/lib/form/form.component.mjs +0 -212
  116. package/esm2022/lib/form-new/form-new.component.mjs +0 -31
  117. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page-routing.module.mjs +0 -54
  118. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page.module.mjs +0 -29
  119. package/esm2022/lib/form-page-routing/constants.mjs +0 -9
  120. package/esm2022/lib/form-page-routing/index.mjs +0 -3
  121. package/esm2022/lib/from-intersection-observer.mjs +0 -53
  122. package/esm2022/lib/global-error-handler.mjs +0 -26
  123. package/esm2022/lib/injdection-tokens.mjs +0 -8
  124. package/esm2022/lib/modal-root.component.mjs +0 -34
  125. package/esm2022/lib/not-found/not-found.component.mjs +0 -16
  126. package/esm2022/lib/not-internet/not-internet.component.mjs +0 -21
  127. package/esm2022/lib/pipes/barsa-icon-dict.pipe.mjs +0 -20
  128. package/esm2022/lib/pipes/bbb-translate.pipe.mjs +0 -36
  129. package/esm2022/lib/pipes/can-upload.pipe.mjs +0 -27
  130. package/esm2022/lib/pipes/card-media-size.pipe.mjs +0 -21
  131. package/esm2022/lib/pipes/column-custom-component.pipe.mjs +0 -41
  132. package/esm2022/lib/pipes/column-customui.pipe.mjs +0 -33
  133. package/esm2022/lib/pipes/column-icon.pipe.mjs +0 -23
  134. package/esm2022/lib/pipes/column-value.pipe.mjs +0 -35
  135. package/esm2022/lib/pipes/column-valueof-parameters.pipe.mjs +0 -34
  136. package/esm2022/lib/pipes/combo-row-img.pipe.mjs +0 -17
  137. package/esm2022/lib/pipes/context-menu.pipe.mjs +0 -41
  138. package/esm2022/lib/pipes/control-ui.pipe.mjs +0 -32
  139. package/esm2022/lib/pipes/convert-to-style.pipe.mjs +0 -33
  140. package/esm2022/lib/pipes/date-time-to-caption.pipe.mjs +0 -35
  141. package/esm2022/lib/pipes/fileinfo-count.pipe.mjs +0 -21
  142. package/esm2022/lib/pipes/filter-columns-by-details.pipe.mjs +0 -23
  143. package/esm2022/lib/pipes/filter-inline-action-list.pipe.mjs +0 -19
  144. package/esm2022/lib/pipes/filter-string.pipe.mjs +0 -45
  145. package/esm2022/lib/pipes/filter-tab.pipe.mjs +0 -20
  146. package/esm2022/lib/pipes/filter-toolbar-control.pipe.mjs +0 -17
  147. package/esm2022/lib/pipes/filter-workflow-mobile.pipe.mjs +0 -25
  148. package/esm2022/lib/pipes/filter.pipe.mjs +0 -34
  149. package/esm2022/lib/pipes/find-column-by-db-name.pipe.mjs +0 -28
  150. package/esm2022/lib/pipes/find-preview-column.pipe.mjs +0 -20
  151. package/esm2022/lib/pipes/fiori-icon.pipe.mjs +0 -43
  152. package/esm2022/lib/pipes/groupby.pipe.mjs +0 -64
  153. package/esm2022/lib/pipes/header-facet-value.pipe.mjs +0 -23
  154. package/esm2022/lib/pipes/hide-accept-cancel-buttons.pipe.mjs +0 -24
  155. package/esm2022/lib/pipes/hide-columns-inmobile.pipe.mjs +0 -23
  156. package/esm2022/lib/pipes/index.mjs +0 -55
  157. package/esm2022/lib/pipes/isimage.pipe.mjs +0 -20
  158. package/esm2022/lib/pipes/list-count.pipe.mjs +0 -18
  159. package/esm2022/lib/pipes/merge-fields-to-columns.pipe.mjs +0 -43
  160. package/esm2022/lib/pipes/mo-info-ulv-data.pipe.mjs +0 -59
  161. package/esm2022/lib/pipes/mo-info-ulv-paging.pipe.mjs +0 -17
  162. package/esm2022/lib/pipes/mo-report-value-concat.pipe.mjs +0 -36
  163. package/esm2022/lib/pipes/mo-report-value.pipe.mjs +0 -18
  164. package/esm2022/lib/pipes/mo-value.pipe.mjs +0 -19
  165. package/esm2022/lib/pipes/multiple-groupby.pipe.mjs +0 -91
  166. package/esm2022/lib/pipes/numeral.pipe.mjs +0 -44
  167. package/esm2022/lib/pipes/picture-field-source.pipe.mjs +0 -23
  168. package/esm2022/lib/pipes/remove-newline.pipe.mjs +0 -21
  169. package/esm2022/lib/pipes/replace.pipe.mjs +0 -18
  170. package/esm2022/lib/pipes/reverse.pipe.mjs +0 -23
  171. package/esm2022/lib/pipes/rownumber.pipe.mjs +0 -26
  172. package/esm2022/lib/pipes/sanitize-text.pipe.mjs +0 -21
  173. package/esm2022/lib/pipes/seperator-fix.pipe.mjs +0 -24
  174. package/esm2022/lib/pipes/sort.pipe.mjs +0 -49
  175. package/esm2022/lib/pipes/string-to-number.pipe.mjs +0 -26
  176. package/esm2022/lib/pipes/th-image-icon.pipe.mjs +0 -22
  177. package/esm2022/lib/pipes/tlbButtons.pipe.mjs +0 -60
  178. package/esm2022/lib/pipes/toolbar-settings.pipe.mjs +0 -27
  179. package/esm2022/lib/pipes/total-summary.pipe.mjs +0 -17
  180. package/esm2022/lib/pipes/tree-item-isexpanded.pipe.mjs +0 -26
  181. package/esm2022/lib/pipes/visible-value.pipe.mjs +0 -19
  182. package/esm2022/lib/portal-page/portal-page.component.mjs +0 -24
  183. package/esm2022/lib/portal-page/portal-sidebar.component.mjs +0 -37
  184. package/esm2022/lib/redirect-home-guard.mjs +0 -51
  185. package/esm2022/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +0 -12
  186. package/esm2022/lib/report-container/report-container.component.mjs +0 -63
  187. package/esm2022/lib/resizable-module/resizable.component.mjs +0 -31
  188. package/esm2022/lib/resizable-module/resizable.directive.mjs +0 -42
  189. package/esm2022/lib/resizable-module/resizable.module.mjs +0 -17
  190. package/esm2022/lib/resolvers/index.mjs +0 -7
  191. package/esm2022/lib/resolvers/login-settings.resolver.mjs +0 -18
  192. package/esm2022/lib/resolvers/portal-dynamic-page.resolver.mjs +0 -49
  193. package/esm2022/lib/resolvers/portal-form-page.resolver.mjs +0 -18
  194. package/esm2022/lib/resolvers/portal-page.resolver.mjs +0 -30
  195. package/esm2022/lib/resolvers/portal-report-page.resolver.mjs +0 -37
  196. package/esm2022/lib/resolvers/tile-group-breadcrumb.resolver.mjs +0 -30
  197. package/esm2022/lib/root-page/root-page.component.mjs +0 -21
  198. package/esm2022/lib/root-portal/root-portal.component.mjs +0 -218
  199. package/esm2022/lib/server-connection-error/server-connection-error.component.mjs +0 -19
  200. package/esm2022/lib/services/api.service.mjs +0 -63
  201. package/esm2022/lib/services/audio-recording.service.mjs +0 -95
  202. package/esm2022/lib/services/barsa-dialog.service.mjs +0 -80
  203. package/esm2022/lib/services/barsa-storage.service.mjs +0 -78
  204. package/esm2022/lib/services/breadcrumb.service.mjs +0 -64
  205. package/esm2022/lib/services/column.service.mjs +0 -20
  206. package/esm2022/lib/services/container.service.mjs +0 -69
  207. package/esm2022/lib/services/dynamic-component.service.mjs +0 -55
  208. package/esm2022/lib/services/form-panel.service.mjs +0 -394
  209. package/esm2022/lib/services/form.service.mjs +0 -14
  210. package/esm2022/lib/services/groupby.service.mjs +0 -21
  211. package/esm2022/lib/services/horizontal-layout.service.mjs +0 -16
  212. package/esm2022/lib/services/index.mjs +0 -32
  213. package/esm2022/lib/services/indexeddb.service.mjs +0 -34
  214. package/esm2022/lib/services/layout-main-content.service.mjs +0 -19
  215. package/esm2022/lib/services/layout.service.mjs +0 -42
  216. package/esm2022/lib/services/local-storage.service.mjs +0 -32
  217. package/esm2022/lib/services/log.service.mjs +0 -50
  218. package/esm2022/lib/services/network-status.service.mjs +0 -15
  219. package/esm2022/lib/services/notification-popup.service.mjs +0 -2
  220. package/esm2022/lib/services/notification-sw.service.mjs +0 -180
  221. package/esm2022/lib/services/notification.service.mjs +0 -189
  222. package/esm2022/lib/services/portal.service.mjs +0 -946
  223. package/esm2022/lib/services/prompt-update.service.mjs +0 -56
  224. package/esm2022/lib/services/routing.service.mjs +0 -60
  225. package/esm2022/lib/services/save-scoll-position.service.mjs +0 -29
  226. package/esm2022/lib/services/service-worker-communication.service.mjs +0 -120
  227. package/esm2022/lib/services/tabpage.service.mjs +0 -13
  228. package/esm2022/lib/services/toast.service.mjs +0 -2
  229. package/esm2022/lib/services/ui.service.mjs +0 -23
  230. package/esm2022/lib/services/ulvmain.service.mjs +0 -824
  231. package/esm2022/lib/services/upload.service.mjs +0 -166
  232. package/esm2022/lib/services/video-recording.service.mjs +0 -115
  233. package/esm2022/lib/unlimit-session/unlimit-session.component.mjs +0 -40
  234. package/esm2022/public-api.mjs +0 -42
@@ -1,946 +0,0 @@
1
- import { Inject, Injectable, NgModuleFactory } from '@angular/core';
2
- import { DOCUMENT } from '@angular/common';
3
- import { BehaviorSubject, of, from, forkJoin, fromEvent, Subject, combineLatest } from 'rxjs';
4
- import { tap, map, concatMap, finalize, publishReplay, refCount, exhaustMap, distinctUntilChanged, startWith, debounceTime, filter } from 'rxjs/operators';
5
- import { BarsaApi } from '../abstract-classes/barsa-api';
6
- import { ExecuteDynamicCommand, getComponentDefined, getDeviceIsMobile, getDeviceIsTablet, getHeaderValue, getUniqueId } from '../constants';
7
- import { PortalPageResolver } from '../resolvers/portal-page.resolver';
8
- import { AuthGuard } from '../auth-guard';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "./dynamic-component.service";
11
- import * as i2 from "./api.service";
12
- import * as i3 from "./log.service";
13
- import * as i4 from "./barsa-dialog.service";
14
- import * as i5 from "@angular/router";
15
- import * as i6 from "@angular/common";
16
- import * as i7 from "./local-storage.service";
17
- export class PortalService {
18
- constructor(dcm, apiService, logService, dialogService, compiler, _router, _location, _localStorage, _document) {
19
- this.dcm = dcm;
20
- this.apiService = apiService;
21
- this.logService = logService;
22
- this.dialogService = dialogService;
23
- this.compiler = compiler;
24
- this._router = _router;
25
- this._location = _location;
26
- this._localStorage = _localStorage;
27
- this._document = _document;
28
- this.offsetTop = 0;
29
- this.loginLoading = new BehaviorSubject(false);
30
- this.loaded = false;
31
- this.formPanels = {};
32
- this.cachedImages = {};
33
- this.cachedPageData = {};
34
- this.pages = [];
35
- this.rtlSource = new BehaviorSubject(true);
36
- this.dictionary = {};
37
- this.portalDataSource = new BehaviorSubject(null);
38
- this.openForm$ = new Subject();
39
- this._isAnonumousSource = new BehaviorSubject(true);
40
- this._pushAction$ = new BehaviorSubject(null);
41
- this._deviceSizeSource = new BehaviorSubject(this._initalizeDeviceSize());
42
- this._loggedInSource = new BehaviorSubject(false);
43
- this.routeInitializedSource = new BehaviorSubject(false);
44
- this.dateTextSource = new BehaviorSubject('');
45
- this._navigationStart$ = new BehaviorSubject(null);
46
- this._navigationEnd$ = new BehaviorSubject(null);
47
- this._userPortalSettings$ = new BehaviorSubject({});
48
- this._cssUrlSource = new BehaviorSubject(null);
49
- this._cssVariableUrlSource = new BehaviorSubject(null);
50
- this._cssCustomUrlSource = new BehaviorSubject(null);
51
- this._searchTerm$ = new BehaviorSubject('');
52
- this._windowResize$ = new Subject();
53
- this._deviceLandscape$ = new BehaviorSubject(!window.matchMedia('(orientation: portrait)').matches);
54
- this._standalone$ = new BehaviorSubject(window.matchMedia('(display-mode: standalone)').matches);
55
- this._documentVisibilitychange$ = new Subject();
56
- this.initialize();
57
- this._initLandscape();
58
- this._initStandalone();
59
- this._initVisibilityChange();
60
- this._initPushActions();
61
- }
62
- get isRtl() {
63
- return this.rtlSource.getValue();
64
- }
65
- get userLoggedIn() {
66
- return this._loggedInSource.getValue();
67
- }
68
- get pushAction$() {
69
- return this._pushAction$.asObservable().pipe();
70
- }
71
- get documentVisibilitychange$() {
72
- return this._documentVisibilitychange$.asObservable();
73
- }
74
- get isStandalone() {
75
- return this._standalone$.getValue();
76
- }
77
- get standalone$() {
78
- return this._standalone$.asObservable();
79
- }
80
- get landscape$() {
81
- return this._deviceLandscape$.asObservable();
82
- }
83
- get windowResize$() {
84
- return this._windowResize$.asObservable().pipe(debounceTime(300));
85
- }
86
- get portalData() {
87
- return this.portalDataSource.getValue();
88
- }
89
- get searchTerm$() {
90
- return this._searchTerm$.asObservable();
91
- }
92
- get cssUrl$() {
93
- return this._cssUrlSource.asObservable().pipe(distinctUntilChanged());
94
- }
95
- get cssVariableUrl$() {
96
- return this._cssVariableUrlSource.asObservable().pipe(distinctUntilChanged());
97
- }
98
- get cssCustomUrl$() {
99
- return this._cssCustomUrlSource.asObservable();
100
- }
101
- get userPortalSettings() {
102
- return this._userPortalSettings$.getValue();
103
- }
104
- get userPortalSettings$() {
105
- return this._userPortalSettings$.asObservable();
106
- }
107
- get deviceSize() {
108
- return this._deviceSizeSource.getValue();
109
- }
110
- get isAnonymous$() {
111
- return this._isAnonumousSource.asObservable();
112
- }
113
- get navigationEnd$() {
114
- return this._navigationEnd$.asObservable();
115
- }
116
- get navigationStart$() {
117
- return this._navigationStart$.asObservable();
118
- }
119
- loadMo(id, typedefId) {
120
- return this.apiService.loadPortalPageData(id, typedefId);
121
- }
122
- pushActionNext(pushAction) {
123
- this._localStorage.setItem('pushAction', JSON.stringify(pushAction));
124
- this._pushAction$.next(pushAction);
125
- }
126
- setSearchTerm(term) {
127
- this._searchTerm$.next(term);
128
- }
129
- windowResize() {
130
- this._windowResize$.next();
131
- }
132
- naviationEnd(event) {
133
- this._navigationEnd$.next(event);
134
- }
135
- naviationStart(event) {
136
- this._navigationStart$.next(event);
137
- }
138
- setUserPortalSettings(userPortalSettings) {
139
- const value = this._userPortalSettings$.getValue();
140
- if (userPortalSettings.$TypeDefName) {
141
- value[userPortalSettings.$TypeDefName] = userPortalSettings;
142
- this._userPortalSettings$.next({ ...value });
143
- }
144
- }
145
- setCssUrlTheme(themeUrl, cssVariableUrl) {
146
- this._cssUrlSource.next(themeUrl);
147
- this._cssCustomUrlSource.next(themeUrl);
148
- if (cssVariableUrl) {
149
- this._cssVariableUrlSource.next(cssVariableUrl);
150
- }
151
- }
152
- setData(key, data) {
153
- if (!this.dictionary[key]) {
154
- this.dictionary[key] = new BehaviorSubject(data);
155
- this.dictionary[key].next(data);
156
- }
157
- else {
158
- const oldVal = this.dictionary[key].getValue();
159
- if (oldVal !== data) {
160
- this.dictionary[key].next(data);
161
- }
162
- }
163
- }
164
- getData(key, defaultValue = null) {
165
- if (!this.dictionary[key]) {
166
- this.dictionary[key] = new BehaviorSubject(defaultValue);
167
- }
168
- return this.dictionary[key].asObservable();
169
- }
170
- getDataSync(key, defaultValue = null) {
171
- if (!this.dictionary[key]) {
172
- return defaultValue;
173
- }
174
- return this.dictionary[key].getValue();
175
- }
176
- createForReport(navItem) {
177
- return from(new Promise((resolve, reject) => {
178
- BarsaApi.Ul.UlvMainCtrlr.CreateForReport({}, navItem, (err, result) => {
179
- if (err) {
180
- reject(err);
181
- }
182
- else {
183
- resolve(result);
184
- }
185
- });
186
- }));
187
- }
188
- renderUlvMainUi(navItem, vcr, injector, isReportPage = false) {
189
- return this.createForReport(navItem).pipe(exhaustMap((ulvMainCtrlr) => this.getUlvMainUiComponent(ulvMainCtrlr.Adapter.Control, injector, isReportPage).pipe(tap((ulvManiUiComponent) => vcr.insert(ulvManiUiComponent.hostView)), map(() => ulvMainCtrlr))));
190
- }
191
- getUlvMainUiComponent(customUlvMainUi, injector, isReportPage) {
192
- const customUiSetting = BarsaApi.Common.Util.TryGetValue(customUlvMainUi.Setting, 'CustomUi', null);
193
- const { moduleName, modulePath, componentName, selector } = getComponentDefined(customUlvMainUi, customUiSetting);
194
- return this.getComponent(moduleName, modulePath, componentName, selector, injector).pipe(map((component) => {
195
- const componentInstance = component.instance;
196
- componentInstance.id = customUlvMainUi.id;
197
- componentInstance.context = customUlvMainUi;
198
- componentInstance.isReportPage = isReportPage;
199
- customUlvMainUi.controlUi = componentInstance;
200
- return component;
201
- }));
202
- }
203
- initialize() {
204
- this.deviceSize$ = this._deviceSizeSource.asObservable();
205
- this.portalData$ = this.portalDataSource.asObservable();
206
- this.rtl$ = this.rtlSource.asObservable();
207
- this.userLoggedIn$ = this._loggedInSource
208
- .asObservable()
209
- .pipe(map((isLoggedIn) => isLoggedIn && BarsaApi.LoginFormData.IsAnonymous === false));
210
- this.dirValue$ = this.rtl$.pipe(map((isRtl) => (isRtl ? 'rtl' : 'ltr')));
211
- this.routeInitialized$ = this.routeInitializedSource.asObservable().pipe(distinctUntilChanged());
212
- this._standalone$.asObservable().subscribe((c) => {
213
- if (c) {
214
- this._document.body.classList.add('standalone');
215
- }
216
- else {
217
- this._document.body.classList.add('noStandalone');
218
- }
219
- });
220
- this._deviceLandscape$.asObservable().subscribe((c) => {
221
- if (c) {
222
- this._document.body.classList.add('landscape');
223
- }
224
- });
225
- this._deviceSizeSource.asObservable().subscribe((c) => {
226
- if (c === 's') {
227
- this._document.body.classList.add('smalldevice');
228
- }
229
- });
230
- this.dateText$ = this.dateTextSource.asObservable();
231
- this.portalSettings$ = this.portalDataSource
232
- .asObservable()
233
- .pipe(map((portalData) => (portalData ? portalData.PortalSettings : {})));
234
- fromEvent(window, 'resize')
235
- .pipe(startWith(null), debounceTime(1000))
236
- .subscribe((c) => {
237
- this._windowResize$.next();
238
- this._setDeviceSize();
239
- });
240
- }
241
- _setDeviceSize() {
242
- const deviceSize = this._initalizeDeviceSize();
243
- this._deviceSizeSource.next(deviceSize);
244
- }
245
- _initalizeDeviceSize() {
246
- const _ismobile = getDeviceIsMobile();
247
- if (_ismobile) {
248
- BarsaApi.Bw.IsMobile = true;
249
- }
250
- const _isTablet = getDeviceIsTablet();
251
- let _windoWSize = 's';
252
- if (window.innerWidth <= 600) {
253
- _windoWSize = 's';
254
- }
255
- else if (window.innerWidth > 600 && window.innerWidth <= 992) {
256
- _windoWSize = 'm';
257
- }
258
- else if (window.innerWidth > 992 && window.innerWidth <= 1200) {
259
- _windoWSize = 'l';
260
- }
261
- else {
262
- _windoWSize = 'xl';
263
- }
264
- if (_ismobile && _windoWSize !== 'l' && _windoWSize !== 'xl' && _windoWSize !== 'm') {
265
- return 's';
266
- }
267
- if (_isTablet && _windoWSize !== 'l' && _windoWSize !== 'xl') {
268
- return 'm';
269
- }
270
- return _windoWSize;
271
- }
272
- compileModule(dependency) {
273
- const module$ = this.getModule(dependency);
274
- return module$.pipe(concatMap((modules) => {
275
- const moduleFactory = this.getNgModuleFactory(modules, dependency.name);
276
- return of(moduleFactory);
277
- }));
278
- }
279
- getModule(dependency) {
280
- const { name, kebabName, umd, exportAs } = dependency;
281
- const base = `/assets/modules/${kebabName}/bundles`;
282
- const date = BarsaApi.LoginFormData.abc;
283
- const path = `${base}/${kebabName}.umd.js?t=${date}`;
284
- return of(true).pipe(concatMap(() => {
285
- const modules = this.getRegisteredModules(umd, exportAs, name);
286
- if (modules) {
287
- return of(modules);
288
- }
289
- return this.loadJs$(path).pipe(map(() => this.getRegisteredModules(umd, exportAs, name)));
290
- }));
291
- }
292
- setValueOnObject(path, index, modules, object) {
293
- const splited = path.split('.');
294
- const prop = splited[index];
295
- if (typeof object[prop] === typeof undefined) {
296
- object[prop] = {};
297
- }
298
- if (index === splited.length - 1) {
299
- object[prop] = modules;
300
- return;
301
- }
302
- this.setValueOnObject(path, index + 1, modules, object[prop]);
303
- }
304
- getComponent(moduleName, modulePath, componentName, selector, parentInjector) {
305
- return this.dcm.getComponentBySelector(selector, moduleName, parentInjector);
306
- }
307
- loadJs$(path) {
308
- return from(new Promise((resolve, reject) => {
309
- const script = document.createElement('script');
310
- script.setAttribute('type', 'text/javascript');
311
- script.setAttribute('src', path);
312
- script.onload = () => {
313
- resolve(path);
314
- };
315
- document.getElementsByTagName('head')[0].appendChild(script);
316
- setTimeout(() => {
317
- reject();
318
- }, 5000);
319
- }));
320
- }
321
- ReportExecuteById(reportId) {
322
- const ulvParams = this._getUlvParamsBy('', reportId);
323
- return from(this._reportExecutePromise(ulvParams));
324
- }
325
- ReportExecute(reportName) {
326
- return from(this.ReportExecutePromise(reportName));
327
- }
328
- ReportExecutePromise(reportName) {
329
- const ulvParams = this._getUlvParamsBy(reportName);
330
- return this._reportExecutePromise(ulvParams);
331
- }
332
- _getUlvParamsBy(reportName, reportId) {
333
- return {
334
- Flags: {
335
- Data: 'True',
336
- Extra: 'False',
337
- Search: 'False',
338
- View: 'False'
339
- // General:"False", // ulvmainctrl does not craete ui control raise error
340
- },
341
- ReportName: reportName,
342
- ReportId: reportId,
343
- UsageEnum: 'SystemContainer'
344
- };
345
- }
346
- _reportExecutePromise(ulvParams) {
347
- return new Promise((resolve, reject) => {
348
- BarsaApi.Bw.ExecuteReport({ ulvParams }, (result) => {
349
- resolve(result.Data);
350
- }, (err) => {
351
- reject(err);
352
- });
353
- });
354
- }
355
- addFormPanelCtrlr(id, formpanelCtrlr) {
356
- this.formPanels[id] = formpanelCtrlr;
357
- }
358
- setUserLoginStatus(status) {
359
- this._loggedInSource.next(status);
360
- }
361
- extractAllPages(portalData) {
362
- if (!portalData) {
363
- return;
364
- }
365
- portalData.ChildPageList.MoDataList.forEach((pageData) => {
366
- this.addChildPages(pageData);
367
- });
368
- }
369
- extractAllPages_Old(portalData) {
370
- if (!portalData) {
371
- return;
372
- }
373
- const config = this._router.config;
374
- portalData.ChildPageList.MoDataList.forEach((pageData) => {
375
- const path = pageData.Route.replace('/', '');
376
- config.push(this.createRoute(pageData, path, pageData.HasAuthorize, pageData.PageModule?.$Caption, null, null));
377
- if (pageData.IsDefaultRoute || pageData.IsDefaultRoute === 'True') {
378
- this.defaultRoute = path;
379
- config.push(this.createRoute(pageData, '', false, portalData.PageModule?.$Caption, path, null));
380
- }
381
- this.addChildPages(pageData);
382
- });
383
- this._router.resetConfig(config);
384
- if (this._location.path() === '') {
385
- // this._router.navigate([this.defaultRoute]);
386
- this._router.navigate(['']);
387
- }
388
- // this.routeInitialized();
389
- }
390
- ssoLogin() {
391
- AjaxHelper.AjaxRequest('/api/base/ssologin', null, false, () => {
392
- // console.log(response);
393
- }, () => {
394
- alert('error in sso login.');
395
- }, null);
396
- }
397
- ssoLogout() {
398
- AjaxHelper.AjaxRequest('/api/base/ssologout', null, false, () => {
399
- // console.log(response);
400
- }, () => {
401
- alert('error in sso logout.');
402
- }, null);
403
- }
404
- addChildPages(pageData) {
405
- this.pages.push(pageData);
406
- if (!pageData.ChildPageList?.MoDataList?.length) {
407
- return;
408
- }
409
- pageData.ChildPageList.MoDataList.forEach((childPage) => {
410
- this.addChildPages(childPage);
411
- });
412
- }
413
- /* eslint-disable */
414
- createRoute(pageData, path, hasAuthorized, moduleName, redirectTo, isDynamicRoute) {
415
- return {};
416
- }
417
- createRoute2(pageData, path, hasAuthorized, moduleName, redirectTo = null, isDynamicRoute = false) {
418
- let modulePath = BarsaApi.Common.Util.GetKebabCase(moduleName);
419
- const umd = moduleName;
420
- modulePath = modulePath.substring(1, modulePath.length);
421
- const dynamicRoute = {};
422
- dynamicRoute.path = path;
423
- dynamicRoute.data = { pageData };
424
- if (!isDynamicRoute) {
425
- dynamicRoute.resolve = {
426
- pageData: PortalPageResolver
427
- };
428
- }
429
- if (path === '') {
430
- dynamicRoute.pathMatch = 'full';
431
- }
432
- if (redirectTo) {
433
- dynamicRoute.redirectTo = redirectTo;
434
- }
435
- else {
436
- if (hasAuthorized) {
437
- dynamicRoute.canActivate = [AuthGuard];
438
- }
439
- dynamicRoute.loadChildren = () => {
440
- const dependencies = JSON.parse(pageData.Dependencies); // eval(pageData.Dependencies);
441
- const pageLibrary = {
442
- name: moduleName,
443
- kebabName: modulePath,
444
- umd,
445
- exportAs: [moduleName]
446
- };
447
- const dependencies$ = from(dependencies).pipe(concatMap((dependency) => this.compileModule(dependency)));
448
- return forkJoin([dependencies$]).pipe(concatMap(() => this.getModule(pageLibrary)), map((modules) => modules[moduleName + 'Module']), tap(() => this.routeInitialized()));
449
- };
450
- }
451
- return dynamicRoute;
452
- }
453
- routeInitialized() {
454
- this.routeInitializedSource.next(true);
455
- }
456
- loginByAnonymous() {
457
- this.loginLoading.next(true);
458
- return this.apiService.loginPortal().pipe(map((result) => {
459
- if (typeof result === 'object' && result !== null) {
460
- this.logService.debug(result);
461
- window.localStorage.setItem(BarsaApi.LoginAction.token2StorageKey, result.data.sth);
462
- return true;
463
- }
464
- else {
465
- return false;
466
- }
467
- }), finalize(() => {
468
- this.loginLoading.next(false);
469
- }));
470
- }
471
- getPageData(url, isRoot) {
472
- if (isRoot || url === '' || url === '/') {
473
- return this.portalData$;
474
- }
475
- if (url.indexOf('?') > -1) {
476
- url = url.substr(0, url.indexOf('?'));
477
- }
478
- if (this.cachedPageData[url]) {
479
- return this.cachedPageData[url];
480
- }
481
- const pageData = this.findPageByRoute(url);
482
- this.cachedPageData[url] = this.apiService
483
- .loadPortalPageData(pageData?.Id, this.portalDataSource.getValue()?.ChildPageList.TypeDefId)
484
- .pipe(map((pageMo) => pageMo.Data.Mo), tap((pageMo) => {
485
- this.addChildRoute(pageMo, pageMo.ChildPageList);
486
- this.addChildPages(pageMo);
487
- }), publishReplay(1), refCount());
488
- // this.cachedPageData[url] = this.portalData$.pipe(
489
- // filter((portalData) => portalData != null),
490
- // map((portalData) => ),
491
- // concatMap((pageData) => {
492
- // return
493
- // }),
494
- // tap(pageData=>{})
495
- // );
496
- return this.cachedPageData[url];
497
- }
498
- resolveData(routePageData) {
499
- // const pageData = this.pages.find((c) => c.Route === routePageData.Route && c.Module === routePageData.Module);
500
- const pageData = this.pages.find((c) => c.Route === routePageData.Route);
501
- if (!pageData) {
502
- return of(null);
503
- }
504
- const id = pageData.Id;
505
- if (this.cachedPageData[id]) {
506
- return this.cachedPageData[id];
507
- }
508
- this.cachedPageData[id] = this.apiService
509
- .loadPortalPageData(id, this.portalDataSource.getValue()?.ChildPageList.TypeDefId)
510
- .pipe(map((pageMo) => pageMo.Data.Mo), tap((pageMo) => {
511
- this.addChildRoute(pageMo, pageMo.ChildPageList);
512
- this.addChildPages(pageMo);
513
- }), publishReplay(1), refCount());
514
- // this.cachedPageData[url] = this.portalData$.pipe(
515
- // filter((portalData) => portalData != null),
516
- // map((portalData) => ),
517
- // concatMap((pageData) => {
518
- // return
519
- // }),
520
- // tap(pageData=>{})
521
- // );
522
- return this.cachedPageData[id];
523
- }
524
- addChildRoute(pageMo, ChildPageList) {
525
- return;
526
- }
527
- addChildRoute_Old(pageMo, ChildPageList) {
528
- if (!ChildPageList?.MoDataList?.length) {
529
- return;
530
- }
531
- const config = this._router.config;
532
- const parentPath = pageMo.Route.replace('/', '');
533
- const parentRoute = config.find((c) => (c.path = parentPath));
534
- const children = [];
535
- if (parentRoute) {
536
- ChildPageList.MoDataList.forEach((child) => {
537
- const path = child.Route.replace('/', '');
538
- const childroute = this.createRoute(child, path, child.HasAuthorize, child.PageModule?.$Caption, null, true);
539
- children.push(childroute);
540
- });
541
- // debugger;
542
- parentRoute._loadedConfig.routes[0].children = children;
543
- this._router.resetConfig(config);
544
- }
545
- }
546
- loadPortalData_Old1() {
547
- return this.apiService.loadPortal(BarsaApi.LoginFormData.PortalId, BarsaApi.LoginFormData.PortalTypeDefId).pipe(tap((portalSetting) => {
548
- const portalData = portalSetting.Data.Mo;
549
- this.extractAllPages(portalData);
550
- this.portalDataSource.next(portalData);
551
- }), concatMap(() => from(this.loadSystem())), tap((all) => this.dateTextSource.next(BarsaApi.LoginFormData.DateText)));
552
- }
553
- loadPortalDataSync_Old2() {
554
- const portalSetting = this.apiService.loadPortalSync(BarsaApi.LoginFormData.PortalId, BarsaApi.LoginFormData.PortalTypeDefId);
555
- const portalData = portalSetting.Data.Mo;
556
- this.extractAllPages(portalData);
557
- this.portalDataSource.next(portalData);
558
- this.loadSystem();
559
- this.dateTextSource.next(BarsaApi.LoginFormData.DateText);
560
- }
561
- _getDefaultPage(c) {
562
- if (!c || !c.length) {
563
- return null;
564
- }
565
- let x = c.find((c) => c.IsDefaultRoute === 'True');
566
- if (x) {
567
- return x;
568
- }
569
- let x2 = null;
570
- c.forEach((element) => {
571
- if (x2) {
572
- return;
573
- }
574
- x2 = this._getDefaultPage(element.ChildPageList?.MoDataList);
575
- });
576
- return x2;
577
- }
578
- loadPortalDataSync() {
579
- if (BarsaApi.LoginFormData?.error?.userMessage) {
580
- return;
581
- }
582
- const portalSettingStr = BarsaApi.Bw.RunBlMethod('GetPortal', BarsaApi.LoginFormData.PortalId);
583
- const portalSetting = BarsaApi.Ext.decode(portalSettingStr);
584
- const portalData = portalSetting;
585
- if (portalData) {
586
- const defaultPage = this._getDefaultPage(portalData.ChildPageList.MoDataList);
587
- this.DefaultPage = defaultPage;
588
- let configRoute = this._router.config;
589
- const removePaged = [];
590
- configRoute.forEach((c, index) => {
591
- const route = '/' + c.path;
592
- if (c.path !== '' && portalData.ChildPageList.MoDataList.findIndex((d) => d.Route === route) === -1) {
593
- removePaged.push(c);
594
- }
595
- });
596
- const pathToRemove = removePaged.map((d) => d.path);
597
- configRoute = configRoute.filter((c) => pathToRemove.indexOf(c.path) === -1);
598
- if (defaultPage != null) {
599
- const defaultPageRoute = defaultPage.Route.replace('/', '');
600
- const defaultPath = configRoute.find((c) => c.path === '');
601
- defaultPath && (defaultPath.redirectTo = defaultPageRoute);
602
- configRoute.push({ path: '**', redirectTo: defaultPageRoute });
603
- // const notFoundPath = configRoute.find((c) => c.path === '**');
604
- // notFoundPath && (notFoundPath.redirectTo = defaultPage.Route.replace('/', ''));
605
- this._router.resetConfig(configRoute);
606
- }
607
- }
608
- this.extractAllPages(portalData);
609
- this.portalDataSource.next(portalData);
610
- this.dateTextSource.next(BarsaApi.LoginFormData.DateText);
611
- }
612
- ShowForm(e) {
613
- BarsaApi.Bw.Form.Show({
614
- Mo: e.mo,
615
- MoContext: {
616
- ViewName: e.nama
617
- },
618
- EventHandlers: {
619
- AfterReady: function (sender, ee) {
620
- //do something here
621
- e.afterReady?.(ee);
622
- }
623
- }
624
- });
625
- }
626
- get loginRoute$() {
627
- return this.portalData$.pipe(map((portalData) => {
628
- const loginPage = portalData?.ChildPageList.MoDataList.find((c) => c.IsLoginRoute === 'True');
629
- return loginPage?.Route || 'login';
630
- }));
631
- }
632
- RunBlMethodAsync(methodName, parameters) {
633
- return new Promise((resolve, reject) => {
634
- BarsaApi.Bw.RunBlMethodAsync({
635
- Parameters: parameters,
636
- Method: methodName,
637
- SuccessFn: (data) => {
638
- resolve(data);
639
- },
640
- FailFn: (err) => {
641
- reject(err);
642
- }
643
- });
644
- });
645
- }
646
- ExecuteNotificationAction(id, actionTitle) {
647
- BarsaApi.Bw.RunBlMethodAsync({
648
- Parameters: [id, actionTitle],
649
- Method: 'ExecuteNotificationAction',
650
- SuccessFn: (e) => {
651
- this._removePushAction();
652
- if (e.DynamicCommandId) {
653
- ExecuteDynamicCommand({ Id: e.DynamicCommandId }, e.Mo);
654
- }
655
- else if (e.ShowFormSetting) {
656
- const { MoId, ViewName } = e.ShowFormSetting;
657
- setTimeout(() => BarsaApi.Bw.Form.Show({ MoId, MoContext: { ViewName } }), 500);
658
- }
659
- },
660
- FailFn: (e) => {
661
- this._removePushAction();
662
- this.logService.error(e);
663
- }
664
- });
665
- }
666
- loadUserPortalSetting() {
667
- if (BarsaApi.LoginFormData?.error?.userMessage) {
668
- return;
669
- }
670
- const ulvParams = {
671
- Flags: {
672
- Data: 'True',
673
- Extra: 'False',
674
- Search: 'False',
675
- View: 'False'
676
- // General:"False", // ulvmainctrl does not craete ui control raise error
677
- },
678
- ReportName: '_تنظيمات_پايه_پورتال',
679
- UsageEnum: 'SystemContainer'
680
- };
681
- BarsaApi.Bw.ExecuteReport({ ulvParams }, (result) => {
682
- const molist = result.Data.MoDataList;
683
- const userPortalSetting = {};
684
- molist.forEach((mo) => {
685
- if (mo.Inheritance && mo.Inheritance.$TypeDefName) {
686
- userPortalSetting[mo.Inheritance.$TypeDefName] = mo.Inheritance;
687
- }
688
- });
689
- this._userPortalSettings$.next(userPortalSetting);
690
- }, (err) => {
691
- this.logService.error(err);
692
- });
693
- // BarsaApi.Bw.RunBlMethodAsync({
694
- // Parameters: [],
695
- // Method: 'GetUserPortalSettings',
696
- // SuccessFn: (userPortalSetting: MetaobjectDataModel) => {
697
- // },
698
- // FailFn: (e) => {
699
- // this.logService.error(e);
700
- // }
701
- // });
702
- }
703
- loadServerStartupData() {
704
- return new Promise((resolve, reject) => {
705
- if (!BarsaApi.Offline.hasInit) {
706
- BarsaApi.Offline.afterInitCallback = () => {
707
- this._loadServerStartupData(resolve, reject);
708
- };
709
- }
710
- else
711
- this._loadServerStartupData(resolve, reject);
712
- });
713
- }
714
- _loadServerStartupData(resolve, reject) {
715
- const ajaxHelper = typeof AjaxHelper2 === 'undefined' ? AjaxHelper : AjaxHelper2;
716
- ajaxHelper.AjaxRequest('/api/base/ServerStartupData', {}, false, (response) => {
717
- let dataText = response.responseText;
718
- dataText = dataText.replace(/'/g, '"');
719
- dataText = BarsaApi.Common.Util.ReplaceArabicCharchter(dataText);
720
- BarsaApi.LoginForm.PortalInitialize(dataText);
721
- if (typeof BarsaApi.LoginFormData.IsAnonymous === 'undefined') {
722
- if (BarsaApi.LoginFormData?.error?.userMessage) {
723
- BarsaApi.Bw.Msg.Error(BarsaApi.LoginFormData?.error?.userMessage);
724
- }
725
- else {
726
- BarsaApi.Bw.Msg.Error('امکان ورود با کاربر پورتال وجود ندارد.');
727
- }
728
- }
729
- if (BarsaApi.LoginFormData.IsServiceDesk) {
730
- const config = this._router.config;
731
- config[0].redirectTo = 'servicedesk';
732
- this._router.resetConfig(config);
733
- }
734
- this._initAfterLoginFormData();
735
- resolve(BarsaApi.LoginFormData);
736
- }, () => {
737
- alert('error in get server startup data.');
738
- reject('error in get server startup data.');
739
- }, null);
740
- }
741
- ShowFormPanelControl(formpanelCtrlr, router, activatedRoute, dialogComponent, isPage, vcr, isReload = false) {
742
- if (!formpanelCtrlr) {
743
- console.warn('form panel controler is undefined!');
744
- return;
745
- }
746
- const mo = formpanelCtrlr.Mo;
747
- const headerLayout = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.HeaderLayout', null);
748
- let isModal = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.ExtraJsonProp.Modal', false);
749
- isModal =
750
- isModal ||
751
- BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.CustomUi.Parameters.IsModal', false);
752
- const modalSetting = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.CustomUi.Parameters.ModalSetting', null);
753
- if (modalSetting) {
754
- isModal = true;
755
- }
756
- formpanelCtrlr.Setting.IsModal = isModal;
757
- formpanelCtrlr.IsModal = isModal;
758
- const breadCrumb = getHeaderValue(headerLayout?.BreadCrumb);
759
- const queryParams = {
760
- id: mo.$State === 'New' ? '0' : mo.Id,
761
- tyid: mo.$TypeDefId,
762
- tycp: mo.$Caption ? mo.$Caption : null,
763
- repid: mo.$ReportId,
764
- vid: formpanelCtrlr?.Setting?.View?.TypeViewId,
765
- bc: breadCrumb ? breadCrumb : mo.$State === 'New' ? mo.$TypeDefName : mo.$Caption
766
- };
767
- const id = getUniqueId(4);
768
- this.addFormPanelCtrlr(id, formpanelCtrlr);
769
- this.openForm$.next(); // event emit for other components to know form open
770
- if (isModal) {
771
- this.dialogService.showForm(dialogComponent, {
772
- ...queryParams,
773
- formpanelCtrlr
774
- }, vcr);
775
- }
776
- else {
777
- const state = { formPanelCtrlrId: id };
778
- if (isPage) {
779
- router.navigate([
780
- 'form',
781
- {
782
- outlets: {
783
- main: ['show', { ...queryParams, formPanelCtrlrId: id, isFirst: true }]
784
- }
785
- }
786
- ], {
787
- state,
788
- relativeTo: activatedRoute,
789
- skipLocationChange: isReload
790
- });
791
- }
792
- else {
793
- router.navigate([
794
- 'popup',
795
- {
796
- outlets: {
797
- main: ['show', { ...queryParams, formPanelCtrlrId: id }]
798
- }
799
- }
800
- ], {
801
- relativeTo: activatedRoute,
802
- state,
803
- queryParamsHandling: 'preserve',
804
- skipLocationChange: isReload
805
- });
806
- }
807
- }
808
- }
809
- loadSystem(id = 0) {
810
- if (BarsaApi.LoginFormData?.error?.userMessage) {
811
- return Promise.reject(BarsaApi.LoginFormData?.error?.userMessage);
812
- }
813
- if (id === 0) {
814
- BarsaApi.Ul.ApplicationCtrlr.DefaultSystemId = null;
815
- }
816
- return new Promise((resolve, reject) => {
817
- BarsaApi.Ul.ApplicationCtrlr._loadSystem(id, true, (data) => {
818
- resolve(data);
819
- }, (err) => {
820
- reject(err);
821
- });
822
- });
823
- }
824
- _removePushAction() {
825
- const pushActionStr = this._localStorage.getItem('pushAction');
826
- if (pushActionStr) {
827
- this._localStorage.remove('pushAction');
828
- const pushAction = JSON.parse(pushActionStr);
829
- this._pushAction$.next(pushAction);
830
- }
831
- }
832
- _checkLocalStoragePushAction() {
833
- const pushActionStr = this._localStorage.getItem('pushAction');
834
- if (pushActionStr) {
835
- this._localStorage.remove('pushAction');
836
- const pushAction = JSON.parse(pushActionStr);
837
- this._pushAction$.next(pushAction);
838
- }
839
- }
840
- _initAfterLoginFormData() {
841
- this.rtlSource.next(BarsaApi.LoginFormData.IsRtl);
842
- this._isAnonumousSource.next(BarsaApi.LoginFormData.IsAnonymous);
843
- this.setUserLoginStatus(BarsaApi.LoginFormData.IsUserLoggedIn);
844
- this._loggedInSource.next(this._loggedInSource.getValue() && BarsaApi.LoginFormData.IsAnonymous === false);
845
- }
846
- _initVisibilityChange() {
847
- document.addEventListener('visibilitychange', () => {
848
- if (document.visibilityState === 'visible') {
849
- this._documentVisibilitychange$.next(false);
850
- }
851
- else {
852
- this._documentVisibilitychange$.next(true);
853
- }
854
- });
855
- }
856
- _initStandalone() {
857
- window.matchMedia('(display-mode: standalone)').addEventListener('change', (e) => {
858
- const isMatch = e.matches;
859
- if (isMatch) {
860
- this._standalone$.next(true);
861
- }
862
- else {
863
- this._standalone$.next(false);
864
- }
865
- });
866
- }
867
- _initPushActions() {
868
- this._checkLocalStoragePushAction();
869
- combineLatest([this.userLoggedIn$, this.pushAction$])
870
- .pipe(
871
- // withLatestFrom(this._portalService.pushAction$),
872
- // filter(([userLoggedin, action]) => userLoggedin)
873
- filter(([userLoggedin, pushAction]) => userLoggedin))
874
- .subscribe(([userLoggedin, pushAction]) => {
875
- if (pushAction != null) {
876
- if (!pushAction.notificationTag) {
877
- if (pushAction.moid && pushAction.tpid && pushAction.action == 'show') {
878
- setTimeout(() => BarsaApi.Bw.Form.Show({ MoId: pushAction.moid }), 500);
879
- }
880
- }
881
- else {
882
- this.ExecuteNotificationAction(pushAction.notificationTag, pushAction.action);
883
- }
884
- }
885
- });
886
- }
887
- _initLandscape() {
888
- window.matchMedia('(orientation: portrait)').addEventListener('change', (e) => {
889
- const isMatch = e.matches;
890
- if (isMatch) {
891
- this._deviceLandscape$.next(false); // portrait
892
- }
893
- else {
894
- this._deviceLandscape$.next(true); // landscape
895
- }
896
- });
897
- }
898
- findPageByRoute(url) {
899
- const findedPage = this.pages.find((c) => c.Route === url);
900
- return findedPage || null;
901
- }
902
- getNgModuleFactory(modules, moduleName) {
903
- const moduleClass = modules[moduleName + 'Module'];
904
- let moduleFactory;
905
- if (moduleClass instanceof NgModuleFactory) {
906
- moduleFactory = moduleClass;
907
- }
908
- else {
909
- const compiled = this.compiler.compileModuleAndAllComponentsSync(moduleClass);
910
- moduleFactory = compiled.ngModuleFactory;
911
- }
912
- return moduleFactory;
913
- }
914
- getRegisteredModules(umd, exportAs, moduleName) {
915
- let modules;
916
- if (umd !== '') {
917
- modules = window;
918
- umd.split('.').forEach((c) => {
919
- if (typeof modules !== typeof undefined) {
920
- modules = modules[c];
921
- }
922
- });
923
- }
924
- else {
925
- modules = window[moduleName];
926
- }
927
- if (exportAs.length > 0 && modules) {
928
- exportAs.forEach((c) => {
929
- this.setValueOnObject(c, 0, modules, window);
930
- });
931
- }
932
- return modules;
933
- }
934
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PortalService, deps: [{ token: i1.DynamicComponentService }, { token: i2.ApiService }, { token: i3.LogService }, { token: i4.BarsaDialogService }, { token: i0.Compiler }, { token: i5.Router }, { token: i6.Location }, { token: i7.LocalStorageService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
935
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PortalService, providedIn: 'root' }); }
936
- }
937
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PortalService, decorators: [{
938
- type: Injectable,
939
- args: [{
940
- providedIn: 'root'
941
- }]
942
- }], ctorParameters: () => [{ type: i1.DynamicComponentService }, { type: i2.ApiService }, { type: i3.LogService }, { type: i4.BarsaDialogService }, { type: i0.Compiler }, { type: i5.Router }, { type: i6.Location }, { type: i7.LocalStorageService }, { type: Document, decorators: [{
943
- type: Inject,
944
- args: [DOCUMENT]
945
- }] }] });
946
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1ub3Zpbi1yYXktY29yZS9zcmMvbGliL3NlcnZpY2VzL3BvcnRhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxNQUFNLEVBQ04sVUFBVSxFQUVWLGVBQWUsRUFHbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRXJELE9BQU8sRUFBYyxlQUFlLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUcsT0FBTyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsU0FBUyxFQUNULFFBQVEsRUFDUixhQUFhLEVBQ2IsUUFBUSxFQUNSLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ1QsTUFBTSxnQkFBZ0IsQ0FBQztBQWN4QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHekQsT0FBTyxFQUNILHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsV0FBVyxFQUNkLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7OztBQVcxQyxNQUFNLE9BQU8sYUFBYTtJQTJDdEIsWUFDWSxHQUE0QixFQUM1QixVQUFzQixFQUN0QixVQUFzQixFQUN0QixhQUFpQyxFQUNqQyxRQUFrQixFQUNsQixPQUFlLEVBQ2YsU0FBbUIsRUFDbkIsYUFBa0MsRUFDaEIsU0FBbUI7UUFS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LE1BQU07OzRGQUVULGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFxRFEsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBpbGVyLFxyXG4gICAgQ29tcG9uZW50UmVmLFxyXG4gICAgSW5qZWN0LFxyXG4gICAgSW5qZWN0YWJsZSxcclxuICAgIEluamVjdG9yLFxyXG4gICAgTmdNb2R1bGVGYWN0b3J5LFxyXG4gICAgVHlwZSxcclxuICAgIFZpZXdDb250YWluZXJSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRE9DVU1FTlQsIExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25TdGFydCwgUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgb2YsIGZyb20sIGZvcmtKb2luLCBmcm9tRXZlbnQsIFN1YmplY3QsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICAgIHRhcCxcclxuICAgIG1hcCxcclxuICAgIGNvbmNhdE1hcCxcclxuICAgIGZpbmFsaXplLFxyXG4gICAgcHVibGlzaFJlcGxheSxcclxuICAgIHJlZkNvdW50LFxyXG4gICAgZXhoYXVzdE1hcCxcclxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gICAgc3RhcnRXaXRoLFxyXG4gICAgZGVib3VuY2VUaW1lLFxyXG4gICAgZmlsdGVyICAgIFxyXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBBYmJyZXZhdGlvbkRldmljZVNpemUsXHJcbiAgICBMb2dpblJlc3VsdCxcclxuICAgIE1ldGFvYmplY3REYXRhTW9kZWwsXHJcbiAgICBNb0ZvclJlcG9ydE1vZGVsLFxyXG4gICAgUGFnZURhdGFNb2RlbCxcclxuICAgIFBvcnRhbERhdGFNb2RlbCxcclxuICAgIFJlcG9ydE1vZGVsLFxyXG4gICAgVWx2UGFyYW1UeXBlXHJcbn0gZnJvbSAnLi4vYWJzdHJhY3QtY2xhc3Nlcy9tb2RlbHMnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi9hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuL2xvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFyc2FBcGkgfSBmcm9tICcuLi9hYnN0cmFjdC1jbGFzc2VzL2JhcnNhLWFwaSc7XHJcbmltcG9ydCB7IEJhcnNhRGlhbG9nU2VydmljZSB9IGZyb20gJy4vYmFyc2EtZGlhbG9nLnNlcnZpY2UnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIEV4ZWN1dGVEeW5hbWljQ29tbWFuZCxcclxuICAgIGdldENvbXBvbmVudERlZmluZWQsXHJcbiAgICBnZXREZXZpY2VJc01vYmlsZSxcclxuICAgIGdldERldmljZUlzVGFibGV0LFxyXG4gICAgZ2V0SGVhZGVyVmFsdWUsXHJcbiAgICBnZXRVbmlxdWVJZFxyXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IFBvcnRhbFBhZ2VSZXNvbHZlciB9IGZyb20gJy4uL3Jlc29sdmVycy9wb3J0YWwtcGFnZS5yZXNvbHZlcic7XHJcbmltcG9ydCB7IEF1dGhHdWFyZCB9IGZyb20gJy4uL2F1dGgtZ3VhcmQnO1xyXG5pbXBvcnQgeyBEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4vZHluYW1pYy1jb21wb25lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbC1zdG9yYWdlLnNlcnZpY2UnO1xyXG5cclxuZGVjbGFyZSBsZXQgQWpheEhlbHBlcjogYW55O1xyXG5kZWNsYXJlIGxldCBBamF4SGVscGVyMjogYW55O1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQb3J0YWxTZXJ2aWNlIHtcclxuICAgIHB1YmxpYyBvZmZzZXRUb3AgPSAwO1xyXG5cclxuICAgIGxvZ2luTG9hZGluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICAgIGxvYWRlZCA9IGZhbHNlO1xyXG4gICAgZm9ybVBhbmVsczogYW55ID0ge307XHJcbiAgICBjYWNoZWRJbWFnZXM6IGFueSA9IHt9O1xyXG4gICAgZGF0ZVRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz47XHJcbiAgICBkZWZhdWx0Um91dGU6IHN0cmluZztcclxuICAgIGNhY2hlZFBhZ2VEYXRhOiB7IFtrZXk6IHN0cmluZ106IE9ic2VydmFibGU8UGFnZURhdGFNb2RlbD4gfSA9IHt9O1xyXG4gICAgcGFnZXM6IFBhZ2VEYXRhTW9kZWxbXSA9IFtdO1xyXG4gICAgcnRsU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcclxuICAgIHVzZXJMb2dnZWRJbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgICBkaWN0aW9uYXJ5OiB7IFtrZXk6IHN0cmluZ106IEJlaGF2aW9yU3ViamVjdDxhbnk+IH0gPSB7fTtcclxuICAgIHBvcnRhbERhdGFTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBvcnRhbERhdGFNb2RlbCB8IG51bGw+KG51bGwpO1xyXG4gICAgcG9ydGFsU2V0dGluZ3MkOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+O1xyXG4gICAgcG9ydGFsRGF0YSQ6IE9ic2VydmFibGU8UG9ydGFsRGF0YU1vZGVsIHwgbnVsbD47XHJcbiAgICBkZXZpY2VTaXplJDogT2JzZXJ2YWJsZTxBYmJyZXZhdGlvbkRldmljZVNpemU+O1xyXG4gICAgcnRsJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIGRpclZhbHVlJDogT2JzZXJ2YWJsZTwncnRsJyB8ICdsdHInPjtcclxuICAgIHJvdXRlSW5pdGlhbGl6ZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgb3BlbkZvcm0kID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIF9pc0Fub251bW91c1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XHJcbiAgICBfcHVzaEFjdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgbm90aWZpY2F0aW9uVGFnOiBzdHJpbmc7IGFjdGlvbjogc3RyaW5nOyBtb2lkOiBzdHJpbmc7IHRwaWQ6IHN0cmluZyB9IHwgbnVsbD4oXHJcbiAgICAgICAgbnVsbFxyXG4gICAgKTtcclxuICAgIHByaXZhdGUgX2RldmljZVNpemVTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFiYnJldmF0aW9uRGV2aWNlU2l6ZT4odGhpcy5faW5pdGFsaXplRGV2aWNlU2l6ZSgpKTtcclxuICAgIHByaXZhdGUgX2xvZ2dlZEluU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7ICAgIFxyXG4gICAgcHJpdmF0ZSByb3V0ZUluaXRpYWxpemVkU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgICBwcml2YXRlIGRhdGVUZXh0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcclxuICAgIHByaXZhdGUgX25hdmlnYXRpb25TdGFydCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE5hdmlnYXRpb25TdGFydCB8IG51bGw+KG51bGwpO1xyXG4gICAgcHJpdmF0ZSBfbmF2aWdhdGlvbkVuZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE5hdmlnYXRpb25FbmQgfCBudWxsPihudWxsKTtcclxuICAgIHByaXZhdGUgX3VzZXJQb3J0YWxTZXR0aW5ncyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlY29yZDxzdHJpbmcsIE1ldGFvYmplY3REYXRhTW9kZWw+Pih7fSk7XHJcbiAgICBwcml2YXRlIF9jc3NVcmxTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNhZmVSZXNvdXJjZVVybCB8IG51bGw+KG51bGwpO1xyXG4gICAgcHJpdmF0ZSBfY3NzVmFyaWFibGVVcmxTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNhZmVSZXNvdXJjZVVybCB8IG51bGw+KG51bGwpO1xyXG4gICAgcHJpdmF0ZSBfY3NzQ3VzdG9tVXJsU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYWZlUmVzb3VyY2VVcmwgfCBudWxsPihudWxsKTtcclxuICAgIHByaXZhdGUgX3NlYXJjaFRlcm0kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcclxuICAgIHByaXZhdGUgX3dpbmRvd1Jlc2l6ZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfZGV2aWNlTGFuZHNjYXBlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oIXdpbmRvdy5tYXRjaE1lZGlhKCcob3JpZW50YXRpb246IHBvcnRyYWl0KScpLm1hdGNoZXMpO1xyXG4gICAgcHJpdmF0ZSBfc3RhbmRhbG9uZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHdpbmRvdy5tYXRjaE1lZGlhKCcoZGlzcGxheS1tb2RlOiBzdGFuZGFsb25lKScpLm1hdGNoZXMpO1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRWaXNpYmlsaXR5Y2hhbmdlJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgICBEZWZhdWx0UGFnZTogTWV0YW9iamVjdERhdGFNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGRjbTogRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IEJhcnNhRGlhbG9nU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNvbXBpbGVyOiBDb21waWxlcixcclxuICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICBwcml2YXRlIF9sb2NhdGlvbjogTG9jYXRpb24sXHJcbiAgICAgICAgcHJpdmF0ZSBfbG9jYWxTdG9yYWdlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgdGhpcy5faW5pdExhbmRzY2FwZSgpO1xyXG4gICAgICAgIHRoaXMuX2luaXRTdGFuZGFsb25lKCk7XHJcbiAgICAgICAgdGhpcy5faW5pdFZpc2liaWxpdHlDaGFuZ2UoKTtcclxuICAgICAgICB0aGlzLl9pbml0UHVzaEFjdGlvbnMoKTtcclxuICAgIH1cclxuICAgIGdldCBpc1J0bCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ydGxTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgIH1cclxuICAgIGdldCB1c2VyTG9nZ2VkSW4oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvZ2dlZEluU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgcHVzaEFjdGlvbiQoKTogT2JzZXJ2YWJsZTx7IG5vdGlmaWNhdGlvblRhZzogc3RyaW5nOyBtb2lkOiBzdHJpbmc7IHRwaWQ6IHN0cmluZzsgYWN0aW9uOiBzdHJpbmcgfSB8IG51bGw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaEFjdGlvbiQuYXNPYnNlcnZhYmxlKCkucGlwZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGRvY3VtZW50VmlzaWJpbGl0eWNoYW5nZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvY3VtZW50VmlzaWJpbGl0eWNoYW5nZSQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgaXNTdGFuZGFsb25lKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFuZGFsb25lJC5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHN0YW5kYWxvbmUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFuZGFsb25lJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldCBsYW5kc2NhcGUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZXZpY2VMYW5kc2NhcGUkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHdpbmRvd1Jlc2l6ZSQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpbmRvd1Jlc2l6ZSQuYXNPYnNlcnZhYmxlKCkucGlwZShkZWJvdW5jZVRpbWUoMzAwKSk7XHJcbiAgICB9XHJcbiAgICBnZXQgcG9ydGFsRGF0YSgpOiBQb3J0YWxEYXRhTW9kZWwgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3J0YWxEYXRhU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgc2VhcmNoVGVybSQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoVGVybSQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgY3NzVXJsJCgpOiBPYnNlcnZhYmxlPFNhZmVSZXNvdXJjZVVybCB8IG51bGw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY3NzVXJsU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XHJcbiAgICB9XHJcbiAgICBnZXQgY3NzVmFyaWFibGVVcmwkKCk6IE9ic2VydmFibGU8U2FmZVJlc291cmNlVXJsIHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jc3NWYXJpYWJsZVVybFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNzc0N1c3RvbVVybCQoKTogT2JzZXJ2YWJsZTxTYWZlUmVzb3VyY2VVcmwgfCBudWxsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nzc0N1c3RvbVVybFNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldCB1c2VyUG9ydGFsU2V0dGluZ3MoKTogUmVjb3JkPHN0cmluZywgTWV0YW9iamVjdERhdGFNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyUG9ydGFsU2V0dGluZ3MkLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgdXNlclBvcnRhbFNldHRpbmdzJCgpOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIE1ldGFvYmplY3REYXRhTW9kZWw+PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJQb3J0YWxTZXR0aW5ncyQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgZGV2aWNlU2l6ZSgpOiBBYmJyZXZhdGlvbkRldmljZVNpemUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZXZpY2VTaXplU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgaXNBbm9ueW1vdXMkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0Fub251bW91c1NvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldCBuYXZpZ2F0aW9uRW5kJCgpOiBPYnNlcnZhYmxlPE5hdmlnYXRpb25FbmQgfCBudWxsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25FbmQkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IG5hdmlnYXRpb25TdGFydCQoKTogT2JzZXJ2YWJsZTxOYXZpZ2F0aW9uU3RhcnQgfCBudWxsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TdGFydCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGxvYWRNbyhpZDogc3RyaW5nLCB0eXBlZGVmSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5sb2FkUG9ydGFsUGFnZURhdGEoaWQsIHR5cGVkZWZJZCk7XHJcbiAgICB9XHJcbiAgICBwdXNoQWN0aW9uTmV4dChwdXNoQWN0aW9uOiB7IG5vdGlmaWNhdGlvblRhZzsgbW9pZDsgdHBpZDsgYWN0aW9uIH0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncHVzaEFjdGlvbicsIEpTT04uc3RyaW5naWZ5KHB1c2hBY3Rpb24pKTtcclxuICAgICAgICB0aGlzLl9wdXNoQWN0aW9uJC5uZXh0KHB1c2hBY3Rpb24pO1xyXG4gICAgfVxyXG4gICAgc2V0U2VhcmNoVGVybSh0ZXJtOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hUZXJtJC5uZXh0KHRlcm0pO1xyXG4gICAgfVxyXG4gICAgd2luZG93UmVzaXplKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3dpbmRvd1Jlc2l6ZSQubmV4dCgpO1xyXG4gICAgfVxyXG4gICAgbmF2aWF0aW9uRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbmF2aWdhdGlvbkVuZCQubmV4dChldmVudCk7XHJcbiAgICB9XHJcbiAgICBuYXZpYXRpb25TdGFydChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbmF2aWdhdGlvblN0YXJ0JC5uZXh0KGV2ZW50KTtcclxuICAgIH1cclxuICAgIHNldFVzZXJQb3J0YWxTZXR0aW5ncyh1c2VyUG9ydGFsU2V0dGluZ3M6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3VzZXJQb3J0YWxTZXR0aW5ncyQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAodXNlclBvcnRhbFNldHRpbmdzLiRUeXBlRGVmTmFtZSkge1xyXG4gICAgICAgICAgICB2YWx1ZVt1c2VyUG9ydGFsU2V0dGluZ3MuJFR5cGVEZWZOYW1lXSA9IHVzZXJQb3J0YWxTZXR0aW5ncztcclxuICAgICAgICAgICAgdGhpcy5fdXNlclBvcnRhbFNldHRpbmdzJC5uZXh0KHsgLi4udmFsdWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2V0Q3NzVXJsVGhlbWUodGhlbWVVcmw6IFNhZmVSZXNvdXJjZVVybCwgY3NzVmFyaWFibGVVcmw/OiBTYWZlUmVzb3VyY2VVcmwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jc3NVcmxTb3VyY2UubmV4dCh0aGVtZVVybCk7XHJcbiAgICAgICAgdGhpcy5fY3NzQ3VzdG9tVXJsU291cmNlLm5leHQodGhlbWVVcmwpO1xyXG4gICAgICAgIGlmIChjc3NWYXJpYWJsZVVybCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jc3NWYXJpYWJsZVVybFNvdXJjZS5uZXh0KGNzc1ZhcmlhYmxlVXJsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGF0YShrZXksIGRhdGEpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGljdGlvbmFyeVtrZXldKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeVtrZXldID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnlba2V5XS5uZXh0KGRhdGEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbCA9IHRoaXMuZGljdGlvbmFyeVtrZXldLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgIGlmIChvbGRWYWwgIT09IGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeVtrZXldLm5leHQoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXREYXRhKGtleSwgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICBpZiAoIXRoaXMuZGljdGlvbmFyeVtrZXldKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeVtrZXldID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KGRlZmF1bHRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnlba2V5XS5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldERhdGFTeW5jPFQ+KGtleSwgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsKTogVCB8IG51bGwge1xyXG4gICAgICAgIGlmICghdGhpcy5kaWN0aW9uYXJ5W2tleV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdGlvbmFyeVtrZXldLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBjcmVhdGVGb3JSZXBvcnQobmF2SXRlbSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIEJhcnNhQXBpLlVsLlVsdk1haW5DdHJsci5DcmVhdGVGb3JSZXBvcnQoe30sIG5hdkl0ZW0sIChlcnIsIHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZW5kZXJVbHZNYWluVWkoXHJcbiAgICAgICAgbmF2SXRlbSxcclxuICAgICAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgIGlzUmVwb3J0UGFnZTogYm9vbGVhbiA9IGZhbHNlXHJcbiAgICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUZvclJlcG9ydChuYXZJdGVtKS5waXBlKFxyXG4gICAgICAgICAgICBleGhhdXN0TWFwKCh1bHZNYWluQ3RybHIpID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFVsdk1haW5VaUNvbXBvbmVudCh1bHZNYWluQ3RybHIuQWRhcHRlci5Db250cm9sLCBpbmplY3RvciwgaXNSZXBvcnRQYWdlKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcCgodWx2TWFuaVVpQ29tcG9uZW50KSA9PiB2Y3IuaW5zZXJ0KHVsdk1hbmlVaUNvbXBvbmVudC5ob3N0VmlldykpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB1bHZNYWluQ3RybHIpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgZ2V0VWx2TWFpblVpQ29tcG9uZW50KGN1c3RvbVVsdk1haW5VaSwgaW5qZWN0b3I6IEluamVjdG9yLCBpc1JlcG9ydFBhZ2UpOiBPYnNlcnZhYmxlPENvbXBvbmVudFJlZjxhbnk+PiB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tVWlTZXR0aW5nID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY3VzdG9tVWx2TWFpblVpLlNldHRpbmcsICdDdXN0b21VaScsIG51bGwpO1xyXG4gICAgICAgIGNvbnN0IHsgbW9kdWxlTmFtZSwgbW9kdWxlUGF0aCwgY29tcG9uZW50TmFtZSwgc2VsZWN0b3IgfSA9IGdldENvbXBvbmVudERlZmluZWQoXHJcbiAgICAgICAgICAgIGN1c3RvbVVsdk1haW5VaSxcclxuICAgICAgICAgICAgY3VzdG9tVWlTZXR0aW5nXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnQobW9kdWxlTmFtZSwgbW9kdWxlUGF0aCwgY29tcG9uZW50TmFtZSwgc2VsZWN0b3IsIGluamVjdG9yKS5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKGNvbXBvbmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50SW5zdGFuY2UgPSBjb21wb25lbnQuaW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pZCA9IGN1c3RvbVVsdk1haW5VaS5pZDtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLmNvbnRleHQgPSBjdXN0b21VbHZNYWluVWk7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pc1JlcG9ydFBhZ2UgPSBpc1JlcG9ydFBhZ2U7XHJcbiAgICAgICAgICAgICAgICBjdXN0b21VbHZNYWluVWkuY29udHJvbFVpID0gY29tcG9uZW50SW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGV2aWNlU2l6ZSQgPSB0aGlzLl9kZXZpY2VTaXplU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHRoaXMucG9ydGFsRGF0YSQgPSB0aGlzLnBvcnRhbERhdGFTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5ydGwkID0gdGhpcy5ydGxTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy51c2VyTG9nZ2VkSW4kID0gdGhpcy5fbG9nZ2VkSW5Tb3VyY2VcclxuICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgIC5waXBlKG1hcCgoaXNMb2dnZWRJbikgPT4gaXNMb2dnZWRJbiAmJiBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzQW5vbnltb3VzID09PSBmYWxzZSkpO1xyXG4gICAgICAgIHRoaXMuZGlyVmFsdWUkID0gdGhpcy5ydGwkLnBpcGUobWFwKChpc1J0bCkgPT4gKGlzUnRsID8gJ3J0bCcgOiAnbHRyJykpKTtcclxuICAgICAgICB0aGlzLnJvdXRlSW5pdGlhbGl6ZWQkID0gdGhpcy5yb3V0ZUluaXRpYWxpemVkU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XHJcbiAgICAgICAgdGhpcy5fc3RhbmRhbG9uZSQuYXNPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKChjKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3N0YW5kYWxvbmUnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbm9TdGFuZGFsb25lJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZGV2aWNlTGFuZHNjYXBlJC5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKGMpID0+IHtcclxuICAgICAgICAgICAgaWYgKGMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbGFuZHNjYXBlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9kZXZpY2VTaXplU291cmNlLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoYykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYyA9PT0gJ3MnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3NtYWxsZGV2aWNlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRhdGVUZXh0JCA9IHRoaXMuZGF0ZVRleHRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5wb3J0YWxTZXR0aW5ncyQgPSB0aGlzLnBvcnRhbERhdGFTb3VyY2VcclxuICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgIC5waXBlKG1hcCgocG9ydGFsRGF0YSkgPT4gKHBvcnRhbERhdGEgPyBwb3J0YWxEYXRhLlBvcnRhbFNldHRpbmdzIDogKHt9IGFzIGFueSkpKSk7XHJcbiAgICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXHJcbiAgICAgICAgICAgIC5waXBlKHN0YXJ0V2l0aChudWxsKSwgZGVib3VuY2VUaW1lKDEwMDApKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93aW5kb3dSZXNpemUkLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldERldmljZVNpemUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBfc2V0RGV2aWNlU2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkZXZpY2VTaXplID0gdGhpcy5faW5pdGFsaXplRGV2aWNlU2l6ZSgpO1xyXG4gICAgICAgIHRoaXMuX2RldmljZVNpemVTb3VyY2UubmV4dChkZXZpY2VTaXplKTtcclxuICAgIH1cclxuICAgIF9pbml0YWxpemVEZXZpY2VTaXplKCk6IEFiYnJldmF0aW9uRGV2aWNlU2l6ZSB7XHJcbiAgICAgICAgY29uc3QgX2lzbW9iaWxlID0gZ2V0RGV2aWNlSXNNb2JpbGUoKTtcclxuICAgICAgICBpZiAoX2lzbW9iaWxlKSB7XHJcbiAgICAgICAgICAgIEJhcnNhQXBpLkJ3LklzTW9iaWxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgX2lzVGFibGV0ID0gZ2V0RGV2aWNlSXNUYWJsZXQoKTtcclxuICAgICAgICBsZXQgX3dpbmRvV1NpemU6IEFiYnJldmF0aW9uRGV2aWNlU2l6ZSA9ICdzJztcclxuICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gNjAwKSB7XHJcbiAgICAgICAgICAgIF93aW5kb1dTaXplID0gJ3MnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggPiA2MDAgJiYgd2luZG93LmlubmVyV2lkdGggPD0gOTkyKSB7XHJcbiAgICAgICAgICAgIF93aW5kb1dTaXplID0gJ20nO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggPiA5OTIgJiYgd2luZG93LmlubmVyV2lkdGggPD0gMTIwMCkge1xyXG4gICAgICAgICAgICBfd2luZG9XU2l6ZSA9ICdsJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfd2luZG9XU2l6ZSA9ICd4bCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChfaXNtb2JpbGUgJiYgX3dpbmRvV1NpemUgIT09ICdsJyAmJiBfd2luZG9XU2l6ZSAhPT0gJ3hsJyAmJiBfd2luZG9XU2l6ZSAhPT0gJ20nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAncyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChfaXNUYWJsZXQgJiYgX3dpbmRvV1NpemUgIT09ICdsJyAmJiBfd2luZG9XU2l6ZSAhPT0gJ3hsJykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ20nO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3dpbmRvV1NpemU7XHJcbiAgICB9XHJcbiAgICBjb21waWxlTW9kdWxlKGRlcGVuZGVuY3k6IExpYnJhcnlEZXBlbmVjeSk6IE9ic2VydmFibGU8TmdNb2R1bGVGYWN0b3J5PGFueT4+IHtcclxuICAgICAgICBjb25zdCBtb2R1bGUkID0gdGhpcy5nZXRNb2R1bGUoZGVwZW5kZW5jeSk7XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZSQucGlwZShcclxuICAgICAgICAgICAgY29uY2F0TWFwKChtb2R1bGVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVGYWN0b3J5ID0gdGhpcy5nZXROZ01vZHVsZUZhY3RvcnkobW9kdWxlcywgZGVwZW5kZW5jeS5uYW1lKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvZihtb2R1bGVGYWN0b3J5KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgZ2V0TW9kdWxlKGRlcGVuZGVuY3k6IExpYnJhcnlEZXBlbmVjeSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgY29uc3QgeyBuYW1lLCBrZWJhYk5hbWUsIHVtZCwgZXhwb3J0QXMgfSA9IGRlcGVuZGVuY3k7XHJcbiAgICAgICAgY29uc3QgYmFzZSA9IGAvYXNzZXRzL21vZHVsZXMvJHtrZWJhYk5hbWV9L2J1bmRsZXNgO1xyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLmFiYztcclxuICAgICAgICBjb25zdCBwYXRoID0gYCR7YmFzZX0vJHtrZWJhYk5hbWV9LnVtZC5qcz90PSR7ZGF0ZX1gO1xyXG4gICAgICAgIHJldHVybiBvZih0cnVlKS5waXBlKFxyXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlcyA9IHRoaXMuZ2V0UmVnaXN0ZXJlZE1vZHVsZXModW1kLCBleHBvcnRBcywgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihtb2R1bGVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRKcyQocGF0aCkucGlwZShtYXAoKCkgPT4gdGhpcy5nZXRSZWdpc3RlcmVkTW9kdWxlcyh1bWQsIGV4cG9ydEFzLCBuYW1lKSkpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VmFsdWVPbk9iamVjdChwYXRoLCBpbmRleCwgbW9kdWxlcywgb2JqZWN0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc3BsaXRlZCA9IHBhdGguc3BsaXQoJy4nKTtcclxuICAgICAgICBjb25zdCBwcm9wID0gc3BsaXRlZFtpbmRleF07XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3RbcHJvcF0gPT09IHR5cGVvZiB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgb2JqZWN0W3Byb3BdID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gc3BsaXRlZC5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIG9iamVjdFtwcm9wXSA9IG1vZHVsZXM7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZU9uT2JqZWN0KHBhdGgsIGluZGV4ICsgMSwgbW9kdWxlcywgb2JqZWN0W3Byb3BdKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb21wb25lbnQoXHJcbiAgICAgICAgbW9kdWxlTmFtZTogc3RyaW5nLFxyXG4gICAgICAgIG1vZHVsZVBhdGg6IHN0cmluZyxcclxuICAgICAgICBjb21wb25lbnROYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgc2VsZWN0b3I6IHN0cmluZyxcclxuICAgICAgICBwYXJlbnRJbmplY3RvcjogSW5qZWN0b3JcclxuICAgICk6IE9ic2VydmFibGU8Q29tcG9uZW50UmVmPGFueT4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kY20uZ2V0Q29tcG9uZW50QnlTZWxlY3RvcihzZWxlY3RvciwgbW9kdWxlTmFtZSwgcGFyZW50SW5qZWN0b3IpO1xyXG4gICAgfVxyXG4gICAgbG9hZEpzJChwYXRoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0Jyk7XHJcbiAgICAgICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCBwYXRoKTtcclxuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShwYXRoKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHNjcmlwdCk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICAgICAgICAgIH0sIDUwMDApO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBSZXBvcnRFeGVjdXRlQnlJZChyZXBvcnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxNb0ZvclJlcG9ydE1vZGVsPiB7XHJcbiAgICAgICAgY29uc3QgdWx2UGFyYW1zID0gdGhpcy5fZ2V0VWx2UGFyYW1zQnkoJycsIHJlcG9ydElkKTtcclxuICAgICAgICByZXR1cm4gZnJvbSh0aGlzLl9yZXBvcnRFeGVjdXRlUHJvbWlzZSh1bHZQYXJhbXMpKTtcclxuICAgIH1cclxuICAgIFJlcG9ydEV4ZWN1dGUocmVwb3J0TmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNb0ZvclJlcG9ydE1vZGVsPiB7XHJcbiAgICAgICAgcmV0dXJuIGZyb20odGhpcy5SZXBvcnRFeGVjdXRlUHJvbWlzZShyZXBvcnROYW1lKSk7XHJcbiAgICB9XHJcbiAgICBSZXBvcnRFeGVjdXRlUHJvbWlzZShyZXBvcnROYW1lOiBzdHJpbmcpOiBQcm9taXNlPE1vRm9yUmVwb3J0TW9kZWw+IHtcclxuICAgICAgICBjb25zdCB1bHZQYXJhbXMgPSB0aGlzLl9nZXRVbHZQYXJhbXNCeShyZXBvcnROYW1lKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVwb3J0RXhlY3V0ZVByb21pc2UodWx2UGFyYW1zKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2dldFVsdlBhcmFtc0J5KHJlcG9ydE5hbWU6IHN0cmluZywgcmVwb3J0SWQ/OiBzdHJpbmcpOiBVbHZQYXJhbVR5cGUge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIEZsYWdzOiB7XHJcbiAgICAgICAgICAgICAgICBEYXRhOiAnVHJ1ZScsXHJcbiAgICAgICAgICAgICAgICBFeHRyYTogJ0ZhbHNlJyxcclxuICAgICAgICAgICAgICAgIFNlYXJjaDogJ0ZhbHNlJyxcclxuICAgICAgICAgICAgICAgIFZpZXc6ICdGYWxzZSdcclxuICAgICAgICAgICAgICAgIC8vIEdlbmVyYWw6XCJGYWxzZVwiLCAvLyB1bHZtYWluY3RybCBkb2VzIG5vdCBjcmFldGUgdWkgY29udHJvbCByYWlzZSBlcnJvclxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBSZXBvcnROYW1lOiByZXBvcnROYW1lLFxyXG4gICAgICAgICAgICBSZXBvcnRJZDogcmVwb3J0SWQsXHJcbiAgICAgICAgICAgIFVzYWdlRW51bTogJ1N5c3RlbUNvbnRhaW5lcidcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3JlcG9ydEV4ZWN1dGVQcm9taXNlKHVsdlBhcmFtczogVWx2UGFyYW1UeXBlKTogUHJvbWlzZTxNb0ZvclJlcG9ydE1vZGVsPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPE1vRm9yUmVwb3J0TW9kZWw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgQmFyc2FBcGkuQncuRXhlY3V0ZVJlcG9ydChcclxuICAgICAgICAgICAgICAgIHsgdWx2UGFyYW1zIH0sXHJcbiAgICAgICAgICAgICAgICAocmVzdWx0OiBSZXBvcnRNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0LkRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRGb3JtUGFuZWxDdHJscihpZCwgZm9ybXBhbmVsQ3RybHI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZm9ybVBhbmVsc1tpZF0gPSBmb3JtcGFuZWxDdHJscjtcclxuICAgIH1cclxuICAgIHNldFVzZXJMb2dpblN0YXR1cyhzdGF0dXM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9sb2dnZWRJblNvdXJjZS5uZXh0KHN0YXR1cyk7XHJcbiAgICB9XHJcbiAgICBleHRyYWN0QWxsUGFnZXMocG9ydGFsRGF0YTogUG9ydGFsRGF0YU1vZGVsIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghcG9ydGFsRGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBvcnRhbERhdGEuQ2hpbGRQYWdlTGlzdC5Nb0RhdGFMaXN0LmZvckVhY2goKHBhZ2VEYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhwYWdlRGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBleHRyYWN0QWxsUGFnZXNfT2xkKHBvcnRhbERhdGE6IFBvcnRhbERhdGFNb2RlbCB8IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXBvcnRhbERhdGEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5fcm91dGVyLmNvbmZpZztcclxuICAgICAgICBwb3J0YWxEYXRhLkNoaWxkUGFnZUxpc3QuTW9EYXRhTGlzdC5mb3JFYWNoKChwYWdlRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwYXRoID0gcGFnZURhdGEuUm91dGUucmVwbGFjZSgnLycsICcnKTtcclxuICAgICAgICAgICAgY29uZmlnLnB1c2goXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJvdXRlKHBhZ2VEYXRhLCBwYXRoLCBwYWdlRGF0YS5IYXNBdXRob3JpemUsIHBhZ2VEYXRhLlBhZ2VNb2R1bGU/LiRDYXB0aW9uLCBudWxsLCBudWxsKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAocGFnZURhdGEuSXNEZWZhdWx0Um91dGUgfHwgcGFnZURhdGEuSXNEZWZhdWx0Um91dGUgPT09ICdUcnVlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Um91dGUgPSBwYXRoO1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLnB1c2godGhpcy5jcmVhdGVSb3V0ZShwYWdlRGF0YSwgJycsIGZhbHNlLCBwb3J0YWxEYXRhLlBhZ2VNb2R1bGU/LiRDYXB0aW9uLCBwYXRoLCBudWxsKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhwYWdlRGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fcm91dGVyLnJlc2V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xvY2F0aW9uLnBhdGgoKSA9PT0gJycpIHtcclxuICAgICAgICAgICAgLy8gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFt0aGlzLmRlZmF1bHRSb3V0ZV0pO1xyXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoWycnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMucm91dGVJbml0aWFsaXplZCgpO1xyXG4gICAgfVxyXG4gICAgc3NvTG9naW4oKTogdm9pZCB7XHJcbiAgICAgICAgQWpheEhlbHBlci5BamF4UmVxdWVzdChcclxuICAgICAgICAgICAgJy9hcGkvYmFzZS9zc29sb2dpbicsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KCdlcnJvciBpbiBzc28gbG9naW4uJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG51bGxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgc3NvTG9nb3V0KCk6IHZvaWQge1xyXG4gICAgICAgIEFqYXhIZWxwZXIuQWpheFJlcXVlc3QoXHJcbiAgICAgICAgICAgICcvYXBpL2Jhc2Uvc3NvbG9nb3V0JyxcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgYWxlcnQoJ2Vycm9yIGluIHNzbyBsb2dvdXQuJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG51bGxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgYWRkQ2hpbGRQYWdlcyhwYWdlRGF0YTogUGFnZURhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFnZXMucHVzaChwYWdlRGF0YSk7XHJcbiAgICAgICAgaWYgKCFwYWdlRGF0YS5DaGlsZFBhZ2VMaXN0Py5Nb0RhdGFMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYWdlRGF0YS5DaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZm9yRWFjaCgoY2hpbGRQYWdlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhjaGlsZFBhZ2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgIGNyZWF0ZVJvdXRlKHBhZ2VEYXRhLCBwYXRoLCBoYXNBdXRob3JpemVkLCBtb2R1bGVOYW1lLCByZWRpcmVjdFRvLCBpc0R5bmFtaWNSb3V0ZSk6IFJvdXRlIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICBjcmVhdGVSb3V0ZTIoXHJcbiAgICAgICAgcGFnZURhdGEsXHJcbiAgICAgICAgcGF0aCxcclxuICAgICAgICBoYXNBdXRob3JpemVkLFxyXG4gICAgICAgIG1vZHVsZU5hbWUsXHJcbiAgICAgICAgcmVkaXJlY3RUbzogc3RyaW5nIHwgbnVsbCA9IG51bGwsXHJcbiAgICAgICAgaXNEeW5hbWljUm91dGU6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgKTogUm91dGUge1xyXG4gICAgICAgIGxldCBtb2R1bGVQYXRoOiBzdHJpbmcgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5HZXRLZWJhYkNhc2UobW9kdWxlTmFtZSk7XHJcbiAgICAgICAgY29uc3QgdW1kID0gbW9kdWxlTmFtZTtcclxuICAgICAgICBtb2R1bGVQYXRoID0gbW9kdWxlUGF0aC5zdWJzdHJpbmcoMSwgbW9kdWxlUGF0aC5sZW5ndGgpO1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNSb3V0ZTogUm91dGUgPSB7fTtcclxuICAgICAgICBkeW5hbWljUm91dGUucGF0aCA9IHBhdGg7XHJcbiAgICAgICAgZHluYW1pY1JvdXRlLmRhdGEgPSB7IHBhZ2VEYXRhIH07XHJcbiAgICAgICAgaWYgKCFpc0R5bmFtaWNSb3V0ZSkge1xyXG4gICAgICAgICAgICBkeW5hbWljUm91dGUucmVzb2x2ZSA9IHtcclxuICAgICAgICAgICAgICAgIHBhZ2VEYXRhOiBQb3J0YWxQYWdlUmVzb2x2ZXJcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhdGggPT09ICcnKSB7XHJcbiAgICAgICAgICAgIGR5bmFtaWNSb3V0ZS5wYXRoTWF0Y2ggPSAnZnVsbCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZWRpcmVjdFRvKSB7XHJcbiAgICAgICAgICAgIGR5bmFtaWNSb3V0ZS5yZWRpcmVjdFRvID0gcmVkaXJlY3RUbztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaGFzQXV0aG9yaXplZCkge1xyXG4gICAgICAgICAgICAgICAgZHluYW1pY1JvdXRlLmNhbkFjdGl2YXRlID0gW0F1dGhHdWFyZF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZHluYW1pY1JvdXRlLmxvYWRDaGlsZHJlbiA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY2llczogTGlicmFyeURlcGVuZWN5W10gPSBKU09OLnBhcnNlKHBhZ2VEYXRhLkRlcGVuZGVuY2llcyk7IC8vIGV2YWwocGFnZURhdGEuRGVwZW5kZW5jaWVzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VMaWJyYXJ5ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAga2ViYWJOYW1lOiBtb2R1bGVQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHVtZCxcclxuICAgICAgICAgICAgICAgICAgICBleHBvcnRBczogW21vZHVsZU5hbWVdXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzJCA9IGZyb20oZGVwZW5kZW5jaWVzKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmNhdE1hcCgoZGVwZW5kZW5jeTogTGlicmFyeURlcGVuZWN5KSA9PiB0aGlzLmNvbXBpbGVNb2R1bGUoZGVwZW5kZW5jeSkpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKFtkZXBlbmRlbmNpZXMkXSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5nZXRNb2R1bGUocGFnZUxpYnJhcnkpKSxcclxuICAgICAgICAgICAgICAgICAgICBtYXAoKG1vZHVsZXMpID0+IG1vZHVsZXNbbW9kdWxlTmFtZSArICdNb2R1bGUnXSksXHJcbiAgICAgICAgICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMucm91dGVJbml0aWFsaXplZCgpKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkeW5hbWljUm91dGU7XHJcbiAgICB9XHJcbiAgICByb3V0ZUluaXRpYWxpemVkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucm91dGVJbml0aWFsaXplZFNvdXJjZS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGxvZ2luQnlBbm9ueW1vdXMoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgdGhpcy5sb2dpbkxvYWRpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmxvZ2luUG9ydGFsKCkucGlwZShcclxuICAgICAgICAgICAgbWFwKChyZXN1bHQ6IExvZ2luUmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmRlYnVnKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKEJhcnNhQXBpLkxvZ2luQWN0aW9uLnRva2VuMlN0b3JhZ2VLZXksIHJlc3VsdC5kYXRhLnN0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9naW5Mb2FkaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0UGFnZURhdGEodXJsOiBzdHJpbmcsIGlzUm9vdDogYm9vbGVhbik6IE9ic2VydmFibGU8UGFnZURhdGFNb2RlbCB8IG51bGw+IHtcclxuICAgICAgICBpZiAoaXNSb290IHx8IHVybCA9PT0gJycgfHwgdXJsID09PSAnLycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9ydGFsRGF0YSQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodXJsLmluZGV4T2YoJz8nKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgdXJsLmluZGV4T2YoJz8nKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNhY2hlZFBhZ2VEYXRhW3VybF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUGFnZURhdGFbdXJsXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGFnZURhdGEgPSB0aGlzLmZpbmRQYWdlQnlSb3V0ZSh1cmwpO1xyXG5cclxuICAgICAgICB0aGlzLmNhY2hlZFBhZ2VEYXRhW3VybF0gPSB0aGlzLmFwaVNlcnZpY2VcclxuICAgICAgICAgICAgLmxvYWRQb3J0YWxQYWdlRGF0YShwYWdlRGF0YT8uSWQsIHRoaXMucG9ydGFsRGF0YVNvdXJjZS5nZXRWYWx1ZSgpPy5DaGlsZFBhZ2VMaXN0LlR5cGVEZWZJZClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKHBhZ2VNbykgPT4gcGFnZU1vLkRhdGEuTW8pLFxyXG4gICAgICAgICAgICAgICAgdGFwKChwYWdlTW8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkUm91dGUocGFnZU1vLCBwYWdlTW8uQ2hpbGRQYWdlTGlzdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFBhZ2VzKHBhZ2VNbyk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHB1Ymxpc2hSZXBsYXkoMSksXHJcbiAgICAgICAgICAgICAgICByZWZDb3VudCgpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgLy8gdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdID0gdGhpcy5wb3J0YWxEYXRhJC5waXBlKFxyXG4gICAgICAgIC8vICAgZmlsdGVyKChwb3J0YWxEYXRhKSA9PiBwb3J0YWxEYXRhICE9IG51bGwpLFxyXG4gICAgICAgIC8vICAgbWFwKChwb3J0YWxEYXRhKSA9PiApLFxyXG4gICAgICAgIC8vICAgY29uY2F0TWFwKChwYWdlRGF0YSkgPT4ge1xyXG4gICAgICAgIC8vICAgICByZXR1cm5cclxuICAgICAgICAvLyAgIH0pLFxyXG5cclxuICAgICAgICAvLyAgIHRhcChwYWdlRGF0YT0+e30pXHJcbiAgICAgICAgLy8gKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHJlc29sdmVEYXRhKHJvdXRlUGFnZURhdGEpOiBPYnNlcnZhYmxlPFBhZ2VEYXRhTW9kZWwgfCBudWxsPiB7XHJcbiAgICAgICAgLy8gY29uc3QgcGFnZURhdGEgPSB0aGlzLnBhZ2VzLmZpbmQoKGMpID0+IGMuUm91dGUgPT09IHJvdXRlUGFnZURhdGEuUm91dGUgJiYgYy5Nb2R1bGUgPT09IHJvdXRlUGFnZURhdGEuTW9kdWxlKTtcclxuICAgICAgICBjb25zdCBwYWdlRGF0YSA9IHRoaXMucGFnZXMuZmluZCgoYykgPT4gYy5Sb3V0ZSA9PT0gcm91dGVQYWdlRGF0YS5Sb3V0ZSk7XHJcbiAgICAgICAgaWYgKCFwYWdlRGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkID0gcGFnZURhdGEuSWQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNhY2hlZFBhZ2VEYXRhW2lkXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQYWdlRGF0YVtpZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FjaGVkUGFnZURhdGFbaWRdID0gdGhpcy5hcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5sb2FkUG9ydGFsUGFnZURhdGEoaWQsIHRoaXMucG9ydGFsRGF0YVNvdXJjZS5nZXRWYWx1ZSgpPy5DaGlsZFBhZ2VMaXN0LlR5cGVEZWZJZClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKHBhZ2VNbykgPT4gcGFnZU1vLkRhdGEuTW8pLFxyXG4gICAgICAgICAgICAgICAgdGFwKChwYWdlTW8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkUm91dGUocGFnZU1vLCBwYWdlTW8uQ2hpbGRQYWdlTGlzdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFBhZ2VzKHBhZ2VNbyk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHB1Ymxpc2hSZXBsYXkoMSksXHJcbiAgICAgICAgICAgICAgICByZWZDb3VudCgpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgLy8gdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdID0gdGhpcy5wb3J0YWxEYXRhJC5waXBlKFxyXG4gICAgICAgIC8vICAgZmlsdGVyKChwb3J0YWxEYXRhKSA9PiBwb3J0YWxEYXRhICE9IG51bGwpLFxyXG4gICAgICAgIC8vICAgbWFwKChwb3J0YWxEYXRhKSA9PiApLFxyXG4gICAgICAgIC8vICAgY29uY2F0TWFwKChwYWdlRGF0YSkgPT4ge1xyXG4gICAgICAgIC8vICAgICByZXR1cm5cclxuICAgICAgICAvLyAgIH0pLFxyXG5cclxuICAgICAgICAvLyAgIHRhcChwYWdlRGF0YT0+e30pXHJcbiAgICAgICAgLy8gKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQYWdlRGF0YVtpZF07XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ2hpbGRSb3V0ZShwYWdlTW86IE1ldGFvYmplY3REYXRhTW9kZWwsIENoaWxkUGFnZUxpc3Q6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhZGRDaGlsZFJvdXRlX09sZChwYWdlTW86IE1ldGFvYmplY3REYXRhTW9kZWwsIENoaWxkUGFnZUxpc3Q6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIUNoaWxkUGFnZUxpc3Q/Lk1vRGF0YUxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLl9yb3V0ZXIuY29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYWdlTW8uUm91dGUucmVwbGFjZSgnLycsICcnKTtcclxuICAgICAgICBjb25zdCBwYXJlbnRSb3V0ZSA9IGNvbmZpZy5maW5kKChjKSA9PiAoYy5wYXRoID0gcGFyZW50UGF0aCkpO1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuOiBSb3V0ZVtdID0gW107XHJcbiAgICAgICAgaWYgKHBhcmVudFJvdXRlKSB7XHJcbiAgICAgICAgICAgIENoaWxkUGFnZUxpc3QuTW9EYXRhTGlzdC5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IGNoaWxkLlJvdXRlLnJlcGxhY2UoJy8nLCAnJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJvdXRlID0gdGhpcy5jcmVhdGVSb3V0ZShcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZCxcclxuICAgICAgICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLkhhc0F1dGhvcml6ZSxcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5QYWdlTW9kdWxlPy4kQ2FwdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkcm91dGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gZGVidWdnZXI7XHJcblxyXG4gICAgICAgICAgICAocGFyZW50Um91dGUgYXMgYW55KS5fbG9hZGVkQ29uZmlnLnJvdXRlc1swXS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fcm91dGVyLnJlc2V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBsb2FkUG9ydGFsRGF0YV9PbGQxKCk6IE9ic2VydmFibGU8UG9ydGFsRGF0YU1vZGVsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5sb2FkUG9ydGFsKEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuUG9ydGFsSWQsIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuUG9ydGFsVHlwZURlZklkKS5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKHBvcnRhbFNldHRpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBvcnRhbERhdGEgPSBwb3J0YWxTZXR0aW5nLkRhdGEuTW87XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4dHJhY3RBbGxQYWdlcyhwb3J0YWxEYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9ydGFsRGF0YVNvdXJjZS5uZXh0KHBvcnRhbERhdGEpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IGZyb20odGhpcy5sb2FkU3lzdGVtKCkpKSxcclxuICAgICAgICAgICAgdGFwKChhbGwpID0+IHRoaXMuZGF0ZVRleHRTb3VyY2UubmV4dChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLkRhdGVUZXh0KSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGxvYWRQb3J0YWxEYXRhU3luY19PbGQyKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHBvcnRhbFNldHRpbmcgPSB0aGlzLmFwaVNlcnZpY2UubG9hZFBvcnRhbFN5bmMoXHJcbiAgICAgICAgICAgIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuUG9ydGFsSWQsXHJcbiAgICAgICAgICAgIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuUG9ydGFsVHlwZURlZklkXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBwb3J0YWxEYXRhID0gcG9ydGFsU2V0dGluZy5EYXRhLk1vO1xyXG5cclxuICAgICAgICB0aGlzLmV4dHJhY3RBbGxQYWdlcyhwb3J0YWxEYXRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5wb3J0YWxEYXRhU291cmNlLm5leHQocG9ydGFsRGF0YSk7XHJcblxyXG4gICAgICAgIHRoaXMubG9hZFN5c3RlbSgpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGVUZXh0U291cmNlLm5leHQoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5EYXRlVGV4dCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9nZXREZWZhdWx0UGFnZShjOiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKCFjIHx8ICFjLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHggPSBjLmZpbmQoKGMpID0+IGMuSXNEZWZhdWx0Um91dGUgPT09ICdUcnVlJyk7XHJcbiAgICAgICAgaWYgKHgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB4MjogYW55ID0gbnVsbDtcclxuICAgICAgICBjLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHgyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgeDIgPSB0aGlzLl9nZXREZWZhdWx0UGFnZShlbGVtZW50LkNoaWxkUGFnZUxpc3Q/Lk1vRGF0YUxpc3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB4MjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBsb2FkUG9ydGFsRGF0YVN5bmMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKEJhcnNhQXBpLkxvZ2luRm9ybURhdGE/LmVycm9yPy51c2VyTWVzc2FnZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBvcnRhbFNldHRpbmdTdHIgPSBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZCgnR2V0UG9ydGFsJywgQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Qb3J0YWxJZCk7XHJcbiAgICAgICAgY29uc3QgcG9ydGFsU2V0dGluZyA9IEJhcnNhQXBpLkV4dC5kZWNvZGUocG9ydGFsU2V0dGluZ1N0cik7XHJcbiAgICAgICAgY29uc3QgcG9ydGFsRGF0YTogUGFnZURhdGFNb2RlbCA9IHBvcnRhbFNldHRpbmc7XHJcbiAgICAgICAgaWYgKHBvcnRhbERhdGEpIHtcclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFBhZ2UgPSB0aGlzLl9nZXREZWZhdWx0UGFnZShwb3J0YWxEYXRhLkNoaWxkUGFnZUxpc3QuTW9EYXRhTGlzdCk7XHJcbiAgICAgICAgICAgIHRoaXMuRGVmYXVsdFBhZ2UgPSBkZWZhdWx0UGFnZTtcclxuICAgICAgICAgICAgbGV0IGNvbmZpZ1JvdXRlID0gdGhpcy5fcm91dGVyLmNvbmZpZztcclxuICAgICAgICAgICAgY29uc3QgcmVtb3ZlUGFnZWQ6IFJvdXRlW10gPSBbXTtcclxuICAgICAgICAgICAgY29uZmlnUm91dGUuZm9yRWFjaCgoYywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlID0gJy8nICsgYy5wYXRoO1xyXG4gICAgICAgICAgICAgICAgaWYgKGMucGF0aCAhPT0gJycgJiYgcG9ydGFsRGF0YS5DaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZmluZEluZGV4KChkKSA9PiBkLlJvdXRlID09PSByb3V0ZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUGFnZWQucHVzaChjKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGhUb1JlbW92ZSA9IHJlbW92ZVBhZ2VkLm1hcCgoZCkgPT4gZC5wYXRoKTtcclxuICAgICAgICAgICAgY29uZmlnUm91dGUgPSBjb25maWdSb3V0ZS5maWx0ZXIoKGMpID0+IHBhdGhUb1JlbW92ZS5pbmRleE9mKGMucGF0aCkgPT09IC0xKTtcclxuICAgICAgICAgICAgaWYgKGRlZmF1bHRQYWdlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQYWdlUm91dGUgPSBkZWZhdWx0UGFnZS5Sb3V0ZS5yZXBsYWNlKCcvJywgJycpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdFBhdGggPSBjb25maWdSb3V0ZS5maW5kKChjKSA9PiBjLnBhdGggPT09ICcnKTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRQYXRoICYmIChkZWZhdWx0UGF0aC5yZWRpcmVjdFRvID0gZGVmYXVsdFBhZ2VSb3V0ZSk7XHJcbiAgICAgICAgICAgICAgICBjb25maWdSb3V0ZS5wdXNoKHsgcGF0aDogJyoqJywgcmVkaXJlY3RUbzogZGVmYXVsdFBhZ2VSb3V0ZSB9KTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IG5vdEZvdW5kUGF0aCA9IGNvbmZpZ1JvdXRlLmZpbmQoKGMpID0+IGMucGF0aCA9PT0gJyoqJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBub3RGb3VuZFBhdGggJiYgKG5vdEZvdW5kUGF0aC5yZWRpcmVjdFRvID0gZGVmYXVsdFBhZ2UuUm91dGUucmVwbGFjZSgnLycsICcnKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcm91dGVyLnJlc2V0Q29uZmlnKGNvbmZpZ1JvdXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV4dHJhY3RBbGxQYWdlcyhwb3J0YWxEYXRhIGFzIFBvcnRhbERhdGFNb2RlbCk7XHJcblxyXG4gICAgICAgIHRoaXMucG9ydGFsRGF0YVNvdXJjZS5uZXh0KHBvcnRhbERhdGEgYXMgUG9ydGFsRGF0YU1vZGVsKTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRlVGV4dFNvdXJjZS5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuRGF0ZVRleHQpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIFNob3dGb3JtKGU6IHsgbW86IE1ldGFvYmplY3REYXRhTW9kZWw7IG5hbWE6IHN0cmluZzsgYWZ0ZXJSZWFkeT86IChlOiBhbnkpID0+IHZvaWQgfSk6IHZvaWQge1xyXG4gICAgICAgIEJhcnNhQXBpLkJ3LkZvcm0uU2hvdyh7XHJcbiAgICAgICAgICAgIE1vOiBlLm1vLFxyXG4gICAgICAgICAgICBNb0NvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgIFZpZXdOYW1lOiBlLm5hbWFcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgRXZlbnRIYW5kbGVyczoge1xyXG4gICAgICAgICAgICAgICAgQWZ0ZXJSZWFkeTogZnVuY3Rpb24gKHNlbmRlciwgZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2RvIHNvbWV0aGluZyBoZXJlXHJcbiAgICAgICAgICAgICAgICAgICAgZS5hZnRlclJlYWR5Py4oZWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGxvZ2luUm91dGUkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9ydGFsRGF0YSQucGlwZShcclxuICAgICAgICAgICAgbWFwKChwb3J0YWxEYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dpblBhZ2UgPSBwb3J0YWxEYXRhPy5DaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZmluZCgoYykgPT4gYy5Jc0xvZ2luUm91dGUgPT09ICdUcnVlJyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9naW5QYWdlPy5Sb3V0ZSB8fCAnbG9naW4nO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgUnVuQmxNZXRob2RBc3luYzxUPihtZXRob2ROYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IGFueVtdKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXHJcbiAgICAgICAgICAgICAgICBNZXRob2Q6IG1ldGhvZE5hbWUsXHJcbiAgICAgICAgICAgICAgICBTdWNjZXNzRm46IChkYXRhOiBUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBGYWlsRm46IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgRXhlY3V0ZU5vdGlmaWNhdGlvbkFjdGlvbihpZDogc3RyaW5nLCBhY3Rpb25UaXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtpZCwgYWN0aW9uVGl0bGVdLFxyXG4gICAgICAgICAgICBNZXRob2Q6ICdFeGVjdXRlTm90aWZpY2F0aW9uQWN0aW9uJyxcclxuICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoZToge1xyXG4gICAgICAgICAgICAgICAgTW86IE1ldGFvYmplY3REYXRhTW9kZWw7XHJcbiAgICAgICAgICAgICAgICBEeW5hbWljQ29tbWFuZElkOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgICBTaG93Rm9ybVNldHRpbmc6IHsgTW9JZDogc3RyaW5nOyBWaWV3TmFtZTogc3RyaW5nIH07XHJcbiAgICAgICAgICAgIH0pID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVB1c2hBY3Rpb24oKTtcclxuICAgICAgICAgICAgICAgIGlmIChlLkR5bmFtaWNDb21tYW5kSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBFeGVjdXRlRHluYW1pY0NvbW1hbmQoeyBJZDogZS5EeW5hbWljQ29tbWFuZElkIH0sIGUuTW8pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLlNob3dGb3JtU2V0dGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgTW9JZCwgVmlld05hbWUgfSA9IGUuU2hvd0Zvcm1TZXR0aW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gQmFyc2FBcGkuQncuRm9ybS5TaG93KHsgTW9JZCwgTW9Db250ZXh0OiB7IFZpZXdOYW1lIH0gfSksIDUwMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEZhaWxGbjogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVB1c2hBY3Rpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nU2VydmljZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGxvYWRVc2VyUG9ydGFsU2V0dGluZygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YT8uZXJyb3I/LnVzZXJNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdWx2UGFyYW1zID0ge1xyXG4gICAgICAgICAgICBGbGFnczoge1xyXG4gICAgICAgICAgICAgICAgRGF0YTogJ1RydWUnLFxyXG4gICAgICAgICAgICAgICAgRXh0cmE6ICdGYWxzZScsXHJcbiAgICAgICAgICAgICAgICBTZWFyY2g6ICdGYWxzZScsXHJcbiAgICAgICAgICAgICAgICBWaWV3OiAnRmFsc2UnXHJcbiAgICAgICAgICAgICAgICAvLyBHZW5lcmFsOlwiRmFsc2VcIiwgLy8gdWx2bWFpbmN0cmwgZG9lcyBub3QgY3JhZXRlIHVpIGNvbnRyb2wgcmFpc2UgZXJyb3JcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgUmVwb3J0TmFtZTogJ1/YqtmG2LjZitmF2KfYql/Zvtin2YrZh1/ZvtmI2LHYqtin2YQnLFxyXG4gICAgICAgICAgICBVc2FnZUVudW06ICdTeXN0ZW1Db250YWluZXInXHJcbiAgICAgICAgfTtcclxuICAgICAgICBCYXJzYUFwaS5Cdy5FeGVjdXRlUmVwb3J0KFxyXG4gICAgICAgICAgICB7IHVsdlBhcmFtcyB9LFxyXG4gICAgICAgICAgICAocmVzdWx0OiBSZXBvcnRNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9saXN0ID0gcmVzdWx0LkRhdGEuTW9EYXRhTGlzdDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJQb3J0YWxTZXR0aW5nOiBSZWNvcmQ8c3RyaW5nLCBNZXRhb2JqZWN0RGF0YU1vZGVsPiA9IHt9O1xyXG4gICAgICAgICAgICAgICAgbW9saXN0LmZvckVhY2goKG1vKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vLkluaGVyaXRhbmNlICYmIG1vLkluaGVyaXRhbmNlLiRUeXBlRGVmTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyUG9ydGFsU2V0dGluZ1ttby5Jbmhlcml0YW5jZS4kVHlwZURlZk5hbWVdID0gbW8uSW5oZXJpdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyUG9ydGFsU2V0dGluZ3MkLm5leHQodXNlclBvcnRhbFNldHRpbmcpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgLy8gICAgIFBhcmFtZXRlcnM6IFtdLFxyXG4gICAgICAgIC8vICAgICBNZXRob2Q6ICdHZXRVc2VyUG9ydGFsU2V0dGluZ3MnLFxyXG4gICAgICAgIC8vICAgICBTdWNjZXNzRm46ICh1c2VyUG9ydGFsU2V0dGluZzogTWV0YW9iamVjdERhdGFNb2RlbCkgPT4ge1xyXG4gICAgICAgIC8vICAgICB9LFxyXG4gICAgICAgIC8vICAgICBGYWlsRm46IChlKSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxuICAgIGxvYWRTZXJ2ZXJTdGFydHVwRGF0YSgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIUJhcnNhQXBpLk9mZmxpbmUuaGFzSW5pdCkge1xyXG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuT2ZmbGluZS5hZnRlckluaXRDYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkU2VydmVyU3RhcnR1cERhdGEocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLl9sb2FkU2VydmVyU3RhcnR1cERhdGEocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9sb2FkU2VydmVyU3RhcnR1cERhdGEocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWpheEhlbHBlciA9IHR5cGVvZiBBamF4SGVscGVyMiA9PT0gJ3VuZGVmaW5lZCcgPyBBamF4SGVscGVyIDogQWpheEhlbHBlcjI7XHJcbiAgICAgICAgYWpheEhlbHBlci5BamF4UmVxdWVzdChcclxuICAgICAgICAgICAgJy9hcGkvYmFzZS9TZXJ2ZXJTdGFydHVwRGF0YScsXHJcbiAgICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YVRleHQgPSByZXNwb25zZS5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgICAgICAgICBkYXRhVGV4dCA9IGRhdGFUZXh0LnJlcGxhY2UoLycvZywgJ1wiJyk7XHJcbiAgICAgICAgICAgICAgICBkYXRhVGV4dCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlJlcGxhY2VBcmFiaWNDaGFyY2h0ZXIoZGF0YVRleHQpO1xyXG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuTG9naW5Gb3JtLlBvcnRhbEluaXRpYWxpemUoZGF0YVRleHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzQW5vbnltb3VzID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhPy5lcnJvcj8udXNlck1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuTXNnLkVycm9yKEJhcnNhQXBpLkxvZ2luRm9ybURhdGE/LmVycm9yPy51c2VyTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuTXNnLkVycm9yKCfYp9mF2qnYp9mGINmI2LHZiNivINio2Kcg2qnYp9ix2KjYsSDZvtmI2LHYqtin2YQg2YjYrNmI2K8g2YbYr9in2LHYry4nKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNTZXJ2aWNlRGVzaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX3JvdXRlci5jb25maWc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnWzBdLnJlZGlyZWN0VG8gPSAnc2VydmljZWRlc2snO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb3V0ZXIucmVzZXRDb25maWcoY29uZmlnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRBZnRlckxvZ2luRm9ybURhdGEoKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KCdlcnJvciBpbiBnZXQgc2VydmVyIHN0YXJ0dXAgZGF0YS4nKTtcclxuICAgICAgICAgICAgICAgIHJlamVjdCgnZXJyb3IgaW4gZ2V0IHNlcnZlciBzdGFydHVwIGRhdGEuJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG51bGxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIFNob3dGb3JtUGFuZWxDb250cm9sKFxyXG4gICAgICAgIGZvcm1wYW5lbEN0cmxyOiBhbnksXHJcbiAgICAgICAgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIGRpYWxvZ0NvbXBvbmVudDogVHlwZTxhbnk+LFxyXG4gICAgICAgIGlzUGFnZTogYm9vbGVhbixcclxuICAgICAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgaXNSZWxvYWQ6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFmb3JtcGFuZWxDdHJscikge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ2Zvcm0gcGFuZWwgY29udHJvbGVyIGlzIHVuZGVmaW5lZCEnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtbyA9IGZvcm1wYW5lbEN0cmxyLk1vO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckxheW91dCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGZvcm1wYW5lbEN0cmxyLCAnU2V0dGluZy5WaWV3LkhlYWRlckxheW91dCcsIG51bGwpO1xyXG4gICAgICAgIGxldCBpc01vZGFsID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoZm9ybXBhbmVsQ3RybHIsICdTZXR0aW5nLlZpZXcuRXh0cmFKc29uUHJvcC5Nb2RhbCcsIGZhbHNlKTtcclxuICAgICAgICBpc01vZGFsID1cclxuICAgICAgICAgICAgaXNNb2RhbCB8fFxyXG4gICAgICAgICAgICBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShmb3JtcGFuZWxDdHJsciwgJ1NldHRpbmcuVmlldy5DdXN0b21VaS5QYXJhbWV0ZXJzLklzTW9kYWwnLCBmYWxzZSk7XHJcbiAgICAgICAgY29uc3QgbW9kYWxTZXR0aW5nID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoXHJcbiAgICAgICAgICAgIGZvcm1wYW5lbEN0cmxyLFxyXG4gICAgICAgICAgICAnU2V0dGluZy5WaWV3LkN1c3RvbVVpLlBhcmFtZXRlcnMuTW9kYWxTZXR0aW5nJyxcclxuICAgICAgICAgICAgbnVsbFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKG1vZGFsU2V0dGluZykge1xyXG4gICAgICAgICAgICBpc01vZGFsID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9ybXBhbmVsQ3RybHIuU2V0dGluZy5Jc01vZGFsID0gaXNNb2RhbDtcclxuICAgICAgICBmb3JtcGFuZWxDdHJsci5Jc01vZGFsID0gaXNNb2RhbDtcclxuICAgICAgICBjb25zdCBicmVhZENydW1iID0gZ2V0SGVhZGVyVmFsdWUoaGVhZGVyTGF5b3V0Py5CcmVhZENydW1iKTtcclxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcclxuICAgICAgICAgICAgaWQ6IG1vLiRTdGF0ZSA9PT0gJ05ldycgPyAnMCcgOiBtby5JZCxcclxuICAgICAgICAgICAgdHlpZDogbW8uJFR5cGVEZWZJZCxcclxuICAgICAgICAgICAgdHljcDogbW8uJENhcHRpb24gPyBtby4kQ2FwdGlvbiA6IG51bGwsXHJcbiAgICAgICAgICAgIHJlcGlkOiBtby4kUmVwb3J0SWQsXHJcbiAgICAgICAgICAgIHZpZDogZm9ybXBhbmVsQ3RybHI/LlNldHRpbmc/LlZpZXc/LlR5cGVWaWV3SWQsXHJcbiAgICAgICAgICAgIGJjOiBicmVhZENydW1iID8gYnJlYWRDcnVtYiA6IG1vLiRTdGF0ZSA9PT0gJ05ldycgPyBtby4kVHlwZURlZk5hbWUgOiBtby4kQ2FwdGlvblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaWQgPSBnZXRVbmlxdWVJZCg0KTtcclxuICAgICAgICB0aGlzLmFkZEZvcm1QYW5lbEN0cmxyKGlkLCBmb3JtcGFuZWxDdHJscik7XHJcbiAgICAgICAgdGhpcy5vcGVuRm9ybSQubmV4dCgpOyAvLyBldmVudCBlbWl0IGZvciBvdGhlciBjb21wb25lbnRzIHRvIGtub3cgZm9ybSBvcGVuXHJcbiAgICAgICAgaWYgKGlzTW9kYWwpIHtcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dGb3JtKFxyXG4gICAgICAgICAgICAgICAgZGlhbG9nQ29tcG9uZW50LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnF1ZXJ5UGFyYW1zLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1wYW5lbEN0cmxyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdmNyXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB7IGZvcm1QYW5lbEN0cmxySWQ6IGlkIH07XHJcbiAgICAgICAgICAgIGlmIChpc1BhZ2UpIHtcclxuICAgICAgICAgICAgICAgIHJvdXRlci5uYXZpZ2F0ZShcclxuICAgICAgICAgICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdmb3JtJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGV0czoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW46IFsnc2hvdycsIHsgLi4ucXVlcnlQYXJhbXMsIGZvcm1QYW5lbEN0cmxySWQ6IGlkLCBpc0ZpcnN0OiB0cnVlIH1dXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IGFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwTG9jYXRpb25DaGFuZ2U6IGlzUmVsb2FkXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJvdXRlci5uYXZpZ2F0ZShcclxuICAgICAgICAgICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdwb3B1cCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxldHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluOiBbJ3Nob3cnLCB7IC4uLnF1ZXJ5UGFyYW1zLCBmb3JtUGFuZWxDdHJscklkOiBpZCB9XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IGFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ3ByZXNlcnZlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcExvY2F0aW9uQ2hhbmdlOiBpc1JlbG9hZFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgbG9hZFN5c3RlbShpZDogbnVtYmVyID0gMCk6IFByb21pc2U8UG9ydGFsRGF0YU1vZGVsPiB7XHJcbiAgICAgICAgaWYgKEJhcnNhQXBpLkxvZ2luRm9ybURhdGE/LmVycm9yPy51c2VyTWVzc2FnZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YT8uZXJyb3I/LnVzZXJNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSAwKSB7XHJcbiAgICAgICAgICAgIEJhcnNhQXBpLlVsLkFwcGxpY2F0aW9uQ3RybHIuRGVmYXVsdFN5c3RlbUlkID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgQmFyc2FBcGkuVWwuQXBwbGljYXRpb25DdHJsci5fbG9hZFN5c3RlbShcclxuICAgICAgICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICAgIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9yZW1vdmVQdXNoQWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHB1c2hBY3Rpb25TdHIgPSB0aGlzLl9sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncHVzaEFjdGlvbicpO1xyXG4gICAgICAgIGlmIChwdXNoQWN0aW9uU3RyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmUoJ3B1c2hBY3Rpb24nKTtcclxuICAgICAgICAgICAgY29uc3QgcHVzaEFjdGlvbiA9IEpTT04ucGFyc2UocHVzaEFjdGlvblN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuX3B1c2hBY3Rpb24kLm5leHQocHVzaEFjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfY2hlY2tMb2NhbFN0b3JhZ2VQdXNoQWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHB1c2hBY3Rpb25TdHIgPSB0aGlzLl9sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncHVzaEFjdGlvbicpO1xyXG4gICAgICAgIGlmIChwdXNoQWN0aW9uU3RyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmUoJ3B1c2hBY3Rpb24nKTtcclxuICAgICAgICAgICAgY29uc3QgcHVzaEFjdGlvbiA9IEpTT04ucGFyc2UocHVzaEFjdGlvblN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuX3B1c2hBY3Rpb24kLm5leHQocHVzaEFjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfaW5pdEFmdGVyTG9naW5Gb3JtRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJ0bFNvdXJjZS5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNSdGwpO1xyXG4gICAgICAgIHRoaXMuX2lzQW5vbnVtb3VzU291cmNlLm5leHQoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Jc0Fub255bW91cyk7XHJcbiAgICAgICAgdGhpcy5zZXRVc2VyTG9naW5TdGF0dXMoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Jc1VzZXJMb2dnZWRJbik7XHJcbiAgICAgICAgdGhpcy5fbG9nZ2VkSW5Tb3VyY2UubmV4dCh0aGlzLl9sb2dnZWRJblNvdXJjZS5nZXRWYWx1ZSgpICYmIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNBbm9ueW1vdXMgPT09IGZhbHNlKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2luaXRWaXNpYmlsaXR5Q2hhbmdlKCk6IHZvaWQge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRWaXNpYmlsaXR5Y2hhbmdlJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50VmlzaWJpbGl0eWNoYW5nZSQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfaW5pdFN0YW5kYWxvbmUoKTogdm9pZCB7XHJcbiAgICAgICAgd2luZG93Lm1hdGNoTWVkaWEoJyhkaXNwbGF5LW1vZGU6IHN0YW5kYWxvbmUpJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXNNYXRjaCA9IGUubWF0Y2hlcztcclxuXHJcbiAgICAgICAgICAgIGlmIChpc01hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFuZGFsb25lJC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhbmRhbG9uZSQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2luaXRQdXNoQWN0aW9ucygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jaGVja0xvY2FsU3RvcmFnZVB1c2hBY3Rpb24oKTtcclxuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnVzZXJMb2dnZWRJbiQsIHRoaXMucHVzaEFjdGlvbiRdKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIC8vIHdpdGhMYXRlc3RGcm9tKHRoaXMuX3BvcnRhbFNlcnZpY2UucHVzaEFjdGlvbiQpLFxyXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyKChbdXNlckxvZ2dlZGluLCBhY3Rpb25dKSA9PiB1c2VyTG9nZ2VkaW4pXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKFt1c2VyTG9nZ2VkaW4sIHB1c2hBY3Rpb25dKSA9PiB1c2VyTG9nZ2VkaW4pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoW3VzZXJMb2dnZWRpbiwgcHVzaEFjdGlvbl0pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChwdXNoQWN0aW9uICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXB1c2hBY3Rpb24ubm90aWZpY2F0aW9uVGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdXNoQWN0aW9uLm1vaWQgJiYgcHVzaEFjdGlvbi50cGlkICYmIHB1c2hBY3Rpb24uYWN0aW9uID09ICdzaG93Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBCYXJzYUFwaS5Cdy5Gb3JtLlNob3coeyBNb0lkOiBwdXNoQWN0aW9uLm1vaWQgfSksIDUwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkV4ZWN1dGVOb3RpZmljYXRpb25BY3Rpb24ocHVzaEFjdGlvbi5ub3RpZmljYXRpb25UYWcsIHB1c2hBY3Rpb24uYWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfaW5pdExhbmRzY2FwZSgpOiB2b2lkIHtcclxuICAgICAgICB3aW5kb3cubWF0Y2hNZWRpYSgnKG9yaWVudGF0aW9uOiBwb3J0cmFpdCknKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpc01hdGNoID0gZS5tYXRjaGVzO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzTWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RldmljZUxhbmRzY2FwZSQubmV4dChmYWxzZSk7IC8vIHBvcnRyYWl0XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kZXZpY2VMYW5kc2NhcGUkLm5leHQodHJ1ZSk7IC8vIGxhbmRzY2FwZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGZpbmRQYWdlQnlSb3V0ZSh1cmw6IHN0cmluZyk6IFBhZ2VEYXRhTW9kZWwgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBmaW5kZWRQYWdlID0gdGhpcy5wYWdlcy5maW5kKChjKSA9PiBjLlJvdXRlID09PSB1cmwpO1xyXG4gICAgICAgIHJldHVybiBmaW5kZWRQYWdlIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGdldE5nTW9kdWxlRmFjdG9yeShtb2R1bGVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBtb2R1bGVOYW1lOiBzdHJpbmcpOiBOZ01vZHVsZUZhY3Rvcnk8YW55PiB7XHJcbiAgICAgICAgY29uc3QgbW9kdWxlQ2xhc3MgPSBtb2R1bGVzW21vZHVsZU5hbWUgKyAnTW9kdWxlJ107XHJcbiAgICAgICAgbGV0IG1vZHVsZUZhY3Rvcnk6IE5nTW9kdWxlRmFjdG9yeTxhbnk+O1xyXG4gICAgICAgIGlmIChtb2R1bGVDbGFzcyBpbnN0YW5jZW9mIE5nTW9kdWxlRmFjdG9yeSkge1xyXG4gICAgICAgICAgICBtb2R1bGVGYWN0b3J5ID0gbW9kdWxlQ2xhc3M7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY29tcGlsZWQgPSB0aGlzLmNvbXBpbGVyLmNvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luYyhtb2R1bGVDbGFzcyk7XHJcbiAgICAgICAgICAgIG1vZHVsZUZhY3RvcnkgPSBjb21waWxlZC5uZ01vZHVsZUZhY3Rvcnk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtb2R1bGVGYWN0b3J5O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0UmVnaXN0ZXJlZE1vZHVsZXModW1kOiBzdHJpbmcsIGV4cG9ydEFzOiBzdHJpbmdbXSwgbW9kdWxlTmFtZTogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XHJcbiAgICAgICAgbGV0IG1vZHVsZXM7XHJcbiAgICAgICAgaWYgKHVtZCAhPT0gJycpIHtcclxuICAgICAgICAgICAgbW9kdWxlcyA9IHdpbmRvdztcclxuICAgICAgICAgICAgdW1kLnNwbGl0KCcuJykuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGVzICE9PSB0eXBlb2YgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlcyA9IG1vZHVsZXNbY107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1vZHVsZXMgPSB3aW5kb3dbbW9kdWxlTmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChleHBvcnRBcy5sZW5ndGggPiAwICYmIG1vZHVsZXMpIHtcclxuICAgICAgICAgICAgZXhwb3J0QXMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZU9uT2JqZWN0KGMsIDAsIG1vZHVsZXMsIHdpbmRvdyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbW9kdWxlcztcclxuICAgIH1cclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIExpYnJhcnlEZXBlbmVjeSB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBrZWJhYk5hbWU6IHN0cmluZztcclxuICAgIHVtZDogc3RyaW5nO1xyXG4gICAgZXhwb3J0QXM6IHN0cmluZ1tdO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgQnJlYWRDcnVtYkluZm8ge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHVybDogc3RyaW5nO1xyXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlO1xyXG59XHJcbiJdfQ==