ngx-bimplus-components 0.0.158 → 0.0.159-28783-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 (154) hide show
  1. package/assets/images/default/Attachment_18_gray.svg +1 -0
  2. package/assets/images/default/Attachment_18_maincolor.svg +3 -0
  3. package/assets/images/default/Attachmentlink_18_gray.svg +7 -0
  4. package/assets/images/default/Attachmentlink_18_maincolor.svg +7 -0
  5. package/assets/images/default/Comments_18_gray.svg +1 -0
  6. package/assets/images/default/Comments_18_maincolor.svg +4 -0
  7. package/assets/images/default/Links_18_gray.svg +1 -0
  8. package/assets/images/default/Links_18_maincolor.svg +4 -0
  9. package/assets/images/default/Refresh_18_gray.svg +1 -0
  10. package/assets/images/default/bimplus_WebIcons_Cross_Disabled.svg +1 -0
  11. package/assets/images/default/ic_models.svg +3 -0
  12. package/assets/images/default/ic_models_maincolor.svg +3 -0
  13. package/assets/images/default/icn_grid_attachments.png +0 -0
  14. package/assets/images/default/icn_grid_hyperlinks.png +0 -0
  15. package/assets/images/default/progress-spinner.svg +1 -0
  16. package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.component.mjs +104 -0
  17. package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.interface.mjs +38 -0
  18. package/esm2022/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.mjs +92 -0
  19. package/esm2022/lib/components/bimplus-attachments/services/bimplus-attachments.service.mjs +32 -0
  20. package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.mjs +37 -5
  21. package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.mjs +5 -2
  22. package/esm2022/lib/components/bimplus-comment/IComment.mjs +2 -0
  23. package/esm2022/lib/components/bimplus-comment/bimplus-comment.component.mjs +118 -0
  24. package/esm2022/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.mjs +5 -5
  25. package/esm2022/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.mjs +3 -3
  26. package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.mjs +115 -7
  27. package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.interface.mjs +1 -1
  28. package/esm2022/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.mjs +1 -1
  29. package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-dialog-config-settings.mjs +1 -1
  30. package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.mjs +3 -3
  31. package/esm2022/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.mjs +64 -0
  32. package/esm2022/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.mjs +161 -0
  33. package/esm2022/lib/components/bimplus-input-number/bimplus-input-number.component.mjs +85 -0
  34. package/esm2022/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.mjs +92 -0
  35. package/esm2022/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.mjs +78 -0
  36. package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.mjs +342 -0
  37. package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.mjs +69 -0
  38. package/esm2022/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.mjs +2 -0
  39. package/esm2022/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.mjs +3 -3
  40. package/esm2022/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.mjs +22 -3
  41. package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.mjs +3 -3
  42. package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.mjs +1 -1
  43. package/esm2022/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.mjs +3 -3
  44. package/esm2022/lib/components/bimplus-object-structure/bimplus-object-structure.component.mjs +42 -4
  45. package/esm2022/lib/components/bimplus-object-structure/bimplus-object-structure.interface.mjs +4 -2
  46. package/esm2022/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.mjs +77 -0
  47. package/esm2022/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.mjs +83 -0
  48. package/esm2022/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.mjs +31 -8
  49. package/esm2022/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.mjs +34 -8
  50. package/esm2022/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.mjs +1 -1
  51. package/esm2022/lib/components/bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component.mjs +3 -3
  52. package/esm2022/lib/components/bimplus-status-bar/bimplus-status-bar.component.mjs +35 -0
  53. package/esm2022/lib/components/bimplus-status-bar/bimplus-status-bar.service.mjs +35 -0
  54. package/esm2022/lib/components/bimplus-status-bar/statusBar.mjs +2 -0
  55. package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.mjs +38 -0
  56. package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.mjs +10 -0
  57. package/esm2022/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.mjs +89 -0
  58. package/esm2022/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.mjs +33 -0
  59. package/esm2022/lib/components/bimplus-textarea/autoResizeTextarea.directive.mjs +83 -0
  60. package/esm2022/lib/components/bimplus-textarea/bimplus-textarea.component.mjs +128 -0
  61. package/esm2022/lib/components/links-to-documents/links-to-documents.component.mjs +380 -0
  62. package/esm2022/lib/components/object-hyperlinks/object-hyperlinks.component.mjs +145 -0
  63. package/esm2022/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.mjs +36 -0
  64. package/esm2022/lib/components/object-preview/object-preview.component.mjs +283 -0
  65. package/esm2022/lib/components/object-preview/object-preview.interface.mjs +2 -0
  66. package/esm2022/lib/components/object-properties/object-properties.component.mjs +536 -0
  67. package/esm2022/lib/components/object-properties/object-properties.interface.mjs +2 -0
  68. package/esm2022/lib/components/object-properties/object-properties.service.mjs +26 -0
  69. package/esm2022/lib/components/object-properties-group/object-properties-group.component.mjs +124 -0
  70. package/esm2022/lib/components/object-properties-group/object-property-value/object-property-value.component.mjs +55 -0
  71. package/esm2022/lib/components/object-properties-header/object-properties-header.component.mjs +48 -6
  72. package/esm2022/lib/components/object-properties-header/object-properties-header.interface.mjs +1 -1
  73. package/esm2022/lib/components/resizable-panel/resizable-panel.component.mjs +54 -10
  74. package/esm2022/lib/pipes/bit-converter.pipe.mjs +46 -0
  75. package/esm2022/lib/pipes/get-attribute-value-as-string.pipe.mjs +173 -0
  76. package/esm2022/lib/pipes/get-attribute-value.pipe.mjs +162 -0
  77. package/esm2022/lib/pipes/round.pipe.mjs +20 -0
  78. package/esm2022/lib/utils/objectProperties.mjs +9 -0
  79. package/esm2022/lib/validators/double-enum.validator.mjs +17 -0
  80. package/esm2022/lib/validators/double.validator.mjs +23 -0
  81. package/esm2022/lib/validators/guid-enum.validator.mjs +17 -0
  82. package/esm2022/lib/validators/guid.validator.mjs +11 -0
  83. package/esm2022/lib/validators/integer.validator.mjs +20 -0
  84. package/esm2022/lib/validators/string-combobox.validator.mjs +17 -0
  85. package/esm2022/lib/validators/string-enum.validator.mjs +17 -0
  86. package/esm2022/public-api.mjs +22 -1
  87. package/fesm2022/ngx-bimplus-components.mjs +4195 -82
  88. package/fesm2022/ngx-bimplus-components.mjs.map +1 -1
  89. package/lib/components/bimplus-attachments/bimplus-attachments.component.d.ts +39 -0
  90. package/lib/components/bimplus-attachments/bimplus-attachments.interface.d.ts +33 -0
  91. package/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.d.ts +30 -0
  92. package/lib/components/bimplus-attachments/services/bimplus-attachments.service.d.ts +8 -0
  93. package/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.d.ts +13 -3
  94. package/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.d.ts +7 -1
  95. package/lib/components/bimplus-comment/IComment.d.ts +4 -0
  96. package/lib/components/bimplus-comment/bimplus-comment.component.d.ts +39 -0
  97. package/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.d.ts +16 -3
  98. package/lib/components/bimplus-flat-tree/bimplus-flat-tree.interface.d.ts +4 -0
  99. package/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.d.ts +1 -1
  100. package/lib/components/bimplus-general-overlay-dialog/bimplus-general-dialog-config-settings.d.ts +3 -3
  101. package/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.d.ts +18 -0
  102. package/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.d.ts +41 -0
  103. package/lib/components/bimplus-input-number/bimplus-input-number.component.d.ts +26 -0
  104. package/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.d.ts +28 -0
  105. package/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.d.ts +22 -0
  106. package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.d.ts +84 -0
  107. package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.d.ts +15 -0
  108. package/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.d.ts +11 -0
  109. package/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.d.ts +5 -1
  110. package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.d.ts +12 -12
  111. package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.d.ts +3 -3
  112. package/lib/components/bimplus-object-structure/bimplus-object-structure.component.d.ts +5 -1
  113. package/lib/components/bimplus-object-structure/bimplus-object-structure.interface.d.ts +2 -0
  114. package/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.d.ts +29 -0
  115. package/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.d.ts +24 -0
  116. package/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.d.ts +8 -1
  117. package/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.d.ts +11 -1
  118. package/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.d.ts +1 -1
  119. package/lib/components/bimplus-status-bar/bimplus-status-bar.component.d.ts +14 -0
  120. package/lib/components/bimplus-status-bar/bimplus-status-bar.service.d.ts +14 -0
  121. package/lib/components/bimplus-status-bar/statusBar.d.ts +4 -0
  122. package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.d.ts +16 -0
  123. package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.d.ts +18 -0
  124. package/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.d.ts +36 -0
  125. package/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.d.ts +15 -0
  126. package/lib/components/bimplus-textarea/autoResizeTextarea.directive.d.ts +24 -0
  127. package/lib/components/bimplus-textarea/bimplus-textarea.component.d.ts +42 -0
  128. package/lib/components/links-to-documents/links-to-documents.component.d.ts +68 -0
  129. package/lib/components/object-hyperlinks/object-hyperlinks.component.d.ts +32 -0
  130. package/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.d.ts +15 -0
  131. package/lib/components/object-preview/object-preview.component.d.ts +45 -0
  132. package/lib/components/object-preview/object-preview.interface.d.ts +5 -0
  133. package/lib/components/object-properties/object-properties.component.d.ts +78 -0
  134. package/lib/components/object-properties/object-properties.interface.d.ts +22 -0
  135. package/lib/components/object-properties/object-properties.service.d.ts +12 -0
  136. package/lib/components/object-properties-group/object-properties-group.component.d.ts +29 -0
  137. package/lib/components/object-properties-group/object-property-value/object-property-value.component.d.ts +14 -0
  138. package/lib/components/object-properties-header/object-properties-header.component.d.ts +13 -4
  139. package/lib/components/object-properties-header/object-properties-header.interface.d.ts +8 -0
  140. package/lib/components/resizable-panel/resizable-panel.component.d.ts +12 -3
  141. package/lib/pipes/bit-converter.pipe.d.ts +17 -0
  142. package/lib/pipes/get-attribute-value-as-string.pipe.d.ts +35 -0
  143. package/lib/pipes/get-attribute-value.pipe.d.ts +35 -0
  144. package/lib/pipes/round.pipe.d.ts +7 -0
  145. package/lib/utils/objectProperties.d.ts +2 -0
  146. package/lib/validators/double-enum.validator.d.ts +2 -0
  147. package/lib/validators/double.validator.d.ts +2 -0
  148. package/lib/validators/guid-enum.validator.d.ts +2 -0
  149. package/lib/validators/guid.validator.d.ts +2 -0
  150. package/lib/validators/integer.validator.d.ts +2 -0
  151. package/lib/validators/string-combobox.validator.d.ts +2 -0
  152. package/lib/validators/string-enum.validator.d.ts +2 -0
  153. package/package.json +12 -4
  154. package/public-api.d.ts +21 -0
@@ -0,0 +1,380 @@
1
+ import { Component, ViewEncapsulation, Input, booleanAttribute, Output, EventEmitter } from '@angular/core';
2
+ import { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';
3
+ import { TranslateModule } from '@ngx-translate/core';
4
+ import { from, BehaviorSubject, switchMap, forkJoin } from 'rxjs';
5
+ import { concatMap } from 'rxjs/operators';
6
+ import { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component';
7
+ import { BimplusButtonsRowComponent } from "../bimplus-buttons-row/bimplus-buttons-row.component";
8
+ import { BimplusOverlayDialogConfirmComponent } from "../bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component";
9
+ import * as WebClient from 'bimplus-webclient';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@ngx-translate/core";
12
+ import * as i2 from "../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service";
13
+ export const EMBEDDED_MODAL_DIALOGE_TYPE_FILE = 'file';
14
+ export const postAttachmentLinks = (newAttachmentIDs, objectId, api) => {
15
+ // Create an array of observables for each post request
16
+ const postRequests = newAttachmentIDs.map((id) => from(api.objects.postAttachmentLink(objectId, JSON.stringify({ attachmentId: id }))));
17
+ // Use forkJoin to wait for all post requests to complete in parallel
18
+ return forkJoin(postRequests)
19
+ .pipe(
20
+ // After all posts are complete, switch to the next call to get updated links
21
+ concatMap(() => from(api.objects.getAttachmentLinks(objectId))));
22
+ };
23
+ export class LinksToDocumentsComponent extends BimplusLocalizedWidgetComponent {
24
+ constructor(translateService, dialogService, renderer, el) {
25
+ super(translateService);
26
+ this.dialogService = dialogService;
27
+ this.renderer = renderer;
28
+ this.el = el;
29
+ this._rootObjectId = "";
30
+ this.isDestroyed = false;
31
+ this.localWormHole = true;
32
+ //When is true then it means the creation of link is in progress
33
+ this.inProgress = false;
34
+ this.canCreateAttachmentLink = true;
35
+ /** Input Attribute to specify if should show only list of attachments. */
36
+ this.listOnly = false;
37
+ /** Input Attribute to specify if should show message when no attachments found. */
38
+ this.showEmptyMessage = true;
39
+ /** Input Attribute to tell if show/hide attachemt size information. */
40
+ this.hideAttachmentSize = false;
41
+ this._attachments = [];
42
+ this.attachmentsChange = new EventEmitter();
43
+ this.canDeleteAttachmentLink = true;
44
+ this.project = null;
45
+ this.wormholeSelector = "localEmbeddedModalId"; // calling application can provide a place where the iframe for documents selection will be rendered
46
+ this.env = 'dev';
47
+ this._currentObjectId$ = new BehaviorSubject("");
48
+ this._attachmentCount = 0;
49
+ this.buttonRowItems = [
50
+ {
51
+ id: "add-documents",
52
+ title: this.translateService.instant('_Add_document'),
53
+ tooltip: this.translateService.instant('_Add_document'),
54
+ disabled: !this.canCreateAttachmentLink,
55
+ buttonStyle: 'primary'
56
+ }
57
+ ];
58
+ this.documentSelection = null;
59
+ this.isOpened = false;
60
+ this.embeddedModalContainer = 'embedded-modal';
61
+ this.shadowRootElement = this.el.nativeElement.shadowRoot;
62
+ }
63
+ set attachments(value) {
64
+ this._attachments = value;
65
+ this.onAttachmentsChange();
66
+ }
67
+ get attachments() {
68
+ return this._attachments;
69
+ }
70
+ onAttachmentsChange() {
71
+ if (this.api) {
72
+ this._attachments = this.decorateAttachmentLinks(this.api, this._attachments);
73
+ }
74
+ }
75
+ set rootObjectId(id) {
76
+ this._currentObjectId$.next(id);
77
+ this._rootObjectId = id;
78
+ }
79
+ get rootObjectId() {
80
+ return this._rootObjectId;
81
+ }
82
+ ngOnInit() {
83
+ if (!this.listOnly) {
84
+ this._currentObjectId$.subscribe({
85
+ next: (id) => {
86
+ this._createAttachmentLinkStructure(id);
87
+ }
88
+ });
89
+ }
90
+ }
91
+ ;
92
+ ngOnDestroy() {
93
+ this.isDestroyed = true;
94
+ }
95
+ fmt(string, ...formats) {
96
+ let index = 0;
97
+ return string.replace(/%@(\d+)?/g, (match, argumentIndex) => {
98
+ const argumentIndexN = argumentIndex ? parseInt(argumentIndex, 10) - 1 : index++;
99
+ const _match = formats[argumentIndexN];
100
+ if (_match === null) {
101
+ return '(null)';
102
+ }
103
+ if (_match === undefined) {
104
+ return '';
105
+ }
106
+ return _match.toString();
107
+ });
108
+ }
109
+ /**--------------------------------------------------------------------------
110
+ * decorate link
111
+ --------------------------------------------------------------------------*/
112
+ _decorateLink(api, link) {
113
+ const retval = {
114
+ id: link.id,
115
+ name: link.name,
116
+ fileName: link.fileName,
117
+ size: link.size,
118
+ link: link.link,
119
+ fileNameShort: '',
120
+ extension: '',
121
+ objectIds: [],
122
+ version: link.version,
123
+ sizeMB: ""
124
+ };
125
+ const access_token = api.getAccessToken();
126
+ const attVersion = "attachments/%@/versions/%@/download";
127
+ const url = api.getApiTeamUrl() + attVersion;
128
+ const isEmbeddedAllplanMode = false;
129
+ retval.size = parseFloat((link.size / 1000).toFixed(2));
130
+ retval.link = `${this.fmt(url, link.id, link.version)}?api-token=${access_token}${isEmbeddedAllplanMode ? '' : '&openInBrowser=true'}`;
131
+ if (link.fileName.length > 20) {
132
+ const fileParts = link.fileName.split('.');
133
+ if (fileParts.length > 1) {
134
+ retval.fileNameShort = fileParts.slice(0, -1).join('.');
135
+ retval.extension = "." + fileParts.slice(-1);
136
+ }
137
+ else {
138
+ retval.fileNameShort = link.fileName;
139
+ }
140
+ }
141
+ else {
142
+ retval.fileNameShort = link.fileName;
143
+ }
144
+ retval.objectIds = [this._currentObjectId$.value];
145
+ return retval;
146
+ }
147
+ decorateAttachmentLinks(api, links) {
148
+ const decoratedLinks = links.map((link) => this._decorateLink(api, link));
149
+ decoratedLinks.sort((a, b) => {
150
+ if (a.fileName.toLowerCase() < b.fileName.toLowerCase())
151
+ return -1;
152
+ if (a.fileName.toLowerCase() > b.fileName.toLowerCase())
153
+ return 1;
154
+ return 0;
155
+ });
156
+ return decoratedLinks;
157
+ }
158
+ _createAttachmentLinkStructure(objectId) {
159
+ this._loadAttachmentLinkStructure(objectId)?.subscribe({
160
+ next: (structureData) => {
161
+ if (structureData) {
162
+ //this._attachmentLinkStructure = _attachmentLink StructureBuilder.createFromResponse(structureData);
163
+ this._attachmentCount = structureData?.length;
164
+ if (this.api) {
165
+ const retval = this.decorateAttachmentLinks(this.api, structureData);
166
+ if (retval) {
167
+ this._attachments = retval;
168
+ }
169
+ }
170
+ }
171
+ }
172
+ });
173
+ }
174
+ _loadAttachmentLinkStructure(objectId) {
175
+ if (!this.api) {
176
+ return;
177
+ }
178
+ if (!objectId) {
179
+ return;
180
+ }
181
+ return from(this.api.objects.getAttachmentLinks(objectId));
182
+ }
183
+ // show or hide embedded modal
184
+ setModalVisibility(opened = true) {
185
+ if (!this.wormholeSelector) {
186
+ return;
187
+ }
188
+ const element = this.localWormHole ? this.shadowRootElement.querySelector("#" + this.wormholeSelector) :
189
+ document.getElementById(this.wormholeSelector);
190
+ if (!element) {
191
+ return;
192
+ }
193
+ if (this.localWormHole) {
194
+ if (element.parentElement) {
195
+ this.renderer.setStyle(element.parentElement, 'display', opened ? 'block' : 'none');
196
+ }
197
+ }
198
+ else {
199
+ this.renderer.setStyle(element.parentElement, 'display', opened ? 'block' : 'none');
200
+ }
201
+ ///containerEl.fadeIn("fast") : containerEl.fadeOut("fast");
202
+ this.isOpened = opened;
203
+ }
204
+ closeEmbeddedModalFileSelection() {
205
+ this.setModalVisibility(false);
206
+ }
207
+ _addLink(api, ids) {
208
+ // filter out already existing attachment links
209
+ const newAttachmentIDs = ids.filter(item => !this.attachments.find(n => n.id === item));
210
+ if (!newAttachmentIDs.length) {
211
+ return;
212
+ }
213
+ if (this.inProgress) {
214
+ console.log('in progress');
215
+ return;
216
+ }
217
+ this.inProgress = true;
218
+ newAttachmentIDs.forEach((id) => {
219
+ console.log('new attachment id:', id);
220
+ });
221
+ postAttachmentLinks(newAttachmentIDs, this.rootObjectId, api)
222
+ .subscribe({
223
+ next: (updatedAttachments) => {
224
+ this._attachments = this.decorateAttachmentLinks(api, updatedAttachments); // Update attachments in component
225
+ this.inProgress = false;
226
+ this.attachmentsChange.emit(newAttachmentIDs);
227
+ },
228
+ error: (err) => {
229
+ console.error('Failed to add or reload attachments:', err);
230
+ this.inProgress = false;
231
+ }
232
+ });
233
+ }
234
+ createAttachmentLink(api) {
235
+ console.log('createAttachmentLink');
236
+ this.localWormHole = this.wormholeSelector === "localEmbeddedModalId";
237
+ const callbackF = (docIDs) => {
238
+ const ids = (typeof docIDs === 'string') ? [docIDs] : docIDs;
239
+ const foundDocuments = ids && ids.length > 0;
240
+ if (!this.isDestroyed) {
241
+ this.closeEmbeddedModalFileSelection();
242
+ if (foundDocuments) {
243
+ this._addLink(api, ids);
244
+ }
245
+ }
246
+ };
247
+ if (typeof callbackF !== "function" || !this.project || !this.api) {
248
+ return;
249
+ }
250
+ setTimeout(() => {
251
+ const isLocalhost = window.location.href.includes("localhost");
252
+ let access_token = '';
253
+ if (isLocalhost) {
254
+ access_token = this.api?.getAccessToken();
255
+ if (!access_token) {
256
+ return;
257
+ }
258
+ }
259
+ const newClient = new WebClient.ExternalClient('BImplusNGXComponentClient');
260
+ newClient?.initialize();
261
+ // Make embedded windows pointing to the current feature branch with baseUrl setup
262
+ const options = {};
263
+ // In case of localhost ommit explicit setup of baseUrl
264
+ if (!isLocalhost) {
265
+ // Remove '/viewer/' from the end of pathname
266
+ let filteredPathname = window.location.pathname.replace(/\/viewer\/$/, '/');
267
+ // Remove '/connexis/' from the end of pathname if we use temporary url for connexis like https://portal-dev.bimplus.net/connexis/?embedded...
268
+ filteredPathname = filteredPathname.replace(/\/connexis\/$/, '/');
269
+ options.baseUrl = window.location.origin + filteredPathname;
270
+ }
271
+ ///const env:string="dev"; ///!!! to-do introduce env variable into components
272
+ const clientModule = WebClient.BimFilesSelect;
273
+ if (this.wormholeSelector) {
274
+ const documentSelection = new clientModule(this.wormholeSelector, access_token, newClient, this.env, options);
275
+ if (!documentSelection) {
276
+ return;
277
+ }
278
+ documentSelection.onAttachmentSelected = callbackF;
279
+ if (this.project) {
280
+ if (this.localWormHole) {
281
+ documentSelection.loadShadowRoot(this.shadowRootElement, this.project.teamSlug, this.project.id);
282
+ }
283
+ else {
284
+ documentSelection.load(this.project.teamSlug, this.project.id);
285
+ }
286
+ }
287
+ this.setModalVisibility(true);
288
+ }
289
+ }, 200);
290
+ }
291
+ _deleteAttachmentLink(api, id, $event) {
292
+ $event.stopPropagation();
293
+ $event.preventDefault();
294
+ const objects = api.objects;
295
+ const objectId = this._currentObjectId$.value;
296
+ from(api.objects.deleteAttachmentLink(this.rootObjectId, id)).pipe(switchMap(() => from(objects.getAttachmentLinks(objectId)))).subscribe({
297
+ next: (updatedAttachments) => {
298
+ if (this.api) {
299
+ this._attachments = this.decorateAttachmentLinks(this.api, updatedAttachments); // Update attachments in component
300
+ }
301
+ },
302
+ error: (err) => {
303
+ console.error('Failed to delete or reload attachments:', err);
304
+ }
305
+ });
306
+ }
307
+ deleteAttachmentLink(attachment, $event) {
308
+ if (!this.api) {
309
+ return;
310
+ }
311
+ if (!attachment) {
312
+ return;
313
+ }
314
+ const api = this.api;
315
+ this.dialogService.open(BimplusOverlayDialogConfirmComponent, {
316
+ options: {
317
+ position: 'middle',
318
+ positionOptions: {},
319
+ overlayClickEnabled: false,
320
+ overlayVisibilityEnabled: true,
321
+ draggable: true
322
+ }, data: {
323
+ title: this.translateService.instant('_Delete_attachmentlink'),
324
+ message: this.translateService.instant('_Attachmentlink_delete_confirmation_message'),
325
+ acceptButtonLocalizedString: "_Delete",
326
+ acceptCallback: () => {
327
+ this._deleteAttachmentLink(api, attachment.id, $event);
328
+ }
329
+ }
330
+ });
331
+ }
332
+ buttonClicked($event) {
333
+ if (!this.api) {
334
+ return;
335
+ }
336
+ const api = this.api;
337
+ if ($event.id == "add-documents") {
338
+ this.createAttachmentLink(api);
339
+ }
340
+ }
341
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: LinksToDocumentsComponent, deps: [{ token: i1.TranslateService }, { token: i2.DialogService }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
342
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: LinksToDocumentsComponent, isStandalone: true, selector: "lib-links-to-documents", inputs: { api: "api", canCreateAttachmentLink: "canCreateAttachmentLink", listOnly: ["listOnly", "listOnly", booleanAttribute], showEmptyMessage: ["showEmptyMessage", "showEmptyMessage", booleanAttribute], hideAttachmentSize: ["hideAttachmentSize", "hideAttachmentSize", booleanAttribute], attachments: "attachments", canDeleteAttachmentLink: "canDeleteAttachmentLink", project: "project", wormholeSelector: "wormholeSelector", env: "env", rootObjectId: "rootObjectId" }, outputs: { attachmentsChange: "attachmentsChange" }, usesInheritance: true, ngImport: i0, template: "@if (canCreateAttachmentLink && !listOnly) {\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n />\r\n}\r\n@if (wormholeSelector === 'localEmbeddedModalId'){\r\n <div class='embedded-modal-container'>\r\n <iframe id={{wormholeSelector}} [title]=\"\"></iframe>\r\n </div> \r\n}\r\n<lib-bimplus-scrollable-container>\r\n @for (attachment of _attachments; track attachment; let i = $index) {\r\n <div class=\"attachment-row\">\r\n @if (canDeleteAttachmentLink) {\r\n <span class=\"bim-attachment-delete-button\" (click)=\"deleteAttachmentLink(attachment,$event)\" (keydown)=\"deleteAttachmentLink(attachment,$event)\">\r\n <div\r\n title=\"{{ '_Delete_attachmentlink' | translate }}\"\r\n >\r\n &#10005;&#xFE0E;\r\n </div>\r\n </span>\r\n }\r\n <a class=\"bim-attachmentlink-item\" href={{attachment.link}} target='_blank' rel='noopener noreferrer'>\r\n <div class=\"bim-attachment-name\" title={{attachment.fileName}}>\r\n {{attachment.name ? attachment.name : attachment.fileName}}\r\n </div>\r\n @if (!hideAttachmentSize) {\r\n <div class=\"bim-attachment-size\" title={{attachment.name}}>\r\n ({{attachment.size}} kB)\r\n </div>\r\n }\r\n </a>\r\n </div>\r\n }\r\n @if (!_attachments.length && showEmptyMessage) {\r\n <div class=\"bim-attachment-not-found\">\r\n {{ '_No attachments found' | translate }}\r\n </div>\r\n }\r\n</lib-bimplus-scrollable-container>\r\n\r\n", styles: [".text-selected{color:var(--text-highlight-text-color-enabled)}.ui-icon22px{width:2.2rem;height:2.2rem;display:inline-block;float:right;border-radius:.4rem;background-position:center center;background-repeat:no-repeat;cursor:pointer}.ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat}.touch-ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat;width:3.2rem;height:3.2rem}.ui-icon-sidemenu-important{width:2.4rem!important;height:2.4rem!important;background-size:1.8rem 1.8rem!important;background-position:center center;background-repeat:no-repeat}lib-bimplus-buttons-row{flex:0;--button-row-margin-right: .8rem}.attachment-row{margin:var(--attachment-row-margin, 0 .8rem);border-bottom:var(--attachment-row-border-bottom, solid .1rem var(--details-controls-attachment-item-border-color))}.bim-attachment-delete-button{color:var(--bim-attachment-delete-button, var(--details-controls-attachment-delete-button-text-color));font-weight:var(--bim-attachment-delete-button-font-weight, normal);float:right;margin-left:auto;cursor:pointer;margin-top:.2rem}.bim-attachment-delete-button:hover{color:var(--ui-text-1-color)}.bim-attachment-delete-button div{width:3.2rem;text-align:center}a.bim-attachmentlink-item,a.bim-attachmentlink-item:hover,a.bim-attachmentlink-item:visited{color:var(--dark-gray-color)}.bim-attachment-item,.bim-attachmentlink-item{display:flex;cursor:pointer;line-height:2.5rem;padding-left:var(--bim-attachmentlink-item-left-padding, 3.6rem);background-size:var(--bim-attachment-item-background-size, auto);background-repeat:no-repeat;background-position:var(--bim-attachment-item-background-position, .8rem center);background-image:var(--bim-attachment-item-background-image, url(data:image/png;base64,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));text-decoration:none!important}.bim-attachment-item .bim-attachment-name,.bim-attachmentlink-item .bim-attachment-name{padding-left:var(--bim-attachment-name-padding, 0 0 0 1rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bim-attachment-item .bim-attachment-extension,.bim-attachmentlink-item .bim-attachment-extension{white-space:nowrap}.bim-attachment-item .bim-attachment-size,.bim-attachmentlink-item .bim-attachment-size{padding-left:.5rem;white-space:nowrap;margin-right:.4rem}.bim-attachment-not-found{padding:2.5rem .5rem;color:var(--details-controls-details-not-found-text-color);text-align:center}.embedded-modal-container{display:none;box-sizing:content-box;position:fixed;inset:0;background-color:var(--portal-modal-background-color-overlay);padding:6% 9%}.embedded-modal-container iframe{width:100%;height:100%;outline:0;border:0;-webkit-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);-moz-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color)}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: BimplusScrollableContainerComponent, selector: "lib-bimplus-scrollable-container" }, { kind: "component", type: BimplusButtonsRowComponent, selector: "lib-bimplus-buttons-row", inputs: ["items", "canUpdateObject"], outputs: ["fileChanged", "buttonClicked"] }], encapsulation: i0.ViewEncapsulation.ShadowDom }); }
343
+ }
344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: LinksToDocumentsComponent, decorators: [{
345
+ type: Component,
346
+ args: [{ selector: 'lib-links-to-documents', standalone: true, imports: [
347
+ TranslateModule,
348
+ BimplusScrollableContainerComponent,
349
+ BimplusButtonsRowComponent
350
+ ], encapsulation: ViewEncapsulation.ShadowDom, template: "@if (canCreateAttachmentLink && !listOnly) {\r\n <lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n />\r\n}\r\n@if (wormholeSelector === 'localEmbeddedModalId'){\r\n <div class='embedded-modal-container'>\r\n <iframe id={{wormholeSelector}} [title]=\"\"></iframe>\r\n </div> \r\n}\r\n<lib-bimplus-scrollable-container>\r\n @for (attachment of _attachments; track attachment; let i = $index) {\r\n <div class=\"attachment-row\">\r\n @if (canDeleteAttachmentLink) {\r\n <span class=\"bim-attachment-delete-button\" (click)=\"deleteAttachmentLink(attachment,$event)\" (keydown)=\"deleteAttachmentLink(attachment,$event)\">\r\n <div\r\n title=\"{{ '_Delete_attachmentlink' | translate }}\"\r\n >\r\n &#10005;&#xFE0E;\r\n </div>\r\n </span>\r\n }\r\n <a class=\"bim-attachmentlink-item\" href={{attachment.link}} target='_blank' rel='noopener noreferrer'>\r\n <div class=\"bim-attachment-name\" title={{attachment.fileName}}>\r\n {{attachment.name ? attachment.name : attachment.fileName}}\r\n </div>\r\n @if (!hideAttachmentSize) {\r\n <div class=\"bim-attachment-size\" title={{attachment.name}}>\r\n ({{attachment.size}} kB)\r\n </div>\r\n }\r\n </a>\r\n </div>\r\n }\r\n @if (!_attachments.length && showEmptyMessage) {\r\n <div class=\"bim-attachment-not-found\">\r\n {{ '_No attachments found' | translate }}\r\n </div>\r\n }\r\n</lib-bimplus-scrollable-container>\r\n\r\n", styles: [".text-selected{color:var(--text-highlight-text-color-enabled)}.ui-icon22px{width:2.2rem;height:2.2rem;display:inline-block;float:right;border-radius:.4rem;background-position:center center;background-repeat:no-repeat;cursor:pointer}.ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat}.touch-ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat;width:3.2rem;height:3.2rem}.ui-icon-sidemenu-important{width:2.4rem!important;height:2.4rem!important;background-size:1.8rem 1.8rem!important;background-position:center center;background-repeat:no-repeat}lib-bimplus-buttons-row{flex:0;--button-row-margin-right: .8rem}.attachment-row{margin:var(--attachment-row-margin, 0 .8rem);border-bottom:var(--attachment-row-border-bottom, solid .1rem var(--details-controls-attachment-item-border-color))}.bim-attachment-delete-button{color:var(--bim-attachment-delete-button, var(--details-controls-attachment-delete-button-text-color));font-weight:var(--bim-attachment-delete-button-font-weight, normal);float:right;margin-left:auto;cursor:pointer;margin-top:.2rem}.bim-attachment-delete-button:hover{color:var(--ui-text-1-color)}.bim-attachment-delete-button div{width:3.2rem;text-align:center}a.bim-attachmentlink-item,a.bim-attachmentlink-item:hover,a.bim-attachmentlink-item:visited{color:var(--dark-gray-color)}.bim-attachment-item,.bim-attachmentlink-item{display:flex;cursor:pointer;line-height:2.5rem;padding-left:var(--bim-attachmentlink-item-left-padding, 3.6rem);background-size:var(--bim-attachment-item-background-size, auto);background-repeat:no-repeat;background-position:var(--bim-attachment-item-background-position, .8rem center);background-image:var(--bim-attachment-item-background-image, url(data:image/png;base64,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));text-decoration:none!important}.bim-attachment-item .bim-attachment-name,.bim-attachmentlink-item .bim-attachment-name{padding-left:var(--bim-attachment-name-padding, 0 0 0 1rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bim-attachment-item .bim-attachment-extension,.bim-attachmentlink-item .bim-attachment-extension{white-space:nowrap}.bim-attachment-item .bim-attachment-size,.bim-attachmentlink-item .bim-attachment-size{padding-left:.5rem;white-space:nowrap;margin-right:.4rem}.bim-attachment-not-found{padding:2.5rem .5rem;color:var(--details-controls-details-not-found-text-color);text-align:center}.embedded-modal-container{display:none;box-sizing:content-box;position:fixed;inset:0;background-color:var(--portal-modal-background-color-overlay);padding:6% 9%}.embedded-modal-container iframe{width:100%;height:100%;outline:0;border:0;-webkit-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);-moz-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color)}\n"] }]
351
+ }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.DialogService }, { type: i0.Renderer2 }, { type: i0.ElementRef }], propDecorators: { api: [{
352
+ type: Input,
353
+ args: [{ required: true }]
354
+ }], canCreateAttachmentLink: [{
355
+ type: Input
356
+ }], listOnly: [{
357
+ type: Input,
358
+ args: [{ transform: booleanAttribute }]
359
+ }], showEmptyMessage: [{
360
+ type: Input,
361
+ args: [{ transform: booleanAttribute }]
362
+ }], hideAttachmentSize: [{
363
+ type: Input,
364
+ args: [{ transform: booleanAttribute }]
365
+ }], attachments: [{
366
+ type: Input
367
+ }], attachmentsChange: [{
368
+ type: Output
369
+ }], canDeleteAttachmentLink: [{
370
+ type: Input
371
+ }], project: [{
372
+ type: Input
373
+ }], wormholeSelector: [{
374
+ type: Input
375
+ }], env: [{
376
+ type: Input
377
+ }], rootObjectId: [{
378
+ type: Input
379
+ }] } });
380
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua3MtdG8tZG9jdW1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1iaW1wbHVzLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2xpbmtzLXRvLWRvY3VtZW50cy9saW5rcy10by1kb2N1bWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvbGlua3MtdG8tZG9jdW1lbnRzL2xpbmtzLXRvLWRvY3VtZW50cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUcsU0FBUyxFQUFJLGlCQUFpQixFQUFJLEtBQUssRUFBOEMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsZUFBZSxFQUFvQixNQUFNLHFCQUFxQixDQUFDO0FBRXhFLE9BQU8sRUFBRyxJQUFJLEVBQUksZUFBZSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLHdFQUF3RSxDQUFBO0FBRzVILE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBRWxHLE9BQU8sRUFDTCxvQ0FBb0MsRUFDckMsTUFBTSw0RUFBNEUsQ0FBQztBQUVwRixPQUFPLEtBQUssU0FBUyxNQUFNLG1CQUFtQixDQUFDOzs7O0FBRS9DLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLE1BQU0sQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FB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TSxDQUFDLEVBQUUsSUFBSSxlQUFlLEVBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7K0dBNVdVLHlCQUF5QjttR0FBekIseUJBQXlCLHVLQXFCaEIsZ0JBQWdCLDhEQUVoQixnQkFBZ0Isb0VBRWhCLGdCQUFnQiw2UkN0RXRDLDJrREEwQ0EsMHRPRExLLGVBQWUsNEZBQ2YsbUNBQW1DLDZFQUNuQywwQkFBMEI7OzRGQU1sQix5QkFBeUI7a0JBWnJDLFNBQVM7K0JBQ0Usd0JBQXdCLGNBQ3RCLElBQUksV0FDUDt3QkFDTixlQUFlO3dCQUNmLG1DQUFtQzt3QkFDbkMsMEJBQTBCO3FCQUM1QixpQkFHYyxpQkFBaUIsQ0FBQyxTQUFTO2tLQW9CZixHQUFHO3NCQUE3QixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDaEIsdUJBQXVCO3NCQUEvQixLQUFLO2dCQUVrQyxRQUFRO3NCQUEvQyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUVFLGdCQUFnQjtzQkFBdkQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFRSxrQkFBa0I7c0JBQXpELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBS2xDLFdBQVc7c0JBRGQsS0FBSztnQkFpQkksaUJBQWlCO3NCQUExQixNQUFNO2dCQUNFLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFHRixZQUFZO3NCQURmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyAgQ29tcG9uZW50ICAsIFZpZXdFbmNhcHN1bGF0aW9uICAsIElucHV0ICAsIE9uSW5pdCwgUmVuZGVyZXIyLCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIGJvb2xlYW5BdHRyaWJ1dGUsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJpbXBsdXNMb2NhbGl6ZWRXaWRnZXRDb21wb25lbnQgfSBmcm9tICcuLi9iaW1wbHVzLWxvY2FsaXplZC13aWRnZXQvYmltcGx1cy1sb2NhbGl6ZWQtd2lkZ2V0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBXZWJTZGsgZnJvbSAnYmltcGx1cy13ZWJzZGsnO1xyXG5pbXBvcnQgeyAgZnJvbSAgLCBCZWhhdmlvclN1YmplY3QsIHN3aXRjaE1hcCwgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY29uY2F0TWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBCaW1wbHVzU2Nyb2xsYWJsZUNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4uL2JpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXIvYmltcGx1cy1zY3JvbGxhYmxlLWNvbnRhaW5lci5jb21wb25lbnQnXHJcbi8vL2ltcG9ydCB7IEF0dGFjaG1lbnRMaW5rSXRlbX0gZnJvbSBcIi4vbGlua3MtdG8tZG9jdW1lbnRzLmNvbXBvbmVudC5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgUHJvamVjdE5hdmlnYXRvclByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LW1vZGVscy9wcm9qZWN0LW1vZGVscy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBCaW1wbHVzQnV0dG9uc1Jvd0NvbXBvbmVudCB9IGZyb20gXCIuLi9iaW1wbHVzLWJ1dHRvbnMtcm93L2JpbXBsdXMtYnV0dG9ucy1yb3cuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEJpbXBsdXNCdXR0b25DbGlja0V2ZW50LCBCaW1wbHVzQnV0dG9uUm93SXRlbSB9IGZyb20gJy4uL2JpbXBsdXMtYnV0dG9ucy1yb3cvYmltcGx1cy1idXR0b25zLXJvdy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1xyXG4gIEJpbXBsdXNPdmVybGF5RGlhbG9nQ29uZmlybUNvbXBvbmVudFxyXG59IGZyb20gXCIuLi9iaW1wbHVzLW92ZXJsYXktZGlhbG9nLWNvbmZpcm0vYmltcGx1cy1vdmVybGF5LWRpYWxvZy1jb25maXJtLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0RpYWxvZ1NlcnZpY2V9IGZyb20gXCIuLi9iaW1wbHVzLWdlbmVyYWwtb3ZlcmxheS1kaWFsb2cvYmltcGx1cy1nZW5lcmFsLW92ZXJsYXktZGlhbG9nLnNlcnZpY2VcIjtcclxuaW1wb3J0ICogYXMgV2ViQ2xpZW50IGZyb20gJ2JpbXBsdXMtd2ViY2xpZW50JztcclxuXHJcbmV4cG9ydCBjb25zdCBFTUJFRERFRF9NT0RBTF9ESUFMT0dFX1RZUEVfRklMRSA9ICdmaWxlJztcclxuXHJcbmV4cG9ydCBjb25zdCBwb3N0QXR0YWNobWVudExpbmtzID0gKG5ld0F0dGFjaG1lbnRJRHM6IHN0cmluZ1tdLCBvYmplY3RJZDogc3RyaW5nLCBhcGk6IFdlYlNkay5BcGkpID0+IHtcclxuICAvLyBDcmVhdGUgYW4gYXJyYXkgb2Ygb2JzZXJ2YWJsZXMgZm9yIGVhY2ggcG9zdCByZXF1ZXN0XHJcbiAgY29uc3QgcG9zdFJlcXVlc3RzID0gbmV3QXR0YWNobWVudElEcy5tYXAoKGlkKSA9PiAgICAgICAgICAgIFxyXG4gICAgZnJvbShhcGkub2JqZWN0cy5wb3N0QXR0YWNobWVudExpbmsob2JqZWN0SWQsIEpTT04uc3RyaW5naWZ5KHsgYXR0YWNobWVudElkOiBpZH0pKSkgICAgICBcclxuICApO1xyXG5cclxuICAvLyBVc2UgZm9ya0pvaW4gdG8gd2FpdCBmb3IgYWxsIHBvc3QgcmVxdWVzdHMgdG8gY29tcGxldGUgaW4gcGFyYWxsZWxcclxuICByZXR1cm4gZm9ya0pvaW4ocG9zdFJlcXVlc3RzKVxyXG4gIC5waXBlKFxyXG4gICAgLy8gQWZ0ZXIgYWxsIHBvc3RzIGFyZSBjb21wbGV0ZSwgc3dpdGNoIHRvIHRoZSBuZXh0IGNhbGwgdG8gZ2V0IHVwZGF0ZWQgbGlua3NcclxuICAgIGNvbmNhdE1hcCgoKSA9PiBmcm9tKGFwaS5vYmplY3RzLmdldEF0dGFjaG1lbnRMaW5rcyhvYmplY3RJZCkpKVxyXG4gIClcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbGlua3MtdG8tZG9jdW1lbnRzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgICAgQmltcGx1c1Njcm9sbGFibGVDb250YWluZXJDb21wb25lbnQsXHJcbiAgICAgQmltcGx1c0J1dHRvbnNSb3dDb21wb25lbnRcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9saW5rcy10by1kb2N1bWVudHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2xpbmtzLXRvLWRvY3VtZW50cy5jb21wb25lbnQubGVzcyddLCAgXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMaW5rc1RvRG9jdW1lbnRzQ29tcG9uZW50IGV4dGVuZHMgQmltcGx1c0xvY2FsaXplZFdpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgY29uc3RydWN0b3IodHJhbnNsYXRlU2VydmljZTogIFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVsOiBFbGVtZW50UmVmXHJcbiAgKSB7XHJcbiAgICBzdXBlcih0cmFuc2xhdGVTZXJ2aWNlKVxyXG4gICAgdGhpcy5zaGFkb3dSb290RWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5zaGFkb3dSb290O1xyXG5cclxuICB9XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaGFkb3dSb290RWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBfcm9vdE9iamVjdElkIDogc3RyaW5nID0gXCJcIjtcclxuICBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xyXG4gIGxvY2FsV29ybUhvbGU6Ym9vbGVhbiAgPSB0cnVlO1xyXG4gICAgLy9XaGVuIGlzIHRydWUgdGhlbiBpdCBtZWFucyB0aGUgY3JlYXRpb24gb2YgbGluayBpcyBpbiBwcm9ncmVzc1xyXG4gIGluUHJvZ3Jlc3M6Ym9vbGVhbj0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGFwaSE6IFdlYlNkay5BcGkgfCBudWxsO1xyXG4gIEBJbnB1dCgpIGNhbkNyZWF0ZUF0dGFjaG1lbnRMaW5rOiBib29sZWFuID0gdHJ1ZTtcclxuICAvKiogSW5wdXQgQXR0cmlidXRlIHRvIHNwZWNpZnkgaWYgc2hvdWxkIHNob3cgb25seSBsaXN0IG9mIGF0dGFjaG1lbnRzLiAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBsaXN0T25seSA9IGZhbHNlO1xyXG4gIC8qKiBJbnB1dCBBdHRyaWJ1dGUgdG8gc3BlY2lmeSBpZiBzaG91bGQgc2hvdyBtZXNzYWdlIHdoZW4gbm8gYXR0YWNobWVudHMgZm91bmQuICovXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dFbXB0eU1lc3NhZ2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8qKiBJbnB1dCBBdHRyaWJ1dGUgdG8gdGVsbCBpZiBzaG93L2hpZGUgYXR0YWNoZW10IHNpemUgaW5mb3JtYXRpb24uICovXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGhpZGVBdHRhY2htZW50U2l6ZSA9IGZhbHNlO1xyXG5cclxuICBfYXR0YWNobWVudHM6IFdlYlNkay5BdHRhY2htZW50TGlua1tdID0gW107XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGF0dGFjaG1lbnRzKHZhbHVlOiBXZWJTZGsuQXR0YWNobWVudExpbmtbXSkge1xyXG4gICAgdGhpcy5fYXR0YWNobWVudHMgPSB2YWx1ZTtcclxuICAgIHRoaXMub25BdHRhY2htZW50c0NoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dGFjaG1lbnRzKCk6IFdlYlNkay5BdHRhY2htZW50TGlua1tdIHtcclxuICAgIHJldHVybiB0aGlzLl9hdHRhY2htZW50cztcclxuICB9XHJcblxyXG4gIG9uQXR0YWNobWVudHNDaGFuZ2UoKSB7XHJcbiAgICBpZih0aGlzLmFwaSl7XHJcbiAgICAgIHRoaXMuX2F0dGFjaG1lbnRzID0gdGhpcy5kZWNvcmF0ZUF0dGFjaG1lbnRMaW5rcyh0aGlzLmFwaSx0aGlzLl9hdHRhY2htZW50cyk7ICAgIFxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIEBPdXRwdXQoKSBhdHRhY2htZW50c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XHJcbiAgQElucHV0KCkgY2FuRGVsZXRlQXR0YWNobWVudExpbms6Ym9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgcHJvamVjdCA6IFByb2plY3ROYXZpZ2F0b3JQcm9qZWN0IHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgd29ybWhvbGVTZWxlY3RvciA6IHN0cmluZyB8IHVuZGVmaW5lZD0gXCJsb2NhbEVtYmVkZGVkTW9kYWxJZFwiOyAgLy8gY2FsbGluZyBhcHBsaWNhdGlvbiBjYW4gcHJvdmlkZSBhIHBsYWNlIHdoZXJlIHRoZSBpZnJhbWUgZm9yIGRvY3VtZW50cyBzZWxlY3Rpb24gd2lsbCBiZSByZW5kZXJlZFxyXG4gIEBJbnB1dCgpIGVudiA6IHN0cmluZyA9ICdkZXYnO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCByb290T2JqZWN0SWQoaWQgOiBzdHJpbmcpe1xyXG4gICAgdGhpcy5fY3VycmVudE9iamVjdElkJC5uZXh0KGlkKTtcclxuICAgIHRoaXMuX3Jvb3RPYmplY3RJZCA9IGlkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJvb3RPYmplY3RJZCgpIDogc3RyaW5ne1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jvb3RPYmplY3RJZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1cnJlbnRPYmplY3RJZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gKFwiXCIpO1xyXG4gIF9hdHRhY2htZW50Q291bnQgOiBudW1iZXIgPSAwO1xyXG4gIGJ1dHRvblJvd0l0ZW1zOiBBcnJheTxCaW1wbHVzQnV0dG9uUm93SXRlbT4gPSBbXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcImFkZC1kb2N1bWVudHNcIlxyXG4gICAgICAsIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0FkZF9kb2N1bWVudCcpXHJcbiAgICAgICwgdG9vbHRpcDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ19BZGRfZG9jdW1lbnQnKVxyXG4gICAgICAsIGRpc2FibGVkOiAhdGhpcy5jYW5DcmVhdGVBdHRhY2htZW50TGlua1xyXG4gICAgICAsIGJ1dHRvblN0eWxlOiAncHJpbWFyeSdcclxuICAgIH1cclxuICBdO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICghdGhpcy5saXN0T25seSkge1xyXG4gICAgICB0aGlzLl9jdXJyZW50T2JqZWN0SWQkLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKGlkKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9jcmVhdGVBdHRhY2htZW50TGlua1N0cnVjdHVyZShpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZm10KHN0cmluZzogc3RyaW5nLCAuLi5mb3JtYXRzOiB1bmtub3duW10pOiBzdHJpbmcge1xyXG4gICAgbGV0IGluZGV4ID0gMDtcclxuXHJcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyVAKFxcZCspPy9nLCAobWF0Y2g6IHN0cmluZywgYXJndW1lbnRJbmRleDogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IGFyZ3VtZW50SW5kZXhOID0gYXJndW1lbnRJbmRleCA/IHBhcnNlSW50KGFyZ3VtZW50SW5kZXgsIDEwKSAtIDEgOiBpbmRleCsrO1xyXG4gICAgICBjb25zdCBfbWF0Y2ggPSBmb3JtYXRzW2FyZ3VtZW50SW5kZXhOXTtcclxuXHJcbiAgICAgIGlmIChfbWF0Y2ggPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gJyhudWxsKSc7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKF9tYXRjaCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfbWF0Y2gudG9TdHJpbmcoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICogZGVjb3JhdGUgbGlua1xyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuICBfZGVjb3JhdGVMaW5rKGFwaTpXZWJTZGsuQXBpLGxpbms6V2ViU2RrLkF0dGFjaG1lbnRMaW5rKTpXZWJTZGsuQXR0YWNobWVudExpbmt7XHJcblxyXG4gICAgY29uc3QgcmV0dmFsOldlYlNkay5BdHRhY2htZW50TGluayA9IHtcclxuICAgICAgaWQ6IGxpbmsuaWQsXHJcbiAgICAgIG5hbWU6IGxpbmsubmFtZSxcclxuICAgICAgZmlsZU5hbWU6IGxpbmsuZmlsZU5hbWUsXHJcbiAgICAgIHNpemU6IGxpbmsuc2l6ZSxcclxuICAgICAgbGluazogbGluay5saW5rLFxyXG4gICAgICBmaWxlTmFtZVNob3J0OiAnJyxcclxuICAgICAgZXh0ZW5zaW9uOiAnJyxcclxuICAgICAgb2JqZWN0SWRzOiBbXSxcclxuICAgICAgdmVyc2lvbjogbGluay52ZXJzaW9uLFxyXG4gICAgICBzaXplTUI6IFwiXCJcclxuICAgIH07XHJcbiAgICBjb25zdCBhY2Nlc3NfdG9rZW4gPSBhcGkuZ2V0QWNjZXNzVG9rZW4oKTtcclxuICAgIGNvbnN0IGF0dFZlcnNpb24gPSBcImF0dGFjaG1lbnRzLyVAL3ZlcnNpb25zLyVAL2Rvd25sb2FkXCI7XHJcbiAgICBjb25zdCB1cmwgPSBhcGkuZ2V0QXBpVGVhbVVybCgpK2F0dFZlcnNpb247XHJcbiAgICBjb25zdCBpc0VtYmVkZGVkQWxscGxhbk1vZGUgPSBmYWxzZTtcclxuICAgIHJldHZhbC5zaXplID0gcGFyc2VGbG9hdCgobGluay5zaXplIC8gMTAwMCkudG9GaXhlZCgyKSk7XHJcbiAgICByZXR2YWwubGluayA9IGAke3RoaXMuZm10KHVybCwgbGluay5pZCwgbGluay52ZXJzaW9uKX0/YXBpLXRva2VuPSR7YWNjZXNzX3Rva2VufSR7IGlzRW1iZWRkZWRBbGxwbGFuTW9kZSA/ICcnIDogJyZvcGVuSW5Ccm93c2VyPXRydWUnfWA7XHJcbiAgICBpZiAobGluay5maWxlTmFtZS5sZW5ndGggPiAyMCkge1xyXG4gICAgICBjb25zdCBmaWxlUGFydHMgPSBsaW5rLmZpbGVOYW1lLnNwbGl0KCcuJyk7XHJcbiAgICAgIGlmIChmaWxlUGFydHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHJldHZhbC5maWxlTmFtZVNob3J0ID0gZmlsZVBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKCcuJyk7XHJcbiAgICAgICAgcmV0dmFsLmV4dGVuc2lvbiA9IFwiLlwiICsgZmlsZVBhcnRzLnNsaWNlKC0xKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR2YWwuZmlsZU5hbWVTaG9ydCA9IGxpbmsuZmlsZU5hbWU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHZhbC5maWxlTmFtZVNob3J0ID0gbGluay5maWxlTmFtZTtcclxuICAgIH1cclxuICAgIHJldHZhbC5vYmplY3RJZHMgPSBbdGhpcy5fY3VycmVudE9iamVjdElkJC52YWx1ZV07XHJcblxyXG4gICAgcmV0dXJuIHJldHZhbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVjb3JhdGVBdHRhY2htZW50TGlua3MoYXBpOldlYlNkay5BcGksIGxpbmtzOldlYlNkay5BdHRhY2htZW50TGlua3NSZXNwb25zZSk6V2ViU2RrLkF0dGFjaG1lbnRMaW5rW117XHJcbiAgICBjb25zdCBkZWNvcmF0ZWRMaW5rcyA9IGxpbmtzLm1hcCgobGluaykgPT4gdGhpcy5fZGVjb3JhdGVMaW5rKGFwaSxsaW5rKSk7XHJcbiAgICBkZWNvcmF0ZWRMaW5rcy5zb3J0KChhLGIpID0+IHtcclxuICAgICAgaWYoYS5maWxlTmFtZS50b0xvd2VyQ2FzZSgpIDwgYi5maWxlTmFtZS50b0xvd2VyQ2FzZSgpICkgcmV0dXJuIC0xO1xyXG4gICAgICBpZihhLmZpbGVOYW1lLnRvTG93ZXJDYXNlKCkgID4gYi5maWxlTmFtZS50b0xvd2VyQ2FzZSgpICkgcmV0dXJuIDE7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGVjb3JhdGVkTGlua3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVBdHRhY2htZW50TGlua1N0cnVjdHVyZShvYmplY3RJZCA6IHN0cmluZyl7XHJcblxyXG4gICAgdGhpcy5fbG9hZEF0dGFjaG1lbnRMaW5rU3RydWN0dXJlKG9iamVjdElkKT8uc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dCA6KHN0cnVjdHVyZURhdGEpID0+IHtcclxuICAgICAgICBpZihzdHJ1Y3R1cmVEYXRhKXtcclxuICAgICAgICAgIC8vdGhpcy5fYXR0YWNobWVudExpbmtTdHJ1Y3R1cmUgPSBfYXR0YWNobWVudExpbmsgU3RydWN0dXJlQnVpbGRlci5jcmVhdGVGcm9tUmVzcG9uc2Uoc3RydWN0dXJlRGF0YSk7XHJcbiAgICAgICAgICB0aGlzLl9hdHRhY2htZW50Q291bnQgPSBzdHJ1Y3R1cmVEYXRhPy5sZW5ndGg7XHJcbiAgICAgICAgICBpZih0aGlzLmFwaSl7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHZhbCA9IHRoaXMuZGVjb3JhdGVBdHRhY2htZW50TGlua3ModGhpcy5hcGksc3RydWN0dXJlRGF0YSk7XHJcbiAgICAgICAgICAgIGlmKHJldHZhbCl7XHJcbiAgICAgICAgICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSByZXR2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkQXR0YWNobWVudExpbmtTdHJ1Y3R1cmUob2JqZWN0SWQgOiBzdHJpbmcpe1xyXG4gICAgaWYoIXRoaXMuYXBpKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCFvYmplY3RJZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnJvbSh0aGlzLmFwaS5vYmplY3RzLmdldEF0dGFjaG1lbnRMaW5rcyhvYmplY3RJZCkpO1xyXG4gIH1cclxuXHJcbiAgZG9jdW1lbnRTZWxlY3Rpb24gOnN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XHJcbiAgaXNPcGVuZWQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gIGVtYmVkZGVkTW9kYWxDb250YWluZXI6c3RyaW5nID0gJ2VtYmVkZGVkLW1vZGFsJztcclxuXHJcbiAgLy8gc2hvdyBvciBoaWRlIGVtYmVkZGVkIG1vZGFsXHJcbiAgc2V0TW9kYWxWaXNpYmlsaXR5KG9wZW5lZCA9IHRydWUpIHtcclxuICAgIGlmKCF0aGlzLndvcm1ob2xlU2VsZWN0b3Ipe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBlbGVtZW50ID0gIHRoaXMubG9jYWxXb3JtSG9sZSA/IHRoaXMuc2hhZG93Um9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNcIiArIHRoaXMud29ybWhvbGVTZWxlY3Rvcik6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLndvcm1ob2xlU2VsZWN0b3IpO1xyXG4gICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmKHRoaXMubG9jYWxXb3JtSG9sZSl7XHJcbiAgICAgIGlmKGVsZW1lbnQucGFyZW50RWxlbWVudCl7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LnBhcmVudEVsZW1lbnQsJ2Rpc3BsYXknLG9wZW5lZD8nYmxvY2snOidub25lJylcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LnBhcmVudEVsZW1lbnQsJ2Rpc3BsYXknLG9wZW5lZD8nYmxvY2snOidub25lJylcclxuICAgIH1cclxuXHJcbiAgICAvLy9jb250YWluZXJFbC5mYWRlSW4oXCJmYXN0XCIpIDogY29udGFpbmVyRWwuZmFkZU91dChcImZhc3RcIik7XHJcbiAgICB0aGlzLmlzT3BlbmVkID0gb3BlbmVkO1xyXG4gIH1cclxuXHJcblxyXG4gIGNsb3NlRW1iZWRkZWRNb2RhbEZpbGVTZWxlY3Rpb24oKSB7XHJcbiAgICB0aGlzLnNldE1vZGFsVmlzaWJpbGl0eShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBfYWRkTGluayhhcGk6V2ViU2RrLkFwaSwgaWRzOnN0cmluZ1tdKSB7XHJcbiAgICAvLyBmaWx0ZXIgb3V0IGFscmVhZHkgZXhpc3RpbmcgYXR0YWNobWVudCBsaW5rcyBcclxuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRJRHMgPSBpZHMuZmlsdGVyKCBpdGVtID0+ICF0aGlzLmF0dGFjaG1lbnRzLmZpbmQobiA9PiBuLmlkID09PSBpdGVtKSApO1xyXG4gICAgaWYoICFuZXdBdHRhY2htZW50SURzLmxlbmd0aCApe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmluUHJvZ3Jlc3Mpe1xyXG4gICAgICBjb25zb2xlLmxvZygnaW4gcHJvZ3Jlc3MnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5Qcm9ncmVzcyA9IHRydWU7XHJcbiAgICBuZXdBdHRhY2htZW50SURzLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCduZXcgYXR0YWNobWVudCBpZDonLGlkKTtcclxuICAgIH0pO1xyXG4gICAgcG9zdEF0dGFjaG1lbnRMaW5rcyhuZXdBdHRhY2htZW50SURzLCB0aGlzLnJvb3RPYmplY3RJZCwgYXBpKVxyXG4gICAgLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6ICh1cGRhdGVkQXR0YWNobWVudHMpID0+IHtcclxuICAgICAgICB0aGlzLl9hdHRhY2htZW50cyA9IHRoaXMuZGVjb3JhdGVBdHRhY2htZW50TGlua3MoXHJcbiAgICAgICAgICBhcGksXHJcbiAgICAgICAgICB1cGRhdGVkQXR0YWNobWVudHNcclxuICAgICAgICApOyAvLyBVcGRhdGUgYXR0YWNobWVudHMgaW4gY29tcG9uZW50ICAgXHJcbiAgICAgICAgdGhpcy5pblByb2dyZXNzID0gZmFsc2U7ICBcclxuICAgICAgICB0aGlzLmF0dGFjaG1lbnRzQ2hhbmdlLmVtaXQobmV3QXR0YWNobWVudElEcykgICBcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYWRkIG9yIHJlbG9hZCBhdHRhY2htZW50czonLCBlcnIpO1xyXG4gICAgICAgIHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBjcmVhdGVBdHRhY2htZW50TGluayhhcGk6IFdlYlNkay5BcGkpe1xyXG4gICAgY29uc29sZS5sb2coJ2NyZWF0ZUF0dGFjaG1lbnRMaW5rJylcclxuICAgIHRoaXMubG9jYWxXb3JtSG9sZSA9IHRoaXMud29ybWhvbGVTZWxlY3RvciA9PT0gXCJsb2NhbEVtYmVkZGVkTW9kYWxJZFwiO1xyXG4gICAgY29uc3QgY2FsbGJhY2tGID0gKGRvY0lEczpzdHJpbmdbXSk6dm9pZCA9PiB7XHJcbiAgICAgIGNvbnN0IGlkcyA9ICh0eXBlb2YgZG9jSURzID09PSAnc3RyaW5nJykgPyBbZG9jSURzXSA6IGRvY0lEcztcclxuICAgICAgY29uc3QgZm91bmREb2N1bWVudHMgPSBpZHMgJiYgaWRzLmxlbmd0aCA+IDA7XHJcbiAgICAgIGlmKCF0aGlzLmlzRGVzdHJveWVkKXtcclxuICAgICAgICB0aGlzLmNsb3NlRW1iZWRkZWRNb2RhbEZpbGVTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoZm91bmREb2N1bWVudHMpIHtcclxuICAgICAgICAgIHRoaXMuX2FkZExpbmsoYXBpLGlkcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFja0YgIT09IFwiZnVuY3Rpb25cIiAgfHwgIXRoaXMucHJvamVjdCB8fCAhdGhpcy5hcGkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBpc0xvY2FsaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKFwibG9jYWxob3N0XCIpO1xyXG4gICAgICBsZXQgYWNjZXNzX3Rva2VuIDpzdHJpbmd8bnVsbCB8dW5kZWZpbmVkPSAnJztcclxuICAgICAgaWYgKGlzTG9jYWxob3N0KSB7XHJcbiAgICAgICAgYWNjZXNzX3Rva2VuID0gdGhpcy5hcGk/LmdldEFjY2Vzc1Rva2VuKCk7XHJcbiAgICAgICAgaWYgKCFhY2Nlc3NfdG9rZW4pIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5ld0NsaWVudCA9ICBuZXcgV2ViQ2xpZW50LkV4dGVybmFsQ2xpZW50KCdCSW1wbHVzTkdYQ29tcG9uZW50Q2xpZW50Jyk7XHJcbiAgICAgIG5ld0NsaWVudD8uaW5pdGlhbGl6ZSgpO1xyXG4gICAgICAvLyBNYWtlIGVtYmVkZGVkIHdpbmRvd3MgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgZmVhdHVyZSBicmFuY2ggd2l0aCBiYXNlVXJsIHNldHVwXHJcbiAgICAgIGNvbnN0IG9wdGlvbnM6e2Jhc2VVcmw/OnN0cmluZ30gPSB7fTtcclxuICAgICAgLy8gSW4gY2FzZSBvZiBsb2NhbGhvc3Qgb21taXQgZXhwbGljaXQgc2V0dXAgb2YgYmFzZVVybFxyXG4gICAgICBpZiAoIWlzTG9jYWxob3N0KSB7XHJcbiAgICAgICAgLy8gUmVtb3ZlICcvdmlld2VyLycgZnJvbSB0aGUgZW5kIG9mIHBhdGhuYW1lXHJcbiAgICAgICAgbGV0IGZpbHRlcmVkUGF0aG5hbWUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvXFwvdmlld2VyXFwvJC8sICcvJyk7XHJcbiAgICAgICAgLy8gUmVtb3ZlICcvY29ubmV4aXMvJyBmcm9tIHRoZSBlbmQgb2YgcGF0aG5hbWUgaWYgd2UgdXNlIHRlbXBvcmFyeSB1cmwgZm9yIGNvbm5leGlzIGxpa2UgIGh0dHBzOi8vcG9ydGFsLWRldi5iaW1wbHVzLm5ldC9jb25uZXhpcy8/ZW1iZWRkZWQuLi5cclxuICAgICAgICBmaWx0ZXJlZFBhdGhuYW1lID0gZmlsdGVyZWRQYXRobmFtZS5yZXBsYWNlKC9cXC9jb25uZXhpc1xcLyQvLCAnLycpO1xyXG4gICAgICAgIG9wdGlvbnMuYmFzZVVybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBmaWx0ZXJlZFBhdGhuYW1lO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLy9jb25zdCBlbnY6c3RyaW5nPVwiZGV2XCI7ICAvLy8hISEgdG8tZG8gaW50cm9kdWNlIGVudiB2YXJpYWJsZSBpbnRvIGNvbXBvbmVudHNcclxuICAgICAgY29uc3QgY2xpZW50TW9kdWxlID0gV2ViQ2xpZW50LkJpbUZpbGVzU2VsZWN0O1xyXG4gICAgICBpZih0aGlzLndvcm1ob2xlU2VsZWN0b3Ipe1xyXG4gICAgICAgIGNvbnN0IGRvY3VtZW50U2VsZWN0aW9uID0gbmV3IGNsaWVudE1vZHVsZSh0aGlzLndvcm1ob2xlU2VsZWN0b3IsIGFjY2Vzc190b2tlbiwgbmV3Q2xpZW50LCB0aGlzLmVudiwgb3B0aW9ucyk7XHJcbiAgICAgICAgaWYgKCFkb2N1bWVudFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkb2N1bWVudFNlbGVjdGlvbi5vbkF0dGFjaG1lbnRTZWxlY3RlZCA9IGNhbGxiYWNrRjtcclxuXHJcbiAgICAgICAgaWYodGhpcy5wcm9qZWN0KXtcclxuICAgICAgICAgIGlmKHRoaXMubG9jYWxXb3JtSG9sZSl7XHJcbiAgICAgICAgICAgIGRvY3VtZW50U2VsZWN0aW9uLmxvYWRTaGFkb3dSb290KHRoaXMuc2hhZG93Um9vdEVsZW1lbnQsdGhpcy5wcm9qZWN0LnRlYW1TbHVnICwgdGhpcy5wcm9qZWN0LmlkKTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBkb2N1bWVudFNlbGVjdGlvbi5sb2FkKHRoaXMucHJvamVjdC50ZWFtU2x1ZyAsIHRoaXMucHJvamVjdC5pZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0TW9kYWxWaXNpYmlsaXR5KHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9LDIwMCk7XHJcblxyXG4gIH1cclxuXHJcbiAgX2RlbGV0ZUF0dGFjaG1lbnRMaW5rKGFwaTpXZWJTZGsuQXBpICxpZDpzdHJpbmcsJGV2ZW50OkV2ZW50KXtcclxuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgY29uc3Qgb2JqZWN0cyA9IGFwaS5vYmplY3RzO1xyXG4gICAgY29uc3Qgb2JqZWN0SWQgPSB0aGlzLl9jdXJyZW50T2JqZWN0SWQkLnZhbHVlO1xyXG4gICAgZnJvbShhcGkub2JqZWN0cy5kZWxldGVBdHRhY2htZW50TGluayh0aGlzLnJvb3RPYmplY3RJZCxpZCkpLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBmcm9tKG9iamVjdHMuZ2V0QXR0YWNobWVudExpbmtzKG9iamVjdElkKSkpXHJcbiAgICApLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6ICh1cGRhdGVkQXR0YWNobWVudHMpID0+IHtcclxuICAgICAgICBpZih0aGlzLmFwaSl7XHJcbiAgICAgICAgICB0aGlzLl9hdHRhY2htZW50cyA9IHRoaXMuZGVjb3JhdGVBdHRhY2htZW50TGlua3ModGhpcy5hcGksdXBkYXRlZEF0dGFjaG1lbnRzKTsgIC8vIFVwZGF0ZSBhdHRhY2htZW50cyBpbiBjb21wb25lbnRcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRlbGV0ZSBvciByZWxvYWQgYXR0YWNobWVudHM6JywgZXJyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVBdHRhY2htZW50TGluayhhdHRhY2htZW50OldlYlNkay5BdHRhY2htZW50TGluaywkZXZlbnQ6RXZlbnQpe1xyXG4gICAgaWYoIXRoaXMuYXBpKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYoIWF0dGFjaG1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYXBpICA9IHRoaXMuYXBpO1xyXG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oQmltcGx1c092ZXJsYXlEaWFsb2dDb25maXJtQ29tcG9uZW50LCB7XHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBwb3NpdGlvbjogJ21pZGRsZScsXHJcbiAgICAgICAgcG9zaXRpb25PcHRpb25zOiB7fSxcclxuICAgICAgICBvdmVybGF5Q2xpY2tFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBvdmVybGF5VmlzaWJpbGl0eUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXHJcbiAgICAgIH0sIGRhdGE6IHtcclxuICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ19EZWxldGVfYXR0YWNobWVudGxpbmsnKSxcclxuICAgICAgICBtZXNzYWdlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0F0dGFjaG1lbnRsaW5rX2RlbGV0ZV9jb25maXJtYXRpb25fbWVzc2FnZScpLFxyXG4gICAgICAgIGFjY2VwdEJ1dHRvbkxvY2FsaXplZFN0cmluZzogXCJfRGVsZXRlXCIsXHJcbiAgICAgICAgYWNjZXB0Q2FsbGJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2RlbGV0ZUF0dGFjaG1lbnRMaW5rKGFwaSxhdHRhY2htZW50LmlkLCRldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBidXR0b25DbGlja2VkKCRldmVudDogQmltcGx1c0J1dHRvbkNsaWNrRXZlbnQpe1xyXG4gICAgaWYoIXRoaXMuYXBpKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYXBpICA9IHRoaXMuYXBpO1xyXG4gICAgaWYoJGV2ZW50LmlkID09IFwiYWRkLWRvY3VtZW50c1wiKXtcclxuICAgICAgdGhpcy5jcmVhdGVBdHRhY2htZW50TGluayhhcGkpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJAaWYgKGNhbkNyZWF0ZUF0dGFjaG1lbnRMaW5rICYmICFsaXN0T25seSkge1xyXG4gIDxsaWItYmltcGx1cy1idXR0b25zLXJvd1xyXG4gIFtpdGVtc109XCJidXR0b25Sb3dJdGVtc1wiXHJcbiAgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ2xpY2tlZCgkZXZlbnQpXCJcclxuICAvPlxyXG59XHJcbkBpZiAod29ybWhvbGVTZWxlY3RvciA9PT0gJ2xvY2FsRW1iZWRkZWRNb2RhbElkJyl7XHJcbiAgPGRpdiBjbGFzcz0nZW1iZWRkZWQtbW9kYWwtY29udGFpbmVyJz5cclxuICAgIDxpZnJhbWUgaWQ9e3t3b3JtaG9sZVNlbGVjdG9yfX0gW3RpdGxlXT1cIlwiPjwvaWZyYW1lPlxyXG4gIDwvZGl2PiAgXHJcbn1cclxuPGxpYi1iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyPlxyXG4gIEBmb3IgKGF0dGFjaG1lbnQgb2YgX2F0dGFjaG1lbnRzOyB0cmFjayBhdHRhY2htZW50OyBsZXQgIGkgPSAkaW5kZXgpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJhdHRhY2htZW50LXJvd1wiPlxyXG4gICAgICBAaWYgKGNhbkRlbGV0ZUF0dGFjaG1lbnRMaW5rKSB7XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJiaW0tYXR0YWNobWVudC1kZWxldGUtYnV0dG9uXCIgKGNsaWNrKT1cImRlbGV0ZUF0dGFjaG1lbnRMaW5rKGF0dGFjaG1lbnQsJGV2ZW50KVwiIChrZXlkb3duKT1cImRlbGV0ZUF0dGFjaG1lbnRMaW5rKGF0dGFjaG1lbnQsJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdfRGVsZXRlX2F0dGFjaG1lbnRsaW5rJyB8IHRyYW5zbGF0ZSB9fVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgICYjMTAwMDU7JiN4RkUwRTtcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgfVxyXG4gICAgICA8YSBjbGFzcz1cImJpbS1hdHRhY2htZW50bGluay1pdGVtXCIgaHJlZj17e2F0dGFjaG1lbnQubGlua319IHRhcmdldD0nX2JsYW5rJyByZWw9J25vb3BlbmVyIG5vcmVmZXJyZXInPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJiaW0tYXR0YWNobWVudC1uYW1lXCIgdGl0bGU9e3thdHRhY2htZW50LmZpbGVOYW1lfX0+XHJcbiAgICAgICAgICB7e2F0dGFjaG1lbnQubmFtZSA/IGF0dGFjaG1lbnQubmFtZSA6IGF0dGFjaG1lbnQuZmlsZU5hbWV9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIEBpZiAoIWhpZGVBdHRhY2htZW50U2l6ZSkge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJpbS1hdHRhY2htZW50LXNpemVcIiB0aXRsZT17e2F0dGFjaG1lbnQubmFtZX19PlxyXG4gICAgICAgICAgICAoe3thdHRhY2htZW50LnNpemV9fSBrQilcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9hPlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG4gIEBpZiAoIV9hdHRhY2htZW50cy5sZW5ndGggJiYgc2hvd0VtcHR5TWVzc2FnZSkge1xyXG4gICAgPGRpdiBjbGFzcz1cImJpbS1hdHRhY2htZW50LW5vdC1mb3VuZFwiPlxyXG4gICAgICB7eyAnX05vIGF0dGFjaG1lbnRzIGZvdW5kJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG48L2xpYi1iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyPlxyXG5cclxuIl19