barsa-novin-ray-core 2.1.1 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/fesm2022/barsa-novin-ray-core.mjs +254 -135
  2. package/fesm2022/barsa-novin-ray-core.mjs.map +1 -1
  3. package/package.json +3 -5
  4. package/esm2022/barsa-novin-ray-core.mjs +0 -5
  5. package/esm2022/lib/abstract-classes/application-base.mjs +0 -24
  6. package/esm2022/lib/abstract-classes/barsa-api.mjs +0 -43
  7. package/esm2022/lib/abstract-classes/base-column-props.mjs +0 -84
  8. package/esm2022/lib/abstract-classes/base.component.mjs +0 -59
  9. package/esm2022/lib/abstract-classes/field-base.mjs +0 -232
  10. package/esm2022/lib/abstract-classes/files-validation-helper.mjs +0 -75
  11. package/esm2022/lib/abstract-classes/form-base.mjs +0 -163
  12. package/esm2022/lib/abstract-classes/form-field-report-page.component.mjs +0 -54
  13. package/esm2022/lib/abstract-classes/form-page-base.mjs +0 -129
  14. package/esm2022/lib/abstract-classes/form-page.component.mjs +0 -53
  15. package/esm2022/lib/abstract-classes/form-props.base.mjs +0 -97
  16. package/esm2022/lib/abstract-classes/form-toolbar-base.mjs +0 -56
  17. package/esm2022/lib/abstract-classes/index.mjs +0 -25
  18. package/esm2022/lib/abstract-classes/layout-item-base.mjs +0 -48
  19. package/esm2022/lib/abstract-classes/layout-panel-base.mjs +0 -63
  20. package/esm2022/lib/abstract-classes/linear-list-helper.mjs +0 -135
  21. package/esm2022/lib/abstract-classes/models.mjs +0 -184
  22. package/esm2022/lib/abstract-classes/module-with-dynamic-components.mjs +0 -2
  23. package/esm2022/lib/abstract-classes/number-base.mjs +0 -200
  24. package/esm2022/lib/abstract-classes/page-base.mjs +0 -97
  25. package/esm2022/lib/abstract-classes/page-with-form-handler-base.mjs +0 -40
  26. package/esm2022/lib/abstract-classes/report-base.mjs +0 -254
  27. package/esm2022/lib/abstract-classes/report-item-base.mjs +0 -53
  28. package/esm2022/lib/abstract-classes/report-view-base.component.mjs +0 -428
  29. package/esm2022/lib/abstract-classes/system-base.mjs +0 -24
  30. package/esm2022/lib/abstract-classes/tile-props.mjs +0 -46
  31. package/esm2022/lib/auth-guard.mjs +0 -48
  32. package/esm2022/lib/barsa-novin-ray-core-routing.module.mjs +0 -292
  33. package/esm2022/lib/barsa-novin-ray-core.module.mjs +0 -487
  34. package/esm2022/lib/base-ulv-setting.component.mjs +0 -45
  35. package/esm2022/lib/base.module.mjs +0 -28
  36. package/esm2022/lib/button-loading/button-loading.component.mjs +0 -18
  37. package/esm2022/lib/constants.mjs +0 -898
  38. package/esm2022/lib/container.component.mjs +0 -99
  39. package/esm2022/lib/controllers/base-controller.mjs +0 -30
  40. package/esm2022/lib/controllers/index.mjs +0 -5
  41. package/esm2022/lib/controllers/login-controller.mjs +0 -54
  42. package/esm2022/lib/controllers/login-verification-controller.mjs +0 -56
  43. package/esm2022/lib/controllers/models.mjs +0 -2
  44. package/esm2022/lib/custom-route-reuse-strategy.mjs +0 -32
  45. package/esm2022/lib/date-services/date-hijri.service.mjs +0 -146
  46. package/esm2022/lib/date-services/date-info.mjs +0 -2
  47. package/esm2022/lib/date-services/date-miladi.service.mjs +0 -124
  48. package/esm2022/lib/date-services/date-shamsi.service.mjs +0 -148
  49. package/esm2022/lib/date-services/date.service.mjs +0 -149
  50. package/esm2022/lib/date-services/index.mjs +0 -6
  51. package/esm2022/lib/device.mjs +0 -663
  52. package/esm2022/lib/directives/absolute-div-body.directive.mjs +0 -45
  53. package/esm2022/lib/directives/anchor-scroll.directive.mjs +0 -24
  54. package/esm2022/lib/directives/attr-rtl.directive.mjs +0 -35
  55. package/esm2022/lib/directives/base.directive.mjs +0 -55
  56. package/esm2022/lib/directives/body-click.directive.mjs +0 -35
  57. package/esm2022/lib/directives/column-resizer.directive.mjs +0 -39
  58. package/esm2022/lib/directives/copy.directive.mjs +0 -59
  59. package/esm2022/lib/directives/count-down.directive.mjs +0 -108
  60. package/esm2022/lib/directives/dynamic-command.directive.mjs +0 -42
  61. package/esm2022/lib/directives/dynamic-style.directive.mjs +0 -57
  62. package/esm2022/lib/directives/ellapsis-text.directive.mjs +0 -69
  63. package/esm2022/lib/directives/ellipsify.directive.mjs +0 -72
  64. package/esm2022/lib/directives/field-binding.directive.mjs +0 -17
  65. package/esm2022/lib/directives/fill-empty-space.mjs +0 -83
  66. package/esm2022/lib/directives/form-close.directive.mjs +0 -32
  67. package/esm2022/lib/directives/img-lazy.directive.mjs +0 -81
  68. package/esm2022/lib/directives/index.mjs +0 -35
  69. package/esm2022/lib/directives/intersection-observer.directive.mjs +0 -51
  70. package/esm2022/lib/directives/items-renderer.directive.mjs +0 -59
  71. package/esm2022/lib/directives/label-mandatory.directive.mjs +0 -48
  72. package/esm2022/lib/directives/load-external-files.directive.mjs +0 -37
  73. package/esm2022/lib/directives/mobile.directive.mjs +0 -29
  74. package/esm2022/lib/directives/nowraptext.directive.mjs +0 -26
  75. package/esm2022/lib/directives/numbers-only-input.directive.mjs +0 -26
  76. package/esm2022/lib/directives/placeHolder.directive.mjs +0 -15
  77. package/esm2022/lib/directives/prevent-default.directive.mjs +0 -20
  78. package/esm2022/lib/directives/render-ulv-paging.directive.mjs +0 -80
  79. package/esm2022/lib/directives/render-ulv-viewer.directive.mjs +0 -75
  80. package/esm2022/lib/directives/route-form-change.directive.mjs +0 -37
  81. package/esm2022/lib/directives/stop-propagation.directive.mjs +0 -20
  82. package/esm2022/lib/directives/table-resizer.directive.mjs +0 -235
  83. package/esm2022/lib/directives/ulv-command.directive.mjs +0 -42
  84. package/esm2022/lib/directives/until-inview.directive.mjs +0 -52
  85. package/esm2022/lib/directives/workflow-choice-command.directive.mjs +0 -60
  86. package/esm2022/lib/dynamic-component/base-dynamic.component.mjs +0 -96
  87. package/esm2022/lib/dynamic-component/base-form-toolbaritem-props.mjs +0 -52
  88. package/esm2022/lib/dynamic-component/base-item-content-props.mjs +0 -80
  89. package/esm2022/lib/dynamic-component/base-view-content-props.mjs +0 -20
  90. package/esm2022/lib/dynamic-component/base-view-item-props.mjs +0 -525
  91. package/esm2022/lib/dynamic-component/base-view-props.mjs +0 -162
  92. package/esm2022/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +0 -38
  93. package/esm2022/lib/dynamic-component/dynamic-form.component.mjs +0 -66
  94. package/esm2022/lib/dynamic-component/dynamic-item.component.mjs +0 -76
  95. package/esm2022/lib/dynamic-component/dynamic-layout.component.mjs +0 -63
  96. package/esm2022/lib/dynamic-component/index.mjs +0 -11
  97. package/esm2022/lib/empty-page/empty-page.component.mjs +0 -44
  98. package/esm2022/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +0 -16
  99. package/esm2022/lib/field-ui/field-ui.component.mjs +0 -146
  100. package/esm2022/lib/form/form.component.mjs +0 -211
  101. package/esm2022/lib/form-new/form-new.component.mjs +0 -30
  102. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page-routing.module.mjs +0 -54
  103. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page.module.mjs +0 -29
  104. package/esm2022/lib/form-page-routing/constants.mjs +0 -9
  105. package/esm2022/lib/form-page-routing/index.mjs +0 -3
  106. package/esm2022/lib/from-intersection-observer.mjs +0 -53
  107. package/esm2022/lib/global-error-handler.mjs +0 -26
  108. package/esm2022/lib/injdection-tokens.mjs +0 -8
  109. package/esm2022/lib/login-enter-mobile/login-enter-mobile.component.mjs +0 -64
  110. package/esm2022/lib/login-verification/login-verification.component.mjs +0 -79
  111. package/esm2022/lib/login2/login2.component.mjs +0 -60
  112. package/esm2022/lib/modal-root.component.mjs +0 -33
  113. package/esm2022/lib/not-found/not-found.component.mjs +0 -16
  114. package/esm2022/lib/not-internet/not-internet.component.mjs +0 -21
  115. package/esm2022/lib/pipes/barsa-icon-dict.pipe.mjs +0 -19
  116. package/esm2022/lib/pipes/bbb-translate.pipe.mjs +0 -35
  117. package/esm2022/lib/pipes/can-upload.pipe.mjs +0 -30
  118. package/esm2022/lib/pipes/column-custom-component.pipe.mjs +0 -40
  119. package/esm2022/lib/pipes/column-customui.pipe.mjs +0 -32
  120. package/esm2022/lib/pipes/column-icon.pipe.mjs +0 -22
  121. package/esm2022/lib/pipes/column-value.pipe.mjs +0 -34
  122. package/esm2022/lib/pipes/combo-row-img.pipe.mjs +0 -16
  123. package/esm2022/lib/pipes/context-menu.pipe.mjs +0 -40
  124. package/esm2022/lib/pipes/control-ui.pipe.mjs +0 -31
  125. package/esm2022/lib/pipes/convert-to-style.pipe.mjs +0 -32
  126. package/esm2022/lib/pipes/date-time-to-caption.pipe.mjs +0 -34
  127. package/esm2022/lib/pipes/fileinfo-count.pipe.mjs +0 -20
  128. package/esm2022/lib/pipes/filter-columns-by-details.pipe.mjs +0 -22
  129. package/esm2022/lib/pipes/filter-string.pipe.mjs +0 -44
  130. package/esm2022/lib/pipes/filter-tab.pipe.mjs +0 -19
  131. package/esm2022/lib/pipes/filter-toolbar-control.pipe.mjs +0 -16
  132. package/esm2022/lib/pipes/filter-workflow-mobile.pipe.mjs +0 -24
  133. package/esm2022/lib/pipes/filter.pipe.mjs +0 -33
  134. package/esm2022/lib/pipes/find-column-by-db-name.pipe.mjs +0 -27
  135. package/esm2022/lib/pipes/find-preview-column.pipe.mjs +0 -19
  136. package/esm2022/lib/pipes/fiori-icon.pipe.mjs +0 -42
  137. package/esm2022/lib/pipes/groupby.pipe.mjs +0 -63
  138. package/esm2022/lib/pipes/header-facet-value.pipe.mjs +0 -22
  139. package/esm2022/lib/pipes/hide-columns-inmobile.pipe.mjs +0 -22
  140. package/esm2022/lib/pipes/index.mjs +0 -48
  141. package/esm2022/lib/pipes/list-count.pipe.mjs +0 -17
  142. package/esm2022/lib/pipes/merge-fields-to-columns.pipe.mjs +0 -42
  143. package/esm2022/lib/pipes/mo-info-ulv-data.pipe.mjs +0 -58
  144. package/esm2022/lib/pipes/mo-info-ulv-paging.pipe.mjs +0 -16
  145. package/esm2022/lib/pipes/mo-report-value-concat.pipe.mjs +0 -35
  146. package/esm2022/lib/pipes/mo-report-value.pipe.mjs +0 -17
  147. package/esm2022/lib/pipes/mo-value.pipe.mjs +0 -18
  148. package/esm2022/lib/pipes/multiple-groupby.pipe.mjs +0 -90
  149. package/esm2022/lib/pipes/numeral.pipe.mjs +0 -43
  150. package/esm2022/lib/pipes/picture-field-source.pipe.mjs +0 -22
  151. package/esm2022/lib/pipes/remove-newline.pipe.mjs +0 -20
  152. package/esm2022/lib/pipes/replace.pipe.mjs +0 -17
  153. package/esm2022/lib/pipes/reverse.pipe.mjs +0 -22
  154. package/esm2022/lib/pipes/rownumber.pipe.mjs +0 -25
  155. package/esm2022/lib/pipes/sanitize-text.pipe.mjs +0 -20
  156. package/esm2022/lib/pipes/seperator-fix.pipe.mjs +0 -23
  157. package/esm2022/lib/pipes/sort.pipe.mjs +0 -48
  158. package/esm2022/lib/pipes/th-image-icon.pipe.mjs +0 -22
  159. package/esm2022/lib/pipes/tlbButtons.pipe.mjs +0 -59
  160. package/esm2022/lib/pipes/total-summary.pipe.mjs +0 -16
  161. package/esm2022/lib/pipes/tree-item-isexpanded.pipe.mjs +0 -25
  162. package/esm2022/lib/pipes/visible-value.pipe.mjs +0 -18
  163. package/esm2022/lib/portal-page/portal-page.component.mjs +0 -23
  164. package/esm2022/lib/portal-page/portal-sidebar.component.mjs +0 -36
  165. package/esm2022/lib/redirect-home-guard.mjs +0 -51
  166. package/esm2022/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +0 -12
  167. package/esm2022/lib/report-container/report-container.component.mjs +0 -63
  168. package/esm2022/lib/resizable-module/resizable.component.mjs +0 -31
  169. package/esm2022/lib/resizable-module/resizable.directive.mjs +0 -41
  170. package/esm2022/lib/resizable-module/resizable.module.mjs +0 -17
  171. package/esm2022/lib/resolvers/index.mjs +0 -6
  172. package/esm2022/lib/resolvers/portal-dynamic-page.resolver.mjs +0 -49
  173. package/esm2022/lib/resolvers/portal-form-page.resolver.mjs +0 -18
  174. package/esm2022/lib/resolvers/portal-page.resolver.mjs +0 -30
  175. package/esm2022/lib/resolvers/portal-report-page.resolver.mjs +0 -37
  176. package/esm2022/lib/resolvers/tile-group-breadcrumb.resolver.mjs +0 -30
  177. package/esm2022/lib/root-page/root-page.component.mjs +0 -21
  178. package/esm2022/lib/root-portal/root-portal.component.mjs +0 -164
  179. package/esm2022/lib/server-connection-error/server-connection-error.component.mjs +0 -19
  180. package/esm2022/lib/services/api.service.mjs +0 -63
  181. package/esm2022/lib/services/audio-recording.service.mjs +0 -95
  182. package/esm2022/lib/services/barsa-dialog.service.mjs +0 -80
  183. package/esm2022/lib/services/barsa-storage.service.mjs +0 -78
  184. package/esm2022/lib/services/breadcrumb.service.mjs +0 -64
  185. package/esm2022/lib/services/column.service.mjs +0 -20
  186. package/esm2022/lib/services/container.service.mjs +0 -69
  187. package/esm2022/lib/services/dynamic-component.service.mjs +0 -55
  188. package/esm2022/lib/services/form-panel.service.mjs +0 -380
  189. package/esm2022/lib/services/form.service.mjs +0 -14
  190. package/esm2022/lib/services/horizontal-layout.service.mjs +0 -16
  191. package/esm2022/lib/services/index.mjs +0 -29
  192. package/esm2022/lib/services/indexeddb.service.mjs +0 -34
  193. package/esm2022/lib/services/layout.service.mjs +0 -42
  194. package/esm2022/lib/services/local-storage.service.mjs +0 -32
  195. package/esm2022/lib/services/log.service.mjs +0 -50
  196. package/esm2022/lib/services/network-status.service.mjs +0 -15
  197. package/esm2022/lib/services/notification-popup.service.mjs +0 -2
  198. package/esm2022/lib/services/notification-sw.service.mjs +0 -180
  199. package/esm2022/lib/services/notification.service.mjs +0 -308
  200. package/esm2022/lib/services/portal.service.mjs +0 -929
  201. package/esm2022/lib/services/prompt-update.service.mjs +0 -56
  202. package/esm2022/lib/services/routing.service.mjs +0 -60
  203. package/esm2022/lib/services/save-scoll-position.service.mjs +0 -29
  204. package/esm2022/lib/services/service-worker-communication.service.mjs +0 -120
  205. package/esm2022/lib/services/toast.service.mjs +0 -2
  206. package/esm2022/lib/services/ui.service.mjs +0 -23
  207. package/esm2022/lib/services/ulvmain.service.mjs +0 -810
  208. package/esm2022/lib/services/upload.service.mjs +0 -161
  209. package/esm2022/lib/services/video-recording.service.mjs +0 -115
  210. package/esm2022/public-api.mjs +0 -44
@@ -1,898 +0,0 @@
1
- /* eslint-disable */
2
- import { _isNumberValue } from '@angular/cdk/coercion';
3
- import { BarsaApi } from './abstract-classes/barsa-api';
4
- import { DateHijriService, DateMiladiService, DateShamsiService } from './date-services';
5
- import * as Device from './device';
6
- export var TableHeaderWidthMode;
7
- (function (TableHeaderWidthMode) {
8
- TableHeaderWidthMode[TableHeaderWidthMode["FitToRowContent"] = 1] = "FitToRowContent";
9
- TableHeaderWidthMode[TableHeaderWidthMode["FitToContainer"] = 2] = "FitToContainer";
10
- TableHeaderWidthMode[TableHeaderWidthMode["FreeColumnSize"] = 3] = "FreeColumnSize";
11
- TableHeaderWidthMode[TableHeaderWidthMode["ColumnWidth"] = 4] = "ColumnWidth";
12
- })(TableHeaderWidthMode || (TableHeaderWidthMode = {}));
13
- export function setTableThWidth(tableHeaderMode, columns, thList, renderer2) {
14
- let propName = '';
15
- switch (tableHeaderMode) {
16
- case TableHeaderWidthMode.FitToRowContent:
17
- propName = '$FitToContent';
18
- break;
19
- case TableHeaderWidthMode.FitToContainer:
20
- propName = '$FitContainerWidth';
21
- break;
22
- case TableHeaderWidthMode.FreeColumnSize:
23
- propName = '$Width';
24
- break;
25
- case TableHeaderWidthMode.ColumnWidth:
26
- propName = '$ColumnWidth';
27
- break;
28
- }
29
- thList.forEach((c, i) => {
30
- const wx = _calcWidthOfTh(columns[i], i, propName, thList);
31
- wx && renderer2.setStyle(c, 'width', wx);
32
- });
33
- }
34
- function _calcWidthOfTh(column, i, propName, thList) {
35
- if (!column) {
36
- return '';
37
- }
38
- if (column.$IsImageOricon && i < thList.length - 1) {
39
- const fieldTypeId = +column.FieldTypeId;
40
- if (fieldTypeId === 6 || fieldTypeId === 5 || fieldTypeId === 42) {
41
- return '24px';
42
- }
43
- debugger;
44
- }
45
- return column.$IsImageOricon && i < thList.length - 1 ? '42px' : column[propName];
46
- }
47
- export function calculateColumnContent(columns, moDataList) {
48
- columns.forEach((column) => {
49
- setColumnWidthByMaxMoContentWidth(moDataList, column);
50
- });
51
- }
52
- export function calculateColumnWidth(container, columns, moDataList, disableContextMenuOverflow, contextMenuItems) {
53
- columns
54
- .filter((c) => !c.Hidden)
55
- .forEach((column) => {
56
- setColumnCaptionWidth(column);
57
- });
58
- const contextMenuWidth = calcContextMenuWidth(contextMenuItems, disableContextMenuOverflow);
59
- return { columns: [...columns], contextMenuWidth };
60
- }
61
- function setColumnCaptionWidth(column) {
62
- if (column.$ColumnWidthNum) {
63
- return column.$ColumnWidthNum;
64
- }
65
- const colCaptionWidth = measureText(column.Alias) + 16 + 10;
66
- column.$ColumnWidthNum = Math.ceil(colCaptionWidth);
67
- column.$ColumnWidth = `${column.$ColumnWidthNum}px`;
68
- return colCaptionWidth;
69
- }
70
- export function setColumnWidthByMaxMoContentWidth(moDataList, column) {
71
- const width = calculateMoDataListContentWidthByColumnName(moDataList, column);
72
- column.$ContentWidth = `${Math.ceil(width)}px`;
73
- }
74
- export function calculateMoDataListContentWidthByColumnName(moDataList, column) {
75
- let maxWidth = 0;
76
- moDataList.forEach((c, index) => {
77
- const caption = getColumnValueOfMoDataList(column.Name, c, undefined, true);
78
- const captionWidth = measureText(caption) + 16;
79
- if (maxWidth < captionWidth) {
80
- maxWidth = captionWidth;
81
- }
82
- });
83
- return Math.ceil(maxWidth);
84
- }
85
- export function calculateFreeColumnSize(columns) {
86
- let allColWidth = 0;
87
- const visibleColumns = columns.filter((c) => !c.Hidden);
88
- visibleColumns.forEach((col, index) => {
89
- const x = setColumnCaptionWidth(col);
90
- const w = col.Width && col.Width > 0 ? col.Width : x;
91
- allColWidth += w;
92
- col.$Width = index === visibleColumns.length - 1 ? '100%' : `${w}px`;
93
- });
94
- return [...columns];
95
- }
96
- export function calculateColumnWidthFitToContainer(container, canView, disableContextMenuOverflow, contextMenuItems, columns) {
97
- let hasDefinedWidth = true;
98
- let containerWidth = columns.map((c) => c.Width).reduce((a, b) => a + b, 0);
99
- if (containerWidth === 0) {
100
- containerWidth = container.clientWidth;
101
- hasDefinedWidth = false;
102
- }
103
- let allColWidth = 0;
104
- const isMobile = getDeviceIsMobile();
105
- let remainPercent = 0;
106
- const lCols = columns.filter((c, i) => !c.Hidden && !(i === 0 && c.FieldTypeId === 41));
107
- lCols.forEach((col, index) => {
108
- // اگر فیلد از نوع رنگ نبود و ستون اول هم نبود
109
- const x = setColumnCaptionWidth(col);
110
- const w = col.Width && col.Width > 0 ? col.Width : x;
111
- allColWidth += w;
112
- const percent = (w / containerWidth) * 100;
113
- col.$FitContainerWidth = isMobile || col.Width === 0 ? '100%' : `${percent}%`;
114
- if (index === lCols.length - 1 && !hasDefinedWidth) {
115
- col.$FitContainerWidth = 100 - remainPercent + '%';
116
- }
117
- else {
118
- remainPercent += percent;
119
- }
120
- });
121
- // const canViewButtonWidth = canView ? 40 : 0;
122
- // const selectionWidth = 30;
123
- const contextMenuWidth = calcContextMenuWidth(contextMenuItems, disableContextMenuOverflow);
124
- // const containerWidthAllColumns = containerWidth - selectionWidth - canViewButtonWidth - contextMenuWidth - 12;
125
- // allColWidth += containerWidthAllColumns - allColWidth;// محاسبه آخرین ستون.چون width مشخصی ندارد
126
- // columns
127
- // .filter((c) => !c.Hidden)
128
- // .forEach((col) => {
129
- // const newWidth = Math.ceil((containerWidthAllColumns * col.Width) / allColWidth);
130
- // col.Width = newWidth;
131
- // col.$FitContainerWidth = `${newWidth}px`;
132
- // });
133
- return { columns: [...columns], contextMenuWidth };
134
- }
135
- export function calcContextMenuWidth(contextMenuItems, disableContextMenuOverflow) {
136
- let contextMenuWidth = contextMenuItems.length > 1 ? 40 : 0;
137
- const btnPadding = 14 + 2 + 10; // padding + border + if text is overflowed then add 5 pixel.so we always 5 px to it.
138
- const tdPadding = 15 + 1; // padding + border
139
- const buttonIconWidth = 16 + 6; // size + margin
140
- if (disableContextMenuOverflow || contextMenuItems.length === 1) {
141
- contextMenuWidth = 0;
142
- contextMenuItems.forEach((c) => {
143
- contextMenuWidth += measureText(c.text) + btnPadding + tdPadding;
144
- contextMenuWidth += c.icon ? buttonIconWidth : 0;
145
- });
146
- }
147
- return contextMenuWidth;
148
- }
149
- export function isInLocalMode() {
150
- const offlinceActive = BarsaApi.Common.Util.TryGetValue(BarsaApi.Offline, 'Settings.IsActive', false);
151
- const offlineTrue = BarsaApi.Common.Util.TryGetValue(BarsaApi.Offline, 'Settings.IsOffline', false);
152
- return offlinceActive && offlineTrue;
153
- }
154
- export function getLabelWidth(item) {
155
- const fieldXtype = item.FieldUi?.originalXtype;
156
- if (fieldXtype === 'Ui.Button' ||
157
- fieldXtype === 'Ui.CheckBox' ||
158
- !item.TextVisible ||
159
- item.CaptionSetting?.AlignMode === 'AutoSize') {
160
- return;
161
- }
162
- let labelCaption = item.Caption;
163
- if (labelCaption === '&zwnj;') {
164
- labelCaption = '';
165
- }
166
- labelCaption = labelCaption + ' * ';
167
- // if (item.FieldUi?.Setting?.IsMandatory) {
168
- // if (labelCaption.indexOf('*') < 0) {
169
- // }
170
- // } else {
171
- // labelCaption = labelCaption.replace('*', '');
172
- // }
173
- labelCaption += ':';
174
- const labelWidth = measureText(labelCaption);
175
- let labelWithPadding = labelWidth + 10;
176
- if (item.FieldUi?.Setting?.FieldIcon) {
177
- labelWithPadding += 24;
178
- }
179
- if (item.FieldUi?.Setting?.HelpDescription) {
180
- labelWithPadding += 24;
181
- }
182
- const controlWidth = Math.ceil(labelWithPadding);
183
- return controlWidth;
184
- }
185
- export function getColumnValueOfMoDataList(name, mo, Columns, caption) {
186
- let fieldName = Columns ? Columns.find((c) => c.Name === name || c.Alias === name)?.Name : name;
187
- if (!fieldName) {
188
- fieldName = name;
189
- }
190
- let val = fieldName ? mo[fieldName] : undefined;
191
- if (caption) {
192
- let captionVal = fieldName ? mo[fieldName]?.$Caption : undefined;
193
- if (typeof captionVal === 'undefined') {
194
- captionVal = mo[fieldName + '$Caption'];
195
- }
196
- if (typeof captionVal === 'undefined') {
197
- captionVal = val;
198
- }
199
- val = captionVal;
200
- }
201
- return val;
202
- }
203
- export function throwIfAlreadyLoaded(parentModule, moduleName) {
204
- if (parentModule) {
205
- throw new Error(`${moduleName} has already been loaded. Import ${moduleName} in the AppModule only.`);
206
- }
207
- }
208
- const measureTextValues = {};
209
- export function measureText(text, fontSize) {
210
- if (measureTextValues[text]) {
211
- return measureTextValues[text];
212
- }
213
- const measureTextDom = document.getElementById('measureText');
214
- if (!measureTextDom) {
215
- return -1;
216
- }
217
- const ctx = measureTextDom.getContext('2d');
218
- fontSize = fontSize ? fontSize : '0.885rem';
219
- ctx.font = `normal ${fontSize} IRANYekanDigits`;
220
- const x = ctx.measureText(text).width;
221
- measureTextValues[text] = x;
222
- return x;
223
- }
224
- export function genrateInlineMoId() {
225
- return (BarsaApi.idGenerator--).toString();
226
- }
227
- export function enumValueToStringSize(value, defaultValue) {
228
- switch (value) {
229
- case '1':
230
- return 's';
231
- case '2':
232
- return 'm';
233
- case '3':
234
- return 'l';
235
- default:
236
- return defaultValue;
237
- }
238
- }
239
- export function executeUlvCommandHandler(button, options) {
240
- if (button.Command && button.Command.Handler) {
241
- button.Command.Handler(button, options);
242
- }
243
- else if (button.handler) {
244
- button.handler.bind(button.scope)(button, options);
245
- }
246
- }
247
- export function getUniqueId(parts) {
248
- const stringArr = [];
249
- for (let i = 0; i < parts; i++) {
250
- // eslint-disable-next-line no-bitwise
251
- const S4 = (((1 + Math.random()) * 0x10000) | 0).toString(16);
252
- const S4_ = S4.length > 0 ? S4.substring(1) : '';
253
- stringArr.push(S4_);
254
- }
255
- return stringArr.join('-');
256
- }
257
- export function getDateService(logService, culture) {
258
- const defaultCulture = culture ?? BarsaApi.LoginFormData.Culture;
259
- switch (defaultCulture) {
260
- case 'fa-IR':
261
- return new DateShamsiService(logService);
262
- case 'ar-AE':
263
- return new DateHijriService(logService);
264
- default:
265
- return new DateMiladiService(logService);
266
- }
267
- }
268
- export function getAllItemsPerChildren(item, level, array, parentNode, autoOpenLevels) {
269
- let newItem = item;
270
- if (level > 0) {
271
- item.parentNode = parentNode;
272
- item.level = level;
273
- item.isExpand = item.isExpand ?? autoOpenLevels > level;
274
- item.visibility = item.parentNode.isExpand;
275
- array.push(newItem);
276
- }
277
- else {
278
- newItem = item;
279
- newItem.isExpand = true;
280
- }
281
- if (item.children) {
282
- item.children.forEach((child) => setOneDepthLevel(child));
283
- return item.children.map((i) => getAllItemsPerChildren(i, level + 1, array, newItem, autoOpenLevels));
284
- }
285
- }
286
- export function setOneDepthLevel(node) {
287
- let hasOneDepth = true;
288
- node.children?.forEach((child) => {
289
- if (child.Data?.$HasChildren) {
290
- hasOneDepth = false;
291
- return;
292
- }
293
- });
294
- node.hasOneDepthLevel = hasOneDepth;
295
- }
296
- export function isFirefox() {
297
- return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
298
- }
299
- export function getImagePath(type, moId, fileId, fieldDefId, size, sizeH) {
300
- moId = moId == null ? '' : encodeURIComponent(moId);
301
- fileId = fileId == null ? '' : encodeURIComponent(fileId);
302
- fieldDefId = fieldDefId == null ? '' : encodeURIComponent(fieldDefId);
303
- size = size == null ? 128 : size;
304
- sizeH = sizeH == null ? size : sizeH;
305
- const url = `/IH.ashx?ty=${type}&moId=${moId}&id=${fileId}&fdId=${fieldDefId}&si=${size}&siH=${sizeH}`;
306
- return url;
307
- }
308
- export function isFunction(functionToCheck) {
309
- return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
310
- }
311
- export function DeviceWidth() {
312
- return window.innerWidth > 0 ? window.innerWidth : screen.width;
313
- }
314
- export function getHeaderValue(fieldValue, returnValue) {
315
- if (typeof fieldValue !== 'object') {
316
- return fieldValue;
317
- }
318
- const value = fieldValue.Value;
319
- const valueCaption = fieldValue.Value$Caption;
320
- let valueObjectCaption = null;
321
- if (typeof value === 'object') {
322
- valueObjectCaption = fieldValue.Value.$Caption;
323
- }
324
- if (valueObjectCaption && !returnValue) {
325
- return valueObjectCaption;
326
- }
327
- if (valueCaption && !valueCaption.startsWith('tmp') && !returnValue) {
328
- return valueCaption;
329
- }
330
- return value;
331
- }
332
- export function elementInViewport2(el) {
333
- let top = el.offsetTop;
334
- let left = el.offsetLeft;
335
- const width = el.offsetWidth;
336
- const height = el.offsetHeight;
337
- while (el.offsetParent) {
338
- el = el.offsetParent;
339
- top += el.offsetTop;
340
- left += el.offsetLeft;
341
- }
342
- return (top < window.pageYOffset + window.innerHeight &&
343
- left < window.pageXOffset + window.innerWidth &&
344
- top + height > window.pageYOffset &&
345
- left + width > window.pageXOffset);
346
- }
347
- export function PreventDefaulEvent(e, propagationDisable = true) {
348
- if (propagationDisable) {
349
- stopPropagation(e);
350
- }
351
- e.preventDefault();
352
- }
353
- export function stopPropagation(e) {
354
- e.stopPropagation();
355
- }
356
- export function getParentHeight(elDom) {
357
- let parentDom = elDom.parentElement;
358
- let parentHeight = parentDom?.clientHeight ?? 0;
359
- while (parentDom != null && parentHeight < 40) {
360
- parentDom = parentDom.parentElement;
361
- parentHeight = parentDom?.clientHeight ?? 0;
362
- }
363
- return parentHeight;
364
- }
365
- export function getComponentDefined(controlUi, customUiSetting) {
366
- let moduleName = BarsaApi.LoginFormData.DefaultUiModule;
367
- let moduleKebabName = BarsaApi.Common.Util.GetKebabCase(moduleName);
368
- let componentName = controlUi.originalXtype.replace('.', '').replace('_', '');
369
- let selector = BarsaApi.Common.Util.GetKebabCase(componentName);
370
- selector = selector.substring(1, selector.length);
371
- selector = BarsaApi.LoginFormData.CustomUiPrefix + '-' + selector;
372
- if (customUiSetting && customUiSetting.Module) {
373
- moduleName = customUiSetting.Module;
374
- moduleKebabName = BarsaApi.Common.Util.GetKebabCase(moduleName);
375
- componentName = customUiSetting.Name;
376
- selector = customUiSetting.Selector;
377
- }
378
- const modulePath = moduleKebabName.slice(1, moduleKebabName.length);
379
- return { moduleName, modulePath, componentName, selector };
380
- }
381
- export function isSafari() {
382
- return Device.isSafari();
383
- }
384
- export function isFF() {
385
- return Device.isFF();
386
- }
387
- export function getDeviceIsPhone() {
388
- return Device.isPhone();
389
- }
390
- export function getDeviceIsDesktop() {
391
- return Device.isDesktop();
392
- }
393
- export function getDeviceIsTablet() {
394
- return Device.isTablet();
395
- }
396
- export function getDeviceIsMobile() {
397
- return navigator.userAgent.indexOf('mobi') > 0 || getDeviceIsPhone();
398
- }
399
- export function getControlSizeMode(el, deviceSize = 'l') {
400
- const containerWidth = el.offsetWidth;
401
- if (containerWidth === 0) {
402
- return deviceSize;
403
- }
404
- if (deviceSize === 's' || containerWidth < 600) {
405
- deviceSize = 's';
406
- }
407
- else if (deviceSize === 'm' || (containerWidth > 600 && containerWidth < 1200)) {
408
- deviceSize = 'm';
409
- }
410
- return deviceSize;
411
- }
412
- export function formatBytes(bytes, decimals = 2, size) {
413
- if (bytes === 0) {
414
- return '0 Bytes';
415
- }
416
- const k = 1024;
417
- const dm = decimals < 0 ? 0 : decimals;
418
- const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
419
- const i = sizes.findIndex((c) => c === size);
420
- return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
421
- }
422
- export function getValidExtension(validExtensions) {
423
- let _validExtensions = '';
424
- if (Array.isArray(validExtensions)) {
425
- _validExtensions = validExtensions.map((c) => '.' + c.Extension).join(',');
426
- }
427
- return _validExtensions;
428
- }
429
- export function getIcon(type) {
430
- return BarsaApi.Common.File.FileIconDict128[type];
431
- }
432
- export function isImage(type) {
433
- if (!type) {
434
- return false;
435
- }
436
- type = type.toLowerCase();
437
- return ['img', 'png', 'jpeg', 'jpg', 'gif', 'bmp', 'tiff', 'image'].indexOf(type) > -1;
438
- }
439
- export function GetAllColumnsSorted(context) {
440
- const allColumns = BarsaApi.Common.Util.TryGetValue(context, 'Setting.View.Columns', []).filter((c) => c.Name !== 'Id' && c.Name !== '$StyleIndex' && !c.Hidden);
441
- const colList = BarsaApi.Common.Util.TryGetValue(context, 'Setting.View.GridSetting.ColSettingList', []);
442
- const columns = new Array();
443
- colList.forEach((colS) => {
444
- const columnOfColList = allColumns.find((c) => c.Name === colS.Name);
445
- if (columnOfColList) {
446
- columns.push({ ...columnOfColList, Hidden: colS.IsHidden, Width: colS.Width });
447
- }
448
- });
449
- allColumns.forEach((column, index) => {
450
- const colSetting = colList.find((c) => c.Name === column.Name);
451
- if (!colSetting) {
452
- columns.splice(index, 0, { ...column, Hidden: colList.length > 0 ? true : false });
453
- }
454
- });
455
- return columns;
456
- }
457
- export function GetVisibleValue(object, field) {
458
- let outputValue;
459
- if (object[field]?.$Caption !== undefined) {
460
- outputValue = object[field].$Caption;
461
- }
462
- else {
463
- outputValue = object[field + '$Caption'] !== undefined ? object[field + '$Caption'] : object[field];
464
- }
465
- return outputValue;
466
- }
467
- export function GroupBy(collection, sortSettings) {
468
- const grouped = {};
469
- const groups = sortSettings.map((c) => c.Name);
470
- const getTitle = (mo, fieldName) => GetVisibleValue(mo, fieldName);
471
- collection.forEach((a) => {
472
- groups
473
- .reduce((o, g, i) => {
474
- const groupTitle = getTitle(a, g);
475
- o[groupTitle] = o[groupTitle] || (i + 1 === groups.length ? [] : {});
476
- if (Array.isArray(o[groupTitle])) {
477
- a.$Level = groups.length;
478
- let title = getTitle(a, groups[0]);
479
- let parent = grouped[title];
480
- parent.$Count = (parent.$Count ?? 0) + 1;
481
- for (let j = 1; j < groups.length - 1; j++) {
482
- title = getTitle(a, groups[j]);
483
- parent = parent[title];
484
- parent.$Count = o[groupTitle].length + 1;
485
- }
486
- }
487
- else {
488
- const a2 = FindGroup(groupTitle, a);
489
- o[groupTitle].$Expanded = a2?.$Expanded;
490
- o[groupTitle].$Visibility = a2?.$Visibility;
491
- }
492
- return o[groupTitle];
493
- }, grouped)
494
- .push(a);
495
- });
496
- return { grouped, groups };
497
- }
498
- export function FindGroup(groupTitle, a) {
499
- if (a.$Group === groupTitle) {
500
- return a;
501
- }
502
- if (a.$Parent) {
503
- return FindGroup(groupTitle, a.$Parent);
504
- }
505
- }
506
- export function FillAllLayoutControls(item, layoutControls) {
507
- if (item.xtype === 'Ly.LayoutControl') {
508
- layoutControls.push(item);
509
- return;
510
- }
511
- if (!item.items?.length) {
512
- return;
513
- }
514
- item.items.forEach((c) => FillAllLayoutControls(c, layoutControls));
515
- }
516
- export function FindToolbarItem(toolbarItems, value, prop = 'text') {
517
- if (!toolbarItems?.length) {
518
- return null;
519
- }
520
- const findInArray = (toolbarItems, value) => {
521
- let item = null;
522
- toolbarItems.forEach((c) => {
523
- if (typeof c === 'object' && !item) {
524
- if (c[prop] === value) {
525
- item = c;
526
- return;
527
- }
528
- else if (c.menu?.items?.length) {
529
- item = findInArray(c.menu.items, value);
530
- }
531
- }
532
- });
533
- return item;
534
- };
535
- return findInArray(toolbarItems, value);
536
- }
537
- export function FindLayoutSettingFromLayout94(layout94, layoutTitle) {
538
- if (!layoutTitle) {
539
- return null;
540
- }
541
- if (layout94.Caption === layoutTitle || layout94.Title === layoutTitle || layout94.ControlId === layoutTitle) {
542
- return layout94;
543
- }
544
- let tempLayout94 = null;
545
- if (layout94.items?.length) {
546
- for (let i = 0; i < layout94.items.length; i++) {
547
- if (!tempLayout94) {
548
- tempLayout94 = FindLayoutSettingFromLayout94(layout94.items[i], layoutTitle);
549
- }
550
- }
551
- }
552
- return tempLayout94;
553
- }
554
- export function getGridSettings(context) {
555
- const gridSetting = BarsaApi.Common.Util.TryGetValue(context, 'Setting.View.GridSetting', null);
556
- return {
557
- ColSettingList: gridSetting?.ColSettingList ?? null,
558
- SortSettingList: gridSetting?.SortSettingList ?? [],
559
- AutoSizeColumns: gridSetting?.AutoSizeColumns ?? false
560
- };
561
- }
562
- export function getResetGridSettings(columns, context) {
563
- const colList = columns;
564
- const settings = getGridSettings(context);
565
- settings.ColSettingList = colList.map((c) => ({
566
- IsHidden: c.Hidden,
567
- Name: c.Name,
568
- Width: c.Width,
569
- Caption: c.Caption
570
- }));
571
- return settings;
572
- }
573
- export function GetDefaultMoObjectInfo(typeDefId) {
574
- return {
575
- Id: '0',
576
- $Caption: '',
577
- $TypeDefId: typeDefId,
578
- $State: 'New',
579
- $Type: 'Common.MetaObjectWeb',
580
- $FieldDict: {}
581
- };
582
- }
583
- export function getLayout94ObjectInfo() {
584
- return {
585
- Type: 'Root',
586
- ControlId: 'ریشه',
587
- xtype: 'Ly.LayoutContainer',
588
- Bounds: { x: 0, y: 0, width: 432, height: 24 },
589
- items: [
590
- {
591
- Type: 'VerticalJoin',
592
- xtype: 'Ly.LayoutJoin',
593
- IsVertical: true,
594
- Bounds: { x: 0, y: 0, width: 432, height: 82 },
595
- items: []
596
- }
597
- ]
598
- };
599
- }
600
- export function getFormSettings(typeDefId) {
601
- const mo = GetDefaultMoObjectInfo(typeDefId);
602
- const formPanelSettings = {
603
- View: {
604
- Layout94: getLayout94ObjectInfo,
605
- ControlInfo: [],
606
- TypeDefId: typeDefId
607
- },
608
- IsSearchPanel: true,
609
- Data: {
610
- Mo: mo
611
- }
612
- };
613
- return formPanelSettings;
614
- }
615
- export function createFormPanelMetaConditions(typeDefId, controlsInfo, controlName, value) {
616
- const formSettings = getFormSettings(typeDefId);
617
- formSettings.View.ControlInfo = JSON.parse(JSON.stringify(controlsInfo));
618
- formSettings.View.Layout94.items[0].items.push(...controlsInfo.map((c) => getLayoutControl(c.ControlName)));
619
- formSettings.Data.Mo[controlName] = value;
620
- const formPanelCtrlr = new BarsaApi.Ul.FormPanelCtrlr({
621
- Setting: formSettings,
622
- Features: {
623
- Workflow: false,
624
- Toolbar: false,
625
- InfoBar: false
626
- }
627
- });
628
- return formPanelCtrlr;
629
- }
630
- export function getNewMoGridEditor(formSettings, typedefId) {
631
- const newFormSettings = JSON.parse(JSON.stringify(formSettings));
632
- return { ...newFormSettings.Data.Mo, $TypeDefId: typedefId };
633
- }
634
- export function createGridEditorFormPanel(formSettings, mo, typedef, relation, rewriteLayout = true, UlvMainCtrlr = null) {
635
- const newFormSettings = JSON.parse(JSON.stringify(formSettings));
636
- newFormSettings.Data.Mo = { ...mo, $TypeDefId: typedef };
637
- if (rewriteLayout) {
638
- newFormSettings.View.Layout94 = getLayout94ObjectInfo();
639
- newFormSettings.View.Layout94.items[0].items.push(...newFormSettings.View.ControlInfo.map((c) => getLayoutControl(c.ControlName, c.ControlFieldCaptionTranslated, false)));
640
- }
641
- const formRequestParams = new BarsaApi.Ul.FormRequestParams({
642
- MoId: newFormSettings.Data.Mo.Id,
643
- TypeDefId: typedef,
644
- Relation: relation
645
- // MoContext: {
646
- // ReportId: '',
647
- // ViewId: '',
648
- // ViewName: '',
649
- // CondFormating: '',
650
- // IncludeInReport: ''
651
- // }
652
- });
653
- const formPanelCtrlr = new BarsaApi.Ul.FormPanelCtrlr({
654
- Setting: newFormSettings,
655
- Relation: relation,
656
- UlvMainCtrlr: UlvMainCtrlr,
657
- Features: {
658
- Workflow: false,
659
- Toolbar: false,
660
- InfoBar: false
661
- },
662
- FormRequestParams: formRequestParams
663
- });
664
- return formPanelCtrlr;
665
- }
666
- export function getLayoutControl(controlName, controlCaption = '', hide = true) {
667
- return {
668
- xtype: 'Ly.LayoutControl',
669
- Type: 'LayoutControlItem',
670
- ControlId: controlName,
671
- IsVertical: false,
672
- TextLocation: 'Right',
673
- TextVisible: false,
674
- Visible: !hide,
675
- hide,
676
- UseLayoutItemTextForControl: false,
677
- Caption: controlCaption,
678
- AccessibleName: '',
679
- Bounds: { x: 0, y: 0, width: 432, height: 24 },
680
- MinSize: { width: 89, height: 24 },
681
- MaxSize: { width: 0, height: 24 },
682
- ControlBounds: { width: 388, height: 20 },
683
- ControlMinSize: { width: 45, height: 20 },
684
- ControlMaxSize: { width: 0, height: 20 },
685
- Padding: [2, 2, 2, 2],
686
- LabelSize: { width: 35, height: 13 },
687
- originalXtype: ''
688
- };
689
- }
690
- export function getControlList(mo, controlDbNames, isSearchPanel, isGridEditor) {
691
- return new Promise((resolve, reject) => {
692
- BarsaApi.Common.Ajax.GetServerData('Form94.GetControlInfos', {
693
- controlInfoParameter: {
694
- FieldDbNames: controlDbNames,
695
- Mo: new BarsaApi.Common.MetaObjectWeb(mo),
696
- IsSearchPanel: isSearchPanel,
697
- IsGridEditor: isGridEditor
698
- }
699
- }, (m) => {
700
- resolve(m);
701
- }, (err) => {
702
- reject(err);
703
- });
704
- });
705
- }
706
- export function shallowEqual(objA, objB) {
707
- if (objA === objB) {
708
- return true;
709
- }
710
- if (typeof objA !== 'object' || !objA || typeof objB !== 'object' || !objB) {
711
- return false;
712
- }
713
- const keysA = Object.keys(objA);
714
- const keysB = Object.keys(objB);
715
- if (keysA.length !== keysB.length) {
716
- return false;
717
- }
718
- const bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);
719
- // eslint-disable-next-line @typescript-eslint/prefer-for-of
720
- for (let idx = 0; idx < keysA.length; idx++) {
721
- const key = keysA[idx];
722
- if (!bHasOwnProperty(key)) {
723
- return false;
724
- }
725
- if (objA[key] !== objB[key]) {
726
- return false;
727
- }
728
- }
729
- return true;
730
- }
731
- export function toNumber(value, fallbackValue = 0) {
732
- return _isNumberValue(value) ? Number(value) : fallbackValue;
733
- }
734
- function propDecoratorFactory(name, fallback) {
735
- function propDecorator(target, propName, originalDescriptor) {
736
- const privatePropName = `$$__zorroPropDecorator__${propName}`;
737
- if (Object.prototype.hasOwnProperty.call(target, privatePropName)) {
738
- // warn(`The prop "${privatePropName}" is already exist, it will be overrided by ${name} decorator.`);
739
- }
740
- Object.defineProperty(target, privatePropName, {
741
- configurable: true,
742
- writable: true
743
- });
744
- return {
745
- get() {
746
- return originalDescriptor && originalDescriptor.get
747
- ? originalDescriptor.get.bind(this)()
748
- : this[privatePropName];
749
- },
750
- set(value) {
751
- if (originalDescriptor && originalDescriptor.set) {
752
- originalDescriptor.set.bind(this)(fallback(value));
753
- }
754
- this[privatePropName] = fallback(value);
755
- }
756
- };
757
- }
758
- return propDecorator;
759
- }
760
- export function InputNumber(fallbackValue) {
761
- return propDecoratorFactory('InputNumber', (value) => toNumber(value, fallbackValue));
762
- }
763
- export var AffixRespondEvents;
764
- (function (AffixRespondEvents) {
765
- AffixRespondEvents["resize"] = "resize";
766
- AffixRespondEvents["scroll"] = "scroll";
767
- AffixRespondEvents["touchstart"] = "touchstart";
768
- AffixRespondEvents["touchmove"] = "touchmove";
769
- AffixRespondEvents["touchend"] = "touchend";
770
- AffixRespondEvents["pageshow"] = "pageshow";
771
- AffixRespondEvents["load"] = "LOAD";
772
- })(AffixRespondEvents || (AffixRespondEvents = {}));
773
- export function isTargetWindow(target) {
774
- return typeof window !== 'undefined' && target === window;
775
- }
776
- export function getTargetRect(target) {
777
- return !isTargetWindow(target)
778
- ? target.getBoundingClientRect()
779
- : {
780
- top: 0,
781
- left: 0,
782
- bottom: 0
783
- };
784
- }
785
- export function getFieldValue(name, mo, caption) {
786
- if (mo.GetFValueByCaption) {
787
- let result = mo.GetFValue(name);
788
- if (caption) {
789
- result = mo.GetFCaption(name);
790
- }
791
- if (typeof caption === 'undefined' && mo.InheritanceInfo && !(mo.$FieldDict && mo.$FieldDict[name])) {
792
- const { ParentFieldName } = mo.InheritanceInfo;
793
- const moParent = mo.GetFValue(ParentFieldName);
794
- let result = moParent.GetFValue(name);
795
- if (caption) {
796
- result = moParent.GetFCaption(name);
797
- }
798
- }
799
- return result;
800
- }
801
- const fieldName = mo.$FieldDict && mo.$FieldDict[name] ? mo.$FieldDict[name] : name;
802
- let val = mo[fieldName];
803
- if (caption) {
804
- let captionVal = mo[fieldName]?.$Caption;
805
- if (typeof captionVal !== 'string') {
806
- if (!captionVal) {
807
- captionVal = mo[fieldName + '$Caption'];
808
- }
809
- if (!captionVal) {
810
- captionVal = val;
811
- }
812
- }
813
- val = captionVal;
814
- }
815
- return val;
816
- }
817
- /* eslint-disable no-invalid-this */
818
- export const availablePrefixes = ['moz', 'ms', 'webkit'];
819
- export function requestAnimationFramePolyfill() {
820
- let lastTime = 0;
821
- return function (callback) {
822
- const currTime = new Date().getTime();
823
- const timeToCall = Math.max(0, 16 - (currTime - lastTime));
824
- const id = setTimeout(() => {
825
- callback(currTime + timeToCall);
826
- }, timeToCall);
827
- lastTime = currTime + timeToCall;
828
- return id;
829
- };
830
- }
831
- export function ExecuteDynamicCommand(command, mo = null) {
832
- const e = { command, DynamicSetting: mo, Mo: mo };
833
- BarsaApi.Common.CustomCodeManager.RunDynamicCommand(command.Id, e);
834
- }
835
- export function ExecuteWorkflowChoiceDef(scope, param, success, failed) {
836
- BarsaApi.Common.Ajax.GetServerData('Workflow94.ChoiceSelect', param, (result) => {
837
- success(result);
838
- }, // success
839
- (error) => {
840
- failed(error);
841
- }, // error
842
- () => { }, // doReturn
843
- scope, true);
844
- }
845
- export function getRequestAnimationFrame() {
846
- if (typeof window === 'undefined') {
847
- return () => 0;
848
- }
849
- if (window.requestAnimationFrame) {
850
- // https://github.com/vuejs/vue/issues/4465
851
- return window.requestAnimationFrame.bind(window);
852
- }
853
- const prefix = availablePrefixes.filter((key) => `${key}RequestAnimationFrame` in window)[0];
854
- return prefix ? window[`${prefix}RequestAnimationFrame`] : requestAnimationFramePolyfill();
855
- }
856
- export function cancelRequestAnimationFrame(id) {
857
- if (typeof window === 'undefined') {
858
- return null;
859
- }
860
- if (window.cancelAnimationFrame) {
861
- return window.cancelAnimationFrame(id);
862
- }
863
- const prefix = availablePrefixes.filter((key) => `${key}CancelAnimationFrame` in window || `${key}CancelRequestAnimationFrame` in window)[0];
864
- return prefix
865
- ? (window[`${prefix}CancelAnimationFrame`] ||
866
- window[`${prefix}CancelRequestAnimationFrame`])
867
- // @ts-ignore
868
- .call(this, id)
869
- : clearTimeout(id);
870
- }
871
- export function easeInOutCubic(t, b, c, d) {
872
- const cc = c - b;
873
- let tt = t / (d / 2);
874
- if (tt < 1) {
875
- return (cc / 2) * tt * tt * tt + b;
876
- }
877
- else {
878
- return (cc / 2) * ((tt -= 2) * tt * tt + 2) + b;
879
- }
880
- }
881
- export const WordMimeType = '.doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document';
882
- export const ImageMimeType = '.jpeg,.jpg,.gif,.png,.bmp,.tif,image/*';
883
- export const PdfMimeType = '.pdf';
884
- export const AllFilesMimeType = '.txt,.ppt,.pdf,.*';
885
- export const VideoMimeType = 'video/*';
886
- export const AudioMimeType = 'audio/*';
887
- export function ChangeLayoutInfoCustomUi(layoutInfo, componentUi) {
888
- layoutInfo.FieldUi.Setting.CustomUi = componentUi;
889
- }
890
- export const mobile_regex = new RegExp('^(\\+98|0)?9\\d{9}$');
891
- export const number_only = new RegExp('^[0-9]+$');
892
- export function forbiddenValidator(nameRe) {
893
- return (control) => {
894
- const forbidden = nameRe.test(control.value);
895
- return !forbidden ? { forbiddenName: { value: control.value } } : null;
896
- };
897
- }
898
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etbm92aW4tcmF5LWNvcmUvc3JjL2xpYi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFleEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFlLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEcsT0FBTyxLQUFLLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFLbkMsTUFBTSxDQUFOLElBQVksb0JBS1g7QUFMRCxXQUFZLG9CQUFvQjtJQUM1QixxRkFBbUIsQ0FBQTtJQUNuQixtRkFBa0IsQ0FBQTtJQUNsQixtRkFBa0IsQ0FBQTtJQUNsQiw2RUFBZSxDQUFBO0FBQ25CLENBQUMsRUFMVyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBSy9CO0FBQ0QsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsZUFBcUMsRUFDckMsT0FBMkIsRUFDM0IsTUFBOEIsRUFDOUIsU0FBb0I7SUFFcEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLFFBQVEsZUFBZSxFQUFFLENBQUM7UUFDdEIsS0FBSyxvQkFBb0IsQ0FBQyxlQUFlO1lBQ3JDLFFBQVEsR0FBRyxlQUFlLENBQUM7WUFDM0IsTUFBTTtRQUNWLEtBQUssb0JBQW9CLENBQUMsY0FBYztZQUNwQyxRQUFRLEdBQUcsb0JBQW9CLENBQUM7WUFDaEMsTUFBTTtRQUNWLEtBQUssb0JBQW9CLENBQUMsY0FBYztZQUNwQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ3BCLE1BQU07UUFDVixLQUFLLG9CQUFvQixDQUFDLFdBQVc7WUFDakMsUUFBUSxHQUFHLGNBQWMsQ0FBQztZQUMxQixNQUFNO0lBQ2Qs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LENBQUMsQ0FBQztBQUM5RCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDbEQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDN0MsT0FBTyxDQUFDLE9BQXdCLEVBQTJCLEVBQUU7UUFDekQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRSxDQUFDLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IF9pc051bWJlclZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IEJhcnNhQXBpIH0gZnJvbSAnLi9hYnN0cmFjdC1jbGFzc2VzL2JhcnNhLWFwaSc7XG5pbXBvcnQge1xuICAgIEFiYnJldmF0aW9uRGV2aWNlU2l6ZSxcbiAgICBDb2xTZXR0aW5nLFxuICAgIEVqcmF5T2xnbyxcbiAgICBGb3JtU2V0dGluZyxcbiAgICBHZW5lcmFsQ29udHJvbEluZm9Nb2RlbCxcbiAgICBHcmlkU2V0dGluZyxcbiAgICBMYXlvdXRTZXR0aW5nLFxuICAgIE1lbnVJdGVtLFxuICAgIE1ldGFvYmplY3REYXRhTW9kZWwsXG4gICAgUmVwb3J0Vmlld0NvbHVtbixcbiAgICBTb3J0U2V0dGluZyxcbiAgICBUcmVlTm9kZU9ialxufSBmcm9tICcuL2Fic3RyYWN0LWNsYXNzZXMvbW9kZWxzJztcbmltcG9ydCB7IERhdGVIaWpyaVNlcnZpY2UsIERhdGVNaWxhZGlTZXJ2aWNlLCBEYXRlU2VydmljZSwgRGF0ZVNoYW1zaVNlcnZpY2UgfSBmcm9tICcuL2RhdGUtc2VydmljZXMnO1xuaW1wb3J0ICogYXMgRGV2aWNlIGZyb20gJy4vZGV2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuZXhwb3J0IGVudW0gVGFibGVIZWFkZXJXaWR0aE1vZGUge1xuICAgIEZpdFRvUm93Q29udGVudCA9IDEsXG4gICAgRml0VG9Db250YWluZXIgPSAyLFxuICAgIEZyZWVDb2x1bW5TaXplID0gMyxcbiAgICBDb2x1bW5XaWR0aCA9IDRcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRUYWJsZVRoV2lkdGgoXG4gICAgdGFibGVIZWFkZXJNb2RlOiBUYWJsZUhlYWRlcldpZHRoTW9kZSxcbiAgICBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW10sXG4gICAgdGhMaXN0OiBIVE1MVGFibGVDZWxsRWxlbWVudFtdLFxuICAgIHJlbmRlcmVyMjogUmVuZGVyZXIyXG4pOiB2b2lkIHtcbiAgICBsZXQgcHJvcE5hbWUgPSAnJztcbiAgICBzd2l0Y2ggKHRhYmxlSGVhZGVyTW9kZSkge1xuICAgICAgICBjYXNlIFRhYmxlSGVhZGVyV2lkdGhNb2RlLkZpdFRvUm93Q29udGVudDpcbiAgICAgICAgICAgIHByb3BOYW1lID0gJyRGaXRUb0NvbnRlbnQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVGFibGVIZWFkZXJXaWR0aE1vZGUuRml0VG9Db250YWluZXI6XG4gICAgICAgICAgICBwcm9wTmFtZSA9ICckRml0Q29udGFpbmVyV2lkdGgnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVGFibGVIZWFkZXJXaWR0aE1vZGUuRnJlZUNvbHVtblNpemU6XG4gICAgICAgICAgICBwcm9wTmFtZSA9ICckV2lkdGgnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVGFibGVIZWFkZXJXaWR0aE1vZGUuQ29sdW1uV2lkdGg6XG4gICAgICAgICAgICBwcm9wTmFtZSA9ICckQ29sdW1uV2lkdGgnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoTGlzdC5mb3JFYWNoKChjLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHd4ID0gX2NhbGNXaWR0aE9mVGgoY29sdW1uc1tpXSwgaSwgcHJvcE5hbWUsIHRoTGlzdCk7XG4gICAgICAgIHd4ICYmIHJlbmRlcmVyMi5zZXRTdHlsZShjLCAnd2lkdGgnLCB3eCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBfY2FsY1dpZHRoT2ZUaChjb2x1bW46IFJlcG9ydFZpZXdDb2x1bW4sIGk6IG51bWJlciwgcHJvcE5hbWU6IHN0cmluZywgdGhMaXN0KTogc3RyaW5nIHtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChjb2x1bW4uJElzSW1hZ2VPcmljb24gJiYgaSA8IHRoTGlzdC5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkVHlwZUlkID0gK2NvbHVtbi5GaWVsZFR5cGVJZDtcbiAgICAgICAgaWYgKGZpZWxkVHlwZUlkID09PSA2IHx8IGZpZWxkVHlwZUlkID09PSA1IHx8IGZpZWxkVHlwZUlkID09PSA0Mikge1xuICAgICAgICAgICAgcmV0dXJuICcyNHB4JztcbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbi4kSXNJbWFnZU9yaWNvbiAmJiBpIDwgdGhMaXN0Lmxlbmd0aCAtIDEgPyAnNDJweCcgOiBjb2x1bW5bcHJvcE5hbWVdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUNvbHVtbkNvbnRlbnQoY29sdW1uczogUmVwb3J0Vmlld0NvbHVtbltdLCBtb0RhdGFMaXN0OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pOiB2b2lkIHtcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICBzZXRDb2x1bW5XaWR0aEJ5TWF4TW9Db250ZW50V2lkdGgobW9EYXRhTGlzdCwgY29sdW1uKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb2x1bW5XaWR0aChcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIGNvbHVtbnM6IFJlcG9ydFZpZXdDb2x1bW5bXSxcbiAgICBtb0RhdGFMaXN0OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10sXG4gICAgZGlzYWJsZUNvbnRleHRNZW51T3ZlcmZsb3c6IGJvb2xlYW4sXG4gICAgY29udGV4dE1lbnVJdGVtczogTWVudUl0ZW1bXVxuKTogeyBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW107IGNvbnRleHRNZW51V2lkdGg6IG51bWJlciB9IHtcbiAgICBjb2x1bW5zXG4gICAgICAgIC5maWx0ZXIoKGMpID0+ICFjLkhpZGRlbilcbiAgICAgICAgLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgc2V0Q29sdW1uQ2FwdGlvbldpZHRoKGNvbHVtbik7XG4gICAgICAgIH0pO1xuICAgIGNvbnN0IGNvbnRleHRNZW51V2lkdGggPSBjYWxjQ29udGV4dE1lbnVXaWR0aChjb250ZXh0TWVudUl0ZW1zLCBkaXNhYmxlQ29udGV4dE1lbnVPdmVyZmxvdyk7XG4gICAgcmV0dXJuIHsgY29sdW1uczogWy4uLmNvbHVtbnNdLCBjb250ZXh0TWVudVdpZHRoIH07XG59XG5mdW5jdGlvbiBzZXRDb2x1bW5DYXB0aW9uV2lkdGgoY29sdW1uOiBSZXBvcnRWaWV3Q29sdW1uKTogbnVtYmVyIHtcbiAgICBpZiAoY29sdW1uLiRDb2x1bW5XaWR0aE51bSkge1xuICAgICAgICByZXR1cm4gY29sdW1uLiRDb2x1bW5XaWR0aE51bTtcbiAgICB9XG4gICAgY29uc3QgY29sQ2FwdGlvbldpZHRoID0gbWVhc3VyZVRleHQoY29sdW1uLkFsaWFzKSArIDE2ICsgMTA7XG4gICAgY29sdW1uLiRDb2x1bW5XaWR0aE51bSA9IE1hdGguY2VpbChjb2xDYXB0aW9uV2lkdGgpO1xuICAgIGNvbHVtbi4kQ29sdW1uV2lkdGggPSBgJHtjb2x1bW4uJENvbHVtbldpZHRoTnVtfXB4YDtcbiAgICByZXR1cm4gY29sQ2FwdGlvbldpZHRoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldENvbHVtbldpZHRoQnlNYXhNb0NvbnRlbnRXaWR0aChtb0RhdGFMaXN0OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10sIGNvbHVtbjogUmVwb3J0Vmlld0NvbHVtbikge1xuICAgIGNvbnN0IHdpZHRoID0gY2FsY3VsYXRlTW9EYXRhTGlzdENvbnRlbnRXaWR0aEJ5Q29sdW1uTmFtZShtb0RhdGFMaXN0LCBjb2x1bW4pO1xuICAgIGNvbHVtbi4kQ29udGVudFdpZHRoID0gYCR7TWF0aC5jZWlsKHdpZHRoKX1weGA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVNb0RhdGFMaXN0Q29udGVudFdpZHRoQnlDb2x1bW5OYW1lKFxuICAgIG1vRGF0YUxpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSxcbiAgICBjb2x1bW46IFJlcG9ydFZpZXdDb2x1bW5cbik6IG51bWJlciB7XG4gICAgbGV0IG1heFdpZHRoID0gMDtcbiAgICBtb0RhdGFMaXN0LmZvckVhY2goKGMsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNhcHRpb24gPSBnZXRDb2x1bW5WYWx1ZU9mTW9EYXRhTGlzdChjb2x1bW4uTmFtZSwgYywgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgICAgY29uc3QgY2FwdGlvbldpZHRoID0gbWVhc3VyZVRleHQoY2FwdGlvbikgKyAxNjtcbiAgICAgICAgaWYgKG1heFdpZHRoIDwgY2FwdGlvbldpZHRoKSB7XG4gICAgICAgICAgICBtYXhXaWR0aCA9IGNhcHRpb25XaWR0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBNYXRoLmNlaWwobWF4V2lkdGgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUZyZWVDb2x1bW5TaXplKGNvbHVtbnM6IFJlcG9ydFZpZXdDb2x1bW5bXSk6IFJlcG9ydFZpZXdDb2x1bW5bXSB7XG4gICAgbGV0IGFsbENvbFdpZHRoID0gMDtcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5IaWRkZW4pO1xuXG4gICAgdmlzaWJsZUNvbHVtbnMuZm9yRWFjaCgoY29sLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gc2V0Q29sdW1uQ2FwdGlvbldpZHRoKGNvbCk7XG4gICAgICAgIGNvbnN0IHcgPSBjb2wuV2lkdGggJiYgY29sLldpZHRoID4gMCA/IGNvbC5XaWR0aCA6IHg7XG4gICAgICAgIGFsbENvbFdpZHRoICs9IHc7XG4gICAgICAgIGNvbC4kV2lkdGggPSBpbmRleCA9PT0gdmlzaWJsZUNvbHVtbnMubGVuZ3RoIC0gMSA/ICcxMDAlJyA6IGAke3d9cHhgO1xuICAgIH0pO1xuICAgIHJldHVybiBbLi4uY29sdW1uc107XG59XG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlQ29sdW1uV2lkdGhGaXRUb0NvbnRhaW5lcihcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgIGNhblZpZXc6IGJvb2xlYW4sXG4gICAgZGlzYWJsZUNvbnRleHRNZW51T3ZlcmZsb3c6IGJvb2xlYW4sXG4gICAgY29udGV4dE1lbnVJdGVtczogTWVudUl0ZW1bXSxcbiAgICBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW11cbik6IHsgY29sdW1uczogUmVwb3J0Vmlld0NvbHVtbltdOyBjb250ZXh0TWVudVdpZHRoOiBudW1iZXIgfSB7XG4gICAgbGV0IGhhc0RlZmluZWRXaWR0aCA9IHRydWU7XG4gICAgbGV0IGNvbnRhaW5lcldpZHRoID0gY29sdW1ucy5tYXAoKGMpID0+IGMuV2lkdGgpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgIGlmIChjb250YWluZXJXaWR0aCA9PT0gMCkge1xuICAgICAgICBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aDtcbiAgICAgICAgaGFzRGVmaW5lZFdpZHRoID0gZmFsc2U7XG4gICAgfVxuICAgIGxldCBhbGxDb2xXaWR0aCA9IDA7XG4gICAgY29uc3QgaXNNb2JpbGUgPSBnZXREZXZpY2VJc01vYmlsZSgpO1xuICAgIGxldCByZW1haW5QZXJjZW50ID0gMDtcbiAgICBjb25zdCBsQ29scyA9IGNvbHVtbnMuZmlsdGVyKChjLCBpKSA9PiAhYy5IaWRkZW4gJiYgIShpID09PSAwICYmIGMuRmllbGRUeXBlSWQgPT09IDQxKSk7XG4gICAgbENvbHMuZm9yRWFjaCgoY29sLCBpbmRleCkgPT4ge1xuICAgICAgICAvLyDYp9qv2LEg2YHbjNmE2K8g2KfYsiDZhtmI2Lkg2LHZhtqvINmG2KjZiNivINmIINiz2KrZiNmGINin2YjZhCDZh9mFINmG2KjZiNivXG4gICAgICAgIGNvbnN0IHggPSBzZXRDb2x1bW5DYXB0aW9uV2lkdGgoY29sKTtcbiAgICAgICAgY29uc3QgdyA9IGNvbC5XaWR0aCAmJiBjb2wuV2lkdGggPiAwID8gY29sLldpZHRoIDogeDtcbiAgICAgICAgYWxsQ29sV2lkdGggKz0gdztcbiAgICAgICAgY29uc3QgcGVyY2VudCA9ICh3IC8gY29udGFpbmVyV2lkdGgpICogMTAwO1xuICAgICAgICBjb2wuJEZpdENvbnRhaW5lcldpZHRoID0gaXNNb2JpbGUgfHwgY29sLldpZHRoID09PSAwID8gJzEwMCUnIDogYCR7cGVyY2VudH0lYDtcblxuICAgICAgICBpZiAoaW5kZXggPT09IGxDb2xzLmxlbmd0aCAtIDEgJiYgIWhhc0RlZmluZWRXaWR0aCkge1xuICAgICAgICAgICAgY29sLiRGaXRDb250YWluZXJXaWR0aCA9IDEwMCAtIHJlbWFpblBlcmNlbnQgKyAnJSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW1haW5QZXJjZW50ICs9IHBlcmNlbnQ7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBjb25zdCBjYW5WaWV3QnV0dG9uV2lkdGggPSBjYW5WaWV3ID8gNDAgOiAwO1xuICAgIC8vIGNvbnN0IHNlbGVjdGlvbldpZHRoID0gMzA7XG5cbiAgICBjb25zdCBjb250ZXh0TWVudVdpZHRoID0gY2FsY0NvbnRleHRNZW51V2lkdGgoY29udGV4dE1lbnVJdGVtcywgZGlzYWJsZUNvbnRleHRNZW51T3ZlcmZsb3cpO1xuICAgIC8vIGNvbnN0IGNvbnRhaW5lcldpZHRoQWxsQ29sdW1ucyA9IGNvbnRhaW5lcldpZHRoIC0gc2VsZWN0aW9uV2lkdGggLSBjYW5WaWV3QnV0dG9uV2lkdGggLSBjb250ZXh0TWVudVdpZHRoIC0gMTI7XG4gICAgLy8gYWxsQ29sV2lkdGggKz0gY29udGFpbmVyV2lkdGhBbGxDb2x1bW5zIC0gYWxsQ29sV2lkdGg7Ly8g2YXYrdin2LPYqNmHINii2K7YsduM2YYg2LPYqtmI2YYu2obZiNmGIHdpZHRoINmF2LTYrti124wg2YbYr9in2LHYr1xuICAgIC8vIGNvbHVtbnNcbiAgICAvLyAgICAgLmZpbHRlcigoYykgPT4gIWMuSGlkZGVuKVxuICAgIC8vICAgICAuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgLy8gICAgICAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGguY2VpbCgoY29udGFpbmVyV2lkdGhBbGxDb2x1bW5zICogY29sLldpZHRoKSAvIGFsbENvbFdpZHRoKTtcbiAgICAvLyAgICAgICAgIGNvbC5XaWR0aCA9IG5ld1dpZHRoO1xuICAgIC8vICAgICAgICAgY29sLiRGaXRDb250YWluZXJXaWR0aCA9IGAke25ld1dpZHRofXB4YDtcbiAgICAvLyAgICAgfSk7XG4gICAgcmV0dXJuIHsgY29sdW1uczogWy4uLmNvbHVtbnNdLCBjb250ZXh0TWVudVdpZHRoIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY2FsY0NvbnRleHRNZW51V2lkdGgoY29udGV4dE1lbnVJdGVtczogTWVudUl0ZW1bXSwgZGlzYWJsZUNvbnRleHRNZW51T3ZlcmZsb3c6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGxldCBjb250ZXh0TWVudVdpZHRoID0gY29udGV4dE1lbnVJdGVtcy5sZW5ndGggPiAxID8gNDAgOiAwO1xuICAgIGNvbnN0IGJ0blBhZGRpbmcgPSAxNCArIDIgKyAxMDsgLy8gcGFkZGluZyArIGJvcmRlciArIGlmIHRleHQgaXMgb3ZlcmZsb3dlZCB0aGVuIGFkZCA1IHBpeGVsLnNvIHdlIGFsd2F5cyA1IHB4IHRvIGl0LlxuICAgIGNvbnN0IHRkUGFkZGluZyA9IDE1ICsgMTsgLy8gcGFkZGluZyArIGJvcmRlclxuICAgIGNvbnN0IGJ1dHRvbkljb25XaWR0aCA9IDE2ICsgNjsgLy8gc2l6ZSArIG1hcmdpblxuICAgIGlmIChkaXNhYmxlQ29udGV4dE1lbnVPdmVyZmxvdyB8fCBjb250ZXh0TWVudUl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb250ZXh0TWVudVdpZHRoID0gMDtcbiAgICAgICAgY29udGV4dE1lbnVJdGVtcy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICBjb250ZXh0TWVudVdpZHRoICs9IG1lYXN1cmVUZXh0KGMudGV4dCkgKyBidG5QYWRkaW5nICsgdGRQYWRkaW5nO1xuICAgICAgICAgICAgY29udGV4dE1lbnVXaWR0aCArPSBjLmljb24gPyBidXR0b25JY29uV2lkdGggOiAwO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHRNZW51V2lkdGg7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbkxvY2FsTW9kZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBvZmZsaW5jZUFjdGl2ZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKEJhcnNhQXBpLk9mZmxpbmUsICdTZXR0aW5ncy5Jc0FjdGl2ZScsIGZhbHNlKTtcbiAgICBjb25zdCBvZmZsaW5lVHJ1ZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKEJhcnNhQXBpLk9mZmxpbmUsICdTZXR0aW5ncy5Jc09mZmxpbmUnLCBmYWxzZSk7XG4gICAgcmV0dXJuIG9mZmxpbmNlQWN0aXZlICYmIG9mZmxpbmVUcnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldExhYmVsV2lkdGgoaXRlbTogYW55KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaWVsZFh0eXBlID0gaXRlbS5GaWVsZFVpPy5vcmlnaW5hbFh0eXBlO1xuICAgIGlmIChcbiAgICAgICAgZmllbGRYdHlwZSA9PT0gJ1VpLkJ1dHRvbicgfHxcbiAgICAgICAgZmllbGRYdHlwZSA9PT0gJ1VpLkNoZWNrQm94JyB8fFxuICAgICAgICAhaXRlbS5UZXh0VmlzaWJsZSB8fFxuICAgICAgICBpdGVtLkNhcHRpb25TZXR0aW5nPy5BbGlnbk1vZGUgPT09ICdBdXRvU2l6ZSdcbiAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgbGFiZWxDYXB0aW9uID0gaXRlbS5DYXB0aW9uO1xuICAgIGlmIChsYWJlbENhcHRpb24gPT09ICcmenduajsnKSB7XG4gICAgICAgIGxhYmVsQ2FwdGlvbiA9ICcnO1xuICAgIH1cbiAgICBsYWJlbENhcHRpb24gPSBsYWJlbENhcHRpb24gKyAnICogJztcbiAgICAvLyBpZiAoaXRlbS5GaWVsZFVpPy5TZXR0aW5nPy5Jc01hbmRhdG9yeSkge1xuICAgIC8vICAgICBpZiAobGFiZWxDYXB0aW9uLmluZGV4T2YoJyonKSA8IDApIHtcbiAgICAvLyAgICAgfVxuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICAgIGxhYmVsQ2FwdGlvbiA9IGxhYmVsQ2FwdGlvbi5yZXBsYWNlKCcqJywgJycpO1xuICAgIC8vIH1cbiAgICBsYWJlbENhcHRpb24gKz0gJzonO1xuICAgIGNvbnN0IGxhYmVsV2lkdGggPSBtZWFzdXJlVGV4dChsYWJlbENhcHRpb24pO1xuICAgIGxldCBsYWJlbFdpdGhQYWRkaW5nID0gbGFiZWxXaWR0aCArIDEwO1xuICAgIGlmIChpdGVtLkZpZWxkVWk/LlNldHRpbmc/LkZpZWxkSWNvbikge1xuICAgICAgICBsYWJlbFdpdGhQYWRkaW5nICs9IDI0O1xuICAgIH1cbiAgICBpZiAoaXRlbS5GaWVsZFVpPy5TZXR0aW5nPy5IZWxwRGVzY3JpcHRpb24pIHtcbiAgICAgICAgbGFiZWxXaXRoUGFkZGluZyArPSAyNDtcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sV2lkdGggPSBNYXRoLmNlaWwobGFiZWxXaXRoUGFkZGluZyk7XG4gICAgcmV0dXJuIGNvbnRyb2xXaWR0aDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2x1bW5WYWx1ZU9mTW9EYXRhTGlzdChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbW86IE1ldGFvYmplY3REYXRhTW9kZWwsXG4gICAgQ29sdW1ucz86IHsgW2tleTogc3RyaW5nXTogYW55OyBOYW1lOiBzdHJpbmc7IENhcHRpb246IHN0cmluZyB9W10sXG4gICAgY2FwdGlvbj86IGJvb2xlYW5cbik6IGFueSB7XG4gICAgbGV0IGZpZWxkTmFtZSA9IENvbHVtbnMgPyBDb2x1bW5zLmZpbmQoKGMpID0+IGMuTmFtZSA9PT0gbmFtZSB8fCBjLkFsaWFzID09PSBuYW1lKT8uTmFtZSA6IG5hbWU7XG4gICAgaWYgKCFmaWVsZE5hbWUpIHtcbiAgICAgICAgZmllbGROYW1lID0gbmFtZTtcbiAgICB9XG4gICAgbGV0IHZhbCA9IGZpZWxkTmFtZSA/IG1vW2ZpZWxkTmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNhcHRpb24pIHtcbiAgICAgICAgbGV0IGNhcHRpb25WYWwgPSBmaWVsZE5hbWUgPyBtb1tmaWVsZE5hbWVdPy4kQ2FwdGlvbiA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiBjYXB0aW9uVmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY2FwdGlvblZhbCA9IG1vW2ZpZWxkTmFtZSArICckQ2FwdGlvbiddO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY2FwdGlvblZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNhcHRpb25WYWwgPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgdmFsID0gY2FwdGlvblZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0lmQWxyZWFkeUxvYWRlZChwYXJlbnRNb2R1bGU6IGFueSwgbW9kdWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHBhcmVudE1vZHVsZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQuIEltcG9ydCAke21vZHVsZU5hbWV9IGluIHRoZSBBcHBNb2R1bGUgb25seS5gKTtcbiAgICB9XG59XG5jb25zdCBtZWFzdXJlVGV4dFZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIG1lYXN1cmVUZXh0KHRleHQ6IHN0cmluZywgZm9udFNpemU/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmIChtZWFzdXJlVGV4dFZhbHVlc1t0ZXh0XSkge1xuICAgICAgICByZXR1cm4gbWVhc3VyZVRleHRWYWx1ZXNbdGV4dF07XG4gICAgfVxuXG4gICAgY29uc3QgbWVhc3VyZVRleHREb20gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVhc3VyZVRleHQnKSBhcyBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICBpZiAoIW1lYXN1cmVUZXh0RG9tKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICBjb25zdCBjdHggPSBtZWFzdXJlVGV4dERvbS5nZXRDb250ZXh0KCcyZCcpIGFzIGFueTtcbiAgICBmb250U2l6ZSA9IGZvbnRTaXplID8gZm9udFNpemUgOiAnMC44ODVyZW0nO1xuICAgIGN0eC5mb250ID0gYG5vcm1hbCAke2ZvbnRTaXplfSBJUkFOWWVrYW5EaWdpdHNgO1xuICAgIGNvbnN0IHggPSBjdHgubWVhc3VyZVRleHQodGV4dCkud2lkdGg7XG4gICAgbWVhc3VyZVRleHRWYWx1ZXNbdGV4dF0gPSB4O1xuICAgIHJldHVybiB4O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdlbnJhdGVJbmxpbmVNb0lkKCkge1xuICAgIHJldHVybiAoQmFyc2FBcGkuaWRHZW5lcmF0b3ItLSkudG9TdHJpbmcoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbnVtVmFsdWVUb1N0cmluZ1NpemUodmFsdWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSAnMSc6XG4gICAgICAgICAgICByZXR1cm4gJ3MnO1xuICAgICAgICBjYXNlICcyJzpcbiAgICAgICAgICAgIHJldHVybiAnbSc7XG4gICAgICAgIGNhc2UgJzMnOlxuICAgICAgICAgICAgcmV0dXJuICdsJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVVbHZDb21tYW5kSGFuZGxlcihidXR0b24sIG9wdGlvbnM/KTogdm9pZCB7XG4gICAgaWYgKGJ1dHRvbi5Db21tYW5kICYmIGJ1dHRvbi5Db21tYW5kLkhhbmRsZXIpIHtcbiAgICAgICAgYnV0dG9uLkNvbW1hbmQuSGFuZGxlcihidXR0b24sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoYnV0dG9uLmhhbmRsZXIpIHtcbiAgICAgICAgYnV0dG9uLmhhbmRsZXIuYmluZChidXR0b24uc2NvcGUpKGJ1dHRvbiwgb3B0aW9ucyk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZUlkKHBhcnRzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ0Fycjogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzOyBpKyspIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgY29uc3QgUzQgPSAoKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwKSB8IDApLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgY29uc3QgUzRfOiBzdHJpbmcgPSBTNC5sZW5ndGggPiAwID8gUzQuc3Vic3RyaW5nKDEpIDogJyc7XG4gICAgICAgIHN0cmluZ0Fyci5wdXNoKFM0Xyk7XG4gICAgfVxuICAgIHJldHVybiBzdHJpbmdBcnIuam9pbignLScpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0ZVNlcnZpY2UobG9nU2VydmljZTogTG9nU2VydmljZSwgY3VsdHVyZT8pOiBEYXRlU2VydmljZSB7XG4gICAgY29uc3QgZGVmYXVsdEN1bHR1cmUgPSBjdWx0dXJlID8/IEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuQ3VsdHVyZTtcbiAgICBzd2l0Y2ggKGRlZmF1bHRDdWx0dXJlKSB7XG4gICAgICAgIGNhc2UgJ2ZhLUlSJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZVNoYW1zaVNlcnZpY2UobG9nU2VydmljZSk7XG4gICAgICAgIGNhc2UgJ2FyLUFFJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZUhpanJpU2VydmljZShsb2dTZXJ2aWNlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZU1pbGFkaVNlcnZpY2UobG9nU2VydmljZSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEl0ZW1zUGVyQ2hpbGRyZW4oXG4gICAgaXRlbTogVHJlZU5vZGVPYmosXG4gICAgbGV2ZWw6IG51bWJlcixcbiAgICBhcnJheTogTWV0YW9iamVjdERhdGFNb2RlbFtdLFxuICAgIHBhcmVudE5vZGU6IFRyZWVOb2RlT2JqLFxuICAgIGF1dG9PcGVuTGV2ZWxzOiBudW1iZXJcbik6IGFueSB7XG4gICAgbGV0IG5ld0l0ZW06IGFueSA9IGl0ZW07XG4gICAgaWYgKGxldmVsID4gMCkge1xuICAgICAgICBpdGVtLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlO1xuICAgICAgICBpdGVtLmxldmVsID0gbGV2ZWw7XG4gICAgICAgIGl0ZW0uaXNFeHBhbmQgPSBpdGVtLmlzRXhwYW5kID8/IGF1dG9PcGVuTGV2ZWxzID4gbGV2ZWw7XG4gICAgICAgIGl0ZW0udmlzaWJpbGl0eSA9IGl0ZW0ucGFyZW50Tm9kZS5pc0V4cGFuZDtcbiAgICAgICAgYXJyYXkucHVzaChuZXdJdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBuZXdJdGVtID0gaXRlbTtcbiAgICAgICAgbmV3SXRlbS5pc0V4cGFuZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgaXRlbS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4gc2V0T25lRGVwdGhMZXZlbChjaGlsZCkpO1xuICAgICAgICByZXR1cm4gaXRlbS5jaGlsZHJlbi5tYXAoKGkpID0+IGdldEFsbEl0ZW1zUGVyQ2hpbGRyZW4oaSwgbGV2ZWwgKyAxLCBhcnJheSwgbmV3SXRlbSwgYXV0b09wZW5MZXZlbHMpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0T25lRGVwdGhMZXZlbChub2RlKTogdm9pZCB7XG4gICAgbGV0IGhhc09uZURlcHRoID0gdHJ1ZTtcbiAgICBub2RlLmNoaWxkcmVuPy5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQuRGF0YT8uJEhhc0NoaWxkcmVuKSB7XG4gICAgICAgICAgICBoYXNPbmVEZXB0aCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgbm9kZS5oYXNPbmVEZXB0aExldmVsID0gaGFzT25lRGVwdGg7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGaXJlZm94KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpID4gLTE7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1hZ2VQYXRoKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBtb0lkOiBzdHJpbmcgfCBudWxsLFxuICAgIGZpbGVJZDogc3RyaW5nLFxuICAgIGZpZWxkRGVmSWQ/OiBzdHJpbmcsXG4gICAgc2l6ZT86IG51bWJlcixcbiAgICBzaXplSD86IG51bWJlclxuKTogc3RyaW5nIHtcbiAgICBtb0lkID0gbW9JZCA9PSBudWxsID8gJycgOiBlbmNvZGVVUklDb21wb25lbnQobW9JZCk7XG4gICAgZmlsZUlkID0gZmlsZUlkID09IG51bGwgPyAnJyA6IGVuY29kZVVSSUNvbXBvbmVudChmaWxlSWQpO1xuICAgIGZpZWxkRGVmSWQgPSBmaWVsZERlZklkID09IG51bGwgPyAnJyA6IGVuY29kZVVSSUNvbXBvbmVudChmaWVsZERlZklkKTtcbiAgICBzaXplID0gc2l6ZSA9PSBudWxsID8gMTI4IDogc2l6ZTtcbiAgICBzaXplSCA9IHNpemVIID09IG51bGwgPyBzaXplIDogc2l6ZUg7XG4gICAgY29uc3QgdXJsID0gYC9JSC5hc2h4P3R5PSR7dHlwZX0mbW9JZD0ke21vSWR9JmlkPSR7ZmlsZUlkfSZmZElkPSR7ZmllbGREZWZJZH0mc2k9JHtzaXplfSZzaUg9JHtzaXplSH1gO1xuICAgIHJldHVybiB1cmw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKGZ1bmN0aW9uVG9DaGVjayk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmdW5jdGlvblRvQ2hlY2sgJiYge30udG9TdHJpbmcuY2FsbChmdW5jdGlvblRvQ2hlY2spID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuZXhwb3J0IGZ1bmN0aW9uIERldmljZVdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoID4gMCA/IHdpbmRvdy5pbm5lcldpZHRoIDogc2NyZWVuLndpZHRoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRlclZhbHVlKGZpZWxkVmFsdWUsIHJldHVyblZhbHVlPzogdHJ1ZSk6IGFueSB7XG4gICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmllbGRWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZFZhbHVlLlZhbHVlO1xuICAgIGNvbnN0IHZhbHVlQ2FwdGlvbjogc3RyaW5nID0gZmllbGRWYWx1ZS5WYWx1ZSRDYXB0aW9uO1xuICAgIGxldCB2YWx1ZU9iamVjdENhcHRpb24gPSBudWxsO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHZhbHVlT2JqZWN0Q2FwdGlvbiA9IGZpZWxkVmFsdWUuVmFsdWUuJENhcHRpb247XG4gICAgfVxuICAgIGlmICh2YWx1ZU9iamVjdENhcHRpb24gJiYgIXJldHVyblZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZU9iamVjdENhcHRpb247XG4gICAgfVxuICAgIGlmICh2YWx1ZUNhcHRpb24gJiYgIXZhbHVlQ2FwdGlvbi5zdGFydHNXaXRoKCd0bXAnKSAmJiAhcmV0dXJuVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlQ2FwdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVsZW1lbnRJblZpZXdwb3J0MihlbDogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IHRvcCA9IGVsLm9mZnNldFRvcDtcbiAgICBsZXQgbGVmdCA9IGVsLm9mZnNldExlZnQ7XG4gICAgY29uc3Qgd2lkdGggPSBlbC5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBlbC5vZmZzZXRIZWlnaHQ7XG5cbiAgICB3aGlsZSAoZWwub2Zmc2V0UGFyZW50KSB7XG4gICAgICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xuICAgICAgICB0b3AgKz0gZWwub2Zmc2V0VG9wO1xuICAgICAgICBsZWZ0ICs9IGVsLm9mZnNldExlZnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgdG9wIDwgd2luZG93LnBhZ2VZT2Zmc2V0ICsgd2luZG93LmlubmVySGVpZ2h0ICYmXG4gICAgICAgIGxlZnQgPCB3aW5kb3cucGFnZVhPZmZzZXQgKyB3aW5kb3cuaW5uZXJXaWR0aCAmJlxuICAgICAgICB0b3AgKyBoZWlnaHQgPiB3aW5kb3cucGFnZVlPZmZzZXQgJiZcbiAgICAgICAgbGVmdCArIHdpZHRoID4gd2luZG93LnBhZ2VYT2Zmc2V0XG4gICAgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBQcmV2ZW50RGVmYXVsRXZlbnQoZSwgcHJvcGFnYXRpb25EaXNhYmxlID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmIChwcm9wYWdhdGlvbkRpc2FibGUpIHtcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uKGUpO1xuICAgIH1cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGUpOiB2b2lkIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudEhlaWdodChlbERvbTogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xuICAgIGxldCBwYXJlbnREb20gPSBlbERvbS5wYXJlbnRFbGVtZW50O1xuICAgIGxldCBwYXJlbnRIZWlnaHQgPSBwYXJlbnREb20/LmNsaWVudEhlaWdodCA/PyAwO1xuICAgIHdoaWxlIChwYXJlbnREb20gIT0gbnVsbCAmJiBwYXJlbnRIZWlnaHQgPCA0MCkge1xuICAgICAgICBwYXJlbnREb20gPSBwYXJlbnREb20ucGFyZW50RWxlbWVudDtcbiAgICAgICAgcGFyZW50SGVpZ2h0ID0gcGFyZW50RG9tPy5jbGllbnRIZWlnaHQgPz8gMDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudEhlaWdodDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBvbmVudERlZmluZWQoXG4gICAgY29udHJvbFVpOiB7IG9yaWdpbmFsWHR5cGU6IHN0cmluZyB9LFxuICAgIGN1c3RvbVVpU2V0dGluZzogeyBNb2R1bGU6IHN0cmluZzsgTmFtZTogc3RyaW5nOyBTZWxlY3Rvcjogc3RyaW5nIH1cbik6IHtcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmc7XG4gICAgbW9kdWxlUGF0aDogc3RyaW5nO1xuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZztcbiAgICBzZWxlY3Rvcjogc3RyaW5nO1xufSB7XG4gICAgbGV0IG1vZHVsZU5hbWUgPSBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLkRlZmF1bHRVaU1vZHVsZTtcbiAgICBsZXQgbW9kdWxlS2ViYWJOYW1lID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuR2V0S2ViYWJDYXNlKG1vZHVsZU5hbWUpO1xuICAgIGxldCBjb21wb25lbnROYW1lID0gY29udHJvbFVpLm9yaWdpbmFsWHR5cGUucmVwbGFjZSgnLicsICcnKS5yZXBsYWNlKCdfJywgJycpO1xuICAgIGxldCBzZWxlY3Rvcjogc3RyaW5nID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuR2V0S2ViYWJDYXNlKGNvbXBvbmVudE5hbWUpO1xuICAgIHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHNlbGVjdG9yLmxlbmd0aCk7XG4gICAgc2VsZWN0b3IgPSBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLkN1c3RvbVVpUHJlZml4ICsgJy0nICsgc2VsZWN0b3I7XG4gICAgaWYgKGN1c3RvbVVpU2V0dGluZyAmJiBjdXN0b21VaVNldHRpbmcuTW9kdWxlKSB7XG4gICAgICAgIG1vZHVsZU5hbWUgPSBjdXN0b21VaVNldHRpbmcuTW9kdWxlO1xuICAgICAgICBtb2R1bGVLZWJhYk5hbWUgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5HZXRLZWJhYkNhc2UobW9kdWxlTmFtZSk7XG4gICAgICAgIGNvbXBvbmVudE5hbWUgPSBjdXN0b21VaVNldHRpbmcuTmFtZTtcbiAgICAgICAgc2VsZWN0b3IgPSBjdXN0b21VaVNldHRpbmcuU2VsZWN0b3I7XG4gICAgfVxuICAgIGNvbnN0IG1vZHVsZVBhdGggPSBtb2R1bGVLZWJhYk5hbWUuc2xpY2UoMSwgbW9kdWxlS2ViYWJOYW1lLmxlbmd0aCk7XG4gICAgcmV0dXJuIHsgbW9kdWxlTmFtZSwgbW9kdWxlUGF0aCwgY29tcG9uZW50TmFtZSwgc2VsZWN0b3IgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmFyaSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gRGV2aWNlLmlzU2FmYXJpKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGRigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gRGV2aWNlLmlzRkYoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXZpY2VJc1Bob25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBEZXZpY2UuaXNQaG9uZSgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldERldmljZUlzRGVza3RvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gRGV2aWNlLmlzRGVza3RvcCgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldERldmljZUlzVGFibGV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBEZXZpY2UuaXNUYWJsZXQoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXZpY2VJc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdtb2JpJykgPiAwIHx8IGdldERldmljZUlzUGhvbmUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyb2xTaXplTW9kZShlbDogSFRNTEVsZW1lbnQsIGRldmljZVNpemU6ICdzJyB8ICdtJyB8ICdsJyB8ICd4bCcgPSAnbCcpOiBBYmJyZXZhdGlvbkRldmljZVNpemUge1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gZWwub2Zmc2V0V2lkdGg7XG4gICAgaWYgKGNvbnRhaW5lcldpZHRoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBkZXZpY2VTaXplO1xuICAgIH1cbiAgICBpZiAoZGV2aWNlU2l6ZSA9PT0gJ3MnIHx8IGNvbnRhaW5lcldpZHRoIDwgNjAwKSB7XG4gICAgICAgIGRldmljZVNpemUgPSAncyc7XG4gICAgfSBlbHNlIGlmIChkZXZpY2VTaXplID09PSAnbScgfHwgKGNvbnRhaW5lcldpZHRoID4gNjAwICYmIGNvbnRhaW5lcldpZHRoIDwgMTIwMCkpIHtcbiAgICAgICAgZGV2aWNlU2l6ZSA9ICdtJztcbiAgICB9XG4gICAgcmV0dXJuIGRldmljZVNpemU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeXRlcyhcbiAgICBieXRlcyxcbiAgICBkZWNpbWFscyA9IDIsXG4gICAgc2l6ZTogJ0J5dGVzJyB8ICdLQicgfCAnTUInIHwgJ0dCJyB8ICdUQicgfCAnUEInIHwgJ0VCJyB8ICdaQicgfCAnWUInXG4pOiBzdHJpbmcge1xuICAgIGlmIChieXRlcyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJzAgQnl0ZXMnO1xuICAgIH1cblxuICAgIGNvbnN0IGsgPSAxMDI0O1xuICAgIGNvbnN0IGRtID0gZGVjaW1hbHMgPCAwID8gMCA6IGRlY2ltYWxzO1xuICAgIGNvbnN0IHNpemVzID0gWydCeXRlcycsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQiddO1xuICAgIGNvbnN0IGkgPSBzaXplcy5maW5kSW5kZXgoKGMpID0+IGMgPT09IHNpemUpO1xuICAgIHJldHVybiBwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGssIGkpKS50b0ZpeGVkKGRtKSkgKyAnICcgKyBzaXplc1tpXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZEV4dGVuc2lvbih2YWxpZEV4dGVuc2lvbnMpOiBzdHJpbmcge1xuICAgIGxldCBfdmFsaWRFeHRlbnNpb25zID0gJyc7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsaWRFeHRlbnNpb25zKSkge1xuICAgICAgICBfdmFsaWRFeHRlbnNpb25zID0gdmFsaWRFeHRlbnNpb25zLm1hcCgoYykgPT4gJy4nICsgYy5FeHRlbnNpb24pLmpvaW4oJywnKTtcbiAgICB9XG4gICAgcmV0dXJuIF92YWxpZEV4dGVuc2lvbnM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0SWNvbih0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBCYXJzYUFwaS5Db21tb24uRmlsZS5GaWxlSWNvbkRpY3QxMjhbdHlwZV07XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbWFnZSh0eXBlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gWydpbWcnLCAncG5nJywgJ2pwZWcnLCAnanBnJywgJ2dpZicsICdibXAnLCAndGlmZicsICdpbWFnZSddLmluZGV4T2YodHlwZSkgPiAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbENvbHVtbnNTb3J0ZWQoY29udGV4dCk6IEFycmF5PFJlcG9ydFZpZXdDb2x1bW4+IHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuVmlldy5Db2x1bW5zJywgW10pLmZpbHRlcihcbiAgICAgICAgKGMpID0+IGMuTmFtZSAhPT0gJ0lkJyAmJiBjLk5hbWUgIT09ICckU3R5bGVJbmRleCcgJiYgIWMuSGlkZGVuXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbExpc3Q6IENvbFNldHRpbmdbXSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICAnU2V0dGluZy5WaWV3LkdyaWRTZXR0aW5nLkNvbFNldHRpbmdMaXN0JyxcbiAgICAgICAgW11cbiAgICApO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBuZXcgQXJyYXk8UmVwb3J0Vmlld0NvbHVtbj4oKTtcbiAgICBjb2xMaXN0LmZvckVhY2goKGNvbFMpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uT2ZDb2xMaXN0ID0gYWxsQ29sdW1ucy5maW5kKChjKSA9PiBjLk5hbWUgPT09IGNvbFMuTmFtZSk7XG4gICAgICAgIGlmIChjb2x1bW5PZkNvbExpc3QpIHtcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaCh7IC4uLmNvbHVtbk9mQ29sTGlzdCwgSGlkZGVuOiBjb2xTLklzSGlkZGVuLCBXaWR0aDogY29sUy5XaWR0aCB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGFsbENvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjb2xTZXR0aW5nID0gY29sTGlzdC5maW5kKChjKSA9PiBjLk5hbWUgPT09IGNvbHVtbi5OYW1lKTtcbiAgICAgICAgaWYgKCFjb2xTZXR0aW5nKSB7XG4gICAgICAgICAgICBjb2x1bW5zLnNwbGljZShpbmRleCwgMCwgeyAuLi5jb2x1bW4sIEhpZGRlbjogY29sTGlzdC5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29sdW1ucztcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRWaXNpYmxlVmFsdWUob2JqZWN0LCBmaWVsZCk6IHN0cmluZyB7XG4gICAgbGV0IG91dHB1dFZhbHVlO1xuICAgIGlmIChvYmplY3RbZmllbGRdPy4kQ2FwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG91dHB1dFZhbHVlID0gb2JqZWN0W2ZpZWxkXS4kQ2FwdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXRWYWx1ZSA9IG9iamVjdFtmaWVsZCArICckQ2FwdGlvbiddICE9PSB1bmRlZmluZWQgPyBvYmplY3RbZmllbGQgKyAnJENhcHRpb24nXSA6IG9iamVjdFtmaWVsZF07XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRWYWx1ZTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXAge1xuICAgICRHcm91cDogYW55O1xuICAgICRMZXZlbDogbnVtYmVyO1xuICAgICRDb3VudDogbnVtYmVyO1xuICAgICRFeHBhbmRlZDogYm9vbGVhbjtcbiAgICAkUGFyZW50OiBhbnk7XG4gICAgJENoaWxkcmVuOiBhbnlbXTtcbiAgICAkVmlzaWJpbGl0eTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEdyb3VwQnkoY29sbGVjdGlvbjogYW55W10sIHNvcnRTZXR0aW5nczogU29ydFNldHRpbmdbXSk6IHsgZ3JvdXBlZDogR3JvdXA7IGdyb3VwczogYW55W10gfSB7XG4gICAgY29uc3QgZ3JvdXBlZDogYW55ID0ge307XG5cbiAgICBjb25zdCBncm91cHMgPSBzb3J0U2V0dGluZ3MubWFwKChjKSA9PiBjLk5hbWUpO1xuICAgIGNvbnN0IGdldFRpdGxlID0gKG1vLCBmaWVsZE5hbWUpOiBzdHJpbmcgPT4gR2V0VmlzaWJsZVZhbHVlKG1vLCBmaWVsZE5hbWUpO1xuICAgIGNvbGxlY3Rpb24uZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgICBncm91cHNcbiAgICAgICAgICAgIC5yZWR1Y2UoKG8sIGcsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cFRpdGxlID0gZ2V0VGl0bGUoYSwgZyk7XG4gICAgICAgICAgICAgICAgb1tncm91cFRpdGxlXSA9IG9bZ3JvdXBUaXRsZV0gfHwgKGkgKyAxID09PSBncm91cHMubGVuZ3RoID8gW10gOiB7fSk7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob1tncm91cFRpdGxlXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYS4kTGV2ZWwgPSBncm91cHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBnZXRUaXRsZShhLCBncm91cHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gZ3JvdXBlZFt0aXRsZV07XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC4kQ291bnQgPSAocGFyZW50LiRDb3VudCA/PyAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgZ3JvdXBzLmxlbmd0aCAtIDE7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBnZXRUaXRsZShhLCBncm91cHNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50W3RpdGxlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC4kQ291bnQgPSBvW2dyb3VwVGl0bGVdLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhMiA9IEZpbmRHcm91cChncm91cFRpdGxlLCBhKTtcbiAgICAgICAgICAgICAgICAgICAgb1tncm91cFRpdGxlXS4kRXhwYW5kZWQgPSBhMj8uJEV4cGFuZGVkO1xuICAgICAgICAgICAgICAgICAgICBvW2dyb3VwVGl0bGVdLiRWaXNpYmlsaXR5ID0gYTI/LiRWaXNpYmlsaXR5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb1tncm91cFRpdGxlXTtcbiAgICAgICAgICAgIH0sIGdyb3VwZWQpXG4gICAgICAgICAgICAucHVzaChhKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBncm91cGVkLCBncm91cHMgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZpbmRHcm91cChncm91cFRpdGxlOiBzdHJpbmcsIGE6IGFueSk6IGFueSB7XG4gICAgaWYgKGEuJEdyb3VwID09PSBncm91cFRpdGxlKSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoYS4kUGFyZW50KSB7XG4gICAgICAgIHJldHVybiBGaW5kR3JvdXAoZ3JvdXBUaXRsZSwgYS4kUGFyZW50KTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gRmlsbEFsbExheW91dENvbnRyb2xzKGl0ZW06IExheW91dFNldHRpbmcsIGxheW91dENvbnRyb2xzOiBMYXlvdXRTZXR0aW5nW10pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS54dHlwZSA9PT0gJ0x5LkxheW91dENvbnRyb2wnKSB7XG4gICAgICAgIGxheW91dENvbnRyb2xzLnB1c2goaXRlbSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpdGVtLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLml0ZW1zLmZvckVhY2goKGMpID0+IEZpbGxBbGxMYXlvdXRDb250cm9scyhjLCBsYXlvdXRDb250cm9scykpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEZpbmRUb29sYmFySXRlbSh0b29sYmFySXRlbXM6IE1lbnVJdGVtW10sIHZhbHVlOiBzdHJpbmcsIHByb3A6IHN0cmluZyA9ICd0ZXh0Jyk6IE1lbnVJdGVtIHwgbnVsbCB7XG4gICAgaWYgKCF0b29sYmFySXRlbXM/Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmluZEluQXJyYXkgPSAodG9vbGJhckl0ZW1zOiBNZW51SXRlbVtdLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCBpdGVtOiBNZW51SXRlbSB8IG51bGwgPSBudWxsO1xuICAgICAgICB0b29sYmFySXRlbXMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjID09PSAnb2JqZWN0JyAmJiAhaXRlbSkge1xuICAgICAgICAgICAgICAgIGlmIChjW3Byb3BdID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtID0gYztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYy5tZW51Py5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBmaW5kSW5BcnJheShjLm1lbnUuaXRlbXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9O1xuICAgIHJldHVybiBmaW5kSW5BcnJheSh0b29sYmFySXRlbXMsIHZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBGaW5kTGF5b3V0U2V0dGluZ0Zyb21MYXlvdXQ5NChsYXlvdXQ5NDogTGF5b3V0U2V0dGluZywgbGF5b3V0VGl0bGU6IHN0cmluZyk6IExheW91dFNldHRpbmcgfCBudWxsIHtcbiAgICBpZiAoIWxheW91dFRpdGxlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAobGF5b3V0OTQuQ2FwdGlvbiA9PT0gbGF5b3V0VGl0bGUgfHwgbGF5b3V0OTQuVGl0bGUgPT09IGxheW91dFRpdGxlIHx8IGxheW91dDk0LkNvbnRyb2xJZCA9PT0gbGF5b3V0VGl0bGUpIHtcbiAgICAgICAgcmV0dXJuIGxheW91dDk0O1xuICAgIH1cbiAgICBsZXQgdGVtcExheW91dDk0OiBMYXlvdXRTZXR0aW5nIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGxheW91dDk0Lml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXlvdXQ5NC5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0ZW1wTGF5b3V0OTQpIHtcbiAgICAgICAgICAgICAgICB0ZW1wTGF5b3V0OTQgPSBGaW5kTGF5b3V0U2V0dGluZ0Zyb21MYXlvdXQ5NChsYXlvdXQ5NC5pdGVtc1tpXSwgbGF5b3V0VGl0bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZW1wTGF5b3V0OTQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0R3JpZFNldHRpbmdzKGNvbnRleHQpOiBHcmlkU2V0dGluZyB7XG4gICAgY29uc3QgZ3JpZFNldHRpbmcgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShjb250ZXh0LCAnU2V0dGluZy5WaWV3LkdyaWRTZXR0aW5nJywgbnVsbCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgQ29sU2V0dGluZ0xpc3Q6IGdyaWRTZXR0aW5nPy5Db2xTZXR0aW5nTGlzdCA/PyBudWxsLFxuICAgICAgICBTb3J0U2V0dGluZ0xpc3Q6IGdyaWRTZXR0aW5nPy5Tb3J0U2V0dGluZ0xpc3QgPz8gW10sXG4gICAgICAgIEF1dG9TaXplQ29sdW1uczogZ3JpZFNldHRpbmc/LkF1dG9TaXplQ29sdW1ucyA/PyBmYWxzZVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzZXRHcmlkU2V0dGluZ3MoY29sdW1uczogUmVwb3J0Vmlld0NvbHVtbltdIHwgYW55W10sIGNvbnRleHQ6IGFueSk6IEdyaWRTZXR0aW5nIHtcbiAgICBjb25zdCBjb2xMaXN0ID0gY29sdW1ucztcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldEdyaWRTZXR0aW5ncyhjb250ZXh0KTtcbiAgICBzZXR0aW5ncy5Db2xTZXR0aW5nTGlzdCA9IGNvbExpc3QubWFwKChjKSA9PiAoe1xuICAgICAgICBJc0hpZGRlbjogYy5IaWRkZW4sXG4gICAgICAgIE5hbWU6IGMuTmFtZSxcbiAgICAgICAgV2lkdGg6IGMuV2lkdGgsXG4gICAgICAgIENhcHRpb246IGMuQ2FwdGlvblxuICAgIH0pKTtcbiAgICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHZXREZWZhdWx0TW9PYmplY3RJbmZvKHR5cGVEZWZJZDogc3RyaW5nKTogTWV0YW9iamVjdERhdGFNb2RlbCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgSWQ6ICcwJyxcbiAgICAgICAgJENhcHRpb246ICcnLFxuICAgICAgICAkVHlwZURlZklkOiB0eXBlRGVmSWQsXG4gICAgICAgICRTdGF0ZTogJ05ldycsXG4gICAgICAgICRUeXBlOiAnQ29tbW9uLk1ldGFPYmplY3RXZWInLFxuICAgICAgICAkRmllbGREaWN0OiB7fVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF5b3V0OTRPYmplY3RJbmZvKCk6IExheW91dFNldHRpbmcge1xuICAgIHJldHVybiB7XG4gICAgICAgIFR5cGU6ICdSb290JyxcbiAgICAgICAgQ29udHJvbElkOiAn2LHbjNi02YcnLFxuICAgICAgICB4dHlwZTogJ0x5LkxheW91dENvbnRhaW5lcicsXG4gICAgICAgIEJvdW5kczogeyB4OiAwLCB5OiAwLCB3aWR0aDogNDMyLCBoZWlnaHQ6IDI0IH0sXG4gICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgVHlwZTogJ1ZlcnRpY2FsSm9pbicsXG4gICAgICAgICAgICAgICAgeHR5cGU6ICdMeS5MYXlvdXRKb2luJyxcbiAgICAgICAgICAgICAgICBJc1ZlcnRpY2FsOiB0cnVlLFxuICAgICAgICAgICAgICAgIEJvdW5kczogeyB4OiAwLCB5OiAwLCB3aWR0aDogNDMyLCBoZWlnaHQ6IDgyIH0sXG4gICAgICAgICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1TZXR0aW5ncyh0eXBlRGVmSWQ6IHN0cmluZyk6IEZvcm1TZXR0aW5nIHtcbiAgICBjb25zdCBtbyA9IEdldERlZmF1bHRNb09iamVjdEluZm8odHlwZURlZklkKTtcblxuICAgIGNvbnN0IGZvcm1QYW5lbFNldHRpbmdzOiBGb3JtU2V0dGluZyA9IHtcbiAgICAgICAgVmlldzoge1xuICAgICAgICAgICAgTGF5b3V0OTQ6IGdldExheW91dDk0T2JqZWN0SW5mbyxcbiAgICAgICAgICAgIENvbnRyb2xJbmZvOiBbXSxcbiAgICAgICAgICAgIFR5cGVEZWZJZDogdHlwZURlZklkXG4gICAgICAgIH0sXG4gICAgICAgIElzU2VhcmNoUGFuZWw6IHRydWUsXG4gICAgICAgIERhdGE6IHtcbiAgICAgICAgICAgIE1vOiBtb1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gZm9ybVBhbmVsU2V0dGluZ3M7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9ybVBhbmVsTWV0YUNvbmRpdGlvbnMoXG4gICAgdHlwZURlZklkOiBzdHJpbmcsXG4gICAgY29udHJvbHNJbmZvOiBHZW5lcmFsQ29udHJvbEluZm9Nb2RlbFtdLFxuICAgIGNvbnRyb2xOYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxuKTogYW55IHtcbiAgICBjb25zdCBmb3JtU2V0dGluZ3MgPSBnZXRGb3JtU2V0dGluZ3ModHlwZURlZklkKTtcbiAgICBmb3JtU2V0dGluZ3MuVmlldy5Db250cm9sSW5mbyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29udHJvbHNJbmZvKSk7XG5cbiAgICBmb3JtU2V0dGluZ3MuVmlldy5MYXlvdXQ5NC5pdGVtc1swXS5pdGVtcy5wdXNoKC4uLmNvbnRyb2xzSW5mby5tYXAoKGMpID0+IGdldExheW91dENvbnRyb2woYy5Db250cm9sTmFtZSkpKTtcbiAgICBmb3JtU2V0dGluZ3MuRGF0YS5Nb1tjb250cm9sTmFtZV0gPSB2YWx1ZTtcbiAgICBjb25zdCBmb3JtUGFuZWxDdHJsciA9IG5ldyBCYXJzYUFwaS5VbC5Gb3JtUGFuZWxDdHJscih7XG4gICAgICAgIFNldHRpbmc6IGZvcm1TZXR0aW5ncyxcbiAgICAgICAgRmVhdHVyZXM6IHtcbiAgICAgICAgICAgIFdvcmtmbG93OiBmYWxzZSxcbiAgICAgICAgICAgIFRvb2xiYXI6IGZhbHNlLFxuICAgICAgICAgICAgSW5mb0JhcjogZmFsc2VcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmb3JtUGFuZWxDdHJscjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdNb0dyaWRFZGl0b3IoZm9ybVNldHRpbmdzOiBGb3JtU2V0dGluZywgdHlwZWRlZklkOiBzdHJpbmcpOiBQYXJ0aWFsPEZvcm1TZXR0aW5nPiB7XG4gICAgY29uc3QgbmV3Rm9ybVNldHRpbmdzOiBGb3JtU2V0dGluZyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZm9ybVNldHRpbmdzKSk7XG4gICAgcmV0dXJuIHsgLi4ubmV3Rm9ybVNldHRpbmdzLkRhdGEuTW8sICRUeXBlRGVmSWQ6IHR5cGVkZWZJZCB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdyaWRFZGl0b3JGb3JtUGFuZWwoXG4gICAgZm9ybVNldHRpbmdzOiBGb3JtU2V0dGluZyxcbiAgICBtbzogTWV0YW9iamVjdERhdGFNb2RlbCxcbiAgICB0eXBlZGVmOiBzdHJpbmcsXG4gICAgcmVsYXRpb246IGFueSxcbiAgICByZXdyaXRlTGF5b3V0OiBib29sZWFuID0gdHJ1ZSxcbiAgICBVbHZNYWluQ3RybHI6IGFueSA9IG51bGxcbik6IGFueSB7XG4gICAgY29uc3QgbmV3Rm9ybVNldHRpbmdzOiBGb3JtU2V0dGluZyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZm9ybVNldHRpbmdzKSk7XG4gICAgbmV3Rm9ybVNldHRpbmdzLkRhdGEuTW8gPSB7IC4uLm1vLCAkVHlwZURlZklkOiB0eXBlZGVmIH07XG4gICAgaWYgKHJld3JpdGVMYXlvdXQpIHtcbiAgICAgICAgbmV3Rm9ybVNldHRpbmdzLlZpZXcuTGF5b3V0OTQgPSBnZXRMYXlvdXQ5NE9iamVjdEluZm8oKTtcbiAgICAgICAgbmV3Rm9ybVNldHRpbmdzLlZpZXcuTGF5b3V0OTQuaXRlbXNbMF0uaXRlbXMucHVzaChcbiAgICAgICAgICAgIC4uLm5ld0Zvcm1TZXR0aW5ncy5WaWV3LkNvbnRyb2xJbmZvLm1hcCgoYykgPT5cbiAgICAgICAgICAgICAgICBnZXRMYXlvdXRDb250cm9sKGMuQ29udHJvbE5hbWUsIGMuQ29udHJvbEZpZWxkQ2FwdGlvblRyYW5zbGF0ZWQsIGZhbHNlKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cbiAgICBjb25zdCBmb3JtUmVxdWVzdFBhcmFtcyA9IG5ldyBCYXJzYUFwaS5VbC5Gb3JtUmVxdWVzdFBhcmFtcyh7XG4gICAgICAgIE1vSWQ6IG5ld0Zvcm1TZXR0aW5ncy5EYXRhLk1vLklkLFxuICAgICAgICBUeXBlRGVmSWQ6IHR5cGVkZWYsXG4gICAgICAgIFJlbGF0aW9uOiByZWxhdGlvblxuICAgICAgICAvLyBNb0NvbnRleHQ6IHtcbiAgICAgICAgLy8gICAgIFJlcG9ydElkOiAnJyxcbiAgICAgICAgLy8gICAgIFZpZXdJZDogJycsXG4gICAgICAgIC8vICAgICBWaWV3TmFtZTogJycsXG4gICAgICAgIC8vICAgICBDb25kRm9ybWF0aW5nOiAnJyxcbiAgICAgICAgLy8gICAgIEluY2x1ZGVJblJlcG9ydDogJydcbiAgICAgICAgLy8gfVxuICAgIH0pO1xuICAgIGNvbnN0IGZvcm1QYW5lbEN0cmxyID0gbmV3IEJhcnNhQXBpLlVsLkZvcm1QYW5lbEN0cmxyKHtcbiAgICAgICAgU2V0dGluZzogbmV3Rm9ybVNldHRpbmdzLFxuICAgICAgICBSZWxhdGlvbjogcmVsYXRpb24sXG4gICAgICAgIFVsdk1haW5DdHJscjogVWx2TWFpbkN0cmxyLFxuICAgICAgICBGZWF0dXJlczoge1xuICAgICAgICAgICAgV29ya2Zsb3c6IGZhbHNlLFxuICAgICAgICAgICAgVG9vbGJhcjogZmFsc2UsXG4gICAgICAgICAgICBJbmZvQmFyOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBGb3JtUmVxdWVzdFBhcmFtczogZm9ybVJlcXVlc3RQYXJhbXNcbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybVBhbmVsQ3RybHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRDb250cm9sKFxuICAgIGNvbnRyb2xOYW1lOiBzdHJpbmcsXG4gICAgY29udHJvbENhcHRpb246IHN0cmluZyA9ICcnLFxuICAgIGhpZGU6IGJvb2xlYW4gPSB0cnVlXG4pOiBQYXJ0aWFsPEdlbmVyYWxDb250cm9sSW5mb01vZGVsPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeHR5cGU6ICdMeS5MYXlvdXRDb250cm9sJyxcbiAgICAgICAgVHlwZTogJ0xheW91dENvbnRyb2xJdGVtJyxcbiAgICAgICAgQ29udHJvbElkOiBjb250cm9sTmFtZSxcbiAgICAgICAgSXNWZXJ0aWNhbDogZmFsc2UsXG4gICAgICAgIFRleHRMb2NhdGlvbjogJ1JpZ2h0JyxcbiAgICAgICAgVGV4dFZpc2libGU6IGZhbHNlLFxuICAgICAgICBWaXNpYmxlOiAhaGlkZSxcbiAgICAgICAgaGlkZSxcbiAgICAgICAgVXNlTGF5b3V0SXRlbVRleHRGb3JDb250cm9sOiBmYWxzZSxcbiAgICAgICAgQ2FwdGlvbjogY29udHJvbENhcHRpb24sXG4gICAgICAgIEFjY2Vzc2libGVOYW1lOiAnJyxcbiAgICAgICAgQm91bmRzOiB7IHg6IDAsIHk6IDAsIHdpZHRoOiA0MzIsIGhlaWdodDogMjQgfSxcbiAgICAgICAgTWluU2l6ZTogeyB3aWR0aDogODksIGhlaWdodDogMjQgfSxcbiAgICAgICAgTWF4U2l6ZTogeyB3aWR0aDogMCwgaGVpZ2h0OiAyNCB9LFxuICAgICAgICBDb250cm9sQm91bmRzOiB7IHdpZHRoOiAzODgsIGhlaWdodDogMjAgfSxcbiAgICAgICAgQ29udHJvbE1pblNpemU6IHsgd2lkdGg6IDQ1LCBoZWlnaHQ6IDIwIH0sXG4gICAgICAgIENvbnRyb2xNYXhTaXplOiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDIwIH0sXG4gICAgICAgIFBhZGRpbmc6IFsyLCAyLCAyLCAyXSxcbiAgICAgICAgTGFiZWxTaXplOiB7IHdpZHRoOiAzNSwgaGVpZ2h0OiAxMyB9LFxuICAgICAgICBvcmlnaW5hbFh0eXBlOiAnJ1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sTGlzdChcbiAgICBtbzogTWV0YW9iamVjdERhdGFNb2RlbCxcbiAgICBjb250cm9sRGJOYW1lczogc3RyaW5nW10sXG4gICAgaXNTZWFyY2hQYW5lbDogYm9vbGVhbixcbiAgICBpc0dyaWRFZGl0b3I6IGJvb2xlYW5cbik6IFByb21pc2U8R2VuZXJhbENvbnRyb2xJbmZvTW9kZWxbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxHZW5lcmFsQ29udHJvbEluZm9Nb2RlbFtdPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIEJhcnNhQXBpLkNvbW1vbi5BamF4LkdldFNlcnZlckRhdGEoXG4gICAgICAgICAgICAnRm9ybTk0LkdldENvbnRyb2xJbmZvcycsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udHJvbEluZm9QYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgRmllbGREYk5hbWVzOiBjb250cm9sRGJOYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgTW86IG5ldyBCYXJzYUFwaS5Db21tb24uTWV0YU9iamVjdFdlYihtbyksXG4gICAgICAgICAgICAgICAgICAgIElzU2VhcmNoUGFuZWw6IGlzU2VhcmNoUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgIElzR3JpZEVkaXRvcjogaXNHcmlkRWRpdG9yXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShtKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCB0eXBlIE56U2FmZUFueSA9IGFueTtcbmV4cG9ydCB0eXBlIE51bWJlcklucHV0ID0gbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbDtcbmV4cG9ydCBpbnRlcmZhY2UgTmdTdHlsZUludGVyZmFjZSB7XG4gICAgW2tsYXNzOiBzdHJpbmddOiBOelNhZmVBbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXhhYmxlT2JqZWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBOelNhZmVBbnk7XG59XG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakE/OiBJbmRleGFibGVPYmplY3QsIG9iakI/OiBJbmRleGFibGVPYmplY3QpOiBib29sZWFuIHtcbiAgICBpZiAob2JqQSA9PT0gb2JqQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8ICFvYmpBIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCAhb2JqQikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBiSGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmJpbmQob2JqQik7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mb3Itb2ZcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBrZXlzQS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNBW2lkeF07XG4gICAgICAgIGlmICghYkhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqQVtrZXldICE9PSBvYmpCW2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXI7XG5leHBvcnQgZnVuY3Rpb24gdG9OdW1iZXI8RD4odmFsdWU6IG51bWJlciB8IHN0cmluZywgZmFsbGJhY2s6IEQpOiBudW1iZXIgfCBEO1xuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIGZhbGxiYWNrVmFsdWU6IG51bWJlciA9IDApOiBudW1iZXIge1xuICAgIHJldHVybiBfaXNOdW1iZXJWYWx1ZSh2YWx1ZSkgPyBOdW1iZXIodmFsdWUpIDogZmFsbGJhY2tWYWx1ZTtcbn1cbmZ1bmN0aW9uIHByb3BEZWNvcmF0b3JGYWN0b3J5PFQsIEQ+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmYWxsYmFjazogKHY6IFQpID0+IERcbik6ICh0YXJnZXQ6IE56U2FmZUFueSwgcHJvcE5hbWU6IHN0cmluZykgPT4gdm9pZCB7XG4gICAgZnVuY3Rpb24gcHJvcERlY29yYXRvcihcbiAgICAgICAgdGFyZ2V0OiBOelNhZmVBbnksXG4gICAgICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgICAgIG9yaWdpbmFsRGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPE56U2FmZUFueT5cbiAgICApOiBOelNhZmVBbnkge1xuICAgICAgICBjb25zdCBwcml2YXRlUHJvcE5hbWUgPSBgJCRfX3pvcnJvUHJvcERlY29yYXRvcl9fJHtwcm9wTmFtZX1gO1xuXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBwcml2YXRlUHJvcE5hbWUpKSB7XG4gICAgICAgICAgICAvLyB3YXJuKGBUaGUgcHJvcCBcIiR7cHJpdmF0ZVByb3BOYW1lfVwiIGlzIGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgb3ZlcnJpZGVkIGJ5ICR7bmFtZX0gZGVjb3JhdG9yLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJpdmF0ZVByb3BOYW1lLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ2V0KCk6IHN0cmluZyB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRGVzY3JpcHRvciAmJiBvcmlnaW5hbERlc2NyaXB0b3IuZ2V0XG4gICAgICAgICAgICAgICAgICAgID8gb3JpZ2luYWxEZXNjcmlwdG9yLmdldC5iaW5kKHRoaXMpKClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzW3ByaXZhdGVQcm9wTmFtZV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0KHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGVzY3JpcHRvciAmJiBvcmlnaW5hbERlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRGVzY3JpcHRvci5zZXQuYmluZCh0aGlzKShmYWxsYmFjayh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzW3ByaXZhdGVQcm9wTmFtZV0gPSBmYWxsYmFjayh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BEZWNvcmF0b3I7XG59XG5leHBvcnQgZnVuY3Rpb24gSW5wdXROdW1iZXIoZmFsbGJhY2tWYWx1ZT86IE56U2FmZUFueSk6IE56U2FmZUFueSB7XG4gICAgcmV0dXJuIHByb3BEZWNvcmF0b3JGYWN0b3J5KCdJbnB1dE51bWJlcicsICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSA9PiB0b051bWJlcih2YWx1ZSwgZmFsbGJhY2tWYWx1ZSkpO1xufVxuZXhwb3J0IGVudW0gQWZmaXhSZXNwb25kRXZlbnRzIHtcbiAgICByZXNpemUgPSAncmVzaXplJyxcbiAgICBzY3JvbGwgPSAnc2Nyb2xsJyxcbiAgICB0b3VjaHN0YXJ0ID0gJ3RvdWNoc3RhcnQnLFxuICAgIHRvdWNobW92ZSA9ICd0b3VjaG1vdmUnLFxuICAgIHRvdWNoZW5kID0gJ3RvdWNoZW5kJyxcbiAgICBwYWdlc2hvdyA9ICdwYWdlc2hvdycsXG4gICAgbG9hZCA9ICdMT0FEJ1xufVxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVSZWN0IHtcbiAgICB0b3A6IG51bWJlcjtcbiAgICBsZWZ0OiBudW1iZXI7XG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIGJvdHRvbT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFyZ2V0V2luZG93KHRhcmdldDogRWxlbWVudCB8IFdpbmRvdyk6IHRhcmdldCBpcyBXaW5kb3cge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0YXJnZXQgPT09IHdpbmRvdztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcmdldFJlY3QodGFyZ2V0OiBFbGVtZW50IHwgV2luZG93KTogU2ltcGxlUmVjdCB7XG4gICAgcmV0dXJuICFpc1RhcmdldFdpbmRvdyh0YXJnZXQpXG4gICAgICAgID8gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIDoge1xuICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgIGJvdHRvbTogMFxuICAgICAgICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlKG5hbWU6IHN0cmluZywgbW86IE1ldGFvYmplY3REYXRhTW9kZWwsIGNhcHRpb24/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBpZiAobW8uR2V0RlZhbHVlQnlDYXB0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBtby5HZXRGVmFsdWUobmFtZSk7XG4gICAgICAgIGlmIChjYXB0aW9uKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBtby5HZXRGQ2FwdGlvbihuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNhcHRpb24gPT09ICd1bmRlZmluZWQnICYmIG1vLkluaGVyaXRhbmNlSW5mbyAmJiAhKG1vLiRGaWVsZERpY3QgJiYgbW8uJEZpZWxkRGljdFtuYW1lXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgUGFyZW50RmllbGROYW1lIH0gPSBtby5Jbmhlcml0YW5jZUluZm87XG4gICAgICAgICAgICBjb25zdCBtb1BhcmVudCA9IG1vLkdldEZWYWx1ZShQYXJlbnRGaWVsZE5hbWUpO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG1vUGFyZW50LkdldEZWYWx1ZShuYW1lKTtcbiAgICAgICAgICAgIGlmIChjYXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbW9QYXJlbnQuR2V0RkNhcHRpb24obmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgZmllbGROYW1lID0gbW8uJEZpZWxkRGljdCAmJiBtby4kRmllbGREaWN0W25hbWVdID8gbW8uJEZpZWxkRGljdFtuYW1lXSA6IG5hbWU7XG4gICAgbGV0IHZhbCA9IG1vW2ZpZWxkTmFtZV07XG4gICAgaWYgKGNhcHRpb24pIHtcbiAgICAgICAgbGV0IGNhcHRpb25WYWwgPSBtb1tmaWVsZE5hbWVdPy4kQ2FwdGlvbjtcbiAgICAgICAgaWYgKHR5cGVvZiBjYXB0aW9uVmFsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKCFjYXB0aW9uVmFsKSB7XG4gICAgICAgICAgICAgICAgY2FwdGlvblZhbCA9IG1vW2ZpZWxkTmFtZSArICckQ2FwdGlvbiddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjYXB0aW9uVmFsKSB7XG4gICAgICAgICAgICAgICAgY2FwdGlvblZhbCA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YWwgPSBjYXB0aW9uVmFsO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cbmV4cG9ydCBjb25zdCBhdmFpbGFibGVQcmVmaXhlcyA9IFsnbW96JywgJ21zJywgJ3dlYmtpdCddO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoKTogdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSB7XG4gICAgbGV0IGxhc3RUaW1lID0gMDtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxiYWNrOiBGcmFtZVJlcXVlc3RDYWxsYmFjayk6IGFueSB7XG4gICAgICAgIGNvbnN0IGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgICAgIGNvbnN0IGlkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhjdXJyVGltZSArIHRpbWVUb0NhbGwpO1xuICAgICAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICAgICAgbGFzdFRpbWUgPSBjdXJyVGltZSArIHRpbWVUb0NhbGw7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIEV4ZWN1dGVEeW5hbWljQ29tbWFuZChjb21tYW5kOiB7IElkOiBzdHJpbmcgfSwgbW86IE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IGUgPSB7IGNvbW1hbmQsIER5bmFtaWNTZXR0aW5nOiBtbywgTW86IG1vIH07XG4gICAgQmFyc2FBcGkuQ29tbW9uLkN1c3RvbUNvZGVNYW5hZ2VyLlJ1bkR5bmFtaWNDb21tYW5kKGNvbW1hbmQuSWQsIGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEV4ZWN1dGVXb3JrZmxvd0Nob2ljZURlZihzY29wZSwgcGFyYW0sIHN1Y2Nlc3M6IChyZXN1bHQpID0+IHZvaWQsIGZhaWxlZDogKGVycm9yKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgQmFyc2FBcGkuQ29tbW9uLkFqYXguR2V0U2VydmVyRGF0YShcbiAgICAgICAgJ1dvcmtmbG93OTQuQ2hvaWNlU2VsZWN0JyxcbiAgICAgICAgcGFyYW0sXG4gICAgICAgIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHN1Y2Nlc3MocmVzdWx0KTtcbiAgICAgICAgfSwgLy8gc3VjY2Vzc1xuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGZhaWxlZChlcnJvcik7XG4gICAgICAgIH0sIC8vICBlcnJvclxuICAgICAgICAoKSA9PiB7fSwgLy8gZG9SZXR1cm5cbiAgICAgICAgc2NvcGUsXG4gICAgICAgIHRydWVcbiAgICApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcXVlc3RBbmltYXRpb25GcmFtZSgpOiB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICgpID0+IDA7XG4gICAgfVxuICAgIGlmICh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvaXNzdWVzLzQ0NjVcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeCA9IGF2YWlsYWJsZVByZWZpeGVzLmZpbHRlcigoa2V5KSA9PiBgJHtrZXl9UmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBpbiB3aW5kb3cpWzBdO1xuXG4gICAgcmV0dXJuIHByZWZpeCA/ICh3aW5kb3cgYXMgTnpTYWZlQW55KVtgJHtwcmVmaXh9UmVxdWVzdEFuaW1hdGlvbkZyYW1lYF0gOiByZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZShpZDogbnVtYmVyKTogTnpTYWZlQW55IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7XG4gICAgfVxuICAgIGNvbnN0IHByZWZpeCA9IGF2YWlsYWJsZVByZWZpeGVzLmZpbHRlcihcbiAgICAgICAgKGtleSkgPT4gYCR7a2V5fUNhbmNlbEFuaW1hdGlvbkZyYW1lYCBpbiB3aW5kb3cgfHwgYCR7a2V5fUNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZWAgaW4gd2luZG93XG4gICAgKVswXTtcblxuICAgIHJldHVybiBwcmVmaXhcbiAgICAgICAgPyAoXG4gICAgICAgICAgICAgICh3aW5kb3cgYXMgTnpTYWZlQW55KVtgJHtwcmVmaXh9Q2FuY2VsQW5pbWF0aW9uRnJhbWVgXSB8fFxuICAgICAgICAgICAgICAod2luZG93IGFzIE56U2FmZUFueSlbYCR7cHJlZml4fUNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZWBdXG4gICAgICAgICAgKVxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgIC5jYWxsKHRoaXMsIGlkKVxuICAgICAgICA6IGNsZWFyVGltZW91dChpZCk7XG59XG5cbmV4cG9ydCB0eXBlIEVhc3lpbmdGbiA9ICh0OiBudW1iZXIsIGI6IG51bWJlciwgYzogbnVtYmVyLCBkOiBudW1iZXIpID0+IG51bWJlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIGVhc2VJbk91dEN1YmljKHQ6IG51bWJlciwgYjogbnVtYmVyLCBjOiBudW1iZXIsIGQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgY2MgPSBjIC0gYjtcbiAgICBsZXQgdHQgPSB0IC8gKGQgLyAyKTtcbiAgICBpZiAodHQgPCAxKSB7XG4gICAgICAgIHJldHVybiAoY2MgLyAyKSAqIHR0ICogdHQgKiB0dCArIGI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChjYyAvIDIpICogKCh0dCAtPSAyKSAqIHR0ICogdHQgKyAyKSArIGI7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE56U2Nyb2xsVG9PcHRpb25zIHtcbiAgICAvKiogQW5pbWF0aW9uIGR1cmF0aW9uLCBkZWZhdWx0IGFzIDQ1MCAqL1xuICAgIGR1cmF0aW9uPzogbnVtYmVyO1xuICAgIC8qKiBTY3JvbGwgY29udGFpbmVyLCBkZWZhdWx0IGFzIHdpbmRvdyAqL1xuICAgIGVhc2luZz86IEVhc3lpbmdGbjtcbiAgICAvKiogU2Nyb2xsIGVuZCBjYWxsYmFjayAqL1xuICAgIGNhbGxiYWNrPygpOiB2b2lkO1xufVxuZXhwb3J0IGNvbnN0IFdvcmRNaW1lVHlwZSA9XG4gICAgJy5kb2MsLmRvY3gsYXBwbGljYXRpb24vbXN3b3JkLGFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JztcbmV4cG9ydCBjb25zdCBJbWFnZU1pbWVUeXBlID0gJy5qcGVnLC5qcGcsLmdpZiwucG5nLC5ibXAsLnRpZixpbWFnZS8qJztcbmV4cG9ydCBjb25zdCBQZGZNaW1lVHlwZSA9ICcucGRmJztcbmV4cG9ydCBjb25zdCBBbGxGaWxlc01pbWVUeXBlID0gJy50eHQsLnBwdCwucGRmLC4qJztcbmV4cG9ydCBjb25zdCBWaWRlb01pbWVUeXBlID0gJ3ZpZGVvLyonO1xuZXhwb3J0IGNvbnN0IEF1ZGlvTWltZVR5cGUgPSAnYXVkaW8vKic7XG5cbmV4cG9ydCBmdW5jdGlvbiBDaGFuZ2VMYXlvdXRJbmZvQ3VzdG9tVWkobGF5b3V0SW5mbzogTGF5b3V0U2V0dGluZywgY29tcG9uZW50VWk6IEVqcmF5T2xnbyk6IHZvaWQge1xuICAgIGxheW91dEluZm8uRmllbGRVaS5TZXR0aW5nLkN1c3RvbVVpID0gY29tcG9uZW50VWk7XG59XG5leHBvcnQgY29uc3QgbW9iaWxlX3JlZ2V4ID0gbmV3IFJlZ0V4cCgnXihcXFxcKzk4fDApPzlcXFxcZHs5fSQnKTtcbmV4cG9ydCBjb25zdCBudW1iZXJfb25seSA9IG5ldyBSZWdFeHAoJ15bMC05XSskJyk7XG5leHBvcnQgZnVuY3Rpb24gZm9yYmlkZGVuVmFsaWRhdG9yKG5hbWVSZTogUmVnRXhwKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCBmb3JiaWRkZW4gPSBuYW1lUmUudGVzdChjb250cm9sLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuICFmb3JiaWRkZW4gPyB7IGZvcmJpZGRlbk5hbWU6IHsgdmFsdWU6IGNvbnRyb2wudmFsdWUgfSB9IDogbnVsbDtcbiAgICB9O1xufVxuIl19