@deeksha2309/sunbird-collection-editor 8.0.7

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 (204) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/collection-editor-cursor.service.mjs +3 -0
  3. package/esm2022/lib/collection-editor-library.component.mjs +16 -0
  4. package/esm2022/lib/collection-editor-library.module.mjs +137 -0
  5. package/esm2022/lib/components/answer/answer.component.mjs +43 -0
  6. package/esm2022/lib/components/asset-browser/asset-browser.component.mjs +325 -0
  7. package/esm2022/lib/components/asset-browser/asset-browser.data.mjs +53 -0
  8. package/esm2022/lib/components/assign-page-number/assign-page-number.component.mjs +191 -0
  9. package/esm2022/lib/components/ckeditor-tool/ckeditor-tool.component.mjs +895 -0
  10. package/esm2022/lib/components/collection-icon/collection-icon.component.mjs +43 -0
  11. package/esm2022/lib/components/contentplayer-page/contentplayer-page.component.mjs +351 -0
  12. package/esm2022/lib/components/csv-upload/csv-upload.component.mjs +178 -0
  13. package/esm2022/lib/components/dialcode/dialcode.component.mjs +182 -0
  14. package/esm2022/lib/components/editor/editor.component.mjs +1125 -0
  15. package/esm2022/lib/components/fancy-tree/fancy-tree.component.mjs +529 -0
  16. package/esm2022/lib/components/header/header.component.mjs +123 -0
  17. package/esm2022/lib/components/library/library.component.mjs +242 -0
  18. package/esm2022/lib/components/library-filter/library-filter.component.mjs +149 -0
  19. package/esm2022/lib/components/library-list/library-list.component.mjs +92 -0
  20. package/esm2022/lib/components/library-player/library-player.component.mjs +62 -0
  21. package/esm2022/lib/components/manage-collaborator/manage-collaborator.component.mjs +256 -0
  22. package/esm2022/lib/components/meta-form/meta-form.component.mjs +377 -0
  23. package/esm2022/lib/components/options/options.component.mjs +144 -0
  24. package/esm2022/lib/components/plain-tree/plain-tree.component.mjs +125 -0
  25. package/esm2022/lib/components/progress-status/progress-status.component.mjs +46 -0
  26. package/esm2022/lib/components/publish-checklist/publish-checklist.component.mjs +67 -0
  27. package/esm2022/lib/components/quality-params-modal/quality-params-modal.component.mjs +52 -0
  28. package/esm2022/lib/components/question/question.component.mjs +1360 -0
  29. package/esm2022/lib/components/quml-player/quml-player.component.mjs +73 -0
  30. package/esm2022/lib/components/qumlplayer-page/qumlplayer-page.component.mjs +84 -0
  31. package/esm2022/lib/components/resource-reorder/resource-reorder.component.mjs +143 -0
  32. package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +26 -0
  33. package/esm2022/lib/components/template/template.component.mjs +42 -0
  34. package/esm2022/lib/components/term-and-condition/term-and-condition.component.mjs +68 -0
  35. package/esm2022/lib/directives/telemetry-interact/telemetry-interact.directive.mjs +33 -0
  36. package/esm2022/lib/interfaces/McqForm.mjs +29 -0
  37. package/esm2022/lib/interfaces/editor.mjs +2 -0
  38. package/esm2022/lib/interfaces/framework.mjs +2 -0
  39. package/esm2022/lib/interfaces/httpOptions.mjs +2 -0
  40. package/esm2022/lib/interfaces/requestParam.mjs +2 -0
  41. package/esm2022/lib/interfaces/serverResponse.mjs +2 -0
  42. package/esm2022/lib/pipes/sanitize-html.pipe.mjs +20 -0
  43. package/esm2022/lib/services/config/category.config.json +8 -0
  44. package/esm2022/lib/services/config/config.service.mjs +27 -0
  45. package/esm2022/lib/services/config/editor.config.json +31 -0
  46. package/esm2022/lib/services/config/label.config.json +314 -0
  47. package/esm2022/lib/services/config/player.config.json +96 -0
  48. package/esm2022/lib/services/config/url.config.json +69 -0
  49. package/esm2022/lib/services/data/data.service.mjs +192 -0
  50. package/esm2022/lib/services/dialcode/dialcode.service.mjs +309 -0
  51. package/esm2022/lib/services/editor/editor.service.mjs +682 -0
  52. package/esm2022/lib/services/framework/framework.service.mjs +106 -0
  53. package/esm2022/lib/services/helper/helper.service.mjs +160 -0
  54. package/esm2022/lib/services/player/player.service.mjs +99 -0
  55. package/esm2022/lib/services/public-data/public-data.service.mjs +21 -0
  56. package/esm2022/lib/services/question/question.service.mjs +167 -0
  57. package/esm2022/lib/services/telemetry/telemetry.service.mjs +120 -0
  58. package/esm2022/lib/services/toaster/toaster.service.mjs +105 -0
  59. package/esm2022/lib/services/tree/tree.service.mjs +284 -0
  60. package/esm2022/project-sunbird-sunbird-collection-editor.mjs +5 -0
  61. package/esm2022/public-api.mjs +4 -0
  62. package/fesm2022/project-sunbird-sunbird-collection-editor.mjs +10138 -0
  63. package/fesm2022/project-sunbird-sunbird-collection-editor.mjs.map +1 -0
  64. package/index.d.ts +6 -0
  65. package/lib/assets/.gitkeep +0 -0
  66. package/lib/assets/images/MCQ.png +0 -0
  67. package/lib/assets/images/Spin.gif +0 -0
  68. package/lib/assets/images/bulkuploadfile.png +0 -0
  69. package/lib/assets/images/cancel-sign copy.png +0 -0
  70. package/lib/assets/images/cancel-sign.png +0 -0
  71. package/lib/assets/images/emptyResult.svg +1 -0
  72. package/lib/assets/images/icons-rtl.gif +0 -0
  73. package/lib/assets/images/icons.gif +0 -0
  74. package/lib/assets/images/imageicon.svg +16 -0
  75. package/lib/assets/images/imageicon_blue.svg +16 -0
  76. package/lib/assets/images/layoutoneicon.svg +16 -0
  77. package/lib/assets/images/layoutoneicon_blue.svg +16 -0
  78. package/lib/assets/images/layoutthreeicon.svg +18 -0
  79. package/lib/assets/images/layoutthreeicon_blue.svg +18 -0
  80. package/lib/assets/images/layouttwoicon.svg +18 -0
  81. package/lib/assets/images/layouttwoicon_blue.svg +18 -0
  82. package/lib/assets/images/leftalignicon.svg +17 -0
  83. package/lib/assets/images/leftalignicon_blue.svg +17 -0
  84. package/lib/assets/images/loader.gif +0 -0
  85. package/lib/assets/images/loader.svg +1 -0
  86. package/lib/assets/images/loading.gif +0 -0
  87. package/lib/assets/images/middlealignicon.svg +17 -0
  88. package/lib/assets/images/middlealignicon_blue.svg +17 -0
  89. package/lib/assets/images/question_collection.svg +18 -0
  90. package/lib/assets/images/rightalignicon.svg +17 -0
  91. package/lib/assets/images/rightalignicon_blue.svg +17 -0
  92. package/lib/assets/images/vline-rtl.gif +0 -0
  93. package/lib/assets/images/vline.gif +0 -0
  94. package/lib/assets/images/writing.png +0 -0
  95. package/lib/collection-editor-cursor.service.d.ts +5 -0
  96. package/lib/collection-editor-cursor.service.d.ts.map +1 -0
  97. package/lib/collection-editor-library.component.d.ts +9 -0
  98. package/lib/collection-editor-library.component.d.ts.map +1 -0
  99. package/lib/collection-editor-library.module.d.ts +50 -0
  100. package/lib/collection-editor-library.module.d.ts.map +1 -0
  101. package/lib/components/answer/answer.component.d.ts +24 -0
  102. package/lib/components/answer/answer.component.d.ts.map +1 -0
  103. package/lib/components/asset-browser/asset-browser.component.d.ts +81 -0
  104. package/lib/components/asset-browser/asset-browser.component.d.ts.map +1 -0
  105. package/lib/components/asset-browser/asset-browser.data.d.ts +52 -0
  106. package/lib/components/asset-browser/asset-browser.data.d.ts.map +1 -0
  107. package/lib/components/assign-page-number/assign-page-number.component.d.ts +38 -0
  108. package/lib/components/assign-page-number/assign-page-number.component.d.ts.map +1 -0
  109. package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts +161 -0
  110. package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts.map +1 -0
  111. package/lib/components/collection-icon/collection-icon.component.d.ts +18 -0
  112. package/lib/components/collection-icon/collection-icon.component.d.ts.map +1 -0
  113. package/lib/components/contentplayer-page/contentplayer-page.component.d.ts +54 -0
  114. package/lib/components/contentplayer-page/contentplayer-page.component.d.ts.map +1 -0
  115. package/lib/components/csv-upload/csv-upload.component.d.ts +42 -0
  116. package/lib/components/csv-upload/csv-upload.component.d.ts.map +1 -0
  117. package/lib/components/dialcode/dialcode.component.d.ts +48 -0
  118. package/lib/components/dialcode/dialcode.component.d.ts.map +1 -0
  119. package/lib/components/editor/editor.component.d.ts +146 -0
  120. package/lib/components/editor/editor.component.d.ts.map +1 -0
  121. package/lib/components/fancy-tree/fancy-tree.component.d.ts +77 -0
  122. package/lib/components/fancy-tree/fancy-tree.component.d.ts.map +1 -0
  123. package/lib/components/header/header.component.d.ts +46 -0
  124. package/lib/components/header/header.component.d.ts.map +1 -0
  125. package/lib/components/library/library.component.d.ts +69 -0
  126. package/lib/components/library/library.component.d.ts.map +1 -0
  127. package/lib/components/library-filter/library-filter.component.d.ts +47 -0
  128. package/lib/components/library-filter/library-filter.component.d.ts.map +1 -0
  129. package/lib/components/library-list/library-list.component.d.ts +32 -0
  130. package/lib/components/library-list/library-list.component.d.ts.map +1 -0
  131. package/lib/components/library-player/library-player.component.d.ts +24 -0
  132. package/lib/components/library-player/library-player.component.d.ts.map +1 -0
  133. package/lib/components/manage-collaborator/manage-collaborator.component.d.ts +75 -0
  134. package/lib/components/manage-collaborator/manage-collaborator.component.d.ts.map +1 -0
  135. package/lib/components/meta-form/meta-form.component.d.ts +51 -0
  136. package/lib/components/meta-form/meta-form.component.d.ts.map +1 -0
  137. package/lib/components/options/options.component.d.ts +53 -0
  138. package/lib/components/options/options.component.d.ts.map +1 -0
  139. package/lib/components/plain-tree/plain-tree.component.d.ts +20 -0
  140. package/lib/components/plain-tree/plain-tree.component.d.ts.map +1 -0
  141. package/lib/components/progress-status/progress-status.component.d.ts +25 -0
  142. package/lib/components/progress-status/progress-status.component.d.ts.map +1 -0
  143. package/lib/components/publish-checklist/publish-checklist.component.d.ts +23 -0
  144. package/lib/components/publish-checklist/publish-checklist.component.d.ts.map +1 -0
  145. package/lib/components/quality-params-modal/quality-params-modal.component.d.ts +24 -0
  146. package/lib/components/quality-params-modal/quality-params-modal.component.d.ts.map +1 -0
  147. package/lib/components/question/question.component.d.ts +215 -0
  148. package/lib/components/question/question.component.d.ts.map +1 -0
  149. package/lib/components/quml-player/quml-player.component.d.ts +26 -0
  150. package/lib/components/quml-player/quml-player.component.d.ts.map +1 -0
  151. package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts +31 -0
  152. package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts.map +1 -0
  153. package/lib/components/resource-reorder/resource-reorder.component.d.ts +45 -0
  154. package/lib/components/resource-reorder/resource-reorder.component.d.ts.map +1 -0
  155. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +13 -0
  156. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts.map +1 -0
  157. package/lib/components/template/template.component.d.ts +21 -0
  158. package/lib/components/template/template.component.d.ts.map +1 -0
  159. package/lib/components/term-and-condition/term-and-condition.component.d.ts +26 -0
  160. package/lib/components/term-and-condition/term-and-condition.component.d.ts.map +1 -0
  161. package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts +27 -0
  162. package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts.map +1 -0
  163. package/lib/interfaces/McqForm.d.ts +32 -0
  164. package/lib/interfaces/McqForm.d.ts.map +1 -0
  165. package/lib/interfaces/editor.d.ts +78 -0
  166. package/lib/interfaces/editor.d.ts.map +1 -0
  167. package/lib/interfaces/framework.d.ts +46 -0
  168. package/lib/interfaces/framework.d.ts.map +1 -0
  169. package/lib/interfaces/httpOptions.d.ts +35 -0
  170. package/lib/interfaces/httpOptions.d.ts.map +1 -0
  171. package/lib/interfaces/requestParam.d.ts +24 -0
  172. package/lib/interfaces/requestParam.d.ts.map +1 -0
  173. package/lib/interfaces/serverResponse.d.ts +38 -0
  174. package/lib/interfaces/serverResponse.d.ts.map +1 -0
  175. package/lib/pipes/sanitize-html.pipe.d.ts +11 -0
  176. package/lib/pipes/sanitize-html.pipe.d.ts.map +1 -0
  177. package/lib/services/config/config.service.d.ts +13 -0
  178. package/lib/services/config/config.service.d.ts.map +1 -0
  179. package/lib/services/data/data.service.d.ts +85 -0
  180. package/lib/services/data/data.service.d.ts.map +1 -0
  181. package/lib/services/dialcode/dialcode.service.d.ts +36 -0
  182. package/lib/services/dialcode/dialcode.service.d.ts.map +1 -0
  183. package/lib/services/editor/editor.service.d.ts +150 -0
  184. package/lib/services/editor/editor.service.d.ts.map +1 -0
  185. package/lib/services/framework/framework.service.d.ts +35 -0
  186. package/lib/services/framework/framework.service.d.ts.map +1 -0
  187. package/lib/services/helper/helper.service.d.ts +41 -0
  188. package/lib/services/helper/helper.service.d.ts.map +1 -0
  189. package/lib/services/player/player.service.d.ts +33 -0
  190. package/lib/services/player/player.service.d.ts.map +1 -0
  191. package/lib/services/public-data/public-data.service.d.ts +15 -0
  192. package/lib/services/public-data/public-data.service.d.ts.map +1 -0
  193. package/lib/services/question/question.service.d.ts +30 -0
  194. package/lib/services/question/question.service.d.ts.map +1 -0
  195. package/lib/services/telemetry/telemetry.service.d.ts +45 -0
  196. package/lib/services/telemetry/telemetry.service.d.ts.map +1 -0
  197. package/lib/services/toaster/toaster.service.d.ts +50 -0
  198. package/lib/services/toaster/toaster.service.d.ts.map +1 -0
  199. package/lib/services/tree/tree.service.d.ts +51 -0
  200. package/lib/services/tree/tree.service.d.ts.map +1 -0
  201. package/package.json +32 -0
  202. package/project-sunbird-sunbird-collection-editor.d.ts.map +1 -0
  203. package/public-api.d.ts +4 -0
  204. package/public-api.d.ts.map +1 -0
@@ -0,0 +1,178 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { catchError } from 'rxjs/operators';
3
+ import { Observable, throwError } from 'rxjs';
4
+ import * as _ from 'lodash-es';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../services/telemetry/telemetry.service";
7
+ import * as i2 from "../../services/config/config.service";
8
+ import * as i3 from "../../services/toaster/toaster.service";
9
+ import * as i4 from "../../services/editor/editor.service";
10
+ import * as i5 from "@angular/common";
11
+ import * as i6 from "@project-sunbird/ng2-semantic-ui";
12
+ import * as i7 from "../../directives/telemetry-interact/telemetry-interact.directive";
13
+ export class CsvUploadComponent {
14
+ constructor(telemetryService, configService, toasterService, editorService, ngZone) {
15
+ this.telemetryService = telemetryService;
16
+ this.configService = configService;
17
+ this.toasterService = toasterService;
18
+ this.editorService = editorService;
19
+ this.ngZone = ngZone;
20
+ this.csvUploadEmitter = new EventEmitter();
21
+ this.showSuccessCsv = false;
22
+ this.showCsvValidationStatus = false;
23
+ this.isUploadCsvEnable = false;
24
+ this.errorCsvStatus = false;
25
+ this.isClosable = true;
26
+ this.updateCSVFile = false;
27
+ this.uploadCSVFile = false;
28
+ }
29
+ ngOnInit() {
30
+ this.handleInputCondition();
31
+ }
32
+ handleInputCondition() {
33
+ if (this.isCreateCsv) {
34
+ this.uploadCSVFile = true;
35
+ // tslint:disable-next-line:max-line-length
36
+ this.sampleCsvUrl = _.get(this.editorService, 'editorConfig.config.publicStorageAccount') + _.get(this.configService.urlConFig, 'URLS.CSV.SAMPLE_COLLECTION_HIERARCHY');
37
+ }
38
+ else {
39
+ this.updateCSVFile = true;
40
+ }
41
+ }
42
+ uploadCSV(event) {
43
+ if (event && event.target && event.target.files) {
44
+ this.file = event.target.files[0];
45
+ this.fileName = this.file.name;
46
+ this.isUploadCsvEnable = true;
47
+ }
48
+ else {
49
+ this.isUploadCsvEnable = false;
50
+ }
51
+ }
52
+ updateContentWithURL(fileURL, mimeType, contentId) {
53
+ const data = new FormData();
54
+ data.append('fileUrl', fileURL);
55
+ data.append('mimeType', mimeType);
56
+ const config = {
57
+ enctype: 'multipart/form-data',
58
+ processData: false,
59
+ contentType: false,
60
+ cache: false
61
+ };
62
+ const option = {
63
+ data,
64
+ param: config
65
+ };
66
+ this.editorService.validateCSVFile(option, contentId).subscribe(res => {
67
+ this.ngZone.run(() => {
68
+ this.isClosable = true;
69
+ this.showSuccessCsv = true;
70
+ this.showCsvValidationStatus = false;
71
+ this.csvUploadEmitter.emit({ status: true, type: 'updateHierarchy' });
72
+ });
73
+ }, error => {
74
+ this.ngZone.run(() => {
75
+ this.showCsvValidationStatus = false;
76
+ this.errorCsvStatus = true;
77
+ this.errorCsvMessage = _.get(error, 'error.params.errmsg').split('\n');
78
+ this.isClosable = true;
79
+ });
80
+ });
81
+ }
82
+ closeHierarchyModal(modal) {
83
+ this.resetConditions();
84
+ this.uploadCSVFile = false;
85
+ this.updateCSVFile = false;
86
+ this.csvUploadEmitter.emit({ status: true, type: 'closeModal' });
87
+ modal.deny();
88
+ }
89
+ onClickReupload() {
90
+ if (this.isCreateCsv) {
91
+ this.uploadCSVFile = true;
92
+ }
93
+ else {
94
+ this.updateCSVFile = true;
95
+ }
96
+ this.showCsvValidationStatus = false;
97
+ this.resetConditions();
98
+ }
99
+ resetConditions() {
100
+ this.errorCsvStatus = false;
101
+ this.errorCsvMessage = '';
102
+ this.isUploadCsvEnable = false;
103
+ this.file = null;
104
+ this.fileName = '';
105
+ }
106
+ downloadSampleCSVFile() {
107
+ const downloadConfig = {
108
+ blobUrl: this.sampleCsvUrl,
109
+ successMessage: false,
110
+ fileType: 'csv',
111
+ fileName: this.collectionId
112
+ };
113
+ window.open(downloadConfig.blobUrl, '_blank');
114
+ /*this.editorService.downloadBlobUrlFile(downloadConfig);*/
115
+ }
116
+ uploadToBlob(signedURL, file, config) {
117
+ const csp = _.get(this.editorService.editorConfig, 'context.cloudStorage.provider', 'azure');
118
+ return new Observable((observer) => {
119
+ const uploaderLib = new SunbirdFileUploadLib.FileUploader();
120
+ uploaderLib.upload({ url: signedURL, file, csp })
121
+ .on('error', (error) => {
122
+ const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.018') };
123
+ this.isClosable = true;
124
+ this.errorCsvStatus = true;
125
+ this.showCsvValidationStatus = false;
126
+ this.errorCsvMessage = _.get(error, 'error.params.errmsg') || errInfo.errorMsg;
127
+ observer.error(this.editorService.apiErrorHandling(error, errInfo));
128
+ }).on('completed', (completed) => {
129
+ observer.next(completed);
130
+ observer.complete();
131
+ });
132
+ });
133
+ }
134
+ validateCSVFile() {
135
+ this.showCsvValidationStatus = true;
136
+ this.uploadCSVFile = false;
137
+ this.isUploadCsvEnable = false;
138
+ this.isClosable = false;
139
+ this.updateCSVFile = false;
140
+ const request = {
141
+ content: {
142
+ fileName: this.fileName
143
+ }
144
+ };
145
+ this.editorService.generatePreSignedUrl(request, this.collectionId, 'hierarchy').pipe(catchError(err => {
146
+ const errInfo = { errorMsg: _.get(this.configService.labelConfig, 'messages.error.026') };
147
+ this.isClosable = true;
148
+ this.errorCsvStatus = true;
149
+ this.showCsvValidationStatus = false;
150
+ this.errorCsvMessage = _.get(err, 'error.params.errmsg') || errInfo.errorMsg;
151
+ return throwError(this.editorService.apiErrorHandling(err, errInfo));
152
+ })).subscribe((response) => {
153
+ const signedURL = _.get(response.result, 'pre_signed_url');
154
+ let blobConfig = {
155
+ processData: false,
156
+ contentType: 'text/csv'
157
+ };
158
+ blobConfig = this.editorService.appendCloudStorageHeaders(blobConfig);
159
+ this.uploadToBlob(signedURL, this.file, blobConfig).subscribe(() => {
160
+ const fileURL = signedURL.split('?')[0];
161
+ this.updateContentWithURL(fileURL, this.file.type, this.collectionId);
162
+ });
163
+ });
164
+ }
165
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CsvUploadComponent, deps: [{ token: i1.EditorTelemetryService }, { token: i2.ConfigService }, { token: i3.ToasterService }, { token: i4.EditorService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
166
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CsvUploadComponent, selector: "lib-csv-upload", inputs: { collectionId: "collectionId", isCreateCsv: "isCreateCsv" }, outputs: { csvUploadEmitter: "csvUploadEmitter" }, ngImport: i0, template: "<sui-modal [mustScroll]=\"true\" [isClosable]=\"isClosable\" [transitionDuration]=\"0\" [size]=\"'normal'\"\n class=\"sb-modal bx-none overflow-modal\" appBodyScroll (dismissed)=\"closeHierarchyModal(modal)\" #modal>\n <div class=\"sb-modal-header\">\n <span *ngIf=\"isCreateCsv\"> {{configService.labelConfig?.lbl?.createHierarchyCsv}} </span>\n <span *ngIf=\"!isCreateCsv\"> {{configService.labelConfig?.lbl?.uploadUpdateCSV}}</span> \n\n </div>\n <div class=\"sb-modal-content\">\n <div>\n <!-- upload csv file -->\n <div class=\"d-flex\" *ngIf=\"uploadCSVFile\">\n <div class=\"pl-20 pt-20 d-block w-50\">\n <p>{{configService.labelConfig?.lbl?.downloadSampleHierarchyCSv}} </p>\n <div class=\"sb-color-gray-200 fs-0-785\">{{configService.labelConfig?.lbl?.makeSureFile}} </div>\n <ul class=\"ui ordered list sb-dock-ordered-list mt-15\">\n <li class=\"item\">{{configService.labelConfig?.lbl?.allColumnsAreAvailable}}</li>\n <li class=\"item\">{{configService.labelConfig?.lbl?.hasAllMandatoryColumn}}</li>\n <li class=\"item\">{{configService.labelConfig?.lbl?.noDuplicateRow}}</li>\n </ul>\n <a target=\"_blank\" (click)=\"downloadSampleCSVFile()\"\n class=\"sb-btn sb-btn-normal sb-btn-outline-primary my-20 text-decor-none sb-color-primary\"><i\n aria-hidden=\"true\" class=\"fa fa-download pr-10\"></i>{{configService.labelConfig?.lbl?.downloadSampleCSV}}</a>\n </div>\n <div class=\"p-10 w-60 text-center sb-bg-color-primary-0 sb-br-primary\">\n <img src=\"../../assets/images/bulkuploadfile.png\" alt=\"\" class=\"w-20 pb-10\">\n <div id=\"qq-upload-actions\" class=\"upload-file-description d-flex flex-ai-center flex-dc\">\n <h5 class=\"mb-8 sb-color-gray-400\">\n {{configService.labelConfig?.lbl?.dragAndDropCSV}} <br />\n </h5>\n <h6 class=\"mb-8 sb-color-gray-400 mt-10\">{{configService.labelConfig?.lbl?.Or}}</h6>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('select_csv_upload','click',configService.labelConfig?.lbl?.selectFileToUpload,\n this.telemetryService.telemetryPageId, {key: 'identifier', value: collectionId})\"\n ><i aria-hidden=\"true\" class=\"icon upload\"></i>\n {{configService.labelConfig?.lbl?.selectFileToUpload}} \n <input (change)=\"uploadCSV($event)\" accept=\".csv\" type=\"file\" >\n </button>\n <p class=\"sb-color-gray-200 fs-0-785\">{{configService.labelConfig?.lbl?.uploadEntries}}</p>\n <span class=\"sb-color-primary fs-0-785\" *ngIf=\"fileName\">{{fileName}}</span>\n </div>\n </div>\n </div> \n <!-- update csv file -->\n <div class=\"p-20 text-center sb-bg-color-primary-0 sb-br-primary\" *ngIf=\"updateCSVFile\">\n <img src=\"../../assets/images/bulkuploadfile.png\" alt=\"\" class=\"w-10 pb-10\">\n <div id=\"qq-upload-actions\" class=\"upload-file-description d-flex flex-ai-center flex-dc\">\n <h5 class=\"mb-8 sb-color-gray-400\">\n {{configService.labelConfig?.lbl?.dragAndDropCSV}}<br />\n </h5>\n <h6 class=\"mb-8 sb-color-gray-400 mt-10\">{{configService.labelConfig?.lbl?.Or}}</h6>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('select_csv_update','click',configService.labelConfig?.lbl?.selectFileToUpload,\n this.telemetryService.telemetryPageId, {key: 'identifier', value: collectionId})\"\n ><i aria-hidden=\"true\" class=\"icon upload\"></i>\n {{configService.labelConfig?.lbl?.selectFileToUpload}} \n <input (change)=\"uploadCSV($event)\" accept=\".csv\" type=\"file\" >\n </button>\n <p class=\"sb-color-gray-200 fs-0-785\">{{configService.labelConfig?.lbl?.uploadEntries}}</p>\n <span class=\"sb-color-primary fs-0-785\" *ngIf=\"fileName\">{{fileName}}</span>\n </div>\n </div>\n <div *ngIf=\"updateCSVFile\" class=\"py-20\"><i aria-hidden=\"true\" class=\"icon info circle pr-10 sb-color-gray-200\"></i> \n <span class=\"sb-color-gray-200 fs-0-785\">{{configService.labelConfig?.lbl?.csvDownloadInstruction}}</span></div>\n <!-- Validation message -->\n <div class=\"d-flex sb-min-h-250 flex-ai-center mn-15 sb-bg-color-primary-0\" *ngIf=\"showCsvValidationStatus\">\n <div class=\"w-50 text-center\">\n <img src=\"../../assets/images/bulkuploadfile.png\" alt=\"\" class=\"w-30\">\n </div>\n <div class=\"w-50\">\n <div class=\"pos-relative\">\n <span class=\"sb-loader sb-success-loader\"></span>\n <div class=\"font-weight-bold mb-10\">\n {{configService.labelConfig?.lbl?.pleaseWait}}\n </div>\n <span class=\"sb-color-gray-400 \"> {{configService.labelConfig?.lbl?.validateCsvFile}}</span>\n </div>\n </div>\n </div>\n\n <!-- Validation failed message = 4 -->\n <div class=\"d-flex sb-min-h-250 flex-ai-center\" *ngIf=\"errorCsvStatus\">\n <div class=\"w-50 text-center\">\n <img src=\"../../assets/images/bulkuploadfile.png\" alt=\"\" class=\"w-30\">\n </div>\n <div class=\"w-50\">\n <i class=\"fa fa-exclamation-triangle pr-5 sb-color-error pr-10\" aria-hidden=\"true\"></i> {{configService.labelConfig?.lbl?.hierarchyValidationError}}\n <div class=\"sb-color-gray-200 pt-20 fs-0-785\"> {{configService.labelConfig?.lbl?.followingErrors}}</div>\n <ul class=\"mt-15 sb-circle-ul\">\n <li class=\"item\" *ngFor=\"let error of errorCsvMessage\">{{error}}</li>\n </ul>\n <div class=\"qq-upload-button-selector sb-btn sb-btn-normal sb-btn-success my-20\" \n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('select_csv_reupload','click',configService.labelConfig?.lbl?.reUploadCSV,\n this.telemetryService.telemetryPageId, {key: 'identifier', value: collectionId})\"\n (click)=\"onClickReupload()\">\n <div><i aria-hidden=\"true\" class=\"icon refresh\"></i>{{configService.labelConfig?.lbl?.reUploadCSV}}</div>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex sb-bg-color-success-0 p-10 sb-min-h-250 mn-15\" *ngIf=\"showSuccessCsv\">\n <div class=\"w-50 text-center\">\n <img src=\"../../assets/images/bulkuploadfile.png\" alt=\"\" class=\"w-30\">\n </div>\n <div class=\"w-50 flex-ai-center\">\n <div class=\"d-flex\">\n <i class=\"icon check circle outline sb-color-success\" aria-hidden=\"true\"></i>\n <div>\n <span *ngIf=\"isCreateCsv\" class=\"fs-0-92\"> {{configService.labelConfig?.lbl?.hierarchyAdded}} </span>\n <span *ngIf=\"!isCreateCsv\" class=\"fs-0-92\"> {{configService.labelConfig?.lbl?.hierarchyUpdated}} </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal \" \n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('close_popup','click',configService.labelConfig?.button_labels?.close_btn_label,\n this.telemetryService.telemetryPageId, {key: 'identifier', value: collectionId})\"\n (click)=\"closeHierarchyModal(modal)\"[disabled]=\"!isClosable\" \n [ngClass]=\"{'sb-btn-primary': isClosable, 'sb-btn-disabled': !isClosable}\" >\n {{configService.labelConfig?.button_labels?.close_btn_label}}\n </button>\n <button class=\"sb-btn sb-btn-normal \"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('csv_upload','click',configService.labelConfig?.button_labels?.next_btn_label,\n this.telemetryService.telemetryPageId, {key: 'identifier', value: collectionId})\"\n (click)=\"validateCSVFile()\"[disabled]=\"!isUploadCsvEnable\" \n [ngClass]=\"{'sb-btn-primary': isUploadCsvEnable, 'sb-btn-disabled': !isUploadCsvEnable}\" >\n {{configService.labelConfig?.button_labels?.next_btn_label}}\n </button>\n </div>\n</sui-modal>", styles: [".sb-dock-ordered-list li{margin-bottom:.4rem;font-size:.8rem;color:var(--gray-200)!important}.sb-dock-ordered-list li:before{width:1rem;height:1rem;line-height:1rem;border-radius:100%;text-align:center!important;background-color:var(--primary-200);font-size:.6rem;color:var(--white)!important;margin-right:.8rem}.sb-circle-download-icon{background:var(--secondary-100);display:inline-block;width:1.8rem;height:1.8rem;line-height:1.8rem;color:var(--white);border-radius:100%;text-align:center;font-size:.8rem}.sb-list-circle li{list-style-type:disc;font-size:.8rem;margin-bottom:.6rem}.sb-line-height-1-2{line-height:1.2rem}.sb-success-loader{position:absolute!important;top:46%!important;left:50%!important;transform:translate(-46%,-50%)!important}.sb-success-loader:after{width:1.2rem!important;height:1.2rem!important}.sb-dock-loader{position:absolute;top:15%;left:-1%;transform:translate(-50%,-50%)}.sb-bulk-upload img{width:11rem}.sb-bulk-upload img .sb-dock-accordion .sb-toc-accor-1:last-child .title{border-bottom:1px solid var(--gray-100)!important}.sb-bulk-upload img .sb-dock-accordion .title{border:1px solid var(--gray-100)!important;margin:0!important;border-bottom:none!important;border-radius:0!important}.sb-bulk-upload img .sb-dock-accordion .content{border:1px solid var(--gray-100)}.sb-bulk-upload img .sb-dock-accordion .content:last-child{border-bottom:1px solid var(--gray-100)!important}.sb-bulk-upload img .sb-dock-accordion .sb-radio-btn-checkbox label:before{width:1.4rem;height:1.4rem}.sb-bulk-upload img .sb-dock-accordion .sb-radio-btn-checkbox label:after{height:.9rem;width:.9rem}.sb-bulk-upload img .sb-dock-accordion.scrolling.content{max-height:70vh!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.SuiDropdownMenuItem, selector: ".item" }, { kind: "component", type: i6.SuiModal, selector: "sui-modal", inputs: ["isClosable", "closeResult", "size", "isCentered", "isFullScreen", "isBasic", "mustScroll", "isInverted", "transition", "transitionDuration"], outputs: ["approved", "denied", "dismissed"] }, { kind: "directive", type: i7.TelemetryInteractDirective, selector: "[libTelemetryInteract]", inputs: ["telemetryInteractEdata"] }] }); }
167
+ }
168
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CsvUploadComponent, decorators: [{
169
+ type: Component,
170
+ args: [{ selector: 'lib-csv-upload', template: "<sui-modal [mustScroll]=\"true\" [isClosable]=\"isClosable\" [transitionDuration]=\"0\" [size]=\"'normal'\"\n class=\"sb-modal bx-none overflow-modal\" appBodyScroll (dismissed)=\"closeHierarchyModal(modal)\" #modal>\n <div class=\"sb-modal-header\">\n <span *ngIf=\"isCreateCsv\"> {{configService.labelConfig?.lbl?.createHierarchyCsv}} </span>\n <span *ngIf=\"!isCreateCsv\"> {{configService.labelConfig?.lbl?.uploadUpdateCSV}}</span> \n\n </div>\n <div class=\"sb-modal-content\">\n <div>\n <!-- upload csv file -->\n <div class=\"d-flex\" *ngIf=\"uploadCSVFile\">\n <div class=\"pl-20 pt-20 d-block w-50\">\n <p>{{configService.labelConfig?.lbl?.downloadSampleHierarchyCSv}} </p>\n <div class=\"sb-color-gray-200 fs-0-785\">{{configService.labelConfig?.lbl?.makeSureFile}} </div>\n <ul class=\"ui ordered list sb-dock-ordered-list mt-15\">\n <li class=\"item\">{{configService.labelConfig?.lbl?.allColumnsAreAvailable}}</li>\n <li class=\"item\">{{configService.labelConfig?.lbl?.hasAllMandatoryColumn}}</li>\n <li class=\"item\">{{configService.labelConfig?.lbl?.noDuplicateRow}}</li>\n </ul>\n <a target=\"_blank\" (click)=\"downloadSampleCSVFile()\"\n class=\"sb-btn sb-btn-normal sb-btn-outline-primary my-20 text-decor-none sb-color-primary\"><i\n aria-hidden=\"true\" class=\"fa fa-download pr-10\"></i>{{configService.labelConfig?.lbl?.downloadSampleCSV}}</a>\n </div>\n <div class=\"p-10 w-60 text-center sb-bg-color-primary-0 sb-br-primary\">\n <img src=\"../../assets/images/bulkuploadfile.png\" alt=\"\" class=\"w-20 pb-10\">\n <div id=\"qq-upload-actions\" class=\"upload-file-description d-flex flex-ai-center flex-dc\">\n <h5 class=\"mb-8 sb-color-gray-400\">\n {{configService.labelConfig?.lbl?.dragAndDropCSV}} <br />\n </h5>\n <h6 class=\"mb-8 sb-color-gray-400 mt-10\">{{configService.labelConfig?.lbl?.Or}}</h6>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('select_csv_upload','click',configService.labelConfig?.lbl?.selectFileToUpload,\n this.telemetryService.telemetryPageId, {key: 'identifier', value: collectionId})\"\n ><i aria-hidden=\"true\" class=\"icon upload\"></i>\n {{configService.labelConfig?.lbl?.selectFileToUpload}} \n <input (change)=\"uploadCSV($event)\" accept=\".csv\" type=\"file\" >\n </button>\n <p class=\"sb-color-gray-200 fs-0-785\">{{configService.labelConfig?.lbl?.uploadEntries}}</p>\n <span class=\"sb-color-primary fs-0-785\" *ngIf=\"fileName\">{{fileName}}</span>\n </div>\n </div>\n </div> \n <!-- update csv file -->\n <div class=\"p-20 text-center sb-bg-color-primary-0 sb-br-primary\" *ngIf=\"updateCSVFile\">\n <img src=\"../../assets/images/bulkuploadfile.png\" alt=\"\" class=\"w-10 pb-10\">\n <div id=\"qq-upload-actions\" class=\"upload-file-description d-flex flex-ai-center flex-dc\">\n <h5 class=\"mb-8 sb-color-gray-400\">\n {{configService.labelConfig?.lbl?.dragAndDropCSV}}<br />\n </h5>\n <h6 class=\"mb-8 sb-color-gray-400 mt-10\">{{configService.labelConfig?.lbl?.Or}}</h6>\n <button class=\"upload-input-button sb-btn sb-btn-success sb-btn-normal\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('select_csv_update','click',configService.labelConfig?.lbl?.selectFileToUpload,\n this.telemetryService.telemetryPageId, {key: 'identifier', value: collectionId})\"\n ><i aria-hidden=\"true\" class=\"icon upload\"></i>\n {{configService.labelConfig?.lbl?.selectFileToUpload}} \n <input (change)=\"uploadCSV($event)\" accept=\".csv\" type=\"file\" >\n </button>\n <p class=\"sb-color-gray-200 fs-0-785\">{{configService.labelConfig?.lbl?.uploadEntries}}</p>\n <span class=\"sb-color-primary fs-0-785\" *ngIf=\"fileName\">{{fileName}}</span>\n </div>\n </div>\n <div *ngIf=\"updateCSVFile\" class=\"py-20\"><i aria-hidden=\"true\" class=\"icon info circle pr-10 sb-color-gray-200\"></i> \n <span class=\"sb-color-gray-200 fs-0-785\">{{configService.labelConfig?.lbl?.csvDownloadInstruction}}</span></div>\n <!-- Validation message -->\n <div class=\"d-flex sb-min-h-250 flex-ai-center mn-15 sb-bg-color-primary-0\" *ngIf=\"showCsvValidationStatus\">\n <div class=\"w-50 text-center\">\n <img src=\"../../assets/images/bulkuploadfile.png\" alt=\"\" class=\"w-30\">\n </div>\n <div class=\"w-50\">\n <div class=\"pos-relative\">\n <span class=\"sb-loader sb-success-loader\"></span>\n <div class=\"font-weight-bold mb-10\">\n {{configService.labelConfig?.lbl?.pleaseWait}}\n </div>\n <span class=\"sb-color-gray-400 \"> {{configService.labelConfig?.lbl?.validateCsvFile}}</span>\n </div>\n </div>\n </div>\n\n <!-- Validation failed message = 4 -->\n <div class=\"d-flex sb-min-h-250 flex-ai-center\" *ngIf=\"errorCsvStatus\">\n <div class=\"w-50 text-center\">\n <img src=\"../../assets/images/bulkuploadfile.png\" alt=\"\" class=\"w-30\">\n </div>\n <div class=\"w-50\">\n <i class=\"fa fa-exclamation-triangle pr-5 sb-color-error pr-10\" aria-hidden=\"true\"></i> {{configService.labelConfig?.lbl?.hierarchyValidationError}}\n <div class=\"sb-color-gray-200 pt-20 fs-0-785\"> {{configService.labelConfig?.lbl?.followingErrors}}</div>\n <ul class=\"mt-15 sb-circle-ul\">\n <li class=\"item\" *ngFor=\"let error of errorCsvMessage\">{{error}}</li>\n </ul>\n <div class=\"qq-upload-button-selector sb-btn sb-btn-normal sb-btn-success my-20\" \n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('select_csv_reupload','click',configService.labelConfig?.lbl?.reUploadCSV,\n this.telemetryService.telemetryPageId, {key: 'identifier', value: collectionId})\"\n (click)=\"onClickReupload()\">\n <div><i aria-hidden=\"true\" class=\"icon refresh\"></i>{{configService.labelConfig?.lbl?.reUploadCSV}}</div>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex sb-bg-color-success-0 p-10 sb-min-h-250 mn-15\" *ngIf=\"showSuccessCsv\">\n <div class=\"w-50 text-center\">\n <img src=\"../../assets/images/bulkuploadfile.png\" alt=\"\" class=\"w-30\">\n </div>\n <div class=\"w-50 flex-ai-center\">\n <div class=\"d-flex\">\n <i class=\"icon check circle outline sb-color-success\" aria-hidden=\"true\"></i>\n <div>\n <span *ngIf=\"isCreateCsv\" class=\"fs-0-92\"> {{configService.labelConfig?.lbl?.hierarchyAdded}} </span>\n <span *ngIf=\"!isCreateCsv\" class=\"fs-0-92\"> {{configService.labelConfig?.lbl?.hierarchyUpdated}} </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal \" \n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('close_popup','click',configService.labelConfig?.button_labels?.close_btn_label,\n this.telemetryService.telemetryPageId, {key: 'identifier', value: collectionId})\"\n (click)=\"closeHierarchyModal(modal)\"[disabled]=\"!isClosable\" \n [ngClass]=\"{'sb-btn-primary': isClosable, 'sb-btn-disabled': !isClosable}\" >\n {{configService.labelConfig?.button_labels?.close_btn_label}}\n </button>\n <button class=\"sb-btn sb-btn-normal \"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('csv_upload','click',configService.labelConfig?.button_labels?.next_btn_label,\n this.telemetryService.telemetryPageId, {key: 'identifier', value: collectionId})\"\n (click)=\"validateCSVFile()\"[disabled]=\"!isUploadCsvEnable\" \n [ngClass]=\"{'sb-btn-primary': isUploadCsvEnable, 'sb-btn-disabled': !isUploadCsvEnable}\" >\n {{configService.labelConfig?.button_labels?.next_btn_label}}\n </button>\n </div>\n</sui-modal>", styles: [".sb-dock-ordered-list li{margin-bottom:.4rem;font-size:.8rem;color:var(--gray-200)!important}.sb-dock-ordered-list li:before{width:1rem;height:1rem;line-height:1rem;border-radius:100%;text-align:center!important;background-color:var(--primary-200);font-size:.6rem;color:var(--white)!important;margin-right:.8rem}.sb-circle-download-icon{background:var(--secondary-100);display:inline-block;width:1.8rem;height:1.8rem;line-height:1.8rem;color:var(--white);border-radius:100%;text-align:center;font-size:.8rem}.sb-list-circle li{list-style-type:disc;font-size:.8rem;margin-bottom:.6rem}.sb-line-height-1-2{line-height:1.2rem}.sb-success-loader{position:absolute!important;top:46%!important;left:50%!important;transform:translate(-46%,-50%)!important}.sb-success-loader:after{width:1.2rem!important;height:1.2rem!important}.sb-dock-loader{position:absolute;top:15%;left:-1%;transform:translate(-50%,-50%)}.sb-bulk-upload img{width:11rem}.sb-bulk-upload img .sb-dock-accordion .sb-toc-accor-1:last-child .title{border-bottom:1px solid var(--gray-100)!important}.sb-bulk-upload img .sb-dock-accordion .title{border:1px solid var(--gray-100)!important;margin:0!important;border-bottom:none!important;border-radius:0!important}.sb-bulk-upload img .sb-dock-accordion .content{border:1px solid var(--gray-100)}.sb-bulk-upload img .sb-dock-accordion .content:last-child{border-bottom:1px solid var(--gray-100)!important}.sb-bulk-upload img .sb-dock-accordion .sb-radio-btn-checkbox label:before{width:1.4rem;height:1.4rem}.sb-bulk-upload img .sb-dock-accordion .sb-radio-btn-checkbox label:after{height:.9rem;width:.9rem}.sb-bulk-upload img .sb-dock-accordion.scrolling.content{max-height:70vh!important}\n"] }]
171
+ }], ctorParameters: function () { return [{ type: i1.EditorTelemetryService }, { type: i2.ConfigService }, { type: i3.ToasterService }, { type: i4.EditorService }, { type: i0.NgZone }]; }, propDecorators: { collectionId: [{
172
+ type: Input
173
+ }], isCreateCsv: [{
174
+ type: Input
175
+ }], csvUploadEmitter: [{
176
+ type: Output
177
+ }] } });
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LXVwbG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2xsZWN0aW9uLWVkaXRvci1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy9jc3YtdXBsb2FkL2Nzdi11cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvY3N2LXVwbG9hZC9jc3YtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFLdkYsT0FBTyxFQUFFLFVBQVUsRUFBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxDQUFDLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7QUFRL0IsTUFBTSxPQUFPLGtCQUFrQjtJQWU3QixZQUFtQixnQkFBd0MsRUFBUyxhQUE0QixFQUM1RSxjQUE4QixFQUFVLGFBQTRCLEVBQVUsTUFBYztRQUQ3RixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXdCO1FBQVMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUUsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBYnRHLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDOUMsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUV2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QyxRQUFRLEVBQUUsRUFBRTtZQUN6QixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUMzRCxJQUFJLFVBQVUsR0FBRztnQkFDZixXQUFXLEVBQUUsS0FBSztnQkFDbEIsV0FBVyxFQUFFLFVBQVU7YUFDeEIsQ0FBQztZQUNGLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDakUsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEUsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBdkpVLGtCQUFrQjttR0FBbEIsa0JBQWtCLCtLQ2YvQiwralJBd0lZOzs0RkR6SEMsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGdCQUFnQjt1TkFLakIsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNJLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbmZpZy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBFZGl0b3JUZWxlbWV0cnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGVsZW1ldHJ5L3RlbGVtZXRyeS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdG9hc3Rlci90b2FzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VkaXRvci9lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaC1lcyc7XG5kZWNsYXJlIGNvbnN0IFN1bmJpcmRGaWxlVXBsb2FkTGliOiBhbnk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jc3YtdXBsb2FkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Nzdi11cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jc3YtdXBsb2FkLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ3N2VXBsb2FkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgY29sbGVjdGlvbklkO1xuICBASW5wdXQoKSBpc0NyZWF0ZUNzdjtcbiAgQE91dHB1dCgpIGNzdlVwbG9hZEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgcHVibGljIHNob3dTdWNjZXNzQ3N2ID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93Q3N2VmFsaWRhdGlvblN0YXR1cyA9IGZhbHNlO1xuICBwdWJsaWMgaXNVcGxvYWRDc3ZFbmFibGUgPSBmYWxzZTtcbiAgcHVibGljIGVycm9yQ3N2U3RhdHVzID0gZmFsc2U7XG4gIHB1YmxpYyBlcnJvckNzdk1lc3NhZ2U6IGFueTtcbiAgcHVibGljIGlzQ2xvc2FibGUgPSB0cnVlO1xuICBwdWJsaWMgc2FtcGxlQ3N2VXJsOiBhbnk7XG4gIHB1YmxpYyB1cGRhdGVDU1ZGaWxlID0gZmFsc2U7XG4gIHB1YmxpYyB1cGxvYWRDU1ZGaWxlID0gZmFsc2U7XG4gIHB1YmxpYyBmaWxlTmFtZTogYW55O1xuICBwdWJsaWMgZmlsZTogYW55O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVsZW1ldHJ5U2VydmljZTogRWRpdG9yVGVsZW1ldHJ5U2VydmljZSwgcHVibGljIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgdG9hc3RlclNlcnZpY2U6IFRvYXN0ZXJTZXJ2aWNlLCBwcml2YXRlIGVkaXRvclNlcnZpY2U6IEVkaXRvclNlcnZpY2UsIHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlSW5wdXRDb25kaXRpb24oKTtcbiAgfVxuICBoYW5kbGVJbnB1dENvbmRpdGlvbigpIHtcbiAgICBpZiAodGhpcy5pc0NyZWF0ZUNzdikge1xuICAgICAgdGhpcy51cGxvYWRDU1ZGaWxlID0gdHJ1ZTtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgIHRoaXMuc2FtcGxlQ3N2VXJsID0gXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLCAnZWRpdG9yQ29uZmlnLmNvbmZpZy5wdWJsaWNTdG9yYWdlQWNjb3VudCcpICsgXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLnVybENvbkZpZywgJ1VSTFMuQ1NWLlNBTVBMRV9DT0xMRUNUSU9OX0hJRVJBUkNIWScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUNTVkZpbGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICB1cGxvYWRDU1YoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5maWxlcykge1xuICAgICAgdGhpcy5maWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICAgICAgdGhpcy5maWxlTmFtZSA9IHRoaXMuZmlsZS5uYW1lO1xuICAgICAgdGhpcy5pc1VwbG9hZENzdkVuYWJsZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNVcGxvYWRDc3ZFbmFibGUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb250ZW50V2l0aFVSTChmaWxlVVJMLCBtaW1lVHlwZSwgY29udGVudElkKSB7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGRhdGEuYXBwZW5kKCdmaWxlVXJsJywgZmlsZVVSTCk7XG4gICAgZGF0YS5hcHBlbmQoJ21pbWVUeXBlJywgbWltZVR5cGUpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGVuY3R5cGU6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcbiAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcbiAgICAgIGNhY2hlOiBmYWxzZVxuICAgIH07XG4gICAgY29uc3Qgb3B0aW9uID0ge1xuICAgICAgZGF0YSxcbiAgICAgIHBhcmFtOiBjb25maWdcbiAgICB9O1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS52YWxpZGF0ZUNTVkZpbGUob3B0aW9uLCBjb250ZW50SWQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0Nsb3NhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93U3VjY2Vzc0NzdiA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd0NzdlZhbGlkYXRpb25TdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jc3ZVcGxvYWRFbWl0dGVyLmVtaXQoeyBzdGF0dXM6IHRydWUsIHR5cGU6ICd1cGRhdGVIaWVyYXJjaHknIH0pO1xuICAgICAgfSk7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93Q3N2VmFsaWRhdGlvblN0YXR1cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9yQ3N2U3RhdHVzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lcnJvckNzdk1lc3NhZ2UgPSBfLmdldChlcnJvciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIHRoaXMuaXNDbG9zYWJsZSA9IHRydWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBjbG9zZUhpZXJhcmNoeU1vZGFsKG1vZGFsKSB7XG4gICAgdGhpcy5yZXNldENvbmRpdGlvbnMoKTtcbiAgICB0aGlzLnVwbG9hZENTVkZpbGUgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZUNTVkZpbGUgPSBmYWxzZTtcbiAgICB0aGlzLmNzdlVwbG9hZEVtaXR0ZXIuZW1pdCh7IHN0YXR1czogdHJ1ZSwgdHlwZTogJ2Nsb3NlTW9kYWwnIH0pO1xuICAgIG1vZGFsLmRlbnkoKTtcbiAgfVxuICBvbkNsaWNrUmV1cGxvYWQoKSB7XG4gICAgaWYgKHRoaXMuaXNDcmVhdGVDc3YpIHtcbiAgICAgIHRoaXMudXBsb2FkQ1NWRmlsZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlQ1NWRmlsZSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuc2hvd0NzdlZhbGlkYXRpb25TdGF0dXMgPSBmYWxzZTtcbiAgICB0aGlzLnJlc2V0Q29uZGl0aW9ucygpO1xuICB9XG4gIHJlc2V0Q29uZGl0aW9ucygpIHtcbiAgICB0aGlzLmVycm9yQ3N2U3RhdHVzID0gZmFsc2U7XG4gICAgdGhpcy5lcnJvckNzdk1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLmlzVXBsb2FkQ3N2RW5hYmxlID0gZmFsc2U7XG4gICAgdGhpcy5maWxlID0gbnVsbDtcbiAgICB0aGlzLmZpbGVOYW1lID0gJyc7XG4gIH1cbiAgZG93bmxvYWRTYW1wbGVDU1ZGaWxlKCkge1xuICAgIGNvbnN0IGRvd25sb2FkQ29uZmlnID0ge1xuICAgICAgYmxvYlVybDogdGhpcy5zYW1wbGVDc3ZVcmwsXG4gICAgICBzdWNjZXNzTWVzc2FnZTogZmFsc2UsXG4gICAgICBmaWxlVHlwZTogJ2NzdicsXG4gICAgICBmaWxlTmFtZTogdGhpcy5jb2xsZWN0aW9uSWRcbiAgICB9O1xuICAgIHdpbmRvdy5vcGVuKGRvd25sb2FkQ29uZmlnLmJsb2JVcmwsICdfYmxhbmsnKTtcbiAgICAvKnRoaXMuZWRpdG9yU2VydmljZS5kb3dubG9hZEJsb2JVcmxGaWxlKGRvd25sb2FkQ29uZmlnKTsqL1xuICB9XG4gIHVwbG9hZFRvQmxvYihzaWduZWRVUkwsIGZpbGUsIGNvbmZpZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgY3NwID0gXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQuY2xvdWRTdG9yYWdlLnByb3ZpZGVyJywgJ2F6dXJlJyk7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3QgdXBsb2FkZXJMaWIgPSBuZXcgU3VuYmlyZEZpbGVVcGxvYWRMaWIuRmlsZVVwbG9hZGVyKCk7XG4gICAgICB1cGxvYWRlckxpYi51cGxvYWQoeyB1cmw6IHNpZ25lZFVSTCwgZmlsZSwgY3NwIH0pXG4gICAgICAub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7IGVycm9yTXNnOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWcsICdtZXNzYWdlcy5lcnJvci4wMTgnKX07XG4gICAgICAgIHRoaXMuaXNDbG9zYWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZXJyb3JDc3ZTdGF0dXMgPSB0cnVlO1xuICAgICAgICB0aGlzLnNob3dDc3ZWYWxpZGF0aW9uU3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3JDc3ZNZXNzYWdlID0gXy5nZXQoZXJyb3IsICdlcnJvci5wYXJhbXMuZXJybXNnJykgfHwgZXJySW5mby5lcnJvck1zZztcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyb3IsIGVyckluZm8pKTtcbiAgICAgIH0pLm9uKCdjb21wbGV0ZWQnLCAoY29tcGxldGVkKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoY29tcGxldGVkKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHZhbGlkYXRlQ1NWRmlsZSgpIHtcbiAgICB0aGlzLnNob3dDc3ZWYWxpZGF0aW9uU3RhdHVzID0gdHJ1ZTtcbiAgICB0aGlzLnVwbG9hZENTVkZpbGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzVXBsb2FkQ3N2RW5hYmxlID0gZmFsc2U7XG4gICAgdGhpcy5pc0Nsb3NhYmxlID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVDU1ZGaWxlID0gZmFsc2U7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgZmlsZU5hbWU6IHRoaXMuZmlsZU5hbWVcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5nZW5lcmF0ZVByZVNpZ25lZFVybChyZXF1ZXN0LCB0aGlzLmNvbGxlY3Rpb25JZCwgJ2hpZXJhcmNoeScpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgY29uc3QgZXJySW5mbyA9IHsgZXJyb3JNc2c6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS5sYWJlbENvbmZpZywgJ21lc3NhZ2VzLmVycm9yLjAyNicpIH07XG4gICAgICB0aGlzLmlzQ2xvc2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5lcnJvckNzdlN0YXR1cyA9IHRydWU7XG4gICAgICB0aGlzLnNob3dDc3ZWYWxpZGF0aW9uU3RhdHVzID0gZmFsc2U7XG4gICAgICB0aGlzLmVycm9yQ3N2TWVzc2FnZSA9IF8uZ2V0KGVyciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKSB8fCBlcnJJbmZvLmVycm9yTXNnO1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKSk7XG4gICAgfSkpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25lZFVSTCA9IF8uZ2V0KHJlc3BvbnNlLnJlc3VsdCwgJ3ByZV9zaWduZWRfdXJsJyk7XG4gICAgICBsZXQgYmxvYkNvbmZpZyA9IHtcbiAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLFxuICAgICAgICBjb250ZW50VHlwZTogJ3RleHQvY3N2J1xuICAgICAgfTtcbiAgICAgIGJsb2JDb25maWcgPSB0aGlzLmVkaXRvclNlcnZpY2UuYXBwZW5kQ2xvdWRTdG9yYWdlSGVhZGVycyhibG9iQ29uZmlnKTtcbiAgICAgIHRoaXMudXBsb2FkVG9CbG9iKHNpZ25lZFVSTCwgdGhpcy5maWxlLCBibG9iQ29uZmlnKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlVVJMID0gc2lnbmVkVVJMLnNwbGl0KCc/JylbMF07XG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudFdpdGhVUkwoZmlsZVVSTCwgdGhpcy5maWxlLnR5cGUsIHRoaXMuY29sbGVjdGlvbklkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCI8c3VpLW1vZGFsICBbbXVzdFNjcm9sbF09XCJ0cnVlXCIgW2lzQ2xvc2FibGVdPVwiaXNDbG9zYWJsZVwiIFt0cmFuc2l0aW9uRHVyYXRpb25dPVwiMFwiIFtzaXplXT1cIidub3JtYWwnXCJcbiAgICBjbGFzcz1cInNiLW1vZGFsIGJ4LW5vbmUgb3ZlcmZsb3ctbW9kYWxcIiBhcHBCb2R5U2Nyb2xsIChkaXNtaXNzZWQpPVwiY2xvc2VIaWVyYXJjaHlNb2RhbChtb2RhbClcIiAjbW9kYWw+XG4gICAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWhlYWRlclwiPlxuICAgICA8c3BhbiAqbmdJZj1cImlzQ3JlYXRlQ3N2XCI+IHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5jcmVhdGVIaWVyYXJjaHlDc3Z9fSA8L3NwYW4+XG4gICAgIDxzcGFuICpuZ0lmPVwiIWlzQ3JlYXRlQ3N2XCI+IHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy51cGxvYWRVcGRhdGVDU1Z9fTwvc3Bhbj4gIFxuXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWNvbnRlbnRcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDwhLS0gdXBsb2FkIGNzdiBmaWxlICAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiICpuZ0lmPVwidXBsb2FkQ1NWRmlsZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwbC0yMCBwdC0yMCBkLWJsb2NrIHctNTBcIj5cbiAgICAgICAgICAgIDxwPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5kb3dubG9hZFNhbXBsZUhpZXJhcmNoeUNTdn19IDwvcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1jb2xvci1ncmF5LTIwMCBmcy0wLTc4NVwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5tYWtlU3VyZUZpbGV9fSA8L2Rpdj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInVpIG9yZGVyZWQgbGlzdCBzYi1kb2NrLW9yZGVyZWQtbGlzdCBtdC0xNVwiPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJpdGVtXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmFsbENvbHVtbnNBcmVBdmFpbGFibGV9fTwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cIml0ZW1cIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uaGFzQWxsTWFuZGF0b3J5Q29sdW1ufX08L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJpdGVtXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/Lm5vRHVwbGljYXRlUm93fX08L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDxhIHRhcmdldD1cIl9ibGFua1wiICAoY2xpY2spPVwiZG93bmxvYWRTYW1wbGVDU1ZGaWxlKClcIlxuICAgICAgICAgICAgICBjbGFzcz1cInNiLWJ0biBzYi1idG4tbm9ybWFsIHNiLWJ0bi1vdXRsaW5lLXByaW1hcnkgbXktMjAgdGV4dC1kZWNvci1ub25lIHNiLWNvbG9yLXByaW1hcnlcIj48aVxuICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIiAgY2xhc3M9XCJmYSBmYS1kb3dubG9hZCBwci0xMFwiPjwvaT57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uZG93bmxvYWRTYW1wbGVDU1Z9fTwvYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0xMCB3LTYwIHRleHQtY2VudGVyIHNiLWJnLWNvbG9yLXByaW1hcnktMCBzYi1ici1wcmltYXJ5XCI+XG4gICAgICAgICAgICA8aW1nIHNyYz1cIi4uLy4uL2Fzc2V0cy9pbWFnZXMvYnVsa3VwbG9hZGZpbGUucG5nXCIgYWx0PVwiXCIgY2xhc3M9XCJ3LTIwIHBiLTEwXCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwicXEtdXBsb2FkLWFjdGlvbnNcIiBjbGFzcz1cInVwbG9hZC1maWxlLWRlc2NyaXB0aW9uIGQtZmxleCBmbGV4LWFpLWNlbnRlciBmbGV4LWRjXCI+XG4gICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTggc2ItY29sb3ItZ3JheS00MDBcIj5cbiAgICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uZHJhZ0FuZERyb3BDU1Z9fSA8YnIgLz5cbiAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgICAgPGg2IGNsYXNzPVwibWItOCBzYi1jb2xvci1ncmF5LTQwMCBtdC0xMFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5Pcn19PC9oNj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInVwbG9hZC1pbnB1dC1idXR0b24gc2ItYnRuIHNiLWJ0bi1zdWNjZXNzIHNiLWJ0bi1ub3JtYWxcIlxuICAgICAgICAgICAgICBsaWJUZWxlbWV0cnlJbnRlcmFjdFxuICAgICAgICAgICAgICBbdGVsZW1ldHJ5SW50ZXJhY3RFZGF0YV09XCJ0ZWxlbWV0cnlTZXJ2aWNlLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ3NlbGVjdF9jc3ZfdXBsb2FkJywnY2xpY2snLGNvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc2VsZWN0RmlsZVRvVXBsb2FkLFxuICAgICAgICAgICAgICAgdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeVBhZ2VJZCwge2tleTogJ2lkZW50aWZpZXInLCB2YWx1ZTogY29sbGVjdGlvbklkfSlcIlxuICAgICAgICAgICAgICA+PGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJpY29uIHVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc2VsZWN0RmlsZVRvVXBsb2FkfX0gIFxuICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cInVwbG9hZENTVigkZXZlbnQpXCIgYWNjZXB0PVwiLmNzdlwiIHR5cGU9XCJmaWxlXCIgPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzYi1jb2xvci1ncmF5LTIwMCBmcy0wLTc4NVwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy51cGxvYWRFbnRyaWVzfX08L3A+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2ItY29sb3ItcHJpbWFyeSBmcy0wLTc4NVwiICpuZ0lmPVwiZmlsZU5hbWVcIj57e2ZpbGVOYW1lfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj4gIFxuICAgICAgICA8IS0tIHVwZGF0ZSBjc3YgZmlsZSAgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLTIwICB0ZXh0LWNlbnRlciBzYi1iZy1jb2xvci1wcmltYXJ5LTAgc2ItYnItcHJpbWFyeVwiICpuZ0lmPVwidXBkYXRlQ1NWRmlsZVwiPlxuICAgICAgICAgIDxpbWcgc3JjPVwiLi4vLi4vYXNzZXRzL2ltYWdlcy9idWxrdXBsb2FkZmlsZS5wbmdcIiBhbHQ9XCJcIiBjbGFzcz1cInctMTAgcGItMTBcIj5cbiAgICAgICAgICA8ZGl2IGlkPVwicXEtdXBsb2FkLWFjdGlvbnNcIiBjbGFzcz1cInVwbG9hZC1maWxlLWRlc2NyaXB0aW9uIGQtZmxleCBmbGV4LWFpLWNlbnRlciBmbGV4LWRjXCI+XG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi04IHNiLWNvbG9yLWdyYXktNDAwXCI+XG4gICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uZHJhZ0FuZERyb3BDU1Z9fTxiciAvPlxuICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgIDxoNiBjbGFzcz1cIm1iLTggc2ItY29sb3ItZ3JheS00MDAgbXQtMTBcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uT3J9fTwvaDY+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidXBsb2FkLWlucHV0LWJ1dHRvbiBzYi1idG4gc2ItYnRuLXN1Y2Nlc3Mgc2ItYnRuLW5vcm1hbFwiXG4gICAgICAgICAgICBsaWJUZWxlbWV0cnlJbnRlcmFjdFxuICAgICAgICAgICAgW3RlbGVtZXRyeUludGVyYWN0RWRhdGFdPVwidGVsZW1ldHJ5U2VydmljZS5nZXRUZWxlbWV0cnlJbnRlcmFjdEVkYXRhKCdzZWxlY3RfY3N2X3VwZGF0ZScsJ2NsaWNrJyxjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnNlbGVjdEZpbGVUb1VwbG9hZCxcbiAgICAgICAgICAgICB0aGlzLnRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkLCB7a2V5OiAnaWRlbnRpZmllcicsIHZhbHVlOiBjb2xsZWN0aW9uSWR9KVwiXG4gICAgICAgICAgICA+PGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJpY29uIHVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnNlbGVjdEZpbGVUb1VwbG9hZH19ICBcbiAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwidXBsb2FkQ1NWKCRldmVudClcIiBhY2NlcHQ9XCIuY3N2XCIgdHlwZT1cImZpbGVcIiA+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic2ItY29sb3ItZ3JheS0yMDAgZnMtMC03ODVcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udXBsb2FkRW50cmllc319PC9wPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYi1jb2xvci1wcmltYXJ5ICBmcy0wLTc4NVwiICpuZ0lmPVwiZmlsZU5hbWVcIj57e2ZpbGVOYW1lfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwidXBkYXRlQ1NWRmlsZVwiIGNsYXNzPVwicHktMjBcIj48aSBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImljb24gaW5mbyBjaXJjbGUgcHItMTAgc2ItY29sb3ItZ3JheS0yMDBcIj48L2k+IFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYi1jb2xvci1ncmF5LTIwMCBmcy0wLTc4NVwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5jc3ZEb3dubG9hZEluc3RydWN0aW9ufX08L3NwYW4+PC9kaXY+XG4gICAgICAgIDwhLS0gVmFsaWRhdGlvbiBtZXNzYWdlICAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBzYi1taW4taC0yNTAgZmxleC1haS1jZW50ZXIgbW4tMTUgc2ItYmctY29sb3ItcHJpbWFyeS0wXCIgKm5nSWY9XCJzaG93Q3N2VmFsaWRhdGlvblN0YXR1c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW1nIHNyYz1cIi4uLy4uL2Fzc2V0cy9pbWFnZXMvYnVsa3VwbG9hZGZpbGUucG5nXCIgYWx0PVwiXCIgY2xhc3M9XCJ3LTMwXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBvcy1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYi1sb2FkZXIgc2Itc3VjY2Vzcy1sb2FkZXJcIj48L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC13ZWlnaHQtYm9sZCBtYi0xMFwiPlxuICAgICAgICAgICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnBsZWFzZVdhaXR9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiLWNvbG9yLWdyYXktNDAwIFwiPiB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udmFsaWRhdGVDc3ZGaWxlfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBWYWxpZGF0aW9uIGZhaWxlZCBtZXNzYWdlID0gNCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBzYi1taW4taC0yNTAgZmxleC1haS1jZW50ZXJcIiAqbmdJZj1cImVycm9yQ3N2U3RhdHVzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInctNTAgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vLi4vYXNzZXRzL2ltYWdlcy9idWxrdXBsb2FkZmlsZS5wbmdcIiBhbHQ9XCJcIiBjbGFzcz1cInctMzBcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInctNTBcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlIHByLTUgc2ItY29sb3ItZXJyb3IgcHItMTBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+IHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5oaWVyYXJjaHlWYWxpZGF0aW9uRXJyb3J9fVxuICAgICAgICAgPGRpdiBjbGFzcz1cInNiLWNvbG9yLWdyYXktMjAwIHB0LTIwIGZzLTAtNzg1XCI+IHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5mb2xsb3dpbmdFcnJvcnN9fTwvZGl2PlxuICAgICAgICAgIDx1bCBjbGFzcz1cIm10LTE1IHNiLWNpcmNsZS11bFwiPlxuICAgICAgICAgICAgPGxpIGNsYXNzPVwiaXRlbVwiICpuZ0Zvcj1cImxldCBlcnJvciBvZiBlcnJvckNzdk1lc3NhZ2VcIj57e2Vycm9yfX08L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInFxLXVwbG9hZC1idXR0b24tc2VsZWN0b3Igc2ItYnRuIHNiLWJ0bi1ub3JtYWwgc2ItYnRuLXN1Y2Nlc3MgbXktMjBcIiBcbiAgICAgICAgICBsaWJUZWxlbWV0cnlJbnRlcmFjdFxuICAgICAgICAgIFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgnc2VsZWN0X2Nzdl9yZXVwbG9hZCcsJ2NsaWNrJyxjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnJlVXBsb2FkQ1NWLFxuICAgICAgICAgICB0aGlzLnRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkLCB7a2V5OiAnaWRlbnRpZmllcicsIHZhbHVlOiBjb2xsZWN0aW9uSWR9KVwiXG4gICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrUmV1cGxvYWQoKVwiPlxuICAgICAgICAgICAgPGRpdj48aSBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImljb24gcmVmcmVzaFwiPjwvaT57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ucmVVcGxvYWRDU1Z9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHNiLWJnLWNvbG9yLXN1Y2Nlc3MtMCBwLTEwIHNiLW1pbi1oLTI1MCBtbi0xNVwiICpuZ0lmPVwic2hvd1N1Y2Nlc3NDc3ZcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInctNTAgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8aW1nIHNyYz1cIi4uLy4uL2Fzc2V0cy9pbWFnZXMvYnVsa3VwbG9hZGZpbGUucG5nXCIgYWx0PVwiXCIgY2xhc3M9XCJ3LTMwXCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInctNTAgZmxleC1haS1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbiBjaGVjayBjaXJjbGUgb3V0bGluZSBzYi1jb2xvci1zdWNjZXNzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzQ3JlYXRlQ3N2XCIgY2xhc3M9XCJmcy0wLTkyXCI+IHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5oaWVyYXJjaHlBZGRlZH19IDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ3JlYXRlQ3N2XCIgY2xhc3M9XCJmcy0wLTkyXCI+IHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5oaWVyYXJjaHlVcGRhdGVkfX0gPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1hY3Rpb25zXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWwgXCIgXG4gICAgICBsaWJUZWxlbWV0cnlJbnRlcmFjdFxuICAgICAgW3RlbGVtZXRyeUludGVyYWN0RWRhdGFdPVwidGVsZW1ldHJ5U2VydmljZS5nZXRUZWxlbWV0cnlJbnRlcmFjdEVkYXRhKCdjbG9zZV9wb3B1cCcsJ2NsaWNrJyxjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5jbG9zZV9idG5fbGFiZWwsXG4gICAgICAgdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeVBhZ2VJZCwge2tleTogJ2lkZW50aWZpZXInLCB2YWx1ZTogY29sbGVjdGlvbklkfSlcIlxuICAgICAgKGNsaWNrKT1cImNsb3NlSGllcmFyY2h5TW9kYWwobW9kYWwpXCJbZGlzYWJsZWRdPVwiIWlzQ2xvc2FibGVcIiBcbiAgICAgIFtuZ0NsYXNzXT1cInsnc2ItYnRuLXByaW1hcnknOiBpc0Nsb3NhYmxlLCAnc2ItYnRuLWRpc2FibGVkJzogIWlzQ2xvc2FibGV9XCIgPlxuICAgICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5jbG9zZV9idG5fbGFiZWx9fVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWwgXCJcbiAgICAgIGxpYlRlbGVtZXRyeUludGVyYWN0XG4gICAgICBbdGVsZW1ldHJ5SW50ZXJhY3RFZGF0YV09XCJ0ZWxlbWV0cnlTZXJ2aWNlLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ2Nzdl91cGxvYWQnLCdjbGljaycsY29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8ubmV4dF9idG5fbGFiZWwsXG4gICAgICAgdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeVBhZ2VJZCwge2tleTogJ2lkZW50aWZpZXInLCB2YWx1ZTogY29sbGVjdGlvbklkfSlcIlxuICAgICAgKGNsaWNrKT1cInZhbGlkYXRlQ1NWRmlsZSgpXCJbZGlzYWJsZWRdPVwiIWlzVXBsb2FkQ3N2RW5hYmxlXCIgXG4gICAgICBbbmdDbGFzc109XCJ7J3NiLWJ0bi1wcmltYXJ5JzogaXNVcGxvYWRDc3ZFbmFibGUsICdzYi1idG4tZGlzYWJsZWQnOiAhaXNVcGxvYWRDc3ZFbmFibGV9XCIgPlxuICAgICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5uZXh0X2J0bl9sYWJlbH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvc3VpLW1vZGFsPiJdfQ==
@@ -0,0 +1,182 @@
1
+ import { Component } from '@angular/core';
2
+ import { FormControl, Validators } from '@angular/forms';
3
+ import * as _ from 'lodash-es';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../services/telemetry/telemetry.service";
6
+ import * as i2 from "../../services/tree/tree.service";
7
+ import * as i3 from "../../services/dialcode/dialcode.service";
8
+ import * as i4 from "../../services/toaster/toaster.service";
9
+ import * as i5 from "@angular/common/http";
10
+ import * as i6 from "../../services/config/config.service";
11
+ import * as i7 from "../../services/editor/editor.service";
12
+ import * as i8 from "@angular/common";
13
+ import * as i9 from "@angular/forms";
14
+ import * as i10 from "@project-sunbird/ng2-semantic-ui";
15
+ import * as i11 from "../../directives/telemetry-interact/telemetry-interact.directive";
16
+ export class DialcodeComponent {
17
+ constructor(telemetryService, treeService, dialcodeService, toasterService, httpClient, configService, editorService) {
18
+ this.telemetryService = telemetryService;
19
+ this.treeService = treeService;
20
+ this.dialcodeService = dialcodeService;
21
+ this.toasterService = toasterService;
22
+ this.httpClient = httpClient;
23
+ this.configService = configService;
24
+ this.editorService = editorService;
25
+ this.minQRCode = 2;
26
+ this.maxQRCode = 250;
27
+ this.qrCodeCount = {
28
+ request: 0,
29
+ reserve: 0
30
+ };
31
+ this.disableQRDownloadBtn = false;
32
+ this.disableQRGenerateBtn = true;
33
+ this.isGeneratingQRCodes = false;
34
+ this.showQRCodePopup = false;
35
+ }
36
+ ngOnInit() {
37
+ this.setQRCodeCriteria();
38
+ this.treeStatusListener();
39
+ }
40
+ setQRCodeCriteria() {
41
+ if (_.has(this.treeService.config, 'dialcodeMinLength')) {
42
+ this.minQRCode = _.get(this.treeService.config, 'dialcodeMinLength');
43
+ }
44
+ if (_.has(this.treeService.config, 'dialcodeMaxLength')) {
45
+ this.maxQRCode = _.get(this.treeService.config, 'dialcodeMaxLength');
46
+ }
47
+ this.dialcodeControl = new FormControl('', [Validators.required, Validators.max(this.maxQRCode), this.customDialcodeValidator()]);
48
+ }
49
+ treeStatusListener() {
50
+ this.treeService.treeStatus$.subscribe((status) => {
51
+ if (status === 'loaded') {
52
+ this.resolveQRDownloadBtn();
53
+ this.doQRCodeCount();
54
+ this.contentId = _.get(this.contentMetadata, 'identifier');
55
+ }
56
+ else if (status === 'saved') {
57
+ this.doQRCodeCount();
58
+ this.disableQRGenerateBtn = true;
59
+ }
60
+ else {
61
+ this.disableQRGenerateBtn = false;
62
+ }
63
+ });
64
+ }
65
+ resolveQRDownloadBtn() {
66
+ this.disableQRDownloadBtn = _.has(this.contentMetadata, 'qrCodeProcessId') ? true : false;
67
+ }
68
+ doQRCodeCount() {
69
+ this.qrCodeCount.request = 0;
70
+ const rootNode = this.treeService.getTreeObject();
71
+ this.qrCodeCount.reserve = (this.contentMetadata.reservedDialcodes) ? _.size(this.contentMetadata.reservedDialcodes) : 0;
72
+ rootNode.visit((node) => {
73
+ if (node.data.metadata.dialcodeRequired === 'Yes') {
74
+ this.qrCodeCount.request += 1;
75
+ }
76
+ });
77
+ }
78
+ openRequestPopup() {
79
+ if (this.qrCodeCount.request > 0) {
80
+ this.reserveDialCode(this.qrCodeCount.request + 1);
81
+ }
82
+ else {
83
+ const requestNumber = this.qrCodeCount.reserve > 0 ? this.qrCodeCount.reserve : '';
84
+ this.dialcodeControl.setValue(requestNumber);
85
+ this.showQRCodePopup = true;
86
+ }
87
+ }
88
+ submitDialcodeForm() {
89
+ this.showQRCodePopup = false;
90
+ this.reserveDialCode(this.dialcodeControl.value);
91
+ }
92
+ reserveDialCode(requestCount) {
93
+ this.isGeneratingQRCodes = true;
94
+ this.qrCodeCount.request = _.cloneDeep(requestCount);
95
+ this.dialcodeService.reserveDialCode(this.contentId, requestCount).subscribe((res) => {
96
+ const rootNodeMetdata = this.contentMetadata;
97
+ rootNodeMetdata.reservedDialcodes = res.result.reservedDialcodes;
98
+ rootNodeMetdata.qrCodeProcessId = res.result.processId;
99
+ this.qrCodeProcessId = res.result.processId;
100
+ this.isGeneratingQRCodes = false;
101
+ this.doQRCodeCount();
102
+ this.resolveQRDownloadBtn();
103
+ this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.010'));
104
+ }, (err) => {
105
+ this.isGeneratingQRCodes = false;
106
+ const errResponse = (err.error.result) ? err.error.result : undefined;
107
+ if (!_.isEmpty(errResponse) && errResponse.hasOwnProperty('count')) {
108
+ if (errResponse.count >= this.qrCodeCount.request) {
109
+ this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.013'));
110
+ }
111
+ }
112
+ else {
113
+ this.toasterService.error(err.error.params.errmsg);
114
+ }
115
+ });
116
+ }
117
+ downloadQRCodes() {
118
+ this.qrCodeProcessId = _.get(this.contentMetadata, 'qrCodeProcessId');
119
+ this.dialcodeService.downloadQRCode(this.qrCodeProcessId).subscribe((res) => {
120
+ const response = res.result;
121
+ if (response && response.hasOwnProperty('status')) {
122
+ if (response.status === 'in-process') {
123
+ this.toasterService.info(_.get(this.configService, 'labelConfig.messages.info.001'));
124
+ }
125
+ else if (response.status === 'completed') {
126
+ const filepath = response.url;
127
+ const pattern = new RegExp('([0-9])+(?=.[.zip])');
128
+ const timeStamp = filepath.match(pattern);
129
+ const contentName = _.get(this.contentMetadata, 'name');
130
+ const categoryName = (contentName.split(' ')).join('_').toLowerCase();
131
+ const filename = `${this.contentId}_${categoryName}_${timeStamp[0]}.zip`;
132
+ this.downloadFile(filepath, filename);
133
+ }
134
+ }
135
+ }, (err) => {
136
+ this.toasterService.error(err.error.params.errmsg);
137
+ });
138
+ }
139
+ get contentMetadata() {
140
+ const rootNode = this.treeService.getFirstChild();
141
+ return _.get(rootNode, 'data.metadata');
142
+ }
143
+ downloadFile(url, filename) {
144
+ const config = {
145
+ blobUrl: url,
146
+ successMessage: _.get(this.configService, 'labelConfig.messages.success.011'),
147
+ fileType: 'zip',
148
+ fileName: filename
149
+ };
150
+ this.editorService.downloadBlobUrlFile(config);
151
+ }
152
+ keyPressNumbers(event) {
153
+ const pattern = /^([0-9])$/;
154
+ if (!pattern.test(event.key)) {
155
+ event.preventDefault();
156
+ return false;
157
+ }
158
+ return true;
159
+ }
160
+ customDialcodeValidator() {
161
+ return (control) => {
162
+ if (control.value === null || control.value === '') {
163
+ return null;
164
+ }
165
+ const inputValue = +control.value;
166
+ if (this.qrCodeCount.reserve === 0 && inputValue < this.minQRCode) {
167
+ return { minErr: _.replace(_.get(this.configService, 'labelConfig.messages.error.014'), '{number}', this.minQRCode) };
168
+ }
169
+ if (this.qrCodeCount.reserve > 0 && inputValue <= this.qrCodeCount.reserve) {
170
+ return { gteErr: _.replace(_.get(this.configService, 'labelConfig.messages.error.015'), '{number}', this.qrCodeCount.reserve) };
171
+ }
172
+ return null;
173
+ };
174
+ }
175
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DialcodeComponent, deps: [{ token: i1.EditorTelemetryService }, { token: i2.TreeService }, { token: i3.DialcodeService }, { token: i4.ToasterService }, { token: i5.HttpClient }, { token: i6.ConfigService }, { token: i7.EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
176
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DialcodeComponent, selector: "lib-dialcode", ngImport: i0, template: "<a class=\"fs-0-785 sb-color-primary font-weight-bold\"><i class=\"icon qrcode\"></i>QR Code </a>\n<a class=\"profile-avtar computer only p-0 pr-10\" tabindex=\"0\">\n <div suiDropdown class=\"ui dropdown right top pointing\" id=\"dropdown-menu-list-header\">\n <i class=\"icon caret down\"></i>\n <div class=\"menu\" suiDropdownMenu>\n <a class=\"item fs-0-785\"\n [ngClass]=\"(!disableQRGenerateBtn || (qrCodeCount.request > 0 && qrCodeCount.request + 1 <= qrCodeCount.reserve) || isGeneratingQRCodes ) ? 'sb-disabled' : ' '\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('generate_qr_codes','click','launch', telemetryService.telemetryPageId)\">\n <i class=\"icon qrcode\"></i>\n <span *ngIf=\"!isGeneratingQRCodes\" class=\"text\" (click)=\"openRequestPopup();\">\n Generate {{(qrCodeCount.request > 0 && qrCodeCount.request+1 > qrCodeCount.reserve)? qrCodeCount.request + ' +\n 1' : (qrCodeCount.reserve > 0) ? qrCodeCount.reserve-1 +' + 1' : '' }} QR Codes\n </span>\n <span *ngIf=\"isGeneratingQRCodes\" class=\"text\">Generating {{(qrCodeCount.request > 0 )? qrCodeCount.request-1 + ' +\n 1' :'' }} QR codes</span> \n </a>\n <div class=\"ui divider\"></div>\n <a class=\"item fs-0-785\" (click)=\"downloadQRCodes();\" [ngClass]=\"!disableQRDownloadBtn ? 'sb-disabled' : ''\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('download_qr_codes','click','launch', telemetryService.telemetryPageId)\">\n <i class=\"icon download\"></i> \n Download {{(qrCodeCount.reserve > 1) ? qrCodeCount.reserve-1 + ' +1' : ''}} QR codes\n </a>\n </div>\n </div>\n</a>\n<div class=\"seperator pr-20\"></div>\n\n<sui-modal *ngIf=\"showQRCodePopup\" [mustScroll]=\"true\" [isClosable]=\"true\" [transitionDuration]=\"0\" [size]=\"'small'\"\n class=\"sb-modal bx-none overflow-modal dialcodeModal\" appBodyScroll (dismissed)=\"showQRCodePopup = !showQRCodePopup\" #modal>\n <div class=\"sb-modal-header\">\n {{configService.labelConfig?.lbl?.requestForQrCode}}\n </div>\n <div class=\"sb-modal-content\">\n <div class=\"d-flex flex-jc-space-between p-20\">\n <div class=\"sb-field-group w-70\">\n <div class=\"sb-field\">\n <input type=\"number\" (keypress)=\"keyPressNumbers($event)\" pattern=\"[0-9]*\" inputmode=\"numeric\" [formControl]=\"dialcodeControl\" \n [ngClass]=\"dialcodeControl.errors ? 'sb-color-error' : '' \" class=\"sb-form-control p-5 w-100\" placeholder=\"e.g. 45\">\n <div *ngIf=\"dialcodeControl.invalid\">\n <small class=\"sb-color-error pt-10 d-block\" *ngIf=\"dialcodeControl.errors.max\">\n {{configService.labelConfig?.lbl?.numberToolarge}}\n </small>\n <small class=\"sb-color-error pt-10 d-block\" *ngIf=\"dialcodeControl.errors.minErr\">\n {{dialcodeControl.errors.minErr}}\n </small>\n <small class=\"sb-color-error pt-10 d-block\" *ngIf=\"dialcodeControl.errors.gteErr\">\n {{dialcodeControl.errors.gteErr}}\n </small>\n </div>\n </div>\n </div>\n \n <button class=\"sb-btn sb-btn-normal sb-btn-primary\" [ngClass]=\"dialcodeControl.valid ? '': 'sb-btn-request-disabled'\" \n [disabled]=\"!dialcodeControl.valid\" (click)=\"submitDialcodeForm();\" >{{configService.labelConfig?.button_labels?.request_btn_label}}</button>\n </div>\n </div>\n</sui-modal>", styles: [".seperator{border-left:solid 1px #ccc;height:20px}.profile-avtar .dropdown .menu{z-index:99999}.sb-btn-request-disabled{background-color:var(--white);color:#999!important;border:1px solid #cccccc;cursor:default;font-weight:400}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i9.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i10.SuiDropdown, selector: "[suiDropdown]", inputs: ["isOpen", "isDisabled", "tabindex", "autoClose"], outputs: ["isOpenChange"] }, { kind: "directive", type: i10.SuiDropdownMenu, selector: "[suiDropdownMenu]", inputs: ["menuTransition", "menuTransitionDuration", "menuAutoSelectFirst", "menuSelectedItemClass"] }, { kind: "directive", type: i10.SuiDropdownMenuItem, selector: ".item" }, { kind: "component", type: i10.SuiModal, selector: "sui-modal", inputs: ["isClosable", "closeResult", "size", "isCentered", "isFullScreen", "isBasic", "mustScroll", "isInverted", "transition", "transitionDuration"], outputs: ["approved", "denied", "dismissed"] }, { kind: "directive", type: i11.TelemetryInteractDirective, selector: "[libTelemetryInteract]", inputs: ["telemetryInteractEdata"] }] }); }
177
+ }
178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DialcodeComponent, decorators: [{
179
+ type: Component,
180
+ args: [{ selector: 'lib-dialcode', template: "<a class=\"fs-0-785 sb-color-primary font-weight-bold\"><i class=\"icon qrcode\"></i>QR Code </a>\n<a class=\"profile-avtar computer only p-0 pr-10\" tabindex=\"0\">\n <div suiDropdown class=\"ui dropdown right top pointing\" id=\"dropdown-menu-list-header\">\n <i class=\"icon caret down\"></i>\n <div class=\"menu\" suiDropdownMenu>\n <a class=\"item fs-0-785\"\n [ngClass]=\"(!disableQRGenerateBtn || (qrCodeCount.request > 0 && qrCodeCount.request + 1 <= qrCodeCount.reserve) || isGeneratingQRCodes ) ? 'sb-disabled' : ' '\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('generate_qr_codes','click','launch', telemetryService.telemetryPageId)\">\n <i class=\"icon qrcode\"></i>\n <span *ngIf=\"!isGeneratingQRCodes\" class=\"text\" (click)=\"openRequestPopup();\">\n Generate {{(qrCodeCount.request > 0 && qrCodeCount.request+1 > qrCodeCount.reserve)? qrCodeCount.request + ' +\n 1' : (qrCodeCount.reserve > 0) ? qrCodeCount.reserve-1 +' + 1' : '' }} QR Codes\n </span>\n <span *ngIf=\"isGeneratingQRCodes\" class=\"text\">Generating {{(qrCodeCount.request > 0 )? qrCodeCount.request-1 + ' +\n 1' :'' }} QR codes</span> \n </a>\n <div class=\"ui divider\"></div>\n <a class=\"item fs-0-785\" (click)=\"downloadQRCodes();\" [ngClass]=\"!disableQRDownloadBtn ? 'sb-disabled' : ''\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('download_qr_codes','click','launch', telemetryService.telemetryPageId)\">\n <i class=\"icon download\"></i> \n Download {{(qrCodeCount.reserve > 1) ? qrCodeCount.reserve-1 + ' +1' : ''}} QR codes\n </a>\n </div>\n </div>\n</a>\n<div class=\"seperator pr-20\"></div>\n\n<sui-modal *ngIf=\"showQRCodePopup\" [mustScroll]=\"true\" [isClosable]=\"true\" [transitionDuration]=\"0\" [size]=\"'small'\"\n class=\"sb-modal bx-none overflow-modal dialcodeModal\" appBodyScroll (dismissed)=\"showQRCodePopup = !showQRCodePopup\" #modal>\n <div class=\"sb-modal-header\">\n {{configService.labelConfig?.lbl?.requestForQrCode}}\n </div>\n <div class=\"sb-modal-content\">\n <div class=\"d-flex flex-jc-space-between p-20\">\n <div class=\"sb-field-group w-70\">\n <div class=\"sb-field\">\n <input type=\"number\" (keypress)=\"keyPressNumbers($event)\" pattern=\"[0-9]*\" inputmode=\"numeric\" [formControl]=\"dialcodeControl\" \n [ngClass]=\"dialcodeControl.errors ? 'sb-color-error' : '' \" class=\"sb-form-control p-5 w-100\" placeholder=\"e.g. 45\">\n <div *ngIf=\"dialcodeControl.invalid\">\n <small class=\"sb-color-error pt-10 d-block\" *ngIf=\"dialcodeControl.errors.max\">\n {{configService.labelConfig?.lbl?.numberToolarge}}\n </small>\n <small class=\"sb-color-error pt-10 d-block\" *ngIf=\"dialcodeControl.errors.minErr\">\n {{dialcodeControl.errors.minErr}}\n </small>\n <small class=\"sb-color-error pt-10 d-block\" *ngIf=\"dialcodeControl.errors.gteErr\">\n {{dialcodeControl.errors.gteErr}}\n </small>\n </div>\n </div>\n </div>\n \n <button class=\"sb-btn sb-btn-normal sb-btn-primary\" [ngClass]=\"dialcodeControl.valid ? '': 'sb-btn-request-disabled'\" \n [disabled]=\"!dialcodeControl.valid\" (click)=\"submitDialcodeForm();\" >{{configService.labelConfig?.button_labels?.request_btn_label}}</button>\n </div>\n </div>\n</sui-modal>", styles: [".seperator{border-left:solid 1px #ccc;height:20px}.profile-avtar .dropdown .menu{z-index:99999}.sb-btn-request-disabled{background-color:var(--white);color:#999!important;border:1px solid #cccccc;cursor:default;font-weight:400}\n"] }]
181
+ }], ctorParameters: function () { return [{ type: i1.EditorTelemetryService }, { type: i2.TreeService }, { type: i3.DialcodeService }, { type: i4.ToasterService }, { type: i5.HttpClient }, { type: i6.ConfigService }, { type: i7.EditorService }]; } });
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbGNvZGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvZGlhbGNvZGUvZGlhbGNvZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvZGlhbGNvZGUvZGlhbGNvZGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQW1CLFdBQVcsRUFBaUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekcsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFjL0IsTUFBTSxPQUFPLGlCQUFpQjtJQWM1QixZQUFtQixnQkFBd0MsRUFBVSxXQUF3QixFQUN6RSxlQUFnQyxFQUFVLGNBQThCLEVBQ3hFLFVBQXNCLEVBQVMsYUFBNEIsRUFDM0QsYUFBNEI7UUFIN0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF3QjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3pFLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUN4RSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDM0Qsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFoQnpDLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxjQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLGdCQUFXLEdBQStCO1lBQy9DLE9BQU8sRUFBRSxDQUFDO1lBQ1YsT0FBTyxFQUFFLENBQUM7U0FDWCxDQUFDO1FBQ0sseUJBQW9CLEdBQUcsS0FBSyxDQUFD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QyxPQUFPLEtBQUssQ0FBQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNqRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGdDQUFnQyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2FBQ3ZIO1lBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFO2dCQUMxRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGdDQUFnQyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzthQUNqSTtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO0lBQ0osQ0FBQzsrR0FuS1UsaUJBQWlCO21HQUFqQixpQkFBaUIsb0RDaEI5QiwyM0hBMERZOzs0RkQxQ0MsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRWRpdG9yVGVsZW1ldHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RlbGVtZXRyeS90ZWxlbWV0cnkuc2VydmljZSc7XG5pbXBvcnQgeyBUcmVlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyZWUvdHJlZS5zZXJ2aWNlJztcbmltcG9ydCB7IERpYWxjb2RlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RpYWxjb2RlL2RpYWxjb2RlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90b2FzdGVyL3RvYXN0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IEVkaXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lZGl0b3IvZWRpdG9yLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGlhbGNvZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGlhbGNvZGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kaWFsY29kZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERpYWxjb2RlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHVibGljIG1pblFSQ29kZSA9IDI7XG4gIHB1YmxpYyBtYXhRUkNvZGUgPSAyNTA7XG4gIHB1YmxpYyBxckNvZGVDb3VudDogeyBba2V5OiBzdHJpbmddOiBudW1iZXI7IH0gPSB7XG4gICAgcmVxdWVzdDogMCxcbiAgICByZXNlcnZlOiAwXG4gIH07XG4gIHB1YmxpYyBkaXNhYmxlUVJEb3dubG9hZEJ0biA9IGZhbHNlO1xuICBwdWJsaWMgZGlzYWJsZVFSR2VuZXJhdGVCdG4gPSB0cnVlO1xuICBwdWJsaWMgaXNHZW5lcmF0aW5nUVJDb2RlcyA9IGZhbHNlO1xuICBwdWJsaWMgc2hvd1FSQ29kZVBvcHVwID0gZmFsc2U7XG4gIHB1YmxpYyBxckNvZGVQcm9jZXNzSWQ6IHN0cmluZztcbiAgcHVibGljIGRpYWxjb2RlQ29udHJvbDogRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBjb250ZW50SWQ6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHVibGljIHRlbGVtZXRyeVNlcnZpY2U6IEVkaXRvclRlbGVtZXRyeVNlcnZpY2UsIHByaXZhdGUgdHJlZVNlcnZpY2U6IFRyZWVTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGRpYWxjb2RlU2VydmljZTogRGlhbGNvZGVTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBwdWJsaWMgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBlZGl0b3JTZXJ2aWNlOiBFZGl0b3JTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldFFSQ29kZUNyaXRlcmlhKCk7XG4gICAgdGhpcy50cmVlU3RhdHVzTGlzdGVuZXIoKTtcbiAgfVxuXG4gIHNldFFSQ29kZUNyaXRlcmlhKCkge1xuICAgIGlmIChfLmhhcyh0aGlzLnRyZWVTZXJ2aWNlLmNvbmZpZywgJ2RpYWxjb2RlTWluTGVuZ3RoJykpIHtcbiAgICAgIHRoaXMubWluUVJDb2RlID0gXy5nZXQodGhpcy50cmVlU2VydmljZS5jb25maWcsICdkaWFsY29kZU1pbkxlbmd0aCcpO1xuICAgIH1cbiAgICBpZiAoXy5oYXModGhpcy50cmVlU2VydmljZS5jb25maWcsICdkaWFsY29kZU1heExlbmd0aCcpKSB7XG4gICAgICB0aGlzLm1heFFSQ29kZSA9IF8uZ2V0KHRoaXMudHJlZVNlcnZpY2UuY29uZmlnLCAnZGlhbGNvZGVNYXhMZW5ndGgnKTtcbiAgICB9XG4gICAgdGhpcy5kaWFsY29kZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heCh0aGlzLm1heFFSQ29kZSksIHRoaXMuY3VzdG9tRGlhbGNvZGVWYWxpZGF0b3IoKV0pO1xuICB9XG5cbiAgdHJlZVN0YXR1c0xpc3RlbmVyKCkge1xuICAgIHRoaXMudHJlZVNlcnZpY2UudHJlZVN0YXR1cyQuc3Vic2NyaWJlKChzdGF0dXMpID0+IHtcbiAgICAgIGlmIChzdGF0dXMgPT09ICdsb2FkZWQnKSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZVFSRG93bmxvYWRCdG4oKTtcbiAgICAgICAgdGhpcy5kb1FSQ29kZUNvdW50KCk7XG4gICAgICAgIHRoaXMuY29udGVudElkID0gXy5nZXQodGhpcy5jb250ZW50TWV0YWRhdGEsICdpZGVudGlmaWVyJyk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ3NhdmVkJykge1xuICAgICAgICB0aGlzLmRvUVJDb2RlQ291bnQoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlUVJHZW5lcmF0ZUJ0biA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc2FibGVRUkdlbmVyYXRlQnRuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXNvbHZlUVJEb3dubG9hZEJ0bigpIHtcbiAgICB0aGlzLmRpc2FibGVRUkRvd25sb2FkQnRuID0gXy5oYXModGhpcy5jb250ZW50TWV0YWRhdGEsICdxckNvZGVQcm9jZXNzSWQnKSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIGRvUVJDb2RlQ291bnQoKSB7XG4gICAgdGhpcy5xckNvZGVDb3VudC5yZXF1ZXN0ID0gMDtcbiAgICBjb25zdCByb290Tm9kZSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0VHJlZU9iamVjdCgpO1xuICAgIHRoaXMucXJDb2RlQ291bnQucmVzZXJ2ZSA9ICh0aGlzLmNvbnRlbnRNZXRhZGF0YS5yZXNlcnZlZERpYWxjb2RlcykgPyBfLnNpemUodGhpcy5jb250ZW50TWV0YWRhdGEucmVzZXJ2ZWREaWFsY29kZXMpIDogMDtcbiAgICByb290Tm9kZS52aXNpdCgobm9kZSkgPT4ge1xuICAgICAgaWYgKG5vZGUuZGF0YS5tZXRhZGF0YS5kaWFsY29kZVJlcXVpcmVkID09PSAnWWVzJykge1xuICAgICAgICB0aGlzLnFyQ29kZUNvdW50LnJlcXVlc3QgKz0gMTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9wZW5SZXF1ZXN0UG9wdXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucXJDb2RlQ291bnQucmVxdWVzdCA+IDApIHtcbiAgICAgIHRoaXMucmVzZXJ2ZURpYWxDb2RlKHRoaXMucXJDb2RlQ291bnQucmVxdWVzdCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXF1ZXN0TnVtYmVyID0gdGhpcy5xckNvZGVDb3VudC5yZXNlcnZlID4gMCA/IHRoaXMucXJDb2RlQ291bnQucmVzZXJ2ZSA6ICcnO1xuICAgICAgdGhpcy5kaWFsY29kZUNvbnRyb2wuc2V0VmFsdWUocmVxdWVzdE51bWJlcik7XG4gICAgICB0aGlzLnNob3dRUkNvZGVQb3B1cCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc3VibWl0RGlhbGNvZGVGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd1FSQ29kZVBvcHVwID0gZmFsc2U7XG4gICAgdGhpcy5yZXNlcnZlRGlhbENvZGUodGhpcy5kaWFsY29kZUNvbnRyb2wudmFsdWUpO1xuICB9XG5cbiAgcmVzZXJ2ZURpYWxDb2RlKHJlcXVlc3RDb3VudDogbnVtYmVyKSB7XG4gICAgdGhpcy5pc0dlbmVyYXRpbmdRUkNvZGVzID0gdHJ1ZTtcbiAgICB0aGlzLnFyQ29kZUNvdW50LnJlcXVlc3QgPSBfLmNsb25lRGVlcChyZXF1ZXN0Q291bnQpO1xuICAgIHRoaXMuZGlhbGNvZGVTZXJ2aWNlLnJlc2VydmVEaWFsQ29kZSh0aGlzLmNvbnRlbnRJZCwgcmVxdWVzdENvdW50KS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgY29uc3Qgcm9vdE5vZGVNZXRkYXRhID0gdGhpcy5jb250ZW50TWV0YWRhdGE7XG4gICAgICByb290Tm9kZU1ldGRhdGEucmVzZXJ2ZWREaWFsY29kZXMgPSByZXMucmVzdWx0LnJlc2VydmVkRGlhbGNvZGVzO1xuICAgICAgcm9vdE5vZGVNZXRkYXRhLnFyQ29kZVByb2Nlc3NJZCA9IHJlcy5yZXN1bHQucHJvY2Vzc0lkO1xuICAgICAgdGhpcy5xckNvZGVQcm9jZXNzSWQgPSByZXMucmVzdWx0LnByb2Nlc3NJZDtcbiAgICAgIHRoaXMuaXNHZW5lcmF0aW5nUVJDb2RlcyA9IGZhbHNlO1xuICAgICAgdGhpcy5kb1FSQ29kZUNvdW50KCk7XG4gICAgICB0aGlzLnJlc29sdmVRUkRvd25sb2FkQnRuKCk7XG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMTAnKSk7XG4gICAgfSwgKGVycikgPT4ge1xuICAgICAgdGhpcy5pc0dlbmVyYXRpbmdRUkNvZGVzID0gZmFsc2U7XG4gICAgICBjb25zdCBlcnJSZXNwb25zZSA9IChlcnIuZXJyb3IucmVzdWx0KSA/IGVyci5lcnJvci5yZXN1bHQgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoIV8uaXNFbXB0eShlcnJSZXNwb25zZSkgJiYgZXJyUmVzcG9uc2UuaGFzT3duUHJvcGVydHkoJ2NvdW50JykpIHtcbiAgICAgICAgaWYgKGVyclJlc3BvbnNlLmNvdW50ID49IHRoaXMucXJDb2RlQ291bnQucmVxdWVzdCkge1xuICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDEzJykpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKGVyci5lcnJvci5wYXJhbXMuZXJybXNnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgZG93bmxvYWRRUkNvZGVzKCk6IHZvaWQge1xuICAgIHRoaXMucXJDb2RlUHJvY2Vzc0lkID0gXy5nZXQodGhpcy5jb250ZW50TWV0YWRhdGEsICdxckNvZGVQcm9jZXNzSWQnKTtcbiAgICB0aGlzLmRpYWxjb2RlU2VydmljZS5kb3dubG9hZFFSQ29kZSh0aGlzLnFyQ29kZVByb2Nlc3NJZCkuc3Vic2NyaWJlKChyZXMpID0+ICB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzLnJlc3VsdDtcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmhhc093blByb3BlcnR5KCdzdGF0dXMnKSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09ICdpbi1wcm9jZXNzJykge1xuICAgICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5pbmZvKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmluZm8uMDAxJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAnY29tcGxldGVkJykge1xuICAgICAgICAgICAgY29uc3QgZmlsZXBhdGggPSByZXNwb25zZS51cmw7XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCgnKFswLTldKSsoPz0uWy56aXBdKScpO1xuICAgICAgICAgICAgY29uc3QgdGltZVN0YW1wID0gZmlsZXBhdGgubWF0Y2gocGF0dGVybik7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50TmFtZSA9IF8uZ2V0KHRoaXMuY29udGVudE1ldGFkYXRhLCAnbmFtZScpO1xuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcnlOYW1lID0gKGNvbnRlbnROYW1lLnNwbGl0KCcgJykpLmpvaW4oJ18nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBgJHt0aGlzLmNvbnRlbnRJZH1fJHtjYXRlZ29yeU5hbWV9XyR7dGltZVN0YW1wWzBdfS56aXBgO1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZEZpbGUoZmlsZXBhdGgsIGZpbGVuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihlcnIuZXJyb3IucGFyYW1zLmVycm1zZyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldCBjb250ZW50TWV0YWRhdGEoKSB7XG4gICAgY29uc3Qgcm9vdE5vZGUgPSB0aGlzLnRyZWVTZXJ2aWNlLmdldEZpcnN0Q2hpbGQoKTtcbiAgICByZXR1cm4gXy5nZXQocm9vdE5vZGUsICdkYXRhLm1ldGFkYXRhJyk7XG4gIH1cblxuICBkb3dubG9hZEZpbGUodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgIGJsb2JVcmw6IHVybCxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDExJyksXG4gICAgICAgIGZpbGVUeXBlOiAnemlwJyxcbiAgICAgICAgZmlsZU5hbWU6IGZpbGVuYW1lXG4gICAgfTtcbiAgICB0aGlzLmVkaXRvclNlcnZpY2UuZG93bmxvYWRCbG9iVXJsRmlsZShjb25maWcpO1xuICB9XG5cbiAga2V5UHJlc3NOdW1iZXJzKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgcGF0dGVybiA9IC9eKFswLTldKSQvO1xuICAgIGlmICghcGF0dGVybi50ZXN0KGV2ZW50LmtleSkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY3VzdG9tRGlhbGNvZGVWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyA9PiB7XG4gICAgICBpZiAoY29udHJvbC52YWx1ZSA9PT0gbnVsbCB8fCBjb250cm9sLnZhbHVlID09PSAnJykgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgY29uc3QgaW5wdXRWYWx1ZTogbnVtYmVyID0gK2NvbnRyb2wudmFsdWU7XG4gICAgICBpZiAodGhpcy5xckNvZGVDb3VudC5yZXNlcnZlID09PSAwICYmIGlucHV0VmFsdWUgPCB0aGlzLm1pblFSQ29kZSkge1xuICAgICAgICByZXR1cm4geyBtaW5FcnI6IF8ucmVwbGFjZShfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMTQnKSwgJ3tudW1iZXJ9JywgdGhpcy5taW5RUkNvZGUpIH07XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5xckNvZGVDb3VudC5yZXNlcnZlID4gMCAmJiBpbnB1dFZhbHVlIDw9IHRoaXMucXJDb2RlQ291bnQucmVzZXJ2ZSkge1xuICAgICAgICByZXR1cm4geyBndGVFcnI6IF8ucmVwbGFjZShfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMTUnKSwgJ3tudW1iZXJ9JywgdGhpcy5xckNvZGVDb3VudC5yZXNlcnZlKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxufVxuIiwiPGEgY2xhc3M9XCJmcy0wLTc4NSBzYi1jb2xvci1wcmltYXJ5IGZvbnQtd2VpZ2h0LWJvbGRcIj48aSBjbGFzcz1cImljb24gcXJjb2RlXCI+PC9pPlFSIENvZGUgPC9hPlxuPGEgY2xhc3M9XCJwcm9maWxlLWF2dGFyIGNvbXB1dGVyIG9ubHkgcC0wIHByLTEwXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgPGRpdiBzdWlEcm9wZG93biBjbGFzcz1cInVpIGRyb3Bkb3duIHJpZ2h0IHRvcCBwb2ludGluZ1wiIGlkPVwiZHJvcGRvd24tbWVudS1saXN0LWhlYWRlclwiPlxuICAgICAgICA8aSBjbGFzcz1cImljb24gY2FyZXQgZG93blwiPjwvaT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnVcIiBzdWlEcm9wZG93bk1lbnU+XG4gICAgICAgICAgICA8YSBjbGFzcz1cIml0ZW0gZnMtMC03ODVcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiKCFkaXNhYmxlUVJHZW5lcmF0ZUJ0biB8fCAocXJDb2RlQ291bnQucmVxdWVzdCA+IDAgJiYgcXJDb2RlQ291bnQucmVxdWVzdCArIDEgPD0gcXJDb2RlQ291bnQucmVzZXJ2ZSkgfHwgaXNHZW5lcmF0aW5nUVJDb2RlcyApID8gJ3NiLWRpc2FibGVkJyA6ICcgJ1wiXG4gICAgICAgICAgICBsaWJUZWxlbWV0cnlJbnRlcmFjdFxuICAgICAgICAgICAgW3RlbGVtZXRyeUludGVyYWN0RWRhdGFdPVwidGVsZW1ldHJ5U2VydmljZS5nZXRUZWxlbWV0cnlJbnRlcmFjdEVkYXRhKCdnZW5lcmF0ZV9xcl9jb2RlcycsJ2NsaWNrJywnbGF1bmNoJywgdGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQpXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uIHFyY29kZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0dlbmVyYXRpbmdRUkNvZGVzXCIgY2xhc3M9XCJ0ZXh0XCIgKGNsaWNrKT1cIm9wZW5SZXF1ZXN0UG9wdXAoKTtcIj5cbiAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUge3socXJDb2RlQ291bnQucmVxdWVzdCA+IDAgJiYgcXJDb2RlQ291bnQucmVxdWVzdCsxID4gcXJDb2RlQ291bnQucmVzZXJ2ZSk/IHFyQ29kZUNvdW50LnJlcXVlc3QgKyAnICtcbiAgICAgICAgICAgICAgICAgICAgMScgOiAocXJDb2RlQ291bnQucmVzZXJ2ZSA+IDApID8gcXJDb2RlQ291bnQucmVzZXJ2ZS0xICsnICsgMScgOiAnJyB9fSBRUiBDb2Rlc1xuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzR2VuZXJhdGluZ1FSQ29kZXNcIiBjbGFzcz1cInRleHRcIj5HZW5lcmF0aW5nIHt7KHFyQ29kZUNvdW50LnJlcXVlc3QgPiAwICk/IHFyQ29kZUNvdW50LnJlcXVlc3QtMSArICcgK1xuICAgICAgICAgICAgICAgICAgICAxJyA6JycgfX0gUVIgY29kZXM8L3NwYW4+IFxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpIGRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiaXRlbSBmcy0wLTc4NVwiIChjbGljayk9XCJkb3dubG9hZFFSQ29kZXMoKTtcIiBbbmdDbGFzc109XCIhZGlzYWJsZVFSRG93bmxvYWRCdG4gPyAnc2ItZGlzYWJsZWQnIDogJydcIlxuICAgICAgICAgICAgbGliVGVsZW1ldHJ5SW50ZXJhY3RcbiAgICAgICAgICAgIFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgnZG93bmxvYWRfcXJfY29kZXMnLCdjbGljaycsJ2xhdW5jaCcsIHRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkKVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbiBkb3dubG9hZFwiPjwvaT4gXG4gICAgICAgICAgICAgICAgRG93bmxvYWQge3socXJDb2RlQ291bnQucmVzZXJ2ZSA+IDEpID8gcXJDb2RlQ291bnQucmVzZXJ2ZS0xICsgJyArMScgOiAnJ319IFFSIGNvZGVzXG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9hPlxuPGRpdiBjbGFzcz1cInNlcGVyYXRvciBwci0yMFwiPjwvZGl2PlxuXG48c3VpLW1vZGFsICpuZ0lmPVwic2hvd1FSQ29kZVBvcHVwXCIgW211c3RTY3JvbGxdPVwidHJ1ZVwiIFtpc0Nsb3NhYmxlXT1cInRydWVcIiBbdHJhbnNpdGlvbkR1cmF0aW9uXT1cIjBcIiBbc2l6ZV09XCInc21hbGwnXCJcbiAgICBjbGFzcz1cInNiLW1vZGFsIGJ4LW5vbmUgb3ZlcmZsb3ctbW9kYWwgZGlhbGNvZGVNb2RhbFwiIGFwcEJvZHlTY3JvbGwgKGRpc21pc3NlZCk9XCJzaG93UVJDb2RlUG9wdXAgPSAhc2hvd1FSQ29kZVBvcHVwXCIgI21vZGFsPlxuICAgIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1oZWFkZXJcIj5cbiAgICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnJlcXVlc3RGb3JRckNvZGV9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1qYy1zcGFjZS1iZXR3ZWVuIHAtMjBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1maWVsZC1ncm91cCB3LTcwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgKGtleXByZXNzKT1cImtleVByZXNzTnVtYmVycygkZXZlbnQpXCIgcGF0dGVybj1cIlswLTldKlwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBbZm9ybUNvbnRyb2xdPVwiZGlhbGNvZGVDb250cm9sXCIgXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImRpYWxjb2RlQ29udHJvbC5lcnJvcnMgPyAnc2ItY29sb3ItZXJyb3InIDogJycgXCIgY2xhc3M9XCJzYi1mb3JtLWNvbnRyb2wgcC01IHctMTAwXCIgcGxhY2Vob2xkZXI9XCJlLmcuIDQ1XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkaWFsY29kZUNvbnRyb2wuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwic2ItY29sb3ItZXJyb3IgcHQtMTAgZC1ibG9ja1wiICpuZ0lmPVwiZGlhbGNvZGVDb250cm9sLmVycm9ycy5tYXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ubnVtYmVyVG9vbGFyZ2V9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInNiLWNvbG9yLWVycm9yIHB0LTEwIGQtYmxvY2tcIiAqbmdJZj1cImRpYWxjb2RlQ29udHJvbC5lcnJvcnMubWluRXJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkaWFsY29kZUNvbnRyb2wuZXJyb3JzLm1pbkVycn19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwic2ItY29sb3ItZXJyb3IgcHQtMTAgZC1ibG9ja1wiICpuZ0lmPVwiZGlhbGNvZGVDb250cm9sLmVycm9ycy5ndGVFcnJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2RpYWxjb2RlQ29udHJvbC5lcnJvcnMuZ3RlRXJyfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWwgc2ItYnRuLXByaW1hcnlcIiBbbmdDbGFzc109XCJkaWFsY29kZUNvbnRyb2wudmFsaWQgPyAnJzogJ3NiLWJ0bi1yZXF1ZXN0LWRpc2FibGVkJ1wiIFxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkaWFsY29kZUNvbnRyb2wudmFsaWRcIiAoY2xpY2spPVwic3VibWl0RGlhbGNvZGVGb3JtKCk7XCIgPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8ucmVxdWVzdF9idG5fbGFiZWx9fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvc3VpLW1vZGFsPiJdfQ==