verben-ticketing-ui 0.6.0
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.
- package/README.md +25 -0
- package/esm2022/public-api.mjs +9 -0
- package/esm2022/src/lib/components/add-ticket/add-ticket.component.mjs +306 -0
- package/esm2022/src/lib/components/add-ticket/add-ticket.module.mjs +98 -0
- package/esm2022/src/lib/components/add-ticket/index.mjs +2 -0
- package/esm2022/src/lib/components/add-ticket/public-api.mjs +3 -0
- package/esm2022/src/lib/components/add-ticket/verben-ticketing-ui-src-lib-components-add-ticket.mjs +5 -0
- package/esm2022/src/lib/components/file-render/file-render.component.mjs +34 -0
- package/esm2022/src/lib/components/file-render/file-render.module.mjs +94 -0
- package/esm2022/src/lib/components/file-render/index.mjs +2 -0
- package/esm2022/src/lib/components/file-render/public-api.mjs +3 -0
- package/esm2022/src/lib/components/file-render/verben-ticketing-ui-src-lib-components-file-render.mjs +5 -0
- package/esm2022/src/lib/components/ticketing/base-table-style.mjs +56 -0
- package/esm2022/src/lib/components/ticketing/index.mjs +2 -0
- package/esm2022/src/lib/components/ticketing/public-api.mjs +4 -0
- package/esm2022/src/lib/components/ticketing/ticketing.component.mjs +813 -0
- package/esm2022/src/lib/components/ticketing/ticketing.module.mjs +96 -0
- package/esm2022/src/lib/components/ticketing/ticketing.service.mjs +220 -0
- package/esm2022/src/lib/components/ticketing/verben-ticketing-ui-src-lib-components-ticketing.mjs +5 -0
- package/esm2022/src/lib/components/ticketing-detail/chat-control/chat-control.component.mjs +240 -0
- package/esm2022/src/lib/components/ticketing-detail/chat-control/chat-control.module.mjs +98 -0
- package/esm2022/src/lib/components/ticketing-detail/index.mjs +2 -0
- package/esm2022/src/lib/components/ticketing-detail/public-api.mjs +3 -0
- package/esm2022/src/lib/components/ticketing-detail/ticketing-detail.component.mjs +592 -0
- package/esm2022/src/lib/components/ticketing-detail/ticketing-detail.module.mjs +109 -0
- package/esm2022/src/lib/components/ticketing-detail/verben-ticketing-ui-src-lib-components-ticketing-detail.mjs +5 -0
- package/esm2022/src/lib/constants/index.mjs +2 -0
- package/esm2022/src/lib/constants/keynames.mjs +2 -0
- package/esm2022/src/lib/constants/pagesize.mjs +3 -0
- package/esm2022/src/lib/constants/public-api.mjs +3 -0
- package/esm2022/src/lib/constants/verben-ticketing-ui-src-lib-constants.mjs +5 -0
- package/esm2022/src/lib/models/Application.mjs +2 -0
- package/esm2022/src/lib/models/ApplicationRoleAction.mjs +2 -0
- package/esm2022/src/lib/models/ApplicationRoleContext.mjs +2 -0
- package/esm2022/src/lib/models/BaseModel.mjs +2 -0
- package/esm2022/src/lib/models/CacheDataRequest.mjs +2 -0
- package/esm2022/src/lib/models/Company.mjs +2 -0
- package/esm2022/src/lib/models/ErrorResponse.mjs +11 -0
- package/esm2022/src/lib/models/File.mjs +2 -0
- package/esm2022/src/lib/models/FilterTypes.mjs +9 -0
- package/esm2022/src/lib/models/HttpRequestType.mjs +8 -0
- package/esm2022/src/lib/models/KeyValueParam.mjs +2 -0
- package/esm2022/src/lib/models/ModelRelationship.mjs +2 -0
- package/esm2022/src/lib/models/OAuthParam.mjs +2 -0
- package/esm2022/src/lib/models/OAuthType.mjs +9 -0
- package/esm2022/src/lib/models/PagedResult.mjs +2 -0
- package/esm2022/src/lib/models/PasswordRequestParam.mjs +2 -0
- package/esm2022/src/lib/models/PermissionConfig.mjs +2 -0
- package/esm2022/src/lib/models/ResponseKeyValue.mjs +2 -0
- package/esm2022/src/lib/models/Role.mjs +2 -0
- package/esm2022/src/lib/models/RoleAction.mjs +2 -0
- package/esm2022/src/lib/models/RoleContext.mjs +2 -0
- package/esm2022/src/lib/models/Schedule.mjs +2 -0
- package/esm2022/src/lib/models/ScheduleType.mjs +6 -0
- package/esm2022/src/lib/models/SearchDynamicWrapper.mjs +2 -0
- package/esm2022/src/lib/models/SearchOperator.mjs +6 -0
- package/esm2022/src/lib/models/SearchPropertySign.mjs +11 -0
- package/esm2022/src/lib/models/SearchPropertyValue.mjs +2 -0
- package/esm2022/src/lib/models/SearchPropertyValueType.mjs +11 -0
- package/esm2022/src/lib/models/SortDirection.mjs +7 -0
- package/esm2022/src/lib/models/TaskUser.mjs +2 -0
- package/esm2022/src/lib/models/Tenant.mjs +2 -0
- package/esm2022/src/lib/models/TenantConfig.mjs +2 -0
- package/esm2022/src/lib/models/TenantPriority.mjs +2 -0
- package/esm2022/src/lib/models/Ticket.mjs +2 -0
- package/esm2022/src/lib/models/TicketMessage.mjs +2 -0
- package/esm2022/src/lib/models/TicketStatus.mjs +8 -0
- package/esm2022/src/lib/models/UserRequest.mjs +2 -0
- package/esm2022/src/lib/models/auth-mechanism.mjs +8 -0
- package/esm2022/src/lib/models/base.mjs +2 -0
- package/esm2022/src/lib/models/conditions.mjs +13 -0
- package/esm2022/src/lib/models/index.mjs +2 -0
- package/esm2022/src/lib/models/log-in.mjs +2 -0
- package/esm2022/src/lib/models/mainUser.mjs +2 -0
- package/esm2022/src/lib/models/oauth-resp.mjs +2 -0
- package/esm2022/src/lib/models/oauth-response.mjs +2 -0
- package/esm2022/src/lib/models/object-state.mjs +8 -0
- package/esm2022/src/lib/models/otpValue.mjs +2 -0
- package/esm2022/src/lib/models/paged.mjs +2 -0
- package/esm2022/src/lib/models/public-api.mjs +57 -0
- package/esm2022/src/lib/models/query-params.mjs +2 -0
- package/esm2022/src/lib/models/request-status.mjs +5 -0
- package/esm2022/src/lib/models/resend-otp-data.mjs +2 -0
- package/esm2022/src/lib/models/sign-up.mjs +2 -0
- package/esm2022/src/lib/models/single-sign-on.mjs +2 -0
- package/esm2022/src/lib/models/status.mjs +6 -0
- package/esm2022/src/lib/models/user-access-request-status.mjs +7 -0
- package/esm2022/src/lib/models/user-access-request.mjs +2 -0
- package/esm2022/src/lib/models/user-management.mjs +2 -0
- package/esm2022/src/lib/models/user.mjs +2 -0
- package/esm2022/src/lib/models/verben-ticketing-ui-src-lib-models.mjs +5 -0
- package/esm2022/src/lib/pipes/async-label.pipe.mjs +26 -0
- package/esm2022/src/lib/pipes/company-date.pipe.mjs +30 -0
- package/esm2022/src/lib/pipes/ellipse-word.pipe.mjs +23 -0
- package/esm2022/src/lib/pipes/index.mjs +2 -0
- package/esm2022/src/lib/pipes/public-api.mjs +4 -0
- package/esm2022/src/lib/pipes/verben-ticketing-ui-src-lib-pipes.mjs +5 -0
- package/esm2022/src/lib/services/company-settings.service.mjs +23 -0
- package/esm2022/src/lib/services/environment.service.mjs +26 -0
- package/esm2022/src/lib/services/http-web-request.service.mjs +100 -0
- package/esm2022/src/lib/services/import.service.mjs +247 -0
- package/esm2022/src/lib/services/index.mjs +2 -0
- package/esm2022/src/lib/services/label.service.mjs +261 -0
- package/esm2022/src/lib/services/public-api.mjs +8 -0
- package/esm2022/src/lib/services/shared.service.mjs +58 -0
- package/esm2022/src/lib/services/util.service.mjs +72 -0
- package/esm2022/src/lib/services/verben-ticketing-ui-src-lib-services.mjs +5 -0
- package/esm2022/src/utils/components/base-data-view.component.mjs +111 -0
- package/esm2022/src/utils/index.mjs +2 -0
- package/esm2022/src/utils/models/DataViewConfig.mjs +2 -0
- package/esm2022/src/utils/public-api.mjs +3 -0
- package/esm2022/src/utils/verben-ticketing-ui-src-utils.mjs +5 -0
- package/esm2022/verben-ticketing-ui.mjs +5 -0
- package/fesm2022/verben-ticketing-ui-src-lib-components-add-ticket.mjs +403 -0
- package/fesm2022/verben-ticketing-ui-src-lib-components-add-ticket.mjs.map +1 -0
- package/fesm2022/verben-ticketing-ui-src-lib-components-file-render.mjs +130 -0
- package/fesm2022/verben-ticketing-ui-src-lib-components-file-render.mjs.map +1 -0
- package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing-detail.mjs +1018 -0
- package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing-detail.mjs.map +1 -0
- package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing.mjs +1166 -0
- package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing.mjs.map +1 -0
- package/fesm2022/verben-ticketing-ui-src-lib-constants.mjs +11 -0
- package/fesm2022/verben-ticketing-ui-src-lib-constants.mjs.map +1 -0
- package/fesm2022/verben-ticketing-ui-src-lib-models.mjs +138 -0
- package/fesm2022/verben-ticketing-ui-src-lib-models.mjs.map +1 -0
- package/fesm2022/verben-ticketing-ui-src-lib-pipes.mjs +81 -0
- package/fesm2022/verben-ticketing-ui-src-lib-pipes.mjs.map +1 -0
- package/fesm2022/verben-ticketing-ui-src-lib-services.mjs +770 -0
- package/fesm2022/verben-ticketing-ui-src-lib-services.mjs.map +1 -0
- package/fesm2022/verben-ticketing-ui-src-utils.mjs +118 -0
- package/fesm2022/verben-ticketing-ui-src-utils.mjs.map +1 -0
- package/fesm2022/verben-ticketing-ui.mjs +14 -0
- package/fesm2022/verben-ticketing-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +82 -0
- package/public-api.d.ts +4 -0
- package/src/lib/components/add-ticket/add-ticket.component.d.ts +44 -0
- package/src/lib/components/add-ticket/add-ticket.module.d.ts +15 -0
- package/src/lib/components/add-ticket/index.d.ts +1 -0
- package/src/lib/components/add-ticket/public-api.d.ts +2 -0
- package/src/lib/components/file-render/file-render.component.d.ts +14 -0
- package/src/lib/components/file-render/file-render.module.d.ts +14 -0
- package/src/lib/components/file-render/index.d.ts +1 -0
- package/src/lib/components/file-render/public-api.d.ts +2 -0
- package/src/lib/components/ticketing/base-table-style.d.ts +1 -0
- package/src/lib/components/ticketing/index.d.ts +1 -0
- package/src/lib/components/ticketing/public-api.d.ts +3 -0
- package/src/lib/components/ticketing/ticketing.component.d.ts +100 -0
- package/src/lib/components/ticketing/ticketing.module.d.ts +12 -0
- package/src/lib/components/ticketing/ticketing.service.d.ts +27 -0
- package/src/lib/components/ticketing-detail/chat-control/chat-control.component.d.ts +47 -0
- package/src/lib/components/ticketing-detail/chat-control/chat-control.module.d.ts +15 -0
- package/src/lib/components/ticketing-detail/index.d.ts +1 -0
- package/src/lib/components/ticketing-detail/public-api.d.ts +2 -0
- package/src/lib/components/ticketing-detail/ticketing-detail.component.d.ts +77 -0
- package/src/lib/components/ticketing-detail/ticketing-detail.module.d.ts +17 -0
- package/src/lib/constants/index.d.ts +1 -0
- package/src/lib/constants/keynames.d.ts +1 -0
- package/src/lib/constants/pagesize.d.ts +2 -0
- package/src/lib/constants/public-api.d.ts +2 -0
- package/src/lib/models/Application.d.ts +5 -0
- package/src/lib/models/ApplicationRoleAction.d.ts +9 -0
- package/src/lib/models/ApplicationRoleContext.d.ts +9 -0
- package/src/lib/models/BaseModel.d.ts +14 -0
- package/src/lib/models/CacheDataRequest.d.ts +7 -0
- package/src/lib/models/Company.d.ts +22 -0
- package/src/lib/models/ErrorResponse.d.ts +6 -0
- package/src/lib/models/File.d.ts +7 -0
- package/src/lib/models/FilterTypes.d.ts +6 -0
- package/src/lib/models/HttpRequestType.d.ts +6 -0
- package/src/lib/models/KeyValueParam.d.ts +5 -0
- package/src/lib/models/ModelRelationship.d.ts +7 -0
- package/src/lib/models/OAuthParam.d.ts +9 -0
- package/src/lib/models/OAuthType.d.ts +7 -0
- package/src/lib/models/PagedResult.d.ts +9 -0
- package/src/lib/models/PasswordRequestParam.d.ts +5 -0
- package/src/lib/models/PermissionConfig.d.ts +7 -0
- package/src/lib/models/ResponseKeyValue.d.ts +5 -0
- package/src/lib/models/Role.d.ts +9 -0
- package/src/lib/models/RoleAction.d.ts +10 -0
- package/src/lib/models/RoleContext.d.ts +10 -0
- package/src/lib/models/Schedule.d.ts +22 -0
- package/src/lib/models/ScheduleType.d.ts +4 -0
- package/src/lib/models/SearchDynamicWrapper.d.ts +7 -0
- package/src/lib/models/SearchOperator.d.ts +4 -0
- package/src/lib/models/SearchPropertySign.d.ts +9 -0
- package/src/lib/models/SearchPropertyValue.d.ts +14 -0
- package/src/lib/models/SearchPropertyValueType.d.ts +9 -0
- package/src/lib/models/SortDirection.d.ts +5 -0
- package/src/lib/models/TaskUser.d.ts +10 -0
- package/src/lib/models/Tenant.d.ts +22 -0
- package/src/lib/models/TenantConfig.d.ts +20 -0
- package/src/lib/models/TenantPriority.d.ts +10 -0
- package/src/lib/models/Ticket.d.ts +21 -0
- package/src/lib/models/TicketMessage.d.ts +11 -0
- package/src/lib/models/TicketStatus.d.ts +6 -0
- package/src/lib/models/UserRequest.d.ts +32 -0
- package/src/lib/models/auth-mechanism.d.ts +14 -0
- package/src/lib/models/base.d.ts +12 -0
- package/src/lib/models/conditions.d.ts +11 -0
- package/src/lib/models/index.d.ts +1 -0
- package/src/lib/models/log-in.d.ts +8 -0
- package/src/lib/models/mainUser.d.ts +19 -0
- package/src/lib/models/oauth-resp.d.ts +6 -0
- package/src/lib/models/oauth-response.d.ts +6 -0
- package/src/lib/models/object-state.d.ts +6 -0
- package/src/lib/models/otpValue.d.ts +9 -0
- package/src/lib/models/paged.d.ts +9 -0
- package/src/lib/models/public-api.d.ts +56 -0
- package/src/lib/models/query-params.d.ts +7 -0
- package/src/lib/models/request-status.d.ts +3 -0
- package/src/lib/models/resend-otp-data.d.ts +8 -0
- package/src/lib/models/sign-up.d.ts +9 -0
- package/src/lib/models/single-sign-on.d.ts +7 -0
- package/src/lib/models/status.d.ts +4 -0
- package/src/lib/models/user-access-request-status.d.ts +5 -0
- package/src/lib/models/user-access-request.d.ts +9 -0
- package/src/lib/models/user-management.d.ts +8 -0
- package/src/lib/models/user.d.ts +24 -0
- package/src/lib/pipes/async-label.pipe.d.ts +11 -0
- package/src/lib/pipes/company-date.pipe.d.ts +10 -0
- package/src/lib/pipes/ellipse-word.pipe.d.ts +8 -0
- package/src/lib/pipes/index.d.ts +1 -0
- package/src/lib/pipes/public-api.d.ts +3 -0
- package/src/lib/services/company-settings.service.d.ts +11 -0
- package/src/lib/services/environment.service.d.ts +22 -0
- package/src/lib/services/http-web-request.service.d.ts +24 -0
- package/src/lib/services/import.service.d.ts +14 -0
- package/src/lib/services/index.d.ts +1 -0
- package/src/lib/services/label.service.d.ts +24 -0
- package/src/lib/services/public-api.d.ts +7 -0
- package/src/lib/services/shared.service.d.ts +16 -0
- package/src/lib/services/util.service.d.ts +15 -0
- package/src/utils/components/base-data-view.component.d.ts +34 -0
- package/src/utils/index.d.ts +1 -0
- package/src/utils/models/DataViewConfig.d.ts +11 -0
- package/src/utils/public-api.d.ts +2 -0
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
import { Component, Input, ViewChildren, } from '@angular/core';
|
|
2
|
+
import { ObjectState, SortDirection } from 'verben-ticketing-ui/src/lib/models';
|
|
3
|
+
import { TicketStatus } from 'verben-ticketing-ui/src/lib/models';
|
|
4
|
+
import { SearchOperator } from 'verben-ticketing-ui/src/lib/models';
|
|
5
|
+
import { SearchPropertySign } from 'verben-ticketing-ui/src/lib/models';
|
|
6
|
+
import { ErrorResponse } from 'verben-ticketing-ui/src/lib/models';
|
|
7
|
+
import { DEFAULT_MESSAGE_FOR_INITIAL_UPLOAD } from 'verben-ticketing-ui/src/lib/constants';
|
|
8
|
+
import { debounceTime, Subject } from 'rxjs';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/router";
|
|
11
|
+
import * as i2 from "verben-ticketing-ui/src/lib/services";
|
|
12
|
+
import * as i3 from "@angular/common";
|
|
13
|
+
import * as i4 from "@angular/forms";
|
|
14
|
+
import * as i5 from "verben-ng-ui";
|
|
15
|
+
import * as i6 from "./chat-control/chat-control.component";
|
|
16
|
+
import * as i7 from "verben-ticketing-ui/src/lib/components/file-render";
|
|
17
|
+
import * as i8 from "verben-ticketing-ui/src/lib/pipes";
|
|
18
|
+
export class TicketingDetailComponent {
|
|
19
|
+
route;
|
|
20
|
+
server;
|
|
21
|
+
utilService;
|
|
22
|
+
sharedService;
|
|
23
|
+
location;
|
|
24
|
+
envSvc;
|
|
25
|
+
user;
|
|
26
|
+
defaultCompany = '';
|
|
27
|
+
constructor(route, server, utilService, sharedService, location, envSvc) {
|
|
28
|
+
this.route = route;
|
|
29
|
+
this.server = server;
|
|
30
|
+
this.utilService = utilService;
|
|
31
|
+
this.sharedService = sharedService;
|
|
32
|
+
this.location = location;
|
|
33
|
+
this.envSvc = envSvc;
|
|
34
|
+
this.ticketingAPI = `${this.envSvc.environment.TicketingAPI}/Ticket`;
|
|
35
|
+
this.glAPI = this.envSvc.environment.GLAPI;
|
|
36
|
+
}
|
|
37
|
+
showForm = false;
|
|
38
|
+
data;
|
|
39
|
+
typingQuery = '';
|
|
40
|
+
isSearchingUsers = false;
|
|
41
|
+
userPopups;
|
|
42
|
+
ticketStatus = TicketStatus;
|
|
43
|
+
ticketingAPI = '';
|
|
44
|
+
tenantOptions = [];
|
|
45
|
+
glAPI = '';
|
|
46
|
+
attachedMessage = null;
|
|
47
|
+
maxFileSize = 15 * 1024 * 1024;
|
|
48
|
+
message = '';
|
|
49
|
+
action;
|
|
50
|
+
searchTrigger$ = new Subject();
|
|
51
|
+
fileData = [];
|
|
52
|
+
code = '';
|
|
53
|
+
color = '#ffe681';
|
|
54
|
+
textColor = '#000';
|
|
55
|
+
statusOptions = Object.keys(TicketStatus);
|
|
56
|
+
ngOnInit() {
|
|
57
|
+
this.route.paramMap.subscribe(async (params) => {
|
|
58
|
+
const code = params.get('code');
|
|
59
|
+
if (code) {
|
|
60
|
+
this.code = code;
|
|
61
|
+
this.getTicketDetail(code);
|
|
62
|
+
this.getAllTask(code);
|
|
63
|
+
this.getTenantPriority();
|
|
64
|
+
}
|
|
65
|
+
this.searchTrigger$.pipe(debounceTime(300)).subscribe((query) => {
|
|
66
|
+
if (query) {
|
|
67
|
+
this.searchUsers(query);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
onFormClose(isShow) {
|
|
73
|
+
this.showForm = isShow;
|
|
74
|
+
}
|
|
75
|
+
onFormOpen(isShow) {
|
|
76
|
+
this.showForm = true;
|
|
77
|
+
}
|
|
78
|
+
async onFilesUpdate(files) {
|
|
79
|
+
if (!files || files.length === 0)
|
|
80
|
+
return;
|
|
81
|
+
// Helper function to convert a file to base64
|
|
82
|
+
const toBase64 = (file) => new Promise((resolve, reject) => {
|
|
83
|
+
const reader = new FileReader();
|
|
84
|
+
reader.readAsDataURL(file);
|
|
85
|
+
reader.onload = () => resolve(reader.result);
|
|
86
|
+
reader.onerror = (error) => reject(error);
|
|
87
|
+
});
|
|
88
|
+
try {
|
|
89
|
+
const convertedFiles = await Promise.all(files.map(async (file) => {
|
|
90
|
+
const base64Data = await toBase64(file);
|
|
91
|
+
const name = file.name || 'file';
|
|
92
|
+
const extension = name.split('.').pop() || '';
|
|
93
|
+
return {
|
|
94
|
+
Name: name,
|
|
95
|
+
Extension: extension,
|
|
96
|
+
Data: base64Data,
|
|
97
|
+
DataState: ObjectState.New,
|
|
98
|
+
};
|
|
99
|
+
}));
|
|
100
|
+
this.fileData = convertedFiles;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error('Error converting files to base64:', error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async saveMessageChat(ticket, newMessageContent) {
|
|
107
|
+
if (!newMessageContent || newMessageContent.trim().length === 0) {
|
|
108
|
+
this.utilService.showInfo('Message cannot be empty');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const newMessage = {
|
|
112
|
+
Code: '',
|
|
113
|
+
Name: this.user?.MailAddress || 'perfection.chizuruoke@verbenalogic.com',
|
|
114
|
+
TicketCode: ticket.Code || '',
|
|
115
|
+
Subject: '',
|
|
116
|
+
Content: newMessageContent.trim(),
|
|
117
|
+
Attachments: this.fileData.length ? this.fileData : [],
|
|
118
|
+
AttachmentUrls: [],
|
|
119
|
+
Company: ticket.Company,
|
|
120
|
+
TenantId: '',
|
|
121
|
+
Upsert: false,
|
|
122
|
+
ServiceName: '',
|
|
123
|
+
CreatedAt: new Date(),
|
|
124
|
+
UpdatedAt: new Date(),
|
|
125
|
+
UpdatedBy: '',
|
|
126
|
+
CreatedBy: '',
|
|
127
|
+
DataState: ObjectState.New,
|
|
128
|
+
Id: '',
|
|
129
|
+
};
|
|
130
|
+
// if (!this.data.Messages) this.data.Messages = [];
|
|
131
|
+
// this.data.Messages.push(newMessage);
|
|
132
|
+
// this.data.DataState = ObjectState.Changed;
|
|
133
|
+
try {
|
|
134
|
+
this.utilService.sendBI(true);
|
|
135
|
+
const res = await this.server.post(`Ticket/SendMailToTicketOwner`, newMessage, this.envSvc.environment.TicketingAPI);
|
|
136
|
+
this.utilService.sendBI(false);
|
|
137
|
+
if (res instanceof ErrorResponse) {
|
|
138
|
+
this.utilService.showError('Failed to send message.');
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const result = res;
|
|
142
|
+
if (result) {
|
|
143
|
+
this.data.Messages = [...this.data.Messages, result];
|
|
144
|
+
this.data = { ...this.data };
|
|
145
|
+
this.utilService.showSuccess('Message sent successfully');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
console.error(error);
|
|
150
|
+
this.utilService.sendBI(false);
|
|
151
|
+
this.utilService.showError('Something went wrong while sending message');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async save() {
|
|
155
|
+
const item = this.data;
|
|
156
|
+
((item.DataState = this.data ? ObjectState.Changed : ObjectState.New),
|
|
157
|
+
this.utilService.sendBI(true));
|
|
158
|
+
const res = await this.server.post(`Ticket/SaveTicket`, [item], this.envSvc.environment.TicketingAPI);
|
|
159
|
+
this.utilService.sendBI(false);
|
|
160
|
+
if (res instanceof ErrorResponse) {
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
this.utilService.showSuccess('Ticket saved successfully');
|
|
164
|
+
const result = res;
|
|
165
|
+
if (result !== null) {
|
|
166
|
+
this.data = { ...this.data, ...result };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
goBack() {
|
|
171
|
+
this.location.back();
|
|
172
|
+
}
|
|
173
|
+
disableChatBoxButton() {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
onKeyDown(e) { }
|
|
177
|
+
messageChange(e) {
|
|
178
|
+
this.message = e;
|
|
179
|
+
this.detectUserSearchTrigger(e);
|
|
180
|
+
}
|
|
181
|
+
selectUser(user) {
|
|
182
|
+
const before = this.message.replace(/@([a-zA-Z0-9_]*)$/, '');
|
|
183
|
+
this.message = before + '@' + user.MailAddress + ' ';
|
|
184
|
+
this.messageChange(this.message);
|
|
185
|
+
this.closeUserPopup();
|
|
186
|
+
}
|
|
187
|
+
openUserPopup() {
|
|
188
|
+
this.userPopups.forEach((p) => {
|
|
189
|
+
if (!p.dropdownOpen)
|
|
190
|
+
p.toggleDropdown();
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
closeUserPopup() {
|
|
194
|
+
this.userPopups.forEach((p) => {
|
|
195
|
+
if (p.dropdownOpen)
|
|
196
|
+
p.toggleDropdown();
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
detectUserSearchTrigger(text) {
|
|
200
|
+
const regex = /@([a-zA-Z0-9_]*)$/;
|
|
201
|
+
const match = text.match(regex);
|
|
202
|
+
if (match) {
|
|
203
|
+
this.typingQuery = match[1];
|
|
204
|
+
this.isSearchingUsers = true;
|
|
205
|
+
this.searchTrigger$.next(this.typingQuery);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
this.typingQuery = '';
|
|
209
|
+
this.isSearchingUsers = false;
|
|
210
|
+
this.closeUserPopup();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
usersResult = [];
|
|
214
|
+
async searchUsers(query) {
|
|
215
|
+
if (!query) {
|
|
216
|
+
this.usersResult = [];
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const payload = [
|
|
220
|
+
{
|
|
221
|
+
PropertyName: 'MailAddress',
|
|
222
|
+
EntityValue: query,
|
|
223
|
+
Operator: SearchOperator.And,
|
|
224
|
+
Sign: SearchPropertySign.LIKE,
|
|
225
|
+
},
|
|
226
|
+
];
|
|
227
|
+
const res = await this.server.post(`SearchUsers/0/20`, payload, this.envSvc.environment.AuthenticationAPI);
|
|
228
|
+
if (res instanceof ErrorResponse)
|
|
229
|
+
return;
|
|
230
|
+
this.usersResult = res.Result;
|
|
231
|
+
this.openUserPopup();
|
|
232
|
+
}
|
|
233
|
+
triggerFileUpload() {
|
|
234
|
+
const fileInput = document.createElement('input');
|
|
235
|
+
fileInput.type = 'file';
|
|
236
|
+
fileInput.accept = '.png, .jpg, .jpeg, .pdf';
|
|
237
|
+
fileInput.style.display = 'none'; // Hidden file input
|
|
238
|
+
document.body.appendChild(fileInput); // Temporarily add to DOM
|
|
239
|
+
fileInput.addEventListener('change', () => {
|
|
240
|
+
const file = fileInput.files?.[0];
|
|
241
|
+
if (file) {
|
|
242
|
+
this.processFile(file);
|
|
243
|
+
}
|
|
244
|
+
document.body.removeChild(fileInput); // Clean up after use
|
|
245
|
+
});
|
|
246
|
+
fileInput.click(); // Programmatically trigger click
|
|
247
|
+
}
|
|
248
|
+
async processFile(selectedFile) {
|
|
249
|
+
// Check file size
|
|
250
|
+
if (selectedFile.size > this.maxFileSize) {
|
|
251
|
+
const limitInMB = this.maxFileSize / 1024 / 1024;
|
|
252
|
+
this.utilService.showInfo(`File size limit of ${limitInMB}mb exceeded`);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
// let fileToProcess: globalThis.File | null = selectedFile;
|
|
256
|
+
// const safeNumber: number = 1 * 1024 * 1024;
|
|
257
|
+
// if (fileToProcess.size > safeNumber) {
|
|
258
|
+
// fileToProcess = await this.utilService.compressImage(selectedFile);
|
|
259
|
+
// if (!fileToProcess) {
|
|
260
|
+
// this.utilService.showError('Error compressing image');
|
|
261
|
+
// return;
|
|
262
|
+
// }
|
|
263
|
+
// }
|
|
264
|
+
// Read file and convert to base64
|
|
265
|
+
const reader = new FileReader();
|
|
266
|
+
reader.readAsDataURL(selectedFile);
|
|
267
|
+
reader.onload = () => {
|
|
268
|
+
const base64data = reader.result;
|
|
269
|
+
const file = this.sharedService.createCustomFile(base64data, 0, selectedFile);
|
|
270
|
+
if (file && this.attachedMessage) {
|
|
271
|
+
this.attachedMessage.Attachments.push(file);
|
|
272
|
+
this.attachedMessage.AttachmentUrls.push(`${file.Name}`);
|
|
273
|
+
// this.profileImage = base64data;
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
async getTicketDetail(code) {
|
|
278
|
+
const payload = [
|
|
279
|
+
{
|
|
280
|
+
PropertyName: 'Code',
|
|
281
|
+
EntityValue: code,
|
|
282
|
+
Operator: SearchOperator.And,
|
|
283
|
+
Sign: SearchPropertySign.EQ,
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
PropertyName: 'TenantId',
|
|
287
|
+
EntityValue: '',
|
|
288
|
+
Operator: SearchOperator.And,
|
|
289
|
+
Sign: SearchPropertySign.NEQ,
|
|
290
|
+
},
|
|
291
|
+
];
|
|
292
|
+
this.utilService.sendBI(true);
|
|
293
|
+
const res = await this.server.post(`Ticket/SearchTicket/0/50`, payload, this.envSvc.environment.TicketingAPI);
|
|
294
|
+
this.utilService.sendBI(false);
|
|
295
|
+
if (res instanceof ErrorResponse)
|
|
296
|
+
return undefined;
|
|
297
|
+
const result = res.Result;
|
|
298
|
+
if (result?.length > 0) {
|
|
299
|
+
this.data = result[0];
|
|
300
|
+
this.getMessages(this.data.Code).then((data) => {
|
|
301
|
+
if (data) {
|
|
302
|
+
this.data.Messages = data;
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
return result[0];
|
|
306
|
+
}
|
|
307
|
+
return undefined;
|
|
308
|
+
}
|
|
309
|
+
async getMessages(code) {
|
|
310
|
+
const payload = [
|
|
311
|
+
{
|
|
312
|
+
PropertyName: 'TicketCode',
|
|
313
|
+
EntityValue: code,
|
|
314
|
+
Operator: SearchOperator.And,
|
|
315
|
+
Sign: SearchPropertySign.EQ,
|
|
316
|
+
Sort: SortDirection.Desc,
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
PropertyName: 'TenantId',
|
|
320
|
+
EntityValue: '',
|
|
321
|
+
Operator: SearchOperator.And,
|
|
322
|
+
Sign: SearchPropertySign.NEQ,
|
|
323
|
+
Sort: SortDirection.Desc,
|
|
324
|
+
},
|
|
325
|
+
];
|
|
326
|
+
this.utilService.sendBI(true);
|
|
327
|
+
const res = await this.server.post(`Ticket/SearchTicketMessage/0/500`, payload, this.envSvc.environment.TicketingAPI);
|
|
328
|
+
this.utilService.sendBI(false);
|
|
329
|
+
if (res instanceof ErrorResponse)
|
|
330
|
+
return undefined;
|
|
331
|
+
const result = res.Result;
|
|
332
|
+
if (result?.length > 0) {
|
|
333
|
+
return result;
|
|
334
|
+
}
|
|
335
|
+
return undefined;
|
|
336
|
+
}
|
|
337
|
+
async getTenantPriority() {
|
|
338
|
+
const payload = [
|
|
339
|
+
{
|
|
340
|
+
PropertyName: 'TenantId',
|
|
341
|
+
EntityValue: '',
|
|
342
|
+
Operator: SearchOperator.And,
|
|
343
|
+
Sign: SearchPropertySign.NEQ,
|
|
344
|
+
},
|
|
345
|
+
];
|
|
346
|
+
this.utilService.sendBI(true);
|
|
347
|
+
const res = await this.server.post(`Ticket/SearchTenantPriority/0/50`, payload, this.envSvc.environment.TicketingAPI);
|
|
348
|
+
this.utilService.sendBI(false);
|
|
349
|
+
if (res instanceof ErrorResponse)
|
|
350
|
+
return undefined;
|
|
351
|
+
const result = res.Result;
|
|
352
|
+
if (result?.length > 0) {
|
|
353
|
+
this.tenantOptions = result;
|
|
354
|
+
}
|
|
355
|
+
return undefined;
|
|
356
|
+
}
|
|
357
|
+
cssColorToHex(color) {
|
|
358
|
+
const ctx = document.createElement('canvas').getContext('2d');
|
|
359
|
+
if (!ctx)
|
|
360
|
+
return null;
|
|
361
|
+
ctx.fillStyle = '#000'; // set a known color
|
|
362
|
+
ctx.fillStyle = color; // assign any CSS-valid color
|
|
363
|
+
const computed = ctx.fillStyle;
|
|
364
|
+
// If the browser does NOT understand the value, it won’t change from '#000'
|
|
365
|
+
if (computed.toLowerCase() === '#000000' &&
|
|
366
|
+
color.toLowerCase() !== 'black') {
|
|
367
|
+
return null; // invalid color name or unsupported value
|
|
368
|
+
}
|
|
369
|
+
return computed.toUpperCase(); // returns hex like #1E90FF
|
|
370
|
+
}
|
|
371
|
+
softenColor(hex, lightenPercent = 55, alphaPercent = 55) {
|
|
372
|
+
// Remove #
|
|
373
|
+
if (!hex.startsWith('#')) {
|
|
374
|
+
const converted = this.cssColorToHex(hex);
|
|
375
|
+
if (converted) {
|
|
376
|
+
hex = converted;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
hex = hex.replace(/^#/, '');
|
|
380
|
+
if (hex.length === 3) {
|
|
381
|
+
// Convert shorthand (#abc → #aabbcc)
|
|
382
|
+
hex = hex
|
|
383
|
+
.split('')
|
|
384
|
+
.map((x) => x + x)
|
|
385
|
+
.join('');
|
|
386
|
+
}
|
|
387
|
+
const num = parseInt(hex, 16);
|
|
388
|
+
let r = (num >> 16) & 0xff;
|
|
389
|
+
let g = (num >> 8) & 0xff;
|
|
390
|
+
let b = num & 0xff;
|
|
391
|
+
// Lighten toward white by the given percentage
|
|
392
|
+
r = Math.min(255, Math.round(r + (255 - r) * (lightenPercent / 100)));
|
|
393
|
+
g = Math.min(255, Math.round(g + (255 - g) * (lightenPercent / 100)));
|
|
394
|
+
b = Math.min(255, Math.round(b + (255 - b) * (lightenPercent / 100)));
|
|
395
|
+
// Convert alpha percent to 2-digit hex
|
|
396
|
+
const alpha = Math.round((alphaPercent / 100) * 255);
|
|
397
|
+
const aHex = alpha.toString(16).padStart(2, '0').toUpperCase();
|
|
398
|
+
return `#${r.toString(16).padStart(2, '0').toUpperCase()}${g
|
|
399
|
+
.toString(16)
|
|
400
|
+
.padStart(2, '0')
|
|
401
|
+
.toUpperCase()}${b.toString(16).padStart(2, '0').toUpperCase()}${aHex}`;
|
|
402
|
+
}
|
|
403
|
+
getTicketMessage() {
|
|
404
|
+
if (this.data) {
|
|
405
|
+
const initialMessage = this.data.Messages.find((x) => x.Subject == DEFAULT_MESSAGE_FOR_INITIAL_UPLOAD);
|
|
406
|
+
if (initialMessage) {
|
|
407
|
+
return { ...initialMessage, DataState: ObjectState.Changed };
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
const newMessage = {
|
|
411
|
+
TicketCode: '',
|
|
412
|
+
Subject: DEFAULT_MESSAGE_FOR_INITIAL_UPLOAD,
|
|
413
|
+
Content: '',
|
|
414
|
+
Attachments: [],
|
|
415
|
+
AttachmentUrls: [],
|
|
416
|
+
Company: this.defaultCompany,
|
|
417
|
+
Id: '',
|
|
418
|
+
Code: '',
|
|
419
|
+
TenantId: '',
|
|
420
|
+
ServiceName: '',
|
|
421
|
+
id: '',
|
|
422
|
+
CreatedAt: new Date(),
|
|
423
|
+
UpdatedAt: new Date(),
|
|
424
|
+
DataState: ObjectState.New,
|
|
425
|
+
};
|
|
426
|
+
return newMessage;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
const newMessage = {
|
|
431
|
+
TicketCode: '',
|
|
432
|
+
Subject: DEFAULT_MESSAGE_FOR_INITIAL_UPLOAD,
|
|
433
|
+
Content: '',
|
|
434
|
+
Attachments: [],
|
|
435
|
+
AttachmentUrls: [],
|
|
436
|
+
Company: this.defaultCompany,
|
|
437
|
+
Id: '',
|
|
438
|
+
Code: '',
|
|
439
|
+
TenantId: '',
|
|
440
|
+
ServiceName: '',
|
|
441
|
+
id: '',
|
|
442
|
+
CreatedAt: new Date(),
|
|
443
|
+
UpdatedAt: new Date(),
|
|
444
|
+
DataState: ObjectState.New,
|
|
445
|
+
};
|
|
446
|
+
return newMessage;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
async getAllTask(code) {
|
|
450
|
+
this.utilService.sendBI(true);
|
|
451
|
+
const res = await this.server.get(`Task/GetTaskInfo/${code}`, this.envSvc.environment.WorkFlowAPI);
|
|
452
|
+
this.utilService.sendBI(false);
|
|
453
|
+
if (res instanceof ErrorResponse) {
|
|
454
|
+
return undefined;
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
const result = res;
|
|
458
|
+
if (result) {
|
|
459
|
+
this.data.TaskData = result;
|
|
460
|
+
}
|
|
461
|
+
return result;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
async passOn(data, fromStage, toStage, comment, recipient) {
|
|
465
|
+
if (!data)
|
|
466
|
+
return;
|
|
467
|
+
const payload = {
|
|
468
|
+
...data.TaskData,
|
|
469
|
+
DataState: ObjectState.Changed,
|
|
470
|
+
HistoryToDate: data.TaskData.HistoryToDate.map((item) => ({
|
|
471
|
+
...item,
|
|
472
|
+
Actor: item.Actor
|
|
473
|
+
? {
|
|
474
|
+
...item.Actor,
|
|
475
|
+
ActorTags: [],
|
|
476
|
+
}
|
|
477
|
+
: null,
|
|
478
|
+
})),
|
|
479
|
+
CurrentActors: data.TaskData.CurrentActors.map((item) => ({
|
|
480
|
+
...item,
|
|
481
|
+
ActorTags: [],
|
|
482
|
+
})),
|
|
483
|
+
};
|
|
484
|
+
delete payload.FullStages;
|
|
485
|
+
this.utilService.sendBI(true);
|
|
486
|
+
try {
|
|
487
|
+
const res = await this.server.post(`Task/PassOn/${fromStage}/${toStage}/${comment}${recipient ? '/' + recipient : ''}`, payload, this.envSvc.environment.WorkFlowAPI);
|
|
488
|
+
this.utilService.sendBI(false);
|
|
489
|
+
if (res instanceof ErrorResponse) {
|
|
490
|
+
return undefined;
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
const result = res;
|
|
494
|
+
if (result) {
|
|
495
|
+
data.TaskData = result;
|
|
496
|
+
this.getAllTask(data.Code).then((taskRes) => {
|
|
497
|
+
if (taskRes && data) {
|
|
498
|
+
data.TaskData = taskRes;
|
|
499
|
+
}
|
|
500
|
+
});
|
|
501
|
+
this.showForm = false;
|
|
502
|
+
this.action = null;
|
|
503
|
+
data.TaskComment = '';
|
|
504
|
+
const updatedItem = await this.getUpdatedTicket(data.Code);
|
|
505
|
+
if (updatedItem) {
|
|
506
|
+
data.Status = updatedItem.Status;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
return result;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
catch (err) {
|
|
513
|
+
this.utilService.sendBI(false);
|
|
514
|
+
console.error('PassOn Error:', err);
|
|
515
|
+
return undefined;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
async formFill(formValues, ticket) {
|
|
519
|
+
const payload = formValues;
|
|
520
|
+
this.utilService.sendBI(true);
|
|
521
|
+
try {
|
|
522
|
+
const res = await this.server.post(`Form/FillForm/${this.code}`, payload, this.envSvc.environment.WorkFlowAPI);
|
|
523
|
+
this.utilService.sendBI(false);
|
|
524
|
+
if (res instanceof ErrorResponse) {
|
|
525
|
+
return undefined;
|
|
526
|
+
}
|
|
527
|
+
else {
|
|
528
|
+
await this.passOn(ticket, this.action.action?.FromStage, this.action.action?.ToStage, this.action.comment, '');
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
catch (err) {
|
|
532
|
+
this.utilService.sendBI(false);
|
|
533
|
+
console.error('PassOn Error:', err);
|
|
534
|
+
return undefined;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
async getUpdatedTicket(code) {
|
|
538
|
+
const payload = [
|
|
539
|
+
{
|
|
540
|
+
PropertyName: 'Code',
|
|
541
|
+
EntityValue: code,
|
|
542
|
+
Operator: SearchOperator.And,
|
|
543
|
+
Sign: SearchPropertySign.EQ,
|
|
544
|
+
},
|
|
545
|
+
{
|
|
546
|
+
PropertyName: 'TenantId',
|
|
547
|
+
EntityValue: '',
|
|
548
|
+
Operator: SearchOperator.And,
|
|
549
|
+
Sign: SearchPropertySign.NEQ,
|
|
550
|
+
},
|
|
551
|
+
];
|
|
552
|
+
const res = await this.server.post(`Ticket/SearchTicket/0/50`, payload, this.envSvc.environment.TicketingAPI);
|
|
553
|
+
if (res instanceof ErrorResponse) {
|
|
554
|
+
return undefined;
|
|
555
|
+
}
|
|
556
|
+
var result = res;
|
|
557
|
+
if (result.Result.length > 0) {
|
|
558
|
+
return result.Result[0];
|
|
559
|
+
}
|
|
560
|
+
else {
|
|
561
|
+
return undefined;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
async handleActionComplete(action, data) {
|
|
565
|
+
data.TaskComment = action.comment;
|
|
566
|
+
const hasForms = data.TaskData?.TaskForms?.length > 0;
|
|
567
|
+
if (hasForms) {
|
|
568
|
+
this.showForm = true;
|
|
569
|
+
this.action = action;
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
await this.passOn(data, action?.action.FromStage, action?.action.ToStage, data.TaskComment, '');
|
|
573
|
+
}
|
|
574
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TicketingDetailComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.HttpWebRequestService }, { token: i2.UtilService }, { token: i2.SharedService }, { token: i3.Location }, { token: i2.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
|
|
575
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TicketingDetailComponent, selector: "app-ticketing-detail", inputs: { user: "user", defaultCompany: "defaultCompany", color: "color", textColor: "textColor" }, viewQueries: [{ propertyName: "userPopups", predicate: ["userPopup"], descendants: true }], ngImport: i0, template: "<div\n (click)=\"goBack()\"\n class=\"my-4 w-fit ml-auto border p-1 rounded-lg border-gray-400 cursor-pointer\"\n>\n <verben-svg [icon]=\"'arrow-left'\"></verben-svg>\n</div>\n<div *ngIf=\"data\" class=\"grid grid-cols-12 gap-8\">\n <div\n class=\"lg:col-span-8 col-span-12 border relative rounded-2xl p-6 border-[#0000001A]\"\n >\n \n <div class=\"flex gap-2 items-center mt-6\">\n <h3 class=\"mt-2 font-bold\">{{ data.Title }}</h3>\n\n <div\n *ngIf=\"\n data.Priority && data.Priority\n | asyncLabel : 'TenantPriority' : 'Color' : ticketingAPI\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"softenColor(color)\"\n >\n <span [style.backgroundColor]=\"color\" class=\"enum-dot\"></span>\n <span>{{\n data.Priority\n | asyncLabel : \"TenantPriority\" : \"Name\" : ticketingAPI\n | async\n }}</span>\n </div>\n </div>\n <p class=\"mt-2 text-sm\">{{ data.Description }}</p>\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div\n class=\"attachments-container grid grid-cols-3 gap-2\"\n *ngIf=\"data.FileUrls\"\n >\n <ng-container *ngFor=\"let file of data.FileUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n </div>\n <div class=\"max-h-[500px] lg:max-h-[230px] overflow-y-auto pr-1\">\n <div *ngFor=\"let message of data.Messages; let last = last\">\n <div\n class=\"mt-6 flex justify-between items-center pb-4\"\n [ngClass]=\"{ 'border-b border-gray-300': !last }\"\n >\n <div class=\"flex items-center gap-2\">\n <img\n class=\"w-[50px] h-[50px] object-cover rounded-full\"\n [src]=\"'/assets/images/avatar.png'\"\n alt=\"avatar\"\n />\n <div>\n <h4 class=\"font-medium\">\n {{\n message.Company\n | asyncLabel : \"Company\" : \"Description\" : glAPI\n | async\n }}\n </h4>\n <p class=\"text-xs\">{{ !message.Name ? \"Nil\" : message.Name }}</p>\n </div>\n </div>\n\n <p class=\"text-sm text-gray-600\">\n {{ message.CreatedAt | companyDate }}\n </p>\n </div>\n\n <p class=\"mt-6 text-sm\">\n {{ !message.Content ? \"Nil\" : message.Content }}\n </p>\n\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div\n class=\"attachments-container grid grid-cols-3 gap-2\"\n *ngIf=\"message.AttachmentUrls\"\n >\n <ng-container *ngFor=\"let file of message.AttachmentUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"pt-5\">\n <div class=\"border rounded-lg p-4 border-[#0000001A]\">\n \n\n <lib-chat-control\n (messageChange)=\"messageChange($event)\"\n [placeholder]=\"'Start typing a message....'\"\n [disabled]=\"disableChatBoxButton()\"\n (sendMessageResult)=\"saveMessageChat(data, message)\"\n [(message)]=\"message\"\n [color]=\"color\"\n [textColor]=\"textColor\"\n (filesChange)=\"onFilesUpdate($event)\"\n (formSubmit)=\"onKeyDown($event)\"\n ></lib-chat-control>\n </div>\n <verben-pop-Up\n #userPopup\n [customStyles]=\"{\n 'z-index': '99',\n position: 'absolute',\n bottom: '70px',\n left: '300px'\n }\"\n [enableMouseLeave]=\"false\"\n >\n <div\n class=\"pop-up-content flex flex-col max-h-[200px] w-[300px] overflow-y-auto p-3\"\n dropdown-content\n [style.border-color]=\"color\"\n > \n <p class=\"text-gray-500 p-2\">Suggestions</p>\n\n <div\n *ngFor=\"let u of usersResult\"\n class=\"p-2 hover:bg-gray-100 text-sm cursor-pointer w-fit\"\n (click)=\"selectUser(u)\"\n >\n {{ u.MailAddress }}\n </div>\n\n <p *ngIf=\"usersResult.length === 0\" class=\"text-gray-500 text-sm\">\n No matching users\n </p>\n </div>\n </verben-pop-Up>\n </div>\n </div>\n <div\n class=\"lg:col-span-4 col-span-12 p-4 border rounded-md border-[#0000001A]\"\n >\n <h3 class=\"mt-2 font-bold\">Details</h3>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Ticket ID :</p>\n <p>{{ data.Code }}</p>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Subject:</p>\n <p class=\"text-xs text-right\">{{ data.Title }}</p>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Status:</p>\n <div\n *ngIf=\"data.Status\"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center {{\n data.Status\n }}\"\n >\n <span class=\"enum-dot\"></span>\n <span>{{ data.Status }}</span>\n </div>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">CreatedAt :</p>\n <p class=\"text-sm\">{{ data.CreatedAt | companyDate }}</p>\n </div>\n <div\n *ngIf=\"data.Status === ticketStatus.Completed\"\n class=\"flex items-center justify-between mt-4\"\n >\n <p class=\"text-sm font-light\">Execution Time :</p>\n <p class=\"text-sm\">{{ data.ExecutionTime }}</p>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Priority :</p>\n <div\n *ngIf=\"\n data.Priority && data.Priority\n | asyncLabel : 'TenantPriority' : 'Color' : ticketingAPI\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"softenColor(color)\"\n >\n <span [style.backgroundColor]=\"color\" class=\"enum-dot\"></span>\n <span>{{\n data.Priority\n | asyncLabel : \"TenantPriority\" : \"Name\" : ticketingAPI\n | async\n }}</span>\n </div>\n </div>\n <section class=\"mt-6\">\n <h3 class=\"font-bold\">Properties</h3>\n\n <div class=\"flex flex-col gap-1 mt-2\">\n <div class=\"text-sm text-gray-600\">Status</div>\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Select Status\"\n [disabled]=\"true\"\n [options]=\"statusOptions\"\n [(ngModel)]=\"data.Status\"\n >\n </verben-drop-down>\n </div>\n <div class=\"flex flex-col gap-1 mt-2 mb-18\">\n <div class=\"text-sm text-gray-600\">Priority</div>\n <verben-drop-down\n optionLabel=\"Name\"\n [filter]=\"true\"\n optionValue=\"Code\"\n [disabled]=\"true\"\n [options]=\"tenantOptions\"\n [(ngModel)]=\"data.Priority\"\n [width]=\"'100%'\"\n ></verben-drop-down>\n </div>\n <!-- <verbena-button\n (click)=\"save()\"\n [width]=\"'100%'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Update'\"\n [bgColor]=\"'#9C56BA'\"\n ></verbena-button> -->\n </section>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i5.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave", "cdkPosition"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i5.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.ChatControlComponent, selector: "lib-chat-control", inputs: ["message", "color", "textColor", "disabled", "placeholder", "hideBtn"], outputs: ["messageChange", "formSubmit", "sendMessageResult", "filesChange"] }, { kind: "component", type: i7.FileRenderComponent, selector: "app-file-render", inputs: ["fileUrl"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.AsyncLabelPipe, name: "asyncLabel" }, { kind: "pipe", type: i8.CompanyDatePipe, name: "companyDate" }] });
|
|
576
|
+
}
|
|
577
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TicketingDetailComponent, decorators: [{
|
|
578
|
+
type: Component,
|
|
579
|
+
args: [{ selector: 'app-ticketing-detail', template: "<div\n (click)=\"goBack()\"\n class=\"my-4 w-fit ml-auto border p-1 rounded-lg border-gray-400 cursor-pointer\"\n>\n <verben-svg [icon]=\"'arrow-left'\"></verben-svg>\n</div>\n<div *ngIf=\"data\" class=\"grid grid-cols-12 gap-8\">\n <div\n class=\"lg:col-span-8 col-span-12 border relative rounded-2xl p-6 border-[#0000001A]\"\n >\n \n <div class=\"flex gap-2 items-center mt-6\">\n <h3 class=\"mt-2 font-bold\">{{ data.Title }}</h3>\n\n <div\n *ngIf=\"\n data.Priority && data.Priority\n | asyncLabel : 'TenantPriority' : 'Color' : ticketingAPI\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"softenColor(color)\"\n >\n <span [style.backgroundColor]=\"color\" class=\"enum-dot\"></span>\n <span>{{\n data.Priority\n | asyncLabel : \"TenantPriority\" : \"Name\" : ticketingAPI\n | async\n }}</span>\n </div>\n </div>\n <p class=\"mt-2 text-sm\">{{ data.Description }}</p>\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div\n class=\"attachments-container grid grid-cols-3 gap-2\"\n *ngIf=\"data.FileUrls\"\n >\n <ng-container *ngFor=\"let file of data.FileUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n </div>\n <div class=\"max-h-[500px] lg:max-h-[230px] overflow-y-auto pr-1\">\n <div *ngFor=\"let message of data.Messages; let last = last\">\n <div\n class=\"mt-6 flex justify-between items-center pb-4\"\n [ngClass]=\"{ 'border-b border-gray-300': !last }\"\n >\n <div class=\"flex items-center gap-2\">\n <img\n class=\"w-[50px] h-[50px] object-cover rounded-full\"\n [src]=\"'/assets/images/avatar.png'\"\n alt=\"avatar\"\n />\n <div>\n <h4 class=\"font-medium\">\n {{\n message.Company\n | asyncLabel : \"Company\" : \"Description\" : glAPI\n | async\n }}\n </h4>\n <p class=\"text-xs\">{{ !message.Name ? \"Nil\" : message.Name }}</p>\n </div>\n </div>\n\n <p class=\"text-sm text-gray-600\">\n {{ message.CreatedAt | companyDate }}\n </p>\n </div>\n\n <p class=\"mt-6 text-sm\">\n {{ !message.Content ? \"Nil\" : message.Content }}\n </p>\n\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div\n class=\"attachments-container grid grid-cols-3 gap-2\"\n *ngIf=\"message.AttachmentUrls\"\n >\n <ng-container *ngFor=\"let file of message.AttachmentUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"pt-5\">\n <div class=\"border rounded-lg p-4 border-[#0000001A]\">\n \n\n <lib-chat-control\n (messageChange)=\"messageChange($event)\"\n [placeholder]=\"'Start typing a message....'\"\n [disabled]=\"disableChatBoxButton()\"\n (sendMessageResult)=\"saveMessageChat(data, message)\"\n [(message)]=\"message\"\n [color]=\"color\"\n [textColor]=\"textColor\"\n (filesChange)=\"onFilesUpdate($event)\"\n (formSubmit)=\"onKeyDown($event)\"\n ></lib-chat-control>\n </div>\n <verben-pop-Up\n #userPopup\n [customStyles]=\"{\n 'z-index': '99',\n position: 'absolute',\n bottom: '70px',\n left: '300px'\n }\"\n [enableMouseLeave]=\"false\"\n >\n <div\n class=\"pop-up-content flex flex-col max-h-[200px] w-[300px] overflow-y-auto p-3\"\n dropdown-content\n [style.border-color]=\"color\"\n > \n <p class=\"text-gray-500 p-2\">Suggestions</p>\n\n <div\n *ngFor=\"let u of usersResult\"\n class=\"p-2 hover:bg-gray-100 text-sm cursor-pointer w-fit\"\n (click)=\"selectUser(u)\"\n >\n {{ u.MailAddress }}\n </div>\n\n <p *ngIf=\"usersResult.length === 0\" class=\"text-gray-500 text-sm\">\n No matching users\n </p>\n </div>\n </verben-pop-Up>\n </div>\n </div>\n <div\n class=\"lg:col-span-4 col-span-12 p-4 border rounded-md border-[#0000001A]\"\n >\n <h3 class=\"mt-2 font-bold\">Details</h3>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Ticket ID :</p>\n <p>{{ data.Code }}</p>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Subject:</p>\n <p class=\"text-xs text-right\">{{ data.Title }}</p>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Status:</p>\n <div\n *ngIf=\"data.Status\"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center {{\n data.Status\n }}\"\n >\n <span class=\"enum-dot\"></span>\n <span>{{ data.Status }}</span>\n </div>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">CreatedAt :</p>\n <p class=\"text-sm\">{{ data.CreatedAt | companyDate }}</p>\n </div>\n <div\n *ngIf=\"data.Status === ticketStatus.Completed\"\n class=\"flex items-center justify-between mt-4\"\n >\n <p class=\"text-sm font-light\">Execution Time :</p>\n <p class=\"text-sm\">{{ data.ExecutionTime }}</p>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Priority :</p>\n <div\n *ngIf=\"\n data.Priority && data.Priority\n | asyncLabel : 'TenantPriority' : 'Color' : ticketingAPI\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"softenColor(color)\"\n >\n <span [style.backgroundColor]=\"color\" class=\"enum-dot\"></span>\n <span>{{\n data.Priority\n | asyncLabel : \"TenantPriority\" : \"Name\" : ticketingAPI\n | async\n }}</span>\n </div>\n </div>\n <section class=\"mt-6\">\n <h3 class=\"font-bold\">Properties</h3>\n\n <div class=\"flex flex-col gap-1 mt-2\">\n <div class=\"text-sm text-gray-600\">Status</div>\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Select Status\"\n [disabled]=\"true\"\n [options]=\"statusOptions\"\n [(ngModel)]=\"data.Status\"\n >\n </verben-drop-down>\n </div>\n <div class=\"flex flex-col gap-1 mt-2 mb-18\">\n <div class=\"text-sm text-gray-600\">Priority</div>\n <verben-drop-down\n optionLabel=\"Name\"\n [filter]=\"true\"\n optionValue=\"Code\"\n [disabled]=\"true\"\n [options]=\"tenantOptions\"\n [(ngModel)]=\"data.Priority\"\n [width]=\"'100%'\"\n ></verben-drop-down>\n </div>\n <!-- <verbena-button\n (click)=\"save()\"\n [width]=\"'100%'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Update'\"\n [bgColor]=\"'#9C56BA'\"\n ></verbena-button> -->\n </section>\n </div>\n</div>\n" }]
|
|
580
|
+
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.HttpWebRequestService }, { type: i2.UtilService }, { type: i2.SharedService }, { type: i3.Location }, { type: i2.EnvironmentService }], propDecorators: { user: [{
|
|
581
|
+
type: Input
|
|
582
|
+
}], defaultCompany: [{
|
|
583
|
+
type: Input
|
|
584
|
+
}], userPopups: [{
|
|
585
|
+
type: ViewChildren,
|
|
586
|
+
args: ['userPopup']
|
|
587
|
+
}], color: [{
|
|
588
|
+
type: Input
|
|
589
|
+
}], textColor: [{
|
|
590
|
+
type: Input
|
|
591
|
+
}] } });
|
|
592
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0aW5nLWRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy90aWNrZXRpbmctZGV0YWlsL3RpY2tldGluZy1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbXBvbmVudHMvdGlja2V0aW5nLWRldGFpbC90aWNrZXRpbmctZGV0YWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUlMLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRWhGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUdsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFHeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBSW5FLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBTTNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7O0FBUTdDLE1BQU0sT0FBTyx3QkFBd0I7SUFJekI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBUkQsSUFBSSxDQUFRO0lBQ1osY0FBYyxHQUFXLEVBQUUsQ0FBQztJQUNyQyxZQUNVLEtBQXFCLEVBQ3JCLE1BQTZCLEVBQzdCLFdBQTJCLEVBQzNCLGFBQTRCLEVBQzVCLFFBQWtCLEVBQ2xCLE1B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QkFBd0IsNFBDcENyQyx5dVBBa09BOzs0RkQ5TGEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHNCQUFzQjtxT0FLdkIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBaUJxQixVQUFVO3NCQUFwQyxZQUFZO3VCQUFDLFdBQVc7Z0JBWWhCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgaW5wdXQsXG4gIE9uSW5pdCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFBhcmFtTWFwIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9iamVjdFN0YXRlLCBTb3J0RGlyZWN0aW9uIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBUaWNrZXQgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFRpY2tldFN0YXR1cyB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgSHR0cFdlYlJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL3NlcnZpY2VzJztcbmltcG9ydCB7IFNlYXJjaFByb3BlcnR5VmFsdWUgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFNlYXJjaE9wZXJhdG9yIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBTZWFyY2hQcm9wZXJ0eVNpZ24gfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFV0aWxTZXJ2aWNlIGFzIEFwcFV0aWxTZXJ2aWNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL3NlcnZpY2VzJztcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBQYWdlZFJlc3VsdCB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVGlja2V0TWVzc2FnZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBERUZBVUxUX01FU1NBR0VfRk9SX0lOSVRJQUxfVVBMT0FEIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5cbmltcG9ydCB7IFRlbmFudFByaW9yaXR5IH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGaWxlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFZlcmJlblBvcFVwQ29tcG9uZW50IH0gZnJvbSAndmVyYmVuLW5nLXVpJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXRpY2tldGluZy1kZXRhaWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGlja2V0aW5nLWRldGFpbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi90aWNrZXRpbmctZGV0YWlsLmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBUaWNrZXRpbmdEZXRhaWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB1c2VyITogVXNlcjtcbiAgQElucHV0KCkgZGVmYXVsdENvbXBhbnk6IHN0cmluZyA9ICcnO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHNlcnZlcjogSHR0cFdlYlJlcXVlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbFNlcnZpY2U6IEFwcFV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBwcml2YXRlIGVudlN2YzogRW52aXJvbm1lbnRTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLnRpY2tldGluZ0FQSSA9IGAke3RoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSX0vVGlja2V0YDtcblxuICAgIHRoaXMuZ2xBUEkgPSB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5HTEFQSTtcbiAgfVxuICBzaG93Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuICBkYXRhITogVGlja2V0O1xuICB0eXBpbmdRdWVyeTogc3RyaW5nID0gJyc7XG4gIGlzU2VhcmNoaW5nVXNlcnMgPSBmYWxzZTtcbiAgQFZpZXdDaGlsZHJlbigndXNlclBvcHVwJykgdXNlclBvcHVwcyE6IFF1ZXJ5TGlzdDxWZXJiZW5Qb3BVcENvbXBvbmVudD47XG4gIHRpY2tldFN0YXR1cyA9IFRpY2tldFN0YXR1cztcbiAgdGlja2V0aW5nQVBJOiBzdHJpbmcgPSAnJztcbiAgdGVuYW50T3B0aW9uczogVGVuYW50UHJpb3JpdHlbXSA9IFtdO1xuICBnbEFQSTogc3RyaW5nID0gJyc7XG4gIGF0dGFjaGVkTWVzc2FnZTogVGlja2V0TWVzc2FnZSB8IG51bGwgPSBudWxsO1xuICBtYXhGaWxlU2l6ZSA9IDE1ICogMTAyNCAqIDEwMjQ7XG4gIG1lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBhY3Rpb246IGFueTtcbiAgc2VhcmNoVHJpZ2dlciQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIGZpbGVEYXRhOiBGaWxlW10gPSBbXTtcbiAgY29kZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGNvbG9yID0gJyNmZmU2ODEnO1xuICBASW5wdXQoKSB0ZXh0Q29sb3IgPSAnIzAwMCc7XG4gIHN0YXR1c09wdGlvbnM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMoVGlja2V0U3RhdHVzKTtcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZS5wYXJhbU1hcC5zdWJzY3JpYmUoYXN5bmMgKHBhcmFtczogUGFyYW1NYXApID0+IHtcbiAgICAgIGNvbnN0IGNvZGUgPSBwYXJhbXMuZ2V0KCdjb2RlJyk7XG5cbiAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIHRoaXMuZ2V0VGlja2V0RGV0YWlsKGNvZGUpO1xuICAgICAgICB0aGlzLmdldEFsbFRhc2soY29kZSk7XG4gICAgICAgIHRoaXMuZ2V0VGVuYW50UHJpb3JpdHkoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoVHJpZ2dlciQucGlwZShkZWJvdW5jZVRpbWUoMzAwKSkuc3Vic2NyaWJlKChxdWVyeSkgPT4ge1xuICAgICAgICBpZiAocXVlcnkpIHtcbiAgICAgICAgICB0aGlzLnNlYXJjaFVzZXJzKHF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgb25Gb3JtQ2xvc2UoaXNTaG93OiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG93Rm9ybSA9IGlzU2hvdztcbiAgfVxuICBvbkZvcm1PcGVuKGlzU2hvdzogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvd0Zvcm0gPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgb25GaWxlc1VwZGF0ZShmaWxlczogYW55KSB7XG4gICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IGEgZmlsZSB0byBiYXNlNjRcbiAgICBjb25zdCB0b0Jhc2U2NCA9IChmaWxlOiBhbnkpOiBQcm9taXNlPHN0cmluZz4gPT5cbiAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZWRGaWxlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGU6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJhc2U2NERhdGEgPSBhd2FpdCB0b0Jhc2U2NChmaWxlKTtcbiAgICAgICAgICBjb25zdCBuYW1lID0gZmlsZS5uYW1lIHx8ICdmaWxlJztcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBuYW1lLnNwbGl0KCcuJykucG9wKCkgfHwgJyc7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIE5hbWU6IG5hbWUsXG4gICAgICAgICAgICBFeHRlbnNpb246IGV4dGVuc2lvbixcbiAgICAgICAgICAgIERhdGE6IGJhc2U2NERhdGEsXG4gICAgICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLk5ldyBhcyBhbnksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB0aGlzLmZpbGVEYXRhID0gY29udmVydGVkRmlsZXM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNvbnZlcnRpbmcgZmlsZXMgdG8gYmFzZTY0OicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlTWVzc2FnZUNoYXQodGlja2V0OiBUaWNrZXQsIG5ld01lc3NhZ2VDb250ZW50OiBzdHJpbmcpIHtcbiAgICBpZiAoIW5ld01lc3NhZ2VDb250ZW50IHx8IG5ld01lc3NhZ2VDb250ZW50LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oJ01lc3NhZ2UgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3TWVzc2FnZSA9IHtcbiAgICAgIENvZGU6ICcnLFxuICAgICAgTmFtZTogdGhpcy51c2VyPy5NYWlsQWRkcmVzcyB8fCAncGVyZmVjdGlvbi5jaGl6dXJ1b2tlQHZlcmJlbmFsb2dpYy5jb20nLFxuICAgICAgVGlja2V0Q29kZTogdGlja2V0LkNvZGUgfHwgJycsXG4gICAgICBTdWJqZWN0OiAnJyxcbiAgICAgIENvbnRlbnQ6IG5ld01lc3NhZ2VDb250ZW50LnRyaW0oKSxcbiAgICAgIEF0dGFjaG1lbnRzOiB0aGlzLmZpbGVEYXRhLmxlbmd0aCA/IHRoaXMuZmlsZURhdGEgOiBbXSxcbiAgICAgIEF0dGFjaG1lbnRVcmxzOiBbXSxcbiAgICAgIENvbXBhbnk6IHRpY2tldC5Db21wYW55LFxuICAgICAgVGVuYW50SWQ6ICcnLFxuICAgICAgVXBzZXJ0OiBmYWxzZSxcbiAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIFVwZGF0ZWRCeTogJycsXG4gICAgICBDcmVhdGVkQnk6ICcnLFxuICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICBJZDogJycsXG4gICAgfTtcblxuICAgIC8vIGlmICghdGhpcy5kYXRhLk1lc3NhZ2VzKSB0aGlzLmRhdGEuTWVzc2FnZXMgPSBbXTtcblxuICAgIC8vIHRoaXMuZGF0YS5NZXNzYWdlcy5wdXNoKG5ld01lc3NhZ2UpO1xuXG4gICAgLy8gdGhpcy5kYXRhLkRhdGFTdGF0ZSA9IE9iamVjdFN0YXRlLkNoYW5nZWQ7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgIGBUaWNrZXQvU2VuZE1haWxUb1RpY2tldE93bmVyYCxcbiAgICAgICAgbmV3TWVzc2FnZSxcbiAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgKTtcblxuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuXG4gICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcignRmFpbGVkIHRvIHNlbmQgbWVzc2FnZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSByZXMgYXMgVGlja2V0TWVzc2FnZTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5kYXRhLk1lc3NhZ2VzID0gWy4uLnRoaXMuZGF0YS5NZXNzYWdlcywgcmVzdWx0XTtcblxuICAgICAgICB0aGlzLmRhdGEgPSB7IC4uLnRoaXMuZGF0YSB9O1xuXG4gICAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ01lc3NhZ2Ugc2VudCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcignU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2hpbGUgc2VuZGluZyBtZXNzYWdlJyk7XG4gICAgfVxuICB9XG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZGF0YTtcblxuICAgICgoaXRlbS5EYXRhU3RhdGUgPSB0aGlzLmRhdGEgPyBPYmplY3RTdGF0ZS5DaGFuZ2VkIDogT2JqZWN0U3RhdGUuTmV3KSxcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgYFRpY2tldC9TYXZlVGlja2V0YCxcbiAgICAgIFtpdGVtXSxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dTdWNjZXNzKCdUaWNrZXQgc2F2ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXMgYXMgVGlja2V0O1xuICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRhdGEgPSB7IC4uLnRoaXMuZGF0YSwgLi4ucmVzdWx0IH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ29CYWNrKCkge1xuICAgIHRoaXMubG9jYXRpb24uYmFjaygpO1xuICB9XG4gIGRpc2FibGVDaGF0Qm94QnV0dG9uKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBvbktleURvd24oZTogYW55KSB7fVxuICBtZXNzYWdlQ2hhbmdlKGU6IGFueSkge1xuICAgIHRoaXMubWVzc2FnZSA9IGU7XG4gICAgdGhpcy5kZXRlY3RVc2VyU2VhcmNoVHJpZ2dlcihlKTtcbiAgfVxuXG4gIHNlbGVjdFVzZXIodXNlcjogYW55KSB7XG4gICAgY29uc3QgYmVmb3JlID0gdGhpcy5tZXNzYWdlLnJlcGxhY2UoL0AoW2EtekEtWjAtOV9dKikkLywgJycpO1xuICAgIHRoaXMubWVzc2FnZSA9IGJlZm9yZSArICdAJyArIHVzZXIuTWFpbEFkZHJlc3MgKyAnICc7XG5cbiAgICB0aGlzLm1lc3NhZ2VDaGFuZ2UodGhpcy5tZXNzYWdlKTtcbiAgICB0aGlzLmNsb3NlVXNlclBvcHVwKCk7XG4gIH1cblxuICBvcGVuVXNlclBvcHVwKCkge1xuICAgIHRoaXMudXNlclBvcHVwcy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICBpZiAoIXAuZHJvcGRvd25PcGVuKSBwLnRvZ2dsZURyb3Bkb3duKCk7XG4gICAgfSk7XG4gIH1cblxuICBjbG9zZVVzZXJQb3B1cCgpIHtcbiAgICB0aGlzLnVzZXJQb3B1cHMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgaWYgKHAuZHJvcGRvd25PcGVuKSBwLnRvZ2dsZURyb3Bkb3duKCk7XG4gICAgfSk7XG4gIH1cblxuICBkZXRlY3RVc2VyU2VhcmNoVHJpZ2dlcih0ZXh0OiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWdleCA9IC9AKFthLXpBLVowLTlfXSopJC87XG4gICAgY29uc3QgbWF0Y2ggPSB0ZXh0Lm1hdGNoKHJlZ2V4KTtcblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgdGhpcy50eXBpbmdRdWVyeSA9IG1hdGNoWzFdO1xuICAgICAgdGhpcy5pc1NlYXJjaGluZ1VzZXJzID0gdHJ1ZTtcblxuICAgICAgdGhpcy5zZWFyY2hUcmlnZ2VyJC5uZXh0KHRoaXMudHlwaW5nUXVlcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnR5cGluZ1F1ZXJ5ID0gJyc7XG4gICAgICB0aGlzLmlzU2VhcmNoaW5nVXNlcnMgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2xvc2VVc2VyUG9wdXAoKTtcbiAgICB9XG4gIH1cblxuICB1c2Vyc1Jlc3VsdDogYW55W10gPSBbXTtcblxuICBhc3luYyBzZWFyY2hVc2VycyhxdWVyeTogc3RyaW5nKSB7XG4gICAgaWYgKCFxdWVyeSkge1xuICAgICAgdGhpcy51c2Vyc1Jlc3VsdCA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnTWFpbEFkZHJlc3MnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogcXVlcnksXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5MSUtFLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgIGBTZWFyY2hVc2Vycy8wLzIwYCxcbiAgICAgIHBheWxvYWQsXG4gICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5BdXRoZW50aWNhdGlvbkFQSSxcbiAgICApO1xuXG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHJldHVybjtcblxuICAgIHRoaXMudXNlcnNSZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PGFueT4pLlJlc3VsdDtcbiAgICB0aGlzLm9wZW5Vc2VyUG9wdXAoKTtcbiAgfVxuXG4gIHRyaWdnZXJGaWxlVXBsb2FkKCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbGVJbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgZmlsZUlucHV0LnR5cGUgPSAnZmlsZSc7XG4gICAgZmlsZUlucHV0LmFjY2VwdCA9ICcucG5nLCAuanBnLCAuanBlZywgLnBkZic7XG4gICAgZmlsZUlucHV0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IC8vIEhpZGRlbiBmaWxlIGlucHV0XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmaWxlSW5wdXQpOyAvLyBUZW1wb3JhcmlseSBhZGQgdG8gRE9NXG5cbiAgICBmaWxlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IGZpbGVJbnB1dC5maWxlcz8uWzBdO1xuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzRmlsZShmaWxlKTtcbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZmlsZUlucHV0KTsgLy8gQ2xlYW4gdXAgYWZ0ZXIgdXNlXG4gICAgfSk7XG5cbiAgICBmaWxlSW5wdXQuY2xpY2soKTsgLy8gUHJvZ3JhbW1hdGljYWxseSB0cmlnZ2VyIGNsaWNrXG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzRmlsZShzZWxlY3RlZEZpbGU6IGdsb2JhbFRoaXMuRmlsZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGZpbGUgc2l6ZVxuICAgIGlmIChzZWxlY3RlZEZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUpIHtcbiAgICAgIGNvbnN0IGxpbWl0SW5NQiA9IHRoaXMubWF4RmlsZVNpemUgLyAxMDI0IC8gMTAyNDtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oYEZpbGUgc2l6ZSBsaW1pdCBvZiAke2xpbWl0SW5NQn1tYiBleGNlZWRlZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGxldCBmaWxlVG9Qcm9jZXNzOiBnbG9iYWxUaGlzLkZpbGUgfCBudWxsID0gc2VsZWN0ZWRGaWxlO1xuICAgIC8vIGNvbnN0IHNhZmVOdW1iZXI6IG51bWJlciA9IDEgKiAxMDI0ICogMTAyNDtcbiAgICAvLyBpZiAoZmlsZVRvUHJvY2Vzcy5zaXplID4gc2FmZU51bWJlcikge1xuICAgIC8vICAgZmlsZVRvUHJvY2VzcyA9IGF3YWl0IHRoaXMudXRpbFNlcnZpY2UuY29tcHJlc3NJbWFnZShzZWxlY3RlZEZpbGUpO1xuICAgIC8vICAgaWYgKCFmaWxlVG9Qcm9jZXNzKSB7XG4gICAgLy8gICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0Vycm9yKCdFcnJvciBjb21wcmVzc2luZyBpbWFnZScpO1xuICAgIC8vICAgICByZXR1cm47XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgLy8gUmVhZCBmaWxlIGFuZCBjb252ZXJ0IHRvIGJhc2U2NFxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoc2VsZWN0ZWRGaWxlKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZTY0ZGF0YSA9IHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgZmlsZSA9IHRoaXMuc2hhcmVkU2VydmljZS5jcmVhdGVDdXN0b21GaWxlKFxuICAgICAgICBiYXNlNjRkYXRhLFxuICAgICAgICAwLFxuICAgICAgICBzZWxlY3RlZEZpbGUsXG4gICAgICApO1xuICAgICAgaWYgKGZpbGUgJiYgdGhpcy5hdHRhY2hlZE1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5hdHRhY2hlZE1lc3NhZ2UuQXR0YWNobWVudHMucHVzaChmaWxlKTtcbiAgICAgICAgdGhpcy5hdHRhY2hlZE1lc3NhZ2UuQXR0YWNobWVudFVybHMucHVzaChgJHtmaWxlLk5hbWV9YCk7XG4gICAgICAgIC8vIHRoaXMucHJvZmlsZUltYWdlID0gYmFzZTY0ZGF0YTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGFzeW5jIGdldFRpY2tldERldGFpbChjb2RlOiBzdHJpbmcpOiBQcm9taXNlPFRpY2tldCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnQ29kZScsXG4gICAgICAgIEVudGl0eVZhbHVlOiBjb2RlLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLk5FUSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBgVGlja2V0L1NlYXJjaFRpY2tldC8wLzUwYCxcbiAgICAgIHBheWxvYWQsXG4gICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG5cbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8VGlja2V0PikuUmVzdWx0O1xuICAgIGlmIChyZXN1bHQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZGF0YSA9IHJlc3VsdFswXTtcbiAgICAgIHRoaXMuZ2V0TWVzc2FnZXModGhpcy5kYXRhLkNvZGUpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmRhdGEuTWVzc2FnZXMgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdFswXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGFzeW5jIGdldE1lc3NhZ2VzKGNvZGU6IHN0cmluZyk6IFByb21pc2U8VGlja2V0TWVzc2FnZVtdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGF5bG9hZDogU2VhcmNoUHJvcGVydHlWYWx1ZVtdID0gW1xuICAgICAge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUaWNrZXRDb2RlJyxcbiAgICAgICAgRW50aXR5VmFsdWU6IGNvZGUsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgU29ydDogU29ydERpcmVjdGlvbi5EZXNjLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGVuYW50SWQnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogJycsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5ORVEsXG4gICAgICAgIFNvcnQ6IFNvcnREaXJlY3Rpb24uRGVzYyxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBgVGlja2V0L1NlYXJjaFRpY2tldE1lc3NhZ2UvMC81MDBgLFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxUaWNrZXRNZXNzYWdlPikuUmVzdWx0O1xuICAgIGlmIChyZXN1bHQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBhc3luYyBnZXRUZW5hbnRQcmlvcml0eSgpOiBQcm9taXNlPFRlbmFudFByaW9yaXR5IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGF5bG9hZDogU2VhcmNoUHJvcGVydHlWYWx1ZVtdID0gW1xuICAgICAge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLk5FUSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBgVGlja2V0L1NlYXJjaFRlbmFudFByaW9yaXR5LzAvNTBgLFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxUZW5hbnRQcmlvcml0eT4pLlJlc3VsdDtcbiAgICBpZiAocmVzdWx0Py5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRlbmFudE9wdGlvbnMgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNzc0NvbG9yVG9IZXgoY29sb3I6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICBpZiAoIWN0eCkgcmV0dXJuIG51bGw7XG5cbiAgICBjdHguZmlsbFN0eWxlID0gJyMwMDAnOyAvLyBzZXQgYSBrbm93biBjb2xvclxuICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvcjsgLy8gYXNzaWduIGFueSBDU1MtdmFsaWQgY29sb3JcblxuICAgIGNvbnN0IGNvbXB1dGVkID0gY3R4LmZpbGxTdHlsZTtcbiAgICAvLyBJZiB0aGUgYnJvd3NlciBkb2VzIE5PVCB1bmRlcnN0YW5kIHRoZSB2YWx1ZSwgaXQgd29u4oCZdCBjaGFuZ2UgZnJvbSAnIzAwMCdcbiAgICBpZiAoXG4gICAgICBjb21wdXRlZC50b0xvd2VyQ2FzZSgpID09PSAnIzAwMDAwMCcgJiZcbiAgICAgIGNvbG9yLnRvTG93ZXJDYXNlKCkgIT09ICdibGFjaydcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBpbnZhbGlkIGNvbG9yIG5hbWUgb3IgdW5zdXBwb3J0ZWQgdmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcHV0ZWQudG9VcHBlckNhc2UoKTsgLy8gcmV0dXJucyBoZXggbGlrZSAjMUU5MEZGXG4gIH1cbiAgc29mdGVuQ29sb3IoaGV4OiBzdHJpbmcsIGxpZ2h0ZW5QZXJjZW50ID0gNTUsIGFscGhhUGVyY2VudCA9IDU1KTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgI1xuICAgIGlmICghaGV4LnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgY29uc3QgY29udmVydGVkID0gdGhpcy5jc3NDb2xvclRvSGV4KGhleCk7XG4gICAgICBpZiAoY29udmVydGVkKSB7XG4gICAgICAgIGhleCA9IGNvbnZlcnRlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoZXggPSBoZXgucmVwbGFjZSgvXiMvLCAnJyk7XG4gICAgaWYgKGhleC5sZW5ndGggPT09IDMpIHtcbiAgICAgIC8vIENvbnZlcnQgc2hvcnRoYW5kICgjYWJjIOKGkiAjYWFiYmNjKVxuICAgICAgaGV4ID0gaGV4XG4gICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgLm1hcCgoeCkgPT4geCArIHgpXG4gICAgICAgIC5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBjb25zdCBudW0gPSBwYXJzZUludChoZXgsIDE2KTtcbiAgICBsZXQgciA9IChudW0gPj4gMTYpICYgMHhmZjtcbiAgICBsZXQgZyA9IChudW0gPj4gOCkgJiAweGZmO1xuICAgIGxldCBiID0gbnVtICYgMHhmZjtcblxuICAgIC8vIExpZ2h0ZW4gdG93YXJkIHdoaXRlIGJ5IHRoZSBnaXZlbiBwZXJjZW50YWdlXG4gICAgciA9IE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZChyICsgKDI1NSAtIHIpICogKGxpZ2h0ZW5QZXJjZW50IC8gMTAwKSkpO1xuICAgIGcgPSBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoZyArICgyNTUgLSBnKSAqIChsaWdodGVuUGVyY2VudCAvIDEwMCkpKTtcbiAgICBiID0gTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKGIgKyAoMjU1IC0gYikgKiAobGlnaHRlblBlcmNlbnQgLyAxMDApKSk7XG5cbiAgICAvLyBDb252ZXJ0IGFscGhhIHBlcmNlbnQgdG8gMi1kaWdpdCBoZXhcbiAgICBjb25zdCBhbHBoYSA9IE1hdGgucm91bmQoKGFscGhhUGVyY2VudCAvIDEwMCkgKiAyNTUpO1xuICAgIGNvbnN0IGFIZXggPSBhbHBoYS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgcmV0dXJuIGAjJHtyLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCl9JHtnXG4gICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAucGFkU3RhcnQoMiwgJzAnKVxuICAgICAgLnRvVXBwZXJDYXNlKCl9JHtiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCl9JHthSGV4fWA7XG4gIH1cbiAgZ2V0VGlja2V0TWVzc2FnZSgpOiBUaWNrZXRNZXNzYWdlIHtcbiAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICBjb25zdCBpbml0aWFsTWVzc2FnZSA9IHRoaXMuZGF0YS5NZXNzYWdlcy5maW5kKFxuICAgICAgICAoeCkgPT4geC5TdWJqZWN0ID09IERFRkFVTFRfTUVTU0FHRV9GT1JfSU5JVElBTF9VUExPQUQsXG4gICAgICApO1xuICAgICAgaWYgKGluaXRpYWxNZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmluaXRpYWxNZXNzYWdlLCBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLkNoYW5nZWQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld01lc3NhZ2U6IFRpY2tldE1lc3NhZ2UgPSB7XG4gICAgICAgICAgVGlja2V0Q29kZTogJycsXG4gICAgICAgICAgU3ViamVjdDogREVGQVVMVF9NRVNTQUdFX0ZPUl9JTklUSUFMX1VQTE9BRCxcbiAgICAgICAgICBDb250ZW50OiAnJyxcbiAgICAgICAgICBBdHRhY2htZW50czogW10sXG4gICAgICAgICAgQXR0YWNobWVudFVybHM6IFtdLFxuICAgICAgICAgIENvbXBhbnk6IHRoaXMuZGVmYXVsdENvbXBhbnksXG4gICAgICAgICAgSWQ6ICcnLFxuICAgICAgICAgIENvZGU6ICcnLFxuICAgICAgICAgIFRlbmFudElkOiAnJyxcbiAgICAgICAgICBTZXJ2aWNlTmFtZTogJycsXG4gICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXdNZXNzYWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdNZXNzYWdlOiBUaWNrZXRNZXNzYWdlID0ge1xuICAgICAgICBUaWNrZXRDb2RlOiAnJyxcbiAgICAgICAgU3ViamVjdDogREVGQVVMVF9NRVNTQUdFX0ZPUl9JTklUSUFMX1VQTE9BRCxcbiAgICAgICAgQ29udGVudDogJycsXG4gICAgICAgIEF0dGFjaG1lbnRzOiBbXSxcbiAgICAgICAgQXR0YWNobWVudFVybHM6IFtdLFxuICAgICAgICBDb21wYW55OiB0aGlzLmRlZmF1bHRDb21wYW55LFxuICAgICAgICBJZDogJycsXG4gICAgICAgIENvZGU6ICcnLFxuICAgICAgICBUZW5hbnRJZDogJycsXG4gICAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgICAgaWQ6ICcnLFxuICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ld01lc3NhZ2U7XG4gICAgfVxuICB9XG4gIGFzeW5jIGdldEFsbFRhc2soY29kZTogc3RyaW5nKTogUHJvbWlzZTxhbnlbXSB8IHVuZGVmaW5lZD4ge1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgYFRhc2svR2V0VGFza0luZm8vJHtjb2RlfWAsXG4gICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSSxcbiAgICApO1xuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuXG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcyBhcyBhbnlbXTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5kYXRhLlRhc2tEYXRhID0gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgYXN5bmMgcGFzc09uKFxuICAgIGRhdGE6IFRpY2tldCxcbiAgICBmcm9tU3RhZ2U6IHN0cmluZyxcbiAgICB0b1N0YWdlOiBzdHJpbmcsXG4gICAgY29tbWVudD86IHN0cmluZyxcbiAgICByZWNpcGllbnQ/OiBzdHJpbmcsXG4gICkge1xuICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAuLi5kYXRhLlRhc2tEYXRhLFxuICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5DaGFuZ2VkLFxuICAgICAgSGlzdG9yeVRvRGF0ZTogZGF0YS5UYXNrRGF0YS5IaXN0b3J5VG9EYXRlLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBBY3RvcjogaXRlbS5BY3RvclxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi5pdGVtLkFjdG9yLFxuICAgICAgICAgICAgICBBY3RvclRhZ3M6IFtdLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIH0pKSxcbiAgICAgIEN1cnJlbnRBY3RvcnM6IGRhdGEuVGFza0RhdGEuQ3VycmVudEFjdG9ycy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgQWN0b3JUYWdzOiBbXSxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgZGVsZXRlIChwYXlsb2FkIGFzIGFueSkuRnVsbFN0YWdlcztcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgIGBUYXNrL1Bhc3NPbi8ke2Zyb21TdGFnZX0vJHt0b1N0YWdlfS8ke2NvbW1lbnR9JHtcbiAgICAgICAgICByZWNpcGllbnQgPyAnLycgKyByZWNpcGllbnQgOiAnJ1xuICAgICAgICB9YCxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUEksXG4gICAgICApO1xuXG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG5cbiAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXMgYXMgYW55O1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgZGF0YS5UYXNrRGF0YSA9IHJlc3VsdDtcbiAgICAgICAgICB0aGlzLmdldEFsbFRhc2soZGF0YS5Db2RlKS50aGVuKCh0YXNrUmVzKSA9PiB7XG4gICAgICAgICAgICBpZiAodGFza1JlcyAmJiBkYXRhKSB7XG4gICAgICAgICAgICAgIGRhdGEuVGFza0RhdGEgPSB0YXNrUmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmFjdGlvbiA9IG51bGw7XG4gICAgICAgICAgZGF0YS5UYXNrQ29tbWVudCA9ICcnO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtID0gYXdhaXQgdGhpcy5nZXRVcGRhdGVkVGlja2V0KGRhdGEuQ29kZSk7XG4gICAgICAgICAgaWYgKHVwZGF0ZWRJdGVtKSB7XG4gICAgICAgICAgICBkYXRhLlN0YXR1cyA9IHVwZGF0ZWRJdGVtLlN0YXR1cztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgICAgY29uc29sZS5lcnJvcignUGFzc09uIEVycm9yOicsIGVycik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZvcm1GaWxsKGZvcm1WYWx1ZXM6IGFueSwgdGlja2V0OiBUaWNrZXQpIHtcbiAgICBjb25zdCBwYXlsb2FkID0gZm9ybVZhbHVlcztcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgIGBGb3JtL0ZpbGxGb3JtLyR7dGhpcy5jb2RlfWAsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LldvcmtGbG93QVBJLFxuICAgICAgKTtcblxuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuXG4gICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXNzT24oXG4gICAgICAgICAgdGlja2V0LFxuICAgICAgICAgIHRoaXMuYWN0aW9uLmFjdGlvbj8uRnJvbVN0YWdlLFxuICAgICAgICAgIHRoaXMuYWN0aW9uLmFjdGlvbj8uVG9TdGFnZSxcbiAgICAgICAgICB0aGlzLmFjdGlvbi5jb21tZW50LFxuICAgICAgICAgICcnLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgICAgY29uc29sZS5lcnJvcignUGFzc09uIEVycm9yOicsIGVycik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFVwZGF0ZWRUaWNrZXQoY29kZTogc3RyaW5nKTogUHJvbWlzZTxUaWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSBbXG4gICAgICB7XG4gICAgICAgIFByb3BlcnR5TmFtZTogJ0NvZGUnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogY29kZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGVuYW50SWQnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogJycsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5ORVEsXG4gICAgICB9LFxuICAgIF07XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgIGBUaWNrZXQvU2VhcmNoVGlja2V0LzAvNTBgLFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICApO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSByZXMgYXMgUGFnZWRSZXN1bHQ8VGlja2V0PjtcbiAgICBpZiAocmVzdWx0LlJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0LlJlc3VsdFswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVBY3Rpb25Db21wbGV0ZShhY3Rpb246IGFueSwgZGF0YTogVGlja2V0KSB7XG4gICAgZGF0YS5UYXNrQ29tbWVudCA9IGFjdGlvbi5jb21tZW50O1xuXG4gICAgY29uc3QgaGFzRm9ybXMgPSBkYXRhLlRhc2tEYXRhPy5UYXNrRm9ybXM/Lmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoaGFzRm9ybXMpIHtcbiAgICAgIHRoaXMuc2hvd0Zvcm0gPSB0cnVlO1xuICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5wYXNzT24oXG4gICAgICBkYXRhLFxuICAgICAgYWN0aW9uPy5hY3Rpb24uRnJvbVN0YWdlLFxuICAgICAgYWN0aW9uPy5hY3Rpb24uVG9TdGFnZSxcbiAgICAgIGRhdGEuVGFza0NvbW1lbnQsXG4gICAgICAnJyxcbiAgICApO1xuICB9XG59XG4iLCI8ZGl2XG4gIChjbGljayk9XCJnb0JhY2soKVwiXG4gIGNsYXNzPVwibXktNCB3LWZpdCBtbC1hdXRvIGJvcmRlciBwLTEgcm91bmRlZC1sZyBib3JkZXItZ3JheS00MDAgY3Vyc29yLXBvaW50ZXJcIlxuPlxuICA8dmVyYmVuLXN2ZyBbaWNvbl09XCInYXJyb3ctbGVmdCdcIj48L3ZlcmJlbi1zdmc+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCJkYXRhXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy0xMiBnYXAtOFwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJsZzpjb2wtc3Bhbi04IGNvbC1zcGFuLTEyIGJvcmRlciByZWxhdGl2ZSByb3VuZGVkLTJ4bCBwLTYgYm9yZGVyLVsjMDAwMDAwMUFdXCJcbiAgPlxuIFxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIGl0ZW1zLWNlbnRlciBtdC02XCI+XG4gICAgICA8aDMgY2xhc3M9XCJtdC0yIGZvbnQtYm9sZFwiPnt7IGRhdGEuVGl0bGUgfX08L2gzPlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0YS5Qcmlvcml0eSAmJiBkYXRhLlByaW9yaXR5XG4gICAgICAgICAgICB8IGFzeW5jTGFiZWwgOiAnVGVuYW50UHJpb3JpdHknIDogJ0NvbG9yJyA6IHRpY2tldGluZ0FQSVxuICAgICAgICAgICAgfCBhc3luYyBhcyBjb2xvclxuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cImVudW0tdmFsIHJvdW5kZWQtWzhweF0gZmxleCBnYXAtMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cInNvZnRlbkNvbG9yKGNvbG9yKVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiY29sb3JcIiBjbGFzcz1cImVudW0tZG90XCI+PC9zcGFuPlxuICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgIGRhdGEuUHJpb3JpdHlcbiAgICAgICAgICAgIHwgYXN5bmNMYWJlbCA6IFwiVGVuYW50UHJpb3JpdHlcIiA6IFwiTmFtZVwiIDogdGlja2V0aW5nQVBJXG4gICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPHAgY2xhc3M9XCJtdC0yIHRleHQtc21cIj57eyBkYXRhLkRlc2NyaXB0aW9uIH19PC9wPlxuICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGFjaG1lbnQtc2VjdGlvbiBwLTIgZmxleCBmbGV4LWNvbCBnYXAtM1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiYXR0YWNobWVudHMtY29udGFpbmVyIGdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTJcIlxuICAgICAgICAgICAgKm5nSWY9XCJkYXRhLkZpbGVVcmxzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWxlIG9mIGRhdGEuRmlsZVVybHNcIj5cbiAgICAgICAgICAgICAgPGFwcC1maWxlLXJlbmRlciBbZmlsZVVybF09XCJmaWxlXCI+PC9hcHAtZmlsZS1yZW5kZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1heC1oLVs1MDBweF0gbGc6bWF4LWgtWzIzMHB4XSBvdmVyZmxvdy15LWF1dG8gcHItMVwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBkYXRhLk1lc3NhZ2VzOyBsZXQgbGFzdCA9IGxhc3RcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibXQtNiBmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgcGItNFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnYm9yZGVyLWIgYm9yZGVyLWdyYXktMzAwJzogIWxhc3QgfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LVs1MHB4XSBoLVs1MHB4XSBvYmplY3QtY292ZXIgcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3NyY109XCInL2Fzc2V0cy9pbWFnZXMvYXZhdGFyLnBuZydcIlxuICAgICAgICAgICAgICBhbHQ9XCJhdmF0YXJcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxoNCBjbGFzcz1cImZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuQ29tcGFueVxuICAgICAgICAgICAgICAgICAgICB8IGFzeW5jTGFiZWwgOiBcIkNvbXBhbnlcIiA6IFwiRGVzY3JpcHRpb25cIiA6IGdsQVBJXG4gICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8L2g0PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQteHNcIj57eyAhbWVzc2FnZS5OYW1lID8gXCJOaWxcIiA6IG1lc3NhZ2UuTmFtZSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgIHt7IG1lc3NhZ2UuQ3JlYXRlZEF0IHwgY29tcGFueURhdGUgfX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxwIGNsYXNzPVwibXQtNiB0ZXh0LXNtXCI+XG4gICAgICAgICAge3sgIW1lc3NhZ2UuQ29udGVudCA/IFwiTmlsXCIgOiBtZXNzYWdlLkNvbnRlbnQgfX1cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdHRhY2htZW50LXNlY3Rpb24gcC0yIGZsZXggZmxleC1jb2wgZ2FwLTNcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImF0dGFjaG1lbnRzLWNvbnRhaW5lciBncmlkIGdyaWQtY29scy0zIGdhcC0yXCJcbiAgICAgICAgICAgICpuZ0lmPVwibWVzc2FnZS5BdHRhY2htZW50VXJsc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmlsZSBvZiBtZXNzYWdlLkF0dGFjaG1lbnRVcmxzXCI+XG4gICAgICAgICAgICAgIDxhcHAtZmlsZS1yZW5kZXIgW2ZpbGVVcmxdPVwiZmlsZVwiPjwvYXBwLWZpbGUtcmVuZGVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwicHQtNVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImJvcmRlciByb3VuZGVkLWxnIHAtNCBib3JkZXItWyMwMDAwMDAxQV1cIj5cbiAgICBcblxuICAgICAgICA8bGliLWNoYXQtY29udHJvbFxuICAgICAgICAgIChtZXNzYWdlQ2hhbmdlKT1cIm1lc3NhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTdGFydCB0eXBpbmcgYSBtZXNzYWdlLi4uLidcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlQ2hhdEJveEJ1dHRvbigpXCJcbiAgICAgICAgICAoc2VuZE1lc3NhZ2VSZXN1bHQpPVwic2F2ZU1lc3NhZ2VDaGF0KGRhdGEsIG1lc3NhZ2UpXCJcbiAgICAgICAgICBbKG1lc3NhZ2UpXT1cIm1lc3NhZ2VcIlxuICAgICAgICAgIFtjb2xvcl09XCJjb2xvclwiXG4gICAgICAgICAgW3RleHRDb2xvcl09XCJ0ZXh0Q29sb3JcIlxuICAgICAgICAgIChmaWxlc0NoYW5nZSk9XCJvbkZpbGVzVXBkYXRlKCRldmVudClcIlxuICAgICAgICAgIChmb3JtU3VibWl0KT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgPjwvbGliLWNoYXQtY29udHJvbD5cbiAgICAgIDwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW4tcG9wLVVwXG4gICAgICAgICAgI3VzZXJQb3B1cFxuICAgICAgICAgIFtjdXN0b21TdHlsZXNdPVwie1xuICAgICAgICAgICAgJ3otaW5kZXgnOiAnOTknLFxuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICBib3R0b206ICc3MHB4JyxcbiAgICAgICAgICAgIGxlZnQ6ICczMDBweCdcbiAgICAgICAgICB9XCJcbiAgICAgICAgICBbZW5hYmxlTW91c2VMZWF2ZV09XCJmYWxzZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInBvcC11cC1jb250ZW50IGZsZXggZmxleC1jb2wgbWF4LWgtWzIwMHB4XSB3LVszMDBweF0gb3ZlcmZsb3cteS1hdXRvIHAtM1wiXG4gICAgICAgICAgICBkcm9wZG93bi1jb250ZW50XG4gICAgICAgICAgICBbc3R5bGUuYm9yZGVyLWNvbG9yXT1cImNvbG9yXCJcbiAgICAgICAgICA+IFxuICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1ncmF5LTUwMCBwLTJcIj5TdWdnZXN0aW9uczwvcD5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdSBvZiB1c2Vyc1Jlc3VsdFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicC0yIGhvdmVyOmJnLWdyYXktMTAwIHRleHQtc20gY3Vyc29yLXBvaW50ZXIgdy1maXRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VXNlcih1KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHUuTWFpbEFkZHJlc3MgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8cCAqbmdJZj1cInVzZXJzUmVzdWx0Lmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwidGV4dC1ncmF5LTUwMCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgIE5vIG1hdGNoaW5nIHVzZXJzXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdmVyYmVuLXBvcC1VcD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cImxnOmNvbC1zcGFuLTQgY29sLXNwYW4tMTIgcC00IGJvcmRlciByb3VuZGVkLW1kIGJvcmRlci1bIzAwMDAwMDFBXVwiXG4gID5cbiAgICA8aDMgY2xhc3M9XCJtdC0yIGZvbnQtYm9sZFwiPkRldGFpbHM8L2gzPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gbXQtNFwiPlxuICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbGlnaHRcIj5UaWNrZXQgSUQgOjwvcD5cbiAgICAgIDxwPnt7IGRhdGEuQ29kZSB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIG10LTRcIj5cbiAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSBmb250LWxpZ2h0XCI+U3ViamVjdDo8L3A+XG4gICAgICA8cCBjbGFzcz1cInRleHQteHMgdGV4dC1yaWdodFwiPnt7IGRhdGEuVGl0bGUgfX08L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBtdC00XCI+XG4gICAgICA8cCBjbGFzcz1cInRleHQtc20gZm9udC1saWdodFwiPlN0YXR1czo8L3A+XG4gICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0YS5TdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVudW0tdmFsIHJvdW5kZWQtWzhweF0gZmxleCBnYXAtMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIge3tcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLlN0YXR1c1xuICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW51bS1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRhdGEuU3RhdHVzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBtdC00XCI+XG4gICAgICA8cCBjbGFzcz1cInRleHQtc20gZm9udC1saWdodFwiPkNyZWF0ZWRBdCA6PC9wPlxuICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtXCI+e3sgZGF0YS5DcmVhdGVkQXQgfCBjb21wYW55RGF0ZSB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cImRhdGEuU3RhdHVzID09PSB0aWNrZXRTdGF0dXMuQ29tcGxldGVkXCJcbiAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIG10LTRcIlxuICAgID5cbiAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSBmb250LWxpZ2h0XCI+RXhlY3V0aW9uIFRpbWUgOjwvcD5cbiAgICAgIDxwIGNsYXNzPVwidGV4dC1zbVwiPnt7IGRhdGEuRXhlY3V0aW9uVGltZSB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIG10LTRcIj5cbiAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSBmb250LWxpZ2h0XCI+UHJpb3JpdHkgOjwvcD5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBkYXRhLlByaW9yaXR5ICYmIGRhdGEuUHJpb3JpdHlcbiAgICAgICAgICAgIHwgYXN5bmNMYWJlbCA6ICdUZW5hbnRQcmlvcml0eScgOiAnQ29sb3InIDogdGlja2V0aW5nQVBJXG4gICAgICAgICAgICB8IGFzeW5jIGFzIGNvbG9yXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwiZW51bS12YWwgcm91bmRlZC1bOHB4XSBmbGV4IGdhcC0yIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwic29mdGVuQ29sb3IoY29sb3IpXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJjb2xvclwiIGNsYXNzPVwiZW51bS1kb3RcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgZGF0YS5Qcmlvcml0eVxuICAgICAgICAgICAgfCBhc3luY0xhYmVsIDogXCJUZW5hbnRQcmlvcml0eVwiIDogXCJOYW1lXCIgOiB0aWNrZXRpbmdBUElcbiAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8c2VjdGlvbiBjbGFzcz1cIm10LTZcIj5cbiAgICAgIDxoMyBjbGFzcz1cImZvbnQtYm9sZFwiPlByb3BlcnRpZXM8L2gzPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBtdC0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5TdGF0dXM8L2Rpdj5cbiAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFN0YXR1c1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgIFtvcHRpb25zXT1cInN0YXR1c09wdGlvbnNcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiZGF0YS5TdGF0dXNcIlxuICAgICAgICA+XG4gICAgICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTEgbXQtMiBtYi0xOFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+UHJpb3JpdHk8L2Rpdj5cbiAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICBvcHRpb25MYWJlbD1cIk5hbWVcIlxuICAgICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgb3B0aW9uVmFsdWU9XCJDb2RlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgW29wdGlvbnNdPVwidGVuYW50T3B0aW9uc1wiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRhLlByaW9yaXR5XCJcbiAgICAgICAgICBbd2lkdGhdPVwiJzEwMCUnXCJcbiAgICAgICAgPjwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgKGNsaWNrKT1cInNhdmUoKVwiXG4gICAgICAgIFt3aWR0aF09XCInMTAwJSdcIlxuICAgICAgICBbdGV4dENvbG9yXT1cIicjZmZmJ1wiXG4gICAgICAgIFt0ZXh0XT1cIidVcGRhdGUnXCJcbiAgICAgICAgW2JnQ29sb3JdPVwiJyM5QzU2QkEnXCJcbiAgICAgID48L3ZlcmJlbmEtYnV0dG9uPiAtLT5cbiAgICA8L3NlY3Rpb24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|