ng-pli-commons 1.0.40 → 1.0.41-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ng-pli-commons.mjs +1215 -733
- package/fesm2022/ng-pli-commons.mjs.map +1 -1
- package/lib/components/pdf-visualizer/pdf-visualizer.component.d.ts +2 -0
- package/lib/components/token/token.component.d.ts +7 -2
- package/lib/ng-pli-commons.module.d.ts +12 -13
- package/lib/services/application.service.d.ts +2 -1
- package/lib/services/budget-setup.service.d.ts +12 -0
- package/lib/services/budget-simulation.service.d.ts +2 -0
- package/lib/services/codebtors.service.d.ts +14 -0
- package/lib/services/committee-assistant.service.d.ts +19 -0
- package/lib/services/correspondence-manager.service.d.ts +1 -0
- package/lib/services/document.service.d.ts +2 -1
- package/lib/services/guarantees-summary-service.d.ts +13 -0
- package/lib/services/import-excel-gic.service.d.ts +1 -0
- package/lib/services/maintenance.service.d.ts +4 -0
- package/lib/services/master-university.service.d.ts +7 -0
- package/lib/services/pli-cnf-anual-interest-rate.service.d.ts +17 -0
- package/lib/services/pli-cnf-committee.service.d.ts +2 -0
- package/lib/services/pli-cnf-installment-simulator-config.service.d.ts +17 -0
- package/lib/services/post-selection.service.d.ts +11 -0
- package/lib/services/send-application.service.d.ts +1 -0
- package/lib/services/tag-management.service.d.ts +23 -0
- package/lib/services/token.service.d.ts +3 -0
- package/lib/services/visualization-committee.service.d.ts +5 -4
- package/package.json +3 -6
- package/public-api.d.ts +8 -0
- package/version.d.ts +1 -1
- package/esm2022/lib/components/backoffice.commons.component.mjs +0 -40
- package/esm2022/lib/components/common.lists.component.mjs +0 -176
- package/esm2022/lib/components/configuration-token/configuration-token-subject.service.mjs +0 -23
- package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +0 -665
- package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +0 -103
- package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +0 -108
- package/esm2022/lib/components/configuration.commons.component.mjs +0 -40
- package/esm2022/lib/components/dashboard.commons.component.mjs +0 -84
- package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +0 -131
- package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +0 -54
- package/esm2022/lib/components/frontoffice.commons.component.mjs +0 -88
- package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +0 -162
- package/esm2022/lib/components/pdf-config/pdf-config.component.mjs +0 -170
- package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +0 -207
- package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +0 -307
- package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +0 -387
- package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +0 -92
- package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +0 -199
- package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +0 -200
- package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +0 -116
- package/esm2022/lib/components/token/token.component.mjs +0 -1026
- package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +0 -128
- package/esm2022/lib/directives/currency-colfuturo-formatter.directive.mjs +0 -47
- package/esm2022/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +0 -34
- package/esm2022/lib/ng-pli-commons.module.mjs +0 -391
- package/esm2022/lib/ng-pli-commons.service.mjs +0 -14
- package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +0 -35
- package/esm2022/lib/pipes/currency-decimal-colfuturo.pipe.mjs +0 -36
- package/esm2022/lib/pipes/currency-print-colfuturo.pipe.mjs +0 -33
- package/esm2022/lib/pipes/thousands.pipe.mjs +0 -60
- package/esm2022/lib/services/application-fill-percentage.service.mjs +0 -30
- package/esm2022/lib/services/application-pdf-form.service.mjs +0 -27
- package/esm2022/lib/services/application-tag.service.mjs +0 -56
- package/esm2022/lib/services/application.service.mjs +0 -250
- package/esm2022/lib/services/assign-task.service.mjs +0 -30
- package/esm2022/lib/services/authentication.service.mjs +0 -133
- package/esm2022/lib/services/blocked-beneficiary.service.mjs +0 -42
- package/esm2022/lib/services/budget-application.service.mjs +0 -265
- package/esm2022/lib/services/budget-simulation.service.mjs +0 -61
- package/esm2022/lib/services/budget.service.mjs +0 -205
- package/esm2022/lib/services/closure-wallet.service.mjs +0 -39
- package/esm2022/lib/services/cnf-correspondence-document-manager.service.mjs +0 -39
- package/esm2022/lib/services/committee-money.service.mjs +0 -44
- package/esm2022/lib/services/committee-pdf.service.mjs +0 -27
- package/esm2022/lib/services/committee-snapshot.service.mjs +0 -60
- package/esm2022/lib/services/common-info.service.mjs +0 -51
- package/esm2022/lib/services/common.service.mjs +0 -285
- package/esm2022/lib/services/configuration-document.service.mjs +0 -297
- package/esm2022/lib/services/configuration-minisite.service.mjs +0 -26
- package/esm2022/lib/services/configuration.service.mjs +0 -53
- package/esm2022/lib/services/correspondence-document-category.service.mjs +0 -31
- package/esm2022/lib/services/correspondence-manager.service.mjs +0 -67
- package/esm2022/lib/services/credit-score.service.mjs +0 -48
- package/esm2022/lib/services/credit-study.service.mjs +0 -292
- package/esm2022/lib/services/cube.service.mjs +0 -27
- package/esm2022/lib/services/data-form-history.service.mjs +0 -25
- package/esm2022/lib/services/data-form.service.mjs +0 -176
- package/esm2022/lib/services/data-letter-segmentation.service.mjs +0 -64
- package/esm2022/lib/services/document-analysis-auto.service.mjs +0 -27
- package/esm2022/lib/services/document-history.service.mjs +0 -43
- package/esm2022/lib/services/document-management.service.mjs +0 -57
- package/esm2022/lib/services/document-process.service.mjs +0 -27
- package/esm2022/lib/services/document-validation-attempt.service.mjs +0 -32
- package/esm2022/lib/services/document.service.mjs +0 -138
- package/esm2022/lib/services/documentary.type.service.mjs +0 -69
- package/esm2022/lib/services/email.service.mjs +0 -30
- package/esm2022/lib/services/evaluation.service.mjs +0 -181
- package/esm2022/lib/services/export-excel.service.mjs +0 -32
- package/esm2022/lib/services/file.service.mjs +0 -153
- package/esm2022/lib/services/form.service.mjs +0 -112
- package/esm2022/lib/services/gic-client-disbursement-metadata.service.mjs +0 -31
- package/esm2022/lib/services/gic-client.service.mjs +0 -49
- package/esm2022/lib/services/gic-cnf-bankvision-transaction.service.mjs +0 -31
- package/esm2022/lib/services/gic-cnf-closing-date.service.mjs +0 -34
- package/esm2022/lib/services/gic-cnf-maintenance.service.mjs +0 -30
- package/esm2022/lib/services/gic-collection.service.mjs +0 -53
- package/esm2022/lib/services/gic-disbursement.service.mjs +0 -39
- package/esm2022/lib/services/gic-extract.service.mjs +0 -41
- package/esm2022/lib/services/gic-log.service.mjs +0 -41
- package/esm2022/lib/services/gic-payment-application.service.mjs +0 -35
- package/esm2022/lib/services/gic-payment-plan-cube.service.mjs +0 -27
- package/esm2022/lib/services/gic-payment-plan.service.mjs +0 -32
- package/esm2022/lib/services/gic-trm.service.mjs +0 -27
- package/esm2022/lib/services/global.show.task.service.mjs +0 -37
- package/esm2022/lib/services/guarantee-document.service.mjs +0 -52
- package/esm2022/lib/services/guarantee-enrollment.service.mjs +0 -37
- package/esm2022/lib/services/guarantee.service.mjs +0 -128
- package/esm2022/lib/services/hash.service.mjs +0 -36
- package/esm2022/lib/services/import-data.service.mjs +0 -27
- package/esm2022/lib/services/import-excel-gic.service.mjs +0 -49
- package/esm2022/lib/services/initial-configuration-gic-parameters.service.mjs +0 -51
- package/esm2022/lib/services/initial-record.service.mjs +0 -51
- package/esm2022/lib/services/integration-ado.service.mjs +0 -54
- package/esm2022/lib/services/interaction-application-user.service.mjs +0 -81
- package/esm2022/lib/services/interest-adjustment.service.mjs +0 -34
- package/esm2022/lib/services/keys-assignation.service.mjs +0 -127
- package/esm2022/lib/services/legalization.service.mjs +0 -150
- package/esm2022/lib/services/letter-campaing.service.mjs +0 -49
- package/esm2022/lib/services/letter-task-mapping.service.mjs +0 -40
- package/esm2022/lib/services/log.service.mjs +0 -41
- package/esm2022/lib/services/maintenance.service.mjs +0 -66
- package/esm2022/lib/services/master-category.service.mjs +0 -66
- package/esm2022/lib/services/master-program.service.mjs +0 -78
- package/esm2022/lib/services/master-university.service.mjs +0 -68
- package/esm2022/lib/services/migration-plis.service.mjs +0 -27
- package/esm2022/lib/services/migration-survey-queue.service.mjs +0 -24
- package/esm2022/lib/services/openkm-document.service.mjs +0 -27
- package/esm2022/lib/services/page.service.mjs +0 -38
- package/esm2022/lib/services/partner-system.service.mjs +0 -30
- package/esm2022/lib/services/partner.service.mjs +0 -34
- package/esm2022/lib/services/pdf-analyzer.service.mjs +0 -33
- package/esm2022/lib/services/people-master.service.mjs +0 -42
- package/esm2022/lib/services/permission.service.mjs +0 -29
- package/esm2022/lib/services/pli-cnf-acuity-fields.service.mjs +0 -34
- package/esm2022/lib/services/pli-cnf-app-card-filter.service.mjs +0 -40
- package/esm2022/lib/services/pli-cnf-appointment-type.service.mjs +0 -41
- package/esm2022/lib/services/pli-cnf-budget-program-type.service.mjs +0 -54
- package/esm2022/lib/services/pli-cnf-budget.service.mjs +0 -31
- package/esm2022/lib/services/pli-cnf-cloning.service.mjs +0 -27
- package/esm2022/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +0 -47
- package/esm2022/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +0 -30
- package/esm2022/lib/services/pli-cnf-committee-valpro-columns.service.mjs +0 -42
- package/esm2022/lib/services/pli-cnf-committee-visualization-mode.service.mjs +0 -42
- package/esm2022/lib/services/pli-cnf-committee.service.mjs +0 -51
- package/esm2022/lib/services/pli-cnf-config-minisite.service.mjs +0 -90
- package/esm2022/lib/services/pli-cnf-configuration-credit-study.service.mjs +0 -41
- package/esm2022/lib/services/pli-cnf-document-management.service.mjs +0 -40
- package/esm2022/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +0 -52
- package/esm2022/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +0 -31
- package/esm2022/lib/services/pli-cnf-evaluation-task-template.service.mjs +0 -39
- package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +0 -112
- package/esm2022/lib/services/pli-cnf-evaluation-template.service.mjs +0 -95
- package/esm2022/lib/services/pli-cnf-form-edit.service.mjs +0 -68
- package/esm2022/lib/services/pli-cnf-form-multiaplicacion.service.mjs +0 -46
- package/esm2022/lib/services/pli-cnf-guarantee-documents-template.service.mjs +0 -40
- package/esm2022/lib/services/pli-cnf-guarantee-token.service.mjs +0 -42
- package/esm2022/lib/services/pli-cnf-header.service.mjs +0 -39
- package/esm2022/lib/services/pli-cnf-indicator.service.mjs +0 -39
- package/esm2022/lib/services/pli-cnf-information-system.service.mjs +0 -24
- package/esm2022/lib/services/pli-cnf-interaction.service.mjs +0 -78
- package/esm2022/lib/services/pli-cnf-letter-template-type.service.mjs +0 -29
- package/esm2022/lib/services/pli-cnf-letter-template.service.mjs +0 -48
- package/esm2022/lib/services/pli-cnf-look-and-feel.service.mjs +0 -28
- package/esm2022/lib/services/pli-cnf-mail.service.mjs +0 -30
- package/esm2022/lib/services/pli-cnf-menu-form.service.mjs +0 -34
- package/esm2022/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +0 -34
- package/esm2022/lib/services/pli-cnf-migration-plis-field.service.mjs +0 -47
- package/esm2022/lib/services/pli-cnf-migration-status-plis.service.mjs +0 -44
- package/esm2022/lib/services/pli-cnf-page-section-form.service.mjs +0 -66
- package/esm2022/lib/services/pli-cnf-page-sub-process.service.mjs +0 -25
- package/esm2022/lib/services/pli-cnf-pdfs.service.mjs +0 -31
- package/esm2022/lib/services/pli-cnf-profile-form.service.mjs +0 -40
- package/esm2022/lib/services/pli-cnf-profile-user.service.mjs +0 -49
- package/esm2022/lib/services/pli-cnf-project-summary.service.mjs +0 -39
- package/esm2022/lib/services/pli-cnf-scenario.service.mjs +0 -47
- package/esm2022/lib/services/pli-cnf-segmentation.service.mjs +0 -72
- package/esm2022/lib/services/pli-cnf-snapshot-token.service.mjs +0 -42
- package/esm2022/lib/services/pli-cnf-status-flow-interaction.service.mjs +0 -74
- package/esm2022/lib/services/pli-cnf-status-flow.service.mjs +0 -56
- package/esm2022/lib/services/pli-cnf-support-document-category.service.mjs +0 -47
- package/esm2022/lib/services/pli-cnf-support-document.service.mjs +0 -56
- package/esm2022/lib/services/pli-cnf-survey-document.service.mjs +0 -37
- package/esm2022/lib/services/pli-cnf-survey-pdf.service.mjs +0 -34
- package/esm2022/lib/services/pli-cnf-survey.service.mjs +0 -46
- package/esm2022/lib/services/pli-cnf-task-group.service.mjs +0 -33
- package/esm2022/lib/services/pli-cnf-text-category.service.mjs +0 -38
- package/esm2022/lib/services/pli-cnf-text-option.service.mjs +0 -39
- package/esm2022/lib/services/pli-cnf-text.service.mjs +0 -62
- package/esm2022/lib/services/pli-cnf-type-text.service.mjs +0 -45
- package/esm2022/lib/services/pli-cnf-university-article.service.mjs +0 -39
- package/esm2022/lib/services/pli-cnf-user-calendar.service.mjs +0 -36
- package/esm2022/lib/services/pli-cnf-user-workspace.service.mjs +0 -35
- package/esm2022/lib/services/pli-cnf-valpro-keys.service.mjs +0 -35
- package/esm2022/lib/services/pli-cnf-workspace-segmentation.service.mjs +0 -31
- package/esm2022/lib/services/pli-message-type.service.mjs +0 -40
- package/esm2022/lib/services/pli-multiple-value-filter.service.mjs +0 -39
- package/esm2022/lib/services/pli-promocion-username.service.mjs +0 -57
- package/esm2022/lib/services/pli-seg-action-user.service.mjs +0 -37
- package/esm2022/lib/services/pli-segmentation.service.mjs +0 -130
- package/esm2022/lib/services/pli-tag-assignment.service.mjs +0 -36
- package/esm2022/lib/services/pli-tag.service.mjs +0 -55
- package/esm2022/lib/services/pli-user.service.mjs +0 -51
- package/esm2022/lib/services/plis-beneficiario.service.mjs +0 -29
- package/esm2022/lib/services/plis-estatus-change.service.mjs +0 -30
- package/esm2022/lib/services/ppp.service.mjs +0 -360
- package/esm2022/lib/services/profile.service.mjs +0 -60
- package/esm2022/lib/services/progress-bar.service.mjs +0 -40
- package/esm2022/lib/services/promotion-score.service.mjs +0 -44
- package/esm2022/lib/services/registry-identifier.service.mjs +0 -49
- package/esm2022/lib/services/return-refund.service.mjs +0 -53
- package/esm2022/lib/services/segmentation-tokens.service.mjs +0 -43
- package/esm2022/lib/services/segmentation-user-service.service.mjs +0 -94
- package/esm2022/lib/services/segmentation.service.mjs +0 -31
- package/esm2022/lib/services/send-application.service.mjs +0 -484
- package/esm2022/lib/services/sesion-form.service.mjs +0 -31
- package/esm2022/lib/services/sesion.service.mjs +0 -48
- package/esm2022/lib/services/spinner.service.mjs +0 -16
- package/esm2022/lib/services/sponsorship-letter.service.mjs +0 -68
- package/esm2022/lib/services/status.service.mjs +0 -104
- package/esm2022/lib/services/summary-budget.service.mjs +0 -24
- package/esm2022/lib/services/survey-metadata.service.mjs +0 -28
- package/esm2022/lib/services/survey-queue.service.mjs +0 -24
- package/esm2022/lib/services/survey.service.mjs +0 -52
- package/esm2022/lib/services/tasa.cambio.service.mjs +0 -35
- package/esm2022/lib/services/token-transformation.service.mjs +0 -62
- package/esm2022/lib/services/token.service.mjs +0 -1431
- package/esm2022/lib/services/university.service.mjs +0 -50
- package/esm2022/lib/services/upload-documents.service.mjs +0 -60
- package/esm2022/lib/services/user.service.mjs +0 -28
- package/esm2022/lib/services/visualization-committee.service.mjs +0 -84
- package/esm2022/lib/utils/custom-validator.mjs +0 -95
- package/esm2022/lib/utils/form-util.mjs +0 -35
- package/esm2022/lib/utils/formio-util.mjs +0 -582
- package/esm2022/lib/utils/version-commons.mjs +0 -10
- package/esm2022/ng-pli-commons.mjs +0 -5
- package/esm2022/public-api.mjs +0 -220
- package/esm2022/version.mjs +0 -29
|
@@ -1,1431 +0,0 @@
|
|
|
1
|
-
import { HttpParams } from '@angular/common/http';
|
|
2
|
-
import { Inject, Injectable, LOCALE_ID } from '@angular/core';
|
|
3
|
-
import { DateUtil, HEADER_JSON, UtilString } from 'ng-pli-util';
|
|
4
|
-
import { FormioUtil } from '../utils/formio-util';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/common/http";
|
|
7
|
-
import * as i2 from "./form.service";
|
|
8
|
-
import * as i3 from "@angular/common";
|
|
9
|
-
export class TokenService {
|
|
10
|
-
/** */
|
|
11
|
-
static { this.SIGN_LETTER_TAG_ID = '_sign-letter-tag-id'; }
|
|
12
|
-
/** */
|
|
13
|
-
static { this.TOKEN_LABEL_FORM = 'Frm'; }
|
|
14
|
-
/** */
|
|
15
|
-
static { this.TOKEN_LABEL_BUDGET = 'Presupuesto'; }
|
|
16
|
-
/** */
|
|
17
|
-
static { this.TOKEN_LABEL_CALCULATED = 'Calculado'; }
|
|
18
|
-
/** */
|
|
19
|
-
static { this.TOKEN_LABEL_SNAPSHOT = 'Snapshot'; }
|
|
20
|
-
/** */
|
|
21
|
-
static { this.TOKEN_LABEL_STATIC = 'Estático'; }
|
|
22
|
-
/** */
|
|
23
|
-
static { this.TOKEN_LABEL_DOCUMENTO = 'Documento'; }
|
|
24
|
-
/** */
|
|
25
|
-
static { this.TOKEN_LABEL_DOCUMENTO_ANALISIS_AUTOMATICO = 'Análisis automático de documentos'; }
|
|
26
|
-
/** */
|
|
27
|
-
static { this.TOKEN_DOCUMENTO_ANALYSIS_TYPE = 'document_analysis'; }
|
|
28
|
-
/** */
|
|
29
|
-
static { this.TOKEN_LABEL_TASK = 'Tarea'; }
|
|
30
|
-
/** */
|
|
31
|
-
static { this.TOKEN_LABEL_TASKL = 'task'; }
|
|
32
|
-
/** */
|
|
33
|
-
static { this.TOKEN_LABEL_GUARANTEE = 'Garantia'; }
|
|
34
|
-
/** */
|
|
35
|
-
static { this.BUDGET_TOKENS_KEY_TOTAL_AMOUNT = 'totalAmount'; }
|
|
36
|
-
/** */
|
|
37
|
-
static { this.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_AMOUNT = 'applicationTotal'; }
|
|
38
|
-
/** */
|
|
39
|
-
static { this.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_OWN_FOUNDS = 'applicationOwnFounds'; }
|
|
40
|
-
/** */
|
|
41
|
-
static { this.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_FINANCING = 'applicationFinancing'; }
|
|
42
|
-
/** */
|
|
43
|
-
static { this.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_AMOUNT = 'legalizationTotal'; }
|
|
44
|
-
/** */
|
|
45
|
-
static { this.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_OWN_FOUNDS = 'legalizationOwnFounds'; }
|
|
46
|
-
/** */
|
|
47
|
-
static { this.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_FINANCING = 'legalizationFinancing'; }
|
|
48
|
-
/** */
|
|
49
|
-
static { this.BUDGET_TOKENS_KEY_INSURANCE_AMOUNT = 'insuranceAmount'; }
|
|
50
|
-
/** */
|
|
51
|
-
static { this.LEGALIZATION_OR_APPLICATION_TOTAL_FINANCING = 'leglizationOrApplicationTotalFinancing'; }
|
|
52
|
-
/** */
|
|
53
|
-
static { this.BUDGET_TOKENS_KEY_RESUME_CATEGORY_YEAR = 'resumeCategoryYear'; }
|
|
54
|
-
/** */
|
|
55
|
-
static { this.BUDGET_TOKENS_KEY_FECHA_FINANCING_START = 'fechaInicioFinanciacion'; }
|
|
56
|
-
/** */
|
|
57
|
-
static { this.BUDGET_TOKENS_KEY_FECHA_FINANCING_END = 'fechaFinFinanciacion'; }
|
|
58
|
-
/** */
|
|
59
|
-
static { this.BUDGET_TOKENS_DURATION_STUDIES = 'duracionEstudios'; }
|
|
60
|
-
/** */
|
|
61
|
-
static { this.BUDGET_TOKENS_FINANCING_DURATION = 'duracionFinanciacion'; }
|
|
62
|
-
/** */
|
|
63
|
-
static { this.STATIC_TOKENS_KEY_CODIGO_VERIFICACION = 'codigoVerificacion'; }
|
|
64
|
-
/** */
|
|
65
|
-
static { this.STATIC_TOKENS_KEY_A_QUIEN_VA_DIRIGIDO = 'aQuienVaDirigido'; }
|
|
66
|
-
/** */
|
|
67
|
-
static { this.STATIC_TOKENS_KEY_FECHA_ACTUAL = 'fechaActual'; }
|
|
68
|
-
/** */
|
|
69
|
-
static { this.STATIC_TOKENS_KEY_STATUS_NAME = 'statusName'; }
|
|
70
|
-
/** */
|
|
71
|
-
static { this.STATIC_TOKENS_KEY_PATROCINADOR = 'pliPatrocinador'; }
|
|
72
|
-
/** */
|
|
73
|
-
static { this.STATIC_TOKENS_KEY_PATROCINADOR_CORTO = 'pliPatrocinadorCorto'; }
|
|
74
|
-
/** */
|
|
75
|
-
static { this.STATIC_TOKENS_KEY_PROGRAMA = 'pliPrograma'; }
|
|
76
|
-
/** */
|
|
77
|
-
static { this.STATIC_TOKENS_KEY_PROGRAMA_CORTO = 'pliProgramaCorto'; }
|
|
78
|
-
/** */
|
|
79
|
-
static { this.STATIC_TOKENS_KEY_PROMOCION = 'pliPromocion'; }
|
|
80
|
-
/** */
|
|
81
|
-
static { this.STATIC_TOKENS_KEY_PROMOCION_CORTO = 'pliPromocionCorto'; }
|
|
82
|
-
/** */
|
|
83
|
-
static { this.STATIC_TOKENS_KEY_ANIO_PROMOCION = 'anioPromocion'; }
|
|
84
|
-
/** */
|
|
85
|
-
static { this.STATIC_TOKENS_KEY_ISO_MONEDA_BASE = 'isoMonedaBase'; }
|
|
86
|
-
/** */
|
|
87
|
-
static { this.STATIC_TOKENS_KEY_SALUDO_COMPLEMENTARIO = 'saludoComplementario'; }
|
|
88
|
-
/** */
|
|
89
|
-
static { this.STATIC_TOKENS_KEY_NUMBER_APPLICATION = 'numeroRadicado'; }
|
|
90
|
-
/** */
|
|
91
|
-
static { this.STATIC_TOKENS_KEY_USER_INITIALS = 'inicialesUsuario'; }
|
|
92
|
-
/** */
|
|
93
|
-
static { this.STATIC_TOKENS_KEY_LETTER_SIGN = 'firmaCarta'; }
|
|
94
|
-
/** */
|
|
95
|
-
static { this.STATIC_TOKENS_COMMITTEE_NAME = 'comiteNombre'; }
|
|
96
|
-
/** */
|
|
97
|
-
static { this.STATIC_TOKENS_COMMITTEE_SEGMENTATION = 'comiteSegmentacion'; }
|
|
98
|
-
/** */
|
|
99
|
-
static { this.STATIC_TOKENS_COMMITTEE_AGGRUPATION = 'comiteAgrupacion'; }
|
|
100
|
-
/** */
|
|
101
|
-
static { this.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE = 'comiteFechaLinea'; }
|
|
102
|
-
/** */
|
|
103
|
-
static { this.STATIC_TOKENS_CONFIRM_LEGALIZATION_APPOINTMENT = 'confirmacionCita'; }
|
|
104
|
-
/** */
|
|
105
|
-
static { this.STATIC_TOKENS_CODEBTOR_DOCUMENT_NUMBER = 'numeroDocumentoCodeudor'; }
|
|
106
|
-
/** */
|
|
107
|
-
static { this.STATIC_TOKENS_CODEBTOR_DOCUMENT_TYPE = 'tipoDocumentoCodeudor'; }
|
|
108
|
-
/** */
|
|
109
|
-
static { this.STATIC_TOKENS_CODEBTOR_NAME = 'nombresCodeudor'; }
|
|
110
|
-
/** */
|
|
111
|
-
static { this.STATIC_TOKENS_CODEBTOR_LASTNAME = 'apellidosCodeudor'; }
|
|
112
|
-
/** */
|
|
113
|
-
static { this.STATIC_TOKENS_TYPE_CODEBTOR = 'tipoPersonaCodeudor'; }
|
|
114
|
-
/** */
|
|
115
|
-
static { this.STATIC_TOKENS_CODEBTOR_REVIEWER = 'revisorCodeudores'; }
|
|
116
|
-
/** */
|
|
117
|
-
static { this.STATIC_TOKENS_TOTAL_WEIGHTED = 'ponderadoTotal'; }
|
|
118
|
-
/** */
|
|
119
|
-
static { this.STATIC_TOKENS_CONSECUTIVE_GUARANTEE = 'consecutivoGarantias'; }
|
|
120
|
-
/** */
|
|
121
|
-
static { this.STATIC_TOKENS_DAY = 'dia'; }
|
|
122
|
-
/** */
|
|
123
|
-
static { this.STATIC_TOKENS_MONTH = 'mes'; }
|
|
124
|
-
/** */
|
|
125
|
-
static { this.STATIC_TOKENS_YEAR = 'ano'; }
|
|
126
|
-
/** */
|
|
127
|
-
static { this.STATIC_TOKENS_REPRESENTATIVE_NAME = 'nombresRepresentante'; }
|
|
128
|
-
/** */
|
|
129
|
-
static { this.STATIC_TOKENS_REPRESENTATIVE_LASTNAME = 'apellidosRepresentante'; }
|
|
130
|
-
/** */
|
|
131
|
-
static { this.STATIC_TOKENS_REPRESENTATIVE_DOCUMENT_NUMBER = 'cedulaRepresentante'; }
|
|
132
|
-
/** */
|
|
133
|
-
static { this.STATIC_TOKENS_CITY_SIGNATURE = 'ciudadFirma'; }
|
|
134
|
-
/** */
|
|
135
|
-
static { this.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY = 'tipoUsuarioEstudioCredito'; }
|
|
136
|
-
/** */
|
|
137
|
-
static { this.STATIC_TOKENS_CODEBTOR_VEHICLES_QUANTITY = 'cantidadVehiculosCodeudor'; }
|
|
138
|
-
/** */
|
|
139
|
-
static { this.STATIC_TOKENS_CODEBTOR_ASSETS_QUANTITY = 'cantidadBienesCodeudor'; }
|
|
140
|
-
/** */
|
|
141
|
-
static { this.STATIC_TOKENS_LIST_CODEBTORS = 'listaCodeudores'; }
|
|
142
|
-
/** */
|
|
143
|
-
static { this.STATIC_TOKEN_INGRESO_CODEUDOR_HABEAS_DATA = 'ingresoCodeudorHabeasData'; }
|
|
144
|
-
/** */
|
|
145
|
-
static { this.STATIC_TOKEN_PDF_RESUMEN_CODEUDOR = 'pdfResumenCodeudor'; }
|
|
146
|
-
/** */
|
|
147
|
-
static { this.STATIC_TOKENS_QUANTITY_VEHICLE_BENEFICIARY = 'cantidadVehiculosSeleccionado'; }
|
|
148
|
-
/** */
|
|
149
|
-
static { this.STATIC_TOKENS_QUANTITY_ASSETS_BENEFICIARY = 'cantidadBienesSeleccionado'; }
|
|
150
|
-
/** */
|
|
151
|
-
static { this.STATIC_TOKENS_BEN_CODIGO = 'benCodigo'; }
|
|
152
|
-
/** */
|
|
153
|
-
static { this.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS_CODEBTOR = 'creditReviewerObservationsCodebtor'; }
|
|
154
|
-
/** */
|
|
155
|
-
static { this.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS = 'creditReviewerObservations'; }
|
|
156
|
-
static { this.STATIC_TOKEN_TAG_NAME = 'tagName'; }
|
|
157
|
-
static { this.STATIC_TOKEN_NAME_REVIEWER_TASK = 'nameReviwerTask'; }
|
|
158
|
-
static { this.STATIC_TOKEN_LAST_NAME_REVIEWER_TASK = 'lastNameReviwerTask'; }
|
|
159
|
-
static { this.STATIC_TOKEN_TASK_TOTAL_ASSIGNED_TO_REVIEWER = 'taskTotalAssignedToReviewer'; }
|
|
160
|
-
static { this.STATIC_TOKEN_SURNAME = 'surname'; }
|
|
161
|
-
static { this.STATIC_TOKENS = [
|
|
162
|
-
{
|
|
163
|
-
key: TokenService.STATIC_TOKENS_KEY_PATROCINADOR,
|
|
164
|
-
label: 'Patrocinador'
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
key: TokenService.STATIC_TOKENS_KEY_PROGRAMA,
|
|
168
|
-
label: 'Programa'
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
key: TokenService.STATIC_TOKENS_KEY_PROMOCION,
|
|
172
|
-
label: 'Promoción'
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
key: TokenService.STATIC_TOKENS_KEY_ANIO_PROMOCION,
|
|
176
|
-
label: 'Año promoción'
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
key: TokenService.STATIC_TOKENS_KEY_ISO_MONEDA_BASE,
|
|
180
|
-
label: 'ISO Moneda base'
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
key: TokenService.STATIC_TOKENS_KEY_SALUDO_COMPLEMENTARIO,
|
|
184
|
-
label: 'Saludo complementario'
|
|
185
|
-
},
|
|
186
|
-
{
|
|
187
|
-
key: TokenService.STATIC_TOKENS_KEY_CODIGO_VERIFICACION,
|
|
188
|
-
label: 'Código de verificación'
|
|
189
|
-
},
|
|
190
|
-
{
|
|
191
|
-
key: TokenService.STATIC_TOKENS_KEY_A_QUIEN_VA_DIRIGIDO,
|
|
192
|
-
label: 'A quien va dirigido'
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
key: TokenService.STATIC_TOKENS_KEY_FECHA_ACTUAL,
|
|
196
|
-
label: 'Fecha actual'
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
key: TokenService.STATIC_TOKENS_KEY_STATUS_NAME,
|
|
200
|
-
label: 'Estado actual'
|
|
201
|
-
},
|
|
202
|
-
{
|
|
203
|
-
key: TokenService.STATIC_TOKENS_KEY_NUMBER_APPLICATION,
|
|
204
|
-
label: 'Número radicado'
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
key: TokenService.STATIC_TOKENS_KEY_USER_INITIALS,
|
|
208
|
-
label: 'Iniciales de usuario'
|
|
209
|
-
},
|
|
210
|
-
{
|
|
211
|
-
key: TokenService.STATIC_TOKENS_KEY_LETTER_SIGN,
|
|
212
|
-
label: 'Firma de cartas'
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
key: TokenService.STATIC_TOKENS_COMMITTEE_NAME,
|
|
216
|
-
label: 'Nombre comité'
|
|
217
|
-
},
|
|
218
|
-
{
|
|
219
|
-
key: TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION,
|
|
220
|
-
label: 'Segmentación comité'
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
key: TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION,
|
|
224
|
-
label: 'Agrupación comité'
|
|
225
|
-
},
|
|
226
|
-
{
|
|
227
|
-
key: TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE,
|
|
228
|
-
label: 'Fecha Línea de corte'
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
key: TokenService.STATIC_TOKENS_CONFIRM_LEGALIZATION_APPOINTMENT,
|
|
232
|
-
label: 'Confirmación de cita'
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
key: TokenService.STATIC_TOKENS_CODEBTOR_DOCUMENT_NUMBER,
|
|
236
|
-
label: 'Número de documento de codeudor'
|
|
237
|
-
},
|
|
238
|
-
{
|
|
239
|
-
key: TokenService.STATIC_TOKENS_CODEBTOR_DOCUMENT_TYPE,
|
|
240
|
-
label: 'Tipo de documento de codeudor'
|
|
241
|
-
},
|
|
242
|
-
{
|
|
243
|
-
key: TokenService.STATIC_TOKENS_CODEBTOR_NAME,
|
|
244
|
-
label: 'Nombres codeudor'
|
|
245
|
-
},
|
|
246
|
-
{
|
|
247
|
-
key: TokenService.STATIC_TOKENS_CODEBTOR_LASTNAME,
|
|
248
|
-
label: 'Apellidos codeudor'
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
key: TokenService.STATIC_TOKENS_TYPE_CODEBTOR,
|
|
252
|
-
label: 'Tipo de persona codeudor'
|
|
253
|
-
},
|
|
254
|
-
{
|
|
255
|
-
key: TokenService.STATIC_TOKENS_CODEBTOR_VEHICLES_QUANTITY,
|
|
256
|
-
label: 'Cantidad vehiculos codeudor'
|
|
257
|
-
},
|
|
258
|
-
{
|
|
259
|
-
key: TokenService.STATIC_TOKENS_CODEBTOR_ASSETS_QUANTITY,
|
|
260
|
-
label: 'Cantidad bienes codeudor'
|
|
261
|
-
},
|
|
262
|
-
{
|
|
263
|
-
key: TokenService.STATIC_TOKENS_CODEBTOR_REVIEWER,
|
|
264
|
-
label: 'Revisor de codeudores'
|
|
265
|
-
},
|
|
266
|
-
{
|
|
267
|
-
key: TokenService.STATIC_TOKENS_TOTAL_WEIGHTED,
|
|
268
|
-
label: 'Ponderado total'
|
|
269
|
-
},
|
|
270
|
-
{
|
|
271
|
-
key: TokenService.STATIC_TOKENS_CONSECUTIVE_GUARANTEE,
|
|
272
|
-
label: 'Consecutivo de garantias'
|
|
273
|
-
},
|
|
274
|
-
{
|
|
275
|
-
key: TokenService.STATIC_TOKENS_REPRESENTATIVE_NAME,
|
|
276
|
-
label: 'Nombres representante legal'
|
|
277
|
-
},
|
|
278
|
-
{
|
|
279
|
-
key: TokenService.STATIC_TOKENS_REPRESENTATIVE_LASTNAME,
|
|
280
|
-
label: 'Apellidos representante legal'
|
|
281
|
-
},
|
|
282
|
-
{
|
|
283
|
-
key: TokenService.STATIC_TOKENS_REPRESENTATIVE_DOCUMENT_NUMBER,
|
|
284
|
-
label: 'Cedula representante legal'
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
key: TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY,
|
|
288
|
-
label: 'Tipo usuario estudio crédito'
|
|
289
|
-
},
|
|
290
|
-
{
|
|
291
|
-
key: TokenService.STATIC_TOKENS_DAY,
|
|
292
|
-
label: 'Dia'
|
|
293
|
-
},
|
|
294
|
-
{
|
|
295
|
-
key: TokenService.STATIC_TOKENS_MONTH,
|
|
296
|
-
label: 'Mes'
|
|
297
|
-
},
|
|
298
|
-
{
|
|
299
|
-
key: TokenService.STATIC_TOKENS_YEAR,
|
|
300
|
-
label: 'Año'
|
|
301
|
-
},
|
|
302
|
-
{
|
|
303
|
-
key: TokenService.STATIC_TOKENS_CITY_SIGNATURE,
|
|
304
|
-
label: 'Ciudad de la firma'
|
|
305
|
-
},
|
|
306
|
-
{
|
|
307
|
-
key: TokenService.STATIC_TOKENS_LIST_CODEBTORS,
|
|
308
|
-
label: 'Lista de codeudores'
|
|
309
|
-
},
|
|
310
|
-
{
|
|
311
|
-
key: TokenService.STATIC_TOKEN_INGRESO_CODEUDOR_HABEAS_DATA,
|
|
312
|
-
label: 'Ingreso Codeudor Habeas Data'
|
|
313
|
-
},
|
|
314
|
-
{
|
|
315
|
-
key: TokenService.STATIC_TOKEN_PDF_RESUMEN_CODEUDOR,
|
|
316
|
-
label: 'Pdf codeudor'
|
|
317
|
-
},
|
|
318
|
-
{
|
|
319
|
-
key: TokenService.STATIC_TOKENS_QUANTITY_VEHICLE_BENEFICIARY,
|
|
320
|
-
label: 'Cantidad de vehículos del seleccionado'
|
|
321
|
-
},
|
|
322
|
-
{
|
|
323
|
-
key: TokenService.STATIC_TOKENS_QUANTITY_ASSETS_BENEFICIARY,
|
|
324
|
-
label: 'Cantidad bienes del seleccionado'
|
|
325
|
-
},
|
|
326
|
-
{
|
|
327
|
-
key: TokenService.STATIC_TOKENS_BEN_CODIGO,
|
|
328
|
-
label: 'Código beneficiario'
|
|
329
|
-
},
|
|
330
|
-
{
|
|
331
|
-
key: TokenService.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS,
|
|
332
|
-
label: 'Observaciones revisor financiero seleccionado'
|
|
333
|
-
},
|
|
334
|
-
{
|
|
335
|
-
key: TokenService.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS_CODEBTOR,
|
|
336
|
-
label: 'Observaciones revisor financiero codeudores'
|
|
337
|
-
},
|
|
338
|
-
{
|
|
339
|
-
key: TokenService.STATIC_TOKEN_TAG_NAME,
|
|
340
|
-
label: 'Nombre del tag'
|
|
341
|
-
},
|
|
342
|
-
{ key: TokenService.STATIC_TOKEN_NAME_REVIEWER_TASK, label: 'Nombre revisor tareas' },
|
|
343
|
-
{
|
|
344
|
-
key: TokenService.STATIC_TOKEN_LAST_NAME_REVIEWER_TASK,
|
|
345
|
-
label: 'Apellido revisor tareas'
|
|
346
|
-
},
|
|
347
|
-
{
|
|
348
|
-
key: TokenService.STATIC_TOKEN_TASK_TOTAL_ASSIGNED_TO_REVIEWER,
|
|
349
|
-
label: 'Total tareas asignadas a revisor'
|
|
350
|
-
},
|
|
351
|
-
{
|
|
352
|
-
key: TokenService.STATIC_TOKEN_SURNAME,
|
|
353
|
-
label: 'Apellidos candidato'
|
|
354
|
-
}
|
|
355
|
-
]; }
|
|
356
|
-
static { this.excludedToken = [
|
|
357
|
-
TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY.toLowerCase(),
|
|
358
|
-
TokenService.STATIC_TOKENS_CODEBTOR_VEHICLES_QUANTITY.toLowerCase(),
|
|
359
|
-
TokenService.STATIC_TOKENS_CODEBTOR_ASSETS_QUANTITY.toLowerCase()
|
|
360
|
-
]; }
|
|
361
|
-
constructor(environment, httpClient, formService, currencyPipe) {
|
|
362
|
-
this.environment = environment;
|
|
363
|
-
this.httpClient = httpClient;
|
|
364
|
-
this.formService = formService;
|
|
365
|
-
this.currencyPipe = currencyPipe;
|
|
366
|
-
}
|
|
367
|
-
/** This promise allows to execute a function when consulting the form fields. */
|
|
368
|
-
getFormFieldsByPromCode(promCodigo) {
|
|
369
|
-
return new Promise((resolve, reject) => {
|
|
370
|
-
// Search the dynamic form
|
|
371
|
-
let lFormFieldsToken = null;
|
|
372
|
-
this.formService.getByPromCodigo(promCodigo).subscribe({
|
|
373
|
-
next: (arrayForms) => {
|
|
374
|
-
if (arrayForms.length > 0) {
|
|
375
|
-
for (const forms of arrayForms) {
|
|
376
|
-
let components = [];
|
|
377
|
-
components.push(...FormioUtil.getComponents(forms.components));
|
|
378
|
-
if (forms.components && forms.components.length > 0) {
|
|
379
|
-
for (const components of forms.components) {
|
|
380
|
-
if (components.components && components.components.length > 0) {
|
|
381
|
-
for (const component of components.components) {
|
|
382
|
-
if (component.columns && component.columns.length > 0) {
|
|
383
|
-
for (const cComponents of component.columns) {
|
|
384
|
-
if (cComponents.components &&
|
|
385
|
-
cComponents.components.length > 0) {
|
|
386
|
-
for (const iterator of cComponents.components) {
|
|
387
|
-
if (iterator.type === 'address') {
|
|
388
|
-
delete iterator.components;
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
let form = arrayForms;
|
|
401
|
-
if (!form ||
|
|
402
|
-
!form[0] ||
|
|
403
|
-
!form[0].promCodigo ||
|
|
404
|
-
form[0].promCodigo != promCodigo) {
|
|
405
|
-
// this.router.navigate(['404']);
|
|
406
|
-
resolve(lFormFieldsToken);
|
|
407
|
-
}
|
|
408
|
-
lFormFieldsToken = [];
|
|
409
|
-
for (let formComp of form) {
|
|
410
|
-
let newComponents;
|
|
411
|
-
let components = [];
|
|
412
|
-
if (formComp.components) {
|
|
413
|
-
newComponents = formComp.components;
|
|
414
|
-
}
|
|
415
|
-
else if (formComp.columns) {
|
|
416
|
-
newComponents = formComp.columns;
|
|
417
|
-
}
|
|
418
|
-
if (newComponents && UtilString.isValid(formComp.title)) {
|
|
419
|
-
lFormFieldsToken.push({
|
|
420
|
-
title: {
|
|
421
|
-
key: TokenService.getKeyFormulario(formComp.title),
|
|
422
|
-
value: formComp.title,
|
|
423
|
-
object: formComp
|
|
424
|
-
},
|
|
425
|
-
value: []
|
|
426
|
-
});
|
|
427
|
-
lFormFieldsToken[lFormFieldsToken.length - 1].value =
|
|
428
|
-
this.getComponenetForm(components, newComponents, null, false, null);
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
resolve(lFormFieldsToken);
|
|
432
|
-
},
|
|
433
|
-
error: (error) => {
|
|
434
|
-
reject(error);
|
|
435
|
-
}
|
|
436
|
-
});
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
getFormFieldsByPromCodeWithEditGrids(promCodigo) {
|
|
440
|
-
return new Promise((resolve, reject) => {
|
|
441
|
-
// Search the dynamic form
|
|
442
|
-
let lFormFieldsToken = null;
|
|
443
|
-
this.formService.getByPromCodigo(promCodigo).subscribe({
|
|
444
|
-
next: (arrayForms) => {
|
|
445
|
-
if (arrayForms.length > 0) {
|
|
446
|
-
for (const forms of arrayForms) {
|
|
447
|
-
let components = [];
|
|
448
|
-
components.push(...FormioUtil.getComponentsWithEditGrids(forms.components));
|
|
449
|
-
if (forms.components && forms.components.length > 0) {
|
|
450
|
-
for (const components of forms.components) {
|
|
451
|
-
if (components.components && components.components.length > 0) {
|
|
452
|
-
for (const component of components.components) {
|
|
453
|
-
if (component.columns && component.columns.length > 0) {
|
|
454
|
-
for (const cComponents of component.columns) {
|
|
455
|
-
if (cComponents.components &&
|
|
456
|
-
cComponents.components.length > 0) {
|
|
457
|
-
for (const iterator of cComponents.components) {
|
|
458
|
-
if (iterator.type === 'address') {
|
|
459
|
-
delete iterator.components;
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
let form = arrayForms;
|
|
472
|
-
if (!form ||
|
|
473
|
-
!form[0] ||
|
|
474
|
-
!form[0].promCodigo ||
|
|
475
|
-
form[0].promCodigo != promCodigo) {
|
|
476
|
-
// this.router.navigate(['404']);
|
|
477
|
-
resolve(lFormFieldsToken);
|
|
478
|
-
}
|
|
479
|
-
lFormFieldsToken = [];
|
|
480
|
-
for (let formComp of form) {
|
|
481
|
-
let newComponents;
|
|
482
|
-
let components = [];
|
|
483
|
-
if (formComp.components) {
|
|
484
|
-
newComponents = formComp.components;
|
|
485
|
-
}
|
|
486
|
-
else if (formComp.columns) {
|
|
487
|
-
newComponents = formComp.columns;
|
|
488
|
-
}
|
|
489
|
-
if (newComponents && UtilString.isValid(formComp.title)) {
|
|
490
|
-
lFormFieldsToken.push({
|
|
491
|
-
title: {
|
|
492
|
-
key: TokenService.getKeyFormulario(formComp.title),
|
|
493
|
-
value: formComp.title,
|
|
494
|
-
object: formComp
|
|
495
|
-
},
|
|
496
|
-
value: []
|
|
497
|
-
});
|
|
498
|
-
lFormFieldsToken[lFormFieldsToken.length - 1].value =
|
|
499
|
-
this.getComponenetForm(components, newComponents, null, false, null);
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
resolve(lFormFieldsToken);
|
|
503
|
-
},
|
|
504
|
-
error: (error) => {
|
|
505
|
-
reject(error);
|
|
506
|
-
}
|
|
507
|
-
});
|
|
508
|
-
});
|
|
509
|
-
}
|
|
510
|
-
getFormFieldsByFormId(formId) {
|
|
511
|
-
return new Promise((resolve, reject) => {
|
|
512
|
-
// Search the dynamic form
|
|
513
|
-
let lFormFieldsToken = null;
|
|
514
|
-
this.formService.getById(formId).subscribe((result) => {
|
|
515
|
-
let form = result;
|
|
516
|
-
if (!form || !form[0]) {
|
|
517
|
-
resolve(lFormFieldsToken);
|
|
518
|
-
}
|
|
519
|
-
lFormFieldsToken = [];
|
|
520
|
-
for (let formComp of form) {
|
|
521
|
-
let newComponents;
|
|
522
|
-
let components = [];
|
|
523
|
-
if (formComp.components) {
|
|
524
|
-
newComponents = formComp.components;
|
|
525
|
-
}
|
|
526
|
-
else if (formComp.columns) {
|
|
527
|
-
newComponents = formComp.columns;
|
|
528
|
-
}
|
|
529
|
-
if (newComponents && UtilString.isValid(formComp.title)) {
|
|
530
|
-
lFormFieldsToken.push({
|
|
531
|
-
title: {
|
|
532
|
-
key: TokenService.getKeyFormulario(formComp.title),
|
|
533
|
-
value: formComp.title,
|
|
534
|
-
object: formComp
|
|
535
|
-
},
|
|
536
|
-
value: []
|
|
537
|
-
});
|
|
538
|
-
lFormFieldsToken[lFormFieldsToken.length - 1].value =
|
|
539
|
-
this.getComponenetForm(components, newComponents, null, false, null);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
resolve(lFormFieldsToken);
|
|
543
|
-
}, (error) => {
|
|
544
|
-
reject(error);
|
|
545
|
-
});
|
|
546
|
-
});
|
|
547
|
-
}
|
|
548
|
-
/** This promise allows to execute a function when consulting the form fields. */
|
|
549
|
-
getFormPanelsByPromCode(promCodigo) {
|
|
550
|
-
return new Promise((resolve, reject) => {
|
|
551
|
-
// Search the dynamic form
|
|
552
|
-
let lFormPannelsToken = null;
|
|
553
|
-
this.formService.getByPromCodigo(promCodigo).subscribe((result) => {
|
|
554
|
-
let form = result;
|
|
555
|
-
if (!form ||
|
|
556
|
-
!form[0] ||
|
|
557
|
-
!form[0].promCodigo ||
|
|
558
|
-
form[0].promCodigo != promCodigo) {
|
|
559
|
-
// this.router.navigate(['404']);
|
|
560
|
-
resolve(lFormPannelsToken);
|
|
561
|
-
}
|
|
562
|
-
lFormPannelsToken = [];
|
|
563
|
-
for (let formComp of form) {
|
|
564
|
-
let newComponents;
|
|
565
|
-
let components = [];
|
|
566
|
-
if (formComp.components) {
|
|
567
|
-
newComponents = formComp.components;
|
|
568
|
-
}
|
|
569
|
-
else if (formComp.columns) {
|
|
570
|
-
newComponents = formComp.columns;
|
|
571
|
-
}
|
|
572
|
-
if (newComponents && UtilString.isValid(formComp.title)) {
|
|
573
|
-
lFormPannelsToken.push({
|
|
574
|
-
title: {
|
|
575
|
-
key: TokenService.getKeyFormulario(formComp.title),
|
|
576
|
-
value: formComp.title,
|
|
577
|
-
object: formComp
|
|
578
|
-
},
|
|
579
|
-
value: []
|
|
580
|
-
});
|
|
581
|
-
lFormPannelsToken[lFormPannelsToken.length - 1].value =
|
|
582
|
-
this.getPanelComponenet(components, newComponents, null);
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
resolve(lFormPannelsToken);
|
|
586
|
-
}, (error) => {
|
|
587
|
-
reject(error);
|
|
588
|
-
});
|
|
589
|
-
});
|
|
590
|
-
}
|
|
591
|
-
/**
|
|
592
|
-
* A recursive method to get all the information of the editGrid dynamic form
|
|
593
|
-
* @param components
|
|
594
|
-
* @param form
|
|
595
|
-
*/
|
|
596
|
-
getPanelComponenet(components, form, panelName) {
|
|
597
|
-
for (let formComp of form) {
|
|
598
|
-
if (formComp.type === 'panel') {
|
|
599
|
-
components.push(formComp);
|
|
600
|
-
}
|
|
601
|
-
else if (formComp.components || formComp.columns) {
|
|
602
|
-
let newComponents;
|
|
603
|
-
if (formComp.components) {
|
|
604
|
-
newComponents = formComp.components;
|
|
605
|
-
}
|
|
606
|
-
else if (formComp.columns) {
|
|
607
|
-
newComponents = formComp.columns;
|
|
608
|
-
}
|
|
609
|
-
components = this.getPanelComponenet(components, newComponents, panelName);
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
return components;
|
|
613
|
-
}
|
|
614
|
-
/**
|
|
615
|
-
* A recursive method to get all the information of the components a columns of the dynamic form
|
|
616
|
-
* @param components
|
|
617
|
-
* @param form
|
|
618
|
-
*/
|
|
619
|
-
getComponenetForm(components, form, panelName, editgrid, editGridKey) {
|
|
620
|
-
for (let formComp of form) {
|
|
621
|
-
//MO- mantis 8743 fix address token
|
|
622
|
-
if ((formComp.components || formComp.columns) &&
|
|
623
|
-
formComp.type !== 'address' &&
|
|
624
|
-
formComp.type !== 'editgrid') {
|
|
625
|
-
let newComponents;
|
|
626
|
-
if (formComp.components) {
|
|
627
|
-
newComponents = formComp.components;
|
|
628
|
-
if (formComp.type === 'editgrid') {
|
|
629
|
-
editgrid = true;
|
|
630
|
-
editGridKey = formComp.key;
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
else if (formComp.columns) {
|
|
634
|
-
newComponents = formComp.columns;
|
|
635
|
-
}
|
|
636
|
-
if (formComp.type && formComp.type === 'panel') {
|
|
637
|
-
panelName = formComp.title;
|
|
638
|
-
}
|
|
639
|
-
components = this.getComponenetForm(components, newComponents, panelName, editgrid, editGridKey);
|
|
640
|
-
}
|
|
641
|
-
else {
|
|
642
|
-
formComp.panelName = panelName;
|
|
643
|
-
formComp.editgrid = editgrid;
|
|
644
|
-
formComp.editGridKey = editGridKey;
|
|
645
|
-
components.push(formComp);
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
return components;
|
|
649
|
-
}
|
|
650
|
-
/** This promise allows to execute a function when consulting the form fields. */
|
|
651
|
-
getFormEditGridFieldsByPromCode(promCodigo) {
|
|
652
|
-
return new Promise((resolve, reject) => {
|
|
653
|
-
// Search the dynamic form
|
|
654
|
-
let lFormFieldsToken = null;
|
|
655
|
-
this.formService.getByPromCodigo(promCodigo).subscribe((result) => {
|
|
656
|
-
let form = result;
|
|
657
|
-
if (!form ||
|
|
658
|
-
!form[0] ||
|
|
659
|
-
!form[0].promCodigo ||
|
|
660
|
-
form[0].promCodigo != promCodigo) {
|
|
661
|
-
// this.router.navigate(['404']);
|
|
662
|
-
resolve(lFormFieldsToken);
|
|
663
|
-
}
|
|
664
|
-
lFormFieldsToken = [];
|
|
665
|
-
for (let formComp of form) {
|
|
666
|
-
let newComponents;
|
|
667
|
-
let components = [];
|
|
668
|
-
if (formComp.components) {
|
|
669
|
-
newComponents = formComp.components;
|
|
670
|
-
}
|
|
671
|
-
else if (formComp.columns) {
|
|
672
|
-
newComponents = formComp.columns;
|
|
673
|
-
}
|
|
674
|
-
if (newComponents && UtilString.isValid(formComp.title)) {
|
|
675
|
-
lFormFieldsToken.push({
|
|
676
|
-
title: {
|
|
677
|
-
key: TokenService.getKeyFormulario(formComp.title),
|
|
678
|
-
value: formComp.title,
|
|
679
|
-
object: formComp
|
|
680
|
-
},
|
|
681
|
-
value: []
|
|
682
|
-
});
|
|
683
|
-
lFormFieldsToken[lFormFieldsToken.length - 1].value =
|
|
684
|
-
this.getEditGridComponenet(components, newComponents, null);
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
resolve(lFormFieldsToken);
|
|
688
|
-
}, (error) => {
|
|
689
|
-
reject(error);
|
|
690
|
-
});
|
|
691
|
-
});
|
|
692
|
-
}
|
|
693
|
-
/**
|
|
694
|
-
* A recursive method to get all the information of the editGrid dynamic form
|
|
695
|
-
* @param components
|
|
696
|
-
* @param form
|
|
697
|
-
*/
|
|
698
|
-
getEditGridComponenet(components, form, panelName) {
|
|
699
|
-
for (let formComp of form) {
|
|
700
|
-
if (formComp.type === 'editgrid') {
|
|
701
|
-
formComp.panelName = panelName;
|
|
702
|
-
components.push(formComp);
|
|
703
|
-
}
|
|
704
|
-
else if (formComp.components || formComp.columns) {
|
|
705
|
-
let newComponents;
|
|
706
|
-
if (formComp.components) {
|
|
707
|
-
newComponents = formComp.components;
|
|
708
|
-
}
|
|
709
|
-
else if (formComp.columns) {
|
|
710
|
-
newComponents = formComp.columns;
|
|
711
|
-
}
|
|
712
|
-
if (formComp.type && formComp.type === 'panel') {
|
|
713
|
-
panelName = formComp.title;
|
|
714
|
-
}
|
|
715
|
-
components = this.getEditGridComponenet(components, newComponents, panelName);
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
return components;
|
|
719
|
-
}
|
|
720
|
-
/** It returns the tokens by promCodigo */
|
|
721
|
-
getListByPromCodigo(promCode) {
|
|
722
|
-
return this.httpClient.get(this.environment.host.backend.configuration + 'token/getByPromCodigo', { params: new HttpParams().set('promCodigo', promCode.toString()) });
|
|
723
|
-
}
|
|
724
|
-
/** It returns the token by id */
|
|
725
|
-
getById(id) {
|
|
726
|
-
return this.httpClient.get(this.environment.host.backend.configuration + 'token/getById', {
|
|
727
|
-
params: new HttpParams().set('id', id.toString())
|
|
728
|
-
});
|
|
729
|
-
}
|
|
730
|
-
/** It deletes a form by id */
|
|
731
|
-
delete(id) {
|
|
732
|
-
return this.httpClient.delete(this.environment.host.backend.configuration + 'token/delete', { params: new HttpParams().set('id', id) });
|
|
733
|
-
}
|
|
734
|
-
/** It saves the token */
|
|
735
|
-
save(token) {
|
|
736
|
-
return this.httpClient.post(this.environment.host.backend.configuration + 'token/save', token, HEADER_JSON);
|
|
737
|
-
}
|
|
738
|
-
static getKeyFormulario(formTitle) {
|
|
739
|
-
if (UtilString.isValid(formTitle)) {
|
|
740
|
-
return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_FORM) +
|
|
741
|
-
UtilString.replaceAccentSpacesOthers(formTitle).replace(/_/g, '-'));
|
|
742
|
-
}
|
|
743
|
-
return '';
|
|
744
|
-
}
|
|
745
|
-
/** It returns the unique verification code */
|
|
746
|
-
getUniqueVerificationCode(login, token) {
|
|
747
|
-
return this.httpClient.get(this.environment.host.backend.documentsRepository +
|
|
748
|
-
'documento/consultarCodigoUnico/' +
|
|
749
|
-
login +
|
|
750
|
-
'/' +
|
|
751
|
-
token, { params: new HttpParams() });
|
|
752
|
-
}
|
|
753
|
-
/** It send the information to copy the Document viewer */
|
|
754
|
-
copyDocumentInformationViewer(login, token, uniqueCode, documentURL, documentName) {
|
|
755
|
-
let infoDocumento = {
|
|
756
|
-
codigoUnico: uniqueCode,
|
|
757
|
-
rutaDocumento: documentURL,
|
|
758
|
-
documentName: documentName
|
|
759
|
-
};
|
|
760
|
-
return this.httpClient.post(this.environment.host.backend.documentsRepository +
|
|
761
|
-
'documento/adicionarDocumento/' +
|
|
762
|
-
login +
|
|
763
|
-
'/' +
|
|
764
|
-
token, infoDocumento, HEADER_JSON);
|
|
765
|
-
}
|
|
766
|
-
static getKeyBudget() {
|
|
767
|
-
return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_BUDGET);
|
|
768
|
-
}
|
|
769
|
-
static getKeyDocument() {
|
|
770
|
-
return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_DOCUMENTO);
|
|
771
|
-
}
|
|
772
|
-
static getKeyDocumentAnalysis() {
|
|
773
|
-
return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_DOCUMENTO_ANALYSIS_TYPE);
|
|
774
|
-
}
|
|
775
|
-
static getKeyTask() {
|
|
776
|
-
return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_TASKL);
|
|
777
|
-
}
|
|
778
|
-
static getKeyStatic() {
|
|
779
|
-
return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_STATIC);
|
|
780
|
-
}
|
|
781
|
-
static getKeyCalculated(token) {
|
|
782
|
-
return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_CALCULATED) +
|
|
783
|
-
'_' +
|
|
784
|
-
UtilString.replaceAccentSpacesOthers(token.name));
|
|
785
|
-
}
|
|
786
|
-
static getKeySnapshot(token) {
|
|
787
|
-
return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_SNAPSHOT) +
|
|
788
|
-
'_' +
|
|
789
|
-
UtilString.replaceAccentSpacesOthers(token.name));
|
|
790
|
-
}
|
|
791
|
-
static getKeyGuarantee(token) {
|
|
792
|
-
return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_GUARANTEE) +
|
|
793
|
-
'_' +
|
|
794
|
-
UtilString.replaceAccentSpacesOthers(token.name));
|
|
795
|
-
}
|
|
796
|
-
/**
|
|
797
|
-
* Return a value that represent the type of label: 1=Form, 2=Budget, 3=Static, 4=Calculated
|
|
798
|
-
* @param key Value to evalueate
|
|
799
|
-
*/
|
|
800
|
-
static getKeyType(key) {
|
|
801
|
-
key = key.replace('{', '').replace('}', '');
|
|
802
|
-
key = key.substring(1, key.indexOf('_'));
|
|
803
|
-
if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_FORM))) {
|
|
804
|
-
return 1;
|
|
805
|
-
}
|
|
806
|
-
else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_BUDGET))) {
|
|
807
|
-
return 2;
|
|
808
|
-
}
|
|
809
|
-
else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_STATIC))) {
|
|
810
|
-
return 3;
|
|
811
|
-
}
|
|
812
|
-
else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_CALCULATED))) {
|
|
813
|
-
return 4;
|
|
814
|
-
}
|
|
815
|
-
else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_TASKL))) {
|
|
816
|
-
return 5;
|
|
817
|
-
}
|
|
818
|
-
else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_DOCUMENTO_ANALYSIS_TYPE))) {
|
|
819
|
-
return 6;
|
|
820
|
-
}
|
|
821
|
-
return null;
|
|
822
|
-
}
|
|
823
|
-
/**
|
|
824
|
-
* Depends of the type of formFieldToken return de value of the valueData
|
|
825
|
-
* @param formFieldToken
|
|
826
|
-
* @param valueData
|
|
827
|
-
*/
|
|
828
|
-
getValueFromFormField(formFieldToken, valueData) {
|
|
829
|
-
if (typeof valueData == 'object') {
|
|
830
|
-
if (formFieldToken.type) {
|
|
831
|
-
if (formFieldToken.type == 'address') {
|
|
832
|
-
return valueData.formatted_address;
|
|
833
|
-
}
|
|
834
|
-
if (formFieldToken.type == 'select' &&
|
|
835
|
-
valueData.hasOwnProperty(formFieldToken.searchField)) {
|
|
836
|
-
if (valueData.hasOwnProperty('original_name') !== '') {
|
|
837
|
-
return valueData.original_name;
|
|
838
|
-
}
|
|
839
|
-
else if (valueData.hasOwnProperty('nativeName') !== '') {
|
|
840
|
-
return valueData.nativeName;
|
|
841
|
-
}
|
|
842
|
-
else if (formFieldToken.searchField) {
|
|
843
|
-
return valueData[formFieldToken.searchField];
|
|
844
|
-
}
|
|
845
|
-
}
|
|
846
|
-
}
|
|
847
|
-
}
|
|
848
|
-
return valueData;
|
|
849
|
-
}
|
|
850
|
-
formatDate(value, locale) {
|
|
851
|
-
const date = new Date(value);
|
|
852
|
-
const months = {
|
|
853
|
-
es: [
|
|
854
|
-
'enero',
|
|
855
|
-
'febrero',
|
|
856
|
-
'marzo',
|
|
857
|
-
'abril',
|
|
858
|
-
'mayo',
|
|
859
|
-
'junio',
|
|
860
|
-
'julio',
|
|
861
|
-
'agosto',
|
|
862
|
-
'septiembre',
|
|
863
|
-
'octubre',
|
|
864
|
-
'noviembre',
|
|
865
|
-
'diciembre'
|
|
866
|
-
],
|
|
867
|
-
en: [
|
|
868
|
-
'January',
|
|
869
|
-
'February',
|
|
870
|
-
'March',
|
|
871
|
-
'April',
|
|
872
|
-
'May',
|
|
873
|
-
'June',
|
|
874
|
-
'July',
|
|
875
|
-
'August',
|
|
876
|
-
'September',
|
|
877
|
-
'October',
|
|
878
|
-
'November',
|
|
879
|
-
'December'
|
|
880
|
-
],
|
|
881
|
-
fr: [
|
|
882
|
-
'janvier',
|
|
883
|
-
'février',
|
|
884
|
-
'mars',
|
|
885
|
-
'avril',
|
|
886
|
-
'mai',
|
|
887
|
-
'juin',
|
|
888
|
-
'juillet',
|
|
889
|
-
'août',
|
|
890
|
-
'septembre',
|
|
891
|
-
'octobre',
|
|
892
|
-
'novembre',
|
|
893
|
-
'décembre'
|
|
894
|
-
],
|
|
895
|
-
de: [
|
|
896
|
-
'Januar',
|
|
897
|
-
'Februar',
|
|
898
|
-
'März',
|
|
899
|
-
'April',
|
|
900
|
-
'Mai',
|
|
901
|
-
'Juni',
|
|
902
|
-
'Juli',
|
|
903
|
-
'August',
|
|
904
|
-
'September',
|
|
905
|
-
'Oktober',
|
|
906
|
-
'November',
|
|
907
|
-
'Dezember'
|
|
908
|
-
],
|
|
909
|
-
it: [
|
|
910
|
-
'gennaio',
|
|
911
|
-
'febbraio',
|
|
912
|
-
'marzo',
|
|
913
|
-
'aprile',
|
|
914
|
-
'maggio',
|
|
915
|
-
'giugno',
|
|
916
|
-
'luglio',
|
|
917
|
-
'agosto',
|
|
918
|
-
'settembre',
|
|
919
|
-
'ottobre',
|
|
920
|
-
'novembre',
|
|
921
|
-
'dicembre'
|
|
922
|
-
]
|
|
923
|
-
};
|
|
924
|
-
const localeMonths = months[locale];
|
|
925
|
-
const month = localeMonths[date.getMonth()];
|
|
926
|
-
const year = date.getFullYear();
|
|
927
|
-
return `${month} ${year}`;
|
|
928
|
-
}
|
|
929
|
-
/**
|
|
930
|
-
* Try to find the token in the stringText and replace with dataValue. If detect format of number or date try to format the dataValue
|
|
931
|
-
* @param stringText
|
|
932
|
-
* @param token
|
|
933
|
-
* @param dataValue
|
|
934
|
-
*/
|
|
935
|
-
replaceToken(stringText, token, dataValue, locale) {
|
|
936
|
-
let valueReplace = null;
|
|
937
|
-
if (token && token[0] == '#') {
|
|
938
|
-
let typeToken = token.substring(1, token.indexOf('('));
|
|
939
|
-
if (typeToken == 'date') {
|
|
940
|
-
let dateFormat = token.substring(token.indexOf('}') + 1, token.indexOf(')'));
|
|
941
|
-
dateFormat = dateFormat.trim().replace(/\"/g, '').replace(/\'/g, '');
|
|
942
|
-
let dateValue = DateUtil.getDate(dataValue);
|
|
943
|
-
if (locale != null && locale) {
|
|
944
|
-
valueReplace = this.formatDate(dateValue, locale);
|
|
945
|
-
}
|
|
946
|
-
else if (dateValue) {
|
|
947
|
-
valueReplace = DateUtil.getMoment(dateValue).format(dateFormat);
|
|
948
|
-
}
|
|
949
|
-
else {
|
|
950
|
-
valueReplace = '';
|
|
951
|
-
}
|
|
952
|
-
}
|
|
953
|
-
else if (typeToken == 'number') {
|
|
954
|
-
let numberValue = Number(dataValue);
|
|
955
|
-
if (numberValue != undefined && !isNaN(numberValue)) {
|
|
956
|
-
let numberFormat = token.substring(token.indexOf('}') + 1, token.indexOf(')'));
|
|
957
|
-
numberFormat = numberFormat.trim().replace(/\"/g, '').replace(/\'/g, '');
|
|
958
|
-
valueReplace = this.currencyPipe.transform(numberValue, this.locale, '', numberFormat);
|
|
959
|
-
}
|
|
960
|
-
else {
|
|
961
|
-
console.log('El dato [' +
|
|
962
|
-
dataValue +
|
|
963
|
-
'] para el token [' +
|
|
964
|
-
token +
|
|
965
|
-
'] tipo númerico no es valido');
|
|
966
|
-
valueReplace = '';
|
|
967
|
-
}
|
|
968
|
-
}
|
|
969
|
-
else {
|
|
970
|
-
console.log('tipo de token indefinido. [typeToken[' + typeToken + ']]');
|
|
971
|
-
}
|
|
972
|
-
}
|
|
973
|
-
else if (token && token[0] == '$') {
|
|
974
|
-
if (dataValue !== null &&
|
|
975
|
-
dataValue !== undefined &&
|
|
976
|
-
dataValue.original_name !== undefined &&
|
|
977
|
-
dataValue.original_name !== null) {
|
|
978
|
-
valueReplace = dataValue.original_name;
|
|
979
|
-
}
|
|
980
|
-
else {
|
|
981
|
-
valueReplace = dataValue;
|
|
982
|
-
}
|
|
983
|
-
// valueReplace = dataValue;
|
|
984
|
-
}
|
|
985
|
-
else {
|
|
986
|
-
console.log('El token no es valido. [token[' + token + ']]');
|
|
987
|
-
}
|
|
988
|
-
if (stringText && valueReplace !== null) {
|
|
989
|
-
if (token && token === '${estatico_' + TokenService.STATIC_TOKEN_SURNAME + '}') {
|
|
990
|
-
valueReplace = dataValue;
|
|
991
|
-
stringText = stringText.split(token).join(valueReplace);
|
|
992
|
-
}
|
|
993
|
-
else {
|
|
994
|
-
// replace text in a more efficient way
|
|
995
|
-
stringText = stringText.split(token).join(valueReplace);
|
|
996
|
-
//stringText = stringText.replace(token, valueReplace);
|
|
997
|
-
}
|
|
998
|
-
}
|
|
999
|
-
return stringText;
|
|
1000
|
-
}
|
|
1001
|
-
getListTokensByStringSegmentation(stringText) {
|
|
1002
|
-
const arrayToken = stringText.match(/\${([^}]+)\}/g);
|
|
1003
|
-
const arrayTokenFormattedDate = stringText.match(/\#date[^)]+\)/g);
|
|
1004
|
-
const arrayTokenFormattedNumber = stringText.match(/\#number[^)]+\)/g);
|
|
1005
|
-
let arrayTokenFormatted = [];
|
|
1006
|
-
if (arrayTokenFormattedDate &&
|
|
1007
|
-
arrayTokenFormattedDate.length > 0 &&
|
|
1008
|
-
arrayTokenFormattedNumber &&
|
|
1009
|
-
arrayTokenFormattedNumber.length > 0) {
|
|
1010
|
-
arrayTokenFormatted = arrayTokenFormattedDate.concat(arrayTokenFormattedNumber);
|
|
1011
|
-
}
|
|
1012
|
-
else if (arrayTokenFormattedDate && arrayTokenFormattedDate.length > 0) {
|
|
1013
|
-
arrayTokenFormatted = arrayTokenFormattedDate.slice();
|
|
1014
|
-
}
|
|
1015
|
-
else if (arrayTokenFormattedNumber && arrayTokenFormattedNumber.length > 0) {
|
|
1016
|
-
arrayTokenFormatted = arrayTokenFormattedNumber.slice();
|
|
1017
|
-
}
|
|
1018
|
-
const result = [];
|
|
1019
|
-
if (arrayToken) {
|
|
1020
|
-
for (const token of arrayToken) {
|
|
1021
|
-
const infoToken = { key: token, value: token };
|
|
1022
|
-
if (arrayTokenFormatted) {
|
|
1023
|
-
for (const tokenFormatted of arrayTokenFormatted) {
|
|
1024
|
-
const index = tokenFormatted.indexOf(token);
|
|
1025
|
-
if (index >= 0) {
|
|
1026
|
-
infoToken.value = tokenFormatted;
|
|
1027
|
-
break;
|
|
1028
|
-
}
|
|
1029
|
-
}
|
|
1030
|
-
}
|
|
1031
|
-
result.push(infoToken);
|
|
1032
|
-
}
|
|
1033
|
-
}
|
|
1034
|
-
return result;
|
|
1035
|
-
}
|
|
1036
|
-
changeIdPropertiesOfObject(normalizationColumns, listData) {
|
|
1037
|
-
const newData = [];
|
|
1038
|
-
listData.forEach((data) => {
|
|
1039
|
-
const objData = {};
|
|
1040
|
-
Object.keys(data).forEach((property) => {
|
|
1041
|
-
if (data.hasOwnProperty(property)) {
|
|
1042
|
-
normalizationColumns.forEach((column) => {
|
|
1043
|
-
if (column.idColumn.toString() === property) {
|
|
1044
|
-
objData[column.key] = data[property];
|
|
1045
|
-
}
|
|
1046
|
-
});
|
|
1047
|
-
}
|
|
1048
|
-
});
|
|
1049
|
-
if (objData) {
|
|
1050
|
-
newData.push(objData);
|
|
1051
|
-
}
|
|
1052
|
-
});
|
|
1053
|
-
return newData;
|
|
1054
|
-
}
|
|
1055
|
-
generateHtmlByTokensAndData(html, listData, listTokens) {
|
|
1056
|
-
const translatedCards = [];
|
|
1057
|
-
listData.forEach((data) => {
|
|
1058
|
-
const objToken = {};
|
|
1059
|
-
const htmlTranslated = { html: html };
|
|
1060
|
-
Object.keys(data).forEach((property) => {
|
|
1061
|
-
listTokens.forEach((token) => {
|
|
1062
|
-
if (property == token.key.replace('${', '').replace('}', '')) {
|
|
1063
|
-
objToken[token.key] = data[property];
|
|
1064
|
-
htmlTranslated.html = htmlTranslated.html.replace(token.key, data[property]);
|
|
1065
|
-
}
|
|
1066
|
-
});
|
|
1067
|
-
});
|
|
1068
|
-
translatedCards.push(htmlTranslated);
|
|
1069
|
-
});
|
|
1070
|
-
return translatedCards;
|
|
1071
|
-
}
|
|
1072
|
-
getListTokensByString(stringText) {
|
|
1073
|
-
var arrayToken = stringText.match(/\${([^}]+)\}/g);
|
|
1074
|
-
var arrayTokenFormattedDate = stringText.match(/\#date[^)]+\)/g);
|
|
1075
|
-
var arrayTokenFormattedNumber = stringText.match(/\#number[^)]+\)/g);
|
|
1076
|
-
var arrayTokenFormatted = [];
|
|
1077
|
-
if (arrayTokenFormattedDate &&
|
|
1078
|
-
arrayTokenFormattedDate.length > 0 &&
|
|
1079
|
-
arrayTokenFormattedNumber &&
|
|
1080
|
-
arrayTokenFormattedNumber.length > 0) {
|
|
1081
|
-
arrayTokenFormatted = arrayTokenFormattedDate.concat(arrayTokenFormattedNumber);
|
|
1082
|
-
}
|
|
1083
|
-
else if (arrayTokenFormattedDate && arrayTokenFormattedDate.length > 0) {
|
|
1084
|
-
arrayTokenFormatted = arrayTokenFormattedDate.slice();
|
|
1085
|
-
}
|
|
1086
|
-
else if (arrayTokenFormattedNumber && arrayTokenFormattedNumber.length > 0) {
|
|
1087
|
-
arrayTokenFormatted = arrayTokenFormattedNumber.slice();
|
|
1088
|
-
}
|
|
1089
|
-
var result = [];
|
|
1090
|
-
if (arrayToken) {
|
|
1091
|
-
for (const token of arrayToken) {
|
|
1092
|
-
let keyType = TokenService.getKeyType(token);
|
|
1093
|
-
if (keyType === null) {
|
|
1094
|
-
continue;
|
|
1095
|
-
}
|
|
1096
|
-
var infoToken = { key: token, value: token };
|
|
1097
|
-
if (arrayTokenFormatted) {
|
|
1098
|
-
for (const tokenFormatted of arrayTokenFormatted) {
|
|
1099
|
-
var index = tokenFormatted.indexOf(token);
|
|
1100
|
-
if (index >= 0) {
|
|
1101
|
-
infoToken.value = tokenFormatted;
|
|
1102
|
-
break;
|
|
1103
|
-
}
|
|
1104
|
-
}
|
|
1105
|
-
}
|
|
1106
|
-
result.push(infoToken);
|
|
1107
|
-
}
|
|
1108
|
-
}
|
|
1109
|
-
return result;
|
|
1110
|
-
// let tokens: any[] = [];
|
|
1111
|
-
// let i = this.nextValidPositionTokens(stringText, 0);
|
|
1112
|
-
// let count = 0;
|
|
1113
|
-
// while (i >= 0 && count <= 10) {
|
|
1114
|
-
// let infoToken: {} = null;
|
|
1115
|
-
// let nextI: number = i;
|
|
1116
|
-
// let character = stringText.substring(i, (i + 1));
|
|
1117
|
-
// if (character == "$") {
|
|
1118
|
-
// let nextCharacter = stringText.substring((i + 1), (i + 2));
|
|
1119
|
-
// // The next character need to be a { sign
|
|
1120
|
-
// if (nextCharacter != "{") {
|
|
1121
|
-
// i = this.nextValidPositionTokens(stringText, nextI + 1);
|
|
1122
|
-
// continue;
|
|
1123
|
-
// }
|
|
1124
|
-
// let keyToken: string = stringText.substring(i, stringText.indexOf("}", i) + 1);
|
|
1125
|
-
// // If the token have a valid key type
|
|
1126
|
-
// let keyType: number = TokenService.getKeyType(keyToken.replace("{", "").replace("}", ""));
|
|
1127
|
-
// if (keyType === null) {
|
|
1128
|
-
// i = this.nextValidPositionTokens(stringText, nextI + 1);
|
|
1129
|
-
// continue;
|
|
1130
|
-
// }
|
|
1131
|
-
// infoToken = {
|
|
1132
|
-
// key: keyToken,
|
|
1133
|
-
// value: keyToken
|
|
1134
|
-
// };
|
|
1135
|
-
// nextI = stringText.indexOf("}", i);
|
|
1136
|
-
// } else {
|
|
1137
|
-
// let nextSign: number = stringText.indexOf("$", i);
|
|
1138
|
-
// // We inly support #date($ and #number($ in this 2 scenarios the lenght can't be more than 10 characters
|
|
1139
|
-
// if (nextSign < 0 || (nextSign - i) > 10) {
|
|
1140
|
-
// i = this.nextValidPositionTokens(stringText, nextI + 1);
|
|
1141
|
-
// continue;
|
|
1142
|
-
// }
|
|
1143
|
-
// let keyToken: string = stringText.substring(stringText.indexOf("$", i), stringText.indexOf("}", i) + 1);
|
|
1144
|
-
// let valueToken: string = stringText.substring(i, stringText.indexOf(")", i) + 1);
|
|
1145
|
-
// infoToken = {
|
|
1146
|
-
// key: keyToken,
|
|
1147
|
-
// value: valueToken
|
|
1148
|
-
// };
|
|
1149
|
-
// nextI = stringText.indexOf(")", i);
|
|
1150
|
-
// }
|
|
1151
|
-
// tokens.push(infoToken);
|
|
1152
|
-
// i = this.nextValidPositionTokens(stringText, nextI);
|
|
1153
|
-
// count++;
|
|
1154
|
-
// }
|
|
1155
|
-
// return tokens;
|
|
1156
|
-
}
|
|
1157
|
-
nextValidPositionTokens(stringText, nextI) {
|
|
1158
|
-
let tokenDollarSign = stringText.indexOf('$', nextI);
|
|
1159
|
-
let tokenNumSign = stringText.indexOf('#', nextI);
|
|
1160
|
-
let i = tokenDollarSign < 0 && tokenNumSign >= 0
|
|
1161
|
-
? tokenNumSign
|
|
1162
|
-
: tokenNumSign < 0 && tokenDollarSign >= 0
|
|
1163
|
-
? tokenDollarSign
|
|
1164
|
-
: tokenDollarSign < tokenNumSign
|
|
1165
|
-
? tokenDollarSign
|
|
1166
|
-
: tokenNumSign;
|
|
1167
|
-
return i;
|
|
1168
|
-
}
|
|
1169
|
-
/**
|
|
1170
|
-
* It reuses replaceTokensFromListObjectPublic but set all keys lobjecttokens as lowercase
|
|
1171
|
-
* @param tokenName
|
|
1172
|
-
* @param formula
|
|
1173
|
-
* @param lObjectTokens
|
|
1174
|
-
*/
|
|
1175
|
-
replaceTokensFromListObjectPublic(tokenName, formula, lObjectTokens) {
|
|
1176
|
-
let lDataOrg = [];
|
|
1177
|
-
if (lObjectTokens) {
|
|
1178
|
-
for (let dataForm in lObjectTokens) {
|
|
1179
|
-
lDataOrg[dataForm.toLowerCase()] = lObjectTokens[dataForm];
|
|
1180
|
-
}
|
|
1181
|
-
}
|
|
1182
|
-
return this.replaceTokensFromListObject(tokenName, formula, lDataOrg);
|
|
1183
|
-
}
|
|
1184
|
-
/**
|
|
1185
|
-
* @param tokenName token name
|
|
1186
|
-
* @param formula String with the formula to execute
|
|
1187
|
-
* @param lObjectTokens List of tokens with the values to replace
|
|
1188
|
-
*/
|
|
1189
|
-
replaceTokensFromListObject(tokenName, formula, lObjectTokens) {
|
|
1190
|
-
if (!formula || formula.length == 0) {
|
|
1191
|
-
throw {
|
|
1192
|
-
message: 'La formula del token ' + tokenName + ' esta vacía',
|
|
1193
|
-
title: 'Alerta!',
|
|
1194
|
-
error: 'La formula del token ' + tokenName + ' esta vacía. [formula[' + formula + ']]'
|
|
1195
|
-
};
|
|
1196
|
-
}
|
|
1197
|
-
let replacedTokens = formula.toString();
|
|
1198
|
-
if (replacedTokens.startsWith('file://')) {
|
|
1199
|
-
return replacedTokens;
|
|
1200
|
-
}
|
|
1201
|
-
// Find the tokens in the formula
|
|
1202
|
-
let tokensArray = this.getListTokensByString(replacedTokens);
|
|
1203
|
-
if (tokensArray.length == 0) {
|
|
1204
|
-
return replacedTokens;
|
|
1205
|
-
}
|
|
1206
|
-
// If there any token, try to replace
|
|
1207
|
-
for (let i = 0; i < tokensArray.length; i++) {
|
|
1208
|
-
let objectToken = lObjectTokens[tokensArray[i].key] !== undefined
|
|
1209
|
-
? lObjectTokens[tokensArray[i].key]
|
|
1210
|
-
: null;
|
|
1211
|
-
let clearKey;
|
|
1212
|
-
if (objectToken == null) {
|
|
1213
|
-
clearKey = tokensArray[i].key.replace('${', '').replace('}', '').toLowerCase();
|
|
1214
|
-
objectToken =
|
|
1215
|
-
lObjectTokens[clearKey] !== undefined ? lObjectTokens[clearKey] : null;
|
|
1216
|
-
if (objectToken == null) {
|
|
1217
|
-
clearKey = tokensArray[i].key
|
|
1218
|
-
.replace('{', '')
|
|
1219
|
-
.replace('}', '')
|
|
1220
|
-
.split('_')[1]
|
|
1221
|
-
.toLowerCase();
|
|
1222
|
-
objectToken =
|
|
1223
|
-
lObjectTokens[clearKey] !== undefined ? lObjectTokens[clearKey] : null;
|
|
1224
|
-
if (objectToken === null || objectToken === undefined) {
|
|
1225
|
-
const arrayKey = tokensArray[i].key
|
|
1226
|
-
.replace('{', '')
|
|
1227
|
-
.replace('}', '')
|
|
1228
|
-
.split('_')[1]
|
|
1229
|
-
.split('.');
|
|
1230
|
-
if (arrayKey.length > 0) {
|
|
1231
|
-
let value = lObjectTokens;
|
|
1232
|
-
for (let index = 0; index < arrayKey.length; index++) {
|
|
1233
|
-
let element = arrayKey[index];
|
|
1234
|
-
if (index == 0) {
|
|
1235
|
-
element = element.toLowerCase();
|
|
1236
|
-
}
|
|
1237
|
-
value = value[element];
|
|
1238
|
-
}
|
|
1239
|
-
objectToken = value;
|
|
1240
|
-
}
|
|
1241
|
-
}
|
|
1242
|
-
}
|
|
1243
|
-
}
|
|
1244
|
-
if (objectToken == null) {
|
|
1245
|
-
// If not find the token, by default put an empty string
|
|
1246
|
-
/*if (TokenService.excludedToken.indexOf(clearKey) === -1) {
|
|
1247
|
-
console.error(
|
|
1248
|
-
'El token ' + tokensArray[i].value + ' no fue encontrado.',
|
|
1249
|
-
lObjectTokens,
|
|
1250
|
-
tokensArray
|
|
1251
|
-
);
|
|
1252
|
-
}*/
|
|
1253
|
-
objectToken = '';
|
|
1254
|
-
}
|
|
1255
|
-
if (objectToken != null) {
|
|
1256
|
-
// let value: any = Number(objectToken)
|
|
1257
|
-
// ? objectToken
|
|
1258
|
-
// : Array.isArray(objectToken)
|
|
1259
|
-
// ? JSON.stringify(objectToken)
|
|
1260
|
-
// : "'" + objectToken + "'";
|
|
1261
|
-
let value;
|
|
1262
|
-
if (Number(objectToken)) {
|
|
1263
|
-
value = Number(objectToken);
|
|
1264
|
-
}
|
|
1265
|
-
else if (Array.isArray(objectToken)) {
|
|
1266
|
-
value = Array.isArray(objectToken);
|
|
1267
|
-
}
|
|
1268
|
-
else if (JSON.stringify(objectToken)) {
|
|
1269
|
-
value = objectToken.original_name
|
|
1270
|
-
? "'" + objectToken.original_name + "'"
|
|
1271
|
-
: JSON.stringify(objectToken);
|
|
1272
|
-
}
|
|
1273
|
-
else {
|
|
1274
|
-
value = "'" + objectToken + "'";
|
|
1275
|
-
}
|
|
1276
|
-
replacedTokens = this.replaceToken(replacedTokens, tokensArray[i].value, value);
|
|
1277
|
-
// } else {
|
|
1278
|
-
// console.error(lObjectTokens, tokensArray);
|
|
1279
|
-
// throw {
|
|
1280
|
-
// message: "No se encontró valor para un token",
|
|
1281
|
-
// title: "Alerta!",
|
|
1282
|
-
// error: "El token " + tokensArray[i].value + " no fue encontrado."
|
|
1283
|
-
// };
|
|
1284
|
-
//
|
|
1285
|
-
// Si es la ultima iteracion y la formula tiene [ es porque tiene un array en el valor que resolvio el token
|
|
1286
|
-
if (i == tokensArray.length - 1 && replacedTokens.includes('[')) {
|
|
1287
|
-
// Se ponen todos los operandos como elementos en un array ['expresion a', '&&', 'Expresion B']
|
|
1288
|
-
let formExpressions = replacedTokens.split(/ (\|\||&&) /);
|
|
1289
|
-
let lAuxformExpression = [];
|
|
1290
|
-
formExpressions.forEach((expression) => {
|
|
1291
|
-
if (expression.charAt(0) == '[') {
|
|
1292
|
-
let isTagFound = '';
|
|
1293
|
-
isTagFound = this.findTag(expression);
|
|
1294
|
-
lAuxformExpression.push(isTagFound);
|
|
1295
|
-
}
|
|
1296
|
-
else {
|
|
1297
|
-
lAuxformExpression.push(expression);
|
|
1298
|
-
}
|
|
1299
|
-
});
|
|
1300
|
-
replacedTokens = lAuxformExpression.join(' ');
|
|
1301
|
-
}
|
|
1302
|
-
}
|
|
1303
|
-
}
|
|
1304
|
-
return replacedTokens;
|
|
1305
|
-
}
|
|
1306
|
-
/**
|
|
1307
|
-
* MEtodo que teniendo una expresion de la forma ['tag1', 'tag2']==tag3
|
|
1308
|
-
* evalua si tag3 hace parte del array si tiene el operador ==.
|
|
1309
|
-
* Si tiene el operador != examina que tag3 no haga parte del array+
|
|
1310
|
-
*
|
|
1311
|
-
* @param expression Operando que evalua tag. Es de la forma ['tag1', 'tag2']==tag3
|
|
1312
|
-
* @returns Retorna 'true' o 'false' en string que despues sera pasado a un eval()
|
|
1313
|
-
* mas adelante en el flujo
|
|
1314
|
-
*/
|
|
1315
|
-
findTag(expression) {
|
|
1316
|
-
let regexOperator = new RegExp('(===|==|!==|!=)');
|
|
1317
|
-
// Retorna el operador
|
|
1318
|
-
let operator = expression.match(regexOperator);
|
|
1319
|
-
// Si no encuentra un operador segun el patron retorna 'false'
|
|
1320
|
-
// para evitar resultados inesperados
|
|
1321
|
-
if (operator == null) {
|
|
1322
|
-
console.error('No se encontro un operador permitido para la expresion');
|
|
1323
|
-
return 'false';
|
|
1324
|
-
}
|
|
1325
|
-
// Separa la sentencia por el operador
|
|
1326
|
-
// La primera parte es el valor por el cual se remplaza el token que es un array en string "['a', 'b']"
|
|
1327
|
-
// El segundo es el valor con el cual se va a comparar
|
|
1328
|
-
let valueToken, valueToCompare;
|
|
1329
|
-
[valueToken, valueToCompare] = expression.split(operator[0]);
|
|
1330
|
-
// Se limpia el string correspondiente al array para que los elementos queden separados por ","
|
|
1331
|
-
valueToken = valueToken.replace(/[^a-zA-Z0-9 ,]/g, '');
|
|
1332
|
-
// Si no hay tags asociados al registro se devuelve 'false'
|
|
1333
|
-
if (!valueToken) {
|
|
1334
|
-
console.error('No hay tags asociados a esta aplicación');
|
|
1335
|
-
return 'false';
|
|
1336
|
-
}
|
|
1337
|
-
// Se limpia el string correspondiente al valor por comparar
|
|
1338
|
-
valueToCompare = valueToCompare.replace(/[^a-zA-Z0-9 ]/g, '');
|
|
1339
|
-
// El string correspondiente al array pasa a ser tipo array
|
|
1340
|
-
valueToken = valueToken.split(',');
|
|
1341
|
-
// Se trata de constatar si el valor a comparar se encuetra o no dentro
|
|
1342
|
-
// Si el operador que se encontro == returna true si lo encuentra
|
|
1343
|
-
let isTagFound = true;
|
|
1344
|
-
switch (operator[0]) {
|
|
1345
|
-
case '==':
|
|
1346
|
-
isTagFound = valueToken.some((tag) => tag == valueToCompare);
|
|
1347
|
-
break;
|
|
1348
|
-
case '===':
|
|
1349
|
-
isTagFound = valueToken.some((tag) => tag === valueToCompare);
|
|
1350
|
-
break;
|
|
1351
|
-
case '!==':
|
|
1352
|
-
isTagFound = valueToken.some((tag) => tag !== valueToCompare);
|
|
1353
|
-
break;
|
|
1354
|
-
case '!=':
|
|
1355
|
-
isTagFound = valueToken.some((tag) => tag != valueToCompare);
|
|
1356
|
-
break;
|
|
1357
|
-
default:
|
|
1358
|
-
break;
|
|
1359
|
-
}
|
|
1360
|
-
expression = isTagFound ? 'true' : 'false';
|
|
1361
|
-
return expression;
|
|
1362
|
-
}
|
|
1363
|
-
/**
|
|
1364
|
-
* Try to eval the formula depend of the type of fields.
|
|
1365
|
-
* @param lStaticToken
|
|
1366
|
-
* @param formulaName
|
|
1367
|
-
* @param formula
|
|
1368
|
-
*/
|
|
1369
|
-
validateFormula(lStaticToken, formulaName, formula) {
|
|
1370
|
-
let evalFormula = false;
|
|
1371
|
-
// To validate the formula, first organize the info to key - value array
|
|
1372
|
-
let objectTokens = [];
|
|
1373
|
-
for (let panel of lStaticToken) {
|
|
1374
|
-
for (let groupToken of panel.value) {
|
|
1375
|
-
for (let staticToken of groupToken.value) {
|
|
1376
|
-
for (let arrayTokenInfo of staticToken) {
|
|
1377
|
-
objectTokens[arrayTokenInfo.key] = arrayTokenInfo.object
|
|
1378
|
-
? arrayTokenInfo.object.type == 'number'
|
|
1379
|
-
? '0'
|
|
1380
|
-
: ''
|
|
1381
|
-
: '';
|
|
1382
|
-
}
|
|
1383
|
-
}
|
|
1384
|
-
}
|
|
1385
|
-
}
|
|
1386
|
-
try {
|
|
1387
|
-
formula = this.replaceTokensFromListObject(formulaName, formula, objectTokens);
|
|
1388
|
-
}
|
|
1389
|
-
catch (error) {
|
|
1390
|
-
//console.error(error);
|
|
1391
|
-
throw error;
|
|
1392
|
-
}
|
|
1393
|
-
if (formula !== null) {
|
|
1394
|
-
try {
|
|
1395
|
-
let result = formula.startsWith('file://') ? formula : eval(formula);
|
|
1396
|
-
evalFormula = true;
|
|
1397
|
-
}
|
|
1398
|
-
catch (e) {
|
|
1399
|
-
//console.error("Error evaluating the formula", e);
|
|
1400
|
-
throw {
|
|
1401
|
-
message: 'La formula no fue posible evaluar',
|
|
1402
|
-
title: 'Alerta!',
|
|
1403
|
-
error: e
|
|
1404
|
-
};
|
|
1405
|
-
}
|
|
1406
|
-
}
|
|
1407
|
-
return evalFormula;
|
|
1408
|
-
}
|
|
1409
|
-
getConfigCloningTokenMap(oldPPP, newPPP) {
|
|
1410
|
-
return this.httpClient.get(this.environment.host.backend.configuration + 'token/getConfigCloningTokenMap', {
|
|
1411
|
-
params: new HttpParams()
|
|
1412
|
-
.set('oldPPP', oldPPP.toString())
|
|
1413
|
-
.set('newPPP', newPPP.toString())
|
|
1414
|
-
});
|
|
1415
|
-
}
|
|
1416
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, deps: [{ token: 'environment' }, { token: i1.HttpClient }, { token: i2.FormService }, { token: i3.CurrencyPipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1417
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, providedIn: 'root' }); }
|
|
1418
|
-
}
|
|
1419
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, decorators: [{
|
|
1420
|
-
type: Injectable,
|
|
1421
|
-
args: [{
|
|
1422
|
-
providedIn: 'root'
|
|
1423
|
-
}]
|
|
1424
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
1425
|
-
type: Inject,
|
|
1426
|
-
args: ['environment']
|
|
1427
|
-
}] }, { type: i1.HttpClient }, { type: i2.FormService }, { type: i3.CurrencyPipe }], propDecorators: { locale: [{
|
|
1428
|
-
type: Inject,
|
|
1429
|
-
args: [LOCALE_ID]
|
|
1430
|
-
}] } });
|
|
1431
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBsaS1jb21tb25zL3NyYy9saWIvc2VydmljZXMvdG9rZW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUErQixVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFN0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7OztBQU1sRCxNQUFNLE9BQU8sWUFBWTtJQUN4QixNQUFNO2FBQ0MsdUJBQWtCLEdBQVcscUJBQXFCLEFBQWhDLENBQWlDO0lBSzFELE1BQU07YUFDQyxxQkFBZ0IsR0FBVyxLQUFLLEFBQWhCLENBQWlCO0lBQ3hDLE1BQU07YUFDQyx1QkFBa0IsR0FBVyxhQUFhLEFBQXhCLENBQXlCO0lBQ2xELE1BQU07YUFDQywyQkFBc0IsR0FBVyxXQUFXLEFBQXRCLENBQXVCO0lBQ3BELE1BQU07YUFDQyx5QkFBb0IsR0FBVyxVQUFVLEFBQXJCLENBQXNCO0lBQ2pELE1BQU07YUFDQyx1QkFBa0IsR0FBVyxVQUFVLEFBQXJCLENBQXNCO0lBQy9DLE1BQU07YUFDQywwQkFBcUIsR0FBVyxXQUFXLEFBQXRCLENBQXVCO0lBQ25ELE1BQU07YUFDQyw4Q0FBeUMsR0FBVyxtQ0FBbUMsQUFBOUMsQ0FBK0M7SUFDL0YsTUFBTTthQUNDLGtDQUE2QixHQUFXLG1CQUFtQixBQUE5QixDQUErQjtJQUNuRSxNQUFNO2FBQ0MscUJBQWdCLEdBQVcsT0FBTyxBQUFsQixDQUFtQjtJQUMxQyxNQUFNO2FBQ0Msc0JBQWlCLEdBQVcsTUFBTSxBQUFqQixDQUFrQjtJ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QVEsRUFBRSxDQUFDO1NBQ2xDLENBQ0QsQ0FBQztJQUNILENBQUM7K0dBM2hEVyxZQUFZLGtCQTBXZixhQUFhO21IQTFXVixZQUFZLGNBRlosTUFBTTs7NEZBRU4sWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEI7OzBCQTJXRSxNQUFNOzJCQUFDLGFBQWE7dUhBcldJLE1BQU07c0JBQS9CLE1BQU07dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTE9DQUxFX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGVVdGlsLCBIRUFERVJfSlNPTiwgUGxpQ25mR3VhcmFudGVlVG9rZW4sIFRva2VuLCBVdGlsU3RyaW5nIH0gZnJvbSAnbmctcGxpLXV0aWwnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZvcm1pb1V0aWwgfSBmcm9tICcuLi91dGlscy9mb3JtaW8tdXRpbCc7XHJcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi9mb3JtLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVG9rZW5TZXJ2aWNlIHtcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU0lHTl9MRVRURVJfVEFHX0lEOiBzdHJpbmcgPSAnX3NpZ24tbGV0dGVyLXRhZy1pZCc7XHJcblxyXG5cdC8qKiAqL1xyXG5cdEBJbmplY3QoTE9DQUxFX0lEKSBwdWJsaWMgbG9jYWxlOiBzdHJpbmc7XHJcblxyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9MQUJFTF9GT1JNOiBzdHJpbmcgPSAnRnJtJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfQlVER0VUOiBzdHJpbmcgPSAnUHJlc3VwdWVzdG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9MQUJFTF9DQUxDVUxBVEVEOiBzdHJpbmcgPSAnQ2FsY3VsYWRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfU05BUFNIT1Q6IHN0cmluZyA9ICdTbmFwc2hvdCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX1NUQVRJQzogc3RyaW5nID0gJ0VzdMOhdGljbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX0RPQ1VNRU5UTzogc3RyaW5nID0gJ0RvY3VtZW50byc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX0RPQ1VNRU5UT19BTkFMSVNJU19BVVRPTUFUSUNPOiBzdHJpbmcgPSAnQW7DoWxpc2lzIGF1dG9tw6F0aWNvIGRlIGRvY3VtZW50b3MnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9ET0NVTUVOVE9fQU5BTFlTSVNfVFlQRTogc3RyaW5nID0gJ2RvY3VtZW50X2FuYWx5c2lzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfVEFTSzogc3RyaW5nID0gJ1RhcmVhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfVEFTS0w6IHN0cmluZyA9ICd0YXNrJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfR1VBUkFOVEVFOiBzdHJpbmcgPSAnR2FyYW50aWEnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9UT1RBTF9BTU9VTlQ6IHN0cmluZyA9ICd0b3RhbEFtb3VudCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfQU1PVU5UOiBzdHJpbmcgPSAnYXBwbGljYXRpb25Ub3RhbCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfT1dOX0ZPVU5EUzogc3RyaW5nID0gJ2FwcGxpY2F0aW9uT3duRm91bmRzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfQVBQTElDQVRJT05fUFJPQ0VTU19UT1RBTF9GSU5BTkNJTkc6IHN0cmluZyA9ICdhcHBsaWNhdGlvbkZpbmFuY2luZyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX0FNT1VOVDogc3RyaW5nID0gJ2xlZ2FsaXphdGlvblRvdGFsJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfTEVHQUxJWkFUSU9OX1BST0NFU1NfVE9UQUxfT1dOX0ZPVU5EUzogc3RyaW5nID1cclxuXHRcdCdsZWdhbGl6YXRpb25Pd25Gb3VuZHMnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9MRUdBTElaQVRJT05fUFJPQ0VTU19UT1RBTF9GSU5BTkNJTkc6IHN0cmluZyA9ICdsZWdhbGl6YXRpb25GaW5hbmNpbmcnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9JTlNVUkFOQ0VfQU1PVU5UOiBzdHJpbmcgPSAnaW5zdXJhbmNlQW1vdW50JztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgTEVHQUxJWkFUSU9OX09SX0FQUExJQ0FUSU9OX1RPVEFMX0ZJTkFOQ0lORzogc3RyaW5nID1cclxuXHRcdCdsZWdsaXphdGlvbk9yQXBwbGljYXRpb25Ub3RhbEZpbmFuY2luZyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX1JFU1VNRV9DQVRFR09SWV9ZRUFSOiBzdHJpbmcgPSAncmVzdW1lQ2F0ZWdvcnlZZWFyJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfRkVDSEFfRklOQU5DSU5HX1NUQVJUOiBzdHJpbmcgPSAnZmVjaGFJbmljaW9GaW5hbmNpYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9GRUNIQV9GSU5BTkNJTkdfRU5EOiBzdHJpbmcgPSAnZmVjaGFGaW5GaW5hbmNpYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0RVUkFUSU9OX1NUVURJRVM6IHN0cmluZyA9ICdkdXJhY2lvbkVzdHVkaW9zJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19GSU5BTkNJTkdfRFVSQVRJT046IHN0cmluZyA9ICdkdXJhY2lvbkZpbmFuY2lhY2lvbic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX0NPRElHT19WRVJJRklDQUNJT046IHN0cmluZyA9ICdjb2RpZ29WZXJpZmljYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9BX1FVSUVOX1ZBX0RJUklHSURPOiBzdHJpbmcgPSAnYVF1aWVuVmFEaXJpZ2lkbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX0ZFQ0hBX0FDVFVBTDogc3RyaW5nID0gJ2ZlY2hhQWN0dWFsJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfU1RBVFVTX05BTUU6IHN0cmluZyA9ICdzdGF0dXNOYW1lJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUEFUUk9DSU5BRE9SOiBzdHJpbmcgPSAncGxpUGF0cm9jaW5hZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUEFUUk9DSU5BRE9SX0NPUlRPOiBzdHJpbmcgPSAncGxpUGF0cm9jaW5hZG9yQ29ydG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9QUk9HUkFNQTogc3RyaW5nID0gJ3BsaVByb2dyYW1hJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUFJPR1JBTUFfQ09SVE86IHN0cmluZyA9ICdwbGlQcm9ncmFtYUNvcnRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUFJPTU9DSU9OOiBzdHJpbmcgPSAncGxpUHJvbW9jaW9uJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUFJPTU9DSU9OX0NPUlRPOiBzdHJpbmcgPSAncGxpUHJvbW9jaW9uQ29ydG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9BTklPX1BST01PQ0lPTjogc3RyaW5nID0gJ2FuaW9Qcm9tb2Npb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9JU09fTU9ORURBX0JBU0U6IHN0cmluZyA9ICdpc29Nb25lZGFCYXNlJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfU0FMVURPX0NPTVBMRU1FTlRBUklPOiBzdHJpbmcgPSAnc2FsdWRvQ29tcGxlbWVudGFyaW8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9OVU1CRVJfQVBQTElDQVRJT046IHN0cmluZyA9ICdudW1lcm9SYWRpY2Fkbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1VTRVJfSU5JVElBTFM6IHN0cmluZyA9ICdpbmljaWFsZXNVc3VhcmlvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfTEVUVEVSX1NJR046IHN0cmluZyA9ICdmaXJtYUNhcnRhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT01NSVRURUVfTkFNRTogc3RyaW5nID0gJ2NvbWl0ZU5vbWJyZSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX1NFR01FTlRBVElPTjogc3RyaW5nID0gJ2NvbWl0ZVNlZ21lbnRhY2lvbic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0FHR1JVUEFUSU9OOiBzdHJpbmcgPSAnY29taXRlQWdydXBhY2lvbic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0NVVExJTkVfREFURTogc3RyaW5nID0gJ2NvbWl0ZUZlY2hhTGluZWEnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPTkZJUk1fTEVHQUxJWkFUSU9OX0FQUE9JTlRNRU5UOiBzdHJpbmcgPSAnY29uZmlybWFjaW9uQ2l0YSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfRE9DVU1FTlRfTlVNQkVSOiBzdHJpbmcgPSAnbnVtZXJvRG9jdW1lbnRvQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX0RPQ1VNRU5UX1RZUEU6IHN0cmluZyA9ICd0aXBvRG9jdW1lbnRvQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX05BTUU6IHN0cmluZyA9ICdub21icmVzQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX0xBU1ROQU1FOiBzdHJpbmcgPSAnYXBlbGxpZG9zQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1RZUEVfQ09ERUJUT1I6IHN0cmluZyA9ICd0aXBvUGVyc29uYUNvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9SRVZJRVdFUjogc3RyaW5nID0gJ3Jldmlzb3JDb2RldWRvcmVzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19UT1RBTF9XRUlHSFRFRDogc3RyaW5nID0gJ3BvbmRlcmFkb1RvdGFsJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT05TRUNVVElWRV9HVUFSQU5URUU6IHN0cmluZyA9ICdjb25zZWN1dGl2b0dhcmFudGlhcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfREFZOiBzdHJpbmcgPSAnZGlhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19NT05USDogc3RyaW5nID0gJ21lcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfWUVBUjogc3RyaW5nID0gJ2Fubyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfUkVQUkVTRU5UQVRJVkVfTkFNRTogc3RyaW5nID0gJ25vbWJyZXNSZXByZXNlbnRhbnRlJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19SRVBSRVNFTlRBVElWRV9MQVNUTkFNRTogc3RyaW5nID0gJ2FwZWxsaWRvc1JlcHJlc2VudGFudGUnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1JFUFJFU0VOVEFUSVZFX0RPQ1VNRU5UX05VTUJFUjogc3RyaW5nID0gJ2NlZHVsYVJlcHJlc2VudGFudGUnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NJVFlfU0lHTkFUVVJFOiBzdHJpbmcgPSAnY2l1ZGFkRmlybWEnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1VTRVJfVFlQRV9DUkVESVRfU1RVRFk6IHN0cmluZyA9ICd0aXBvVXN1YXJpb0VzdHVkaW9DcmVkaXRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9WRUhJQ0xFU19RVUFOVElUWTogc3RyaW5nID0gJ2NhbnRpZGFkVmVoaWN1bG9zQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX0FTU0VUU19RVUFOVElUWTogc3RyaW5nID0gJ2NhbnRpZGFkQmllbmVzQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0xJU1RfQ09ERUJUT1JTOiBzdHJpbmcgPSAnbGlzdGFDb2RldWRvcmVzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX0lOR1JFU09fQ09ERVVET1JfSEFCRUFTX0RBVEE6IHN0cmluZyA9ICdpbmdyZXNvQ29kZXVkb3JIYWJlYXNEYXRhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX1BERl9SRVNVTUVOX0NPREVVRE9SOiBzdHJpbmcgPSAncGRmUmVzdW1lbkNvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19RVUFOVElUWV9WRUhJQ0xFX0JFTkVGSUNJQVJZOiBzdHJpbmcgPSAnY2FudGlkYWRWZWhpY3Vsb3NTZWxlY2Npb25hZG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1FVQU5USVRZX0FTU0VUU19CRU5FRklDSUFSWTogc3RyaW5nID0gJ2NhbnRpZGFkQmllbmVzU2VsZWNjaW9uYWRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19CRU5fQ09ESUdPOiBzdHJpbmcgPSAnYmVuQ29kaWdvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX0NSRURJVF9SRVZJRVdFUl9PQlNFUlZBVElPTlNfQ09ERUJUT1I6IHN0cmluZyA9XHJcblx0XHQnY3JlZGl0UmV2aWV3ZXJPYnNlcnZhdGlvbnNDb2RlYnRvcic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9DUkVESVRfUkVWSUVXRVJfT0JTRVJWQVRJT05TOiBzdHJpbmcgPSAnY3JlZGl0UmV2aWV3ZXJPYnNlcnZhdGlvbnMnO1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5fVEFHX05BTUU6IHN0cmluZyA9ICd0YWdOYW1lJztcclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX05BTUVfUkVWSUVXRVJfVEFTSyA9ICduYW1lUmV2aXdlclRhc2snO1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5fTEFTVF9OQU1FX1JFVklFV0VSX1RBU0sgPSAnbGFzdE5hbWVSZXZpd2VyVGFzayc7XHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9UQVNLX1RPVEFMX0FTU0lHTkVEX1RPX1JFVklFV0VSID0gJ3Rhc2tUb3RhbEFzc2lnbmVkVG9SZXZpZXdlcic7XHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9TVVJOQU1FID0gJ3N1cm5hbWUnO1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TOiBhbnlbXSA9IFtcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfUEFUUk9DSU5BRE9SLFxyXG5cdFx0XHRsYWJlbDogJ1BhdHJvY2luYWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1BST0dSQU1BLFxyXG5cdFx0XHRsYWJlbDogJ1Byb2dyYW1hJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfUFJPTU9DSU9OLFxyXG5cdFx0XHRsYWJlbDogJ1Byb21vY2nDs24nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9BTklPX1BST01PQ0lPTixcclxuXHRcdFx0bGFiZWw6ICdBw7FvIHByb21vY2nDs24nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9JU09fTU9ORURBX0JBU0UsXHJcblx0XHRcdGxhYmVsOiAnSVNPIE1vbmVkYSBiYXNlJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfU0FMVURPX0NPTVBMRU1FTlRBUklPLFxyXG5cdFx0XHRsYWJlbDogJ1NhbHVkbyBjb21wbGVtZW50YXJpbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0NPRElHT19WRVJJRklDQUNJT04sXHJcblx0XHRcdGxhYmVsOiAnQ8OzZGlnbyBkZSB2ZXJpZmljYWNpw7NuJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfQV9RVUlFTl9WQV9ESVJJR0lETyxcclxuXHRcdFx0bGFiZWw6ICdBIHF1aWVuIHZhIGRpcmlnaWRvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfRkVDSEFfQUNUVUFMLFxyXG5cdFx0XHRsYWJlbDogJ0ZlY2hhIGFjdHVhbCdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1NUQVRVU19OQU1FLFxyXG5cdFx0XHRsYWJlbDogJ0VzdGFkbyBhY3R1YWwnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9OVU1CRVJfQVBQTElDQVRJT04sXHJcblx0XHRcdGxhYmVsOiAnTsO6bWVybyByYWRpY2FkbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1VTRVJfSU5JVElBTFMsXHJcblx0XHRcdGxhYmVsOiAnSW5pY2lhbGVzIGRlIHVzdWFyaW8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9MRVRURVJfU0lHTixcclxuXHRcdFx0bGFiZWw6ICdGaXJtYSBkZSBjYXJ0YXMnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9OQU1FLFxyXG5cdFx0XHRsYWJlbDogJ05vbWJyZSBjb21pdMOpJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT01NSVRURUVfU0VHTUVOVEFUSU9OLFxyXG5cdFx0XHRsYWJlbDogJ1NlZ21lbnRhY2nDs24gY29taXTDqSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0FHR1JVUEFUSU9OLFxyXG5cdFx0XHRsYWJlbDogJ0FncnVwYWNpw7NuIGNvbWl0w6knXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9DVVRMSU5FX0RBVEUsXHJcblx0XHRcdGxhYmVsOiAnRmVjaGEgTMOtbmVhIGRlIGNvcnRlJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT05GSVJNX0xFR0FMSVpBVElPTl9BUFBPSU5UTUVOVCxcclxuXHRcdFx0bGFiZWw6ICdDb25maXJtYWNpw7NuIGRlIGNpdGEnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX0RPQ1VNRU5UX05VTUJFUixcclxuXHRcdFx0bGFiZWw6ICdOw7ptZXJvIGRlIGRvY3VtZW50byBkZSBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfRE9DVU1FTlRfVFlQRSxcclxuXHRcdFx0bGFiZWw6ICdUaXBvIGRlIGRvY3VtZW50byBkZSBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdOb21icmVzIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9MQVNUTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdBcGVsbGlkb3MgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1RZUEVfQ09ERUJUT1IsXHJcblx0XHRcdGxhYmVsOiAnVGlwbyBkZSBwZXJzb25hIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9WRUhJQ0xFU19RVUFOVElUWSxcclxuXHRcdFx0bGFiZWw6ICdDYW50aWRhZCB2ZWhpY3Vsb3MgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX0FTU0VUU19RVUFOVElUWSxcclxuXHRcdFx0bGFiZWw6ICdDYW50aWRhZCBiaWVuZXMgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX1JFVklFV0VSLFxyXG5cdFx0XHRsYWJlbDogJ1Jldmlzb3IgZGUgY29kZXVkb3JlcydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVE9UQUxfV0VJR0hURUQsXHJcblx0XHRcdGxhYmVsOiAnUG9uZGVyYWRvIHRvdGFsJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT05TRUNVVElWRV9HVUFSQU5URUUsXHJcblx0XHRcdGxhYmVsOiAnQ29uc2VjdXRpdm8gZGUgZ2FyYW50aWFzJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19SRVBSRVNFTlRBVElWRV9OQU1FLFxyXG5cdFx0XHRsYWJlbDogJ05vbWJyZXMgcmVwcmVzZW50YW50ZSBsZWdhbCdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfUkVQUkVTRU5UQVRJVkVfTEFTVE5BTUUsXHJcblx0XHRcdGxhYmVsOiAnQXBlbGxpZG9zIHJlcHJlc2VudGFudGUgbGVnYWwnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1JFUFJFU0VOVEFUSVZFX0RPQ1VNRU5UX05VTUJFUixcclxuXHRcdFx0bGFiZWw6ICdDZWR1bGEgcmVwcmVzZW50YW50ZSBsZWdhbCdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVVNFUl9UWVBFX0NSRURJVF9TVFVEWSxcclxuXHRcdFx0bGFiZWw6ICdUaXBvIHVzdWFyaW8gZXN0dWRpbyBjcsOpZGl0bydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfREFZLFxyXG5cdFx0XHRsYWJlbDogJ0RpYSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfTU9OVEgsXHJcblx0XHRcdGxhYmVsOiAnTWVzJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19ZRUFSLFxyXG5cdFx0XHRsYWJlbDogJ0HDsW8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NJVFlfU0lHTkFUVVJFLFxyXG5cdFx0XHRsYWJlbDogJ0NpdWRhZCBkZSBsYSBmaXJtYSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfTElTVF9DT0RFQlRPUlMsXHJcblx0XHRcdGxhYmVsOiAnTGlzdGEgZGUgY29kZXVkb3JlcydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9JTkdSRVNPX0NPREVVRE9SX0hBQkVBU19EQVRBLFxyXG5cdFx0XHRsYWJlbDogJ0luZ3Jlc28gQ29kZXVkb3IgSGFiZWFzIERhdGEnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fUERGX1JFU1VNRU5fQ09ERVVET1IsXHJcblx0XHRcdGxhYmVsOiAnUGRmIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19RVUFOVElUWV9WRUhJQ0xFX0JFTkVGSUNJQVJZLFxyXG5cdFx0XHRsYWJlbDogJ0NhbnRpZGFkIGRlIHZlaMOtY3Vsb3MgZGVsIHNlbGVjY2lvbmFkbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfUVVBTlRJVFlfQVNTRVRTX0JFTkVGSUNJQVJZLFxyXG5cdFx0XHRsYWJlbDogJ0NhbnRpZGFkIGJpZW5lcyBkZWwgc2VsZWNjaW9uYWRvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19CRU5fQ09ESUdPLFxyXG5cdFx0XHRsYWJlbDogJ0PDs2RpZ28gYmVuZWZpY2lhcmlvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX0NSRURJVF9SRVZJRVdFUl9PQlNFUlZBVElPTlMsXHJcblx0XHRcdGxhYmVsOiAnT2JzZXJ2YWNpb25lcyByZXZpc29yIGZpbmFuY2llcm8gc2VsZWNjaW9uYWRvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX0NSRURJVF9SRVZJRVdFUl9PQlNFUlZBVElPTlNfQ09ERUJUT1IsXHJcblx0XHRcdGxhYmVsOiAnT2JzZXJ2YWNpb25lcyByZXZpc29yIGZpbmFuY2llcm8gY29kZXVkb3JlcydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9UQUdfTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdOb21icmUgZGVsIHRhZydcclxuXHRcdH0sXHJcblx0XHR7IGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9OQU1FX1JFVklFV0VSX1RBU0ssIGxhYmVsOiAnTm9tYnJlIHJldmlzb3IgdGFyZWFzJyB9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fTEFTVF9OQU1FX1JFVklFV0VSX1RBU0ssXHJcblx0XHRcdGxhYmVsOiAnQXBlbGxpZG8gcmV2aXNvciB0YXJlYXMnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fVEFTS19UT1RBTF9BU1NJR05FRF9UT19SRVZJRVdFUixcclxuXHRcdFx0bGFiZWw6ICdUb3RhbCB0YXJlYXMgYXNpZ25hZGFzIGEgcmV2aXNvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9TVVJOQU1FLFxyXG5cdFx0XHRsYWJlbDogJ0FwZWxsaWRvcyBjYW5kaWRhdG8nXHJcblx0XHR9XHJcblx0XTtcclxuXHJcblx0c3RhdGljIGV4Y2x1ZGVkVG9rZW4gPSBbXHJcblx0XHRUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19VU0VSX1RZUEVfQ1JFRElUX1NUVURZLnRvTG93ZXJDYXNlKCksXHJcblx0XHRUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9WRUhJQ0xFU19RVUFOVElUWS50b0xvd2VyQ2FzZSgpLFxyXG5cdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfQVNTRVRTX1FVQU5USVRZLnRvTG93ZXJDYXNlKClcclxuXHRdO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm9ubWVudCxcclxuXHRcdHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCxcclxuXHRcdHByaXZhdGUgZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBjdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZVxyXG5cdCkge31cclxuXHJcblx0LyoqIFRoaXMgcHJvbWlzZSBhbGxvd3MgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIHdoZW4gY29uc3VsdGluZyB0aGUgZm9ybSBmaWVsZHMuICovXHJcblx0Z2V0Rm9ybUZpZWxkc0J5UHJvbUNvZGUocHJvbUNvZGlnbyk6IFByb21pc2U8YW55W10+IHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdC8vIFNlYXJjaCB0aGUgZHluYW1pYyBmb3JtXHJcblx0XHRcdGxldCBsRm9ybUZpZWxkc1Rva2VuOiBhbnlbXSA9IG51bGw7XHJcblx0XHRcdHRoaXMuZm9ybVNlcnZpY2UuZ2V0QnlQcm9tQ29kaWdvKHByb21Db2RpZ28pLnN1YnNjcmliZSh7XHJcblx0XHRcdFx0bmV4dDogKGFycmF5Rm9ybXM6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKGFycmF5Rm9ybXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGZvcm1zIG9mIGFycmF5Rm9ybXMpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgY29tcG9uZW50cyA9IFtdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRzLnB1c2goLi4uRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzKGZvcm1zLmNvbXBvbmVudHMpKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGZvcm1zLmNvbXBvbmVudHMgJiYgZm9ybXMuY29tcG9uZW50cy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGNvbXBvbmVudHMgb2YgZm9ybXMuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50cy5jb21wb25lbnRzICYmIGNvbXBvbmVudHMuY29tcG9uZW50cy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cy5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50LmNvbHVtbnMgJiYgY29tcG9uZW50LmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGNDb21wb25lbnRzIG9mIGNvbXBvbmVudC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y0NvbXBvbmVudHMuY29tcG9uZW50cyAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y0NvbXBvbmVudHMuY29tcG9uZW50cy5sZW5ndGggPiAwXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZXJhdG9yIG9mIGNDb21wb25lbnRzLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGl0ZXJhdG9yLnR5cGUgPT09ICdhZGRyZXNzJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBpdGVyYXRvci5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0bGV0IGZvcm06IGFueSA9IGFycmF5Rm9ybXM7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdCFmb3JtIHx8XHJcblx0XHRcdFx0XHRcdCFmb3JtWzBdIHx8XHJcblx0XHRcdFx0XHRcdCFmb3JtWzBdLnByb21Db2RpZ28gfHxcclxuXHRcdFx0XHRcdFx0Zm9ybVswXS5wcm9tQ29kaWdvICE9IHByb21Db2RpZ29cclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHQvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJzQwNCddKTtcclxuXHRcdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW4gPSBbXTtcclxuXHRcdFx0XHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHM6IGFueVtdID0gW107XHJcblx0XHRcdFx0XHRcdGlmIChmb3JtQ29tcC5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb2x1bW5zO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChuZXdDb21wb25lbnRzICYmIFV0aWxTdHJpbmcuaXNWYWxpZChmb3JtQ29tcC50aXRsZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuZ2V0S2V5Rm9ybXVsYXJpbyhmb3JtQ29tcC50aXRsZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBmb3JtQ29tcC50aXRsZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0OiBmb3JtQ29tcFxyXG5cdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBbXVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW5bbEZvcm1GaWVsZHNUb2tlbi5sZW5ndGggLSAxXS52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldENvbXBvbmVuZXRGb3JtKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGVycm9yOiAoZXJyb3IpID0+IHtcclxuXHRcdFx0XHRcdHJlamVjdChlcnJvcik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Z2V0Rm9ybUZpZWxkc0J5UHJvbUNvZGVXaXRoRWRpdEdyaWRzKHByb21Db2RpZ28pOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cdFx0XHQvLyBTZWFyY2ggdGhlIGR5bmFtaWMgZm9ybVxyXG5cdFx0XHRsZXQgbEZvcm1GaWVsZHNUb2tlbjogYW55W10gPSBudWxsO1xyXG5cdFx0XHR0aGlzLmZvcm1TZXJ2aWNlLmdldEJ5UHJvbUNvZGlnbyhwcm9tQ29kaWdvKS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IChhcnJheUZvcm1zOiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGlmIChhcnJheUZvcm1zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBmb3JtcyBvZiBhcnJheUZvcm1zKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHMgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50cy5wdXNoKFxyXG5cdFx0XHRcdFx0XHRcdFx0Li4uRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzV2l0aEVkaXRHcmlkcyhmb3Jtcy5jb21wb25lbnRzKVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChmb3Jtcy5jb21wb25lbnRzICYmIGZvcm1zLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnRzIG9mIGZvcm1zLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudHMuY29tcG9uZW50cyAmJiBjb21wb25lbnRzLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudC5jb2x1bW5zICYmIGNvbXBvbmVudC5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjQ29tcG9uZW50cyBvZiBjb21wb25lbnQuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNDb21wb25lbnRzLmNvbXBvbmVudHMgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNDb21wb25lbnRzLmNvbXBvbmVudHMubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVyYXRvciBvZiBjQ29tcG9uZW50cy5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChpdGVyYXRvci50eXBlID09PSAnYWRkcmVzcycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWxldGUgaXRlcmF0b3IuY29tcG9uZW50cztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGxldCBmb3JtOiBhbnkgPSBhcnJheUZvcm1zO1xyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQhZm9ybSB8fFxyXG5cdFx0XHRcdFx0XHQhZm9ybVswXSB8fFxyXG5cdFx0XHRcdFx0XHQhZm9ybVswXS5wcm9tQ29kaWdvIHx8XHJcblx0XHRcdFx0XHRcdGZvcm1bMF0ucHJvbUNvZGlnbyAhPSBwcm9tQ29kaWdvXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyc0MDQnXSk7XHJcblx0XHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuID0gW107XHJcblx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0XHRcdGxldCBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV3Q29tcG9uZW50cyAmJiBVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybUNvbXAudGl0bGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbi5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLmdldEtleUZvcm11bGFyaW8oZm9ybUNvbXAudGl0bGUpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogZm9ybUNvbXAudGl0bGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdDogZm9ybUNvbXBcclxuXHRcdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogW11cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuW2xGb3JtRmllbGRzVG9rZW4ubGVuZ3RoIC0gMV0udmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRDb21wb25lbmV0Rm9ybShcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG51bGxcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRlcnJvcjogKGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGdldEZvcm1GaWVsZHNCeUZvcm1JZChmb3JtSWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdC8vIFNlYXJjaCB0aGUgZHluYW1pYyBmb3JtXHJcblx0XHRcdGxldCBsRm9ybUZpZWxkc1Rva2VuOiBhbnlbXSA9IG51bGw7XHJcblx0XHRcdHRoaXMuZm9ybVNlcnZpY2UuZ2V0QnlJZChmb3JtSWQpLnN1YnNjcmliZShcclxuXHRcdFx0XHQocmVzdWx0OiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGxldCBmb3JtOiBhbnkgPSByZXN1bHQ7XHJcblx0XHRcdFx0XHRpZiAoIWZvcm0gfHwgIWZvcm1bMF0pIHtcclxuXHRcdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW4gPSBbXTtcclxuXHRcdFx0XHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHM6IGFueVtdID0gW107XHJcblx0XHRcdFx0XHRcdGlmIChmb3JtQ29tcC5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb2x1bW5zO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChuZXdDb21wb25lbnRzICYmIFV0aWxTdHJpbmcuaXNWYWxpZChmb3JtQ29tcC50aXRsZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuZ2V0S2V5Rm9ybXVsYXJpbyhmb3JtQ29tcC50aXRsZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBmb3JtQ29tcC50aXRsZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0OiBmb3JtQ29tcFxyXG5cdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBbXVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW5bbEZvcm1GaWVsZHNUb2tlbi5sZW5ndGggLSAxXS52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldENvbXBvbmVuZXRGb3JtKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKiBUaGlzIHByb21pc2UgYWxsb3dzIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiB3aGVuIGNvbnN1bHRpbmcgdGhlIGZvcm0gZmllbGRzLiAqL1xyXG5cdGdldEZvcm1QYW5lbHNCeVByb21Db2RlKHByb21Db2RpZ28pOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cdFx0XHQvLyBTZWFyY2ggdGhlIGR5bmFtaWMgZm9ybVxyXG5cdFx0XHRsZXQgbEZvcm1QYW5uZWxzVG9rZW46IGFueVtdID0gbnVsbDtcclxuXHRcdFx0dGhpcy5mb3JtU2VydmljZS5nZXRCeVByb21Db2RpZ28ocHJvbUNvZGlnbykuc3Vic2NyaWJlKFxyXG5cdFx0XHRcdChyZXN1bHQ6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGZvcm06IGFueSA9IHJlc3VsdDtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IWZvcm0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0ucHJvbUNvZGlnbyB8fFxyXG5cdFx0XHRcdFx0XHRmb3JtWzBdLnByb21Db2RpZ28gIT0gcHJvbUNvZGlnb1xyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnNDA0J10pO1xyXG5cdFx0XHRcdFx0XHRyZXNvbHZlKGxGb3JtUGFubmVsc1Rva2VuKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxGb3JtUGFubmVsc1Rva2VuID0gW107XHJcblx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0XHRcdGxldCBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV3Q29tcG9uZW50cyAmJiBVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybUNvbXAudGl0bGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1QYW5uZWxzVG9rZW4ucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZToge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXk6IFRva2VuU2VydmljZS5nZXRLZXlGb3JtdWxhcmlvKGZvcm1Db21wLnRpdGxlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IGZvcm1Db21wLnRpdGxlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRvYmplY3Q6IGZvcm1Db21wXHJcblx0XHRcdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6IFtdXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1QYW5uZWxzVG9rZW5bbEZvcm1QYW5uZWxzVG9rZW4ubGVuZ3RoIC0gMV0udmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQYW5lbENvbXBvbmVuZXQoY29tcG9uZW50cywgbmV3Q29tcG9uZW50cywgbnVsbCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJlc29sdmUobEZvcm1QYW5uZWxzVG9rZW4pO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0KGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWN1cnNpdmUgbWV0aG9kIHRvIGdldCBhbGwgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBlZGl0R3JpZCBkeW5hbWljIGZvcm1cclxuXHQgKiBAcGFyYW0gY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBmb3JtXHJcblx0ICovXHJcblx0Z2V0UGFuZWxDb21wb25lbmV0KGNvbXBvbmVudHM6IGFueVtdLCBmb3JtOiBhbnksIHBhbmVsTmFtZTogc3RyaW5nKTogYW55W10ge1xyXG5cdFx0Zm9yIChsZXQgZm9ybUNvbXAgb2YgZm9ybSkge1xyXG5cdFx0XHRpZiAoZm9ybUNvbXAudHlwZSA9PT0gJ3BhbmVsJykge1xyXG5cdFx0XHRcdGNvbXBvbmVudHMucHVzaChmb3JtQ29tcCk7XHJcblx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29tcG9uZW50cyB8fCBmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29tcG9uZW50cyA9IHRoaXMuZ2V0UGFuZWxDb21wb25lbmV0KGNvbXBvbmVudHMsIG5ld0NvbXBvbmVudHMsIHBhbmVsTmFtZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBjb21wb25lbnRzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWN1cnNpdmUgbWV0aG9kIHRvIGdldCBhbGwgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBjb21wb25lbnRzIGEgY29sdW1ucyBvZiB0aGUgZHluYW1pYyBmb3JtXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gZm9ybVxyXG5cdCAqL1xyXG5cdGdldENvbXBvbmVuZXRGb3JtKFxyXG5cdFx0Y29tcG9uZW50czogYW55W10sXHJcblx0XHRmb3JtOiBhbnksXHJcblx0XHRwYW5lbE5hbWU6IHN0cmluZyxcclxuXHRcdGVkaXRncmlkOiBib29sZWFuLFxyXG5cdFx0ZWRpdEdyaWRLZXk6IHN0cmluZ1xyXG5cdCk6IGFueVtdIHtcclxuXHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0Ly9NTy0gIG1hbnRpcyA4NzQzIGZpeCBhZGRyZXNzIHRva2VuXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHQoZm9ybUNvbXAuY29tcG9uZW50cyB8fCBmb3JtQ29tcC5jb2x1bW5zKSAmJlxyXG5cdFx0XHRcdGZvcm1Db21wLnR5cGUgIT09ICdhZGRyZXNzJyAmJlxyXG5cdFx0XHRcdGZvcm1Db21wLnR5cGUgIT09ICdlZGl0Z3JpZCdcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0XHRpZiAoZm9ybUNvbXAudHlwZSA9PT0gJ2VkaXRncmlkJykge1xyXG5cdFx0XHRcdFx0XHRlZGl0Z3JpZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdGVkaXRHcmlkS2V5ID0gZm9ybUNvbXAua2V5O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbHVtbnM7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChmb3JtQ29tcC50eXBlICYmIGZvcm1Db21wLnR5cGUgPT09ICdwYW5lbCcpIHtcclxuXHRcdFx0XHRcdHBhbmVsTmFtZSA9IGZvcm1Db21wLnRpdGxlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbmV0Rm9ybShcclxuXHRcdFx0XHRcdGNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0cGFuZWxOYW1lLFxyXG5cdFx0XHRcdFx0ZWRpdGdyaWQsXHJcblx0XHRcdFx0XHRlZGl0R3JpZEtleVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Zm9ybUNvbXAucGFuZWxOYW1lID0gcGFuZWxOYW1lO1xyXG5cdFx0XHRcdGZvcm1Db21wLmVkaXRncmlkID0gZWRpdGdyaWQ7XHJcblx0XHRcdFx0Zm9ybUNvbXAuZWRpdEdyaWRLZXkgPSBlZGl0R3JpZEtleTtcclxuXHRcdFx0XHRjb21wb25lbnRzLnB1c2goZm9ybUNvbXApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gY29tcG9uZW50cztcclxuXHR9XHJcblxyXG5cdC8qKiBUaGlzIHByb21pc2UgYWxsb3dzIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiB3aGVuIGNvbnN1bHRpbmcgdGhlIGZvcm0gZmllbGRzLiAqL1xyXG5cdGdldEZvcm1FZGl0R3JpZEZpZWxkc0J5UHJvbUNvZGUocHJvbUNvZGlnbyk6IFByb21pc2U8YW55W10+IHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdC8vIFNlYXJjaCB0aGUgZHluYW1pYyBmb3JtXHJcblx0XHRcdGxldCBsRm9ybUZpZWxkc1Rva2VuOiBhbnlbXSA9IG51bGw7XHJcblx0XHRcdHRoaXMuZm9ybVNlcnZpY2UuZ2V0QnlQcm9tQ29kaWdvKHByb21Db2RpZ28pLnN1YnNjcmliZShcclxuXHRcdFx0XHQocmVzdWx0OiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGxldCBmb3JtOiBhbnkgPSByZXN1bHQ7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdCFmb3JtIHx8XHJcblx0XHRcdFx0XHRcdCFmb3JtWzBdIHx8XHJcblx0XHRcdFx0XHRcdCFmb3JtWzBdLnByb21Db2RpZ28gfHxcclxuXHRcdFx0XHRcdFx0Zm9ybVswXS5wcm9tQ29kaWdvICE9IHByb21Db2RpZ29cclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHQvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJzQwNCddKTtcclxuXHRcdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW4gPSBbXTtcclxuXHRcdFx0XHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHM6IGFueVtdID0gW107XHJcblx0XHRcdFx0XHRcdGlmIChmb3JtQ29tcC5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb2x1bW5zO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChuZXdDb21wb25lbnRzICYmIFV0aWxTdHJpbmcuaXNWYWxpZChmb3JtQ29tcC50aXRsZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuZ2V0S2V5Rm9ybXVsYXJpbyhmb3JtQ29tcC50aXRsZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBmb3JtQ29tcC50aXRsZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0OiBmb3JtQ29tcFxyXG5cdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBbXVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW5bbEZvcm1GaWVsZHNUb2tlbi5sZW5ndGggLSAxXS52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldEVkaXRHcmlkQ29tcG9uZW5ldChjb21wb25lbnRzLCBuZXdDb21wb25lbnRzLCBudWxsKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgcmVjdXJzaXZlIG1ldGhvZCB0byBnZXQgYWxsIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgZWRpdEdyaWQgZHluYW1pYyBmb3JtXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gZm9ybVxyXG5cdCAqL1xyXG5cdGdldEVkaXRHcmlkQ29tcG9uZW5ldChjb21wb25lbnRzOiBhbnlbXSwgZm9ybTogYW55LCBwYW5lbE5hbWU6IHN0cmluZyk6IGFueVtdIHtcclxuXHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0aWYgKGZvcm1Db21wLnR5cGUgPT09ICdlZGl0Z3JpZCcpIHtcclxuXHRcdFx0XHRmb3JtQ29tcC5wYW5lbE5hbWUgPSBwYW5lbE5hbWU7XHJcblx0XHRcdFx0Y29tcG9uZW50cy5wdXNoKGZvcm1Db21wKTtcclxuXHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb21wb25lbnRzIHx8IGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRsZXQgbmV3Q29tcG9uZW50czogYW55O1xyXG5cdFx0XHRcdGlmIChmb3JtQ29tcC5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29tcG9uZW50cztcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb2x1bW5zO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoZm9ybUNvbXAudHlwZSAmJiBmb3JtQ29tcC50eXBlID09PSAncGFuZWwnKSB7XHJcblx0XHRcdFx0XHRwYW5lbE5hbWUgPSBmb3JtQ29tcC50aXRsZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29tcG9uZW50cyA9IHRoaXMuZ2V0RWRpdEdyaWRDb21wb25lbmV0KGNvbXBvbmVudHMsIG5ld0NvbXBvbmVudHMsIHBhbmVsTmFtZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBjb21wb25lbnRzO1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHJldHVybnMgdGhlIHRva2VucyBieSBwcm9tQ29kaWdvICovXHJcblx0Z2V0TGlzdEJ5UHJvbUNvZGlnbyhwcm9tQ29kZTogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5jb25maWd1cmF0aW9uICsgJ3Rva2VuL2dldEJ5UHJvbUNvZGlnbycsXHJcblx0XHRcdHsgcGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldCgncHJvbUNvZGlnbycsIHByb21Db2RlLnRvU3RyaW5nKCkpIH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgcmV0dXJucyB0aGUgdG9rZW4gYnkgaWQgKi9cclxuXHRnZXRCeUlkKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQodGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuY29uZmlndXJhdGlvbiArICd0b2tlbi9nZXRCeUlkJywge1xyXG5cdFx0XHRwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdpZCcsIGlkLnRvU3RyaW5nKCkpXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKiBJdCBkZWxldGVzIGEgZm9ybSBieSBpZCAqL1xyXG5cdGRlbGV0ZShpZCk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LmRlbGV0ZShcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuY29uZmlndXJhdGlvbiArICd0b2tlbi9kZWxldGUnLFxyXG5cdFx0XHR7IHBhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoJ2lkJywgaWQpIH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgc2F2ZXMgdGhlIHRva2VuICovXHJcblx0c2F2ZSh0b2tlbjogVG9rZW4pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0KFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5jb25maWd1cmF0aW9uICsgJ3Rva2VuL3NhdmUnLFxyXG5cdFx0XHR0b2tlbixcclxuXHRcdFx0SEVBREVSX0pTT05cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5Rm9ybXVsYXJpbyhmb3JtVGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRpZiAoVXRpbFN0cmluZy5pc1ZhbGlkKGZvcm1UaXRsZSkpIHtcclxuXHRcdFx0cmV0dXJuIChcclxuXHRcdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk0pICtcclxuXHRcdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoZm9ybVRpdGxlKS5yZXBsYWNlKC9fL2csICctJylcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiAnJztcclxuXHR9XHJcblxyXG5cdC8qKiBJdCByZXR1cm5zIHRoZSB1bmlxdWUgdmVyaWZpY2F0aW9uIGNvZGUgKi9cclxuXHRnZXRVbmlxdWVWZXJpZmljYXRpb25Db2RlKGxvZ2luOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoXHJcblx0XHRcdHRoaXMuZW52aXJvbm1lbnQuaG9zdC5iYWNrZW5kLmRvY3VtZW50c1JlcG9zaXRvcnkgK1xyXG5cdFx0XHRcdCdkb2N1bWVudG8vY29uc3VsdGFyQ29kaWdvVW5pY28vJyArXHJcblx0XHRcdFx0bG9naW4gK1xyXG5cdFx0XHRcdCcvJyArXHJcblx0XHRcdFx0dG9rZW4sXHJcblx0XHRcdHsgcGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpIH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgc2VuZCB0aGUgaW5mb3JtYXRpb24gdG8gY29weSB0aGUgRG9jdW1lbnQgdmlld2VyICovXHJcblx0Y29weURvY3VtZW50SW5mb3JtYXRpb25WaWV3ZXIoXHJcblx0XHRsb2dpbjogc3RyaW5nLFxyXG5cdFx0dG9rZW46IHN0cmluZyxcclxuXHRcdHVuaXF1ZUNvZGU6IHN0cmluZyxcclxuXHRcdGRvY3VtZW50VVJMOiBzdHJpbmcsXHJcblx0XHRkb2N1bWVudE5hbWU6IHN0cmluZ1xyXG5cdCk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRsZXQgaW5mb0RvY3VtZW50byA9IHtcclxuXHRcdFx0Y29kaWdvVW5pY286IHVuaXF1ZUNvZGUsXHJcblx0XHRcdHJ1dGFEb2N1bWVudG86IGRvY3VtZW50VVJMLFxyXG5cdFx0XHRkb2N1bWVudE5hbWU6IGRvY3VtZW50TmFtZVxyXG5cdFx0fTtcclxuXHRcdHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdChcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuZG9jdW1lbnRzUmVwb3NpdG9yeSArXHJcblx0XHRcdFx0J2RvY3VtZW50by9hZGljaW9uYXJEb2N1bWVudG8vJyArXHJcblx0XHRcdFx0bG9naW4gK1xyXG5cdFx0XHRcdCcvJyArXHJcblx0XHRcdFx0dG9rZW4sXHJcblx0XHRcdGluZm9Eb2N1bWVudG8sXHJcblx0XHRcdEhFQURFUl9KU09OXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleUJ1ZGdldCgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQlVER0VUKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlEb2N1bWVudCgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRE9DVU1FTlRPKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlEb2N1bWVudEFuYWx5c2lzKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9ET0NVTUVOVE9fQU5BTFlTSVNfVFlQRSk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5VGFzaygpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfVEFTS0wpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleVN0YXRpYygpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfU1RBVElDKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlDYWxjdWxhdGVkKHRva2VuOiBUb2tlbik6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURUQpICtcclxuXHRcdFx0J18nICtcclxuXHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKHRva2VuLm5hbWUpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleVNuYXBzaG90KHRva2VuOiBUb2tlbik6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NOQVBTSE9UKSArXHJcblx0XHRcdCdfJyArXHJcblx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyh0b2tlbi5uYW1lKVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlHdWFyYW50ZWUodG9rZW46IFBsaUNuZkd1YXJhbnRlZVRva2VuKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfR1VBUkFOVEVFKSArXHJcblx0XHRcdCdfJyArXHJcblx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyh0b2tlbi5uYW1lKVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybiBhIHZhbHVlIHRoYXQgcmVwcmVzZW50IHRoZSB0eXBlIG9mIGxhYmVsOiAxPUZvcm0sIDI9QnVkZ2V0LCAzPVN0YXRpYywgND1DYWxjdWxhdGVkXHJcblx0ICogQHBhcmFtIGtleSBWYWx1ZSB0byBldmFsdWVhdGVcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0S2V5VHlwZShrZXk6IHN0cmluZyk6IG51bWJlciB7XHJcblx0XHRrZXkgPSBrZXkucmVwbGFjZSgneycsICcnKS5yZXBsYWNlKCd9JywgJycpO1xyXG5cdFx0a2V5ID0ga2V5LnN1YnN0cmluZygxLCBrZXkuaW5kZXhPZignXycpKTtcclxuXHRcdGlmIChrZXkuc3RhcnRzV2l0aChVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0ZPUk0pKSkge1xyXG5cdFx0XHRyZXR1cm4gMTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdGtleS5zdGFydHNXaXRoKFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQlVER0VUKSlcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gMjtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdGtleS5zdGFydHNXaXRoKFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfU1RBVElDKSlcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gMztcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdGtleS5zdGFydHNXaXRoKFxyXG5cdFx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRClcclxuXHRcdFx0KVxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiA0O1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9UQVNLTCkpXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuIDU7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRrZXkuc3RhcnRzV2l0aChcclxuXHRcdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0RPQ1VNRU5UT19BTkFMWVNJU19UWVBFKVxyXG5cdFx0XHQpXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuIDY7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlcGVuZHMgb2YgdGhlIHR5cGUgb2YgZm9ybUZpZWxkVG9rZW4gcmV0dXJuIGRlIHZhbHVlIG9mIHRoZSB2YWx1ZURhdGFcclxuXHQgKiBAcGFyYW0gZm9ybUZpZWxkVG9rZW5cclxuXHQgKiBAcGFyYW0gdmFsdWVEYXRhXHJcblx0ICovXHJcblx0Z2V0VmFsdWVGcm9tRm9ybUZpZWxkKGZvcm1GaWVsZFRva2VuOiBhbnksIHZhbHVlRGF0YTogYW55KTogYW55IHtcclxuXHRcdGlmICh0eXBlb2YgdmFsdWVEYXRhID09ICdvYmplY3QnKSB7XHJcblx0XHRcdGlmIChmb3JtRmllbGRUb2tlbi50eXBlKSB7XHJcblx0XHRcdFx0aWYgKGZvcm1GaWVsZFRva2VuLnR5cGUgPT0gJ2FkZHJlc3MnKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWVEYXRhLmZvcm1hdHRlZF9hZGRyZXNzO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRmb3JtRmllbGRUb2tlbi50eXBlID09ICdzZWxlY3QnICYmXHJcblx0XHRcdFx0XHR2YWx1ZURhdGEuaGFzT3duUHJvcGVydHkoZm9ybUZpZWxkVG9rZW4uc2VhcmNoRmllbGQpXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRpZiAodmFsdWVEYXRhLmhhc093blByb3BlcnR5KCdvcmlnaW5hbF9uYW1lJykgIT09ICcnKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZURhdGEub3JpZ2luYWxfbmFtZTtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAodmFsdWVEYXRhLmhhc093blByb3BlcnR5KCduYXRpdmVOYW1lJykgIT09ICcnKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZURhdGEubmF0aXZlTmFtZTtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUZpZWxkVG9rZW4uc2VhcmNoRmllbGQpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlRGF0YVtmb3JtRmllbGRUb2tlbi5zZWFyY2hGaWVsZF07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdmFsdWVEYXRhO1xyXG5cdH1cclxuXHRmb3JtYXREYXRlKHZhbHVlOiBEYXRlLCBsb2NhbGU6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpO1xyXG5cclxuXHRcdGNvbnN0IG1vbnRocyA9IHtcclxuXHRcdFx0ZXM6IFtcclxuXHRcdFx0XHQnZW5lcm8nLFxyXG5cdFx0XHRcdCdmZWJyZXJvJyxcclxuXHRcdFx0XHQnbWFyem8nLFxyXG5cdFx0XHRcdCdhYnJpbCcsXHJcblx0XHRcdFx0J21heW8nLFxyXG5cdFx0XHRcdCdqdW5pbycsXHJcblx0XHRcdFx0J2p1bGlvJyxcclxuXHRcdFx0XHQnYWdvc3RvJyxcclxuXHRcdFx0XHQnc2VwdGllbWJyZScsXHJcblx0XHRcdFx0J29jdHVicmUnLFxyXG5cdFx0XHRcdCdub3ZpZW1icmUnLFxyXG5cdFx0XHRcdCdkaWNpZW1icmUnXHJcblx0XHRcdF0sXHJcblx0XHRcdGVuOiBbXHJcblx0XHRcdFx0J0phbnVhcnknLFxyXG5cdFx0XHRcdCdGZWJydWFyeScsXHJcblx0XHRcdFx0J01hcmNoJyxcclxuXHRcdFx0XHQnQXByaWwnLFxyXG5cdFx0XHRcdCdNYXknLFxyXG5cdFx0XHRcdCdKdW5lJyxcclxuXHRcdFx0XHQnSnVseScsXHJcblx0XHRcdFx0J0F1Z3VzdCcsXHJcblx0XHRcdFx0J1NlcHRlbWJlcicsXHJcblx0XHRcdFx0J09jdG9iZXInLFxyXG5cdFx0XHRcdCdOb3ZlbWJlcicsXHJcblx0XHRcdFx0J0RlY2VtYmVyJ1xyXG5cdFx0XHRdLFxyXG5cdFx0XHRmcjogW1xyXG5cdFx0XHRcdCdqYW52aWVyJyxcclxuXHRcdFx0XHQnZsOpdnJpZXInLFxyXG5cdFx0XHRcdCdtYXJzJyxcclxuXHRcdFx0XHQnYXZyaWwnLFxyXG5cdFx0XHRcdCdtYWknLFxyXG5cdFx0XHRcdCdqdWluJyxcclxuXHRcdFx0XHQnanVpbGxldCcsXHJcblx0XHRcdFx0J2Fvw7t0JyxcclxuXHRcdFx0XHQnc2VwdGVtYnJlJyxcclxuXHRcdFx0XHQnb2N0b2JyZScsXHJcblx0XHRcdFx0J25vdmVtYnJlJyxcclxuXHRcdFx0XHQnZMOpY2VtYnJlJ1xyXG5cdFx0XHRdLFxyXG5cdFx0XHRkZTogW1xyXG5cdFx0XHRcdCdKYW51YXInLFxyXG5cdFx0XHRcdCdGZWJydWFyJyxcclxuXHRcdFx0XHQnTcOkcnonLFxyXG5cdFx0XHRcdCdBcHJpbCcsXHJcblx0XHRcdFx0J01haScsXHJcblx0XHRcdFx0J0p1bmknLFxyXG5cdFx0XHRcdCdKdWxpJyxcclxuXHRcdFx0XHQnQXVndXN0JyxcclxuXHRcdFx0XHQnU2VwdGVtYmVyJyxcclxuXHRcdFx0XHQnT2t0b2JlcicsXHJcblx0XHRcdFx0J05vdmVtYmVyJyxcclxuXHRcdFx0XHQnRGV6ZW1iZXInXHJcblx0XHRcdF0sXHJcblx0XHRcdGl0OiBbXHJcblx0XHRcdFx0J2dlbm5haW8nLFxyXG5cdFx0XHRcdCdmZWJicmFpbycsXHJcblx0XHRcdFx0J21hcnpvJyxcclxuXHRcdFx0XHQnYXByaWxlJyxcclxuXHRcdFx0XHQnbWFnZ2lvJyxcclxuXHRcdFx0XHQnZ2l1Z25vJyxcclxuXHRcdFx0XHQnbHVnbGlvJyxcclxuXHRcdFx0XHQnYWdvc3RvJyxcclxuXHRcdFx0XHQnc2V0dGVtYnJlJyxcclxuXHRcdFx0XHQnb3R0b2JyZScsXHJcblx0XHRcdFx0J25vdmVtYnJlJyxcclxuXHRcdFx0XHQnZGljZW1icmUnXHJcblx0XHRcdF1cclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgbG9jYWxlTW9udGhzID0gbW9udGhzW2xvY2FsZV07XHJcblxyXG5cdFx0Y29uc3QgbW9udGggPSBsb2NhbGVNb250aHNbZGF0ZS5nZXRNb250aCgpXTtcclxuXHRcdGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcblxyXG5cdFx0cmV0dXJuIGAke21vbnRofSAke3llYXJ9YDtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogVHJ5IHRvIGZpbmQgdGhlIHRva2VuIGluIHRoZSBzdHJpbmdUZXh0IGFuZCByZXBsYWNlIHdpdGggZGF0YVZhbHVlLiBJZiBkZXRlY3QgZm9ybWF0IG9mIG51bWJlciBvciBkYXRlIHRyeSB0byBmb3JtYXQgdGhlIGRhdGFWYWx1ZVxyXG5cdCAqIEBwYXJhbSBzdHJpbmdUZXh0XHJcblx0ICogQHBhcmFtIHRva2VuXHJcblx0ICogQHBhcmFtIGRhdGFWYWx1ZVxyXG5cdCAqL1xyXG5cdHJlcGxhY2VUb2tlbihzdHJpbmdUZXh0OiBzdHJpbmcsIHRva2VuOiBhbnksIGRhdGFWYWx1ZTogYW55LCBsb2NhbGU/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0bGV0IHZhbHVlUmVwbGFjZTogc3RyaW5nID0gbnVsbDtcclxuXHRcdGlmICh0b2tlbiAmJiB0b2tlblswXSA9PSAnIycpIHtcclxuXHRcdFx0bGV0IHR5cGVUb2tlbiA9IHRva2VuLnN1YnN0cmluZygxLCB0b2tlbi5pbmRleE9mKCcoJykpO1xyXG5cdFx0XHRpZiAodHlwZVRva2VuID09ICdkYXRlJykge1xyXG5cdFx0XHRcdGxldCBkYXRlRm9ybWF0OiBzdHJpbmcgPSB0b2tlbi5zdWJzdHJpbmcoXHJcblx0XHRcdFx0XHR0b2tlbi5pbmRleE9mKCd9JykgKyAxLFxyXG5cdFx0XHRcdFx0dG9rZW4uaW5kZXhPZignKScpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRkYXRlRm9ybWF0ID0gZGF0ZUZvcm1hdC50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJykucmVwbGFjZSgvXFwnL2csICcnKTtcclxuXHRcdFx0XHRsZXQgZGF0ZVZhbHVlID0gRGF0ZVV0aWwuZ2V0RGF0ZShkYXRhVmFsdWUpO1xyXG5cdFx0XHRcdGlmIChsb2NhbGUgIT0gbnVsbCAmJiBsb2NhbGUpIHtcclxuXHRcdFx0XHRcdHZhbHVlUmVwbGFjZSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlVmFsdWUsIGxvY2FsZSk7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChkYXRlVmFsdWUpIHtcclxuXHRcdFx0XHRcdHZhbHVlUmVwbGFjZSA9IERhdGVVdGlsLmdldE1vbWVudChkYXRlVmFsdWUpLmZvcm1hdChkYXRlRm9ybWF0KTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dmFsdWVSZXBsYWNlID0gJyc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVUb2tlbiA9PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdGxldCBudW1iZXJWYWx1ZTogbnVtYmVyID0gTnVtYmVyKGRhdGFWYWx1ZSk7XHJcblx0XHRcdFx0aWYgKG51bWJlclZhbHVlICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4obnVtYmVyVmFsdWUpKSB7XHJcblx0XHRcdFx0XHRsZXQgbnVtYmVyRm9ybWF0OiBzdHJpbmcgPSB0b2tlbi5zdWJzdHJpbmcoXHJcblx0XHRcdFx0XHRcdHRva2VuLmluZGV4T2YoJ30nKSArIDEsXHJcblx0XHRcdFx0XHRcdHRva2VuLmluZGV4T2YoJyknKVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdG51bWJlckZvcm1hdCA9IG51bWJlckZvcm1hdC50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJykucmVwbGFjZSgvXFwnL2csICcnKTtcclxuXHRcdFx0XHRcdHZhbHVlUmVwbGFjZSA9IHRoaXMuY3VycmVuY3lQaXBlLnRyYW5zZm9ybShcclxuXHRcdFx0XHRcdFx0bnVtYmVyVmFsdWUsXHJcblx0XHRcdFx0XHRcdHRoaXMubG9jYWxlLFxyXG5cdFx0XHRcdFx0XHQnJyxcclxuXHRcdFx0XHRcdFx0bnVtYmVyRm9ybWF0XHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhcclxuXHRcdFx0XHRcdFx0J0VsIGRhdG8gWycgK1xyXG5cdFx0XHRcdFx0XHRcdGRhdGFWYWx1ZSArXHJcblx0XHRcdFx0XHRcdFx0J10gcGFyYSBlbCB0b2tlbiBbJyArXHJcblx0XHRcdFx0XHRcdFx0dG9rZW4gK1xyXG5cdFx0XHRcdFx0XHRcdCddIHRpcG8gbsO6bWVyaWNvIG5vIGVzIHZhbGlkbydcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR2YWx1ZVJlcGxhY2UgPSAnJztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coJ3RpcG8gZGUgdG9rZW4gaW5kZWZpbmlkby4gW3R5cGVUb2tlblsnICsgdHlwZVRva2VuICsgJ11dJyk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAodG9rZW4gJiYgdG9rZW5bMF0gPT0gJyQnKSB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRkYXRhVmFsdWUgIT09IG51bGwgJiZcclxuXHRcdFx0XHRkYXRhVmFsdWUgIT09IHVuZGVmaW5lZCAmJlxyXG5cdFx0XHRcdGRhdGFWYWx1ZS5vcmlnaW5hbF9uYW1lICE9PSB1bmRlZmluZWQgJiZcclxuXHRcdFx0XHRkYXRhVmFsdWUub3JpZ2luYWxfbmFtZSAhPT0gbnVsbFxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHR2YWx1ZVJlcGxhY2UgPSBkYXRhVmFsdWUub3JpZ2luYWxfbmFtZTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR2YWx1ZVJlcGxhY2UgPSBkYXRhVmFsdWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gdmFsdWVSZXBsYWNlID0gZGF0YVZhbHVlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc29sZS5sb2coJ0VsIHRva2VuIG5vIGVzIHZhbGlkby4gW3Rva2VuWycgKyB0b2tlbiArICddXScpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHN0cmluZ1RleHQgJiYgdmFsdWVSZXBsYWNlICE9PSBudWxsKSB7XHJcblx0XHRcdGlmICh0b2tlbiAmJiB0b2tlbiA9PT0gJyR7ZXN0YXRpY29fJyArIFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fU1VSTkFNRSArICd9Jykge1xyXG5cdFx0XHRcdHZhbHVlUmVwbGFjZSA9IGRhdGFWYWx1ZTtcclxuXHRcdFx0XHRzdHJpbmdUZXh0ID0gc3RyaW5nVGV4dC5zcGxpdCh0b2tlbikuam9pbih2YWx1ZVJlcGxhY2UpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIHJlcGxhY2UgdGV4dCBpbiBhIG1vcmUgZWZmaWNpZW50IHdheVxyXG5cdFx0XHRcdHN0cmluZ1RleHQgPSBzdHJpbmdUZXh0LnNwbGl0KHRva2VuKS5qb2luKHZhbHVlUmVwbGFjZSk7XHJcblx0XHRcdFx0Ly9zdHJpbmdUZXh0ID0gc3RyaW5nVGV4dC5yZXBsYWNlKHRva2VuLCB2YWx1ZVJlcGxhY2UpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gc3RyaW5nVGV4dDtcclxuXHR9XHJcblxyXG5cdGdldExpc3RUb2tlbnNCeVN0cmluZ1NlZ21lbnRhdGlvbihzdHJpbmdUZXh0OiBzdHJpbmcpOiBhbnlbXSB7XHJcblx0XHRjb25zdCBhcnJheVRva2VuID0gc3RyaW5nVGV4dC5tYXRjaCgvXFwkeyhbXn1dKylcXH0vZyk7XHJcblx0XHRjb25zdCBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZSA9IHN0cmluZ1RleHQubWF0Y2goL1xcI2RhdGVbXildK1xcKS9nKTtcclxuXHRcdGNvbnN0IGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIgPSBzdHJpbmdUZXh0Lm1hdGNoKC9cXCNudW1iZXJbXildK1xcKS9nKTtcclxuXHRcdGxldCBhcnJheVRva2VuRm9ybWF0dGVkID0gW107XHJcblx0XHRpZiAoXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlICYmXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLmxlbmd0aCA+IDAgJiZcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlciAmJlxyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyLmxlbmd0aCA+IDBcclxuXHRcdCkge1xyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkID0gYXJyYXlUb2tlbkZvcm1hdHRlZERhdGUuY29uY2F0KGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIpO1xyXG5cdFx0fSBlbHNlIGlmIChhcnJheVRva2VuRm9ybWF0dGVkRGF0ZSAmJiBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5zbGljZSgpO1xyXG5cdFx0fSBlbHNlIGlmIChhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyICYmIGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkID0gYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlci5zbGljZSgpO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG5cclxuXHRcdGlmIChhcnJheVRva2VuKSB7XHJcblx0XHRcdGZvciAoY29uc3QgdG9rZW4gb2YgYXJyYXlUb2tlbikge1xyXG5cdFx0XHRcdGNvbnN0IGluZm9Ub2tlbiA9IHsga2V5OiB0b2tlbiwgdmFsdWU6IHRva2VuIH07XHJcblx0XHRcdFx0aWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWQpIHtcclxuXHRcdFx0XHRcdGZvciAoY29uc3QgdG9rZW5Gb3JtYXR0ZWQgb2YgYXJyYXlUb2tlbkZvcm1hdHRlZCkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBpbmRleCA9IHRva2VuRm9ybWF0dGVkLmluZGV4T2YodG9rZW4pO1xyXG5cdFx0XHRcdFx0XHRpZiAoaW5kZXggPj0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdGluZm9Ub2tlbi52YWx1ZSA9IHRva2VuRm9ybWF0dGVkO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJlc3VsdC5wdXNoKGluZm9Ub2tlbik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0Y2hhbmdlSWRQcm9wZXJ0aWVzT2ZPYmplY3Qobm9ybWFsaXphdGlvbkNvbHVtbnM6IGFueVtdLCBsaXN0RGF0YTogYW55W10pOiBhbnlbXSB7XHJcblx0XHRjb25zdCBuZXdEYXRhID0gW107XHJcblx0XHRsaXN0RGF0YS5mb3JFYWNoKChkYXRhKSA9PiB7XHJcblx0XHRcdGNvbnN0IG9iakRhdGEgPSB7fTtcclxuXHRcdFx0T2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcclxuXHRcdFx0XHRpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdG5vcm1hbGl6YXRpb25Db2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAoY29sdW1uLmlkQ29sdW1uLnRvU3RyaW5nKCkgPT09IHByb3BlcnR5KSB7XHJcblx0XHRcdFx0XHRcdFx0b2JqRGF0YVtjb2x1bW4ua2V5XSA9IGRhdGFbcHJvcGVydHldO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRpZiAob2JqRGF0YSkge1xyXG5cdFx0XHRcdG5ld0RhdGEucHVzaChvYmpEYXRhKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gbmV3RGF0YTtcclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlSHRtbEJ5VG9rZW5zQW5kRGF0YShodG1sOiBzdHJpbmcsIGxpc3REYXRhOiBhbnlbXSwgbGlzdFRva2VuczogYW55W10pOiBzdHJpbmdbXSB7XHJcblx0XHRjb25zdCB0cmFuc2xhdGVkQ2FyZHM6IGFueVtdID0gW107XHJcblx0XHRsaXN0RGF0YS5mb3JFYWNoKChkYXRhKSA9PiB7XHJcblx0XHRcdGNvbnN0IG9ialRva2VuID0ge307XHJcblx0XHRcdGNvbnN0IGh0bWxUcmFuc2xhdGVkID0geyBodG1sOiBodG1sIH07XHJcblx0XHRcdE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XHJcblx0XHRcdFx0bGlzdFRva2Vucy5mb3JFYWNoKCh0b2tlbikgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5ID09IHRva2VuLmtleS5yZXBsYWNlKCckeycsICcnKS5yZXBsYWNlKCd9JywgJycpKSB7XHJcblx0XHRcdFx0XHRcdG9ialRva2VuW3Rva2VuLmtleV0gPSBkYXRhW3Byb3BlcnR5XTtcclxuXHRcdFx0XHRcdFx0aHRtbFRyYW5zbGF0ZWQuaHRtbCA9IGh0bWxUcmFuc2xhdGVkLmh0bWwucmVwbGFjZShcclxuXHRcdFx0XHRcdFx0XHR0b2tlbi5rZXksXHJcblx0XHRcdFx0XHRcdFx0ZGF0YVtwcm9wZXJ0eV1cclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRyYW5zbGF0ZWRDYXJkcy5wdXNoKGh0bWxUcmFuc2xhdGVkKTtcclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIHRyYW5zbGF0ZWRDYXJkcztcclxuXHR9XHJcblxyXG5cdGdldExpc3RUb2tlbnNCeVN0cmluZyhzdHJpbmdUZXh0OiBzdHJpbmcpOiBhbnlbXSB7XHJcblx0XHR2YXIgYXJyYXlUb2tlbiA9IHN0cmluZ1RleHQubWF0Y2goL1xcJHsoW159XSspXFx9L2cpO1xyXG5cdFx0dmFyIGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlID0gc3RyaW5nVGV4dC5tYXRjaCgvXFwjZGF0ZVteKV0rXFwpL2cpO1xyXG5cdFx0dmFyIGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIgPSBzdHJpbmdUZXh0Lm1hdGNoKC9cXCNudW1iZXJbXildK1xcKS9nKTtcclxuXHRcdHZhciBhcnJheVRva2VuRm9ybWF0dGVkID0gW107XHJcblx0XHRpZiAoXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlICYmXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLmxlbmd0aCA+IDAgJiZcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlciAmJlxyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyLmxlbmd0aCA+IDBcclxuXHRcdCkge1xyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkID0gYXJyYXlUb2tlbkZvcm1hdHRlZERhdGUuY29uY2F0KGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIpO1xyXG5cdFx0fSBlbHNlIGlmIChhcnJheVRva2VuRm9ybWF0dGVkRGF0ZSAmJiBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5zbGljZSgpO1xyXG5cdFx0fSBlbHNlIGlmIChhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyICYmIGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkID0gYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlci5zbGljZSgpO1xyXG5cdFx0fVxyXG5cdFx0dmFyIHJlc3VsdDogYW55W10gPSBbXTtcclxuXHJcblx0XHRpZiAoYXJyYXlUb2tlbikge1xyXG5cdFx0XHRmb3IgKGNvbnN0IHRva2VuIG9mIGFycmF5VG9rZW4pIHtcclxuXHRcdFx0XHRsZXQga2V5VHlwZTogbnVtYmVyID0gVG9rZW5TZXJ2aWNlLmdldEtleVR5cGUodG9rZW4pO1xyXG5cdFx0XHRcdGlmIChrZXlUeXBlID09PSBudWxsKSB7XHJcblx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dmFyIGluZm9Ub2tlbiA9IHsga2V5OiB0b2tlbiwgdmFsdWU6IHRva2VuIH07XHJcblx0XHRcdFx0aWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWQpIHtcclxuXHRcdFx0XHRcdGZvciAoY29uc3QgdG9rZW5Gb3JtYXR0ZWQgb2YgYXJyYXlUb2tlbkZvcm1hdHRlZCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgaW5kZXggPSB0b2tlbkZvcm1hdHRlZC5pbmRleE9mKHRva2VuKTtcclxuXHRcdFx0XHRcdFx0aWYgKGluZGV4ID49IDApIHtcclxuXHRcdFx0XHRcdFx0XHRpbmZvVG9rZW4udmFsdWUgPSB0b2tlbkZvcm1hdHRlZDtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXN1bHQucHVzaChpbmZvVG9rZW4pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHJcblx0XHQvLyBsZXQgdG9rZW5zOiBhbnlbXSA9IFtdO1xyXG5cdFx0Ly8gbGV0IGkgPSB0aGlzLm5leHRWYWxpZFBvc2l0aW9uVG9rZW5zKHN0cmluZ1RleHQsIDApO1xyXG5cdFx0Ly8gbGV0IGNvdW50ID0gMDtcclxuXHRcdC8vIHdoaWxlIChpID49IDAgJiYgY291bnQgPD0gMTApIHtcclxuXHRcdC8vICAgbGV0IGluZm9Ub2tlbjoge30gPSBudWxsO1xyXG5cdFx0Ly8gICBsZXQgbmV4dEk6IG51bWJlciA9IGk7XHJcblx0XHQvLyAgIGxldCBjaGFyYWN0ZXIgPSBzdHJpbmdUZXh0LnN1YnN0cmluZyhpLCAoaSArIDEpKTtcclxuXHRcdC8vICAgaWYgKGNoYXJhY3RlciA9PSBcIiRcIikge1xyXG5cdFx0Ly8gICAgIGxldCBuZXh0Q2hhcmFjdGVyID0gc3RyaW5nVGV4dC5zdWJzdHJpbmcoKGkgKyAxKSwgKGkgKyAyKSk7XHJcblx0XHQvLyAgICAgLy8gVGhlIG5leHQgY2hhcmFjdGVyIG5lZWQgdG8gYmUgYSB7IHNpZ25cclxuXHRcdC8vICAgICBpZiAobmV4dENoYXJhY3RlciAhPSBcIntcIikge1xyXG5cdFx0Ly8gICAgICAgaSA9IHRoaXMubmV4dFZhbGlkUG9zaXRpb25Ub2tlbnMoc3RyaW5nVGV4dCwgbmV4dEkgKyAxKTtcclxuXHRcdC8vICAgICAgIGNvbnRpbnVlO1xyXG5cdFx0Ly8gICAgIH1cclxuXHRcdC8vICAgICBsZXQga2V5VG9rZW46IHN0cmluZyA9IHN0cmluZ1RleHQuc3Vic3RyaW5nKGksIHN0cmluZ1RleHQuaW5kZXhPZihcIn1cIiwgaSkgKyAxKTtcclxuXHRcdC8vICAgICAvLyBJZiB0aGUgdG9rZW4gaGF2ZSBhIHZhbGlkIGtleSB0eXBlXHJcblx0XHQvLyAgICAgbGV0IGtleVR5cGU6IG51bWJlciA9IFRva2VuU2VydmljZS5nZXRLZXlUeXBlKGtleVRva2VuLnJlcGxhY2UoXCJ7XCIsIFwiXCIpLnJlcGxhY2UoXCJ9XCIsIFwiXCIpKTtcclxuXHRcdC8vICAgICBpZiAoa2V5VHlwZSA9PT0gbnVsbCkge1xyXG5cdFx0Ly8gICAgICAgaSA9IHRoaXMubmV4dFZhbGlkUG9zaXRpb25Ub2tlbnMoc3RyaW5nVGV4dCwgbmV4dEkgKyAxKTtcclxuXHRcdC8vICAgICAgIGNvbnRpbnVlO1xyXG5cdFx0Ly8gICAgIH1cclxuXHRcdC8vICAgICBpbmZvVG9rZW4gPSB7XHJcblx0XHQvLyAgICAgICBrZXk6IGtleVRva2VuLFxyXG5cdFx0Ly8gICAgICAgdmFsdWU6IGtleVRva2VuXHJcblx0XHQvLyAgICAgfTtcclxuXHRcdC8vICAgICBuZXh0SSA9IHN0cmluZ1RleHQuaW5kZXhPZihcIn1cIiwgaSk7XHJcblx0XHQvLyAgIH0gZWxzZSB7XHJcblx0XHQvLyAgICAgbGV0IG5leHRTaWduOiBudW1iZXIgPSBzdHJpbmdUZXh0LmluZGV4T2YoXCIkXCIsIGkpO1xyXG5cdFx0Ly8gICAgIC8vIFdlIGlubHkgc3VwcG9ydCAjZGF0ZSgkIGFuZCAjbnVtYmVyKCQgaW4gdGhpcyAyIHNjZW5hcmlvcyB0aGUgbGVuZ2h0IGNhbid0IGJlIG1vcmUgdGhhbiAxMCBjaGFyYWN0ZXJzXHJcblx0XHQvLyAgICAgaWYgKG5leHRTaWduIDwgMCB8fCAobmV4dFNpZ24gLSBpKSA+IDEwKSB7XHJcblx0XHQvLyAgICAgICBpID0gdGhpcy5uZXh0VmFsaWRQb3NpdGlvblRva2VucyhzdHJpbmdUZXh0LCBuZXh0SSArIDEpO1xyXG5cdFx0Ly8gICAgICAgY29udGludWU7XHJcblx0XHQvLyAgICAgfVxyXG5cdFx0Ly8gICAgIGxldCBrZXlUb2tlbjogc3RyaW5nID0gc3RyaW5nVGV4dC5zdWJzdHJpbmcoc3RyaW5nVGV4dC5pbmRleE9mKFwiJFwiLCBpKSwgc3RyaW5nVGV4dC5pbmRleE9mKFwifVwiLCBpKSArIDEpO1xyXG5cdFx0Ly8gICAgIGxldCB2YWx1ZVRva2VuOiBzdHJpbmcgPSBzdHJpbmdUZXh0LnN1YnN0cmluZyhpLCBzdHJpbmdUZXh0LmluZGV4T2YoXCIpXCIsIGkpICsgMSk7XHJcblx0XHQvLyAgICAgaW5mb1Rva2VuID0ge1xyXG5cdFx0Ly8gICAgICAga2V5OiBrZXlUb2tlbixcclxuXHRcdC8vICAgICAgIHZhbHVlOiB2YWx1ZVRva2VuXHJcblx0XHQvLyAgICAgfTtcclxuXHRcdC8vICAgICBuZXh0SSA9IHN0cmluZ1RleHQuaW5kZXhPZihcIilcIiwgaSk7XHJcblx0XHQvLyAgIH1cclxuXHRcdC8vICAgdG9rZW5zLnB1c2goaW5mb1Rva2VuKTtcclxuXHRcdC8vICAgaSA9IHRoaXMubmV4dFZhbGlkUG9zaXRpb25Ub2tlbnMoc3RyaW5nVGV4dCwgbmV4dEkpO1xyXG5cdFx0Ly8gICBjb3VudCsrO1xyXG5cdFx0Ly8gfVxyXG5cdFx0Ly8gcmV0dXJuIHRva2VucztcclxuXHR9XHJcblxyXG5cdG5leHRWYWxpZFBvc2l0aW9uVG9rZW5zKHN0cmluZ1RleHQ6IHN0cmluZywgbmV4dEk6IG51bWJlcik6IG51bWJlciB7XHJcblx0XHRsZXQgdG9rZW5Eb2xsYXJTaWduOiBudW1iZXIgPSBzdHJpbmdUZXh0LmluZGV4T2YoJyQnLCBuZXh0SSk7XHJcblx0XHRsZXQgdG9rZW5OdW1TaWduOiBudW1iZXIgPSBzdHJpbmdUZXh0LmluZGV4T2YoJyMnLCBuZXh0SSk7XHJcblx0XHRsZXQgaTogbnVtYmVyID1cclxuXHRcdFx0dG9rZW5Eb2xsYXJTaWduIDwgMCAmJiB0b2tlbk51bVNpZ24gPj0gMFxyXG5cdFx0XHRcdD8gdG9rZW5OdW1TaWduXHJcblx0XHRcdFx0OiB0b2tlbk51bVNpZ24gPCAwICYmIHRva2VuRG9sbGFyU2lnbiA+PSAwXHJcblx0XHRcdFx0PyB0b2tlbkRvbGxhclNpZ25cclxuXHRcdFx0XHQ6IHRva2VuRG9sbGFyU2lnbiA8IHRva2VuTnVtU2lnblxyXG5cdFx0XHRcdD8gdG9rZW5Eb2xsYXJTaWduXHJcblx0XHRcdFx0OiB0b2tlbk51bVNpZ247XHJcblx0XHRyZXR1cm4gaTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldXNlcyByZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3RQdWJsaWMgYnV0IHNldCBhbGwga2V5cyBsb2JqZWN0dG9rZW5zIGFzIGxvd2VyY2FzZVxyXG5cdCAqIEBwYXJhbSB0b2tlbk5hbWVcclxuXHQgKiBAcGFyYW0gZm9ybXVsYVxyXG5cdCAqIEBwYXJhbSBsT2JqZWN0VG9rZW5zXHJcblx0ICovXHJcblx0cmVwbGFjZVRva2Vuc0Zyb21MaXN0T2JqZWN0UHVibGljKFxyXG5cdFx0dG9rZW5OYW1lOiBzdHJpbmcsXHJcblx0XHRmb3JtdWxhOiBzdHJpbmcsXHJcblx0XHRsT2JqZWN0VG9rZW5zOiBhbnlbXVxyXG5cdCk6IHN0cmluZyB7XHJcblx0XHRsZXQgbERhdGFPcmc6IGFueVtdID0gW107XHJcblx0XHRpZiAobE9iamVjdFRva2Vucykge1xyXG5cdFx0XHRmb3IgKGxldCBkYXRhRm9ybSBpbiBsT2JqZWN0VG9rZW5zKSB7XHJcblx0XHRcdFx0bERhdGFPcmdbZGF0YUZvcm0udG9Mb3dlckNhc2UoKV0gPSBsT2JqZWN0VG9rZW5zW2RhdGFGb3JtXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRoaXMucmVwbGFjZVRva2Vuc0Zyb21MaXN0T2JqZWN0KHRva2VuTmFtZSwgZm9ybXVsYSwgbERhdGFPcmcpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBAcGFyYW0gdG9rZW5OYW1lIHRva2VuIG5hbWVcclxuXHQgKiBAcGFyYW0gZm9ybXVsYSBTdHJpbmcgd2l0aCB0aGUgZm9ybXVsYSB0byBleGVjdXRlXHJcblx0ICogQHBhcmFtIGxPYmplY3RUb2tlbnMgTGlzdCBvZiB0b2tlbnMgd2l0aCB0aGUgdmFsdWVzIHRvIHJlcGxhY2VcclxuXHQgKi9cclxuXHRyZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3QodG9rZW5OYW1lOiBzdHJpbmcsIGZvcm11bGE6IHN0cmluZywgbE9iamVjdFRva2VuczogYW55KTogc3RyaW5nIHtcclxuXHRcdGlmICghZm9ybXVsYSB8fCBmb3JtdWxhLmxlbmd0aCA9PSAwKSB7XHJcblx0XHRcdHRocm93IHtcclxuXHRcdFx0XHRtZXNzYWdlOiAnTGEgZm9ybXVsYSBkZWwgdG9rZW4gJyArIHRva2VuTmFtZSArICcgZXN0YSB2YWPDrWEnLFxyXG5cdFx0XHRcdHRpdGxlOiAnQWxlcnRhIScsXHJcblx0XHRcdFx0ZXJyb3I6XHJcblx0XHRcdFx0XHQnTGEgZm9ybXVsYSBkZWwgdG9rZW4gJyArIHRva2VuTmFtZSArICcgZXN0YSB2YWPDrWEuIFtmb3JtdWxhWycgKyBmb3JtdWxhICsgJ11dJ1xyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdFx0bGV0IHJlcGxhY2VkVG9rZW5zOiBzdHJpbmcgPSBmb3JtdWxhLnRvU3RyaW5nKCk7XHJcblx0XHRpZiAocmVwbGFjZWRUb2tlbnMuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XHJcblx0XHRcdHJldHVybiByZXBsYWNlZFRva2VucztcclxuXHRcdH1cclxuXHRcdC8vIEZpbmQgdGhlIHRva2VucyBpbiB0aGUgZm9ybXVsYVxyXG5cdFx0bGV0IHRva2Vuc0FycmF5OiBhbnlbXSA9IHRoaXMuZ2V0TGlzdFRva2Vuc0J5U3RyaW5nKHJlcGxhY2VkVG9rZW5zKTtcclxuXHRcdGlmICh0b2tlbnNBcnJheS5sZW5ndGggPT0gMCkge1xyXG5cdFx0XHRyZXR1cm4gcmVwbGFjZWRUb2tlbnM7XHJcblx0XHR9XHJcblx0XHQvLyBJZiB0aGVyZSBhbnkgdG9rZW4sIHRyeSB0byByZXBsYWNlXHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vuc0FycmF5Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGxldCBvYmplY3RUb2tlbiA9XHJcblx0XHRcdFx0bE9iamVjdFRva2Vuc1t0b2tlbnNBcnJheVtpXS5rZXldICE9PSB1bmRlZmluZWRcclxuXHRcdFx0XHRcdD8gbE9iamVjdFRva2Vuc1t0b2tlbnNBcnJheVtpXS5rZXldXHJcblx0XHRcdFx0XHQ6IG51bGw7XHJcblx0XHRcdGxldCBjbGVhcktleTtcclxuXHRcdFx0aWYgKG9iamVjdFRva2VuID09IG51bGwpIHtcclxuXHRcdFx0XHRjbGVhcktleSA9IHRva2Vuc0FycmF5W2ldLmtleS5yZXBsYWNlKCckeycsICcnKS5yZXBsYWNlKCd9JywgJycpLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0b2JqZWN0VG9rZW4gPVxyXG5cdFx0XHRcdFx0bE9iamVjdFRva2Vuc1tjbGVhcktleV0gIT09IHVuZGVmaW5lZCA/IGxPYmplY3RUb2tlbnNbY2xlYXJLZXldIDogbnVsbDtcclxuXHJcblx0XHRcdFx0aWYgKG9iamVjdFRva2VuID09IG51bGwpIHtcclxuXHRcdFx0XHRcdGNsZWFyS2V5ID0gdG9rZW5zQXJyYXlbaV0ua2V5XHJcblx0XHRcdFx0XHRcdC5yZXBsYWNlKCd7JywgJycpXHJcblx0XHRcdFx0XHRcdC5yZXBsYWNlKCd9JywgJycpXHJcblx0XHRcdFx0XHRcdC5zcGxpdCgnXycpWzFdXHJcblx0XHRcdFx0XHRcdC50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdFx0b2JqZWN0VG9rZW4gPVxyXG5cdFx0XHRcdFx0XHRsT2JqZWN0VG9rZW5zW2NsZWFyS2V5XSAhPT0gdW5kZWZpbmVkID8gbE9iamVjdFRva2Vuc1tjbGVhcktleV0gOiBudWxsO1xyXG5cdFx0XHRcdFx0aWYgKG9iamVjdFRva2VuID09PSBudWxsIHx8IG9iamVjdFRva2VuID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYXJyYXlLZXkgPSB0b2tlbnNBcnJheVtpXS5rZXlcclxuXHRcdFx0XHRcdFx0XHQucmVwbGFjZSgneycsICcnKVxyXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKCd9JywgJycpXHJcblx0XHRcdFx0XHRcdFx0LnNwbGl0KCdfJylbMV1cclxuXHRcdFx0XHRcdFx0XHQuc3BsaXQoJy4nKTtcclxuXHRcdFx0XHRcdFx0aWYgKGFycmF5S2V5Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgdmFsdWUgPSBsT2JqZWN0VG9rZW5zO1xyXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheUtleS5sZW5ndGg7IGluZGV4KyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxldCBlbGVtZW50ID0gYXJyYXlLZXlbaW5kZXhdO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGluZGV4ID09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxlbWVudCA9IGVsZW1lbnQudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWVbZWxlbWVudF07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdG9iamVjdFRva2VuID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKG9iamVjdFRva2VuID09IG51bGwpIHtcclxuXHRcdFx0XHQvLyBJZiBub3QgZmluZCB0aGUgdG9rZW4sIGJ5IGRlZmF1bHQgcHV0IGFuIGVtcHR5IHN0cmluZ1xyXG5cdFx0XHRcdC8qaWYgKFRva2VuU2VydmljZS5leGNsdWRlZFRva2VuLmluZGV4T2YoY2xlYXJLZXkpID09PSAtMSkge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcihcclxuXHRcdFx0XHRcdFx0J0VsIHRva2VuICcgKyB0b2tlbnNBcnJheVtpXS52YWx1ZSArICcgbm8gZnVlIGVuY29udHJhZG8uJyxcclxuXHRcdFx0XHRcdFx0bE9iamVjdFRva2VucyxcclxuXHRcdFx0XHRcdFx0dG9rZW5zQXJyYXlcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fSovXHJcblx0XHRcdFx0b2JqZWN0VG9rZW4gPSAnJztcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAob2JqZWN0VG9rZW4gIT0gbnVsbCkge1xyXG5cdFx0XHRcdC8vIGxldCB2YWx1ZTogYW55ID0gTnVtYmVyKG9iamVjdFRva2VuKVxyXG5cdFx0XHRcdC8vIFx0PyBvYmplY3RUb2tlblxyXG5cdFx0XHRcdC8vIFx0OiBBcnJheS5pc0FycmF5KG9iamVjdFRva2VuKVxyXG5cdFx0XHRcdC8vIFx0PyBKU09OLnN0cmluZ2lmeShvYmplY3RUb2tlbilcclxuXHRcdFx0XHQvLyBcdDogXCInXCIgKyBvYmplY3RUb2tlbiArIFwiJ1wiO1xyXG5cdFx0XHRcdGxldCB2YWx1ZTogYW55O1xyXG5cdFx0XHRcdGlmIChOdW1iZXIob2JqZWN0VG9rZW4pKSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IE51bWJlcihvYmplY3RUb2tlbik7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdFRva2VuKSkge1xyXG5cdFx0XHRcdFx0dmFsdWUgPSBBcnJheS5pc0FycmF5KG9iamVjdFRva2VuKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKEpTT04uc3RyaW5naWZ5KG9iamVjdFRva2VuKSkge1xyXG5cdFx0XHRcdFx0dmFsdWUgPSBvYmplY3RUb2tlbi5vcmlnaW5hbF9uYW1lXHJcblx0XHRcdFx0XHRcdD8gXCInXCIgKyBvYmplY3RUb2tlbi5vcmlnaW5hbF9uYW1lICsgXCInXCJcclxuXHRcdFx0XHRcdFx0OiBKU09OLnN0cmluZ2lmeShvYmplY3RUb2tlbik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHZhbHVlID0gXCInXCIgKyBvYmplY3RUb2tlbiArIFwiJ1wiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXBsYWNlZFRva2VucyA9IHRoaXMucmVwbGFjZVRva2VuKHJlcGxhY2VkVG9rZW5zLCB0b2tlbnNBcnJheVtpXS52YWx1ZSwgdmFsdWUpO1xyXG5cdFx0XHRcdC8vIH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gICBjb25zb2xlLmVycm9yKGxPYmplY3RUb2tlbnMsIHRva2Vuc0FycmF5KTtcclxuXHRcdFx0XHQvLyAgIHRocm93IHtcclxuXHRcdFx0XHQvLyAgICAgbWVzc2FnZTogXCJObyBzZSBlbmNvbnRyw7MgdmFsb3IgcGFyYSB1biB0b2tlblwiLFxyXG5cdFx0XHRcdC8vICAgICB0aXRsZTogXCJBbGVydGEhXCIsXHJcblx0XHRcdFx0Ly8gICAgIGVycm9yOiBcIkVsIHRva2VuIFwiICsgdG9rZW5zQXJyYXlbaV0udmFsdWUgKyBcIiBubyBmdWUgZW5jb250cmFkby5cIlxyXG5cdFx0XHRcdC8vICAgfTtcclxuXHRcdFx0XHQvL1xyXG5cdFx0XHRcdC8vIFNpIGVzIGxhIHVsdGltYSBpdGVyYWNpb24geSBsYSBmb3JtdWxhIHRpZW5lIFsgZXMgcG9ycXVlIHRpZW5lIHVuIGFycmF5IGVuIGVsIHZhbG9yIHF1ZSByZXNvbHZpbyBlbCB0b2tlblxyXG5cdFx0XHRcdGlmIChpID09IHRva2Vuc0FycmF5Lmxlbmd0aCAtIDEgJiYgcmVwbGFjZWRUb2tlbnMuaW5jbHVkZXMoJ1snKSkge1xyXG5cdFx0XHRcdFx0Ly8gU2UgcG9uZW4gdG9kb3MgbG9zIG9wZXJhbmRvcyBjb21vIGVsZW1lbnRvcyBlbiB1biBhcnJheSBbJ2V4cHJlc2lvbiBhJywgJyYmJywgJ0V4cHJlc2lvbiBCJ11cclxuXHRcdFx0XHRcdGxldCBmb3JtRXhwcmVzc2lvbnM6IHN0cmluZ1tdID0gcmVwbGFjZWRUb2tlbnMuc3BsaXQoLyAoXFx8XFx8fCYmKSAvKTtcclxuXHRcdFx0XHRcdGxldCBsQXV4Zm9ybUV4cHJlc3Npb246IHN0cmluZ1tdID0gW107XHJcblx0XHRcdFx0XHRmb3JtRXhwcmVzc2lvbnMuZm9yRWFjaCgoZXhwcmVzc2lvbjogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChleHByZXNzaW9uLmNoYXJBdCgwKSA9PSAnWycpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgaXNUYWdGb3VuZDogc3RyaW5nID0gJyc7XHJcblx0XHRcdFx0XHRcdFx0aXNUYWdGb3VuZCA9IHRoaXMuZmluZFRhZyhleHByZXNzaW9uKTtcclxuXHRcdFx0XHRcdFx0XHRsQXV4Zm9ybUV4cHJlc3Npb24ucHVzaChpc1RhZ0ZvdW5kKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRsQXV4Zm9ybUV4cHJlc3Npb24ucHVzaChleHByZXNzaW9uKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRyZXBsYWNlZFRva2VucyA9IGxBdXhmb3JtRXhwcmVzc2lvbi5qb2luKCcgJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVwbGFjZWRUb2tlbnM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNRXRvZG8gcXVlIHRlbmllbmRvIHVuYSBleHByZXNpb24gZGUgbGEgZm9ybWEgWyd0YWcxJywgJ3RhZzInXT09dGFnM1xyXG5cdCAqIGV2YWx1YSBzaSB0YWczIGhhY2UgcGFydGUgZGVsIGFycmF5IHNpIHRpZW5lIGVsIG9wZXJhZG9yID09LlxyXG5cdCAqIFNpIHRpZW5lIGVsIG9wZXJhZG9yICE9IGV4YW1pbmEgcXVlIHRhZzMgbm8gaGFnYSBwYXJ0ZSBkZWwgYXJyYXkrXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZXhwcmVzc2lvbiBPcGVyYW5kbyBxdWUgZXZhbHVhIHRhZy4gRXMgZGUgbGEgZm9ybWEgWyd0YWcxJywgJ3RhZzInXT09dGFnM1xyXG5cdCAqIEByZXR1cm5zIFJldG9ybmEgJ3RydWUnIG8gJ2ZhbHNlJyBlbiBzdHJpbmcgcXVlIGRlc3B1ZXMgc2VyYSBwYXNhZG8gYSB1biBldmFsKClcclxuXHQgKiBtYXMgYWRlbGFudGUgZW4gZWwgZmx1am9cclxuXHQgKi9cclxuXHRmaW5kVGFnKGV4cHJlc3Npb246IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRsZXQgcmVnZXhPcGVyYXRvciA9IG5ldyBSZWdFeHAoJyg9PT18PT18IT09fCE9KScpO1xyXG5cdFx0Ly8gUmV0b3JuYSBlbCBvcGVyYWRvclxyXG5cdFx0bGV0IG9wZXJhdG9yOiBzdHJpbmdbXSA9IGV4cHJlc3Npb24ubWF0Y2gocmVnZXhPcGVyYXRvcik7XHJcblx0XHQvLyBTaSBubyBlbmN1ZW50cmEgdW4gb3BlcmFkb3Igc2VndW4gZWwgcGF0cm9uIHJldG9ybmEgJ2ZhbHNlJ1xyXG5cdFx0Ly8gcGFyYSBldml0YXIgcmVzdWx0YWRvcyBpbmVzcGVyYWRvc1xyXG5cdFx0aWYgKG9wZXJhdG9yID09IG51bGwpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignTm8gc2UgZW5jb250cm8gdW4gb3BlcmFkb3IgcGVybWl0aWRvIHBhcmEgbGEgZXhwcmVzaW9uJyk7XHJcblx0XHRcdHJldHVybiAnZmFsc2UnO1xyXG5cdFx0fVxyXG5cdFx0Ly8gU2VwYXJhIGxhIHNlbnRlbmNpYSBwb3IgZWwgb3BlcmFkb3JcclxuXHRcdC8vIExhIHByaW1lcmEgcGFydGUgZXMgZWwgdmFsb3IgcG9yIGVsIGN1YWwgc2UgcmVtcGxhemEgZWwgdG9rZW4gcXVlIGVzIHVuIGFycmF5IGVuIHN0cmluZyBcIlsnYScsICdiJ11cIlxyXG5cdFx0Ly8gRWwgc2VndW5kbyBlcyBlbCB2YWxvciBjb24gZWwgY3VhbCBzZSB2YSBhIGNvbXBhcmFyXHJcblx0XHRsZXQgdmFsdWVUb2tlbiwgdmFsdWVUb0NvbXBhcmU7XHJcblx0XHRbdmFsdWVUb2tlbiwgdmFsdWVUb0NvbXBhcmVdID0gZXhwcmVzc2lvbi5zcGxpdChvcGVyYXRvclswXSk7XHJcblx0XHQvLyBTZSBsaW1waWEgZWwgc3RyaW5nIGNvcnJlc3BvbmRpZW50ZSBhbCBhcnJheSBwYXJhIHF1ZSBsb3MgZWxlbWVudG9zIHF1ZWRlbiBzZXBhcmFkb3MgcG9yIFwiLFwiXHJcblx0XHR2YWx1ZVRva2VuID0gdmFsdWVUb2tlbi5yZXBsYWNlKC9bXmEtekEtWjAtOSAsXS9nLCAnJyk7XHJcblx0XHQvLyBTaSBubyBoYXkgdGFncyBhc29jaWFkb3MgYWwgcmVnaXN0cm8gc2UgZGV2dWVsdmUgJ2ZhbHNlJ1xyXG5cdFx0aWYgKCF2YWx1ZVRva2VuKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ05vIGhheSB0YWdzIGFzb2NpYWRvcyBhIGVzdGEgYXBsaWNhY2nDs24nKTtcclxuXHRcdFx0cmV0dXJuICdmYWxzZSc7XHJcblx0XHR9XHJcblx0XHQvLyBTZSBsaW1waWEgZWwgc3RyaW5nIGNvcnJlc3BvbmRpZW50ZSBhbCB2YWxvciBwb3IgY29tcGFyYXJcclxuXHRcdHZhbHVlVG9Db21wYXJlID0gdmFsdWVUb0NvbXBhcmUucmVwbGFjZSgvW15hLXpBLVowLTkgXS9nLCAnJyk7XHJcblx0XHQvLyBFbCBzdHJpbmcgY29ycmVzcG9uZGllbnRlIGFsIGFycmF5IHBhc2EgYSBzZXIgdGlwbyBhcnJheVxyXG5cdFx0dmFsdWVUb2tlbiA9IHZhbHVlVG9rZW4uc3BsaXQoJywnKTtcclxuXHJcblx0XHQvLyBTZSB0cmF0YSBkZSBjb25zdGF0YXIgc2kgZWwgdmFsb3IgYSBjb21wYXJhciBzZSBlbmN1ZXRyYSBvIG5vIGRlbnRyb1xyXG5cdFx0Ly8gU2kgZWwgb3BlcmFkb3IgcXVlIHNlIGVuY29udHJvID09IHJldHVybmEgdHJ1ZSBzaSBsbyBlbmN1ZW50cmFcclxuXHRcdGxldCBpc1RhZ0ZvdW5kOiBib29sZWFuID0gdHJ1ZTtcclxuXHRcdHN3aXRjaCAob3BlcmF0b3JbMF0pIHtcclxuXHRcdFx0Y2FzZSAnPT0nOlxyXG5cdFx0XHRcdGlzVGFnRm91bmQgPSB2YWx1ZVRva2VuLnNvbWUoKHRhZykgPT4gdGFnID09IHZhbHVlVG9Db21wYXJlKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnPT09JzpcclxuXHRcdFx0XHRpc1RhZ0ZvdW5kID0gdmFsdWVUb2tlbi5zb21lKCh0YWcpID0+IHRhZyA9PT0gdmFsdWVUb0NvbXBhcmUpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICchPT0nOlxyXG5cdFx0XHRcdGlzVGFnRm91bmQgPSB2YWx1ZVRva2VuLnNvbWUoKHRhZykgPT4gdGFnICE9PSB2YWx1ZVRvQ29tcGFyZSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJyE9JzpcclxuXHRcdFx0XHRpc1RhZ0ZvdW5kID0gdmFsdWVUb2tlbi5zb21lKCh0YWcpID0+IHRhZyAhPSB2YWx1ZVRvQ29tcGFyZSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0XHRleHByZXNzaW9uID0gaXNUYWdGb3VuZCA/ICd0cnVlJyA6ICdmYWxzZSc7XHJcblx0XHRyZXR1cm4gZXhwcmVzc2lvbjtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyeSB0byBldmFsIHRoZSBmb3JtdWxhIGRlcGVuZCBvZiB0aGUgdHlwZSBvZiBmaWVsZHMuXHJcblx0ICogQHBhcmFtIGxTdGF0aWNUb2tlblxyXG5cdCAqIEBwYXJhbSBmb3JtdWxhTmFtZVxyXG5cdCAqIEBwYXJhbSBmb3JtdWxhXHJcblx0ICovXHJcblx0dmFsaWRhdGVGb3JtdWxhKGxTdGF0aWNUb2tlbjogYW55LCBmb3JtdWxhTmFtZTogc3RyaW5nLCBmb3JtdWxhOiBzdHJpbmcpOiBib29sZWFuIHtcclxuXHRcdGxldCBldmFsRm9ybXVsYTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdFx0Ly8gVG8gdmFsaWRhdGUgdGhlIGZvcm11bGEsIGZpcnN0IG9yZ2FuaXplIHRoZSBpbmZvIHRvIGtleSAtIHZhbHVlIGFycmF5XHJcblx0XHRsZXQgb2JqZWN0VG9rZW5zOiBhbnlbXSA9IFtdO1xyXG5cdFx0Zm9yIChsZXQgcGFuZWwgb2YgbFN0YXRpY1Rva2VuKSB7XHJcblx0XHRcdGZvciAobGV0IGdyb3VwVG9rZW4gb2YgcGFuZWwudmFsdWUpIHtcclxuXHRcdFx0XHRmb3IgKGxldCBzdGF0aWNUb2tlbiBvZiBncm91cFRva2VuLnZhbHVlKSB7XHJcblx0XHRcdFx0XHRmb3IgKGxldCBhcnJheVRva2VuSW5mbyBvZiBzdGF0aWNUb2tlbikge1xyXG5cdFx0XHRcdFx0XHRvYmplY3RUb2tlbnNbYXJyYXlUb2tlbkluZm8ua2V5XSA9IGFycmF5VG9rZW5JbmZvLm9iamVjdFxyXG5cdFx0XHRcdFx0XHRcdD8gYXJyYXlUb2tlbkluZm8ub2JqZWN0LnR5cGUgPT0gJ251bWJlcidcclxuXHRcdFx0XHRcdFx0XHRcdD8gJzAnXHJcblx0XHRcdFx0XHRcdFx0XHQ6ICcnXHJcblx0XHRcdFx0XHRcdFx0OiAnJztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHRyeSB7XHJcblx0XHRcdGZvcm11bGEgPSB0aGlzLnJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdChmb3JtdWxhTmFtZSwgZm9ybXVsYSwgb2JqZWN0VG9rZW5zKTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdC8vY29uc29sZS5lcnJvcihlcnJvcik7XHJcblx0XHRcdHRocm93IGVycm9yO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGZvcm11bGEgIT09IG51bGwpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRsZXQgcmVzdWx0ID0gZm9ybXVsYS5zdGFydHNXaXRoKCdmaWxlOi8vJykgPyBmb3JtdWxhIDogZXZhbChmb3JtdWxhKTtcclxuXHRcdFx0XHRldmFsRm9ybXVsYSA9IHRydWU7XHJcblx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHQvL2NvbnNvbGUuZXJyb3IoXCJFcnJvciBldmFsdWF0aW5nIHRoZSBmb3JtdWxhXCIsIGUpO1xyXG5cdFx0XHRcdHRocm93IHtcclxuXHRcdFx0XHRcdG1lc3NhZ2U6ICdMYSBmb3JtdWxhIG5vIGZ1ZSBwb3NpYmxlIGV2YWx1YXInLFxyXG5cdFx0XHRcdFx0dGl0bGU6ICdBbGVydGEhJyxcclxuXHRcdFx0XHRcdGVycm9yOiBlXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGV2YWxGb3JtdWxhO1xyXG5cdH1cclxuXHJcblx0Z2V0Q29uZmlnQ2xvbmluZ1Rva2VuTWFwKG9sZFBQUDogbnVtYmVyLCBuZXdQUFA6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuY29uZmlndXJhdGlvbiArICd0b2tlbi9nZXRDb25maWdDbG9uaW5nVG9rZW5NYXAnLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpXHJcblx0XHRcdFx0XHQuc2V0KCdvbGRQUFAnLCBvbGRQUFAudG9TdHJpbmcoKSlcclxuXHRcdFx0XHRcdC5zZXQoJ25ld1BQUCcsIG5ld1BQUC50b1N0cmluZygpKVxyXG5cdFx0XHR9XHJcblx0XHQpO1xyXG5cdH1cclxufVxyXG4iXX0=
|