ng-easycommerce 0.0.598 → 0.0.599

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.
@@ -62,7 +62,7 @@ let DataFormEcComponent = class DataFormEcComponent extends ComponentHelper {
62
62
  this.viewDataFacturacion = true;
63
63
  this.params = {};
64
64
  this.selectAddres = false;
65
- this.postalCodePattern = '^[A-Z]?[0-9]{4}[A-Z]{0,3}$';
65
+ this.postalCodeErrorMessage = "";
66
66
  /**
67
67
  * @description filtra los paises de acuerdo al a los codigos retornados en la funcion getCountries.
68
68
  * Casos de usos: Si getCountries es vacio, retorna el arreglo que ingresa por parametro.
@@ -335,10 +335,11 @@ let DataFormEcComponent = class DataFormEcComponent extends ComponentHelper {
335
335
  this.modalRef = this.modalService.show(template, { class: 'modal-lg ', keyboard: false, backdrop: 'static' });
336
336
  }
337
337
  updatePostalCodeValidation(countryCode) {
338
- const postalCodePattern = this.consts.getPostalCodePattern(countryCode) || '.*';
338
+ const postalCodeConfig = this.consts.getPostalCodePattern(countryCode) || { pattern: /.*/, errorKey: "postal-code-pattern-error.default" };
339
+ this.postalCodeErrorMessage = postalCodeConfig.errorKey;
339
340
  this.checkoutForm.controls['postcode'].setValidators([
340
341
  Validators.required,
341
- Validators.pattern(postalCodePattern)
342
+ Validators.pattern(postalCodeConfig.pattern)
342
343
  ]);
343
344
  this.checkoutForm.controls['postcode'].updateValueAndValidity();
344
345
  }
@@ -369,10 +370,10 @@ __decorate([
369
370
  DataFormEcComponent = __decorate([
370
371
  Component({
371
372
  selector: 'app-dataform-ec',
372
- template: "<ng-container *ngIf=\"this.channelConfig.channelType != 'b2b' || (this.channelConfig.channelType == 'b2b' && authService.isAuthenticated()); else pleaseLogin\">\n<ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null\">\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\" *ngIf=\"!getParamByChannelAndLanguage('btn_new_address_')\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\" *ngIf=\"getParamByChannelAndLanguage('btn_new_address_') as param\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ param.value}}\n </label>\n\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"getMode(); else addressSelection\">\n <div *ngIf=\"!require_login; else requireLoginView\">\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_LOAD_ADDRESS'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'billing-details'|translate}}</h3>\n </div>\n </ng-container>\n\n <form (submit)=\"verifyValidate(false,this.cartService.items)\">\n <div class=\"row mt-df\"><!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutForm.controls['firstName']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.firstName.touched && checkoutForm.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.firstName.touched && checkoutForm.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutForm.controls['lastName']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.lastName.touched && checkoutForm.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.lastName.touched && checkoutForm.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\"><!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\n [formControl]=\"checkoutForm.controls['phoneNumber']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.phoneNumber.touched && checkoutForm.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.phoneNumber.touched && checkoutForm.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutForm.controls['email']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.email.touched && checkoutForm.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.email.touched && checkoutForm.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 3-->\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(countries$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutForm.controls['countryCode']\"\n (change)=\"onCountrySelected($event.target.value)\">\n <!-- <option selected [value]=\"countries[0].code\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">{{ country.name }}</option>\n </select>\n <div *ngIf=\"checkoutForm.controls.countryCode.touched && checkoutForm.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(provinces$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['provinceCode']\">\n<!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option>\n --> <option *ngFor=\"let province of provinces\" [value]=\"province.code\">{{ province.name }}\n </option>\n </select>\n <div *ngIf=\"checkoutForm.controls.provinceCode.touched && checkoutForm.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutForm.controls['city']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.city.touched && checkoutForm.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutForm.controls['street']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.street.touched && checkoutForm.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.street.touched && checkoutForm.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n\n <!-- form direcci\u00F3n -->\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.enabled\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n [formControl]=\"checkoutForm.controls['postcode']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.postcode.touched && checkoutForm.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.postcode.touched && checkoutForm.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 5-->\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n (change)=\"onDocumentTypesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['documentType']\">\n<!-- <option [value]=\"''\" selected>{{'document-type'|translate}}</option>\n --> <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">{{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.documentType.touched && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\"\n [type]=\"'text'\" name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\" min=\"1\" max=\"99999999999\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.documentNumber.touched && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 6-->\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}} <span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\" [innerHTML]=\"labelnotes.value\"><span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [formControl]=\"checkoutForm.controls['notes']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n </div>\n </div>\n <div class=\"row mt-df\"><!--Fila 7-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFact\"></label>\n </div>\n </div>\n <div class=\"row mt-df\">\n <div class=\"col-12\">\n <p>\n <!-- <span class=\"required\"></span> -->\n <label class=\"required text-underline\">* {{ 'required-fields' | translate }}</label>\n </p>\n </div>\n </div>\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.enabled\">\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.required\"\n class=\"required\">*</span>\n <label class=\"\" for=\"\"> {{ 'accept-terms' | translate }} <input class=\"ms-2\" name=\"terms\"\n [formControl]=\"checkoutForm.controls['terms']\" type=\"checkbox\" required\n (change)=\"onInputChange()\" /> </label><br />\n <a (click)=\"openModal(template)\" role=\"button\" class=\"ms-3 nota-input text-dark\">{{ 'whats-this' |\n translate }}</a>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.terms.touched && !checkoutForm.controls.terms.value\">\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\n </div>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"viewDataFacturacion ; else datosFormFacturacion\"> </div>\n <div class=\"checkout-btn-unique text-end\">\n <button type=\"submit\" [disabled]=\"!validado\" class=\"btn valid-btn mt-2\">\n {{(isLastOne ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}</button>\n\n\n </div>\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </form>\n </div>\n</ng-container>\n\n<ng-template #addressSelection>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_ADDRESS_SELECTION'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'address-selection'|translate}}</h3>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"this.addressBook; else addressBookNotResult\">\n\n <ng-container *ngIf=\"this.addressBook?.length ;else addressBookLoading\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\" [id]=\"i\"\n [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\" (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n <div class=\"row px-3\">\n <div class=\"card p-2 bg-light w-100\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'first-name'|translate}}</strong>\n {{item.addressContact.firstName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'last-name'|translate}}</strong> {{item.addressContact.lastName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-type'|translate}}</strong>\n {{getDocumentType(item.addressContact.documentType)}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-number'|translate}}</strong>\n {{item.addressContact.documentNumber}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'email-address'|translate}}</strong> {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <div class=\"w-100\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}</label>\n <label class=\"field-label\"\n *ngIf=\"getLabelNotesParam() as labelnotes\" [innerHTML]=\"labelnotes.value\"></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n </div>\n </div>\n </div>\n <div class=\"checkout-btn-unique text-end\">\n <button (click)=\"selectAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\">\n {{(isLastOne ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}\n </button>\n </div>\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n</ng-template>\n\n\n<ng-template #requireLoginView>\n <div id=\"loginCheckout\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\" *ngIf=\"require_login\">\n <div class=\"col-12\">\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\n </app-login-form-ec>\n </div>\n </div>\n </div>\n</ng-template>\n\n\n\n<ng-template #datosFormFacturacion>\n <div class=\"container-fluid px-0 px-md-2\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card \">\n <div class=\"card-header text-dark text-center\">\n <h3>{{'billing-data'|translate}}</h3>\n </div>\n <div class=\"card-body\">\n <form (submit)=\"verifyValidate()\">\n <div class=\"row mt-df\">\n <!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutFormFacturacion.controls['firstName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.firstName.touched && checkoutFormFacturacion.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.firstName.touched && checkoutFormFacturacion.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutFormFacturacion.controls['lastName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.lastName.touched && checkoutFormFacturacion.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.lastName.touched && checkoutFormFacturacion.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\"\n name=\"phoneNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['phoneNumber']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.phoneNumber.touched && checkoutFormFacturacion.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.phoneNumber.touched && checkoutFormFacturacion.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutFormFacturacion.controls['email']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.email.touched && checkoutFormFacturacion.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.email.touched && checkoutFormFacturacion.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 3-->\n\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(countriesFacturacion$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutFormFacturacion.controls['countryCode']\"\n (change)=\"onCountrySelectedFacturacion($event.target.value)\">\n <!-- <option selected [value]=\"null\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">\n {{ country.name }}</option>\n </select>\n <div *ngIf=\"checkoutFormFacturacion.controls.countryCode.touched && checkoutFormFacturacion.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(provincesFacturacion$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelectedFacturacion($event.target.value)\"\n [formControl]=\"checkoutFormFacturacion.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option> -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">\n {{ province.name }}\n </option>\n </select>\n <div *ngIf=\"checkoutFormFacturacion.controls.provinceCode.touched && checkoutFormFacturacion.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutFormFacturacion.controls['city']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.city.touched && checkoutFormFacturacion.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutFormFacturacion.controls['street']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.street.touched && checkoutFormFacturacion.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.street.touched && checkoutFormFacturacion.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.enabled\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n [formControl]=\"checkoutFormFacturacion.controls['postcode']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.postcode.touched && checkoutFormFacturacion.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.postcode.touched && checkoutFormFacturacion.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\">{{'postal-code-pattern-error'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 5-->\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n [formControl]=\"checkoutFormFacturacion.controls['documentType']\">\n <!-- <option [value]=\"''\" selected>{{'document-type'|translate}}</option> -->\n <option\n *ngFor=\"let item of documentTypes\"\n [value]=\"item.code\">{{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.documentType.touched && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\"\n [type]=\"(this.addressingService.typeForms == 'EUR' ? 'text' : 'number') \"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\" min=\"1\"\n max=\"99999999999\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.documentNumber.touched && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}} <span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelNotesHtml\">\n <div [innerHTML]=\"labelNotesHtml\"></div>\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span>\n </label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [formControl]=\"checkoutFormFacturacion.controls['notes']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n </div>\n </form>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n\n\n<ng-template #template>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modalRef.hide()\">\n </button>\n </div>\n </div>\n\n <div class=\"modal-body scrol-if\">\n <app-section-container-ec [name]=\"'terminos-y-condiciones'\"> </app-section-container-ec>\n </div>\n\n</ng-template>\n\n\n<ng-template #addressBookNotResult>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <h4> {{'address-book-not-result' | translate }} </h4>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #addressBookLoading>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n</ng-container>\n\n<ng-template #pleaseLogin>\n <div class=\"container\">\n <p>Por favor <a [routerLink]=\"['/auth/login']\" > Inicie Sesi\u00F3n</a></p>\n </div>\n</ng-template>",
373
+ template: "<ng-container *ngIf=\"this.channelConfig.channelType != 'b2b' || (this.channelConfig.channelType == 'b2b' && authService.isAuthenticated()); else pleaseLogin\">\n<ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null\">\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\" *ngIf=\"!getParamByChannelAndLanguage('btn_new_address_')\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\" *ngIf=\"getParamByChannelAndLanguage('btn_new_address_') as param\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ param.value}}\n </label>\n\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"getMode(); else addressSelection\">\n <div *ngIf=\"!require_login; else requireLoginView\">\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_LOAD_ADDRESS'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'billing-details'|translate}}</h3>\n </div>\n </ng-container>\n\n <form (submit)=\"verifyValidate(false,this.cartService.items)\">\n <div class=\"row mt-df\"><!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutForm.controls['firstName']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.firstName.touched && checkoutForm.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.firstName.touched && checkoutForm.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutForm.controls['lastName']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.lastName.touched && checkoutForm.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.lastName.touched && checkoutForm.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\"><!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\n [formControl]=\"checkoutForm.controls['phoneNumber']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.phoneNumber.touched && checkoutForm.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.phoneNumber.touched && checkoutForm.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutForm.controls['email']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.email.touched && checkoutForm.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.email.touched && checkoutForm.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 3-->\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(countries$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutForm.controls['countryCode']\"\n (change)=\"onCountrySelected($event.target.value)\">\n <!-- <option selected [value]=\"countries[0].code\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">{{ country.name }}</option>\n </select>\n <div *ngIf=\"checkoutForm.controls.countryCode.touched && checkoutForm.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(provinces$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['provinceCode']\">\n<!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option>\n --> <option *ngFor=\"let province of provinces\" [value]=\"province.code\">{{ province.name }}\n </option>\n </select>\n <div *ngIf=\"checkoutForm.controls.provinceCode.touched && checkoutForm.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutForm.controls['city']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.city.touched && checkoutForm.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutForm.controls['street']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.street.touched && checkoutForm.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.street.touched && checkoutForm.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n\n <!-- form direcci\u00F3n -->\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.enabled\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n [formControl]=\"checkoutForm.controls['postcode']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.postcode.touched && checkoutForm.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.postcode.touched && checkoutForm.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\"> {{postalCodeErrorMessage | translate}} </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 5-->\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n (change)=\"onDocumentTypesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['documentType']\">\n<!-- <option [value]=\"''\" selected>{{'document-type'|translate}}</option>\n --> <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">{{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.documentType.touched && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\"\n [type]=\"'text'\" name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\" min=\"1\" max=\"99999999999\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.documentNumber.touched && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 6-->\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}} <span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\" [innerHTML]=\"labelnotes.value\"><span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [formControl]=\"checkoutForm.controls['notes']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n </div>\n </div>\n <div class=\"row mt-df\"><!--Fila 7-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFact\"></label>\n </div>\n </div>\n <div class=\"row mt-df\">\n <div class=\"col-12\">\n <p>\n <!-- <span class=\"required\"></span> -->\n <label class=\"required text-underline\">* {{ 'required-fields' | translate }}</label>\n </p>\n </div>\n </div>\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.enabled\">\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.required\"\n class=\"required\">*</span>\n <label class=\"\" for=\"\"> {{ 'accept-terms' | translate }} <input class=\"ms-2\" name=\"terms\"\n [formControl]=\"checkoutForm.controls['terms']\" type=\"checkbox\" required\n (change)=\"onInputChange()\" /> </label><br />\n <a (click)=\"openModal(template)\" role=\"button\" class=\"ms-3 nota-input text-dark\">{{ 'whats-this' |\n translate }}</a>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutForm.controls.terms.touched && !checkoutForm.controls.terms.value\">\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\n </div>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"viewDataFacturacion ; else datosFormFacturacion\"> </div>\n <div class=\"checkout-btn-unique text-end\">\n <button type=\"submit\" [disabled]=\"!validado\" class=\"btn valid-btn mt-2\">\n {{(isLastOne ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}</button>\n\n\n </div>\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </form>\n </div>\n</ng-container>\n\n<ng-template #addressSelection>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_ADDRESS_SELECTION'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'address-selection'|translate}}</h3>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"this.addressBook; else addressBookNotResult\">\n\n <ng-container *ngIf=\"this.addressBook?.length ;else addressBookLoading\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\" [id]=\"i\"\n [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\" (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n <div class=\"row px-3\">\n <div class=\"card p-2 bg-light w-100\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'first-name'|translate}}</strong>\n {{item.addressContact.firstName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'last-name'|translate}}</strong> {{item.addressContact.lastName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-type'|translate}}</strong>\n {{getDocumentType(item.addressContact.documentType)}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-number'|translate}}</strong>\n {{item.addressContact.documentNumber}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'email-address'|translate}}</strong> {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <div class=\"w-100\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}</label>\n <label class=\"field-label\"\n *ngIf=\"getLabelNotesParam() as labelnotes\" [innerHTML]=\"labelnotes.value\"></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n </div>\n </div>\n </div>\n <div class=\"checkout-btn-unique text-end\">\n <button (click)=\"selectAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\">\n {{(isLastOne ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}\n </button>\n </div>\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n</ng-template>\n\n\n<ng-template #requireLoginView>\n <div id=\"loginCheckout\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\" *ngIf=\"require_login\">\n <div class=\"col-12\">\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\n </app-login-form-ec>\n </div>\n </div>\n </div>\n</ng-template>\n\n\n\n<ng-template #datosFormFacturacion>\n <div class=\"container-fluid px-0 px-md-2\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card \">\n <div class=\"card-header text-dark text-center\">\n <h3>{{'billing-data'|translate}}</h3>\n </div>\n <div class=\"card-body\">\n <form (submit)=\"verifyValidate()\">\n <div class=\"row mt-df\">\n <!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutFormFacturacion.controls['firstName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.firstName.touched && checkoutFormFacturacion.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.firstName.touched && checkoutFormFacturacion.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutFormFacturacion.controls['lastName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.lastName.touched && checkoutFormFacturacion.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.lastName.touched && checkoutFormFacturacion.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\"\n name=\"phoneNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['phoneNumber']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.phoneNumber.touched && checkoutFormFacturacion.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.phoneNumber.touched && checkoutFormFacturacion.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutFormFacturacion.controls['email']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.email.touched && checkoutFormFacturacion.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.email.touched && checkoutFormFacturacion.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 3-->\n\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(countriesFacturacion$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutFormFacturacion.controls['countryCode']\"\n (change)=\"onCountrySelectedFacturacion($event.target.value)\">\n <!-- <option selected [value]=\"null\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">\n {{ country.name }}</option>\n </select>\n <div *ngIf=\"checkoutFormFacturacion.controls.countryCode.touched && checkoutFormFacturacion.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(provincesFacturacion$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelectedFacturacion($event.target.value)\"\n [formControl]=\"checkoutFormFacturacion.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option> -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">\n {{ province.name }}\n </option>\n </select>\n <div *ngIf=\"checkoutFormFacturacion.controls.provinceCode.touched && checkoutFormFacturacion.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutFormFacturacion.controls['city']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.city.touched && checkoutFormFacturacion.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutFormFacturacion.controls['street']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.street.touched && checkoutFormFacturacion.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.street.touched && checkoutFormFacturacion.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.enabled\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n [formControl]=\"checkoutFormFacturacion.controls['postcode']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.postcode.touched && checkoutFormFacturacion.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.postcode.touched && checkoutFormFacturacion.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\">{{postalCodeErrorMessage |translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 5-->\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n [formControl]=\"checkoutFormFacturacion.controls['documentType']\">\n <!-- <option [value]=\"''\" selected>{{'document-type'|translate}}</option> -->\n <option\n *ngFor=\"let item of documentTypes\"\n [value]=\"item.code\">{{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.documentType.touched && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\"\n [type]=\"(this.addressingService.typeForms == 'EUR' ? 'text' : 'number') \"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\" min=\"1\"\n max=\"99999999999\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"checkoutFormFacturacion.controls.documentNumber.touched && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}} <span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelNotesHtml\">\n <div [innerHTML]=\"labelNotesHtml\"></div>\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span>\n </label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [formControl]=\"checkoutFormFacturacion.controls['notes']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n </div>\n </form>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n\n\n<ng-template #template>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modalRef.hide()\">\n </button>\n </div>\n </div>\n\n <div class=\"modal-body scrol-if\">\n <app-section-container-ec [name]=\"'terminos-y-condiciones'\"> </app-section-container-ec>\n </div>\n\n</ng-template>\n\n\n<ng-template #addressBookNotResult>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <h4> {{'address-book-not-result' | translate }} </h4>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #addressBookLoading>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n</ng-container>\n\n<ng-template #pleaseLogin>\n <div class=\"container\">\n <p>Por favor <a [routerLink]=\"['/auth/login']\" > Inicie Sesi\u00F3n</a></p>\n </div>\n</ng-template>",
373
374
  providers: [BsModalService],
374
375
  styles: [".mt-df{margin:10px auto 0}.btn.btn-outline-secondary.active,.btn.btn-outline-secondary:hover{color:#fff!important}.required{color:red}.field-label{color:#000}.btn.valid-btn{background-color:#000;color:#fff;margin-right:-3px;margin-bottom:10px}label{color:#000}.input-size-lg{width:1.8rem;height:1.8rem}"]
375
376
  })
376
377
  ], DataFormEcComponent);
377
378
  export { DataFormEcComponent };
378
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBd0IsS0FBSyxFQUFrQyxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQVFoRixJQUFhLG1CQUFtQixHQUFoQyxNQUFhLG1CQUFvQixTQUFRLGVBQWU7SUF1Q3BELFlBQW1CLFdBQXdCLEVBQ2hDLEVBQWUsRUFDZixLQUFtQixFQUNuQixpQkFBb0MsRUFDcEMs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QUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDcEUsQ0FBQztJQXFERCxNQUFNLENBQUMsQ0FBQztRQUNKLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQztDQWFKLENBQUE7O1lBNVVtQyxXQUFXO1lBQzVCLFdBQVc7WUFDUixZQUFZO1lBQ0EsaUJBQWlCO1lBQ3ZCLFdBQVc7WUFDVCxjQUFjO1lBQ2QsaUJBQWlCO1lBQ3hCLFNBQVM7WUFDRixvQkFBb0I7O0FBN0NyQztJQUFSLEtBQUssRUFBRTtvREFBUztBQUNSO0lBQVIsS0FBSyxFQUFFO3NEQUE0QjtBQUMzQjtJQUFSLEtBQUssRUFBRTtxREFBb0I7QUFKbkIsbUJBQW1CO0lBTi9CLFNBQVMsQ0FBQztRQUNQLFFBQVEsRUFBRSxpQkFBaUI7UUFDM0IsNjZnREFBeUM7UUFFekMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDOztLQUM5QixDQUFDO0dBQ1csbUJBQW1CLENBbVgvQjtTQW5YWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWRkcmVzc2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGVja291dC9hZGRyZXNzaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwvYnMtbW9kYWwtcmVmLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFyYW1ldGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5uZWxDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWRhdGFmb3JtLWVjJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2RhdGFmb3JtLWVjLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnZGF0YWZvcm0tZWMuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtCc01vZGFsU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUZvcm1FY0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEhlbHBlciBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBASW5wdXQoKSBzdGVwX2lkO1xuICAgIEBJbnB1dCgpIGlzTGFzdE9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIG5leHRTdGVwOiBGdW5jdGlvbjtcblxuICAgIHByb3RlY3RlZCBjb3VudHJpZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBwcm92aW5jZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBkb2N1bWVudFR5cGVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBwcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIGRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG5cbiAgICBwdWJsaWMgY291bnRyaWVzJCA9IHRoaXMuY291bnRyaWVzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgcHJvdmluY2VzJCA9IHRoaXMucHJvdmluY2VzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgZG9jdW1lbnRUeXBlcyQgPSB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBjb3VudHJpZXNGYWN0dXJhY2lvbiQgPSB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgcHJvdmluY2VzRmFjdHVyYWNpb24kID0gdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZXNGYWN0dXJhY2lvbiQgPSB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwdWJsaWMgcmVxdWlyZV9sb2dpbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjaGVja291dEZvcm06IEZvcm1Hcm91cDtcbiAgICBwdWJsaWMgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb246IEZvcm1Hcm91cDtcbiAgICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBmb3JtX3JlYWR5ID0gZmFsc2U7XG4gICAgcHVibGljIGFsbHJlYWR5X2RhdGEgPSBmYWxzZTtcbiAgICBwdWJsaWMgYWRkcmVzc0Jvb2sgPSBbXTtcbiAgICBwdWJsaWMgYWRkcmVzc0Jvb2tTZWxlY3RlZCA9IHsgaWQ6IDAsIG5vdGVzOiBcIlwiIH1cbiAgICBwdWJsaWMgZmluaXNoOiBib29sZWFuID0gZmFsc2U7IC8vRXN0YSB2YXJpYWJsZSBzZSB1c2EgcGFyYSBtb3N0cmFyIGVsIGJvdG9uIGRlIGZpbmFsaXphci5cblxuICAgIHB1YmxpYyB2YWxpZGFkbyA9IGZhbHNlO1xuICAgIHB1YmxpYyB2aWV3RGF0YUZhY3R1cmFjaW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBtb2RhbFJlZjogQnNNb2RhbFJlZiB8IG51bGw7XG4gICAgcHVibGljIHBhcmFtczogYW55ID0ge307XG4gICAgcHVibGljIHNlbGVjdEFkZHJlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBwb3N0YWxDb2RlUGF0dGVybiA9ICdeW0EtWl0/WzAtOV17NH1bQS1aXXswLDN9JCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwdWJsaWMgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgICAgICAgcHVibGljIGFkZHJlc3NpbmdTZXJ2aWNlOiBBZGRyZXNzaW5nU2VydmljZSxcbiAgICAgICAgcHVibGljIGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgcGFyYW1zU2VydmljZTogUGFyYW1ldGVyc1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjb25zdHM6IENvbnN0YW50cyxcbiAgICAgICAgcHVibGljIGNoYW5uZWxDb25maWc6IENoYW5uZWxDb25maWdTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZWNPbkNvbnN0cnVjdCgpXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAuLi50aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCkuY29uZmlnRm9ybS5mb3JtQWRkcmVzLFxuICAgICAgICAgICAgcG9zdGNvZGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSAvLyBTZSBhZ3JlZ2EgcGFyYSBxdWUgc8OzbG8gYWNlcHRlIGPDs2RpZ29zIHBvc3RhbGVzIG1heW9yZXMgcXVlIGNlcm9cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLnN0YXR1c0NoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7IHRoaXMub25Gb3JtQ2hhbmdlKCk7IHJldHVybiB0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCB9KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkZvcm1WYWxpZCgpKTtcblxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAuLi50aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCkuY29uZmlnRm9ybS5mb3JtQmlsbGluZyxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0gLy8gU2UgYWdyZWdhIHBhcmEgcXVlIHPDs2xvIGFjZXB0ZSBjw7NkaWdvcyBwb3N0YWxlcyBtYXlvcmVzIHF1ZSBjZXJvXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnN0YXR1c0NoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7IHRoaXMub25Gb3JtQ2hhbmdlKCk7IHJldHVybiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkIH0pKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRm9ybVZhbGlkKCkpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnBhcmFtc1NlcnZpY2UucGFyYW1ldGVycy5zdWJzY3JpYmUocmVzID0+IHRoaXMucGFyYW1zID0gcmVzKTtcbiAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5pbml0aWFsaXplKHRoaXMuc3RlcF9pZCk7XG4gICAgICAgIGNvbnN0IGxvY2FsRW1haWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWFpbCcpXG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgJiYgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUodGhpcy5hdXRoU2VydmljZS5nZXRDdXN0b21lcigpPy5lbWFpbCB8fCBsb2NhbEVtYWlsKTtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXQoJ2VtYWlsJykuZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldEFkZHJlc3NpbmdEYXRhKCkudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgbGV0IGNvdW50cmllcyA9IHRoaXMuZmlsdGVyQ291bnRyeUJ5Q29kZShyZXMpXG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QubmV4dChjb3VudHJpZXMpO1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChjb3VudHJpZXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcyA9PT0gJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJyB8fFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcyA9PT0gJ09OTFlfQUREUkVTU19TRUxFQ1RJT04nKSB7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0QWRkcmVzc0Jvb2soKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9vayA9IHJlcyB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZHJlc3NCb29rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQWRkcmVzcyA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRBZGRyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShzZWxlY3RlZEFkZHJlc3MuY291bnRyeUNvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZEFkZHJlc3MuY291bnRyeUNvZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdjYXJnYScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb3VudHJpZXMkLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHJlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24ocmVzWzBdLmNvZGUpO1xuXG4gICAgICAgICAgICAgICAgLy8gUHJvdmluY2lhXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICByZXNbMF0/LnByb3ZpbmNlc1swXS5jb2RlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvdmluY2VzU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxuXG4gICAgICAgICAgICAgICAgLy8gRG9jdW1lbnRvXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QubmV4dChyZXNbMF0/LmRvY3VtZW50VHlwZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5lY09uSW5pdCgpXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBmaWx0cmEgbG9zIHBhaXNlcyBkZSBhY3VlcmRvIGFsIGEgbG9zIGNvZGlnb3MgcmV0b3JuYWRvcyBlbiBsYSBmdW5jaW9uIGdldENvdW50cmllcy5cbiAgICAgKiBDYXNvcyBkZSB1c29zOiBTaSBnZXRDb3VudHJpZXMgZXMgdmFjaW8sIHJldG9ybmEgZWwgYXJyZWdsbyBxdWUgaW5ncmVzYSBwb3IgcGFyYW1ldHJvLlxuICAgICAqIFNpIGdldENvdW50cmllcyBjb250aWVuZSB2YWxvcmVzIHF1ZSBubyBjb2luY2lkZW4sIHJldG9ybmEgZWwgYXJyZWdsbyBxdWUgaW5ncmVzYSBwb3IgcGFyYW1ldHJvLlxuICAgICAqIERlIGxvIGNvbnRyYXJpbyByZXRvcm5hIGxvcyB2YWxvcmVzIGZpbHRyYWRvcy5cbiAgICAgKiBAcGFyYW0gY291bnRyaWVzIEFycmVnbG8gcXVlIGNvbnRpZW5lIGxvcyBjb3VudHJpZXMgcmVjaWJpZG9zIGVuIGxhIHN1YnNjcmlwY2lvbiBkZWwgb2JzZXJ2YWJsZS5cbiAgICAgKiBAcmV0dXJucyB1biBhcnJlZ2xvIGRlIGNvdW50cmllcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbHRlckNvdW50cnlCeUNvZGUgPSAoY291bnRyaWVzOiBhbnlbXSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb25zdHMuZ2V0Q291bnRyaWVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGNvdW50cmllc0ZpbHRlcmVkID0gY291bnRyaWVzLmZpbHRlcihlbGVtID0+IHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmluY2x1ZGVzKGVsZW0uY29kZSkpXG4gICAgICAgICAgICBpZiAoY291bnRyaWVzRmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHJpZXNGaWx0ZXJlZFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFbC9sb3MgY29kaWdvL3MgaW5ncmVzYWRvL3Mgbm8gY29pbmNpZGVuIGNvbiBsb3MgcHJvdmlzdG9zIGRlc2RlIGVsIGJhY2tlbmQnKVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHJpZXNcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvdW50cmllc1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd0Zvcm1GYWN0dXJhY2lvbiA9ICgpID0+IHtcbiAgICAgICAgdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uID0gIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbikge1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvbiQuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHJlc1swXS5jb2RlKVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3ZpbmNpYVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1swXT8ucHJvdmluY2VzWzBdLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvY3VtZW50b1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocmVzWzBdPy5kb2N1bWVudFR5cGVzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkZvcm1DaGFuZ2UoKVxuICAgICAgICByZXR1cm4gdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXG4gICAgfVxuXG4gICAgb25Gb3JtVmFsaWQgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRm9ybUNoYW5nZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGFkbyA9IHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gJiYgdGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYWRvID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWRhZG8gPSBmYWxzZVxuICAgIH1cblxuICAgIG9uSW5wdXRDaGFuZ2UgPSAoKSA9PiB0aGlzLmZvcm1fcmVhZHkgPSBmYWxzZTtcblxuICAgIG9uQ291bnRyeVNlbGVjdGVkID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKCcnKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oc2VsZWN0ZWRDb3VudHJ5LmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9Qcm92aW5jZXNcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHZhbHVlICYmIHZhbHVlICE9ICdudWxsJyA/XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSkucHJvdmluY2VzXG4gICAgICAgICAgICA6XG4gICAgICAgICAgICBbXVxuICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChwcm92aW5jZXMpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUocHJvdmluY2VzWzBdLmNvZGUpXG5cbiAgICAgICAgLy9Eb2N1bWVudCB0eXBlc1xuICAgICAgICBsZXQgZG9jdW1lbnRUeXBlcyA9IHZhbHVlICYmIHZhbHVlICE9ICdudWxsJyA/XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSkuZG9jdW1lbnRUeXBlc1xuICAgICAgICAgICAgOlxuICAgICAgICAgICAgW11cbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5uZXh0KGRvY3VtZW50VHlwZXMpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoZG9jdW1lbnRUeXBlc1swXS5jb2RlKVxuXG4gICAgfVxuXG4gICAgb25Db3VudHJ5U2VsZWN0ZWRGYWN0dXJhY2lvbiA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSgnJyk7XG5cbiAgICAgICAgLy9Qcm92aW5jZXNcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHZhbHVlICYmIHZhbHVlICE9ICdudWxsJyA/XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdC52YWx1ZS5maW5kKGNvdW50cnkgPT4gY291bnRyeS5jb2RlID09IHZhbHVlKS5wcm92aW5jZXNcbiAgICAgICAgICAgIDpcbiAgICAgICAgICAgIFtdXG4gICAgICAgIHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocHJvdmluY2VzKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUocHJvdmluY2VzWzBdLmNvZGUpXG5cbiAgICAgICAgLy9Eb2N1bWVudCB0eXBlc1xuICAgICAgICBsZXQgZG9jdW1lbnRUeXBlcyA9IHZhbHVlICYmIHZhbHVlICE9ICdudWxsJyA/XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdC52YWx1ZS5maW5kKGNvdW50cnkgPT4gY291bnRyeS5jb2RlID09IHZhbHVlKS5kb2N1bWVudFR5cGVzXG4gICAgICAgICAgICA6XG4gICAgICAgICAgICBbXVxuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChkb2N1bWVudFR5cGVzKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoZG9jdW1lbnRUeXBlc1swXS5jb2RlKVxuICAgIH1cblxuICAgIG9uUHJvdmluY2VzU2VsZWN0ZWQgPSAodmFsdWUpID0+IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnbnVsbCcgPyBudWxsIDogdmFsdWUpO1xuXG4gICAgb25Qcm92aW5jZXNTZWxlY3RlZEZhY3R1cmFjaW9uID0gKHZhbHVlKSA9PiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnbnVsbCcgPyBudWxsIDogdmFsdWUpO1xuXG4gICAgb25Eb2N1bWVudFR5cGVzU2VsZWN0ZWQgPSAodmFsdWUpID0+IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnJyA/ICcnIDogdmFsdWUpO1xuXG4gICAgb25Eb2N1bWVudFR5cGVzU2VsZWN0ZWRGYWN0dXJhY2lvbiA9ICh2YWx1ZSkgPT4gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHZhbHVlID09ICcnID8gJycgOiB2YWx1ZSk7XG5cbiAgICB2ZXJpZnlWYWxpZGF0ZSA9IGFzeW5jIChlLCBpdGVtcykgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiVmVyaWZ5aW5nOiBcIiwgZSlcbiAgICAgICAgdGhpcy5yZXF1aXJlX2xvZ2luID0gZmFsc2U7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS5zZXRWYWx1ZShlKTtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgJiYgdGhpcy5jaGVja291dEZvcm0uZ2V0KCdlbWFpbCcpLmRpc2FibGUoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcblxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xuICAgICAgICAgICAgLy8gaWYgKHRoaXMuY2FydFNlcnZpY2UuY2hhbm5lbENvbmZpZy5hcHBseU9yZGVyTG90KXtcbiAgICAgICAgICAgIC8vICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gICAgICAgaWYgKCFpdGVtLmxvdFswXSl7XG4gICAgICAgICAgICAvLyAgICAgIC8vICAgIGNvbnNvbGUubG9nKHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjaXR5J11bJ3ZhbHVlJ10pXG4gICAgICAgICAgICAvLyAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvTG90KGl0ZW0ucHJvZHVjdCwwLGl0ZW0udmFyaWFudF9pZCwwLGl0ZW0uaXRlbV9pZCxpdGVtLnF1YW50aXR5LGl0ZW0ucHJvZHVjdC5wcmljZSxpdGVtLnF1YW50aXR5LGl0ZW0uZGlzY291bnQsaXRlbS5wcm9kdWN0LnByaWNlKml0ZW0ucXVhbnRpdHksJ25ldycsJycsJycsMCx0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY2l0eSddWyd2YWx1ZSddKyAnIC0gJyArIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydzdHJlZXQnXVsndmFsdWUnXSwgJ25ld2xvdCcpO1xuICAgICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgICAgLy8gICB9KTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc3VsdCgpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKCdpbnZhbGlkLWZvcm0nKTtcbiAgICB9XG5cbiAgICBzaG93RXJyb3IgPSAoZXJyb3JfbWVzc2FnZSkgPT4geyB0aGlzLnRvYXN0LnNob3coZXJyb3JfbWVzc2FnZSk7IHJldHVybiB0cnVlOyB9XG5cbiAgICBwcm90ZWN0ZWQgZW1pdFJlc3VsdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRhdGE6IGFueSA9IHsgc2hpcHBpbmdBZGRyZXNzOiB7IC4uLnRoaXMuY2hlY2tvdXRGb3JtLmdldFJhd1ZhbHVlKCksIHBob25lTnVtYmVyOiB0aGlzLmNoZWNrb3V0Rm9ybS52YWx1ZS5waG9uZU51bWJlci50b1N0cmluZygpIH0sIG5vdGVzOiAodGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKSkubm90ZXMgfTtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gJiYgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWxpZCkgZGF0YSA9IHsgLi4uZGF0YSwgbm90ZXM6IGRhdGEubm90ZXMsIGJpbGxpbmdBZGRyZXNzOiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmdldFJhd1ZhbHVlKCkgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLnNldEFkZHJlc3MoZGF0YSk7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlX2xvZ2luID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ0VsIGVtYWlsIHlhIGVzdMOhIHJlZ2lzdHJhZG8sIGluaWNpZSBzZXNpw7NuLicpXG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPT0gZmFsc2UgJiYgcmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1fcmVhZHkgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxyZWFkeV9kYXRhID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKSB9XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9wZW5Nb2RhbCh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgICAgICB0aGlzLm1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyh0ZW1wbGF0ZSwgeyBjbGFzczogJ21vZGFsLWxnICcsIGtleWJvYXJkOiBmYWxzZSwgYmFja2Ryb3A6ICdzdGF0aWMnIH0pO1xuICAgIH1cblxuICAgIHNldFNlbGVjdEFkZHJlc3MgPSAoYWRkcmVzc1NlbGVjdDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYWRkcmVzc0Jvb2subWFwKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZCA9IGFkZHJlc3MuaWQgPT09IGFkZHJlc3NTZWxlY3QuaWQpXG4gICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpLmlkIHx8IDBcbiAgICB9XG5cbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihjb3VudHJ5Q29kZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBvc3RhbENvZGVQYXR0ZXJuID0gdGhpcy5jb25zdHMuZ2V0UG9zdGFsQ29kZVBhdHRlcm4oY291bnRyeUNvZGUpIHx8ICcuKic7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwb3N0Y29kZSddLnNldFZhbGlkYXRvcnMoW1xuICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgICAgIFZhbGlkYXRvcnMucGF0dGVybihwb3N0YWxDb2RlUGF0dGVybilcbiAgICAgICAgXSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwb3N0Y29kZSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RBZGRyZXNzID0gYXN5bmMgKGl0ZW1zKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIGxldCBhZGRyZXNzU2VsZWN0ZWQgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKVxuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IGFkZHJlc3NTZWxlY3RlZC5pZCB8fCAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzczogYWRkcmVzc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdFNlZGUgPSBhd2FpdCB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLnNldEhlYWRxdWFydGVyKHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRTZWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ubG90WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkVG9Mb3QoaXRlbS5wcm9kdWN0LCAwLCBpdGVtLnZhcmlhbnRfaWQsIDAsIGl0ZW0uaXRlbV9pZCwgaXRlbS5xdWFudGl0eSwgaXRlbS5wcm9kdWN0LnByaWNlLCBpdGVtLnF1YW50aXR5LCBpdGVtLmRpc2NvdW50LCBpdGVtLnByb2R1Y3QucHJpY2UgKiBpdGVtLnF1YW50aXR5LCAnbmV3JywgJycsICcnLCAwLCByZXN1bHRTZWRlLnNoaXBwaW5nQWRkcmVzcy5jaXR5ICsgJyAtICcgKyByZXN1bHRTZWRlLnNoaXBwaW5nQWRkcmVzcy5zdHJlZXQsICduZXdsb3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1fcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKCdpbnZhbGlkLWZvcm0nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGdldE1vZGUgPSAoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcykge1xuICAgICAgICAgICAgY2FzZSAnT05MWV9MT0FEX0FERFJFU1MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICBjYXNlICdPTkxZX0FERFJFU1NfU0VMRUNUSU9OJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIGNhc2UgJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBZGRyZXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcnVlYmEoeCkge1xuICAgICAgICBjb25zb2xlLmxvZyh4KTtcbiAgICB9XG5cbiAgICBzZXRNb2RlID0gKG1vZGUpID0+IHRoaXMuc2VsZWN0QWRkcmVzID0gbW9kZSA9PSBcImNhcmdhXCJcblxuICAgIGdldENvdW50cnkgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5jb3VudHJpZXNMaXN0LmZpbmQocGFpc2VzID0+IHBhaXNlcy5jb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoY29kZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk/Lm5hbWUgfHwgXCJcIlxuXG4gICAgZ2V0UHJvdmluY2UgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5wcm92aW5jZUxpc3QuZmluZChjdCA9PiBjdC5jb2RlID09IGNvZGUpPy5uYW1lIHx8IFwiXCJcblxuICAgIGdldERvY3VtZW50VHlwZSA9IChjb2RlKSA9PiB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmRvY3VtZW50VHlwZXMuZmluZChkdCA9PiBkdC5jb2RlID09IGNvZGUpPy5uYW1lIHx8IFwiXCJcblxuICAgIGdldExhYmVsTm90ZXNQYXJhbSA9ICgpID0+IHRoaXMuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCAnbGFiZWxfbm90ZXNfJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICdfJyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF0pXG5cbiAgICBnZXRQYXJhbUJ5Q2hhbm5lbEFuZExhbmd1YWdlID0gKG5hbWVQYXJhbSkgPT4gdGhpcy5oYXNQYXJhbXModGhpcy5wYXJhbXMsIG5hbWVQYXJhbSArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICdfJyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF0pXG59XG4iXX0=
379
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBd0IsS0FBSyxFQUFrQyxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQVFoRixJQUFhLG1CQUFtQixHQUFoQyxNQUFhLG1CQUFvQixTQUFRLGVBQWU7SUF1Q3BELFlBQW1CLFdBQXdCLEVBQ2hDLEVBQWUsRUFDZixLQUFtQixFQUNuQixpQkFBb0MsRUFDcEMs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QVUsQ0FBQyxDQUFDLGFBQWEsQ0FBQztZQUNqRCxVQUFVLENBQUMsUUFBUTtZQUNuQixVQUFVLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztTQUMvQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFxREQsTUFBTSxDQUFDLENBQUM7UUFDSixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUM7Q0FhSixDQUFBOztZQTlVbUMsV0FBVztZQUM1QixXQUFXO1lBQ1IsWUFBWTtZQUNBLGlCQUFpQjtZQUN2QixXQUFXO1lBQ1QsY0FBYztZQUNkLGlCQUFpQjtZQUN4QixTQUFTO1lBQ0Ysb0JBQW9COztBQTdDckM7SUFBUixLQUFLLEVBQUU7b0RBQVM7QUFDUjtJQUFSLEtBQUssRUFBRTtzREFBNEI7QUFDM0I7SUFBUixLQUFLLEVBQUU7cURBQW9CO0FBSm5CLG1CQUFtQjtJQU4vQixTQUFTLENBQUM7UUFDUCxRQUFRLEVBQUUsaUJBQWlCO1FBQzNCLG82Z0RBQXlDO1FBRXpDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQzs7S0FDOUIsQ0FBQztHQUNXLG1CQUFtQixDQXFYL0I7U0FyWFksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9jb21wb25lbnQtaGVscGVyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcbmltcG9ydCB7IEFkZHJlc3NpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2hlY2tvdXQvYWRkcmVzc2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsL2JzLW1vZGFsLXJlZi5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uLy4uL2NvcmUuY29uc3RzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BhcmFtZXRlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBDaGFubmVsQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1kYXRhZm9ybS1lYycsXG4gICAgdGVtcGxhdGVVcmw6ICdkYXRhZm9ybS1lYy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ2RhdGFmb3JtLWVjLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbQnNNb2RhbFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIERhdGFGb3JtRWNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRIZWxwZXIgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQElucHV0KCkgc3RlcF9pZDtcbiAgICBASW5wdXQoKSBpc0xhc3RPbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBuZXh0U3RlcDogRnVuY3Rpb247XG5cbiAgICBwcm90ZWN0ZWQgY291bnRyaWVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgZG9jdW1lbnRUeXBlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIGNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBkb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuXG4gICAgcHVibGljIGNvdW50cmllcyQgPSB0aGlzLmNvdW50cmllc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb3ZpbmNlcyQgPSB0aGlzLnByb3ZpbmNlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZXMkID0gdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgY291bnRyaWVzRmFjdHVyYWNpb24kID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb3ZpbmNlc0ZhY3R1cmFjaW9uJCA9IHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVzRmFjdHVyYWNpb24kID0gdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHVibGljIHJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY2hlY2tvdXRGb3JtOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgZm9ybV9yZWFkeSA9IGZhbHNlO1xuICAgIHB1YmxpYyBhbGxyZWFkeV9kYXRhID0gZmFsc2U7XG4gICAgcHVibGljIGFkZHJlc3NCb29rID0gW107XG4gICAgcHVibGljIGFkZHJlc3NCb29rU2VsZWN0ZWQgPSB7IGlkOiAwLCBub3RlczogXCJcIiB9XG4gICAgcHVibGljIGZpbmlzaDogYm9vbGVhbiA9IGZhbHNlOyAvL0VzdGEgdmFyaWFibGUgc2UgdXNhIHBhcmEgbW9zdHJhciBlbCBib3RvbiBkZSBmaW5hbGl6YXIuXG5cbiAgICBwdWJsaWMgdmFsaWRhZG8gPSBmYWxzZTtcbiAgICBwdWJsaWMgdmlld0RhdGFGYWN0dXJhY2lvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBwdWJsaWMgbW9kYWxSZWY6IEJzTW9kYWxSZWYgfCBudWxsO1xuICAgIHB1YmxpYyBwYXJhbXM6IGFueSA9IHt9O1xuICAgIHB1YmxpYyBzZWxlY3RBZGRyZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBwb3N0YWxDb2RlRXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICAgICAgcHVibGljIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgcHVibGljIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBhZGRyZXNzaW5nU2VydmljZTogQWRkcmVzc2luZ1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICAgICAgcHVibGljIHBhcmFtc1NlcnZpY2U6IFBhcmFtZXRlcnNTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY29uc3RzOiBDb25zdGFudHMsXG4gICAgICAgIHB1YmxpYyBjaGFubmVsQ29uZmlnOiBDaGFubmVsQ29uZmlnU2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgLi4udGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLmNvbmZpZ0Zvcm0uZm9ybUFkZHJlcyxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0gLy8gU2UgYWdyZWdhIHBhcmEgcXVlIHPDs2xvIGFjZXB0ZSBjw7NkaWdvcyBwb3N0YWxlcyBtYXlvcmVzIHF1ZSBjZXJvXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5zdGF0dXNDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4geyB0aGlzLm9uRm9ybUNoYW5nZSgpOyByZXR1cm4gdGhpcy5jaGVja291dEZvcm0udmFsaWQgfSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtVmFsaWQoKSk7XG5cbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbiA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgLi4udGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLmNvbmZpZ0Zvcm0uZm9ybUJpbGxpbmcsXG4gICAgICAgICAgICBwb3N0Y29kZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dIC8vIFNlIGFncmVnYSBwYXJhIHF1ZSBzw7NsbyBhY2VwdGUgY8OzZGlnb3MgcG9zdGFsZXMgbWF5b3JlcyBxdWUgY2Vyb1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5zdGF0dXNDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4geyB0aGlzLm9uRm9ybUNoYW5nZSgpOyByZXR1cm4gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWxpZCB9KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkZvcm1WYWxpZCgpKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5wYXJhbXNTZXJ2aWNlLnBhcmFtZXRlcnMuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLnBhcmFtcyA9IHJlcyk7XG4gICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnN0ZXBfaWQpO1xuICAgICAgICBjb25zdCBsb2NhbEVtYWlsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21haWwnKVxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLnNldFZhbHVlKHRoaXMuYXV0aFNlcnZpY2UuZ2V0Q3VzdG9tZXIoKT8uZW1haWwgfHwgbG9jYWxFbWFpbCk7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgJiYgdGhpcy5jaGVja291dEZvcm0uZ2V0KCdlbWFpbCcpLmRpc2FibGUoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRBZGRyZXNzaW5nRGF0YSgpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgIGxldCBjb3VudHJpZXMgPSB0aGlzLmZpbHRlckNvdW50cnlCeUNvZGUocmVzKVxuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNTdWJqZWN0Lm5leHQoY291bnRyaWVzKTtcbiAgICAgICAgICAgIHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQoY291bnRyaWVzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MgPT09ICdMT0FEX0FERFJFU1NfQU5EX1NFTEVDVElPTicgfHxcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MgPT09ICdPTkxZX0FERFJFU1NfU0VMRUNUSU9OJykge1xuXG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldEFkZHJlc3NCb29rKCkudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPSByZXMgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hZGRyZXNzQm9vaykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEFkZHJlc3MgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQWRkcmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUoc2VsZWN0ZWRBZGRyZXNzLmNvdW50cnlDb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oc2VsZWN0ZWRBZGRyZXNzLmNvdW50cnlDb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnY2FyZ2EnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY291bnRyaWVzJC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShyZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHJlc1swXS5jb2RlKTtcblxuICAgICAgICAgICAgICAgIC8vIFByb3ZpbmNpYVxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgcmVzWzBdPy5wcm92aW5jZXNbMF0uY29kZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChyZXNbMF0/LnByb3ZpbmNlcylcblxuICAgICAgICAgICAgICAgIC8vIERvY3VtZW50b1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQocmVzWzBdPy5kb2N1bWVudFR5cGVzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuZWNPbkluaXQoKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gZmlsdHJhIGxvcyBwYWlzZXMgZGUgYWN1ZXJkbyBhbCBhIGxvcyBjb2RpZ29zIHJldG9ybmFkb3MgZW4gbGEgZnVuY2lvbiBnZXRDb3VudHJpZXMuXG4gICAgICogQ2Fzb3MgZGUgdXNvczogU2kgZ2V0Q291bnRyaWVzIGVzIHZhY2lvLCByZXRvcm5hIGVsIGFycmVnbG8gcXVlIGluZ3Jlc2EgcG9yIHBhcmFtZXRyby5cbiAgICAgKiBTaSBnZXRDb3VudHJpZXMgY29udGllbmUgdmFsb3JlcyBxdWUgbm8gY29pbmNpZGVuLCByZXRvcm5hIGVsIGFycmVnbG8gcXVlIGluZ3Jlc2EgcG9yIHBhcmFtZXRyby5cbiAgICAgKiBEZSBsbyBjb250cmFyaW8gcmV0b3JuYSBsb3MgdmFsb3JlcyBmaWx0cmFkb3MuXG4gICAgICogQHBhcmFtIGNvdW50cmllcyBBcnJlZ2xvIHF1ZSBjb250aWVuZSBsb3MgY291bnRyaWVzIHJlY2liaWRvcyBlbiBsYSBzdWJzY3JpcGNpb24gZGVsIG9ic2VydmFibGUuXG4gICAgICogQHJldHVybnMgdW4gYXJyZWdsbyBkZSBjb3VudHJpZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaWx0ZXJDb3VudHJ5QnlDb2RlID0gKGNvdW50cmllczogYW55W10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBjb3VudHJpZXNGaWx0ZXJlZCA9IGNvdW50cmllcy5maWx0ZXIoZWxlbSA9PiB0aGlzLmNvbnN0cy5nZXRDb3VudHJpZXMoKS5pbmNsdWRlcyhlbGVtLmNvZGUpKVxuICAgICAgICAgICAgaWYgKGNvdW50cmllc0ZpbHRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRyaWVzRmlsdGVyZWRcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRWwvbG9zIGNvZGlnby9zIGluZ3Jlc2Fkby9zIG5vIGNvaW5jaWRlbiBjb24gbG9zIHByb3Zpc3RvcyBkZXNkZSBlbCBiYWNrZW5kJylcbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRyaWVzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb3VudHJpZXNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNob3dGb3JtRmFjdHVyYWNpb24gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiA9ICF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb25cbiAgICAgICAgaWYgKCF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb24kLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShyZXNbMF0uY29kZSlcblxuICAgICAgICAgICAgICAgICAgICAvLyBQcm92aW5jaWFcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNbMF0/LnByb3ZpbmNlc1swXS5jb2RlXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChyZXNbMF0/LnByb3ZpbmNlcylcblxuICAgICAgICAgICAgICAgICAgICAvLyBEb2N1bWVudG9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUocmVzWzBdPy5kb2N1bWVudFR5cGVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KHJlc1swXT8uZG9jdW1lbnRUeXBlcylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Gb3JtQ2hhbmdlKClcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgIH1cblxuICAgIG9uRm9ybVZhbGlkID0gKCkgPT4ge1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkZvcm1DaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gJiYgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhZG8gPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGFkbyA9IHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkYWRvID0gZmFsc2VcbiAgICB9XG5cbiAgICBvbklucHV0Q2hhbmdlID0gKCkgPT4gdGhpcy5mb3JtX3JlYWR5ID0gZmFsc2U7XG5cbiAgICBvbkNvdW50cnlTZWxlY3RlZCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnbnVsbCcgPyBudWxsIDogdmFsdWUpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUobnVsbCk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSgnJyk7XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkQ291bnRyeSA9IHRoaXMuY291bnRyaWVzU3ViamVjdC52YWx1ZS5maW5kKGNvdW50cnkgPT4gY291bnRyeS5jb2RlID09IHZhbHVlKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRDb3VudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQ291bnRyeS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vUHJvdmluY2VzXG4gICAgICAgIGxldCBwcm92aW5jZXMgPSB2YWx1ZSAmJiB2YWx1ZSAhPSAnbnVsbCcgP1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpLnByb3ZpbmNlc1xuICAgICAgICAgICAgOlxuICAgICAgICAgICAgW11cbiAgICAgICAgdGhpcy5wcm92aW5jZXNTdWJqZWN0Lm5leHQocHJvdmluY2VzKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHByb3ZpbmNlc1swXS5jb2RlKVxuXG4gICAgICAgIC8vRG9jdW1lbnQgdHlwZXNcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSB2YWx1ZSAmJiB2YWx1ZSAhPSAnbnVsbCcgP1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpLmRvY3VtZW50VHlwZXNcbiAgICAgICAgICAgIDpcbiAgICAgICAgICAgIFtdXG4gICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QubmV4dChkb2N1bWVudFR5cGVzKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKGRvY3VtZW50VHlwZXNbMF0uY29kZSlcblxuICAgIH1cblxuICAgIG9uQ291bnRyeVNlbGVjdGVkRmFjdHVyYWNpb24gPSAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnbnVsbCcgPyBudWxsIDogdmFsdWUpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoJycpO1xuXG4gICAgICAgIC8vUHJvdmluY2VzXG4gICAgICAgIGxldCBwcm92aW5jZXMgPSB2YWx1ZSAmJiB2YWx1ZSAhPSAnbnVsbCcgP1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSkucHJvdmluY2VzXG4gICAgICAgICAgICA6XG4gICAgICAgICAgICBbXVxuICAgICAgICB0aGlzLnByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KHByb3ZpbmNlcyk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHByb3ZpbmNlc1swXS5jb2RlKVxuXG4gICAgICAgIC8vRG9jdW1lbnQgdHlwZXNcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSB2YWx1ZSAmJiB2YWx1ZSAhPSAnbnVsbCcgP1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSkuZG9jdW1lbnRUeXBlc1xuICAgICAgICAgICAgOlxuICAgICAgICAgICAgW11cbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQoZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKGRvY3VtZW50VHlwZXNbMF0uY29kZSlcbiAgICB9XG5cbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcblxuICAgIG9uUHJvdmluY2VzU2VsZWN0ZWRGYWN0dXJhY2lvbiA9ICh2YWx1ZSkgPT4gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcblxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUodmFsdWUgPT0gJycgPyAnJyA6IHZhbHVlKTtcblxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkRmFjdHVyYWNpb24gPSAodmFsdWUpID0+IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnJyA/ICcnIDogdmFsdWUpO1xuXG4gICAgdmVyaWZ5VmFsaWRhdGUgPSBhc3luYyAoZSwgaXRlbXMpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIlZlcmlmeWluZzogXCIsIGUpXG4gICAgICAgIHRoaXMucmVxdWlyZV9sb2dpbiA9IGZhbHNlO1xuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUoZSk7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCl7XG4gICAgICAgICAgICAvLyAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgIGlmICghaXRlbS5sb3RbMF0pe1xuICAgICAgICAgICAgLy8gICAgICAvLyAgICBjb25zb2xlLmxvZyh0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY2l0eSddWyd2YWx1ZSddKVxuICAgICAgICAgICAgLy8gICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsMCxpdGVtLnZhcmlhbnRfaWQsMCxpdGVtLml0ZW1faWQsaXRlbS5xdWFudGl0eSxpdGVtLnByb2R1Y3QucHJpY2UsaXRlbS5xdWFudGl0eSxpdGVtLmRpc2NvdW50LGl0ZW0ucHJvZHVjdC5wcmljZSppdGVtLnF1YW50aXR5LCduZXcnLCcnLCcnLDAsdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXVsndmFsdWUnXSsgJyAtICcgKyB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snc3RyZWV0J11bJ3ZhbHVlJ10sICduZXdsb3QnKTtcbiAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXN1bHQoKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7XG4gICAgfVxuXG4gICAgc2hvd0Vycm9yID0gKGVycm9yX21lc3NhZ2UpID0+IHsgdGhpcy50b2FzdC5zaG93KGVycm9yX21lc3NhZ2UpOyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIGxldCBkYXRhOiBhbnkgPSB7IHNoaXBwaW5nQWRkcmVzczogeyAuLi50aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpLCBwaG9uZU51bWJlcjogdGhpcy5jaGVja291dEZvcm0udmFsdWUucGhvbmVOdW1iZXIudG9TdHJpbmcoKSB9LCBub3RlczogKHRoaXMuY2hlY2tvdXRGb3JtLmdldFJhd1ZhbHVlKCkpLm5vdGVzIH07XG4gICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIGRhdGEgPSB7IC4uLmRhdGEsIG5vdGVzOiBkYXRhLm5vdGVzLCBiaWxsaW5nQWRkcmVzczogdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5nZXRSYXdWYWx1ZSgpIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5zZXRBZGRyZXNzKGRhdGEpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZV9sb2dpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdFbCBlbWFpbCB5YSBlc3TDoSByZWdpc3RyYWRvLCBpbmljaWUgc2VzacOzbi4nKVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgIT09IGZhbHNlICYmIHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHRoaXMuYWxscmVhZHlfZGF0YSA9IHRydWVcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGNhdGNoIChlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJykgfVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvcGVuTW9kYWwodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICAgICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3codGVtcGxhdGUsIHsgY2xhc3M6ICdtb2RhbC1sZyAnLCBrZXlib2FyZDogZmFsc2UsIGJhY2tkcm9wOiAnc3RhdGljJyB9KTtcbiAgICB9XG5cbiAgICBzZXRTZWxlY3RBZGRyZXNzID0gKGFkZHJlc3NTZWxlY3Q6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rLm1hcChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQgPSBhZGRyZXNzLmlkID09PSBhZGRyZXNzU2VsZWN0LmlkKVxuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKS5pZCB8fCAwXG4gICAgfVxuXG4gICAgdXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oY291bnRyeUNvZGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBwb3N0YWxDb2RlQ29uZmlnID0gdGhpcy5jb25zdHMuZ2V0UG9zdGFsQ29kZVBhdHRlcm4oY291bnRyeUNvZGUpIHx8IHsgcGF0dGVybjogLy4qLywgZXJyb3JLZXk6IFwicG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvci5kZWZhdWx0XCIgfTtcbiAgICAgICAgdGhpcy5wb3N0YWxDb2RlRXJyb3JNZXNzYWdlID0gcG9zdGFsQ29kZUNvbmZpZy5lcnJvcktleTtcblxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1sncG9zdGNvZGUnXS5zZXRWYWxpZGF0b3JzKFtcbiAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4ocG9zdGFsQ29kZUNvbmZpZy5wYXR0ZXJuKVxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cblxuICAgIHNlbGVjdEFkZHJlc3MgPSBhc3luYyAoaXRlbXMpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgbGV0IGFkZHJlc3NTZWxlY3RlZCA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpXG4gICAgICAgIGlmIChhZGRyZXNzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gYWRkcmVzc1NlbGVjdGVkLmlkIHx8IDBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgc2hpcHBpbmdBZGRyZXNzOiBhZGRyZXNzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0U2VkZSA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0SGVhZHF1YXJ0ZXIocmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdFNlZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FydFNlcnZpY2UuY2hhbm5lbENvbmZpZy5hcHBseU9yZGVyTG90KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5sb3RbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgMCwgaXRlbS5pdGVtX2lkLCBpdGVtLnF1YW50aXR5LCBpdGVtLnByb2R1Y3QucHJpY2UsIGl0ZW0ucXVhbnRpdHksIGl0ZW0uZGlzY291bnQsIGl0ZW0ucHJvZHVjdC5wcmljZSAqIGl0ZW0ucXVhbnRpdHksICduZXcnLCAnJywgJycsIDAsIHJlc3VsdFNlZGUuc2hpcHBpbmdBZGRyZXNzLmNpdHkgKyAnIC0gJyArIHJlc3VsdFNlZGUuc2hpcHBpbmdBZGRyZXNzLnN0cmVldCwgJ25ld2xvdCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxscmVhZHlfZGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJykgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0TW9kZSA9ICgpID0+IHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzKSB7XG4gICAgICAgICAgICBjYXNlICdPTkxZX0xPQURfQUREUkVTUyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfQUREUkVTU19TRUxFQ1RJT04nOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnTE9BRF9BRERSRVNTX0FORF9TRUxFQ1RJT04nOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEFkZHJlc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgfVxuICAgIHBydWViYSh4KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHgpO1xuICAgIH1cblxuICAgIHNldE1vZGUgPSAobW9kZSkgPT4gdGhpcy5zZWxlY3RBZGRyZXMgPSBtb2RlID09IFwiY2FyZ2FcIlxuXG4gICAgZ2V0Q291bnRyeSA9IChjb2RlKSA9PiB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmNvdW50cmllc0xpc3QuZmluZChwYWlzZXMgPT4gcGFpc2VzLmNvZGUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyhjb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkpKT8ubmFtZSB8fCBcIlwiXG5cbiAgICBnZXRQcm92aW5jZSA9IChjb2RlKSA9PiB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLnByb3ZpbmNlTGlzdC5maW5kKGN0ID0+IGN0LmNvZGUgPT0gY29kZSk/Lm5hbWUgfHwgXCJcIlxuXG4gICAgZ2V0RG9jdW1lbnRUeXBlID0gKGNvZGUpID0+IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZG9jdW1lbnRUeXBlcy5maW5kKGR0ID0+IGR0LmNvZGUgPT0gY29kZSk/Lm5hbWUgfHwgXCJcIlxuXG4gICAgZ2V0TGFiZWxOb3Rlc1BhcmFtID0gKCkgPT4gdGhpcy5oYXNQYXJhbXModGhpcy5wYXJhbXMsICdsYWJlbF9ub3Rlc18nICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJ18nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCkuc3BsaXQoJ18nKVswXSlcblxuICAgIGdldFBhcmFtQnlDaGFubmVsQW5kTGFuZ3VhZ2UgPSAobmFtZVBhcmFtKSA9PiB0aGlzLmhhc1BhcmFtcyh0aGlzLnBhcmFtcywgbmFtZVBhcmFtICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJ18nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCkuc3BsaXQoJ18nKVswXSlcbn1cbiJdfQ==