ezlibrary_v2 0.0.1
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/esm2020/ezlibrary_v2.mjs +5 -0
- package/esm2020/lib/admin-service/admin-service.service.mjs +36 -0
- package/esm2020/lib/analysis-search/analysis-search.component.mjs +1083 -0
- package/esm2020/lib/assort-service/assort-service.service.mjs +31 -0
- package/esm2020/lib/attribute-definition/attribute-definition.component.mjs +231 -0
- package/esm2020/lib/auth/auth.guard.mjs +40 -0
- package/esm2020/lib/bi-service/bi.service.mjs +58 -0
- package/esm2020/lib/call-info/callinfo.component.mjs +126 -0
- package/esm2020/lib/comman-service/comman-service.service.mjs +679 -0
- package/esm2020/lib/comman-service/share-data-service.service.mjs +23 -0
- package/esm2020/lib/contact-search/contact-search.component.mjs +679 -0
- package/esm2020/lib/contact-service/contact-service.service.mjs +47 -0
- package/esm2020/lib/ezheader/header.component.mjs +383 -0
- package/esm2020/lib/ezlib.module.mjs +220 -0
- package/esm2020/lib/file-upload/fileupload.component.mjs +920 -0
- package/esm2020/lib/file-upload-log/file-upload-log.component.mjs +175 -0
- package/esm2020/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.mjs +14 -0
- package/esm2020/lib/fileupload-module/fileupload-routing.module.mjs +28 -0
- package/esm2020/lib/footer/footer.component.mjs +18 -0
- package/esm2020/lib/globle/common-pdf.service.mjs +28 -0
- package/esm2020/lib/globle/globle-env.service.mjs +45 -0
- package/esm2020/lib/globle/memo-report.service.mjs +2800 -0
- package/esm2020/lib/globle/pdf-service.service.mjs +18848 -0
- package/esm2020/lib/globle/shared-services.service.mjs +27 -0
- package/esm2020/lib/globle/upload-service.service.mjs +69 -0
- package/esm2020/lib/header/header.component.mjs +179 -0
- package/esm2020/lib/invalid/invalid.component.mjs +71 -0
- package/esm2020/lib/logout/logout.component.mjs +107 -0
- package/esm2020/lib/menu-right/menu-right.component.mjs +252 -0
- package/esm2020/lib/pipes/number-with-commas.pipe.mjs +24 -0
- package/esm2020/lib/pipes/order-by-pipe.pipe.mjs +17 -0
- package/esm2020/lib/pipes/selectedCount.mjs +19 -0
- package/esm2020/lib/pipes/sum.pipe.mjs +16 -0
- package/esm2020/lib/pkt-data/pkt-data.component.mjs +1107 -0
- package/esm2020/lib/pricing-service/pricing.service.mjs +58 -0
- package/esm2020/lib/qa-analysis/qa-analysis.component.mjs +1035 -0
- package/esm2020/lib/report-format/report-format.component.mjs +400 -0
- package/esm2020/lib/sessionend/session-end.guard.mjs +28 -0
- package/esm2020/lib/stock-service/lazyload.service.mjs +21 -0
- package/esm2020/lib/stock-service/stock-service.service.mjs +62 -0
- package/esm2020/lib/system-module/subform/subform.component.mjs +2481 -0
- package/esm2020/lib/system-module/system/system.component.mjs +959 -0
- package/esm2020/lib/system-module/system-service/system-service.service.mjs +85 -0
- package/esm2020/lib/system-module/system-service/upload-file.service.mjs +86 -0
- package/esm2020/lib/utility/app-no-dbl-click.directive.mjs +23 -0
- package/esm2020/lib/utility/constants.mjs +5 -0
- package/esm2020/lib/utility/contact-table-search.pipe.mjs +25 -0
- package/esm2020/lib/utility/formate-num-field.pipe.mjs +19 -0
- package/esm2020/lib/utility/search-pipe.pipe.mjs +26 -0
- package/esm2020/lib/utility/selective-preloading-strategy.mjs +23 -0
- package/esm2020/lib/utility/table-search.pipe.mjs +25 -0
- package/esm2020/lib/utility/tranform.directive.mjs +27 -0
- package/esm2020/lib/websearch-history/websearch-history.component.mjs +273 -0
- package/esm2020/public_api.mjs +57 -0
- package/ezlibrary_v2.d.ts +5 -0
- package/fesm2015/ezlibrary_v2.mjs +33543 -0
- package/fesm2015/ezlibrary_v2.mjs.map +1 -0
- package/fesm2020/ezlibrary_v2.mjs +33533 -0
- package/fesm2020/ezlibrary_v2.mjs.map +1 -0
- package/lib/admin-service/admin-service.service.d.ts +13 -0
- package/lib/analysis-search/analysis-search.component.d.ts +122 -0
- package/lib/assort-service/assort-service.service.d.ts +12 -0
- package/lib/attribute-definition/attribute-definition.component.d.ts +47 -0
- package/lib/auth/auth.guard.d.ts +16 -0
- package/lib/bi-service/bi.service.d.ts +20 -0
- package/lib/call-info/callinfo.component.d.ts +30 -0
- package/lib/comman-service/comman-service.service.d.ts +111 -0
- package/lib/comman-service/share-data-service.service.d.ts +10 -0
- package/lib/contact-search/contact-search.component.d.ts +115 -0
- package/lib/contact-service/contact-service.service.d.ts +15 -0
- package/lib/ezheader/header.component.d.ts +61 -0
- package/lib/ezlib.module.d.ts +47 -0
- package/lib/file-upload/fileupload.component.d.ts +131 -0
- package/lib/file-upload-log/file-upload-log.component.d.ts +53 -0
- package/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.d.ts +8 -0
- package/lib/fileupload-module/fileupload-routing.module.d.ts +7 -0
- package/lib/footer/footer.component.d.ts +9 -0
- package/lib/globle/common-pdf.service.d.ts +9 -0
- package/lib/globle/globle-env.service.d.ts +16 -0
- package/lib/globle/memo-report.service.d.ts +107 -0
- package/lib/globle/pdf-service.service.d.ts +459 -0
- package/lib/globle/shared-services.service.d.ts +12 -0
- package/lib/globle/upload-service.service.d.ts +20 -0
- package/lib/header/header.component.d.ts +45 -0
- package/lib/invalid/invalid.component.d.ts +12 -0
- package/lib/logout/logout.component.d.ts +21 -0
- package/lib/menu-right/menu-right.component.d.ts +47 -0
- package/lib/pipes/number-with-commas.pipe.d.ts +7 -0
- package/lib/pipes/order-by-pipe.pipe.d.ts +7 -0
- package/lib/pipes/selectedCount.d.ts +7 -0
- package/lib/pipes/sum.pipe.d.ts +7 -0
- package/lib/pkt-data/pkt-data.component.d.ts +189 -0
- package/lib/pricing-service/pricing.service.d.ts +20 -0
- package/lib/qa-analysis/qa-analysis.component.d.ts +99 -0
- package/lib/report-format/report-format.component.d.ts +74 -0
- package/lib/sessionend/session-end.guard.d.ts +10 -0
- package/lib/stock-service/lazyload.service.d.ts +7 -0
- package/lib/stock-service/stock-service.service.d.ts +19 -0
- package/lib/system-module/subform/subform.component.d.ts +227 -0
- package/lib/system-module/system/system.component.d.ts +113 -0
- package/lib/system-module/system-service/system-service.service.d.ts +23 -0
- package/lib/system-module/system-service/upload-file.service.d.ts +12 -0
- package/lib/utility/app-no-dbl-click.directive.d.ts +7 -0
- package/lib/utility/constants.d.ts +4 -0
- package/lib/utility/contact-table-search.pipe.d.ts +7 -0
- package/lib/utility/formate-num-field.pipe.d.ts +7 -0
- package/lib/utility/search-pipe.pipe.d.ts +7 -0
- package/lib/utility/selective-preloading-strategy.d.ts +9 -0
- package/lib/utility/table-search.pipe.d.ts +7 -0
- package/lib/utility/tranform.directive.d.ts +10 -0
- package/lib/websearch-history/websearch-history.component.d.ts +62 -0
- package/package.json +48 -0
- package/public_api.d.ts +52 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { Router, ActivatedRoute } from '@angular/router';
|
|
3
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
4
|
+
import { ToastrService } from 'ngx-toastr';
|
|
5
|
+
import { Cookie } from 'ng2-cookies/ng2-cookies';
|
|
6
|
+
import { CommanServiceService } from '../comman-service/comman-service.service';
|
|
7
|
+
import { GlobleEnvService } from '../globle/globle-env.service';
|
|
8
|
+
import { NgxSpinnerService } from "ngx-spinner";
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/router";
|
|
11
|
+
import * as i2 from "../comman-service/comman-service.service";
|
|
12
|
+
import * as i3 from "ngx-toastr";
|
|
13
|
+
import * as i4 from "ngx-spinner";
|
|
14
|
+
import * as i5 from "../globle/globle-env.service";
|
|
15
|
+
import * as i6 from "@angular/forms";
|
|
16
|
+
import * as i7 from "@angular/common";
|
|
17
|
+
import * as i8 from "../utility/app-no-dbl-click.directive";
|
|
18
|
+
export class CallInfoComponent {
|
|
19
|
+
constructor(router, route, cs, toastr, spinnerService, globlEnv) {
|
|
20
|
+
this.router = router;
|
|
21
|
+
this.route = route;
|
|
22
|
+
this.cs = cs;
|
|
23
|
+
this.toastr = toastr;
|
|
24
|
+
this.spinnerService = spinnerService;
|
|
25
|
+
this.globlEnv = globlEnv;
|
|
26
|
+
this.communictionMode = [];
|
|
27
|
+
}
|
|
28
|
+
ngOnInit() {
|
|
29
|
+
let mdlk = JSON.parse(localStorage.getItem('mdlKey'));
|
|
30
|
+
let mdlKey = Object.keys(mdlk);
|
|
31
|
+
let cUrl = this.router.url;
|
|
32
|
+
this.header = {
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
'clientkey': Cookie.get('_ck'),
|
|
35
|
+
'modulekey': mdlk[cUrl.split('/')[1]],
|
|
36
|
+
'loginid': Cookie.get('_logid'),
|
|
37
|
+
'source': 'qs'
|
|
38
|
+
};
|
|
39
|
+
this.route.params.subscribe((params) => {
|
|
40
|
+
this.loadCallInfo();
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
loadCallInfo() {
|
|
44
|
+
this.spinnerService.show();
|
|
45
|
+
let reqObj = {};
|
|
46
|
+
reqObj['formNme'] = this.route.snapshot.params['frmnme'];
|
|
47
|
+
this.header['method'] = 'loadCommunicationLogForm';
|
|
48
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
49
|
+
this.cs.load(reqObj, options, 'marketing/transaction').then((response) => {
|
|
50
|
+
if (response.status == 'SUCCESS') {
|
|
51
|
+
let result = response.result || {};
|
|
52
|
+
this.communictionMode = result.communicationMediumList || [];
|
|
53
|
+
this.spinnerService.hide();
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.spinnerService.hide();
|
|
57
|
+
this.toastr.error(response.message);
|
|
58
|
+
}
|
|
59
|
+
}).catch((err) => {
|
|
60
|
+
this.spinnerService.hide();
|
|
61
|
+
this.toastr.error(err.message);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
SaveCallInfo() {
|
|
65
|
+
this.contactDate = this.contactDate || '';
|
|
66
|
+
this.medium = this.medium || '';
|
|
67
|
+
this.subject = this.subject || '';
|
|
68
|
+
this.summary = this.summary || '';
|
|
69
|
+
this.detail = this.detail || '';
|
|
70
|
+
let isValid = true;
|
|
71
|
+
if (this.contactDate == '') {
|
|
72
|
+
this.toastr.error("Please specify ContactDate");
|
|
73
|
+
isValid = false;
|
|
74
|
+
}
|
|
75
|
+
if (this.medium == '') {
|
|
76
|
+
this.toastr.error("Please specify Medium");
|
|
77
|
+
isValid = false;
|
|
78
|
+
}
|
|
79
|
+
if (this.subject == '') {
|
|
80
|
+
this.toastr.error("Please specify subject");
|
|
81
|
+
isValid = false;
|
|
82
|
+
}
|
|
83
|
+
if (this.summary == '') {
|
|
84
|
+
this.toastr.error("Please specify summary");
|
|
85
|
+
isValid = false;
|
|
86
|
+
}
|
|
87
|
+
if (isValid) {
|
|
88
|
+
this.spinnerService.show();
|
|
89
|
+
let reqObj = {};
|
|
90
|
+
reqObj['formNme'] = this.route.snapshot.params['frmnme'];
|
|
91
|
+
reqObj['emp_idn'] = this.emp_idn;
|
|
92
|
+
reqObj['nme_idn'] = this.nme_idn;
|
|
93
|
+
reqObj['log_ts'] = this.cs.formatDate(this.contactDate);
|
|
94
|
+
reqObj['auto_yn'] = "0";
|
|
95
|
+
reqObj['channel'] = this.medium;
|
|
96
|
+
reqObj['subject'] = this.subject;
|
|
97
|
+
reqObj['summary'] = this.summary;
|
|
98
|
+
reqObj['details'] = this.detail;
|
|
99
|
+
reqObj['pvt'] = 0;
|
|
100
|
+
reqObj['attrMap'] = {};
|
|
101
|
+
reqObj['recipientListMap'] = {};
|
|
102
|
+
this.header['method'] = 'saveMailLogDetails';
|
|
103
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
104
|
+
this.cs.load(reqObj, options, 'marketing/transaction').then((response) => {
|
|
105
|
+
if (response.status == 'SUCCESS') {
|
|
106
|
+
let result = response.result || {};
|
|
107
|
+
this.spinnerService.hide();
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
this.spinnerService.hide();
|
|
111
|
+
this.toastr.error(response.message);
|
|
112
|
+
}
|
|
113
|
+
}).catch((err) => {
|
|
114
|
+
this.spinnerService.hide();
|
|
115
|
+
this.toastr.error(err.message);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** @nocollapse */ /** @nocollapse */ CallInfoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: CallInfoComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.CommanServiceService }, { token: i3.ToastrService }, { token: i4.NgxSpinnerService }, { token: i5.GlobleEnvService }], target: i0.ɵɵFactoryTarget.Component });
|
|
121
|
+
/** @nocollapse */ /** @nocollapse */ CallInfoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: CallInfoComponent, selector: "app-callinfo", ngImport: i0, template: "<div class=\"row\">\r\n <div class=\"form-group\" >\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span> Contact Date\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input class=\"form-control\" type=\"date\" [(ngModel)]=\"contactDate\" name=\"contactDate\"/>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" >\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span> Channel / Medium\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <select class=\"form-control\" name=\"medium\" [(ngModel)]=\"medium\" >\r\n <option value=\"\">Select Channel / Medium</option>\r\n <option *ngFor=\"let prp of communictionMode\" [ngValue]=\"prp.k\">{{prp.v}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\" >\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span> Subject\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input type=\"text\" class=\"form-control\" name=\"subject\" [(ngModel)]=\"subject\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span> Summary / Topic\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input type=\"text\" class=\"form-control\" name=\"summary\" [(ngModel)]=\"summary\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\">Detail\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <textarea class=\"form-control\" name=\"detail\" [(ngModel)]=\"detail\">\r\n </textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"form-group\"><div class=\"col-md-12\" style=\"margin-top:10px;;text-align: center\">\r\n <button class=\"btn btn-success\" \r\n appAppNoDblClick (click)=\"SaveCallInfo()\">Save Changes</button>\r\n </div></div>\r\n</div>\r\n", styles: [""], directives: [{ type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.AppNoDblClickDirective, selector: "[appAppNoDblClick]" }] });
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: CallInfoComponent, decorators: [{
|
|
123
|
+
type: Component,
|
|
124
|
+
args: [{ selector: 'app-callinfo', template: "<div class=\"row\">\r\n <div class=\"form-group\" >\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span> Contact Date\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input class=\"form-control\" type=\"date\" [(ngModel)]=\"contactDate\" name=\"contactDate\"/>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" >\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span> Channel / Medium\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <select class=\"form-control\" name=\"medium\" [(ngModel)]=\"medium\" >\r\n <option value=\"\">Select Channel / Medium</option>\r\n <option *ngFor=\"let prp of communictionMode\" [ngValue]=\"prp.k\">{{prp.v}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\" >\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span> Subject\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input type=\"text\" class=\"form-control\" name=\"subject\" [(ngModel)]=\"subject\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\"><span style=\"color:red\">*</span> Summary / Topic\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input type=\"text\" class=\"form-control\" name=\"summary\" [(ngModel)]=\"summary\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-4 control-label\" style=\"margin-top:10px;text-align: right\">Detail\r\n </label>\r\n <div class=\"col-md-6\" style=\"margin-top:10px\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <textarea class=\"form-control\" name=\"detail\" [(ngModel)]=\"detail\">\r\n </textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"form-group\"><div class=\"col-md-12\" style=\"margin-top:10px;;text-align: center\">\r\n <button class=\"btn btn-success\" \r\n appAppNoDblClick (click)=\"SaveCallInfo()\">Save Changes</button>\r\n </div></div>\r\n</div>\r\n", styles: [""] }]
|
|
125
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.CommanServiceService }, { type: i3.ToastrService }, { type: i4.NgxSpinnerService }, { type: i5.GlobleEnvService }]; } });
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbGluZm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXpsaWIvc3JjL2xpYi9jYWxsLWluZm8vY2FsbGluZm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXpsaWIvc3JjL2xpYi9jYWxsLWluZm8vY2FsbGluZm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7Ozs7Ozs7QUFPaEQsTUFBTSxPQUFPLGlCQUFpQjtJQUU1QixZQUNTLE1BQWMsRUFDYixLQUFxQixFQUNyQixFQUF3QixFQUN4QixNQUFxQixFQUNyQixjQUFpQyxFQUNqQyxRQUEwQjtRQUwzQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2IsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsT0FBRSxHQUFGLEVBQUUsQ0FBc0I7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFJcEMscUJBQWdCLEdBQUMsRUFBRSxDQUFDO0lBSGhCLENBQUM7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Q3BCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztTQUNGO0lBQ0QsQ0FBQzs7b0pBdEhVLGlCQUFpQjt3SUFBakIsaUJBQWlCLG9EQ2Q5Qix3M0ZBK0RBOzJGRGpEYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0UsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUsIFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEh0dHBIZWFkZXJzICB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBDb29raWUgfSBmcm9tICduZzItY29va2llcy9uZzItY29va2llcyc7XHJcbmltcG9ydCB7IENvbW1hblNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbWFuLXNlcnZpY2UvY29tbWFuLXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEdsb2JsZUVudlNlcnZpY2UgfSBmcm9tICcuLi9nbG9ibGUvZ2xvYmxlLWVudi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmd4U3Bpbm5lclNlcnZpY2UgfSBmcm9tIFwibmd4LXNwaW5uZXJcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWNhbGxpbmZvJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2FsbGluZm8uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NhbGxpbmZvLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FsbEluZm9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBjczogQ29tbWFuU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSxcclxuICAgIHByaXZhdGUgc3Bpbm5lclNlcnZpY2U6IE5neFNwaW5uZXJTZXJ2aWNlICxcclxuICAgIHByaXZhdGUgZ2xvYmxFbnY6IEdsb2JsZUVudlNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBoZWFkZXI7XHJcbiAgY29tbXVuaWN0aW9uTW9kZT1bXTtcclxuICBjb250YWN0RGF0ZTtcclxuICBtZWRpdW07XHJcbiAgc3ViamVjdDtcclxuICBzdW1tYXJ5O1xyXG4gIGRldGFpbDtcclxuICBlbXBfaWRuO1xyXG4gIG5tZV9pZG47XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBsZXQgbWRsayA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21kbEtleScpKTtcclxuICAgIGxldCBtZGxLZXkgPSBPYmplY3Qua2V5cyhtZGxrKTtcclxuICAgIGxldCBjVXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgdGhpcy5oZWFkZXIgPSB7XHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdjbGllbnRrZXknOiBDb29raWUuZ2V0KCdfY2snKSxcclxuICAgICAgJ21vZHVsZWtleSc6bWRsa1tjVXJsLnNwbGl0KCcvJylbMV1dLFxyXG4gICAgICAnbG9naW5pZCc6IENvb2tpZS5nZXQoJ19sb2dpZCcpLFxyXG4gICAgICAnc291cmNlJzogJ3FzJ1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogUGFyYW1zKSA9PiB7XHJcbiAgICAgICAgIHRoaXMubG9hZENhbGxJbmZvKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRDYWxsSW5mbygpe1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmcm1ubWUnXTtcclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdsb2FkQ29tbXVuaWNhdGlvbkxvZ0Zvcm0nO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5jcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgJ21hcmtldGluZy90cmFuc2FjdGlvbicpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgIGlmKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdHx8e307XHJcbiAgICAgIHRoaXMuY29tbXVuaWN0aW9uTW9kZT1yZXN1bHQuY29tbXVuaWNhdGlvbk1lZGl1bUxpc3R8fFtdO1xyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgIH1cclxuICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIFNhdmVDYWxsSW5mbygpe1xyXG4gICAgdGhpcy5jb250YWN0RGF0ZT10aGlzLmNvbnRhY3REYXRlfHwnJztcclxuICAgIHRoaXMubWVkaXVtID0gIHRoaXMubWVkaXVtfHwnJztcclxuICAgIHRoaXMuc3ViamVjdD10aGlzLnN1YmplY3R8fCcnO1xyXG4gICAgdGhpcy5zdW1tYXJ5PXRoaXMuc3VtbWFyeXx8Jyc7XHJcbiAgICB0aGlzLmRldGFpbD10aGlzLmRldGFpbHx8Jyc7XHJcbiAgICBsZXQgaXNWYWxpZCA9IHRydWU7XHJcbiAgICBpZih0aGlzLmNvbnRhY3REYXRlPT0nJyl7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKFwiUGxlYXNlIHNwZWNpZnkgQ29udGFjdERhdGVcIik7XHJcbiAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5tZWRpdW09PScnKXtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoXCJQbGVhc2Ugc3BlY2lmeSBNZWRpdW1cIik7XHJcbiAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5zdWJqZWN0PT0nJyl7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKFwiUGxlYXNlIHNwZWNpZnkgc3ViamVjdFwiKTtcclxuICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuc3VtbWFyeT09Jycpe1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihcIlBsZWFzZSBzcGVjaWZ5IHN1bW1hcnlcIik7XHJcbiAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZihpc1ZhbGlkKXtcclxuXHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybW5tZSddO1xyXG4gICAgcmVxT2JqWydlbXBfaWRuJ10gPSB0aGlzLmVtcF9pZG47XHJcbiAgICByZXFPYmpbJ25tZV9pZG4nXSA9IHRoaXMubm1lX2lkbjtcclxuICAgIHJlcU9ialsnbG9nX3RzJ10gPSB0aGlzLmNzLmZvcm1hdERhdGUodGhpcy5jb250YWN0RGF0ZSk7XHJcbiAgICByZXFPYmpbJ2F1dG9feW4nXSA9XCIwXCJcclxuICAgIHJlcU9ialsnY2hhbm5lbCddID0gdGhpcy5tZWRpdW07XHJcbiAgICByZXFPYmpbJ3N1YmplY3QnXSA9IHRoaXMuc3ViamVjdDtcclxuICAgIHJlcU9ialsnc3VtbWFyeSddID0gdGhpcy5zdW1tYXJ5O1xyXG4gICAgcmVxT2JqWydkZXRhaWxzJ10gPSB0aGlzLmRldGFpbDtcclxuICAgIHJlcU9ialsncHZ0J109MDtcclxuICAgIHJlcU9ialsnYXR0ck1hcCddPXt9O1xyXG4gICAgcmVxT2JqWydyZWNpcGllbnRMaXN0TWFwJ109e307XHJcblxyXG4gICAgdGhpcy5oZWFkZXJbJ21ldGhvZCddID0gJ3NhdmVNYWlsTG9nRGV0YWlscyc7XHJcblxyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5jcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgJ21hcmtldGluZy90cmFuc2FjdGlvbicpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgIGlmKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdHx8e307XHJcblxyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgIH1cclxuICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gIH0pO1xyXG4gIH1cclxuICB9XHJcblxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiID5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtNCBjb250cm9sLWxhYmVsXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7dGV4dC1hbGlnbjogcmlnaHRcIj48c3BhbiBzdHlsZT1cImNvbG9yOnJlZFwiPio8L3NwYW4+ICZuYnNwO0NvbnRhY3QgRGF0ZVxyXG4gICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbSAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwiZGF0ZVwiIFsobmdNb2RlbCldPVwiY29udGFjdERhdGVcIiBuYW1lPVwiY29udGFjdERhdGVcIi8+XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiID5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC00IGNvbnRyb2wtbGFiZWxcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDt0ZXh0LWFsaWduOiByaWdodFwiPjxzcGFuIHN0eWxlPVwiY29sb3I6cmVkXCI+Kjwvc3Bhbj4mbmJzcDtDaGFubmVsIC8gTWVkaXVtXHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtICB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJtZWRpdW1cIiBbKG5nTW9kZWwpXT1cIm1lZGl1bVwiID5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IENoYW5uZWwgLyBNZWRpdW08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBwcnAgb2YgY29tbXVuaWN0aW9uTW9kZVwiIFtuZ1ZhbHVlXT1cInBycC5rXCI+e3twcnAudn19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICA8L2Rpdj5cclxuXHJcbiAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiA+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTQgY29udHJvbC1sYWJlbFwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O3RleHQtYWxpZ246IHJpZ2h0XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjpyZWRcIj4qPC9zcGFuPiZuYnNwO1N1YmplY3RcclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc20gIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBuYW1lPVwic3ViamVjdFwiIFsobmdNb2RlbCldPVwic3ViamVjdFwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtNCBjb250cm9sLWxhYmVsXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7dGV4dC1hbGlnbjogcmlnaHRcIj48c3BhbiBzdHlsZT1cImNvbG9yOnJlZFwiPio8L3NwYW4+Jm5ic3A7U3VtbWFyeSAvIFRvcGljXHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtICB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cInN1bW1hcnlcIiBbKG5nTW9kZWwpXT1cInN1bW1hcnlcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtNCBjb250cm9sLWxhYmVsXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHg7dGV4dC1hbGlnbjogcmlnaHRcIj5EZXRhaWxcclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc20gIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cImRldGFpbFwiIFsobmdNb2RlbCldPVwiZGV0YWlsXCI+XHJcbiAgICAgICAgICAgICAgICA8L3RleHRhcmVhPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+PGRpdiAgY2xhc3M9XCJjb2wtbWQtMTJcIiBzdHlsZT1cIm1hcmdpbi10b3A6MTBweDs7dGV4dC1hbGlnbjogY2VudGVyXCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgXHJcbiAgICBhcHBBcHBOb0RibENsaWNrIChjbGljayk9XCJTYXZlQ2FsbEluZm8oKVwiPlNhdmUgQ2hhbmdlczwvYnV0dG9uPlxyXG4gICAgPC9kaXY+PC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|