@posiwise/smart-crm 0.0.50 → 0.0.53
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/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-info/smart-crm-account-info.component.mjs +2 -2
- package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.mjs +44 -13
- package/esm2022/lib/private/components/smart-crm-contacts/smart-crm-contacts.component.mjs +9 -5
- package/esm2022/lib/private/components/smart-crm-insight/smart-crm-account-insight/smart-crm-account-insight.component.mjs +121 -33
- package/esm2022/lib/private/components/smart-crm-insight/smart-crm-analysis-insight/smart-crm-analysis.component.mjs +5 -3
- package/esm2022/lib/private/components/smart-crm-insight/smart-crm-contact-insight/smart-crm-contact-insight.component.mjs +11 -6
- package/esm2022/lib/private/components/smart-crm-insight/smart-crm-marketing-insight/smart-crm-marketing-insight.component.mjs +5 -3
- package/esm2022/lib/private/components/smart-crm-insight/smart-crm-opportunities-insight/smart-crm-opportunities-insight.component.mjs +15 -8
- package/esm2022/lib/private/components/smart-crm-leads/smart-crm-leads-details/smart-crm-leads-details.component.mjs +6 -5
- package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-list.component.mjs +5 -3
- package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-list.component.mjs +45 -8
- package/esm2022/lib/public/components/smart-crm-signup/smart-crm-signup.component.mjs +1 -1
- package/esm2022/lib/shared/interface/crm-account.interface.mjs +1 -1
- package/esm2022/lib/shared/interface/crm-opportunity.interface.mjs +1 -1
- package/fesm2022/posiwise-smart-crm.mjs +285 -107
- package/fesm2022/posiwise-smart-crm.mjs.map +1 -1
- package/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.d.ts +6 -0
- package/lib/private/components/smart-crm-insight/smart-crm-account-insight/smart-crm-account-insight.component.d.ts +29 -7
- package/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-list.component.d.ts +4 -0
- package/lib/shared/interface/crm-account.interface.d.ts +6 -0
- package/lib/shared/interface/crm-opportunity.interface.d.ts +7 -0
- package/package.json +1 -1
|
@@ -33,6 +33,9 @@ export class SmartCrmOpportunitiesListComponent extends AppBaseComponent {
|
|
|
33
33
|
object_count: 0,
|
|
34
34
|
unfiltered_count: 0
|
|
35
35
|
};
|
|
36
|
+
this.totals = {
|
|
37
|
+
total_mrr: 0
|
|
38
|
+
};
|
|
36
39
|
this.id = '';
|
|
37
40
|
this.searchText = '';
|
|
38
41
|
this.searchStages = [];
|
|
@@ -138,7 +141,31 @@ export class SmartCrmOpportunitiesListComponent extends AppBaseComponent {
|
|
|
138
141
|
this.crmService
|
|
139
142
|
.getAllOpportunities(this.subscriptionId, paging, this.filterByCategories.join() || '', this.filterByStages.join() || '')
|
|
140
143
|
.subscribe(response => {
|
|
141
|
-
|
|
144
|
+
// Handle new API structure with items and totals
|
|
145
|
+
if (response.items && Array.isArray(response.items)) {
|
|
146
|
+
this.data = {
|
|
147
|
+
crm_opportunities: response.items,
|
|
148
|
+
object_count: response.items.length,
|
|
149
|
+
unfiltered_count: response.items.length,
|
|
150
|
+
totals: response.totals
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
this.data = response;
|
|
155
|
+
}
|
|
156
|
+
// Use totals from API response only - don't calculate
|
|
157
|
+
// Map expected_mrr_usd from API to total_mrr for display
|
|
158
|
+
if (this.data.totals) {
|
|
159
|
+
this.totals = {
|
|
160
|
+
total_mrr: this.data.totals.expected_mrr_usd || 0
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// If no totals from API, set to 0 (don't calculate)
|
|
165
|
+
this.totals = {
|
|
166
|
+
total_mrr: 0
|
|
167
|
+
};
|
|
168
|
+
}
|
|
142
169
|
})
|
|
143
170
|
.add(() => {
|
|
144
171
|
this.isLoaded = true;
|
|
@@ -188,11 +215,14 @@ export class SmartCrmOpportunitiesListComponent extends AppBaseComponent {
|
|
|
188
215
|
this.crmService
|
|
189
216
|
.getCrmAnalytics(this.subscription?.id, 'opportunities_insights')
|
|
190
217
|
.subscribe(response => {
|
|
191
|
-
|
|
218
|
+
// API now returns { items: [], totals: {} } instead of array
|
|
219
|
+
const items = response?.items || response;
|
|
220
|
+
if (typeof items === 'object' && Object.keys(items).length === 0) {
|
|
192
221
|
this.opportunitiesInsight = [];
|
|
193
222
|
}
|
|
194
|
-
else
|
|
195
|
-
this.opportunitiesInsight =
|
|
223
|
+
else {
|
|
224
|
+
this.opportunitiesInsight = Array.isArray(items) ? items : [];
|
|
225
|
+
}
|
|
196
226
|
});
|
|
197
227
|
}
|
|
198
228
|
/** Function to call contact geography */
|
|
@@ -200,20 +230,27 @@ export class SmartCrmOpportunitiesListComponent extends AppBaseComponent {
|
|
|
200
230
|
this.crmService
|
|
201
231
|
.getCrmAnalytics(this.subscription?.id, 'opportunities_geography')
|
|
202
232
|
.subscribe(response => {
|
|
203
|
-
|
|
233
|
+
// API now returns { items: [], totals: {} } instead of array/object
|
|
234
|
+
this.opportunitiesGeography = response?.items || response;
|
|
204
235
|
});
|
|
205
236
|
}
|
|
206
237
|
checkPermission(permission) {
|
|
207
238
|
return this.permissionService.evaluatePermissions(permission);
|
|
208
239
|
}
|
|
240
|
+
getMainCurrency() {
|
|
241
|
+
if (this.data?.crm_opportunities?.length > 0) {
|
|
242
|
+
return this.data.crm_opportunities[0]?.currency || 'USD';
|
|
243
|
+
}
|
|
244
|
+
return 'USD';
|
|
245
|
+
}
|
|
209
246
|
ngOnDestroy() {
|
|
210
247
|
super.ngOnDestroy();
|
|
211
248
|
}
|
|
212
249
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartCrmOpportunitiesListComponent, deps: [{ token: i1.CrmService }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: i2.ProductService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
213
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartCrmOpportunitiesListComponent, selector: "pw-smart-crm-opportunities-list", usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-12 mb-3\">\n <a class=\"btn btn-sm btn-outline-primary float-end\" data-cy=\"add-opportunities\"\n [routerLink]=\"['/' + subscription?.slug + routers.opportunityAdd]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> {{ 'Crm.OpportunitiesMessage.AddOpportunity' | transloco }}\n </a>\n </div>\n <div class=\"w-100 text-center mt-3\" *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div class=\"col-12\">\n <div class=\"primeng-datatable-container table-responsive\" [class.hideTable]=\"data.unfiltered_count === 0\">\n <p-table #dt [value]=\"data.crm_opportunities\" [paginator]=\"data.object_count !== 0\" [lazy]=\"true\" [rows]=\"PAGE_SIZE\"\n class=\"contact-table\" [totalRecords]=\"data.object_count\" [loading]=\"loading\" filterDelay=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\" [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <div class=\"row\">\n <div class=\"col-sm-3 col-6\">\n <p-multiSelect placeholder=\"Select Category\" [options]=\"categories\" [(ngModel)]=\"filterByCategories\"\n (onChange)=\"onSearchOptionChange($event, 'category')\" [filter]=\"true\" [showHeader]=\"true\" [showToggleAll]=\"true\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-sm-3 col-6 mb-2 mb-sm-0\">\n <p-multiSelect placeholder=\"Select Stage\" [options]=\"searchStages\" [(ngModel)]=\"filterByStages\"\n (onChange)=\"onSearchOptionChange($event, 'stage')\" [filter]=\"true\" [showHeader]=\"true\"\n [showToggleAll]=\"true\" appendTo=\"body\">\n </p-multiSelect>\n </div>\n <!-- Empty column occupying the same space -->\n <div class=\"col-sm-3 col-6\"></div>\n <div class=\"col-sm-3 col-md-4 col-lg-3 d-flex justify-content-end\">\n <div class=\"d-flex w-100\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\" [(ngModel)]=\"searchText\" pInputText placeholder=\"Search opportunities..\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\" class=\"form-control search-opportunities-search-input\" />\n </div>\n </div>\n </div>\n <div class=\"search-filter\">\n <a class=\"mt-3 ms-3 text-start btn-filter-primary\" (click)=\"clearFilters()\">Clear all filters</a>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\" pSortableColumn=\"title\"> {{ 'Crm.OpportunitiesMessage.Title' | transloco }} <p-sortIcon\n field=\"title\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_contact_id\"> {{ 'Crm.OpportunitiesMessage.Contact' | transloco }}\n <p-sortIcon field=\"crm_contact_id\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_account_id\"> {{ 'Crm.OpportunitiesMessage.Account' | transloco }}\n <p-sortIcon field=\"crm_account_id\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"one_time_amount\"> {{ 'Crm.OpportunitiesMessage.OneTimeAmount' | transloco\n }} <p-sortIcon field=\"one_time_amount\"></p-sortIcon>\n </th>\n <th class=\"mrr-header\" scope=\"true\" pSortableColumn=\"monthly_amount\"> {{ 'Crm.OpportunitiesMessage.MRR' | transloco\n }} <p-sortIcon field=\"monthly_amount\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"win_chances\"> {{ 'Crm.OpportunitiesMessage.WinChance' | transloco }}\n <p-sortIcon field=\"win_chances\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_opportunity_category_ids\"> {{ 'Crm.OpportunitiesMessage.Categories' |\n transloco }} <p-sortIcon field=\"crm_opportunity_category_ids\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_opportunity_stage_id\"> {{ 'Crm.OpportunitiesMessage.Stage' | transloco\n }} <p-sortIcon field=\"crm_opportunity_stage_id\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"starting_at\"> {{ 'Crm.OpportunitiesMessage.StartingAt' | transloco }}\n <p-sortIcon field=\"starting_at\"></p-sortIcon>\n </th>\n <th class=\"actions-list-two\" scope=\"true\"> {{ 'Label.Actions' | transloco }} </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-opportunities>\n <tr>\n <td data-head=\"Title\">\n <a [ngbTooltip]=\"opportunities?.title\" *ngIf=\"\n hasAccess ||\n opportunities?.owner_id === userId ||\n checkPermission('Pages.Product.CRM.Role.Admin')\n \" [routerLink]=\"[\n '/' + subscription?.slug + routers.opportunityInfo,\n opportunities.id\n ]\">\n <span>{{ opportunities?.title | textTruncate: 15 }} </span>\n </a>\n <a *ngIf=\"\n !hasAccess &&\n opportunities?.owner_id !== userId &&\n checkPermission('Pages.Product.CRM.Role.Admin')\n \"> {{ opportunities?.title | textTruncate: 15 }} </a>\n </td>\n <td class=\"contactname\" data-head=\"Crm Contact\">\n <a *ngIf=\"opportunities?.crm_contact_id\" [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n opportunities.crm_contact_id.id\n ]\">{{ opportunities.crm_contact?.first_name + ' ' +\n opportunities.crm_contact?.last_name }}</a>\n </td>\n <td data-head=\"Account\">\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n opportunities.crm_account.id\n ]\">{{ opportunities.crm_account.name }}</a>\n </td>\n <td data-head=\"Amount\"> {{ opportunities.one_time_amount / 100 | currency: opportunities?.currency }} </td>\n <td data-head=\"MRR\" class=\"expected-mrr\"> {{ opportunities.monthly_amount / 100 | currency: opportunities?.currency }} </td>\n <td data-head=\"WinChance\">\n <span [ngClass]=\"{'text-danger': opportunities.win_chances < 30, 'text-success fw-bold': opportunities.win_chances >70}\">\n {{ opportunities.win_chances / 100 | percent }}\n </span>\n <span class=\"text-danger\"\n *ngIf=\"opportunities.cancelled\">!Cancelled!</span>\n </td>\n <td data-head=\"Categories\">\n <span *ngFor=\"let category of opportunities?.crm_opportunity_categories\" class=\"badge ms-1\"\n [appDynamicBadge]=\"{ itemsArray: categories, item: category?.name }\" color=\"blue-grey\">{{ category?.name\n }}</span>\n </td>\n <td data-head=\"Stage\">\n <span class=\"badge\" [appDynamicBadge]=\"{\n itemsArray: stages,\n item: opportunities?.crm_opportunity_stage?.name\n }\" color=\"cyan\">{{ opportunities?.crm_opportunity_stage?.name }}</span>\n </td>\n <td data-head=\"Starting At\" [ngClass]=\"{'text-danger': isPastDate(opportunities.starting_at)}\"> {{ opportunities.starting_at | dateFormat }} </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <ng-container *ngIf=\"hasAccess || opportunities?.owner_id === userId\">\n <ng-container *rbacAllow=\"'SubscriptionAdmin'\">\n <li ngbTooltip=\"Edit\" class=\"me-2 me-sm-3\" [routerLink]=\"[\n '/' + subscription?.slug + routers.opportunities,\n opportunities.id\n ]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n </ng-container>\n <ng-container *rbacAllow=\"'SubscriptionAdmin'\">\n <li ngbTooltip=\"Delete\" class=\"me-2 me-sm-3\">\n <i class=\"fa fa-trash delete-icon\" (keydown.enter)=\"onDelete(opportunities.id)\"\n (keydown.space)=\"onDelete(opportunities.id)\"\n (click)=\"onDelete(opportunities.id)\" aria-hidden=\"true\"></i>\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\"data.object_count === 0 && data.unfiltered_count !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage'| transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n <span class=\"total-records-count\" *ngIf=\"data.object_count !== 0\">{{ 'Label.Total' | transloco }}: {{ data.object_count }}</span>\n </div>\n </div>\n</div>\n<div *ngIf=\"data.unfiltered_count === 0 && isLoaded\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoOpportunitiesMessage' | transloco\">\n </pw-no-data>\n</div>\n<ng-container>\n <div class=\"row mt-5\" *ngIf=\"isLoaded\">\n <!-- Drill Down -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Watch Closely</h5>\n <div class=\"primeng-datatable-container table-responsive\" *ngIf=\"opportunitiesInsight?.length\">\n <p-table class=\"table\" #dt [value]=\"opportunitiesInsight\" [paginator]=\"opportunitiesInsight?.length !== 0\" [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"opportunitiesInsight.length\" [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\"> {{ 'Crm.OpportunitiesMessage.Reason' | transloco }} </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-insight>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, insight.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"insight?.name\">{{ insight?.name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"Title\">\n <span\n [ngbTooltip]=\"insight?.title\"\n container=\"body\"\n tooltipClass=\"custom-tooltip\"\n placement=\"bottom\"\n >\n {{ insight?.title | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"Reason\"> {{ insight.reason }} </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"opportunitiesInsight?.length !== 0\">{{ 'Label.Total' | transloco }}: {{ opportunitiesInsight.length }}</span>\n </div>\n <div *ngIf=\"opportunitiesInsight?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoInsightMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n <!-- Geography -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Opportunities Location</h5>\n <div>\n <ng-template [ngIf]=\"opportunitiesGeography\">\n <plotly-plot [data]=\"opportunitiesGeography?.data\" [layout]=\"opportunitiesGeography?.layout\" [config]=\"opportunitiesGeography?.config\" [useResizeHandler]=\"opportunitiesGeography ? true : false\">\n </plotly-plot>\n </ng-template>\n </div>\n <div *ngIf=\"!opportunitiesGeography\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoInsightMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n </div>\n</ng-container>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}@media (min-width: 640px) and (max-width: 768px){.primeng-datatable-container tr td{width:350px}}.search-opportunities-search-input{background-color:#fff!important}\n"], 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.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: 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: "directive", type: i5.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "directive", type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i7.DynamicBadgeDirective, selector: "[appDynamicBadge]", inputs: ["appDynamicBadge", "color", "colorByName", "dataName"] }, { kind: "directive", type: i7.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "component", type: i8.PlotlyComponent, selector: "plotly-plot", inputs: ["data", "layout", "config", "frames", "style", "theme", "divId", "revision", "className", "debug", "useResizeHandler", "updateOnLayoutChange", "updateOnDataChange", "updateOnlyWithRevision"], outputs: ["initialized", "update", "purge", "error", "afterExport", "afterPlot", "animated", "animatingFrame", "animationInterrupted", "autoSize", "beforeExport", "beforeHover", "buttonClicked", "click", "plotlyClick", "clickAnnotation", "deselect", "doubleClick", "framework", "hover", "legendClick", "legendDoubleClick", "react", "relayout", "relayouting", "restyle", "redraw", "selected", "selecting", "sliderChange", "sliderEnd", "sliderStart", "sunburstclick", "transitioning", "transitionInterrupted", "unhover", "treemapclick", "webglcontextlost"] }, { kind: "directive", type: i9.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i10.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i11.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i10.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i10.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i12.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i13.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i14.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "pipe", type: i3.PercentPipe, name: "percent" }, { kind: "pipe", type: i3.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i15.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i15.TextTruncatePipe, name: "textTruncate" }, { kind: "pipe", type: i16.TranslocoPipe, name: "transloco" }] }); }
|
|
250
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartCrmOpportunitiesListComponent, selector: "pw-smart-crm-opportunities-list", usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-12 mb-3\">\n <a class=\"btn btn-sm btn-outline-primary float-end\" data-cy=\"add-opportunities\"\n [routerLink]=\"['/' + subscription?.slug + routers.opportunityAdd]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> {{ 'Crm.OpportunitiesMessage.AddOpportunity' | transloco }}\n </a>\n </div>\n <div class=\"w-100 text-center mt-3\" *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div class=\"col-12\">\n <div class=\"primeng-datatable-container table-responsive\" [class.hideTable]=\"data.unfiltered_count === 0\">\n <p-table #dt [value]=\"data.crm_opportunities\" [paginator]=\"data.object_count !== 0\" [lazy]=\"true\" [rows]=\"PAGE_SIZE\"\n class=\"contact-table\" [totalRecords]=\"data.object_count\" [loading]=\"loading\" filterDelay=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\" [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <div class=\"row\">\n <div class=\"col-sm-3 col-6\">\n <p-multiSelect placeholder=\"Select Category\" [options]=\"categories\" [(ngModel)]=\"filterByCategories\"\n (onChange)=\"onSearchOptionChange($event, 'category')\" [filter]=\"true\" [showHeader]=\"true\" [showToggleAll]=\"true\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-sm-3 col-6 mb-2 mb-sm-0\">\n <p-multiSelect placeholder=\"Select Stage\" [options]=\"searchStages\" [(ngModel)]=\"filterByStages\"\n (onChange)=\"onSearchOptionChange($event, 'stage')\" [filter]=\"true\" [showHeader]=\"true\"\n [showToggleAll]=\"true\" appendTo=\"body\">\n </p-multiSelect>\n </div>\n <!-- Empty column occupying the same space -->\n <div class=\"col-sm-3 col-6\"></div>\n <div class=\"col-sm-3 col-md-4 col-lg-3 d-flex justify-content-end\">\n <div class=\"d-flex w-100\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\" [(ngModel)]=\"searchText\" pInputText placeholder=\"Search opportunities..\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\" class=\"form-control search-opportunities-search-input\" />\n </div>\n </div>\n </div>\n <div class=\"search-filter\">\n <a class=\"mt-3 ms-3 text-start btn-filter-primary\" (click)=\"clearFilters()\">Clear all filters</a>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\" pSortableColumn=\"title\"> {{ 'Crm.OpportunitiesMessage.Title' | transloco }} <p-sortIcon\n field=\"title\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_contact_id\"> {{ 'Crm.OpportunitiesMessage.Contact' | transloco }}\n <p-sortIcon field=\"crm_contact_id\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_account_id\"> {{ 'Crm.OpportunitiesMessage.Account' | transloco }}\n <p-sortIcon field=\"crm_account_id\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"one_time_amount\"> {{ 'Crm.OpportunitiesMessage.OneTimeAmount' | transloco\n }} <p-sortIcon field=\"one_time_amount\"></p-sortIcon>\n </th>\n <th class=\"mrr-header\" scope=\"true\" pSortableColumn=\"monthly_amount\"> {{ 'Crm.OpportunitiesMessage.MRR' | transloco\n }} <p-sortIcon field=\"monthly_amount\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"win_chances\"> {{ 'Crm.OpportunitiesMessage.WinChance' | transloco }}\n <p-sortIcon field=\"win_chances\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_opportunity_category_ids\"> {{ 'Crm.OpportunitiesMessage.Categories' |\n transloco }} <p-sortIcon field=\"crm_opportunity_category_ids\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_opportunity_stage_id\"> {{ 'Crm.OpportunitiesMessage.Stage' | transloco\n }} <p-sortIcon field=\"crm_opportunity_stage_id\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"starting_at\"> {{ 'Crm.OpportunitiesMessage.StartingAt' | transloco }}\n <p-sortIcon field=\"starting_at\"></p-sortIcon>\n </th>\n <th class=\"actions-list-two\" scope=\"true\"> {{ 'Label.Actions' | transloco }} </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-opportunities let-i=\"rowIndex\">\n <!-- Totals row at the top (first row) - show before first data row -->\n <ng-container *ngIf=\"i === 0 && data?.crm_opportunities?.length\">\n <tr class=\"totals-row\" style=\"background-color: #f8f9fa; font-weight: bold;\">\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n <td class=\"expected-mrr\">\n <strong>{{ totals?.total_mrr / 100 | currency: 'USD' }}</strong>\n </td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n </tr>\n </ng-container>\n <!-- Regular data row -->\n <tr>\n <td data-head=\"Title\">\n <a [ngbTooltip]=\"opportunities?.title\" *ngIf=\"\n hasAccess ||\n opportunities?.owner_id === userId ||\n checkPermission('Pages.Product.CRM.Role.Admin')\n \" [routerLink]=\"[\n '/' + subscription?.slug + routers.opportunityInfo,\n opportunities.id\n ]\">\n <span>{{ opportunities?.title | textTruncate: 15 }} </span>\n </a>\n <a *ngIf=\"\n !hasAccess &&\n opportunities?.owner_id !== userId &&\n checkPermission('Pages.Product.CRM.Role.Admin')\n \"> {{ opportunities?.title | textTruncate: 15 }} </a>\n </td>\n <td class=\"contactname\" data-head=\"Crm Contact\">\n <a *ngIf=\"opportunities?.crm_contact_id\" [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n opportunities.crm_contact_id.id\n ]\">{{ opportunities.crm_contact?.first_name + ' ' +\n opportunities.crm_contact?.last_name }}</a>\n </td>\n <td data-head=\"Account\">\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n opportunities.crm_account.id\n ]\">{{ opportunities.crm_account.name }}</a>\n </td>\n <td data-head=\"Amount\"> {{ opportunities.one_time_amount / 100 | currency: opportunities?.currency }} </td>\n <td data-head=\"MRR\" class=\"expected-mrr\"> {{ opportunities.monthly_amount / 100 | currency: opportunities?.currency }} </td>\n <td data-head=\"WinChance\">\n <span [ngClass]=\"{'text-danger': opportunities.win_chances < 30, 'text-success fw-bold': opportunities.win_chances >70}\">\n {{ opportunities.win_chances / 100 | percent }}\n </span>\n <span class=\"text-danger\"\n *ngIf=\"opportunities.cancelled\">!Cancelled!</span>\n </td>\n <td data-head=\"Categories\">\n <span *ngFor=\"let category of opportunities?.crm_opportunity_categories\" class=\"badge ms-1\"\n [appDynamicBadge]=\"{ itemsArray: categories, item: category?.name }\" color=\"blue-grey\">{{ category?.name\n }}</span>\n </td>\n <td data-head=\"Stage\">\n <span class=\"badge\" [appDynamicBadge]=\"{\n itemsArray: stages,\n item: opportunities?.crm_opportunity_stage?.name\n }\" color=\"cyan\">{{ opportunities?.crm_opportunity_stage?.name }}</span>\n </td>\n <td data-head=\"Starting At\" [ngClass]=\"{'text-danger': isPastDate(opportunities.starting_at)}\"> {{ opportunities.starting_at | dateFormat }} </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <ng-container *ngIf=\"hasAccess || opportunities?.owner_id === userId\">\n <ng-container *rbacAllow=\"'SubscriptionAdmin'\">\n <li ngbTooltip=\"Edit\" class=\"me-2 me-sm-3\" [routerLink]=\"[\n '/' + subscription?.slug + routers.opportunities,\n opportunities.id\n ]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n </ng-container>\n <ng-container *rbacAllow=\"'SubscriptionAdmin'\">\n <li ngbTooltip=\"Delete\" class=\"me-2 me-sm-3\">\n <i class=\"fa fa-trash delete-icon\" (keydown.enter)=\"onDelete(opportunities.id)\"\n (keydown.space)=\"onDelete(opportunities.id)\"\n (click)=\"onDelete(opportunities.id)\" aria-hidden=\"true\"></i>\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"footer\">\n <tr *ngIf=\"data?.crm_opportunities?.length\">\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n <td class=\"expected-mrr\">\n <strong>{{ totals?.total_mrr / 100 | currency: 'USD' }}</strong>\n </td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\"data.object_count === 0 && data.unfiltered_count !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage'| transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n <span class=\"total-records-count\" *ngIf=\"data.object_count !== 0\">{{ 'Label.Total' | transloco }}: {{ data.object_count }}</span>\n </div>\n </div>\n</div>\n<div *ngIf=\"data.unfiltered_count === 0 && isLoaded\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoOpportunitiesMessage' | transloco\">\n </pw-no-data>\n</div>\n<ng-container>\n <div class=\"row mt-5\" *ngIf=\"isLoaded\">\n <!-- Drill Down -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Watch Closely</h5>\n <div class=\"primeng-datatable-container table-responsive\" *ngIf=\"opportunitiesInsight?.length\">\n <p-table class=\"table\" #dt [value]=\"opportunitiesInsight\" [paginator]=\"opportunitiesInsight?.length !== 0\" [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"opportunitiesInsight.length\" [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\"> {{ 'Crm.OpportunitiesMessage.Reason' | transloco }} </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-insight>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, insight.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"insight?.name\">{{ insight?.name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"Title\">\n <span\n [ngbTooltip]=\"insight?.title\"\n container=\"body\"\n tooltipClass=\"custom-tooltip\"\n placement=\"bottom\"\n >\n {{ insight?.title | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"Reason\"> {{ insight.reason }} </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"opportunitiesInsight?.length !== 0\">{{ 'Label.Total' | transloco }}: {{ opportunitiesInsight.length }}</span>\n </div>\n <div *ngIf=\"opportunitiesInsight?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoInsightMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n <!-- Geography -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Opportunities Location</h5>\n <div>\n <ng-template [ngIf]=\"opportunitiesGeography\">\n <plotly-plot [data]=\"opportunitiesGeography?.data\" [layout]=\"opportunitiesGeography?.layout\" [config]=\"opportunitiesGeography?.config\" [useResizeHandler]=\"opportunitiesGeography ? true : false\">\n </plotly-plot>\n </ng-template>\n </div>\n <div *ngIf=\"!opportunitiesGeography\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoInsightMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n </div>\n</ng-container>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}@media (min-width: 640px) and (max-width: 768px){.primeng-datatable-container tr td{width:350px}}.search-opportunities-search-input{background-color:#fff!important}\n"], 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.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: 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: "directive", type: i5.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "directive", type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i7.DynamicBadgeDirective, selector: "[appDynamicBadge]", inputs: ["appDynamicBadge", "color", "colorByName", "dataName"] }, { kind: "directive", type: i7.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "component", type: i8.PlotlyComponent, selector: "plotly-plot", inputs: ["data", "layout", "config", "frames", "style", "theme", "divId", "revision", "className", "debug", "useResizeHandler", "updateOnLayoutChange", "updateOnDataChange", "updateOnlyWithRevision"], outputs: ["initialized", "update", "purge", "error", "afterExport", "afterPlot", "animated", "animatingFrame", "animationInterrupted", "autoSize", "beforeExport", "beforeHover", "buttonClicked", "click", "plotlyClick", "clickAnnotation", "deselect", "doubleClick", "framework", "hover", "legendClick", "legendDoubleClick", "react", "relayout", "relayouting", "restyle", "redraw", "selected", "selecting", "sliderChange", "sliderEnd", "sliderStart", "sunburstclick", "transitioning", "transitionInterrupted", "unhover", "treemapclick", "webglcontextlost"] }, { kind: "directive", type: i9.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i10.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i11.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i10.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i10.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i12.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i13.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i14.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "pipe", type: i3.PercentPipe, name: "percent" }, { kind: "pipe", type: i3.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i15.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i15.TextTruncatePipe, name: "textTruncate" }, { kind: "pipe", type: i16.TranslocoPipe, name: "transloco" }] }); }
|
|
214
251
|
}
|
|
215
252
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartCrmOpportunitiesListComponent, decorators: [{
|
|
216
253
|
type: Component,
|
|
217
|
-
args: [{ selector: 'pw-smart-crm-opportunities-list', template: "<div class=\"row\">\n <div class=\"col-12 mb-3\">\n <a class=\"btn btn-sm btn-outline-primary float-end\" data-cy=\"add-opportunities\"\n [routerLink]=\"['/' + subscription?.slug + routers.opportunityAdd]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> {{ 'Crm.OpportunitiesMessage.AddOpportunity' | transloco }}\n </a>\n </div>\n <div class=\"w-100 text-center mt-3\" *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div class=\"col-12\">\n <div class=\"primeng-datatable-container table-responsive\" [class.hideTable]=\"data.unfiltered_count === 0\">\n <p-table #dt [value]=\"data.crm_opportunities\" [paginator]=\"data.object_count !== 0\" [lazy]=\"true\" [rows]=\"PAGE_SIZE\"\n class=\"contact-table\" [totalRecords]=\"data.object_count\" [loading]=\"loading\" filterDelay=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\" [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <div class=\"row\">\n <div class=\"col-sm-3 col-6\">\n <p-multiSelect placeholder=\"Select Category\" [options]=\"categories\" [(ngModel)]=\"filterByCategories\"\n (onChange)=\"onSearchOptionChange($event, 'category')\" [filter]=\"true\" [showHeader]=\"true\" [showToggleAll]=\"true\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-sm-3 col-6 mb-2 mb-sm-0\">\n <p-multiSelect placeholder=\"Select Stage\" [options]=\"searchStages\" [(ngModel)]=\"filterByStages\"\n (onChange)=\"onSearchOptionChange($event, 'stage')\" [filter]=\"true\" [showHeader]=\"true\"\n [showToggleAll]=\"true\" appendTo=\"body\">\n </p-multiSelect>\n </div>\n <!-- Empty column occupying the same space -->\n <div class=\"col-sm-3 col-6\"></div>\n <div class=\"col-sm-3 col-md-4 col-lg-3 d-flex justify-content-end\">\n <div class=\"d-flex w-100\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\" [(ngModel)]=\"searchText\" pInputText placeholder=\"Search opportunities..\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\" class=\"form-control search-opportunities-search-input\" />\n </div>\n </div>\n </div>\n <div class=\"search-filter\">\n <a class=\"mt-3 ms-3 text-start btn-filter-primary\" (click)=\"clearFilters()\">Clear all filters</a>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\" pSortableColumn=\"title\"> {{ 'Crm.OpportunitiesMessage.Title' | transloco }} <p-sortIcon\n field=\"title\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_contact_id\"> {{ 'Crm.OpportunitiesMessage.Contact' | transloco }}\n <p-sortIcon field=\"crm_contact_id\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_account_id\"> {{ 'Crm.OpportunitiesMessage.Account' | transloco }}\n <p-sortIcon field=\"crm_account_id\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"one_time_amount\"> {{ 'Crm.OpportunitiesMessage.OneTimeAmount' | transloco\n }} <p-sortIcon field=\"one_time_amount\"></p-sortIcon>\n </th>\n <th class=\"mrr-header\" scope=\"true\" pSortableColumn=\"monthly_amount\"> {{ 'Crm.OpportunitiesMessage.MRR' | transloco\n }} <p-sortIcon field=\"monthly_amount\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"win_chances\"> {{ 'Crm.OpportunitiesMessage.WinChance' | transloco }}\n <p-sortIcon field=\"win_chances\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_opportunity_category_ids\"> {{ 'Crm.OpportunitiesMessage.Categories' |\n transloco }} <p-sortIcon field=\"crm_opportunity_category_ids\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_opportunity_stage_id\"> {{ 'Crm.OpportunitiesMessage.Stage' | transloco\n }} <p-sortIcon field=\"crm_opportunity_stage_id\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"starting_at\"> {{ 'Crm.OpportunitiesMessage.StartingAt' | transloco }}\n <p-sortIcon field=\"starting_at\"></p-sortIcon>\n </th>\n <th class=\"actions-list-two\" scope=\"true\"> {{ 'Label.Actions' | transloco }} </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-opportunities>\n <tr>\n <td data-head=\"Title\">\n <a [ngbTooltip]=\"opportunities?.title\" *ngIf=\"\n hasAccess ||\n opportunities?.owner_id === userId ||\n checkPermission('Pages.Product.CRM.Role.Admin')\n \" [routerLink]=\"[\n '/' + subscription?.slug + routers.opportunityInfo,\n opportunities.id\n ]\">\n <span>{{ opportunities?.title | textTruncate: 15 }} </span>\n </a>\n <a *ngIf=\"\n !hasAccess &&\n opportunities?.owner_id !== userId &&\n checkPermission('Pages.Product.CRM.Role.Admin')\n \"> {{ opportunities?.title | textTruncate: 15 }} </a>\n </td>\n <td class=\"contactname\" data-head=\"Crm Contact\">\n <a *ngIf=\"opportunities?.crm_contact_id\" [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n opportunities.crm_contact_id.id\n ]\">{{ opportunities.crm_contact?.first_name + ' ' +\n opportunities.crm_contact?.last_name }}</a>\n </td>\n <td data-head=\"Account\">\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n opportunities.crm_account.id\n ]\">{{ opportunities.crm_account.name }}</a>\n </td>\n <td data-head=\"Amount\"> {{ opportunities.one_time_amount / 100 | currency: opportunities?.currency }} </td>\n <td data-head=\"MRR\" class=\"expected-mrr\"> {{ opportunities.monthly_amount / 100 | currency: opportunities?.currency }} </td>\n <td data-head=\"WinChance\">\n <span [ngClass]=\"{'text-danger': opportunities.win_chances < 30, 'text-success fw-bold': opportunities.win_chances >70}\">\n {{ opportunities.win_chances / 100 | percent }}\n </span>\n <span class=\"text-danger\"\n *ngIf=\"opportunities.cancelled\">!Cancelled!</span>\n </td>\n <td data-head=\"Categories\">\n <span *ngFor=\"let category of opportunities?.crm_opportunity_categories\" class=\"badge ms-1\"\n [appDynamicBadge]=\"{ itemsArray: categories, item: category?.name }\" color=\"blue-grey\">{{ category?.name\n }}</span>\n </td>\n <td data-head=\"Stage\">\n <span class=\"badge\" [appDynamicBadge]=\"{\n itemsArray: stages,\n item: opportunities?.crm_opportunity_stage?.name\n }\" color=\"cyan\">{{ opportunities?.crm_opportunity_stage?.name }}</span>\n </td>\n <td data-head=\"Starting At\" [ngClass]=\"{'text-danger': isPastDate(opportunities.starting_at)}\"> {{ opportunities.starting_at | dateFormat }} </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <ng-container *ngIf=\"hasAccess || opportunities?.owner_id === userId\">\n <ng-container *rbacAllow=\"'SubscriptionAdmin'\">\n <li ngbTooltip=\"Edit\" class=\"me-2 me-sm-3\" [routerLink]=\"[\n '/' + subscription?.slug + routers.opportunities,\n opportunities.id\n ]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n </ng-container>\n <ng-container *rbacAllow=\"'SubscriptionAdmin'\">\n <li ngbTooltip=\"Delete\" class=\"me-2 me-sm-3\">\n <i class=\"fa fa-trash delete-icon\" (keydown.enter)=\"onDelete(opportunities.id)\"\n (keydown.space)=\"onDelete(opportunities.id)\"\n (click)=\"onDelete(opportunities.id)\" aria-hidden=\"true\"></i>\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\"data.object_count === 0 && data.unfiltered_count !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage'| transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n <span class=\"total-records-count\" *ngIf=\"data.object_count !== 0\">{{ 'Label.Total' | transloco }}: {{ data.object_count }}</span>\n </div>\n </div>\n</div>\n<div *ngIf=\"data.unfiltered_count === 0 && isLoaded\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoOpportunitiesMessage' | transloco\">\n </pw-no-data>\n</div>\n<ng-container>\n <div class=\"row mt-5\" *ngIf=\"isLoaded\">\n <!-- Drill Down -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Watch Closely</h5>\n <div class=\"primeng-datatable-container table-responsive\" *ngIf=\"opportunitiesInsight?.length\">\n <p-table class=\"table\" #dt [value]=\"opportunitiesInsight\" [paginator]=\"opportunitiesInsight?.length !== 0\" [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"opportunitiesInsight.length\" [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\"> {{ 'Crm.OpportunitiesMessage.Reason' | transloco }} </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-insight>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, insight.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"insight?.name\">{{ insight?.name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"Title\">\n <span\n [ngbTooltip]=\"insight?.title\"\n container=\"body\"\n tooltipClass=\"custom-tooltip\"\n placement=\"bottom\"\n >\n {{ insight?.title | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"Reason\"> {{ insight.reason }} </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"opportunitiesInsight?.length !== 0\">{{ 'Label.Total' | transloco }}: {{ opportunitiesInsight.length }}</span>\n </div>\n <div *ngIf=\"opportunitiesInsight?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoInsightMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n <!-- Geography -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Opportunities Location</h5>\n <div>\n <ng-template [ngIf]=\"opportunitiesGeography\">\n <plotly-plot [data]=\"opportunitiesGeography?.data\" [layout]=\"opportunitiesGeography?.layout\" [config]=\"opportunitiesGeography?.config\" [useResizeHandler]=\"opportunitiesGeography ? true : false\">\n </plotly-plot>\n </ng-template>\n </div>\n <div *ngIf=\"!opportunitiesGeography\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoInsightMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n </div>\n</ng-container>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}@media (min-width: 640px) and (max-width: 768px){.primeng-datatable-container tr td{width:350px}}.search-opportunities-search-input{background-color:#fff!important}\n"] }]
|
|
254
|
+
args: [{ selector: 'pw-smart-crm-opportunities-list', template: "<div class=\"row\">\n <div class=\"col-12 mb-3\">\n <a class=\"btn btn-sm btn-outline-primary float-end\" data-cy=\"add-opportunities\"\n [routerLink]=\"['/' + subscription?.slug + routers.opportunityAdd]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> {{ 'Crm.OpportunitiesMessage.AddOpportunity' | transloco }}\n </a>\n </div>\n <div class=\"w-100 text-center mt-3\" *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div class=\"col-12\">\n <div class=\"primeng-datatable-container table-responsive\" [class.hideTable]=\"data.unfiltered_count === 0\">\n <p-table #dt [value]=\"data.crm_opportunities\" [paginator]=\"data.object_count !== 0\" [lazy]=\"true\" [rows]=\"PAGE_SIZE\"\n class=\"contact-table\" [totalRecords]=\"data.object_count\" [loading]=\"loading\" filterDelay=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\" [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <div class=\"row\">\n <div class=\"col-sm-3 col-6\">\n <p-multiSelect placeholder=\"Select Category\" [options]=\"categories\" [(ngModel)]=\"filterByCategories\"\n (onChange)=\"onSearchOptionChange($event, 'category')\" [filter]=\"true\" [showHeader]=\"true\" [showToggleAll]=\"true\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-sm-3 col-6 mb-2 mb-sm-0\">\n <p-multiSelect placeholder=\"Select Stage\" [options]=\"searchStages\" [(ngModel)]=\"filterByStages\"\n (onChange)=\"onSearchOptionChange($event, 'stage')\" [filter]=\"true\" [showHeader]=\"true\"\n [showToggleAll]=\"true\" appendTo=\"body\">\n </p-multiSelect>\n </div>\n <!-- Empty column occupying the same space -->\n <div class=\"col-sm-3 col-6\"></div>\n <div class=\"col-sm-3 col-md-4 col-lg-3 d-flex justify-content-end\">\n <div class=\"d-flex w-100\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\" [(ngModel)]=\"searchText\" pInputText placeholder=\"Search opportunities..\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\" class=\"form-control search-opportunities-search-input\" />\n </div>\n </div>\n </div>\n <div class=\"search-filter\">\n <a class=\"mt-3 ms-3 text-start btn-filter-primary\" (click)=\"clearFilters()\">Clear all filters</a>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\" pSortableColumn=\"title\"> {{ 'Crm.OpportunitiesMessage.Title' | transloco }} <p-sortIcon\n field=\"title\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_contact_id\"> {{ 'Crm.OpportunitiesMessage.Contact' | transloco }}\n <p-sortIcon field=\"crm_contact_id\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_account_id\"> {{ 'Crm.OpportunitiesMessage.Account' | transloco }}\n <p-sortIcon field=\"crm_account_id\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"one_time_amount\"> {{ 'Crm.OpportunitiesMessage.OneTimeAmount' | transloco\n }} <p-sortIcon field=\"one_time_amount\"></p-sortIcon>\n </th>\n <th class=\"mrr-header\" scope=\"true\" pSortableColumn=\"monthly_amount\"> {{ 'Crm.OpportunitiesMessage.MRR' | transloco\n }} <p-sortIcon field=\"monthly_amount\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"win_chances\"> {{ 'Crm.OpportunitiesMessage.WinChance' | transloco }}\n <p-sortIcon field=\"win_chances\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_opportunity_category_ids\"> {{ 'Crm.OpportunitiesMessage.Categories' |\n transloco }} <p-sortIcon field=\"crm_opportunity_category_ids\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"crm_opportunity_stage_id\"> {{ 'Crm.OpportunitiesMessage.Stage' | transloco\n }} <p-sortIcon field=\"crm_opportunity_stage_id\"></p-sortIcon>\n </th>\n <th scope=\"true\" pSortableColumn=\"starting_at\"> {{ 'Crm.OpportunitiesMessage.StartingAt' | transloco }}\n <p-sortIcon field=\"starting_at\"></p-sortIcon>\n </th>\n <th class=\"actions-list-two\" scope=\"true\"> {{ 'Label.Actions' | transloco }} </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-opportunities let-i=\"rowIndex\">\n <!-- Totals row at the top (first row) - show before first data row -->\n <ng-container *ngIf=\"i === 0 && data?.crm_opportunities?.length\">\n <tr class=\"totals-row\" style=\"background-color: #f8f9fa; font-weight: bold;\">\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n <td class=\"expected-mrr\">\n <strong>{{ totals?.total_mrr / 100 | currency: 'USD' }}</strong>\n </td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n </tr>\n </ng-container>\n <!-- Regular data row -->\n <tr>\n <td data-head=\"Title\">\n <a [ngbTooltip]=\"opportunities?.title\" *ngIf=\"\n hasAccess ||\n opportunities?.owner_id === userId ||\n checkPermission('Pages.Product.CRM.Role.Admin')\n \" [routerLink]=\"[\n '/' + subscription?.slug + routers.opportunityInfo,\n opportunities.id\n ]\">\n <span>{{ opportunities?.title | textTruncate: 15 }} </span>\n </a>\n <a *ngIf=\"\n !hasAccess &&\n opportunities?.owner_id !== userId &&\n checkPermission('Pages.Product.CRM.Role.Admin')\n \"> {{ opportunities?.title | textTruncate: 15 }} </a>\n </td>\n <td class=\"contactname\" data-head=\"Crm Contact\">\n <a *ngIf=\"opportunities?.crm_contact_id\" [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n opportunities.crm_contact_id.id\n ]\">{{ opportunities.crm_contact?.first_name + ' ' +\n opportunities.crm_contact?.last_name }}</a>\n </td>\n <td data-head=\"Account\">\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n opportunities.crm_account.id\n ]\">{{ opportunities.crm_account.name }}</a>\n </td>\n <td data-head=\"Amount\"> {{ opportunities.one_time_amount / 100 | currency: opportunities?.currency }} </td>\n <td data-head=\"MRR\" class=\"expected-mrr\"> {{ opportunities.monthly_amount / 100 | currency: opportunities?.currency }} </td>\n <td data-head=\"WinChance\">\n <span [ngClass]=\"{'text-danger': opportunities.win_chances < 30, 'text-success fw-bold': opportunities.win_chances >70}\">\n {{ opportunities.win_chances / 100 | percent }}\n </span>\n <span class=\"text-danger\"\n *ngIf=\"opportunities.cancelled\">!Cancelled!</span>\n </td>\n <td data-head=\"Categories\">\n <span *ngFor=\"let category of opportunities?.crm_opportunity_categories\" class=\"badge ms-1\"\n [appDynamicBadge]=\"{ itemsArray: categories, item: category?.name }\" color=\"blue-grey\">{{ category?.name\n }}</span>\n </td>\n <td data-head=\"Stage\">\n <span class=\"badge\" [appDynamicBadge]=\"{\n itemsArray: stages,\n item: opportunities?.crm_opportunity_stage?.name\n }\" color=\"cyan\">{{ opportunities?.crm_opportunity_stage?.name }}</span>\n </td>\n <td data-head=\"Starting At\" [ngClass]=\"{'text-danger': isPastDate(opportunities.starting_at)}\"> {{ opportunities.starting_at | dateFormat }} </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <ng-container *ngIf=\"hasAccess || opportunities?.owner_id === userId\">\n <ng-container *rbacAllow=\"'SubscriptionAdmin'\">\n <li ngbTooltip=\"Edit\" class=\"me-2 me-sm-3\" [routerLink]=\"[\n '/' + subscription?.slug + routers.opportunities,\n opportunities.id\n ]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n </ng-container>\n <ng-container *rbacAllow=\"'SubscriptionAdmin'\">\n <li ngbTooltip=\"Delete\" class=\"me-2 me-sm-3\">\n <i class=\"fa fa-trash delete-icon\" (keydown.enter)=\"onDelete(opportunities.id)\"\n (keydown.space)=\"onDelete(opportunities.id)\"\n (click)=\"onDelete(opportunities.id)\" aria-hidden=\"true\"></i>\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"footer\">\n <tr *ngIf=\"data?.crm_opportunities?.length\">\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n <td class=\"expected-mrr\">\n <strong>{{ totals?.total_mrr / 100 | currency: 'USD' }}</strong>\n </td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\"data.object_count === 0 && data.unfiltered_count !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage'| transloco\" [description]=\"'Search.NoDataDescription' | transloco\" >\n </pw-no-data>\n </div>\n <span class=\"total-records-count\" *ngIf=\"data.object_count !== 0\">{{ 'Label.Total' | transloco }}: {{ data.object_count }}</span>\n </div>\n </div>\n</div>\n<div *ngIf=\"data.unfiltered_count === 0 && isLoaded\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoOpportunitiesMessage' | transloco\">\n </pw-no-data>\n</div>\n<ng-container>\n <div class=\"row mt-5\" *ngIf=\"isLoaded\">\n <!-- Drill Down -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Watch Closely</h5>\n <div class=\"primeng-datatable-container table-responsive\" *ngIf=\"opportunitiesInsight?.length\">\n <p-table class=\"table\" #dt [value]=\"opportunitiesInsight\" [paginator]=\"opportunitiesInsight?.length !== 0\" [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"opportunitiesInsight.length\" [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\"> {{ 'Crm.OpportunitiesMessage.Reason' | transloco }} </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-insight>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, insight.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"insight?.name\">{{ insight?.name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"Title\">\n <span\n [ngbTooltip]=\"insight?.title\"\n container=\"body\"\n tooltipClass=\"custom-tooltip\"\n placement=\"bottom\"\n >\n {{ insight?.title | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"Reason\"> {{ insight.reason }} </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"opportunitiesInsight?.length !== 0\">{{ 'Label.Total' | transloco }}: {{ opportunitiesInsight.length }}</span>\n </div>\n <div *ngIf=\"opportunitiesInsight?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoInsightMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n <!-- Geography -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Opportunities Location</h5>\n <div>\n <ng-template [ngIf]=\"opportunitiesGeography\">\n <plotly-plot [data]=\"opportunitiesGeography?.data\" [layout]=\"opportunitiesGeography?.layout\" [config]=\"opportunitiesGeography?.config\" [useResizeHandler]=\"opportunitiesGeography ? true : false\">\n </plotly-plot>\n </ng-template>\n </div>\n <div *ngIf=\"!opportunitiesGeography\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoInsightMessage' | transloco\">\n </pw-no-data>\n </div>\n </div>\n </div>\n</ng-container>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}@media (min-width: 640px) and (max-width: 768px){.primeng-datatable-container tr td{width:350px}}.search-opportunities-search-input{background-color:#fff!important}\n"] }]
|
|
218
255
|
}], ctorParameters: () => [{ type: i1.CrmService }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i2.ProductService }] });
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NtYXJ0LWNybS9zcmMvbGliL3ByaXZhdGUvY29tcG9uZW50cy9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy1saXN0L3NtYXJ0LWNybS1vcHBvcnR1bml0aWVzLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9wcml2YXRlL2NvbXBvbmVudHMvc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMvc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtbGlzdC9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFFBQVEsRUFHWCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBc0MsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBTXhELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTzdELE1BQU0sT0FBTyxrQ0FDVCxTQUFRLGdCQUFnQjtJQW9DeEIsWUFDcUIsVUFBc0IsRUFDdkMsUUFBa0IsRUFDRCxHQUFzQixFQUN0QixjQUE4QjtRQUUvQyxLQUFLLENBQUMsUUFBUSxD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a0NBQWtDLDhGQzFCL0MscXJaQStOQTs7NEZEck1hLGtDQUFrQztrQkFMOUMsU0FBUzsrQkFDSSxpQ0FBaUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0NoZWNrZWQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEluamVjdG9yLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2UvYXBwLWJhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IFByb2R1Y3RTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBQQUdFX1NJWkUsIFBhZ2luZywgUGxvdGx5LCBTdWJzY3JpcHRpb24sIFVzZXIgfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXV0aWxpdGllcyc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2hlbHBlci1zZXJ2aWNlJztcbmltcG9ydCB7IENybVNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2Uvc21hcnQtY3JtLXNoYXJlZCc7XG5cbmltcG9ydCB7IE9wcG9ydHVuaXR5SW5zaWdodCB9IGZyb20gJ2xpYnMvc21hcnQtY3JtL3NyYy9saWIvc2hhcmVkL2ludGVyZmFjZS9zbWFydC1jcm0tbW9kdWxlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMYXp5TG9hZEV2ZW50IH0gZnJvbSAncHJpbWVuZy9hcGknO1xuXG5pbXBvcnQgeyBDcm1PcHBvcnR1bml0eVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS9jcm0tb3Bwb3J0dW5pdHkuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJPVVRFUlMgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvcm91dGVycy9yb3V0ZXJzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwdy1zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy1saXN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtbGlzdC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNtYXJ0Q3JtT3Bwb3J0dW5pdGllc0xpc3RDb21wb25lbnRcbiAgICBleHRlbmRzIEFwcEJhc2VDb21wb25lbnRcbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkXG57XG4gICAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgc3Vic2NyaXB0aW9uSWQ6IG51bWJlcjtcbiAgICB1c2VyOiBVc2VyO1xuICAgIHVzZXJJZDogbnVtYmVyO1xuXG4gICAgZGF0YTogQ3JtT3Bwb3J0dW5pdHlSZXNwb25zZSA9IHtcbiAgICAgICAgY3JtX29wcG9ydHVuaXRpZXM6IFtdLFxuICAgICAgICBvYmplY3RfY291bnQ6IDAsXG4gICAgICAgIHVuZmlsdGVyZWRfY291bnQ6IDBcbiAgICB9O1xuXG4gICAgb3Bwb3J0dW5pdGllc0luc2lnaHQ6IE9wcG9ydHVuaXR5SW5zaWdodFtdO1xuICAgIG9wcG9ydHVuaXRpZXNHZW9ncmFwaHk6IFBsb3RseS5GaWd1cmU7XG5cbiAgICBpZCA9ICcnO1xuXG4gICAgc2VhcmNoVGV4dCA9ICcnO1xuICAgIHNlYXJjaFN0YWdlczogb2JqZWN0W10gPSBbXTtcbiAgICBzZWFyY2hDYXRlZ29yaWVzOiBvYmplY3RbXSA9IFtdO1xuXG4gICAgZmlsdGVyQnlTdGFnZXM6IHN0cmluZ1tdID0gW107XG4gICAgZmlsdGVyQnlDYXRlZ29yaWVzID0gW107XG5cbiAgICBwYWdlID0gMTtcbiAgICBzdGFnZXMgPSBbXTtcbiAgICBjYXRlZ29yaWVzID0gW107XG5cbiAgICBsb2FkaW5nID0gdHJ1ZTtcbiAgICBpc0xvYWRlZCA9IGZhbHNlO1xuICAgIGhhc0FjY2VzcyA9IGZhbHNlO1xuXG4gICAgcm91dGVycyA9IFJPVVRFUlM7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjcm1TZXJ2aWNlOiBDcm1TZXJ2aWNlLFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwcm9kdWN0U2VydmljZTogUHJvZHVjdFNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmdldEFsbFN0YWdlcygpO1xuICAgICAgICB0aGlzLmdldFVzZXJTdWJzY3JpcHRpb24oKS5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzQWNjZXNzID0gdGhpcy5oYXNBZG1pbkFjY2Vzcyh0aGlzLnN1YnNjcmlwdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mbygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlT3Bwb3J0dW5pdHlTdGFnZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFsbE9wcG9ydHVuaXR5Q2F0ZWdvcmllcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBvbkxhenlMb2FkKGV2ZW50OiBMYXp5TG9hZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHBhZ2VEZXRhaWxzID0gSGVscGVyU2VydmljZS5vblRhYmxlTGF6eUxvYWQoZXZlbnQpO1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlRGV0YWlscy5wYWdlO1xuICAgICAgICB0aGlzLmdldEFsbE9wcG9ydHVuaXRpZXMoe1xuICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkUsXG4gICAgICAgICAgICBvcmRlcl9ieTogcGFnZURldGFpbHMuc29ydEZpZWxkLFxuICAgICAgICAgICAgb3JkZXJfZGlyZWN0aW9uOiBwYWdlRGV0YWlscy5zb3J0T3JkZXIsXG4gICAgICAgICAgICBzZWFyY2g6IHRoaXMuc2VhcmNoVGV4dFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IHVzZXIgZGV0YWlscyAqL1xuICAgIHByaXZhdGUgZ2V0VXNlckluZm8oKSB7XG4gICAgICAgIHRoaXMudXNlclN0b3JlKCkuc3Vic2NyaWJlKHVzZXIgPT4ge1xuICAgICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgICAgICAgICAgICAgIHRoaXMudXNlcklkID0gdXNlci5pZDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uU2VydmljZS5pc0dyYW50ZWQoJ1BhZ2VzLkJldGEnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE9wcG9ydHVuaXRpZXNJbnNpZ2h0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29udGFjdEdlb2dyYXBoeSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBbGxTdGFnZXMocGFnaW5nOiBQYWdpbmcgPSB7fSkge1xuICAgICAgICB0aGlzLmdldFVzZXJTdWJzY3JpcHRpb25JZCgpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSByZXM7XG4gICAgICAgICAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRBbGxTdGFnZXModGhpcy5zdWJzY3JpcHRpb25JZCwgcGFnaW5nKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RhZ2VzID0gcmVzcG9uc2U/LmNybV9vcHBvcnR1bml0eV9zdGFnZXM/Lm1hcChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGVsZW1lbnQubmFtZSA/PyAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uU2VhcmNoT3B0aW9uQ2hhbmdlKGV2ZW50LCBmaWx0ZXJCeTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmaWx0ZXJCeSA9PT0gJ3N0YWdlJykge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJCeVN0YWdlcyA9IGV2ZW50LnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5nZXRBbGxPcHBvcnR1bml0aWVzKHtcbiAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXJCeSA9PT0gJ2NhdGVnb3J5Jykge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJCeUNhdGVnb3JpZXMgPSBldmVudC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZ2V0QWxsT3Bwb3J0dW5pdGllcyh7XG4gICAgICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyRmlsdGVycygpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJCeUNhdGVnb3JpZXMgPSBbXTtcbiAgICAgICAgdGhpcy5maWx0ZXJCeVN0YWdlcyA9IFtdO1xuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5nZXRBbGxPcHBvcnR1bml0aWVzKHtcbiAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QWxsT3Bwb3J0dW5pdGllcyhwYWdpbmc/OiBQYWdpbmcpIHtcbiAgICAgICAgdGhpcy5nZXRVc2VyU3Vic2NyaXB0aW9uSWQoKS5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uSWQgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IHN1YnNjcmlwdGlvbklkO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldEFsbE9wcG9ydHVuaXRpZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJCeUNhdGVnb3JpZXMuam9pbigpIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJCeVN0YWdlcy5qb2luKCkgfHwgJydcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpc1Bhc3REYXRlKGRhdGU6IHN0cmluZyB8IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUpIDwgbmV3IERhdGUoKTtcbiAgICB9XG5cbiAgICBvbkRlbGV0ZShpZDogbnVtYmVyKSB7XG4gICAgICAgIEhlbHBlclNlcnZpY2UucmFpc2VEZWxldGVQb3B1cCgpLnRoZW4ocmVzcCA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZS5kZWxldGVPcHBvcnR1bml0aWVzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgaWQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWxsT3Bwb3J0dW5pdGllcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hUZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLkRlbGV0ZWRNZXNzYWdlJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGdldCBhdmFpbGFibGUgb3Bwb3J0dW5pdGllcyAqL1xuICAgIHByaXZhdGUgZ2V0QXZhaWxhYmxlT3Bwb3J0dW5pdHlTdGFnZXMoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZS5nZXRBdmFpbGFibGVPcHBvcnR1bml0eVN0YWdlcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YWdlcyA9IHJlc3BvbnNlPy5hdmFpbGFibGVfY3JtX29wcG9ydHVuaXR5X3N0YWdlcz8ubWFwKHN0YWdlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhZ2U/Lm5hbWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGdldCBhbGwgY2F0ZWdvcmllcyAqL1xuICAgIHByaXZhdGUgZ2V0QWxsT3Bwb3J0dW5pdHlDYXRlZ29yaWVzKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2UuZ2V0QWxsT3Bwb3J0dW5pdHlDYXRlZ29yaWVzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcmllcyA9IHJlc3BvbnNlPy5jcm1fb3Bwb3J0dW5pdHlfY2F0ZWdvcmllcz8ubWFwKGNhdGVnb3J5ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2F0ZWdvcnkuaWQsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjYXRlZ29yeS5uYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gY2FsbCBvcHBvcnR1bml0aWVzIGluc2lnaHQgKi9cbiAgICBwcml2YXRlIGdldE9wcG9ydHVuaXRpZXNJbnNpZ2h0KCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRDcm1BbmFseXRpY3ModGhpcy5zdWJzY3JpcHRpb24/LmlkLCAnb3Bwb3J0dW5pdGllc19pbnNpZ2h0cycpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3Bwb3J0dW5pdGllc0luc2lnaHQgPSBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5vcHBvcnR1bml0aWVzSW5zaWdodCA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgY29udGFjdCBnZW9ncmFwaHkgKi9cbiAgICBwcml2YXRlIGdldENvbnRhY3RHZW9ncmFwaHkoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENybUFuYWx5dGljcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICdvcHBvcnR1bml0aWVzX2dlb2dyYXBoeScpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNHZW9ncmFwaHkgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoZWNrUGVybWlzc2lvbihwZXJtaXNzaW9uOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvblNlcnZpY2UuZXZhbHVhdGVQZXJtaXNzaW9ucyhwZXJtaXNzaW9uKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItM1wiPlxuICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5IGZsb2F0LWVuZFwiIGRhdGEtY3k9XCJhZGQtb3Bwb3J0dW5pdGllc1wiXG4gICAgICBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5vcHBvcnR1bml0eUFkZF1cIj5cbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1cy1jaXJjbGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+IHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuQWRkT3Bwb3J0dW5pdHknIHwgdHJhbnNsb2NvIH19XG4gICAgPC9hPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIG10LTNcIiAqbmdJZj1cIiFpc0xvYWRlZFwiPlxuICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIiBbY2xhc3MuaGlkZVRhYmxlXT1cImRhdGEudW5maWx0ZXJlZF9jb3VudCA9PT0gMFwiPlxuICAgICAgPHAtdGFibGUgI2R0IFt2YWx1ZV09XCJkYXRhLmNybV9vcHBvcnR1bml0aWVzXCIgW3BhZ2luYXRvcl09XCJkYXRhLm9iamVjdF9jb3VudCAhPT0gMFwiIFtsYXp5XT1cInRydWVcIiBbcm93c109XCJQQUdFX1NJWkVcIlxuICAgICAgICBjbGFzcz1cImNvbnRhY3QtdGFibGVcIiBbdG90YWxSZWNvcmRzXT1cImRhdGEub2JqZWN0X2NvdW50XCIgW2xvYWRpbmddPVwibG9hZGluZ1wiIGZpbHRlckRlbGF5PVwiMTAwMFwiXG4gICAgICAgIChvbkxhenlMb2FkKT1cIm9uTGF6eUxvYWQoJGV2ZW50KVwiIFtjdXN0b21Tb3J0XT1cInRydWVcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTMgY29sLTZcIj5cbiAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQ2F0ZWdvcnlcIiBbb3B0aW9uc109XCJjYXRlZ29yaWVzXCIgWyhuZ01vZGVsKV09XCJmaWx0ZXJCeUNhdGVnb3JpZXNcIlxuICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvblNlYXJjaE9wdGlvbkNoYW5nZSgkZXZlbnQsICdjYXRlZ29yeScpXCIgW2ZpbHRlcl09XCJ0cnVlXCIgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMyBjb2wtNiBtYi0yIG1iLXNtLTBcIj5cbiAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBTdGFnZVwiIFtvcHRpb25zXT1cInNlYXJjaFN0YWdlc1wiIFsobmdNb2RlbCldPVwiZmlsdGVyQnlTdGFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25TZWFyY2hPcHRpb25DaGFuZ2UoJGV2ZW50LCAnc3RhZ2UnKVwiIFtmaWx0ZXJdPVwidHJ1ZVwiIFtzaG93SGVhZGVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCI+XG4gICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIEVtcHR5IGNvbHVtbiBvY2N1cHlpbmcgdGhlIHNhbWUgc3BhY2UgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTMgY29sLTZcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMyBjb2wtbWQtNCBjb2wtbGctMyBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoIG10LTIgbWUtMlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIHBJbnB1dFRleHQgcGxhY2Vob2xkZXI9XCJTZWFyY2ggb3Bwb3J0dW5pdGllcy4uXCJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiZHQuZmlsdGVyR2xvYmFsKCRldmVudC50YXJnZXQudmFsdWUsICdjb250YWlucycpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLW9wcG9ydHVuaXRpZXMtc2VhcmNoLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWZpbHRlclwiPlxuICAgICAgICAgICAgPGEgY2xhc3M9XCJtdC0zIG1zLTMgdGV4dC1zdGFydCBidG4tZmlsdGVyLXByaW1hcnlcIiAoY2xpY2spPVwiY2xlYXJGaWx0ZXJzKClcIj5DbGVhciBhbGwgZmlsdGVyczwvYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIiBwU29ydGFibGVDb2x1bW49XCJ0aXRsZVwiPiB7eyAnQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLlRpdGxlJyB8IHRyYW5zbG9jbyB9fSA8cC1zb3J0SWNvblxuICAgICAgICAgICAgICAgIGZpZWxkPVwidGl0bGVcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiIHBTb3J0YWJsZUNvbHVtbj1cImNybV9jb250YWN0X2lkXCI+IHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuQ29udGFjdCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJjcm1fY29udGFjdF9pZFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCIgcFNvcnRhYmxlQ29sdW1uPVwiY3JtX2FjY291bnRfaWRcIj4ge3sgJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5BY2NvdW50JyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cImNybV9hY2NvdW50X2lkXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIiBwU29ydGFibGVDb2x1bW49XCJvbmVfdGltZV9hbW91bnRcIj4ge3sgJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5PbmVUaW1lQW1vdW50JyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICB9fSA8cC1zb3J0SWNvbiBmaWVsZD1cIm9uZV90aW1lX2Ftb3VudFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJtcnItaGVhZGVyXCIgc2NvcGU9XCJ0cnVlXCIgcFNvcnRhYmxlQ29sdW1uPVwibW9udGhseV9hbW91bnRcIj4ge3sgJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5NUlInIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgIH19IDxwLXNvcnRJY29uIGZpZWxkPVwibW9udGhseV9hbW91bnRcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiIHBTb3J0YWJsZUNvbHVtbj1cIndpbl9jaGFuY2VzXCI+IHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuV2luQ2hhbmNlJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cIndpbl9jaGFuY2VzXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIiBwU29ydGFibGVDb2x1bW49XCJjcm1fb3Bwb3J0dW5pdHlfY2F0ZWdvcnlfaWRzXCI+IHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuQ2F0ZWdvcmllcycgfFxuICAgICAgICAgICAgICB0cmFuc2xvY28gfX0gPHAtc29ydEljb24gZmllbGQ9XCJjcm1fb3Bwb3J0dW5pdHlfY2F0ZWdvcnlfaWRzXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiIHBTb3J0YWJsZUNvbHVtbj1cImNybV9vcHBvcnR1bml0eV9zdGFnZV9pZFwiPiB7eyAnQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLlN0YWdlJyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgIH19IDxwLXNvcnRJY29uIGZpZWxkPVwiY3JtX29wcG9ydHVuaXR5X3N0YWdlX2lkXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiIHBTb3J0YWJsZUNvbHVtbj1cInN0YXJ0aW5nX2F0XCI+IHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuU3RhcnRpbmdBdCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJzdGFydGluZ19hdFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJhY3Rpb25zLWxpc3QtdHdvXCIgc2NvcGU9XCJ0cnVlXCI+IHt7ICdMYWJlbC5BY3Rpb25zJyB8IHRyYW5zbG9jbyB9fSA8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW9wcG9ydHVuaXRpZXM+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIlRpdGxlXCI+XG4gICAgICAgICAgICAgIDxhIFtuZ2JUb29sdGlwXT1cIm9wcG9ydHVuaXRpZXM/LnRpdGxlXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FjY2VzcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bwb3J0dW5pdGllcz8ub3duZXJfaWQgPT09IHVzZXJJZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKCdQYWdlcy5Qcm9kdWN0LkNSTS5Sb2xlLkFkbWluJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgW3JvdXRlckxpbmtdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5vcHBvcnR1bml0eUluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHBvcnR1bml0aWVzLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBvcHBvcnR1bml0aWVzPy50aXRsZSB8IHRleHRUcnVuY2F0ZTogMTUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDxhICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaGFzQWNjZXNzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHBvcnR1bml0aWVzPy5vd25lcl9pZCAhPT0gdXNlcklkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1Blcm1pc3Npb24oJ1BhZ2VzLlByb2R1Y3QuQ1JNLlJvbGUuQWRtaW4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj4ge3sgb3Bwb3J0dW5pdGllcz8udGl0bGUgfCB0ZXh0VHJ1bmNhdGU6IDE1IH19IDwvYT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjb250YWN0bmFtZVwiIGRhdGEtaGVhZD1cIkNybSBDb250YWN0XCI+XG4gICAgICAgICAgICAgIDxhICpuZ0lmPVwib3Bwb3J0dW5pdGllcz8uY3JtX2NvbnRhY3RfaWRcIiBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmNvbnRhY3RJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bwb3J0dW5pdGllcy5jcm1fY29udGFjdF9pZC5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCI+e3sgb3Bwb3J0dW5pdGllcy5jcm1fY29udGFjdD8uZmlyc3RfbmFtZSArICcgJyArXG4gICAgICAgICAgICAgICAgb3Bwb3J0dW5pdGllcy5jcm1fY29udGFjdD8ubGFzdF9uYW1lIH19PC9hPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY2NvdW50XCI+XG4gICAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJyArIHN1YnNjcmlwdGlvbj8uc2x1ZyArIHJvdXRlcnMuYWNjb3VudEluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHBvcnR1bml0aWVzLmNybV9hY2NvdW50LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cIj57eyBvcHBvcnR1bml0aWVzLmNybV9hY2NvdW50Lm5hbWUgfX08L2E+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkFtb3VudFwiPiB7eyBvcHBvcnR1bml0aWVzLm9uZV90aW1lX2Ftb3VudCAvIDEwMCB8IGN1cnJlbmN5OiBvcHBvcnR1bml0aWVzPy5jdXJyZW5jeSB9fSA8L3RkPlxuICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIk1SUlwiIGNsYXNzPVwiZXhwZWN0ZWQtbXJyXCI+IHt7IG9wcG9ydHVuaXRpZXMubW9udGhseV9hbW91bnQgLyAxMDAgfCBjdXJyZW5jeTogb3Bwb3J0dW5pdGllcz8uY3VycmVuY3kgfX0gPC90ZD5cbiAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJXaW5DaGFuY2VcIj5cbiAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyd0ZXh0LWRhbmdlcic6IG9wcG9ydHVuaXRpZXMud2luX2NoYW5jZXMgPCAzMCwgJ3RleHQtc3VjY2VzcyBmdy1ib2xkJzogb3Bwb3J0dW5pdGllcy53aW5fY2hhbmNlcyA+NzB9XCI+XG4gICAgICAgICAgICAgICAge3sgb3Bwb3J0dW5pdGllcy53aW5fY2hhbmNlcyAvIDEwMCB8IHBlcmNlbnQgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvcHBvcnR1bml0aWVzLmNhbmNlbGxlZFwiPiFDYW5jZWxsZWQhPC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDYXRlZ29yaWVzXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBjYXRlZ29yeSBvZiBvcHBvcnR1bml0aWVzPy5jcm1fb3Bwb3J0dW5pdHlfY2F0ZWdvcmllc1wiIGNsYXNzPVwiYmFkZ2UgbXMtMVwiXG4gICAgICAgICAgICAgICAgW2FwcER5bmFtaWNCYWRnZV09XCJ7IGl0ZW1zQXJyYXk6IGNhdGVnb3JpZXMsIGl0ZW06IGNhdGVnb3J5Py5uYW1lIH1cIiBjb2xvcj1cImJsdWUtZ3JleVwiPnt7IGNhdGVnb3J5Py5uYW1lXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIlN0YWdlXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2VcIiBbYXBwRHluYW1pY0JhZGdlXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQXJyYXk6IHN0YWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IG9wcG9ydHVuaXRpZXM/LmNybV9vcHBvcnR1bml0eV9zdGFnZT8ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgY29sb3I9XCJjeWFuXCI+e3sgb3Bwb3J0dW5pdGllcz8uY3JtX29wcG9ydHVuaXR5X3N0YWdlPy5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJTdGFydGluZyBBdFwiIFtuZ0NsYXNzXT1cInsndGV4dC1kYW5nZXInOiBpc1Bhc3REYXRlKG9wcG9ydHVuaXRpZXMuc3RhcnRpbmdfYXQpfVwiPiB7eyBvcHBvcnR1bml0aWVzLnN0YXJ0aW5nX2F0IHwgZGF0ZUZvcm1hdCB9fSA8L3RkPlxuICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkFjdGlvblwiPlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkIGxpc3QtaW5saW5lIGxpc3QtYWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0FjY2VzcyB8fCBvcHBvcnR1bml0aWVzPy5vd25lcl9pZCA9PT0gdXNlcklkXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpyYmFjQWxsb3c9XCInU3Vic2NyaXB0aW9uQWRtaW4nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaSBuZ2JUb29sdGlwPVwiRWRpdFwiIGNsYXNzPVwibWUtMiBtZS1zbS0zXCIgW3JvdXRlckxpbmtdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5vcHBvcnR1bml0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bwb3J0dW5pdGllcy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1lZGl0IGVkaXQtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqcmJhY0FsbG93PVwiJ1N1YnNjcmlwdGlvbkFkbWluJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGkgbmdiVG9vbHRpcD1cIkRlbGV0ZVwiIGNsYXNzPVwibWUtMiBtZS1zbS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaCBkZWxldGUtaWNvblwiICAgKGtleWRvd24uZW50ZXIpPVwib25EZWxldGUob3Bwb3J0dW5pdGllcy5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIm9uRGVsZXRlKG9wcG9ydHVuaXRpZXMuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGUob3Bwb3J0dW5pdGllcy5pZClcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvcC10YWJsZT5cbiAgICAgIDxkaXYgKm5nSWY9XCJkYXRhLm9iamVjdF9jb3VudCA9PT0gMCAmJiBkYXRhLnVuZmlsdGVyZWRfY291bnQgIT09IDBcIj5cbiAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ1NlYXJjaC5Ob0RhdGFNZXNzYWdlJ3wgdHJhbnNsb2NvXCIgW2Rlc2NyaXB0aW9uXT1cIidTZWFyY2guTm9EYXRhRGVzY3JpcHRpb24nIHwgdHJhbnNsb2NvXCIgPlxuICAgICAgICA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtcmVjb3Jkcy1jb3VudFwiICpuZ0lmPVwiZGF0YS5vYmplY3RfY291bnQgIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBkYXRhLm9iamVjdF9jb3VudCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCJkYXRhLnVuZmlsdGVyZWRfY291bnQgPT09IDAgJiYgaXNMb2FkZWRcIj5cbiAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5Ob09wcG9ydHVuaXRpZXNNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPlxuICA8L3B3LW5vLWRhdGE+XG48L2Rpdj5cbjxuZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJyb3cgbXQtNVwiICpuZ0lmPVwiaXNMb2FkZWRcIj5cbiAgICA8IS0tIERyaWxsIERvd24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zIGFuYWx5dGljc1wiPlxuICAgICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5XYXRjaCBDbG9zZWx5PC9oNT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmltZW5nLWRhdGF0YWJsZS1jb250YWluZXIgdGFibGUtcmVzcG9uc2l2ZVwiICpuZ0lmPVwib3Bwb3J0dW5pdGllc0luc2lnaHQ/Lmxlbmd0aFwiPlxuICAgICAgICA8cC10YWJsZSBjbGFzcz1cInRhYmxlXCIgI2R0IFt2YWx1ZV09XCJvcHBvcnR1bml0aWVzSW5zaWdodFwiIFtwYWdpbmF0b3JdPVwib3Bwb3J0dW5pdGllc0luc2lnaHQ/Lmxlbmd0aCAhPT0gMFwiIFtyb3dzXT1cIlBBR0VfU0laRVwiXG4gICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJvcHBvcnR1bml0aWVzSW5zaWdodC5sZW5ndGhcIiBbbGF6eV09XCJ0cnVlXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkFjY291bnQnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5UaXRsZScgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+IHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuUmVhc29uJyB8IHRyYW5zbG9jbyB9fSA8L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWluc2lnaHQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY2NvdW50XCI+XG4gICAgICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiWycvJyArIHN1YnNjcmlwdGlvbj8uc2x1ZyArIHJvdXRlcnMuYWNjb3VudEluZm8sIGluc2lnaHQuY3JtX2FjY291bnRfaWRdXCIgY2xhc3M9XCJuYW1lLWxpbmtcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ2JUb29sdGlwXT1cImluc2lnaHQ/Lm5hbWVcIj57eyBpbnNpZ2h0Py5uYW1lIHwgdGV4dFRydW5jYXRlOjIwIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIlRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJpbnNpZ2h0Py50aXRsZVwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgdG9vbHRpcENsYXNzPVwiY3VzdG9tLXRvb2x0aXBcIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGluc2lnaHQ/LnRpdGxlIHwgdGV4dFRydW5jYXRlOiAyMCB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJSZWFzb25cIj4ge3sgaW5zaWdodC5yZWFzb24gfX0gPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIiAqbmdJZj1cIm9wcG9ydHVuaXRpZXNJbnNpZ2h0Py5sZW5ndGggIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBvcHBvcnR1bml0aWVzSW5zaWdodC5sZW5ndGggfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJvcHBvcnR1bml0aWVzSW5zaWdodD8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBHZW9ncmFwaHkgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zIGFuYWx5dGljc1wiPlxuICAgICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5PcHBvcnR1bml0aWVzIExvY2F0aW9uPC9oNT5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJvcHBvcnR1bml0aWVzR2VvZ3JhcGh5XCI+XG4gICAgICAgICAgPHBsb3RseS1wbG90IFtkYXRhXT1cIm9wcG9ydHVuaXRpZXNHZW9ncmFwaHk/LmRhdGFcIiBbbGF5b3V0XT1cIm9wcG9ydHVuaXRpZXNHZW9ncmFwaHk/LmxheW91dFwiIFtjb25maWddPVwib3Bwb3J0dW5pdGllc0dlb2dyYXBoeT8uY29uZmlnXCIgW3VzZVJlc2l6ZUhhbmRsZXJdPVwib3Bwb3J0dW5pdGllc0dlb2dyYXBoeSA/IHRydWUgOiBmYWxzZVwiPlxuICAgICAgICAgIDwvcGxvdGx5LXBsb3Q+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhb3Bwb3J0dW5pdGllc0dlb2dyYXBoeVwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLk5vSW5zaWdodE1lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgIDwvcHctbm8tZGF0YT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
|
|
256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NtYXJ0LWNybS9zcmMvbGliL3ByaXZhdGUvY29tcG9uZW50cy9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy1saXN0L3NtYXJ0LWNybS1vcHBvcnR1bml0aWVzLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9wcml2YXRlL2NvbXBvbmVudHMvc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMvc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtbGlzdC9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFFBQVEsRUFHWCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBc0MsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBTXhELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTzdELE1BQU0sT0FBTyxrQ0FDVCxTQUFRLGdCQUFnQjtJQXdDeEIsWUFDcUIsVUFBc0IsRUFDdkMsUUFBa0IsRUFDRCxHQUFzQixFQUN0QixjQUE4QjtRQUUvQyxLQUFLLENBQUMsUUFBUSxD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QUssQ0FBQztRQUM3RCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVRLFdBQVc7UUFDaEIsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7K0dBMVFRLGtDQUFrQzttR0FBbEMsa0NBQWtDLDhGQzFCL0MscTRiQWlRQTs7NEZEdk9hLGtDQUFrQztrQkFMOUMsU0FBUzsrQkFDSSxpQ0FBaUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0NoZWNrZWQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEluamVjdG9yLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2UvYXBwLWJhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IFByb2R1Y3RTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBQQUdFX1NJWkUsIFBhZ2luZywgUGxvdGx5LCBTdWJzY3JpcHRpb24sIFVzZXIgfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXV0aWxpdGllcyc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2hlbHBlci1zZXJ2aWNlJztcbmltcG9ydCB7IENybVNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2Uvc21hcnQtY3JtLXNoYXJlZCc7XG5cbmltcG9ydCB7IE9wcG9ydHVuaXR5SW5zaWdodCB9IGZyb20gJ2xpYnMvc21hcnQtY3JtL3NyYy9saWIvc2hhcmVkL2ludGVyZmFjZS9zbWFydC1jcm0tbW9kdWxlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMYXp5TG9hZEV2ZW50IH0gZnJvbSAncHJpbWVuZy9hcGknO1xuXG5pbXBvcnQgeyBDcm1PcHBvcnR1bml0eVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS9jcm0tb3Bwb3J0dW5pdHkuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJPVVRFUlMgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvcm91dGVycy9yb3V0ZXJzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwdy1zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy1saXN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtbGlzdC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNtYXJ0Q3JtT3Bwb3J0dW5pdGllc0xpc3RDb21wb25lbnRcbiAgICBleHRlbmRzIEFwcEJhc2VDb21wb25lbnRcbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkXG57XG4gICAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgc3Vic2NyaXB0aW9uSWQ6IG51bWJlcjtcbiAgICB1c2VyOiBVc2VyO1xuICAgIHVzZXJJZDogbnVtYmVyO1xuXG4gICAgZGF0YTogQ3JtT3Bwb3J0dW5pdHlSZXNwb25zZSA9IHtcbiAgICAgICAgY3JtX29wcG9ydHVuaXRpZXM6IFtdLFxuICAgICAgICBvYmplY3RfY291bnQ6IDAsXG4gICAgICAgIHVuZmlsdGVyZWRfY291bnQ6IDBcbiAgICB9O1xuXG4gICAgdG90YWxzID0ge1xuICAgICAgICB0b3RhbF9tcnI6IDBcbiAgICB9O1xuXG4gICAgb3Bwb3J0dW5pdGllc0luc2lnaHQ6IE9wcG9ydHVuaXR5SW5zaWdodFtdO1xuICAgIG9wcG9ydHVuaXRpZXNHZW9ncmFwaHk6IFBsb3RseS5GaWd1cmU7XG5cbiAgICBpZCA9ICcnO1xuXG4gICAgc2VhcmNoVGV4dCA9ICcnO1xuICAgIHNlYXJjaFN0YWdlczogb2JqZWN0W10gPSBbXTtcbiAgICBzZWFyY2hDYXRlZ29yaWVzOiBvYmplY3RbXSA9IFtdO1xuXG4gICAgZmlsdGVyQnlTdGFnZXM6IHN0cmluZ1tdID0gW107XG4gICAgZmlsdGVyQnlDYXRlZ29yaWVzID0gW107XG5cbiAgICBwYWdlID0gMTtcbiAgICBzdGFnZXMgPSBbXTtcbiAgICBjYXRlZ29yaWVzID0gW107XG5cbiAgICBsb2FkaW5nID0gdHJ1ZTtcbiAgICBpc0xvYWRlZCA9IGZhbHNlO1xuICAgIGhhc0FjY2VzcyA9IGZhbHNlO1xuXG4gICAgcm91dGVycyA9IFJPVVRFUlM7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjcm1TZXJ2aWNlOiBDcm1TZXJ2aWNlLFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwcm9kdWN0U2VydmljZTogUHJvZHVjdFNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmdldEFsbFN0YWdlcygpO1xuICAgICAgICB0aGlzLmdldFVzZXJTdWJzY3JpcHRpb24oKS5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzQWNjZXNzID0gdGhpcy5oYXNBZG1pbkFjY2Vzcyh0aGlzLnN1YnNjcmlwdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mbygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlT3Bwb3J0dW5pdHlTdGFnZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFsbE9wcG9ydHVuaXR5Q2F0ZWdvcmllcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBvbkxhenlMb2FkKGV2ZW50OiBMYXp5TG9hZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHBhZ2VEZXRhaWxzID0gSGVscGVyU2VydmljZS5vblRhYmxlTGF6eUxvYWQoZXZlbnQpO1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlRGV0YWlscy5wYWdlO1xuICAgICAgICB0aGlzLmdldEFsbE9wcG9ydHVuaXRpZXMoe1xuICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkUsXG4gICAgICAgICAgICBvcmRlcl9ieTogcGFnZURldGFpbHMuc29ydEZpZWxkLFxuICAgICAgICAgICAgb3JkZXJfZGlyZWN0aW9uOiBwYWdlRGV0YWlscy5zb3J0T3JkZXIsXG4gICAgICAgICAgICBzZWFyY2g6IHRoaXMuc2VhcmNoVGV4dFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IHVzZXIgZGV0YWlscyAqL1xuICAgIHByaXZhdGUgZ2V0VXNlckluZm8oKSB7XG4gICAgICAgIHRoaXMudXNlclN0b3JlKCkuc3Vic2NyaWJlKHVzZXIgPT4ge1xuICAgICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgICAgICAgICAgICAgIHRoaXMudXNlcklkID0gdXNlci5pZDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uU2VydmljZS5pc0dyYW50ZWQoJ1BhZ2VzLkJldGEnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE9wcG9ydHVuaXRpZXNJbnNpZ2h0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29udGFjdEdlb2dyYXBoeSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBbGxTdGFnZXMocGFnaW5nOiBQYWdpbmcgPSB7fSkge1xuICAgICAgICB0aGlzLmdldFVzZXJTdWJzY3JpcHRpb25JZCgpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSByZXM7XG4gICAgICAgICAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRBbGxTdGFnZXModGhpcy5zdWJzY3JpcHRpb25JZCwgcGFnaW5nKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RhZ2VzID0gcmVzcG9uc2U/LmNybV9vcHBvcnR1bml0eV9zdGFnZXM/Lm1hcChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGVsZW1lbnQubmFtZSA/PyAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uU2VhcmNoT3B0aW9uQ2hhbmdlKGV2ZW50LCBmaWx0ZXJCeTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmaWx0ZXJCeSA9PT0gJ3N0YWdlJykge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJCeVN0YWdlcyA9IGV2ZW50LnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5nZXRBbGxPcHBvcnR1bml0aWVzKHtcbiAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXJCeSA9PT0gJ2NhdGVnb3J5Jykge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJCeUNhdGVnb3JpZXMgPSBldmVudC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZ2V0QWxsT3Bwb3J0dW5pdGllcyh7XG4gICAgICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyRmlsdGVycygpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJCeUNhdGVnb3JpZXMgPSBbXTtcbiAgICAgICAgdGhpcy5maWx0ZXJCeVN0YWdlcyA9IFtdO1xuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5nZXRBbGxPcHBvcnR1bml0aWVzKHtcbiAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QWxsT3Bwb3J0dW5pdGllcyhwYWdpbmc/OiBQYWdpbmcpIHtcbiAgICAgICAgdGhpcy5nZXRVc2VyU3Vic2NyaXB0aW9uSWQoKS5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uSWQgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IHN1YnNjcmlwdGlvbklkO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldEFsbE9wcG9ydHVuaXRpZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJCeUNhdGVnb3JpZXMuam9pbigpIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJCeVN0YWdlcy5qb2luKCkgfHwgJydcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBuZXcgQVBJIHN0cnVjdHVyZSB3aXRoIGl0ZW1zIGFuZCB0b3RhbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5pdGVtcyAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlLml0ZW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JtX29wcG9ydHVuaXRpZXM6IHJlc3BvbnNlLml0ZW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfY291bnQ6IHJlc3BvbnNlLml0ZW1zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5maWx0ZXJlZF9jb3VudDogcmVzcG9uc2UuaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbHM6IHJlc3BvbnNlLnRvdGFsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdG90YWxzIGZyb20gQVBJIHJlc3BvbnNlIG9ubHkgLSBkb24ndCBjYWxjdWxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcCBleHBlY3RlZF9tcnJfdXNkIGZyb20gQVBJIHRvIHRvdGFsX21yciBmb3IgZGlzcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50b3RhbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdGFscyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfbXJyOiB0aGlzLmRhdGEudG90YWxzLmV4cGVjdGVkX21ycl91c2QgfHwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIHRvdGFscyBmcm9tIEFQSSwgc2V0IHRvIDAgKGRvbid0IGNhbGN1bGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdGFscyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfbXJyOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXNQYXN0RGF0ZShkYXRlOiBzdHJpbmcgfCBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlKSA8IG5ldyBEYXRlKCk7XG4gICAgfVxuXG4gICAgb25EZWxldGUoaWQ6IG51bWJlcikge1xuICAgICAgICBIZWxwZXJTZXJ2aWNlLnJhaXNlRGVsZXRlUG9wdXAoKS50aGVuKHJlc3AgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3AudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNybVNlcnZpY2UuZGVsZXRlT3Bwb3J0dW5pdGllcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGlkKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbE9wcG9ydHVuaXRpZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IHRoaXMuc2VhcmNoVGV4dFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5EZWxldGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBnZXQgYXZhaWxhYmxlIG9wcG9ydHVuaXRpZXMgKi9cbiAgICBwcml2YXRlIGdldEF2YWlsYWJsZU9wcG9ydHVuaXR5U3RhZ2VzKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2UuZ2V0QXZhaWxhYmxlT3Bwb3J0dW5pdHlTdGFnZXModGhpcy5zdWJzY3JpcHRpb24/LmlkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGFnZXMgPSByZXNwb25zZT8uYXZhaWxhYmxlX2NybV9vcHBvcnR1bml0eV9zdGFnZXM/Lm1hcChzdGFnZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWdlPy5uYW1lO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBnZXQgYWxsIGNhdGVnb3JpZXMgKi9cbiAgICBwcml2YXRlIGdldEFsbE9wcG9ydHVuaXR5Q2F0ZWdvcmllcygpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlLmdldEFsbE9wcG9ydHVuaXR5Q2F0ZWdvcmllcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3JpZXMgPSByZXNwb25zZT8uY3JtX29wcG9ydHVuaXR5X2NhdGVnb3JpZXM/Lm1hcChjYXRlZ29yeSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNhdGVnb3J5LmlkLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogY2F0ZWdvcnkubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgb3Bwb3J0dW5pdGllcyBpbnNpZ2h0ICovXG4gICAgcHJpdmF0ZSBnZXRPcHBvcnR1bml0aWVzSW5zaWdodCgpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3JtQW5hbHl0aWNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgJ29wcG9ydHVuaXRpZXNfaW5zaWdodHMnKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQVBJIG5vdyByZXR1cm5zIHsgaXRlbXM6IFtdLCB0b3RhbHM6IHt9IH0gaW5zdGVhZCBvZiBhcnJheVxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gcmVzcG9uc2U/Lml0ZW1zIHx8IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbXMgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKGl0ZW1zKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHBvcnR1bml0aWVzSW5zaWdodCA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3Bwb3J0dW5pdGllc0luc2lnaHQgPSBBcnJheS5pc0FycmF5KGl0ZW1zKSA/IGl0ZW1zIDogW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgY29udGFjdCBnZW9ncmFwaHkgKi9cbiAgICBwcml2YXRlIGdldENvbnRhY3RHZW9ncmFwaHkoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENybUFuYWx5dGljcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICdvcHBvcnR1bml0aWVzX2dlb2dyYXBoeScpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBBUEkgbm93IHJldHVybnMgeyBpdGVtczogW10sIHRvdGFsczoge30gfSBpbnN0ZWFkIG9mIGFycmF5L29iamVjdFxuICAgICAgICAgICAgICAgIHRoaXMub3Bwb3J0dW5pdGllc0dlb2dyYXBoeSA9IHJlc3BvbnNlPy5pdGVtcyB8fCByZXNwb25zZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoZWNrUGVybWlzc2lvbihwZXJtaXNzaW9uOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvblNlcnZpY2UuZXZhbHVhdGVQZXJtaXNzaW9ucyhwZXJtaXNzaW9uKTtcbiAgICB9XG5cbiAgICBnZXRNYWluQ3VycmVuY3koKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YT8uY3JtX29wcG9ydHVuaXRpZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuY3JtX29wcG9ydHVuaXRpZXNbMF0/LmN1cnJlbmN5IHx8ICdVU0QnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnVVNEJztcbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItM1wiPlxuICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5IGZsb2F0LWVuZFwiIGRhdGEtY3k9XCJhZGQtb3Bwb3J0dW5pdGllc1wiXG4gICAgICBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5vcHBvcnR1bml0eUFkZF1cIj5cbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1cy1jaXJjbGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+IHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuQWRkT3Bwb3J0dW5pdHknIHwgdHJhbnNsb2NvIH19XG4gICAgPC9hPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIG10LTNcIiAqbmdJZj1cIiFpc0xvYWRlZFwiPlxuICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIiBbY2xhc3MuaGlkZVRhYmxlXT1cImRhdGEudW5maWx0ZXJlZF9jb3VudCA9PT0gMFwiPlxuICAgICAgPHAtdGFibGUgI2R0IFt2YWx1ZV09XCJkYXRhLmNybV9vcHBvcnR1bml0aWVzXCIgW3BhZ2luYXRvcl09XCJkYXRhLm9iamVjdF9jb3VudCAhPT0gMFwiIFtsYXp5XT1cInRydWVcIiBbcm93c109XCJQQUdFX1NJWkVcIlxuICAgICAgICBjbGFzcz1cImNvbnRhY3QtdGFibGVcIiBbdG90YWxSZWNvcmRzXT1cImRhdGEub2JqZWN0X2NvdW50XCIgW2xvYWRpbmddPVwibG9hZGluZ1wiIGZpbHRlckRlbGF5PVwiMTAwMFwiXG4gICAgICAgIChvbkxhenlMb2FkKT1cIm9uTGF6eUxvYWQoJGV2ZW50KVwiIFtjdXN0b21Tb3J0XT1cInRydWVcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTMgY29sLTZcIj5cbiAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQ2F0ZWdvcnlcIiBbb3B0aW9uc109XCJjYXRlZ29yaWVzXCIgWyhuZ01vZGVsKV09XCJmaWx0ZXJCeUNhdGVnb3JpZXNcIlxuICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvblNlYXJjaE9wdGlvbkNoYW5nZSgkZXZlbnQsICdjYXRlZ29yeScpXCIgW2ZpbHRlcl09XCJ0cnVlXCIgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMyBjb2wtNiBtYi0yIG1iLXNtLTBcIj5cbiAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBTdGFnZVwiIFtvcHRpb25zXT1cInNlYXJjaFN0YWdlc1wiIFsobmdNb2RlbCldPVwiZmlsdGVyQnlTdGFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25TZWFyY2hPcHRpb25DaGFuZ2UoJGV2ZW50LCAnc3RhZ2UnKVwiIFtmaWx0ZXJdPVwidHJ1ZVwiIFtzaG93SGVhZGVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCI+XG4gICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIEVtcHR5IGNvbHVtbiBvY2N1cHlpbmcgdGhlIHNhbWUgc3BhY2UgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTMgY29sLTZcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMyBjb2wtbWQtNCBjb2wtbGctMyBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoIG10LTIgbWUtMlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIHBJbnB1dFRleHQgcGxhY2Vob2xkZXI9XCJTZWFyY2ggb3Bwb3J0dW5pdGllcy4uXCJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiZHQuZmlsdGVyR2xvYmFsKCRldmVudC50YXJnZXQudmFsdWUsICdjb250YWlucycpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLW9wcG9ydHVuaXRpZXMtc2VhcmNoLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWZpbHRlclwiPlxuICAgICAgICAgICAgPGEgY2xhc3M9XCJtdC0zIG1zLTMgdGV4dC1zdGFydCBidG4tZmlsdGVyLXByaW1hcnlcIiAoY2xpY2spPVwiY2xlYXJGaWx0ZXJzKClcIj5DbGVhciBhbGwgZmlsdGVyczwvYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIiBwU29ydGFibGVDb2x1bW49XCJ0aXRsZVwiPiB7eyAnQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLlRpdGxlJyB8IHRyYW5zbG9jbyB9fSA8cC1zb3J0SWNvblxuICAgICAgICAgICAgICAgIGZpZWxkPVwidGl0bGVcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiIHBTb3J0YWJsZUNvbHVtbj1cImNybV9jb250YWN0X2lkXCI+IHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuQ29udGFjdCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJjcm1fY29udGFjdF9pZFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCIgcFNvcnRhYmxlQ29sdW1uPVwiY3JtX2FjY291bnRfaWRcIj4ge3sgJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5BY2NvdW50JyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cImNybV9hY2NvdW50X2lkXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIiBwU29ydGFibGVDb2x1bW49XCJvbmVfdGltZV9hbW91bnRcIj4ge3sgJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5PbmVUaW1lQW1vdW50JyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICB9fSA8cC1zb3J0SWNvbiBmaWVsZD1cIm9uZV90aW1lX2Ftb3VudFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJtcnItaGVhZGVyXCIgc2NvcGU9XCJ0cnVlXCIgcFNvcnRhYmxlQ29sdW1uPVwibW9udGhseV9hbW91bnRcIj4ge3sgJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5NUlInIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgIH19IDxwLXNvcnRJY29uIGZpZWxkPVwibW9udGhseV9hbW91bnRcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiIHBTb3J0YWJsZUNvbHVtbj1cIndpbl9jaGFuY2VzXCI+IHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuV2luQ2hhbmNlJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cIndpbl9jaGFuY2VzXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIiBwU29ydGFibGVDb2x1bW49XCJjcm1fb3Bwb3J0dW5pdHlfY2F0ZWdvcnlfaWRzXCI+IHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuQ2F0ZWdvcmllcycgfFxuICAgICAgICAgICAgICB0cmFuc2xvY28gfX0gPHAtc29ydEljb24gZmllbGQ9XCJjcm1fb3Bwb3J0dW5pdHlfY2F0ZWdvcnlfaWRzXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiIHBTb3J0YWJsZUNvbHVtbj1cImNybV9vcHBvcnR1bml0eV9zdGFnZV9pZFwiPiB7eyAnQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLlN0YWdlJyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgIH19IDxwLXNvcnRJY29uIGZpZWxkPVwiY3JtX29wcG9ydHVuaXR5X3N0YWdlX2lkXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiIHBTb3J0YWJsZUNvbHVtbj1cInN0YXJ0aW5nX2F0XCI+IHt7ICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuU3RhcnRpbmdBdCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJzdGFydGluZ19hdFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJhY3Rpb25zLWxpc3QtdHdvXCIgc2NvcGU9XCJ0cnVlXCI+IHt7ICdMYWJlbC5BY3Rpb25zJyB8IHRyYW5zbG9jbyB9fSAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW9wcG9ydHVuaXRpZXMgbGV0LWk9XCJyb3dJbmRleFwiPlxuICAgICAgICAgIDwhLS0gVG90YWxzIHJvdyBhdCB0aGUgdG9wIChmaXJzdCByb3cpIC0gc2hvdyBiZWZvcmUgZmlyc3QgZGF0YSByb3cgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgPT09IDAgJiYgZGF0YT8uY3JtX29wcG9ydHVuaXRpZXM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPHRyIGNsYXNzPVwidG90YWxzLXJvd1wiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjlmYTsgZm9udC13ZWlnaHQ6IGJvbGQ7XCI+XG4gICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJleHBlY3RlZC1tcnJcIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IHRvdGFscz8udG90YWxfbXJyIC8gMTAwIHwgY3VycmVuY3k6ICdVU0QnIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPCEtLSBSZWd1bGFyIGRhdGEgcm93IC0tPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJUaXRsZVwiPlxuICAgICAgICAgICAgICA8YSBbbmdiVG9vbHRpcF09XCJvcHBvcnR1bml0aWVzPy50aXRsZVwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBY2Nlc3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcG9ydHVuaXRpZXM/Lm93bmVyX2lkID09PSB1c2VySWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUGVybWlzc2lvbignUGFnZXMuUHJvZHVjdC5DUk0uUm9sZS5BZG1pbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJyArIHN1YnNjcmlwdGlvbj8uc2x1ZyArIHJvdXRlcnMub3Bwb3J0dW5pdHlJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bwb3J0dW5pdGllcy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgb3Bwb3J0dW5pdGllcz8udGl0bGUgfCB0ZXh0VHJ1bmNhdGU6IDE1IH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8YSAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc0FjY2VzcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bwb3J0dW5pdGllcz8ub3duZXJfaWQgIT09IHVzZXJJZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKCdQYWdlcy5Qcm9kdWN0LkNSTS5Sb2xlLkFkbWluJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+IHt7IG9wcG9ydHVuaXRpZXM/LnRpdGxlIHwgdGV4dFRydW5jYXRlOiAxNSB9fSA8L2E+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiY29udGFjdG5hbWVcIiBkYXRhLWhlYWQ9XCJDcm0gQ29udGFjdFwiPlxuICAgICAgICAgICAgICA8YSAqbmdJZj1cIm9wcG9ydHVuaXRpZXM/LmNybV9jb250YWN0X2lkXCIgW3JvdXRlckxpbmtdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcG9ydHVuaXRpZXMuY3JtX2NvbnRhY3RfaWQuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiPnt7IG9wcG9ydHVuaXRpZXMuY3JtX2NvbnRhY3Q/LmZpcnN0X25hbWUgKyAnICcgK1xuICAgICAgICAgICAgICAgIG9wcG9ydHVuaXRpZXMuY3JtX2NvbnRhY3Q/Lmxhc3RfbmFtZSB9fTwvYT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiQWNjb3VudFwiPlxuICAgICAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmFjY291bnRJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bwb3J0dW5pdGllcy5jcm1fYWNjb3VudC5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXCI+e3sgb3Bwb3J0dW5pdGllcy5jcm1fYWNjb3VudC5uYW1lIH19PC9hPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBbW91bnRcIj4ge3sgb3Bwb3J0dW5pdGllcy5vbmVfdGltZV9hbW91bnQgLyAxMDAgfCBjdXJyZW5jeTogb3Bwb3J0dW5pdGllcz8uY3VycmVuY3kgfX0gPC90ZD5cbiAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJNUlJcIiBjbGFzcz1cImV4cGVjdGVkLW1yclwiPiB7eyBvcHBvcnR1bml0aWVzLm1vbnRobHlfYW1vdW50IC8gMTAwIHwgY3VycmVuY3k6IG9wcG9ydHVuaXRpZXM/LmN1cnJlbmN5IH19IDwvdGQ+XG4gICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiV2luQ2hhbmNlXCI+XG4gICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsndGV4dC1kYW5nZXInOiBvcHBvcnR1bml0aWVzLndpbl9jaGFuY2VzIDwgMzAsICd0ZXh0LXN1Y2Nlc3MgZnctYm9sZCc6IG9wcG9ydHVuaXRpZXMud2luX2NoYW5jZXMgPjcwfVwiPlxuICAgICAgICAgICAgICAgIHt7IG9wcG9ydHVuaXRpZXMud2luX2NoYW5jZXMgLyAxMDAgfCBwZXJjZW50IH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwib3Bwb3J0dW5pdGllcy5jYW5jZWxsZWRcIj4hQ2FuY2VsbGVkITwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiQ2F0ZWdvcmllc1wiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgY2F0ZWdvcnkgb2Ygb3Bwb3J0dW5pdGllcz8uY3JtX29wcG9ydHVuaXR5X2NhdGVnb3JpZXNcIiBjbGFzcz1cImJhZGdlIG1zLTFcIlxuICAgICAgICAgICAgICAgIFthcHBEeW5hbWljQmFkZ2VdPVwieyBpdGVtc0FycmF5OiBjYXRlZ29yaWVzLCBpdGVtOiBjYXRlZ29yeT8ubmFtZSB9XCIgY29sb3I9XCJibHVlLWdyZXlcIj57eyBjYXRlZ29yeT8ubmFtZVxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJTdGFnZVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlXCIgW2FwcER5bmFtaWNCYWRnZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0FycmF5OiBzdGFnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBvcHBvcnR1bml0aWVzPy5jcm1fb3Bwb3J0dW5pdHlfc3RhZ2U/Lm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIGNvbG9yPVwiY3lhblwiPnt7IG9wcG9ydHVuaXRpZXM/LmNybV9vcHBvcnR1bml0eV9zdGFnZT8ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiU3RhcnRpbmcgQXRcIiBbbmdDbGFzc109XCJ7J3RleHQtZGFuZ2VyJzogaXNQYXN0RGF0ZShvcHBvcnR1bml0aWVzLnN0YXJ0aW5nX2F0KX1cIj4ge3sgb3Bwb3J0dW5pdGllcy5zdGFydGluZ19hdCB8IGRhdGVGb3JtYXQgfX0gPC90ZD5cbiAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY3Rpb25cIj5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZCBsaXN0LWlubGluZSBsaXN0LWFjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNBY2Nlc3MgfHwgb3Bwb3J0dW5pdGllcz8ub3duZXJfaWQgPT09IHVzZXJJZFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqcmJhY0FsbG93PVwiJ1N1YnNjcmlwdGlvbkFkbWluJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGkgbmdiVG9vbHRpcD1cIkVkaXRcIiBjbGFzcz1cIm1lLTIgbWUtc20tM1wiIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJyArIHN1YnNjcmlwdGlvbj8uc2x1ZyArIHJvdXRlcnMub3Bwb3J0dW5pdGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcG9ydHVuaXRpZXMuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWRpdCBlZGl0LWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKnJiYWNBbGxvdz1cIidTdWJzY3JpcHRpb25BZG1pbidcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpIG5nYlRvb2x0aXA9XCJEZWxldGVcIiBjbGFzcz1cIm1lLTIgbWUtc20tM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb25cIiAgIChrZXlkb3duLmVudGVyKT1cIm9uRGVsZXRlKG9wcG9ydHVuaXRpZXMuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJvbkRlbGV0ZShvcHBvcnR1bml0aWVzLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlKG9wcG9ydHVuaXRpZXMuaWQpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICAgICAgICA8dHIgKm5nSWY9XCJkYXRhPy5jcm1fb3Bwb3J0dW5pdGllcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImV4cGVjdGVkLW1yclwiPlxuICAgICAgICAgICAgICA8c3Ryb25nPnt7IHRvdGFscz8udG90YWxfbXJyIC8gMTAwIHwgY3VycmVuY3k6ICdVU0QnIH19PC9zdHJvbmc+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9wLXRhYmxlPlxuICAgICAgPGRpdiAqbmdJZj1cImRhdGEub2JqZWN0X2NvdW50ID09PSAwICYmIGRhdGEudW5maWx0ZXJlZF9jb3VudCAhPT0gMFwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInU2VhcmNoLk5vRGF0YU1lc3NhZ2UnfCB0cmFuc2xvY29cIiBbZGVzY3JpcHRpb25dPVwiJ1NlYXJjaC5Ob0RhdGFEZXNjcmlwdGlvbicgfCB0cmFuc2xvY29cIiA+XG4gICAgICAgIDwvcHctbm8tZGF0YT5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgKm5nSWY9XCJkYXRhLm9iamVjdF9jb3VudCAhPT0gMFwiPnt7ICdMYWJlbC5Ub3RhbCcgfCB0cmFuc2xvY28gfX06IHt7IGRhdGEub2JqZWN0X2NvdW50IH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiAqbmdJZj1cImRhdGEudW5maWx0ZXJlZF9jb3VudCA9PT0gMCAmJiBpc0xvYWRlZFwiPlxuICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLk5vT3Bwb3J0dW5pdGllc01lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+XG4gIDwvcHctbm8tZGF0YT5cbjwvZGl2PlxuPG5nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cInJvdyBtdC01XCIgKm5nSWY9XCJpc0xvYWRlZFwiPlxuICAgIDwhLS0gRHJpbGwgRG93biAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02IG1iLTMgYW5hbHl0aWNzXCI+XG4gICAgICA8aDUgY2xhc3M9XCJhY2NvcmRpb24taGVhZGluZ1wiPldhdGNoIENsb3NlbHk8L2g1PlxuICAgICAgPGRpdiBjbGFzcz1cInByaW1lbmctZGF0YXRhYmxlLWNvbnRhaW5lciB0YWJsZS1yZXNwb25zaXZlXCIgKm5nSWY9XCJvcHBvcnR1bml0aWVzSW5zaWdodD8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIiAjZHQgW3ZhbHVlXT1cIm9wcG9ydHVuaXRpZXNJbnNpZ2h0XCIgW3BhZ2luYXRvcl09XCJvcHBvcnR1bml0aWVzSW5zaWdodD8ubGVuZ3RoICE9PSAwXCIgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcbiAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cIm9wcG9ydHVuaXRpZXNJbnNpZ2h0Lmxlbmd0aFwiIFtsYXp5XT1cInRydWVcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQWNjb3VudCcgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LlRpdGxlJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj4ge3sgJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5SZWFzb24nIHwgdHJhbnNsb2NvIH19IDwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtaW5zaWdodD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkFjY291bnRcIj5cbiAgICAgICAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJbJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5hY2NvdW50SW5mbywgaW5zaWdodC5jcm1fYWNjb3VudF9pZF1cIiBjbGFzcz1cIm5hbWUtbGlua1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW25nYlRvb2x0aXBdPVwiaW5zaWdodD8ubmFtZVwiPnt7IGluc2lnaHQ/Lm5hbWUgfCB0ZXh0VHJ1bmNhdGU6MjAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiVGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cImluc2lnaHQ/LnRpdGxlXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICB0b29sdGlwQ2xhc3M9XCJjdXN0b20tdG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgaW5zaWdodD8udGl0bGUgfCB0ZXh0VHJ1bmNhdGU6IDIwIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIlJlYXNvblwiPiB7eyBpbnNpZ2h0LnJlYXNvbiB9fSA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtdGFibGU+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtcmVjb3Jkcy1jb3VudFwiICpuZ0lmPVwib3Bwb3J0dW5pdGllc0luc2lnaHQ/Lmxlbmd0aCAhPT0gMFwiPnt7ICdMYWJlbC5Ub3RhbCcgfCB0cmFuc2xvY28gfX06IHt7IG9wcG9ydHVuaXRpZXNJbnNpZ2h0Lmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIm9wcG9ydHVuaXRpZXNJbnNpZ2h0Py5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5Ob0luc2lnaHRNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIEdlb2dyYXBoeSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02IG1iLTMgYW5hbHl0aWNzXCI+XG4gICAgICA8aDUgY2xhc3M9XCJhY2NvcmRpb24taGVhZGluZ1wiPk9wcG9ydHVuaXRpZXMgTG9jYXRpb248L2g1PlxuICAgICAgPGRpdj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIm9wcG9ydHVuaXRpZXNHZW9ncmFwaHlcIj5cbiAgICAgICAgICA8cGxvdGx5LXBsb3QgW2RhdGFdPVwib3Bwb3J0dW5pdGllc0dlb2dyYXBoeT8uZGF0YVwiIFtsYXlvdXRdPVwib3Bwb3J0dW5pdGllc0dlb2dyYXBoeT8ubGF5b3V0XCIgW2NvbmZpZ109XCJvcHBvcnR1bml0aWVzR2VvZ3JhcGh5Py5jb25maWdcIiBbdXNlUmVzaXplSGFuZGxlcl09XCJvcHBvcnR1bml0aWVzR2VvZ3JhcGh5ID8gdHJ1ZSA6IGZhbHNlXCI+XG4gICAgICAgICAgPC9wbG90bHktcGxvdD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIiFvcHBvcnR1bml0aWVzR2VvZ3JhcGh5XCI+XG4gICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=
|
|
@@ -29,7 +29,7 @@ export class CrmSignupComponent extends AppBaseComponent {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: CrmSignupComponent, deps: [{ token: i1.AuthService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
32
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: CrmSignupComponent, selector: "pw-crm-signup", usesInheritance: true, ngImport: i0, template: "<div class=\"container-fluid register\">\n <div class=\"register-container row h-100\">\n <div class=\"col-8 col-xl-9 col-md-7 col-lg-8 register-outer\">\n <h1 class=\"my-5\">\n Not just a CRM <br />\n but\n <span data-period=\"3000\"\n class=\"txt-rotate\"\n [attr.data-rotate]=\"[\n 'Qualified Leads',\n 'New Prospects',\n 'New Business Opportunities'\n ]\"></span>\n <span class=\"blinking-cursor\">|</span>\n <br />regularly delivered to you\n </h1>\n\n <h3 class=\"my-5\">\n We use growth hacking tools - mainly crawlers and machine learning - to automate the\n sourcing of new prospect lists.\n </h3>\n\n <div class=\"row services\">\n <div class=\"col-lg-6 col-md-12 service-desc service-image\">\n <figure>\n <img src=\"/assets/img/products/smart-crm/crm-effective-solution.png\"\n alt=\"Effective Solution\"\n class=\"img-fluid\" />\n </figure>\n </div>\n <div class=\"col-lg-6 col-md-12 service-desc product-features text-start\">\n <h2><span>A More Effective</span> solution to increase your sales funnel.</h2>\n <p>Our proprietary technology automates the sourcing of new leads.</p>\n\n <ul class=\"list-unstyled\">\n <li>\n <span class=\"icon-check branding-color\"></span> Stop wasting time\n searching for new prospects. Let us automate the process instead.\n </li>\n <li>\n <span class=\"icon-check branding-color\"></span> We provide all you need\n to contact prospects effectively.\n </li>\n <li>\n <span class=\"icon-check branding-color\"></span> Focus on what's really\n important - talking to your clients.\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"row services\">\n <div class=\"col-lg-6 col-md-12 service-desc product-features text-start\">\n <h2>The full power of <span>Machine Learning</span>.</h2>\n <p>\n We have built a system that is able to understand when a prospect is most\n likely to be looking for new vendors.\n </p>\n <ul class=\"list-unstyled\">\n <li>\n <span class=\"icon-check branding-color\"></span> Don't waste time. Reach\n out to prospects at exactly the right moment.\n </li>\n <li>\n <span class=\"icon-check branding-color\"></span> Let us tell you the most\n efficient way to engage in conversation with your prospect.\n </li>\n <li>\n <span class=\"icon-check branding-color\"></span> Maximize the chances to\n convert the prospect into a paying customer.\n </li>\n </ul>\n </div>\n <div class=\"col-lg-6 col-md-12 service-image\">\n <figure>\n <img src=\"/assets/img/products/smart-crm/crm-machine-learning.png\"\n alt=\"Machine Learning\"\n class=\"img-fluid\" />\n </figure>\n </div>\n </div>\n </div>\n\n <div class=\"register-right-wrapper\">\n <div class=\"register-right\">\n <ul class=\"nav nav-tabs nav-justified\" aria-label=\"Tab navigation\">\n <li class=\"nav-item\">\n <a class=\"nav-link active\"\n id=\"login-tab\"\n data-bs-toggle=\"tab\"\n href=\"#login\"\n role=\"tab\"\n aria-controls=\"login\"\n aria-selected=\"true\">Login</a>\n </li>\n <li class=\"nav-item\">\n <a class=\"nav-link\"\n id=\"join-tab\"\n data-bs-toggle=\"tab\"\n href=\"#join\"\n role=\"tab\"\n aria-controls=\"join\"\n aria-selected=\"false\">Interested?</a>\n </li>\n </ul>\n\n <div class=\"tab-content social-inline\">\n <div class=\"tab-pane fade show\"\n id=\"join\"\n role=\"tabpanel\"\n aria-labelledby=\"join-tab\">\n <h3>\n Contact us for a demo.<br />\n It's worth more than a 1000 words.\n </h3>\n <pw-contact-us [masterProductId]=\"masterProductId\"\n [productKey]=\"productKey\"\n [subject]=\"subject\"></pw-contact-us>\n </div>\n\n <div class=\"tab-pane fade show active\"\n id=\"login\"\n role=\"tabpanel\"\n aria-labelledby=\"login-tab\">\n <h3>Welcome back</h3>\n <pw-login></pw-login>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.register{background:#fff url(/assets/img/landing-page/testimonial-bg.png) fixed center top;background-size:100%;min-height:100vh;opacity:0;padding:40px}.register ul{border-top-left-radius:10px;border-top-right-radius:10px}.register ul.nav-tabs li{margin-bottom:-2px}.register ul.nav-tabs li:last-child a{border-top-right-radius:10px}.register ul.nav-tabs li:first-child a{border-top-left-radius:10px}.register ul.nav-tabs li a{background-color:#fff;border:0;border-radius:10px 10px 0 0;color:#000;font-family:Roboto,sans-serif;outline:none}.register ul.nav-tabs li a.active{background-color:#36c283;color:#fff}.register-container{margin:0 auto;max-width:100%;padding-right:15px}.register-container h1{color:#45d292}.register-container h3{color:var(--text)}.register-outer{color:#fff;padding-right:50px;text-align:center}.register-outer .logo-div{text-align:left}.register-outer .logo-div img{margin-bottom:0}.register-outer.fixed{position:absolute;top:8%;width:62%}.register-outer .txt-rotate{color:var(--text)}.register-outer input{background:#f8f9fa;border:0;border-radius:1.5rem;color:#383d41;cursor:pointer;font-weight:700;margin-bottom:3%;margin-top:30%;padding:2%;width:60%}.register-outer img{animation:mover 2s infinite alternate;margin-bottom:5%}.register-right{background:#f8f9fa;border-radius:10px;box-shadow:0 0 2px #00000080;flex:0 0 25%;margin-left:0!important;max-width:350px;padding:0;position:fixed;right:50px;top:20%;width:100%}.register-form{position:relative}.register-form iframe{left:50%;position:absolute;transform:translate(-50%) scale(.8)}.card{background-color:#fff;border-radius:20px;box-shadow:0 0 5px 1px #0003}.card-header i{background-color:var(--second);border-radius:50px;box-shadow:0 0 5px 2px #0003;color:#fff;font-size:20px;height:60px;padding:20px;width:60px}.card-block{color:var(--text);font:14px/1.5 Roboto,sans-serif}form .form-control{border-radius:50px;font-size:13px}form input[type=submit]{font-size:16px;margin-bottom:20px;padding:8px 30px}.tab-content{background-color:#fff;border-bottom-left-radius:10px;border-bottom-right-radius:10px;border-top:6px solid var(--second);padding:20px!important}.tab-content h3{font-size:20px;margin:30px 0;text-align:center;text-transform:uppercase}.tab-content form .form-control{border-radius:50px;font-size:13px}.tab-content form input[type=submit]{font-size:16px;margin-bottom:20px;padding:8px 30px}.form-check-input{cursor:pointer;height:100%;left:0;opacity:0;top:0;z-index:1}label{font:400 13px/1.3 Roboto,sans-serif;text-transform:none}label:after,label:before{top:0}.blinking-cursor{animation:1s blink step-end infinite;font-size:40px;font-weight:100}.product-features{color:var(--text);letter-spacing:.3px}.product-features.service-desc h2{font-size:32px;font-weight:700}.product-features.service-desc h2 span{color:var(--second)}.product-features .product-features ul li span{margin-right:15px}.product-features .branding-color{color:var(--second)}.product-features .icon-check:before{content:\"\\e080\"}.product-features p{color:var(--text);font-size:18px;font-weight:400;line-height:27px}.product-features ul li{align-items:center;-webkit-box-align:center;display:flex;-ms-flex-align:center;font-size:18px;line-height:25px;margin:0 0 15px}.product-features ul li span{margin-right:15px}.services{padding:50px 0}.forgot-pwd{color:#2e3238;font-size:.8rem;text-decoration:underline}.resource-container{padding:0!important}.resource-container .register-container{min-height:100vh!important}.resource-container .services{padding:0}.resource-container .services .service-points{font-size:18px;line-height:1.15em}.resource-container .branding-color{color:#fff}.resource-container .product-features ul li{color:#fff!important;margin:0 0 15px}.resource-container .register-outer{background:linear-gradient(var(--first),var(--second))}.resource-container .register-outer h1,.resource-container .register-outer h2,.resource-container .register-outer h3,.resource-container .register-outer p{color:#fff!important}.resource-container .register-right .tab-content{border-top:6px solid var(--first)}.resource-container .register-right .tab-content h3{color:var(--first);font-weight:700}.resource-container .register-right ul.nav-tabs li a.active{background-color:var(--first)}.vendor-container{padding:0!important}.vendor-container .register-outer h1{color:var(--first)}.vendor-container .service-points{font-size:18px;line-height:1.15em}.vendor-container .branding-color{color:var(--first)!important}.vendor-container .register-right .tab-content{border-top:6px solid var(--first)}.vendor-container .register-right .tab-content h3{color:var(--first);font-weight:700}.vendor-container .register-right ul.nav-tabs li a.active{background-color:var(--first)}.vendor-container .form-container{background-image:url(/assets/img/products/trial/login-form-background-img.png)}@keyframes blink{0%{color:transparent}50%{color:#45d292}to{color:transparent}}@media (max-width: 991px){.services{padding:25px 0}}@media only screen and (max-width: 768px){.register-container{max-width:100%;padding-right:0}.service-image{display:none}.register-outer{margin-top:30px;order:2;padding-right:0;transform:none}.register-outer h1{font-size:30px;padding:0}.register-outer h2{font-size:22px}.register-right{margin-top:10px;order:1;position:unset;top:0;transform:translateY(0)}.register-right,.register-outer{flex:100%;max-width:100%;width:100%}.product-features.service-desc h2{font-size:30px!important}.vendor-container .logo-div img{margin-bottom:0!important;padding-right:65px}.vendor-container .form-container{background:none}}app-social-login{padding:0 15px;width:100%}@media only screen and (min-width: 768px){.register-left{padding-right:40px}}@media only screen and (max-width: 480px){.register{padding:10px}.vendor-container{padding:10px!important}.vendor-container .form-container{padding:0!important}}@media screen and (min-width: 769px){.vendor-container .form-container{background-size:cover;height:100vh;position:fixed;right:0}}@media screen and (max-width: 768px){.vendor-container{background-image:url(/assets/img/products/c/login-form-background-img.png);background-position:right;background-repeat:no-repeat;background-size:60vw 100%}.vendor-container h3{letter-spacing:.03px;line-height:27px}.vendor-container .product-features li{margin:0 0 15px!important}}@media screen and (max-width: 575px){.vendor-container .logo-div{margin:0 auto 30px;text-align:center;width:300px}.vendor-container .logo-div img{margin-top:0!important;padding-right:0!important}}@media (min-width: 768px) and (max-width: 768px){.logo-div img{flex:0 0 33.3333%;max-width:33.3333%}}@media (min-width: 769px) and (max-width: 820px){.register-outer{flex:0 0 50%;max-width:50%}}@media (min-width: 1200px) and (max-width: 1280px){.register-outer{flex:0 0 66.6667%;max-width:66.6667%}}pw-signup-tabs-a{width:100%}.register-right-wrapper{width:100%}.register-outer.fixed{position:static}@media (min-width: 1600px){.register-right-wrapper{display:flex;justify-content:flex-end;width:100%}.register-right{right:auto}.register-container{max-width:85%}.register-container .form-container{background:none;position:static;right:auto}}@media (min-width: 1800px){.register-container{max-width:73%}}@media (min-width: 2560px){.register-container{max-width:65%}}.wrapper-register-content{margin-top:50px;padding:0!important}.wrapper-register-content .register-outer{margin:0 auto!important;padding:0 3rem!important}.primary-header h1,.blinking-text-wrapper h1{color:#45d292}.primary-header h3,.blinking-text-wrapper h3,.primary-header .txt-rotate,.blinking-text-wrapper .txt-rotate{color:var(--text)}.primary-header .blinking-cursor,.blinking-text-wrapper .blinking-cursor{animation:1s blink step-end infinite;font-size:40px;font-weight:100}.tech-features-wrapper .container{padding-left:20px!important;padding-right:20px!important}.tech-features-wrapper section{padding:70px 0}.tech-features-wrapper section.blinking-text-wrapper{padding:100px 0}@media (max-width: 768px){.tech-features-wrapper section{padding:40px 0}.tech-features-wrapper section.blinking-text-wrapper{padding:50px 0}}.testimonial-bg{background:#fff url(/assets/img/landing-page/testimonial-bg.png) fixed center top;background-size:100%}\n"], dependencies: [{ kind: "component", type: i2.ContactUsComponent, selector: "pw-contact-us", inputs: ["productKey", "subject", "masterProductId", "gaEventObj"] }, { kind: "component", type: i2.ProductLoginComponent, selector: "pw-login", inputs: ["gaEventObj", "googleCode"] }] }); }
|
|
32
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: CrmSignupComponent, selector: "pw-crm-signup", usesInheritance: true, ngImport: i0, template: "<div class=\"container-fluid register\">\n <div class=\"register-container row h-100\">\n <div class=\"col-8 col-xl-9 col-md-7 col-lg-8 register-outer\">\n <h1 class=\"my-5\">\n Not just a CRM <br />\n but\n <span data-period=\"3000\"\n class=\"txt-rotate\"\n [attr.data-rotate]=\"[\n 'Qualified Leads',\n 'New Prospects',\n 'New Business Opportunities'\n ]\"></span>\n <span class=\"blinking-cursor\">|</span>\n <br />regularly delivered to you\n </h1>\n\n <h3 class=\"my-5\">\n We use growth hacking tools - mainly crawlers and machine learning - to automate the\n sourcing of new prospect lists.\n </h3>\n\n <div class=\"row services\">\n <div class=\"col-lg-6 col-md-12 service-desc service-image\">\n <figure>\n <img src=\"/assets/img/products/smart-crm/crm-effective-solution.png\"\n alt=\"Effective Solution\"\n class=\"img-fluid\" />\n </figure>\n </div>\n <div class=\"col-lg-6 col-md-12 service-desc product-features text-start\">\n <h2><span>A More Effective</span> solution to increase your sales funnel.</h2>\n <p>Our proprietary technology automates the sourcing of new leads.</p>\n\n <ul class=\"list-unstyled\">\n <li>\n <span class=\"icon-check branding-color\"></span> Stop wasting time\n searching for new prospects. Let us automate the process instead.\n </li>\n <li>\n <span class=\"icon-check branding-color\"></span> We provide all you need\n to contact prospects effectively.\n </li>\n <li>\n <span class=\"icon-check branding-color\"></span> Focus on what's really\n important - talking to your clients.\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"row services\">\n <div class=\"col-lg-6 col-md-12 service-desc product-features text-start\">\n <h2>The full power of <span>Machine Learning</span>.</h2>\n <p>\n We have built a system that is able to understand when a prospect is most\n likely to be looking for new vendors.\n </p>\n <ul class=\"list-unstyled\">\n <li>\n <span class=\"icon-check branding-color\"></span> Don't waste time. Reach\n out to prospects at exactly the right moment.\n </li>\n <li>\n <span class=\"icon-check branding-color\"></span> Let us tell you the most\n efficient way to engage in conversation with your prospect.\n </li>\n <li>\n <span class=\"icon-check branding-color\"></span> Maximize the chances to\n convert the prospect into a paying customer.\n </li>\n </ul>\n </div>\n <div class=\"col-lg-6 col-md-12 service-image\">\n <figure>\n <img src=\"/assets/img/products/smart-crm/crm-machine-learning.png\"\n alt=\"Machine Learning\"\n class=\"img-fluid\" />\n </figure>\n </div>\n </div>\n </div>\n\n <div class=\"register-right-wrapper\">\n <div class=\"register-right\">\n <ul class=\"nav nav-tabs nav-justified\" aria-label=\"Tab navigation\">\n <li class=\"nav-item\">\n <a class=\"nav-link active\"\n id=\"login-tab\"\n data-bs-toggle=\"tab\"\n href=\"#login\"\n role=\"tab\"\n aria-controls=\"login\"\n aria-selected=\"true\">Login</a>\n </li>\n <li class=\"nav-item\">\n <a class=\"nav-link\"\n id=\"join-tab\"\n data-bs-toggle=\"tab\"\n href=\"#join\"\n role=\"tab\"\n aria-controls=\"join\"\n aria-selected=\"false\">Interested?</a>\n </li>\n </ul>\n\n <div class=\"tab-content social-inline\">\n <div class=\"tab-pane fade show\"\n id=\"join\"\n role=\"tabpanel\"\n aria-labelledby=\"join-tab\">\n <h3>\n Contact us for a demo.<br />\n It's worth more than a 1000 words.\n </h3>\n <pw-contact-us [masterProductId]=\"masterProductId\"\n [productKey]=\"productKey\"\n [subject]=\"subject\"></pw-contact-us>\n </div>\n\n <div class=\"tab-pane fade show active\"\n id=\"login\"\n role=\"tabpanel\"\n aria-labelledby=\"login-tab\">\n <h3>Welcome back</h3>\n <pw-login></pw-login>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.register{background:#fff url(/assets/img/landing-page/testimonial-bg.png) fixed center top;background-size:100%;min-height:100vh;opacity:0;padding:40px}.register ul{border-top-left-radius:10px;border-top-right-radius:10px}.register ul.nav-tabs li{margin-bottom:-2px}.register ul.nav-tabs li:last-child a{border-top-right-radius:10px}.register ul.nav-tabs li:first-child a{border-top-left-radius:10px}.register ul.nav-tabs li a{background-color:#fff;border:0;border-radius:10px 10px 0 0;color:#000;font-family:Roboto,sans-serif;outline:none}.register ul.nav-tabs li a.active{background-color:#36c283;color:#fff}.register-container{margin:0 auto;max-width:100%;padding-right:15px}.register-container h1{color:#45d292}.register-container h3{color:var(--text)}.register-outer{color:#fff;padding-right:50px;text-align:center}.register-outer .logo-div{text-align:left}.register-outer .logo-div img{margin-bottom:0}.register-outer.fixed{position:absolute;top:8%;width:62%}.register-outer .txt-rotate{color:var(--text)}.register-outer input{background:#f8f9fa;border:0;border-radius:1.5rem;color:#383d41;cursor:pointer;font-weight:700;margin-bottom:3%;margin-top:30%;padding:2%;width:60%}.register-outer img{animation:mover 2s infinite alternate;margin-bottom:5%}.register-right{background:#f8f9fa;border-radius:10px;box-shadow:0 0 2px #00000080;flex:0 0 25%;margin-left:0!important;max-width:350px;padding:0;position:fixed;right:50px;top:20%;width:100%}.register-form{position:relative}.register-form iframe{left:50%;position:absolute;transform:translate(-50%) scale(.8)}.card{background-color:#fff;border-radius:20px;box-shadow:0 0 5px 1px #0003}.card-header i{background-color:var(--second);border-radius:50px;box-shadow:0 0 5px 2px #0003;color:#fff;font-size:20px;height:60px;padding:20px;width:60px}.card-block{color:var(--text);font:14px/1.5 Roboto,sans-serif}form .form-control{border-radius:50px;font-size:13px}form input[type=submit]{font-size:16px;margin-bottom:20px;padding:8px 30px}.tab-content{background-color:#fff;border-bottom-left-radius:10px;border-bottom-right-radius:10px;border-top:6px solid var(--second);padding:20px!important}.tab-content h3{font-size:20px;margin:30px 0;text-align:center;text-transform:uppercase}.tab-content form .form-control{border-radius:50px;font-size:13px}.tab-content form input[type=submit]{font-size:16px;margin-bottom:20px;padding:8px 30px}.form-check-input{cursor:pointer;height:100%;left:0;opacity:0;top:0;z-index:1}label{font:400 13px/1.3 Roboto,sans-serif;text-transform:none}label:after,label:before{top:0}.blinking-cursor{animation:1s blink step-end infinite;font-size:40px;font-weight:100}.product-features{color:var(--text);letter-spacing:.3px}.product-features.service-desc h2{font-size:32px;font-weight:700}.product-features.service-desc h2 span{color:var(--second)}.product-features .product-features ul li span{margin-right:15px}.product-features .branding-color{color:var(--second)}.product-features .icon-check:before{content:\"\\e080\"}.product-features p{color:var(--text);font-size:18px;font-weight:400;line-height:27px}.product-features ul li{align-items:center;-webkit-box-align:center;display:flex;-ms-flex-align:center;font-size:18px;line-height:25px;margin:0 0 15px}.product-features ul li span{margin-right:15px}.services{padding:50px 0}.forgot-pwd{color:#2e3238;font-size:.8rem;text-decoration:underline}.resource-container{padding:0!important}.resource-container .register-container{min-height:100vh!important}.resource-container .services{padding:0}.resource-container .services .service-points{font-size:18px;line-height:1.15em}.resource-container .branding-color{color:#fff}.resource-container .product-features ul li{color:#fff!important;margin:0 0 15px}.resource-container .register-outer{background:linear-gradient(var(--first),var(--second))}.resource-container .register-outer h1,.resource-container .register-outer h2,.resource-container .register-outer h3,.resource-container .register-outer p{color:#fff!important}.resource-container .register-right .tab-content{border-top:6px solid var(--first)}.resource-container .register-right .tab-content h3{color:var(--first);font-weight:700}.resource-container .register-right ul.nav-tabs li a.active{background-color:var(--first)}.vendor-container{padding:0!important}.vendor-container .register-outer h1{color:var(--first)}.vendor-container .service-points{font-size:18px;line-height:1.15em}.vendor-container .branding-color{color:var(--first)!important}.vendor-container .register-right .tab-content{border-top:6px solid var(--first)}.vendor-container .register-right .tab-content h3{color:var(--first);font-weight:700}.vendor-container .register-right ul.nav-tabs li a.active{background-color:var(--first)}.vendor-container .form-container{background-image:url(/assets/img/products/trial/login-form-background-img.png)}@keyframes blink{0%{color:transparent}50%{color:#45d292}to{color:transparent}}@media (max-width: 991px){.services{padding:25px 0}}@media only screen and (max-width: 768px){.register-container{max-width:100%;padding-right:0}.service-image{display:none}.register-outer{margin-top:30px;order:2;padding-right:0;transform:none}.register-outer h1{font-size:30px;padding:0}.register-outer h2{font-size:22px}.register-right{margin-top:10px;order:1;position:unset;top:0;transform:translateY(0)}.register-right,.register-outer{flex:100%;max-width:100%;width:100%}.product-features.service-desc h2{font-size:30px!important}.vendor-container .logo-div img{margin-bottom:0!important;padding-right:65px}.vendor-container .form-container{background:none}}app-social-login{padding:0 15px;width:100%}@media only screen and (min-width: 768px){.register-left{padding-right:40px}}@media only screen and (max-width: 480px){.register{padding:10px}.vendor-container{padding:10px!important}.vendor-container .form-container{padding:0!important}}@media screen and (min-width: 769px){.vendor-container .form-container{background-size:cover;height:100vh;position:fixed;right:0}}@media screen and (max-width: 768px){.vendor-container{background-image:url(/assets/img/products/c/login-form-background-img.png);background-position:right;background-repeat:no-repeat;background-size:60vw 100%}.vendor-container h3{letter-spacing:.03px;line-height:27px}.vendor-container .product-features li{margin:0 0 15px!important}}@media screen and (max-width: 575px){.vendor-container .logo-div{margin:0 auto 30px;text-align:center;width:300px}.vendor-container .logo-div img{margin-top:0!important;padding-right:0!important}}@media (min-width: 768px) and (max-width: 768px){.logo-div img{flex:0 0 33.3333%;max-width:33.3333%}}@media (min-width: 769px) and (max-width: 820px){.register-outer{flex:0 0 50%;max-width:50%}}@media (min-width: 1200px) and (max-width: 1280px){.register-outer{flex:0 0 66.6667%;max-width:66.6667%}}pw-signup-tabs-a{width:100%}.register-right-wrapper{width:100%}.register-outer.fixed{position:static}@media (min-width: 1600px){.register-right-wrapper{display:flex;justify-content:flex-end;width:100%}.register-right{right:auto}.register-container{max-width:85%}.register-container .form-container{background:none;position:static;right:auto}}@media (min-width: 1800px){.register-container{max-width:73%}}@media (min-width: 2560px){.register-container{max-width:65%}}.wrapper-register-content{margin-top:50px;padding:0!important}.wrapper-register-content .register-outer{margin:0 auto!important;padding:0 3rem!important}.primary-header h1,.blinking-text-wrapper h1{color:#45d292}.primary-header h3,.blinking-text-wrapper h3,.primary-header .txt-rotate,.blinking-text-wrapper .txt-rotate{color:var(--text)}.primary-header .blinking-cursor,.blinking-text-wrapper .blinking-cursor{animation:1s blink step-end infinite;font-size:40px;font-weight:100}.tech-features-wrapper .container{padding-left:20px!important;padding-right:20px!important}.tech-features-wrapper section{padding:70px 0}.tech-features-wrapper section.blinking-text-wrapper{padding:100px 0}@media (max-width: 768px){.tech-features-wrapper section{padding:40px 0}.tech-features-wrapper section.blinking-text-wrapper{padding:50px 0}}.testimonial-bg{background:#fff url(/assets/img/landing-page/testimonial-bg.png) fixed center top;background-size:100%}\n"], dependencies: [{ kind: "component", type: i2.ProductLoginComponent, selector: "pw-login", inputs: ["gaEventObj", "googleCode"] }, { kind: "component", type: i2.ContactUsComponent, selector: "pw-contact-us", inputs: ["productKey", "subject", "masterProductId", "gaEventObj"] }] }); }
|
|
33
33
|
}
|
|
34
34
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: CrmSignupComponent, decorators: [{
|
|
35
35
|
type: Component,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JtLWFjY291bnQuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9zaGFyZWQvaW50ZXJmYWNlL2NybS1hY2NvdW50LmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBDcm1BY2NvdW50IHtcbiAgICBtYWluX2N1cnJlbmN5Pzogc3RyaW5nO1xuICAgIGlkOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgc3Vic2NyaXB0aW9uX2lkOiBudW1iZXI7XG4gICAgbG9jYXRpb246IHN0cmluZztcbiAgICBsYXRpdHVkZTogbnVtYmVyOyAvLyBBc3N1bWluZyBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGFyZSBudW1iZXJzXG4gICAgbG9uZ2l0dWRlOiBudW1iZXI7IC8vIEFkanVzdCBpZiB0aGV5IGFyZSBzdHJpbmdzXG4gICAgY29tbWVudDogc3RyaW5nO1xuICAgIHRlbDogc3RyaW5nO1xuICAgIGNvdW50cnk6IHN0cmluZztcbiAgICBvd25lcl9pZDogbnVtYmVyO1xuICAgIG9yZ2FuaXphdGlvbl9zaXplX2lkOiBudW1iZXI7XG4gICAgb3JnYW5pemF0aW9uX2luZHVzdHJ5X2lkOiBudW1iZXI7XG4gICAgb3JnYW5pemF0aW9uX3R5cGVfaWQ6IG51bWJlcjtcbiAgICBjb21wYW55X3VybDogc3RyaW5nO1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIHByaW9yaXR5OiBzdHJpbmc7XG4gICAgY3JtX3NvdXJjZV9pZDogbnVtYmVyO1xuICAgIG93bmVyOiBPd25lcjtcbiAgICBvcmdhbmlzYXRpb25fc2l6ZTogT3JnYW5pc2F0aW9uU2l6ZTtcbiAgICBvcmdhbmlzYXRpb25fdHlwZTogT3JnYW5pc2F0aW9uVHlwZTtcbiAgICBvcmdhbmlzYXRpb25faW5kdXN0cnk6IE9yZ2FuaXNhdGlvbkluZHVzdHJ5O1xufVxuXG5pbnRlcmZhY2UgT3JnYW5pc2F0aW9uU2l6ZSB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBzaXplOiBzdHJpbmc7XG4gICAgLy8gQWRkIG90aGVyIHJlbGV2YW50IGZpZWxkcyBpZiBuZWVkZWRcbn1cblxuaW50ZXJmYWNlIE9yZ2FuaXNhdGlvblR5cGUge1xuICAgIGlkOiBudW1iZXI7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8vIEFkZCBvdGhlciByZWxldmFudCBmaWVsZHMgaWYgbmVlZGVkXG59XG5cbmludGVyZmFjZSBPcmdhbmlzYXRpb25JbmR1c3RyeSB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBpbmR1c3RyeTogc3RyaW5nO1xuICAgIC8vIEFkZCBvdGhlciByZWxldmFudCBmaWVsZHMgaWYgbmVlZGVkXG59XG5cbmludGVyZmFjZSBPd25lciB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZW1haWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcm1BY2NvdW50UmVzcG9uc2Uge1xuICAgIGFjY291bnRzOiBDcm1BY2NvdW50W107XG4gICAgb2JqZWN0X2NvdW50OiBudW1iZXI7XG4gICAgdW5maWx0ZXJlZF9jb3VudDogbnVtYmVyO1xuICAgIHRvdGFscz86IHtcbiAgICAgICAgZXhwZWN0ZWRfbXJyX3VzZD86IG51bWJlcjtcbiAgICAgICAgc2Vzc2lvbnNfbGFzdF9tb250aD86IG51bWJlcjtcbiAgICAgICAgc2Vzc2lvbnNfbGFzdF9xdWFydGVyPzogbnVtYmVyO1xuICAgIH07XG59XG4iXX0=
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JtLW9wcG9ydHVuaXR5LmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc21hcnQtY3JtL3NyYy9saWIvc2hhcmVkL2ludGVyZmFjZS9jcm0tb3Bwb3J0dW5pdHkuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDcm1BY2NvdW50IH0gZnJvbSAnLi9jcm0tYWNjb3VudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3JtU3RhZ2UgfSBmcm9tICcuL2NybS1zdGFnZXMuaW50ZXJmYWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBDcm1PcHBvcnR1bml0eUNhdGVnb3J5IHtcbiAgICBpZDogbnVtYmVyO1xuICAgIHN1YnNjcmlwdGlvbl9pZDogbnVtYmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBwcmV2aW91c19jYXRlZ29yeV9pZDogbnVtYmVyO1xuICAgIGlzX3Zpc2libGU6IGJvb2xlYW47XG4gICAgaXNfZGVmYXVsdDogYm9vbGVhbjtcbiAgICBwcmV2aW91c19jYXRlZ29yeTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENybU9wcG9ydHVuaXR5Q2F0ZWdvcnlSZXNwb25zZSB7XG4gICAgY3JtX29wcG9ydHVuaXR5X2NhdGVnb3JpZXM6IENybU9wcG9ydHVuaXR5Q2F0ZWdvcnlbXTtcbiAgICBvYmplY3RfY291bnQ6IG51bWJlcjtcbiAgICB1bmZpbHRlcmVkX2NvdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JtT3Bwb3J0dW5pdHkge1xuICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gICAgaWQ6IG51bWJlcjtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGNybV9jb250YWN0X2lkOiBudW1iZXI7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBvbmVfdGltZV9hbW91bnQ6IG51bWJlcjtcbiAgICB3aW5fY2hhbmNlczogbnVtYmVyO1xuICAgIHN0YXJ0aW5nX2F0OiBzdHJpbmc7XG4gICAgbG9zdDogbnVtYmVyO1xuICAgIHdvbjogbnVtYmVyO1xuICAgIG1vbnRobHlfYW1vdW50OiBudW1iZXI7XG4gICAgdHJpYWxfc3RhcnRfYXQ6IHN0cmluZztcbiAgICBsb3N0X3JlYXNvbjogc3RyaW5nO1xuICAgIHdvbl9yZWFzb246IHN0cmluZztcbiAgICBwcm9kdWN0X2lkOiBudW1iZXI7XG4gICAgY3JtX2FjY291bnRfaWQ6IG51bWJlcjtcbiAgICBvd25lcl9pZDogbnVtYmVyO1xuICAgIGNybV9vcHBvcnR1bml0eV9zdGFnZV9pZDogbnVtYmVyO1xuICAgIGNybV9vcHBvcnR1bml0eV9jYXRlZ29yeV9pZHM6IHN0cmluZ1tdO1xuICAgIGZlYXR1cmVfa2V5czogc3RyaW5nW107XG4gICAgY3JtX2FjY291bnQ6IENybUFjY291bnQ7XG4gICAgY3JtX29wcG9ydHVuaXR5X3N0YWdlOiBDcm1TdGFnZTtcbiAgICBvd25lcjogc3RyaW5nW107XG4gICAgY3JtX29wcG9ydHVuaXR5X2NhdGVnb3JpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENybU9wcG9ydHVuaXR5UmVzcG9uc2Uge1xuICAgIGNybV9vcHBvcnR1bml0aWVzOiBDcm1PcHBvcnR1bml0eVtdO1xuICAgIG9iamVjdF9jb3VudDogbnVtYmVyO1xuICAgIHVuZmlsdGVyZWRfY291bnQ6IG51bWJlcjtcbiAgICB0b3RhbHM/OiB7XG4gICAgICAgIGV4cGVjdGVkX21ycl91c2Q/OiBudW1iZXI7XG4gICAgICAgIHRvdGFsX21ycj86IG51bWJlcjtcbiAgICAgICAgdG90YWxfb25lX3RpbWVfYW1vdW50PzogbnVtYmVyO1xuICAgICAgICB0b3RhbF9jb3VudD86IG51bWJlcjtcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENybVZlcnNpb24ge1xuICAgIGl0ZW1faWQ6IG51bWJlcjtcbiAgICBpdGVtX3R5cGU6IHN0cmluZztcbiAgICBldmVudDogc3RyaW5nO1xuICAgIG9iamVjdDogb2JqZWN0O1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG4gICAgd2hvRG9uZUl0OiBudW1iZXI7XG4gICAgYXV0aG9yOiBvYmplY3Q7XG59XG4iXX0=
|