@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,256 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import * as _ from 'lodash-es';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../services/helper/helper.service";
5
+ import * as i2 from "../../services/toaster/toaster.service";
6
+ import * as i3 from "../../services/config/config.service";
7
+ import * as i4 from "../../services/editor/editor.service";
8
+ import * as i5 from "../../services/telemetry/telemetry.service";
9
+ import * as i6 from "@angular/common";
10
+ import * as i7 from "@angular/forms";
11
+ import * as i8 from "@project-sunbird/ng2-semantic-ui";
12
+ import * as i9 from "../../directives/telemetry-interact/telemetry-interact.directive";
13
+ export class ManageCollaboratorComponent {
14
+ constructor(helperService, toasterService, configService, editorService, telemetryService) {
15
+ this.helperService = helperService;
16
+ this.toasterService = toasterService;
17
+ this.configService = configService;
18
+ this.editorService = editorService;
19
+ this.telemetryService = telemetryService;
20
+ this.modalDismissEmitter = new EventEmitter();
21
+ this.selectedUsers = [];
22
+ this.selectedcollaborators = [];
23
+ this.users = [];
24
+ this.collaborators = [];
25
+ this.manageCollaboratorTabVisit = 0;
26
+ this.updatedCollaborators = [];
27
+ this.searchKeyword = '';
28
+ this.searchRes = { count: 0, content: [], isEmptyResponse: false, errorMessage: '', searchStatus: 'start' };
29
+ this.userSearchBody = {
30
+ request: {
31
+ query: '',
32
+ filters: {
33
+ 'organisations.roles': 'CONTENT_CREATOR',
34
+ rootOrgId: ''
35
+ },
36
+ fields: ['email', 'firstName', 'identifier', 'lastName', 'organisations', 'rootOrgName', 'phone'],
37
+ offset: 0,
38
+ limit: 200
39
+ }
40
+ };
41
+ this.isContentOwner = false;
42
+ this.allUsersCount = 0;
43
+ }
44
+ ngOnInit() {
45
+ this.currentUser = _.get(this.editorService.editorConfig, 'context.user');
46
+ this.isRootOrgAdmin = _.has(this.currentUser, 'isRootOrgAdmin') ? this.currentUser.isRootOrgAdmin : false;
47
+ if (_.has(this.currentUser, 'orgIds')) {
48
+ this.userSearchBody.request.filters.rootOrgId = this.currentUser.orgIds;
49
+ }
50
+ this.setCreatorAndCollaborators();
51
+ }
52
+ setCreatorAndCollaborators() {
53
+ this.editorService.fetchContentDetails(this.collectionId).subscribe(res => {
54
+ this.contentCollaborators = _.get(res.result.content, 'collaborators', []);
55
+ this.contentOwner = [_.get(res.result.content, 'createdBy')];
56
+ this.creatorAndCollaboratorsIds = [...this.contentCollaborators, ...this.contentOwner];
57
+ this.checkUserRole();
58
+ });
59
+ }
60
+ checkUserRole() {
61
+ if (this.contentOwner && (this.contentOwner[0] === this.currentUser.id)) {
62
+ this.isContentOwner = true;
63
+ }
64
+ if (this.isContentOwner || this.isRootOrgAdmin) {
65
+ this.isAddCollaboratorTab = true;
66
+ this.getAllUserList();
67
+ }
68
+ else {
69
+ this.getCollaborators();
70
+ }
71
+ this.showCollaborationPopup = this.addCollaborator;
72
+ }
73
+ dismissCollaborationPopup() {
74
+ this.showCollaborationPopup = false;
75
+ this.modalDismissEmitter.emit({});
76
+ }
77
+ getAllUserList() {
78
+ this.helperService.getAllUser(this.userSearchBody).subscribe((response) => {
79
+ this.users = [];
80
+ if (_.has(response, 'result.response.content')) {
81
+ const allUsers = _.get(response, 'result.response.content');
82
+ this.allUsersCount = allUsers.length - 1;
83
+ this.users = this.excludeCreatorAndCollaborators(allUsers);
84
+ }
85
+ }, (error) => {
86
+ this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.001'));
87
+ console.log(error);
88
+ });
89
+ }
90
+ excludeCreatorAndCollaborators(allUsers) {
91
+ return _.filter(allUsers, user => {
92
+ return !_.includes(this.creatorAndCollaboratorsIds, user.identifier);
93
+ });
94
+ }
95
+ toggleSelectionUser(userIdentifier) {
96
+ _.forEach(this.users, user => {
97
+ if (user.identifier === userIdentifier) {
98
+ if (_.has(user, 'isSelected') && user.isSelected === true) {
99
+ user.isSelected = false;
100
+ const index = this.selectedUsers.indexOf(userIdentifier);
101
+ if (index > -1) {
102
+ this.selectedUsers.splice(index, 1);
103
+ }
104
+ }
105
+ else {
106
+ user.isSelected = true;
107
+ this.selectedUsers.push(userIdentifier);
108
+ }
109
+ }
110
+ });
111
+ }
112
+ toggleSelectionCollaborator(userIdentifier) {
113
+ _.forEach(this.collaborators, user => {
114
+ if (user.identifier === userIdentifier) {
115
+ if (_.has(user, 'isSelected') && user.isSelected === true) {
116
+ user.isSelected = false;
117
+ const index = this.selectedcollaborators.indexOf(userIdentifier);
118
+ if (index > -1) {
119
+ this.selectedcollaborators.splice(index, 1);
120
+ }
121
+ }
122
+ else {
123
+ user.isSelected = true;
124
+ this.selectedcollaborators.push(userIdentifier);
125
+ }
126
+ }
127
+ });
128
+ }
129
+ addRemoveCollaboratorToCourse(modal) {
130
+ this.updatedCollaborators = this.contentCollaborators;
131
+ this.updatedCollaborators = _.concat(this.updatedCollaborators, this.selectedUsers);
132
+ this.updatedCollaborators = _.difference(this.updatedCollaborators, this.selectedcollaborators);
133
+ this.helperService.updateCollaborator(this.collectionId, this.updatedCollaborators).subscribe((response) => {
134
+ if (response.params.status === 'successful') {
135
+ this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.012'));
136
+ }
137
+ else {
138
+ this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.001'));
139
+ }
140
+ }, (error) => {
141
+ this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.001'));
142
+ console.log(error);
143
+ });
144
+ modal.deny();
145
+ }
146
+ /* to be called when user change tab to add collaborator */
147
+ getAllusers() {
148
+ this.isAddCollaboratorTab = true;
149
+ }
150
+ /* to be called when user change tab to manage collaborator */
151
+ getCollaborators() {
152
+ this.isAddCollaboratorTab = false;
153
+ this.manageCollaboratorTabVisit += 1;
154
+ if (this.manageCollaboratorTabVisit <= 1) {
155
+ // tslint:disable-next-line:no-string-literal
156
+ this.userSearchBody.request.filters['userId'] = this.contentCollaborators;
157
+ if (!_.isEmpty(this.contentCollaborators)) {
158
+ this.helperService.getAllUser(this.userSearchBody).subscribe((response) => {
159
+ this.collaborators = [];
160
+ if (_.has(response, 'result.response.content')) {
161
+ this.collaborators = _.get(response, 'result.response.content');
162
+ }
163
+ }, (error) => {
164
+ this.collaborators = [];
165
+ this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.001'));
166
+ console.log(error);
167
+ });
168
+ }
169
+ }
170
+ }
171
+ sortUsersList(value) {
172
+ if (value === 'firstName') {
173
+ this.users = _.orderBy(this.users, [user => user[value].toLowerCase()]);
174
+ }
175
+ else {
176
+ this.users = _.orderBy(this.users, [user => user.organisations[0].orgName ? user.organisations[0].orgName.toLowerCase() : '']);
177
+ }
178
+ }
179
+ searchByKeyword() {
180
+ const searchRequest = this.userSearchBody;
181
+ if (this.validateEmail(this.searchKeyword)) {
182
+ // tslint:disable-next-line:no-string-literal
183
+ searchRequest.request.filters['email'] = this.searchKeyword;
184
+ }
185
+ else if (/^\d+$/.test(this.searchKeyword)) {
186
+ // tslint:disable-next-line:no-string-literal
187
+ searchRequest.request.filters['phone'] = this.searchKeyword;
188
+ }
189
+ else {
190
+ searchRequest.request.query = this.searchKeyword;
191
+ }
192
+ this.helperService.getAllUser(searchRequest).subscribe((response) => {
193
+ this.searchRes.searchStatus = 'end';
194
+ if (_.has(response, 'result.response.content')) {
195
+ this.searchRes.content = this.excludeCreatorAndCollaborators(_.get(response, 'result.response.content'));
196
+ if (this.searchRes.content.length) {
197
+ this.searchRes.isEmptyResponse = false;
198
+ }
199
+ else {
200
+ this.searchRes.isEmptyResponse = true;
201
+ this.searchRes.content = [];
202
+ }
203
+ }
204
+ }, (error) => {
205
+ this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.001'));
206
+ console.log(error);
207
+ this.searchRes.content = [];
208
+ this.searchRes.isEmptyResponse = true;
209
+ this.searchRes.errorMessage = _.get(this.configService, 'labelConfig.messages.error.001');
210
+ });
211
+ }
212
+ resetSearch() {
213
+ this.searchRes.content = [];
214
+ this.searchRes.isEmptyResponse = false;
215
+ }
216
+ refreshSearch() {
217
+ this.searchKeyword = '';
218
+ this.searchByKeyword();
219
+ }
220
+ validateEmail(email) {
221
+ // tslint:disable-next-line:max-line-length
222
+ const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
223
+ return re.test(String(email).toLowerCase());
224
+ }
225
+ selectUser(user) {
226
+ user.isSelected = true;
227
+ let index = _.findIndex(this.users, (element) => { return element.identifier === user.identifier; });
228
+ if (index > -1) {
229
+ this.users.splice(index, 1);
230
+ this.users.unshift(user);
231
+ }
232
+ const selectedIndex = this.selectedUsers.indexOf(user.identifier);
233
+ if (selectedIndex === -1) {
234
+ this.selectedUsers.push(user.identifier);
235
+ }
236
+ }
237
+ viewAllResults() {
238
+ this.users = this.searchRes.content;
239
+ }
240
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ManageCollaboratorComponent, deps: [{ token: i1.HelperService }, { token: i2.ToasterService }, { token: i3.ConfigService }, { token: i4.EditorService }, { token: i5.EditorTelemetryService }], target: i0.ɵɵFactoryTarget.Component }); }
241
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ManageCollaboratorComponent, selector: "lib-manage-collaborator", inputs: { addCollaborator: "addCollaborator", collectionId: "collectionId" }, outputs: { modalDismissEmitter: "modalDismissEmitter" }, viewQueries: [{ propertyName: "modal", first: true, predicate: ["modal"], descendants: true }], ngImport: i0, template: "<sui-modal *ngIf=\"showCollaborationPopup\" [mustScroll]=\"true\" [isClosable]=\"true\" [transitionDuration]=\"0\"\n [size]=\"'fullscreen'\" class=\"sb-modal sb-modal-fullscreen showCollaborator\" appBodyScroll \n (dismissed)=\"dismissCollaborationPopup()\" #modal>\n <div class=\"sb-modal-header\">\n </div>\n <div class=\"sb-modal-content sb-bg-color-primary-100 pt-0\">\n <div class=\"d-flex flex-jc-space-between py-10 flex-align-item-center h-70 sb-bg-color-white\">\n <div class=\"fs-1 font-weight-bold\">{{configService.labelConfig?.lbl?.collaborators}}</div>\n <div>\n <div class=\"sb-search-box small no-btn mr-10\" *ngIf=\"isAddCollaboratorTab\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (keyup)=\"searchKeyword.length >= 3 ? searchByKeyword() : resetSearch()\" class=\"sb-search-input\" [(ngModel)]=\"searchKeyword\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" aria-hidden=\"true\" (click)=\"refreshSearch()\" [hidden]=\"!(searchRes.searchStatus == 'end' && searchKeyword.length >= 3 )\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <div class=\"ui right floated header searcher\" *ngIf=\"isAddCollaboratorTab\">\n <ul *ngIf=\"searchKeyword.length >= 3 && searchRes.content.length\">\n <li class=\"searchResult\" *ngFor=\"let user of searchRes.content\">\n <p (click)=\"selectUser(user)\">{{user.firstName}}</p>\n </li>\n <li class=\"searchResult font-weight-bold\" id=\"view-all-results\" *ngIf=\"searchRes.content.length >= 5\" (click)=\"viewAllResults()\"><span>View All Results</span></li>\n </ul>\n <ul *ngIf=\"searchKeyword.length >= 3 && searchRes.isEmptyResponse\">\n <li class=\"searchResultMsg\"><strong>{{configService.labelConfig?.err?.resultNotFound}}</strong></li>\n </ul>\n <ul *ngIf=\"searchRes.errorMessage.length && (searchKeyword.length >= 3)\">\n <strong class=\"searchResultMsg\">{{searchRes.errorMessage}}</strong>\n </ul>\n </div>\n </div>\n </div>\n <sui-tabset>\n <div class=\"ui pointing secondary menu\">\n <a class=\"item\" *ngIf=\"(isContentOwner || isRootOrgAdmin)\" (activate)=\"getAllusers()\" suiTabHeader=\"1\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('add_collaborators','click','launch', telemetryService.telemetryPageId)\"\n >{{configService.labelConfig?.lbl?.addCollaborators}}</a>\n <a class=\"item\" (activate)=\"getCollaborators()\" suiTabHeader=\"2\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('manage_collaborators','click','launch', telemetryService.telemetryPageId)\"\n >{{configService.labelConfig?.lbl?.manageCollaborators}}</a>\n </div>\n <div class=\"ui segment px-0 py-15 mt-1 sb-bg-color-primary-100\" suiTabContent=\"1\">\n <div *ngIf=\"!users?.length\" class=\"font-weight-bold sb-bg-color-white p-10\">\n {{configService.labelConfig?.err?.userNotFound}}\n </div>\n <div class=\"d-flex py-10\">\n <div *ngIf=\"users?.length\" class=\"w-100 pt-10 font-weight-bold\">Showing {{users.length}} out of {{allUsersCount}}</div>\n <select class=\"search dropdown py-5 sb-bg-color-white mb-10 font-weight-bold\" *ngIf=\"users?.length\"\n (change)=\"sortUsersList($event.target.value)\">\n <option value=\"\">Sort By</option>\n <option value=\"firstName\">Name</option>\n <option value=\"organisations\">Organisation</option>\n </select>\n </div>\n <div class=\"masonry-grid\" *ngIf=\"users?.length\">\n <div *ngFor=\"let user of users\" class=\"sb-card\">\n <div class=\"sb-card-body\">\n <div class=\"sb-card-metas\">\n <div class=\"sb-card-image mr-16 font-weight-bold\">\n {{(user.firstName).charAt(0)}}\n </div>\n <div class=\"sb-card-meta course\">\n <div class=\"sb-card-meta-item mb-16 font-weight-bold\">\n {{user.firstName}} {{user.lastName}}\n </div>\n <div class=\"sb-color-gray-400 fs-0-92\">\n {{user.organisations[0].orgName}}\n </div>\n </div>\n <div class=\"d-flex flex-align-self-end sb-custom-toggle\">\n <a class=\"sb-color-primary d-flex fs-0-785 font-weight-bold flex-ai-end\" \n *ngIf=\"!user.isSelected\" (click)=\"toggleSelectionUser(user.identifier)\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('add_user','click','select', telemetryService.telemetryPageId, {identifier: user.identifier})\">\n <i class=\"icon plus\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.button_labels?.add_btn_label}}\n </a>\n <div class=\"ui right floated compact segment\" *ngIf=\"user.isSelected\" (click)=\"toggleSelectionUser(user.identifier)\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('remove_user','click','select', telemetryService.telemetryPageId, {identifier: user.identifier})\">\n <div class=\"ui mini fitted toggle checkbox\">\n <input type=\"checkbox\" checked><label></label>\n </div>\n </div>\n </div>\n </div>\n </div> \n </div>\n </div>\n </div>\n <div class=\"ui segment px-0 py-15 mt-1 sb-bg-color-primary-100\" suiTabContent=\"2\">\n <div *ngIf=\"!collaborators?.length\" class=\"p-10 font-weight-bold sb-bg-color-white\">\n {{configService.labelConfig?.err?.collaboratorsNotFound}}\n </div>\n <div *ngIf=\"collaborators?.length\" class=\"w-100 pt-10 font-weight-bold\">{{collaborators.length}} collaborators exists</div>\n <div class=\"masonry-grid mt-20\" *ngIf=\"collaborators?.length\">\n <div *ngFor=\"let collaborator of collaborators\" class=\"sb-card\">\n <div class=\"sb-card-body\">\n <div class=\"sb-card-metas\">\n <div class=\"sb-card-image mr-16\">\n {{(collaborator.firstName).charAt(0)}}\n </div>\n <div class=\"sb-card-meta course\">\n <div class=\"sb-card-meta-item mb-16 font-weight-bold\">\n {{collaborator.firstName}} {{collaborator.lastName}}\n </div>\n <div class=\"sb-color-gray-400 fs-0-92\">\n {{collaborator.organisations[0].orgName}}\n </div>\n </div>\n <div class=\"d-flex flex-align-self-end sb-custom-toggle\">\n <a class=\"sb-color-error d-flex fs-0-785 font-weight-bold flex-ai-end\" \n *ngIf=\"!collaborator.isSelected && (isContentOwner || isRootOrgAdmin)\" (click)=\"toggleSelectionCollaborator(collaborator.identifier)\"\n libTelemetryInteract [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('remove_collaborator','click','select',\n telemetryService.telemetryPageId, {identifier: collaborator.identifier})\">\n {{configService.labelConfig?.button_labels?.remove_btn_label}}\n </a>\n <div class=\"ui right floated compact segment\" *ngIf=\"collaborator.isSelected && (isContentOwner || isRootOrgAdmin)\" (click)=\"toggleSelectionCollaborator(collaborator.identifier)\"\n libTelemetryInteract [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('add_collaborator','click','select',\n telemetryService.telemetryPageId, {identifier: collaborator.identifier})\">\n <div class=\"ui mini fitted toggle checkbox\">\n <input type=\"checkbox\" checked><label></label>\n </div>\n </div>\n </div>\n </div>\n </div> \n </div>\n </div>\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-primary\"\n [ngClass]=\"{'sb-btn-disabled': (selectedUsers.length === 0 && selectedcollaborators.length === 0)}\"\n [disabled]=\"(selectedUsers.length === 0 && selectedcollaborators.length === 0)\"\n (click)=\"addRemoveCollaboratorToCourse(modal)\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('done','click','submit',\n telemetryService?.telemetryPageId)\">\n {{configService.labelConfig?.button_labels?.done_btn_label}}\n </button>\n </div>\n</sui-modal>\n", styles: [".sb-custom-toggle{height:20px;width:42px}.sb-custom-toggle .compact{padding:0!important;margin:0!important;border:0!important}.sb-custom-toggle .checkbox{transform:scale(.7)}.searcher{border-radius:.28571429rem!important;box-shadow:0 2px 4px #2224261f,0 2px 10px #22242626!important;padding:0;background:#fff;margin:0!important;font-size:.785rem!important;width:206px;z-index:9;position:absolute;cursor:pointer}.searcher ul{padding:10px 0 0!important;background:#fff}.searcher ul li{margin-bottom:5px!important;padding-left:34px}.searcher ul li:hover{background:#d8dee2}.flex-align-item-center{align-items:center}.h-70{height:70px}.mt-50{margin-top:50px}.sb-card{background-color:var(--white);border:.0625rem solid #dedede;border-radius:.25rem;cursor:pointer;overflow:hidden;position:relative;transition:box-shadow .3s ease-out,transform .3s ease-out,opacity .2s ease-out;transition-delay:.1s;margin:.1875rem .6rem .6rem 0}.sb-card:hover{transform:translateY(-.1875rem);box-shadow:0 .125rem .4375rem #cac5c5}.sb-card .sb-card-body{height:5.75rem;padding:1rem 1rem .5rem;overflow:hidden}.sb-card .sb-card-metas{display:flex;align-items:flex-start}.sb-card .sb-card-image{width:3.75rem;height:3.75rem;border:.0625rem solid var(--gray-100);background-color:#34495e;color:#fff;border-radius:100%;margin:0 1rem 0 0;font-size:2rem;text-align:center;line-height:3.5rem}.sb-card .sb-card-image img{width:4.375rem;height:5.75rem;object-fit:cover}.sb-card .sb-card-meta{height:3.75rem;width:9rem;display:flex;flex-wrap:wrap;flex-direction:column;overflow:hidden}.masonry-grid{display:flex;flex-wrap:wrap}.flex-align-self-end{align-self:flex-end}.masonry-grid .ui.toggle.checkbox input:checked~.box:after{left:2rem!important}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.SuiDropdownMenuItem, selector: ".item" }, { kind: "component", type: i8.SuiModal, selector: "sui-modal", inputs: ["isClosable", "closeResult", "size", "isCentered", "isFullScreen", "isBasic", "mustScroll", "isInverted", "transition", "transitionDuration"], outputs: ["approved", "denied", "dismissed"] }, { kind: "component", type: i8.SuiTabset, selector: "sui-tabset" }, { kind: "directive", type: i8.SuiTabHeader, selector: "[suiTabHeader]", inputs: ["suiTabHeader", "isActive", "isDisabled"], outputs: ["isActiveChange", "activate", "deactivate"] }, { kind: "directive", type: i8.SuiTabContent, selector: "[suiTabContent]", inputs: ["suiTabContent"] }, { kind: "directive", type: i9.TelemetryInteractDirective, selector: "[libTelemetryInteract]", inputs: ["telemetryInteractEdata"] }] }); }
242
+ }
243
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ManageCollaboratorComponent, decorators: [{
244
+ type: Component,
245
+ args: [{ selector: 'lib-manage-collaborator', template: "<sui-modal *ngIf=\"showCollaborationPopup\" [mustScroll]=\"true\" [isClosable]=\"true\" [transitionDuration]=\"0\"\n [size]=\"'fullscreen'\" class=\"sb-modal sb-modal-fullscreen showCollaborator\" appBodyScroll \n (dismissed)=\"dismissCollaborationPopup()\" #modal>\n <div class=\"sb-modal-header\">\n </div>\n <div class=\"sb-modal-content sb-bg-color-primary-100 pt-0\">\n <div class=\"d-flex flex-jc-space-between py-10 flex-align-item-center h-70 sb-bg-color-white\">\n <div class=\"fs-1 font-weight-bold\">{{configService.labelConfig?.lbl?.collaborators}}</div>\n <div>\n <div class=\"sb-search-box small no-btn mr-10\" *ngIf=\"isAddCollaboratorTab\">\n <div class=\"input-div relative\">\n <i class=\"search icon\" aria-hidden=\"true\"></i>\n <input (keyup)=\"searchKeyword.length >= 3 ? searchByKeyword() : resetSearch()\" class=\"sb-search-input\" [(ngModel)]=\"searchKeyword\"\n type=\"text\" placeholder={{configService.labelConfig?.lbl?.searchPlaceholder}} />\n <i class=\"close icon\" aria-hidden=\"true\" (click)=\"refreshSearch()\" [hidden]=\"!(searchRes.searchStatus == 'end' && searchKeyword.length >= 3 )\"></i>\n </div>\n <button class=\"sb-btn sb-btn-normal\">{{configService.labelConfig?.button_labels?.search_btn_label}}</button>\n </div>\n <div class=\"ui right floated header searcher\" *ngIf=\"isAddCollaboratorTab\">\n <ul *ngIf=\"searchKeyword.length >= 3 && searchRes.content.length\">\n <li class=\"searchResult\" *ngFor=\"let user of searchRes.content\">\n <p (click)=\"selectUser(user)\">{{user.firstName}}</p>\n </li>\n <li class=\"searchResult font-weight-bold\" id=\"view-all-results\" *ngIf=\"searchRes.content.length >= 5\" (click)=\"viewAllResults()\"><span>View All Results</span></li>\n </ul>\n <ul *ngIf=\"searchKeyword.length >= 3 && searchRes.isEmptyResponse\">\n <li class=\"searchResultMsg\"><strong>{{configService.labelConfig?.err?.resultNotFound}}</strong></li>\n </ul>\n <ul *ngIf=\"searchRes.errorMessage.length && (searchKeyword.length >= 3)\">\n <strong class=\"searchResultMsg\">{{searchRes.errorMessage}}</strong>\n </ul>\n </div>\n </div>\n </div>\n <sui-tabset>\n <div class=\"ui pointing secondary menu\">\n <a class=\"item\" *ngIf=\"(isContentOwner || isRootOrgAdmin)\" (activate)=\"getAllusers()\" suiTabHeader=\"1\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('add_collaborators','click','launch', telemetryService.telemetryPageId)\"\n >{{configService.labelConfig?.lbl?.addCollaborators}}</a>\n <a class=\"item\" (activate)=\"getCollaborators()\" suiTabHeader=\"2\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('manage_collaborators','click','launch', telemetryService.telemetryPageId)\"\n >{{configService.labelConfig?.lbl?.manageCollaborators}}</a>\n </div>\n <div class=\"ui segment px-0 py-15 mt-1 sb-bg-color-primary-100\" suiTabContent=\"1\">\n <div *ngIf=\"!users?.length\" class=\"font-weight-bold sb-bg-color-white p-10\">\n {{configService.labelConfig?.err?.userNotFound}}\n </div>\n <div class=\"d-flex py-10\">\n <div *ngIf=\"users?.length\" class=\"w-100 pt-10 font-weight-bold\">Showing {{users.length}} out of {{allUsersCount}}</div>\n <select class=\"search dropdown py-5 sb-bg-color-white mb-10 font-weight-bold\" *ngIf=\"users?.length\"\n (change)=\"sortUsersList($event.target.value)\">\n <option value=\"\">Sort By</option>\n <option value=\"firstName\">Name</option>\n <option value=\"organisations\">Organisation</option>\n </select>\n </div>\n <div class=\"masonry-grid\" *ngIf=\"users?.length\">\n <div *ngFor=\"let user of users\" class=\"sb-card\">\n <div class=\"sb-card-body\">\n <div class=\"sb-card-metas\">\n <div class=\"sb-card-image mr-16 font-weight-bold\">\n {{(user.firstName).charAt(0)}}\n </div>\n <div class=\"sb-card-meta course\">\n <div class=\"sb-card-meta-item mb-16 font-weight-bold\">\n {{user.firstName}} {{user.lastName}}\n </div>\n <div class=\"sb-color-gray-400 fs-0-92\">\n {{user.organisations[0].orgName}}\n </div>\n </div>\n <div class=\"d-flex flex-align-self-end sb-custom-toggle\">\n <a class=\"sb-color-primary d-flex fs-0-785 font-weight-bold flex-ai-end\" \n *ngIf=\"!user.isSelected\" (click)=\"toggleSelectionUser(user.identifier)\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('add_user','click','select', telemetryService.telemetryPageId, {identifier: user.identifier})\">\n <i class=\"icon plus\" aria-hidden=\"true\"></i>\n {{configService.labelConfig?.button_labels?.add_btn_label}}\n </a>\n <div class=\"ui right floated compact segment\" *ngIf=\"user.isSelected\" (click)=\"toggleSelectionUser(user.identifier)\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('remove_user','click','select', telemetryService.telemetryPageId, {identifier: user.identifier})\">\n <div class=\"ui mini fitted toggle checkbox\">\n <input type=\"checkbox\" checked><label></label>\n </div>\n </div>\n </div>\n </div>\n </div> \n </div>\n </div>\n </div>\n <div class=\"ui segment px-0 py-15 mt-1 sb-bg-color-primary-100\" suiTabContent=\"2\">\n <div *ngIf=\"!collaborators?.length\" class=\"p-10 font-weight-bold sb-bg-color-white\">\n {{configService.labelConfig?.err?.collaboratorsNotFound}}\n </div>\n <div *ngIf=\"collaborators?.length\" class=\"w-100 pt-10 font-weight-bold\">{{collaborators.length}} collaborators exists</div>\n <div class=\"masonry-grid mt-20\" *ngIf=\"collaborators?.length\">\n <div *ngFor=\"let collaborator of collaborators\" class=\"sb-card\">\n <div class=\"sb-card-body\">\n <div class=\"sb-card-metas\">\n <div class=\"sb-card-image mr-16\">\n {{(collaborator.firstName).charAt(0)}}\n </div>\n <div class=\"sb-card-meta course\">\n <div class=\"sb-card-meta-item mb-16 font-weight-bold\">\n {{collaborator.firstName}} {{collaborator.lastName}}\n </div>\n <div class=\"sb-color-gray-400 fs-0-92\">\n {{collaborator.organisations[0].orgName}}\n </div>\n </div>\n <div class=\"d-flex flex-align-self-end sb-custom-toggle\">\n <a class=\"sb-color-error d-flex fs-0-785 font-weight-bold flex-ai-end\" \n *ngIf=\"!collaborator.isSelected && (isContentOwner || isRootOrgAdmin)\" (click)=\"toggleSelectionCollaborator(collaborator.identifier)\"\n libTelemetryInteract [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('remove_collaborator','click','select',\n telemetryService.telemetryPageId, {identifier: collaborator.identifier})\">\n {{configService.labelConfig?.button_labels?.remove_btn_label}}\n </a>\n <div class=\"ui right floated compact segment\" *ngIf=\"collaborator.isSelected && (isContentOwner || isRootOrgAdmin)\" (click)=\"toggleSelectionCollaborator(collaborator.identifier)\"\n libTelemetryInteract [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('add_collaborator','click','select',\n telemetryService.telemetryPageId, {identifier: collaborator.identifier})\">\n <div class=\"ui mini fitted toggle checkbox\">\n <input type=\"checkbox\" checked><label></label>\n </div>\n </div>\n </div>\n </div>\n </div> \n </div>\n </div>\n </div>\n </sui-tabset>\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-primary\"\n [ngClass]=\"{'sb-btn-disabled': (selectedUsers.length === 0 && selectedcollaborators.length === 0)}\"\n [disabled]=\"(selectedUsers.length === 0 && selectedcollaborators.length === 0)\"\n (click)=\"addRemoveCollaboratorToCourse(modal)\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('done','click','submit',\n telemetryService?.telemetryPageId)\">\n {{configService.labelConfig?.button_labels?.done_btn_label}}\n </button>\n </div>\n</sui-modal>\n", styles: [".sb-custom-toggle{height:20px;width:42px}.sb-custom-toggle .compact{padding:0!important;margin:0!important;border:0!important}.sb-custom-toggle .checkbox{transform:scale(.7)}.searcher{border-radius:.28571429rem!important;box-shadow:0 2px 4px #2224261f,0 2px 10px #22242626!important;padding:0;background:#fff;margin:0!important;font-size:.785rem!important;width:206px;z-index:9;position:absolute;cursor:pointer}.searcher ul{padding:10px 0 0!important;background:#fff}.searcher ul li{margin-bottom:5px!important;padding-left:34px}.searcher ul li:hover{background:#d8dee2}.flex-align-item-center{align-items:center}.h-70{height:70px}.mt-50{margin-top:50px}.sb-card{background-color:var(--white);border:.0625rem solid #dedede;border-radius:.25rem;cursor:pointer;overflow:hidden;position:relative;transition:box-shadow .3s ease-out,transform .3s ease-out,opacity .2s ease-out;transition-delay:.1s;margin:.1875rem .6rem .6rem 0}.sb-card:hover{transform:translateY(-.1875rem);box-shadow:0 .125rem .4375rem #cac5c5}.sb-card .sb-card-body{height:5.75rem;padding:1rem 1rem .5rem;overflow:hidden}.sb-card .sb-card-metas{display:flex;align-items:flex-start}.sb-card .sb-card-image{width:3.75rem;height:3.75rem;border:.0625rem solid var(--gray-100);background-color:#34495e;color:#fff;border-radius:100%;margin:0 1rem 0 0;font-size:2rem;text-align:center;line-height:3.5rem}.sb-card .sb-card-image img{width:4.375rem;height:5.75rem;object-fit:cover}.sb-card .sb-card-meta{height:3.75rem;width:9rem;display:flex;flex-wrap:wrap;flex-direction:column;overflow:hidden}.masonry-grid{display:flex;flex-wrap:wrap}.flex-align-self-end{align-self:flex-end}.masonry-grid .ui.toggle.checkbox input:checked~.box:after{left:2rem!important}\n"] }]
246
+ }], ctorParameters: function () { return [{ type: i1.HelperService }, { type: i2.ToasterService }, { type: i3.ConfigService }, { type: i4.EditorService }, { type: i5.EditorTelemetryService }]; }, propDecorators: { modalDismissEmitter: [{
247
+ type: Output
248
+ }], modal: [{
249
+ type: ViewChild,
250
+ args: ['modal']
251
+ }], addCollaborator: [{
252
+ type: Input
253
+ }], collectionId: [{
254
+ type: Input
255
+ }] } });
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlLWNvbGxhYm9yYXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2xsZWN0aW9uLWVkaXRvci1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtY29sbGFib3JhdG9yL21hbmFnZS1jb2xsYWJvcmF0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvbWFuYWdlLWNvbGxhYm9yYXRvci9tYW5hZ2UtY29sbGFib3JhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTzFGLE9BQU8sS0FBSyxDQUFDLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7OztBQU0vQixNQUFNLE9BQU8sMkJBQTJCO0lBbUN0QyxZQUNTLGFBQTRCLEVBQzVCLGNBQThCLEVBQzlCLGFBQTRCLEVBQzVCLGFBQTRCLEVBQzVCLGdCQUF3QztRQUp4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF3QjtRQXZDdkMsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQVFqRCxrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFDM0IsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLCtCQUEwQixHQUFHLENBQUMsQ0FBQztRQUMvQix5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QUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEUsSUFBSSxhQUFhLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzFDO0lBQ0gsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3RDLENBQUM7K0dBNVBVLDJCQUEyQjttR0FBM0IsMkJBQTJCLHNTQ2J4QywweVVBK0lBOzs0RkRsSWEsMkJBQTJCO2tCQUx2QyxTQUFTOytCQUNFLHlCQUF5Qjs4TkFLekIsbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNxQixLQUFLO3NCQUFoQyxTQUFTO3VCQUFDLE9BQU87Z0JBQ1QsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFZGl0b3JUZWxlbWV0cnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGVsZW1ldHJ5L3RlbGVtZXRyeS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdG9hc3Rlci90b2FzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VkaXRvci9lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaGVscGVyL2hlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcvY29uZmlnLnNlcnZpY2UnO1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaC1lcyc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItbWFuYWdlLWNvbGxhYm9yYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYW5hZ2UtY29sbGFib3JhdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWFuYWdlLWNvbGxhYm9yYXRvci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE1hbmFnZUNvbGxhYm9yYXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBPdXRwdXQoKSBtb2RhbERpc21pc3NFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBWaWV3Q2hpbGQoJ21vZGFsJykgcHJpdmF0ZSBtb2RhbDtcbiAgQElucHV0KCkgYWRkQ29sbGFib3JhdG9yO1xuICBASW5wdXQoKSBjb2xsZWN0aW9uSWQ7XG4gIHB1YmxpYyBzaG93Q29sbGFib3JhdGlvblBvcHVwOiBib29sZWFuO1xuICBwdWJsaWMgY29udGVudENvbGxhYm9yYXRvcnM6IGFueTtcbiAgcHVibGljIGNvbnRlbnRPd25lcjtcbiAgcHVibGljIGNyZWF0b3JBbmRDb2xsYWJvcmF0b3JzSWRzO1xuICBwdWJsaWMgc2VsZWN0ZWRVc2VycyA9IFtdO1xuICBwdWJsaWMgc2VsZWN0ZWRjb2xsYWJvcmF0b3JzID0gW107XG4gIHB1YmxpYyB1c2VycyA9IFtdO1xuICBwdWJsaWMgY29sbGFib3JhdG9ycyA9IFtdO1xuICBwdWJsaWMgbWFuYWdlQ29sbGFib3JhdG9yVGFiVmlzaXQgPSAwO1xuICBwdWJsaWMgdXBkYXRlZENvbGxhYm9yYXRvcnMgPSBbXTtcbiAgcHVibGljIGlzQWRkQ29sbGFib3JhdG9yVGFiOiBib29sZWFuO1xuICBwdWJsaWMgc2VhcmNoS2V5d29yZCA9ICcnO1xuICBwdWJsaWMgc2VhcmNoUmVzID0geyBjb3VudDogMCwgY29udGVudDogW10sIGlzRW1wdHlSZXNwb25zZTogZmFsc2UsIGVycm9yTWVzc2FnZTogJycsIHNlYXJjaFN0YXR1czogJ3N0YXJ0JyB9O1xuICBwdWJsaWMgdXNlclNlYXJjaEJvZHkgPSB7XG4gICAgcmVxdWVzdDoge1xuICAgICAgICBxdWVyeTogJycsXG4gICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgICdvcmdhbmlzYXRpb25zLnJvbGVzJzogJ0NPTlRFTlRfQ1JFQVRPUicsXG4gICAgICAgICAgICByb290T3JnSWQ6ICcnXG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkczogWydlbWFpbCcsICdmaXJzdE5hbWUnLCAnaWRlbnRpZmllcicsICdsYXN0TmFtZScsICdvcmdhbmlzYXRpb25zJywgJ3Jvb3RPcmdOYW1lJywgJ3Bob25lJ10sXG4gICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgbGltaXQ6IDIwMFxuICAgIH1cbiAgfTtcbiAgcHVibGljIGlzQ29udGVudE93bmVyID0gZmFsc2U7XG4gIHB1YmxpYyBpc1Jvb3RPcmdBZG1pbjogYm9vbGVhbjtcbiAgcHVibGljIGN1cnJlbnRVc2VyOiBhbnk7XG4gIHB1YmxpYyBhbGxVc2Vyc0NvdW50ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaGVscGVyU2VydmljZTogSGVscGVyU2VydmljZSxcbiAgICBwdWJsaWMgdG9hc3RlclNlcnZpY2U6IFRvYXN0ZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHB1YmxpYyBlZGl0b3JTZXJ2aWNlOiBFZGl0b3JTZXJ2aWNlLFxuICAgIHB1YmxpYyB0ZWxlbWV0cnlTZXJ2aWNlOiBFZGl0b3JUZWxlbWV0cnlTZXJ2aWNlXG4gICAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQudXNlcicpO1xuICAgIHRoaXMuaXNSb290T3JnQWRtaW4gPSBfLmhhcyh0aGlzLmN1cnJlbnRVc2VyLCAnaXNSb290T3JnQWRtaW4nKSA/IHRoaXMuY3VycmVudFVzZXIuaXNSb290T3JnQWRtaW4gOiBmYWxzZTtcbiAgICBpZiAoXy5oYXModGhpcy5jdXJyZW50VXNlciwgJ29yZ0lkcycpKSB7XG4gICAgICB0aGlzLnVzZXJTZWFyY2hCb2R5LnJlcXVlc3QuZmlsdGVycy5yb290T3JnSWQgPSB0aGlzLmN1cnJlbnRVc2VyLm9yZ0lkcztcbiAgICB9XG4gICAgdGhpcy5zZXRDcmVhdG9yQW5kQ29sbGFib3JhdG9ycygpO1xuICB9XG5cbiAgc2V0Q3JlYXRvckFuZENvbGxhYm9yYXRvcnMoKSB7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmZldGNoQ29udGVudERldGFpbHModGhpcy5jb2xsZWN0aW9uSWQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgdGhpcy5jb250ZW50Q29sbGFib3JhdG9ycyA9IF8uZ2V0KHJlcy5yZXN1bHQuY29udGVudCwgJ2NvbGxhYm9yYXRvcnMnLCBbXSk7XG4gICAgICB0aGlzLmNvbnRlbnRPd25lciA9IFtfLmdldChyZXMucmVzdWx0LmNvbnRlbnQsICdjcmVhdGVkQnknKV07XG4gICAgICB0aGlzLmNyZWF0b3JBbmRDb2xsYWJvcmF0b3JzSWRzID0gWy4uLnRoaXMuY29udGVudENvbGxhYm9yYXRvcnMsIC4uLnRoaXMuY29udGVudE93bmVyXTtcbiAgICAgIHRoaXMuY2hlY2tVc2VyUm9sZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgY2hlY2tVc2VyUm9sZSgpIHtcbiAgICBpZiAodGhpcy5jb250ZW50T3duZXIgJiYgKHRoaXMuY29udGVudE93bmVyWzBdID09PSB0aGlzLmN1cnJlbnRVc2VyLmlkKSkge1xuICAgICAgdGhpcy5pc0NvbnRlbnRPd25lciA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQ29udGVudE93bmVyIHx8IHRoaXMuaXNSb290T3JnQWRtaW4pIHtcbiAgICAgIHRoaXMuaXNBZGRDb2xsYWJvcmF0b3JUYWIgPSB0cnVlO1xuICAgICAgdGhpcy5nZXRBbGxVc2VyTGlzdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldENvbGxhYm9yYXRvcnMoKTtcbiAgICB9XG4gICAgdGhpcy5zaG93Q29sbGFib3JhdGlvblBvcHVwID0gIHRoaXMuYWRkQ29sbGFib3JhdG9yO1xuICB9XG5cbiAgZGlzbWlzc0NvbGxhYm9yYXRpb25Qb3B1cCgpIHtcbiAgICB0aGlzLnNob3dDb2xsYWJvcmF0aW9uUG9wdXAgPSBmYWxzZTtcbiAgICB0aGlzLm1vZGFsRGlzbWlzc0VtaXR0ZXIuZW1pdCh7fSk7XG4gIH1cblxuICBnZXRBbGxVc2VyTGlzdCgpIHtcbiAgICB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0QWxsVXNlcih0aGlzLnVzZXJTZWFyY2hCb2R5KS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgIHRoaXMudXNlcnMgPSBbXTtcbiAgICAgIGlmIChfLmhhcyhyZXNwb25zZSwgJ3Jlc3VsdC5yZXNwb25zZS5jb250ZW50JykpIHtcbiAgICAgICAgY29uc3QgYWxsVXNlcnMgPSBfLmdldChyZXNwb25zZSwgJ3Jlc3VsdC5yZXNwb25zZS5jb250ZW50Jyk7XG4gICAgICAgIHRoaXMuYWxsVXNlcnNDb3VudCA9IGFsbFVzZXJzLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMudXNlcnMgPSB0aGlzLmV4Y2x1ZGVDcmVhdG9yQW5kQ29sbGFib3JhdG9ycyhhbGxVc2Vycyk7XG4gICAgICB9XG4gICAgfSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDAxJykpO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH0pO1xuICB9XG5cbiAgZXhjbHVkZUNyZWF0b3JBbmRDb2xsYWJvcmF0b3JzKGFsbFVzZXJzKSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKGFsbFVzZXJzLCB1c2VyID0+IHtcbiAgICAgIHJldHVybiAhXy5pbmNsdWRlcyh0aGlzLmNyZWF0b3JBbmRDb2xsYWJvcmF0b3JzSWRzLCB1c2VyLmlkZW50aWZpZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlU2VsZWN0aW9uVXNlcih1c2VySWRlbnRpZmllcikge1xuICAgIF8uZm9yRWFjaCh0aGlzLnVzZXJzLCB1c2VyID0+IHtcbiAgICAgIGlmICh1c2VyLmlkZW50aWZpZXIgPT09IHVzZXJJZGVudGlmaWVyKSB7XG4gICAgICAgIGlmIChfLmhhcyh1c2VyLCAnaXNTZWxlY3RlZCcpICYmIHVzZXIuaXNTZWxlY3RlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHVzZXIuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZFVzZXJzLmluZGV4T2YodXNlcklkZW50aWZpZXIpO1xuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXNlci5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlcnMucHVzaCh1c2VySWRlbnRpZmllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdGlvbkNvbGxhYm9yYXRvcih1c2VySWRlbnRpZmllcikge1xuICAgIF8uZm9yRWFjaCh0aGlzLmNvbGxhYm9yYXRvcnMsIHVzZXIgPT4ge1xuICAgICAgaWYgKHVzZXIuaWRlbnRpZmllciA9PT0gdXNlcklkZW50aWZpZXIpIHtcbiAgICAgICAgaWYgKF8uaGFzKHVzZXIsICdpc1NlbGVjdGVkJykgJiYgdXNlci5pc1NlbGVjdGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgdXNlci5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkY29sbGFib3JhdG9ycy5pbmRleE9mKHVzZXJJZGVudGlmaWVyKTtcbiAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZGNvbGxhYm9yYXRvcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXNlci5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkY29sbGFib3JhdG9ycy5wdXNoKHVzZXJJZGVudGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWRkUmVtb3ZlQ29sbGFib3JhdG9yVG9Db3Vyc2UobW9kYWwpIHtcbiAgICB0aGlzLnVwZGF0ZWRDb2xsYWJvcmF0b3JzID0gdGhpcy5jb250ZW50Q29sbGFib3JhdG9ycztcbiAgICB0aGlzLnVwZGF0ZWRDb2xsYWJvcmF0b3JzID0gXy5jb25jYXQodGhpcy51cGRhdGVkQ29sbGFib3JhdG9ycywgdGhpcy5zZWxlY3RlZFVzZXJzKTtcbiAgICB0aGlzLnVwZGF0ZWRDb2xsYWJvcmF0b3JzID0gXy5kaWZmZXJlbmNlKHRoaXMudXBkYXRlZENvbGxhYm9yYXRvcnMsIHRoaXMuc2VsZWN0ZWRjb2xsYWJvcmF0b3JzKTtcbiAgICB0aGlzLmhlbHBlclNlcnZpY2UudXBkYXRlQ29sbGFib3JhdG9yKHRoaXMuY29sbGVjdGlvbklkLCB0aGlzLnVwZGF0ZWRDb2xsYWJvcmF0b3JzKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5wYXJhbXMuc3RhdHVzID09PSAnc3VjY2Vzc2Z1bCcpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDEyJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMDEnKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDAxJykpO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH0pO1xuICAgIG1vZGFsLmRlbnkoKTtcbiAgfVxuXG4gIC8qIHRvIGJlIGNhbGxlZCB3aGVuIHVzZXIgY2hhbmdlIHRhYiB0byBhZGQgY29sbGFib3JhdG9yICovXG4gIGdldEFsbHVzZXJzKCkge1xuICAgIHRoaXMuaXNBZGRDb2xsYWJvcmF0b3JUYWIgPSB0cnVlO1xuICB9XG5cbiAgLyogdG8gYmUgY2FsbGVkIHdoZW4gdXNlciBjaGFuZ2UgdGFiIHRvIG1hbmFnZSBjb2xsYWJvcmF0b3IgKi9cbiAgZ2V0Q29sbGFib3JhdG9ycygpIHtcbiAgICB0aGlzLmlzQWRkQ29sbGFib3JhdG9yVGFiID0gZmFsc2U7XG4gICAgdGhpcy5tYW5hZ2VDb2xsYWJvcmF0b3JUYWJWaXNpdCArPSAxO1xuICAgIGlmICh0aGlzLm1hbmFnZUNvbGxhYm9yYXRvclRhYlZpc2l0IDw9IDEpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zdHJpbmctbGl0ZXJhbFxuICAgICAgdGhpcy51c2VyU2VhcmNoQm9keS5yZXF1ZXN0LmZpbHRlcnNbJ3VzZXJJZCddID0gdGhpcy5jb250ZW50Q29sbGFib3JhdG9ycztcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuY29udGVudENvbGxhYm9yYXRvcnMpKSB7XG4gICAgICAgIHRoaXMuaGVscGVyU2VydmljZS5nZXRBbGxVc2VyKHRoaXMudXNlclNlYXJjaEJvZHkpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuY29sbGFib3JhdG9ycyA9IFtdO1xuICAgICAgICAgIGlmIChfLmhhcyhyZXNwb25zZSwgJ3Jlc3VsdC5yZXNwb25zZS5jb250ZW50JykpIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGFib3JhdG9ycyA9IF8uZ2V0KHJlc3BvbnNlLCAncmVzdWx0LnJlc3BvbnNlLmNvbnRlbnQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMuY29sbGFib3JhdG9ycyA9IFtdO1xuICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDAxJykpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc29ydFVzZXJzTGlzdCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJ2ZpcnN0TmFtZScpIHtcbiAgICAgIHRoaXMudXNlcnMgPSBfLm9yZGVyQnkodGhpcy51c2VycywgW3VzZXIgPT4gdXNlclt2YWx1ZV0udG9Mb3dlckNhc2UoKV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVzZXJzID0gXy5vcmRlckJ5KHRoaXMudXNlcnMsIFt1c2VyID0+IHVzZXIub3JnYW5pc2F0aW9uc1swXS5vcmdOYW1lID8gdXNlci5vcmdhbmlzYXRpb25zWzBdLm9yZ05hbWUudG9Mb3dlckNhc2UoKSA6ICcnXSk7XG4gICAgfVxuICB9XG5cbiAgc2VhcmNoQnlLZXl3b3JkKCkge1xuICAgIGNvbnN0IHNlYXJjaFJlcXVlc3QgPSB0aGlzLnVzZXJTZWFyY2hCb2R5O1xuICAgIGlmICh0aGlzLnZhbGlkYXRlRW1haWwodGhpcy5zZWFyY2hLZXl3b3JkKSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXN0cmluZy1saXRlcmFsXG4gICAgICBzZWFyY2hSZXF1ZXN0LnJlcXVlc3QuZmlsdGVyc1snZW1haWwnXSA9IHRoaXMuc2VhcmNoS2V5d29yZDtcbiAgICB9IGVsc2UgaWYgKC9eXFxkKyQvLnRlc3QodGhpcy5zZWFyY2hLZXl3b3JkKSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3RyaW5nLWxpdGVyYWxcbiAgICAgICAgc2VhcmNoUmVxdWVzdC5yZXF1ZXN0LmZpbHRlcnNbJ3Bob25lJ10gPSB0aGlzLnNlYXJjaEtleXdvcmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2VhcmNoUmVxdWVzdC5yZXF1ZXN0LnF1ZXJ5ID0gdGhpcy5zZWFyY2hLZXl3b3JkO1xuICAgIH1cblxuICAgIHRoaXMuaGVscGVyU2VydmljZS5nZXRBbGxVc2VyKHNlYXJjaFJlcXVlc3QpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNlYXJjaFJlcy5zZWFyY2hTdGF0dXMgPSAnZW5kJztcbiAgICAgICAgaWYgKF8uaGFzKHJlc3BvbnNlLCAncmVzdWx0LnJlc3BvbnNlLmNvbnRlbnQnKSkge1xuICAgICAgICAgIHRoaXMuc2VhcmNoUmVzLmNvbnRlbnQgPSB0aGlzLmV4Y2x1ZGVDcmVhdG9yQW5kQ29sbGFib3JhdG9ycyhfLmdldChyZXNwb25zZSwgJ3Jlc3VsdC5yZXNwb25zZS5jb250ZW50JykpO1xuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFJlcy5jb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hSZXMuaXNFbXB0eVJlc3BvbnNlID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzLmlzRW1wdHlSZXNwb25zZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFJlcy5jb250ZW50ID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDAxJykpO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgdGhpcy5zZWFyY2hSZXMuY29udGVudCA9IFtdO1xuICAgICAgdGhpcy5zZWFyY2hSZXMuaXNFbXB0eVJlc3BvbnNlID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VhcmNoUmVzLmVycm9yTWVzc2FnZSA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAwMScpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRTZWFyY2goKSB7XG4gICAgdGhpcy5zZWFyY2hSZXMuY29udGVudCA9IFtdO1xuICAgIHRoaXMuc2VhcmNoUmVzLmlzRW1wdHlSZXNwb25zZSA9IGZhbHNlO1xuICB9XG5cbiAgcmVmcmVzaFNlYXJjaCgpIHtcbiAgICB0aGlzLnNlYXJjaEtleXdvcmQgPSAnJztcbiAgICB0aGlzLnNlYXJjaEJ5S2V5d29yZCgpO1xuICB9XG5cbiAgdmFsaWRhdGVFbWFpbChlbWFpbCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICBjb25zdCByZSA9IC9eKChbXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcXSl8KChbYS16QS1aXFwtMC05XStcXC4pK1thLXpBLVpdezIsfSkpJC87XG4gICAgcmV0dXJuIHJlLnRlc3QoU3RyaW5nKGVtYWlsKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIHNlbGVjdFVzZXIodXNlcikge1xuICAgIHVzZXIuaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgbGV0IGluZGV4ID0gXy5maW5kSW5kZXgodGhpcy51c2VycywgKGVsZW1lbnQpID0+IHsgcmV0dXJuIGVsZW1lbnQuaWRlbnRpZmllciA9PT0gdXNlci5pZGVudGlmaWVyOyB9KTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy51c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy51c2Vycy51bnNoaWZ0KHVzZXIpO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy5zZWxlY3RlZFVzZXJzLmluZGV4T2YodXNlci5pZGVudGlmaWVyKTtcbiAgICBpZiAoc2VsZWN0ZWRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRVc2Vycy5wdXNoKHVzZXIuaWRlbnRpZmllcik7XG4gICAgfVxuICB9XG5cbiAgdmlld0FsbFJlc3VsdHMoKSB7XG4gICAgdGhpcy51c2VycyA9IHRoaXMuc2VhcmNoUmVzLmNvbnRlbnQ7XG4gIH1cbn1cbiIsIjxzdWktbW9kYWwgKm5nSWY9XCJzaG93Q29sbGFib3JhdGlvblBvcHVwXCIgW211c3RTY3JvbGxdPVwidHJ1ZVwiIFtpc0Nsb3NhYmxlXT1cInRydWVcIiBbdHJhbnNpdGlvbkR1cmF0aW9uXT1cIjBcIlxuICAgIFtzaXplXT1cIidmdWxsc2NyZWVuJ1wiIGNsYXNzPVwic2ItbW9kYWwgc2ItbW9kYWwtZnVsbHNjcmVlbiBzaG93Q29sbGFib3JhdG9yXCIgYXBwQm9keVNjcm9sbCBcbiAgICAoZGlzbWlzc2VkKT1cImRpc21pc3NDb2xsYWJvcmF0aW9uUG9wdXAoKVwiICNtb2RhbD5cbiAgICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtaGVhZGVyXCI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWNvbnRlbnQgc2ItYmctY29sb3ItcHJpbWFyeS0xMDAgcHQtMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtamMtc3BhY2UtYmV0d2VlbiBweS0xMCBmbGV4LWFsaWduLWl0ZW0tY2VudGVyIGgtNzAgc2ItYmctY29sb3Itd2hpdGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy0xIGZvbnQtd2VpZ2h0LWJvbGRcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uY29sbGFib3JhdG9yc319PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiLXNlYXJjaC1ib3ggc21hbGwgbm8tYnRuIG1yLTEwXCIgKm5nSWY9XCJpc0FkZENvbGxhYm9yYXRvclRhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWRpdiByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwic2VhcmNoIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXl1cCk9XCJzZWFyY2hLZXl3b3JkLmxlbmd0aCA+PSAzID8gc2VhcmNoQnlLZXl3b3JkKCkgOiByZXNldFNlYXJjaCgpXCIgY2xhc3M9XCJzYi1zZWFyY2gtaW5wdXRcIiBbKG5nTW9kZWwpXT1cInNlYXJjaEtleXdvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnNlYXJjaFBsYWNlaG9sZGVyfX0gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImNsb3NlIGljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIiAoY2xpY2spPVwicmVmcmVzaFNlYXJjaCgpXCIgW2hpZGRlbl09XCIhKHNlYXJjaFJlcy5zZWFyY2hTdGF0dXMgPT0gJ2VuZCcgJiYgc2VhcmNoS2V5d29yZC5sZW5ndGggPj0gMyApXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWxcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LnNlYXJjaF9idG5fbGFiZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpIHJpZ2h0IGZsb2F0ZWQgaGVhZGVyIHNlYXJjaGVyXCIgKm5nSWY9XCJpc0FkZENvbGxhYm9yYXRvclRhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsICpuZ0lmPVwic2VhcmNoS2V5d29yZC5sZW5ndGggPj0gMyAmJiBzZWFyY2hSZXMuY29udGVudC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJzZWFyY2hSZXN1bHRcIiAqbmdGb3I9XCJsZXQgdXNlciBvZiBzZWFyY2hSZXMuY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCAoY2xpY2spPVwic2VsZWN0VXNlcih1c2VyKVwiPnt7dXNlci5maXJzdE5hbWV9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInNlYXJjaFJlc3VsdCBmb250LXdlaWdodC1ib2xkXCIgaWQ9XCJ2aWV3LWFsbC1yZXN1bHRzXCIgKm5nSWY9XCJzZWFyY2hSZXMuY29udGVudC5sZW5ndGggPj0gNVwiIChjbGljayk9XCJ2aWV3QWxsUmVzdWx0cygpXCI+PHNwYW4+VmlldyBBbGwgUmVzdWx0czwvc3Bhbj48L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCAqbmdJZj1cInNlYXJjaEtleXdvcmQubGVuZ3RoID49IDMgJiYgc2VhcmNoUmVzLmlzRW1wdHlSZXNwb25zZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInNlYXJjaFJlc3VsdE1zZ1wiPjxzdHJvbmc+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5lcnI/LnJlc3VsdE5vdEZvdW5kfX08L3N0cm9uZz48L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCAqbmdJZj1cInNlYXJjaFJlcy5lcnJvck1lc3NhZ2UubGVuZ3RoICAmJiAoc2VhcmNoS2V5d29yZC5sZW5ndGggPj0gMylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPVwic2VhcmNoUmVzdWx0TXNnXCI+e3tzZWFyY2hSZXMuZXJyb3JNZXNzYWdlfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPHN1aS10YWJzZXQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1aSBwb2ludGluZyBzZWNvbmRhcnkgbWVudVwiPlxuICAgICAgICAgICAgPGEgY2xhc3M9XCJpdGVtXCIgKm5nSWY9XCIoaXNDb250ZW50T3duZXIgfHwgaXNSb290T3JnQWRtaW4pXCIgKGFjdGl2YXRlKT1cImdldEFsbHVzZXJzKClcIiBzdWlUYWJIZWFkZXI9XCIxXCIgbGliVGVsZW1ldHJ5SW50ZXJhY3RcbiAgICAgICAgICAgIFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgnYWRkX2NvbGxhYm9yYXRvcnMnLCdjbGljaycsJ2xhdW5jaCcsIHRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkKVwiXG4gICAgICAgICAgICA+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmFkZENvbGxhYm9yYXRvcnN9fTwvYT5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiaXRlbVwiIChhY3RpdmF0ZSk9XCJnZXRDb2xsYWJvcmF0b3JzKClcIiBzdWlUYWJIZWFkZXI9XCIyXCIgbGliVGVsZW1ldHJ5SW50ZXJhY3RcbiAgICAgICAgICAgIFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgnbWFuYWdlX2NvbGxhYm9yYXRvcnMnLCdjbGljaycsJ2xhdW5jaCcsIHRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkKVwiXG4gICAgICAgICAgICA+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/Lm1hbmFnZUNvbGxhYm9yYXRvcnN9fTwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1aSBzZWdtZW50IHB4LTAgcHktMTUgbXQtMSBzYi1iZy1jb2xvci1wcmltYXJ5LTEwMFwiIHN1aVRhYkNvbnRlbnQ9XCIxXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXVzZXJzPy5sZW5ndGhcIiBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgc2ItYmctY29sb3Itd2hpdGUgcC0xMFwiPlxuICAgICAgICAgICAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uZXJyPy51c2VyTm90Rm91bmR9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHB5LTEwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJzPy5sZW5ndGhcIiBjbGFzcz1cInctMTAwIHB0LTEwIGZvbnQtd2VpZ2h0LWJvbGRcIj5TaG93aW5nIHt7dXNlcnMubGVuZ3RofX0gb3V0IG9mIHt7YWxsVXNlcnNDb3VudH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInNlYXJjaCBkcm9wZG93biBweS01IHNiLWJnLWNvbG9yLXdoaXRlIG1iLTEwIGZvbnQtd2VpZ2h0LWJvbGRcIiAqbmdJZj1cInVzZXJzPy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic29ydFVzZXJzTGlzdCgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U29ydCBCeTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZmlyc3ROYW1lXCI+TmFtZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwib3JnYW5pc2F0aW9uc1wiPk9yZ2FuaXNhdGlvbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFzb25yeS1ncmlkXCIgKm5nSWY9XCJ1c2Vycz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdXNlciBvZiB1c2Vyc1wiIGNsYXNzPVwic2ItY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItY2FyZC1tZXRhc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1jYXJkLWltYWdlIG1yLTE2IGZvbnQtd2VpZ2h0LWJvbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyh1c2VyLmZpcnN0TmFtZSkuY2hhckF0KDApfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItY2FyZC1tZXRhIGNvdXJzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1jYXJkLW1ldGEtaXRlbSBtYi0xNiBmb250LXdlaWdodC1ib2xkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dXNlci5maXJzdE5hbWV9fSB7e3VzZXIubGFzdE5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1jb2xvci1ncmF5LTQwMCBmcy0wLTkyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dXNlci5vcmdhbmlzYXRpb25zWzBdLm9yZ05hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1hbGlnbi1zZWxmLWVuZCBzYi1jdXN0b20tdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwic2ItY29sb3ItcHJpbWFyeSBkLWZsZXggZnMtMC03ODUgZm9udC13ZWlnaHQtYm9sZCBmbGV4LWFpLWVuZFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiF1c2VyLmlzU2VsZWN0ZWRcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uVXNlcih1c2VyLmlkZW50aWZpZXIpXCIgbGliVGVsZW1ldHJ5SW50ZXJhY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RlbGVtZXRyeUludGVyYWN0RWRhdGFdPVwidGVsZW1ldHJ5U2VydmljZS5nZXRUZWxlbWV0cnlJbnRlcmFjdEVkYXRhKCdhZGRfdXNlcicsJ2NsaWNrJywnc2VsZWN0JywgdGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQsIHtpZGVudGlmaWVyOiB1c2VyLmlkZW50aWZpZXJ9KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uIHBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LmFkZF9idG5fbGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aSByaWdodCBmbG9hdGVkIGNvbXBhY3Qgc2VnbWVudFwiICpuZ0lmPVwidXNlci5pc1NlbGVjdGVkXCIgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGlvblVzZXIodXNlci5pZGVudGlmaWVyKVwiIGxpYlRlbGVtZXRyeUludGVyYWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgncmVtb3ZlX3VzZXInLCdjbGljaycsJ3NlbGVjdCcsIHRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkLCB7aWRlbnRpZmllcjogdXNlci5pZGVudGlmaWVyfSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aSBtaW5pIGZpdHRlZCB0b2dnbGUgY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2hlY2tlZD48bGFiZWw+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1aSBzZWdtZW50ICBweC0wIHB5LTE1IG10LTEgc2ItYmctY29sb3ItcHJpbWFyeS0xMDBcIiBzdWlUYWJDb250ZW50PVwiMlwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2xsYWJvcmF0b3JzPy5sZW5ndGhcIiBjbGFzcz1cInAtMTAgZm9udC13ZWlnaHQtYm9sZCBzYi1iZy1jb2xvci13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uZXJyPy5jb2xsYWJvcmF0b3JzTm90Rm91bmR9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sbGFib3JhdG9ycz8ubGVuZ3RoXCIgY2xhc3M9XCJ3LTEwMCBwdC0xMCBmb250LXdlaWdodC1ib2xkXCI+e3tjb2xsYWJvcmF0b3JzLmxlbmd0aH19IGNvbGxhYm9yYXRvcnMgZXhpc3RzPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFzb25yeS1ncmlkIG10LTIwXCIgKm5nSWY9XCJjb2xsYWJvcmF0b3JzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2xsYWJvcmF0b3Igb2YgY29sbGFib3JhdG9yc1wiIGNsYXNzPVwic2ItY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItY2FyZC1tZXRhc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1jYXJkLWltYWdlIG1yLTE2XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGNvbGxhYm9yYXRvci5maXJzdE5hbWUpLmNoYXJBdCgwKX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiLWNhcmQtbWV0YSBjb3Vyc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItY2FyZC1tZXRhLWl0ZW0gbWItMTYgZm9udC13ZWlnaHQtYm9sZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbGxhYm9yYXRvci5maXJzdE5hbWV9fSB7e2NvbGxhYm9yYXRvci5sYXN0TmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiLWNvbG9yLWdyYXktNDAwIGZzLTAtOTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb2xsYWJvcmF0b3Iub3JnYW5pc2F0aW9uc1swXS5vcmdOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtYWxpZ24tc2VsZi1lbmQgc2ItY3VzdG9tLXRvZ2dsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInNiLWNvbG9yLWVycm9yIGQtZmxleCBmcy0wLTc4NSBmb250LXdlaWdodC1ib2xkIGZsZXgtYWktZW5kXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNvbGxhYm9yYXRvci5pc1NlbGVjdGVkICYmIChpc0NvbnRlbnRPd25lciB8fCBpc1Jvb3RPcmdBZG1pbilcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uQ29sbGFib3JhdG9yKGNvbGxhYm9yYXRvci5pZGVudGlmaWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYlRlbGVtZXRyeUludGVyYWN0IFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgncmVtb3ZlX2NvbGxhYm9yYXRvcicsJ2NsaWNrJywnc2VsZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQsIHtpZGVudGlmaWVyOiBjb2xsYWJvcmF0b3IuaWRlbnRpZmllcn0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8ucmVtb3ZlX2J0bl9sYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpIHJpZ2h0IGZsb2F0ZWQgY29tcGFjdCBzZWdtZW50XCIgKm5nSWY9XCJjb2xsYWJvcmF0b3IuaXNTZWxlY3RlZCAmJiAoaXNDb250ZW50T3duZXIgfHwgaXNSb290T3JnQWRtaW4pXCIgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGlvbkNvbGxhYm9yYXRvcihjb2xsYWJvcmF0b3IuaWRlbnRpZmllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJUZWxlbWV0cnlJbnRlcmFjdCBbdGVsZW1ldHJ5SW50ZXJhY3RFZGF0YV09XCJ0ZWxlbWV0cnlTZXJ2aWNlLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ2FkZF9jb2xsYWJvcmF0b3InLCdjbGljaycsJ3NlbGVjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkLCB7aWRlbnRpZmllcjogY29sbGFib3JhdG9yLmlkZW50aWZpZXJ9KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpIG1pbmkgZml0dGVkIHRvZ2dsZSBjaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjaGVja2VkPjxsYWJlbD48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiBcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3N1aS10YWJzZXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWFjdGlvbnNcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWwgc2ItYnRuLXByaW1hcnlcIlxuICAgIFtuZ0NsYXNzXT1cInsnc2ItYnRuLWRpc2FibGVkJzogKHNlbGVjdGVkVXNlcnMubGVuZ3RoID09PSAwICYmIHNlbGVjdGVkY29sbGFib3JhdG9ycy5sZW5ndGggPT09IDApfVwiXG4gICAgW2Rpc2FibGVkXT1cIihzZWxlY3RlZFVzZXJzLmxlbmd0aCA9PT0gMCAmJiBzZWxlY3RlZGNvbGxhYm9yYXRvcnMubGVuZ3RoID09PSAwKVwiXG4gICAgIChjbGljayk9XCJhZGRSZW1vdmVDb2xsYWJvcmF0b3JUb0NvdXJzZShtb2RhbClcIiBsaWJUZWxlbWV0cnlJbnRlcmFjdFxuICAgICBbdGVsZW1ldHJ5SW50ZXJhY3RFZGF0YV09XCJ0ZWxlbWV0cnlTZXJ2aWNlLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ2RvbmUnLCdjbGljaycsJ3N1Ym1pdCcsXG4gICAgIHRlbGVtZXRyeVNlcnZpY2U/LnRlbGVtZXRyeVBhZ2VJZClcIj5cbiAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5kb25lX2J0bl9sYWJlbH19XG4gICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG48L3N1aS1tb2RhbD5cbiJdfQ==