ng-easycommerce 0.0.660-beta.1 → 0.0.661
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -58
- package/assets/ec-i18n/en.json +3 -1
- package/assets/ec-i18n/es.json +3 -1
- package/bundles/ng-easycommerce.umd.js +179 -512
- package/bundles/ng-easycommerce.umd.js.map +1 -1
- package/bundles/ng-easycommerce.umd.min.js +1 -1
- package/bundles/ng-easycommerce.umd.min.js.map +1 -1
- package/esm2015/lib/core.consts.js +6 -1
- package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +5 -3
- package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +8 -5
- package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +11 -5
- package/esm2015/lib/ec-component/collection-ec/collection-ec.component.js +14 -450
- package/esm2015/lib/ec-component/product-detail-ec/product-detail-ec.component.js +30 -3
- package/esm2015/lib/ec-component/product-ec/product-ec.component.js +1 -2
- package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +8 -5
- package/esm2015/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +1 -3
- package/esm2015/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +3 -3
- package/esm2015/lib/ec-pipe/ec-currency-symbol.pipe.js +2 -1
- package/esm2015/lib/services/cart.service.js +27 -12
- package/esm2015/lib/services/currency.service.js +43 -7
- package/esm5/lib/core.consts.js +6 -1
- package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +5 -3
- package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +8 -5
- package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +11 -5
- package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +13 -458
- package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +48 -3
- package/esm5/lib/ec-component/product-ec/product-ec.component.js +1 -2
- package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +8 -5
- package/esm5/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +1 -3
- package/esm5/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +3 -3
- package/esm5/lib/ec-pipe/ec-currency-symbol.pipe.js +2 -1
- package/esm5/lib/services/cart.service.js +27 -12
- package/esm5/lib/services/currency.service.js +43 -7
- package/fesm2015/ng-easycommerce.js +157 -499
- package/fesm2015/ng-easycommerce.js.map +1 -1
- package/fesm5/ng-easycommerce.js +180 -513
- package/fesm5/ng-easycommerce.js.map +1 -1
- package/lib/core.consts.d.ts +5 -0
- package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +1 -0
- package/lib/ec-component/cart-ec/cart-ec.component.d.ts +1 -0
- package/lib/ec-component/collection-ec/collection-ec.component.d.ts +4 -34
- package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +3 -0
- package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +1 -0
- package/lib/services/cart.service.d.ts +2 -2
- package/lib/services/currency.service.d.ts +14 -2
- package/ng-easycommerce.metadata.json +1 -1
- package/package.json +1 -1
|
@@ -127,18 +127,24 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
127
127
|
* @returns un arreglo de countries.
|
|
128
128
|
*/
|
|
129
129
|
_this.filterCountryByCode = function (countries) {
|
|
130
|
+
// 1. Si hay países EXCLUIDOS, quítalos siempre
|
|
131
|
+
var filtered = countries;
|
|
132
|
+
if (_this.consts.excludedCountries && _this.consts.excludedCountries.length > 0) {
|
|
133
|
+
filtered = filtered.filter(function (elem) { return !_this.consts.excludedCountries.includes(elem.code); });
|
|
134
|
+
}
|
|
135
|
+
// 2. Si hay países INCLUIDOS, aplica el filtro de inclusión
|
|
130
136
|
if (_this.consts.getCountries().length > 0) {
|
|
131
|
-
var countriesFiltered =
|
|
137
|
+
var countriesFiltered = filtered.filter(function (elem) { return _this.consts.getCountries().includes(elem.code); });
|
|
132
138
|
if (countriesFiltered.length > 0) {
|
|
133
139
|
return countriesFiltered;
|
|
134
140
|
}
|
|
135
141
|
else {
|
|
136
142
|
console.error('El/los codigo/s ingresado/s no coinciden con los provistos desde el backend');
|
|
137
|
-
return
|
|
143
|
+
return filtered;
|
|
138
144
|
}
|
|
139
145
|
}
|
|
140
146
|
else {
|
|
141
|
-
return
|
|
147
|
+
return filtered;
|
|
142
148
|
}
|
|
143
149
|
};
|
|
144
150
|
_this.showFormFacturacion = function () {
|
|
@@ -503,7 +509,7 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
503
509
|
DataFormEcComponent = __decorate([
|
|
504
510
|
Component({
|
|
505
511
|
selector: 'app-dataform-ec',
|
|
506
|
-
template: "<ng-container *ngIf=\"this.channelConfig.channelType != 'b2b' || (this.channelConfig.channelType == 'b2b' && authService.isAuthenticated()); else pleaseLogin\">\r\n<ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null\">\r\n <div class=\"container card p-4 mb-3\">\r\n <div class=\"row justify-content-center\">\r\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\r\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\r\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\r\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\r\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\r\n </label>\r\n\r\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\" *ngIf=\"!getParamByChannelAndLanguage('btn_new_address_')\">\r\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\r\n {{ 'new-address' | translate | titlecase}}\r\n </label>\r\n\r\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\" *ngIf=\"getParamByChannelAndLanguage('btn_new_address_') as param\">\r\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\r\n {{ param.value}}\r\n </label>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"getMode(); else addressSelection\">\r\n <div *ngIf=\"!require_login; else requireLoginView\">\r\n\r\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_LOAD_ADDRESS'\">\r\n <div class=\"checkout-title my-2\">\r\n <h3>{{'billing-details'|translate}}</h3>\r\n </div>\r\n </ng-container>\r\n\r\n <form (submit)=\"verifyValidate(false,this.cartService.items)\">\r\n <div class=\"row mt-df\"><!--Fila 1-->\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\r\n <label class=\"field-label\">{{'first-name'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\r\n class=\"required\">*</span></label>\r\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\r\n [formControl]=\"checkoutForm.controls['firstName']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.firstName.touched && checkoutForm.controls.firstName.errors?.required\">\r\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\r\n\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.firstName.touched && checkoutForm.controls.firstName.errors?.pattern\">\r\n <span class=\"text-danger\">\r\n {{'first-name-help2'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\r\n <label class=\"field-label\">{{'last-name'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\r\n class=\"required\">*</span></label>\r\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\r\n [formControl]=\"checkoutForm.controls['lastName']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.lastName.touched && checkoutForm.controls.lastName.errors?.required\">\r\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.lastName.touched && checkoutForm.controls.lastName.errors?.pattern\">\r\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 2-->\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\r\n <label class=\"field-label\">{{'phone'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\r\n [formControl]=\"checkoutForm.controls['phoneNumber']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.phoneNumber.touched && checkoutForm.controls.phoneNumber.errors?.required\">\r\n <span class=\"text-danger\">\r\n\r\n {{'phone-help1'|translate}}\r\n </span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.phoneNumber.touched && checkoutForm.controls.phoneNumber.errors?.pattern\">\r\n <span class=\"text-danger\">\r\n {{'phone-help2'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\r\n <label class=\"field-label\">{{'email-address'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\r\n [formControl]=\"checkoutForm.controls['email']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.email.touched && checkoutForm.controls.email.errors?.required\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help1'|translate}}\r\n </span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.email.touched && checkoutForm.controls.email.errors?.email\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help2'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-df\"><!--Fila 3-->\r\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\r\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(countries$ | async) as countries\">\r\n <label class=\"field-label\">{{'country'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\r\n class=\"required\">*</span></label>\r\n <select class=\"form-select\" name=\"countryCode\"\r\n [formControl]=\"checkoutForm.controls['countryCode']\"\r\n (change)=\"onCountrySelected($event.target.value)\">\r\n <!-- <option selected [value]=\"countries[0].code\">{{ 'choose-country' | translate }}</option> -->\r\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">{{ country.name }}</option>\r\n </select>\r\n <div *ngIf=\"checkoutForm.controls.countryCode.touched && checkoutForm.controls.countryCode.errors?.required\"\r\n class=\"text text-danger\">\r\n {{'country-help'|translate}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\r\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(provinces$ | async) as provinces\">\r\n <label class=\"field-label\">{{'state'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\r\n class=\"required\">*</span></label>\r\n <select class=\"form-select\" name=\"provinceCode\"\r\n (change)=\"onProvincesSelected($event.target.value)\"\r\n [formControl]=\"checkoutForm.controls['provinceCode']\">\r\n<!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option>\r\n --> <option *ngFor=\"let province of provinces\" [value]=\"province.code\">{{ province.name }}\r\n </option>\r\n </select>\r\n <div *ngIf=\"checkoutForm.controls.provinceCode.touched && checkoutForm.controls.provinceCode.errors?.required\"\r\n class=\"text text-danger\">\r\n {{'state-help'|translate}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\r\n <label class=\"field-label\">{{'town-city'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\r\n [formControl]=\"checkoutForm.controls['city']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.city.touched && checkoutForm.controls.city.errors?.required\">\r\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-df\"><!--Fila 4-->\r\n <div class=\"form-group col-12 col-md-8\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\r\n <label class=\"field-label\">{{'address'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\r\n [formControl]=\"checkoutForm.controls['street']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.street.touched && checkoutForm.controls.street.errors?.required\">\r\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.street.touched && checkoutForm.controls.street.errors?.maxlength\">\r\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- form direcci\u00F3n -->\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.enabled\">\r\n <label class=\"field-label\">{{'postal-code'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\r\n [formControl]=\"checkoutForm.controls['postcode']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.postcode.touched && checkoutForm.controls.postcode.errors?.required\">\r\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.postcode.touched && checkoutForm.controls.postcode.errors?.pattern\">\r\n <span class=\"text-danger\"> {{postalCodeErrorMessage | translate}} </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-df\"><!--Fila 5-->\r\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\r\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\r\n <label class=\"field-label\">{{'document-type'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\r\n class=\"required\">*</span></label>\r\n <select name=\"documentType\" class=\"form-select\"\r\n (change)=\"onDocumentTypesSelected($event.target.value)\"\r\n [formControl]=\"checkoutForm.controls['documentType']\">\r\n<!-- <option [value]=\"''\" selected>{{'document-type'|translate}}</option>\r\n --> <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">{{item.name}}</option>\r\n </select>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.documentType.touched && checkoutForm.controls.documentType.errors?.required\">\r\n <span class=\"text-danger\">\r\n {{'type-document-help'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\r\n <label class=\"field-label\">{{'document-number'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\"\r\n [type]=\"'text'\" name=\"documentNumber\"\r\n [formControl]=\"checkoutForm.controls['documentNumber']\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.documentNumber.touched && checkoutForm.controls.documentNumber.errors?.required\">\r\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.documentNumber.touched && checkoutForm.controls.documentNumber.errors?.pattern\">\r\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\"><!--Fila 6-->\r\n <div class=\"form-group col-12 col-md-12\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\r\n\r\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\r\n class=\"required\">*</span></label>\r\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\" [innerHTML]=\"labelnotes.value\"><span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\r\n class=\"required\">*</span></label>\r\n\r\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\r\n [formControl]=\"checkoutForm.controls['notes']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 7-->\r\n <div class=\"form-group col-12 col-md-12\">\r\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\r\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\r\n id=\"formFact\"></label>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <div class=\"col-12\">\r\n <p>\r\n <!-- <span class=\"required\"></span> -->\r\n <label class=\"required text-underline\">* {{ 'required-fields' | translate }}</label>\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <div class=\"form-group col-12 col-md-12\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.enabled\">\r\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.required\"\r\n class=\"required\">*</span>\r\n <label class=\"\" for=\"\"> {{ 'accept-terms' | translate }} <input class=\"ms-2\" name=\"terms\"\r\n [formControl]=\"checkoutForm.controls['terms']\" type=\"checkbox\" required\r\n (change)=\"onInputChange()\" /> </label><br />\r\n <a (click)=\"openModal(template)\" role=\"button\" class=\"ms-3 nota-input text-dark\">{{ 'whats-this' |\r\n translate }}</a>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.terms.touched && !checkoutForm.controls.terms.value\">\r\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\" *ngIf=\"viewDataFacturacion ; else datosFormFacturacion\"> </div>\r\n <div class=\"checkout-btn-unique text-end\">\r\n <button type=\"submit\" [disabled]=\"!validado\" class=\"btn valid-btn mt-2\">\r\n {{(isLastOne ? 'finish-checkout' : (allready_data ? 'update' :\r\n 'ready-form')) | translate}}</button>\r\n\r\n\r\n </div>\r\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n </form>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #addressSelection>\r\n\r\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_ADDRESS_SELECTION'\">\r\n <div class=\"checkout-title my-2\">\r\n <h3>{{'address-selection'|translate}}</h3>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"this.addressBook; else addressBookNotResult\">\r\n\r\n <ng-container *ngIf=\"this.addressBook?.length ;else addressBookLoading\">\r\n <div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\r\n <div class=\"card p-3\">\r\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\" [id]=\"i\"\r\n [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\" (change)=\"onInputChange()\">\r\n <div class=\"ms-5\">\r\n <h4 class=\"card-title\">\r\n <strong>{{'address'|translate}}</strong><br>\r\n <span class=\"text-uppercase h3\">{{item.street}}</span>\r\n </h4>\r\n <div class=\"row\">\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\r\n </h5>\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\r\n </h5>\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\r\n </h5>\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\r\n </h5>\r\n </div>\r\n <div class=\"row px-3\">\r\n <div class=\"card p-2 bg-light w-100\">\r\n <div class=\"card-body\">\r\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'first-name'|translate}}</strong>\r\n {{item.addressContact.firstName}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'last-name'|translate}}</strong> {{item.addressContact.lastName}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'document-type'|translate}}</strong>\r\n {{getDocumentType(item.addressContact.documentType)}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'document-number'|translate}}</strong>\r\n {{item.addressContact.documentNumber}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'email-address'|translate}}</strong> {{item.addressContact.email}}\r\n </h6>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n<!-- Se hardcodea el canal de mundo del juguete empresa A ya que se necesita con urgencia, se sustituira por un campo que llegara de backend. -->\r\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\"> \r\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\r\n <div class=\"row mt-df\">\r\n <div class=\"form-group col-12 col-md-12\">\r\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\r\n class=\"required\">*</span></label>\r\n <label class=\"field-label\"\r\n *ngIf=\"getLabelNotesParam() as labelnotes\" [innerHTML]=\"labelnotes.value\"></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\r\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\" placeholder=\"\"\r\n autocomplete=\"off\"> \r\n <div class=\"invalid-feedback d-block\" *ngIf=\"\r\n addressingService.getTypeForm().viewForms.notes.required\r\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\r\n \">\r\n {{ 'required-field' | translate }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"checkout-btn-unique text-end\">\r\n <button (click)=\"selectAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\">\r\n {{(isLastOne ? 'finish-checkout' : (allready_data ? 'update' :\r\n 'ready-form')) | translate}}\r\n </button>\r\n </div>\r\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n</ng-template>\r\n\r\n\r\n<ng-template #requireLoginView>\r\n <div id=\"loginCheckout\">\r\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\" *ngIf=\"require_login\">\r\n <div class=\"col-12\">\r\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\r\n </app-login-form-ec>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<ng-template #datosFormFacturacion>\r\n <div class=\"container-fluid px-0 px-md-2\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"card \">\r\n <div class=\"card-header text-dark text-center\">\r\n <h3>{{'billing-data'|translate}}</h3>\r\n </div>\r\n <div class=\"card-body\">\r\n <form (submit)=\"verifyValidate()\">\r\n <div class=\"row mt-df\">\r\n <!--Fila 1-->\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\r\n <label class=\"field-label\">{{'first-name'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\r\n class=\"required\">*</span></label>\r\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\r\n [formControl]=\"checkoutFormFacturacion.controls['firstName']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.firstName.touched && checkoutFormFacturacion.controls.firstName.errors?.required\">\r\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\r\n\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.firstName.touched && checkoutFormFacturacion.controls.firstName.errors?.pattern\">\r\n <span class=\"text-danger\">\r\n {{'first-name-help2'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\r\n <label class=\"field-label\">{{'last-name'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\r\n class=\"required\">*</span></label>\r\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\r\n [formControl]=\"checkoutFormFacturacion.controls['lastName']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.lastName.touched && checkoutFormFacturacion.controls.lastName.errors?.required\">\r\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.lastName.touched && checkoutFormFacturacion.controls.lastName.errors?.pattern\">\r\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <!--Fila 2-->\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\r\n <label class=\"field-label\">{{'phone'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\"\r\n name=\"phoneNumber\"\r\n [formControl]=\"checkoutFormFacturacion.controls['phoneNumber']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.phoneNumber.touched && checkoutFormFacturacion.controls.phoneNumber.errors?.required\">\r\n <span class=\"text-danger\">\r\n {{'phone-help1'|translate}}\r\n </span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.phoneNumber.touched && checkoutFormFacturacion.controls.phoneNumber.errors?.pattern\">\r\n <span class=\"text-danger\">\r\n {{'phone-help2'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\r\n <label class=\"field-label\">{{'email-address'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\r\n [formControl]=\"checkoutFormFacturacion.controls['email']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.email.touched && checkoutFormFacturacion.controls.email.errors?.required\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help1'|translate}}\r\n </span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.email.touched && checkoutFormFacturacion.controls.email.errors?.email\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help2'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <!--Fila 3-->\r\n\r\n <ng-container\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\r\n\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"(countriesFacturacion$ | async) as countries\">\r\n <label class=\"field-label\">{{'country'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\r\n class=\"required\">*</span></label>\r\n <select class=\"form-select\" name=\"countryCode\"\r\n [formControl]=\"checkoutFormFacturacion.controls['countryCode']\"\r\n (change)=\"onCountrySelectedFacturacion($event.target.value)\">\r\n <!-- <option selected [value]=\"null\">{{ 'choose-country' | translate }}</option> -->\r\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">\r\n {{ country.name }}</option>\r\n </select>\r\n <div *ngIf=\"checkoutFormFacturacion.controls.countryCode.touched && checkoutFormFacturacion.controls.countryCode.errors?.required\"\r\n class=\"text text-danger\">\r\n {{'country-help'|translate}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\r\n\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"(provincesFacturacion$ | async) as provinces\">\r\n <label class=\"field-label\">{{'state'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\r\n class=\"required\">*</span></label>\r\n <select class=\"form-select\" name=\"provinceCode\"\r\n (change)=\"onProvincesSelectedFacturacion($event.target.value)\"\r\n [formControl]=\"checkoutFormFacturacion.controls['provinceCode']\">\r\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option> -->\r\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">\r\n {{ province.name }}\r\n </option>\r\n </select>\r\n <div *ngIf=\"checkoutFormFacturacion.controls.provinceCode.touched && checkoutFormFacturacion.controls.provinceCode.errors?.required\"\r\n class=\"text text-danger\">\r\n {{'state-help'|translate}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\r\n <label class=\"field-label\">{{'town-city'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\r\n [formControl]=\"checkoutFormFacturacion.controls['city']\" value=\"\" placeholder=\"\"\r\n autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.city.touched && checkoutFormFacturacion.controls.city.errors?.required\">\r\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <!--Fila 4-->\r\n <div class=\"form-group col-12 col-md-8\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\r\n <label class=\"field-label\">{{'address'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\r\n [formControl]=\"checkoutFormFacturacion.controls['street']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.street.touched && checkoutFormFacturacion.controls.street.errors?.required\">\r\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.street.touched && checkoutFormFacturacion.controls.street.errors?.maxlength\">\r\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.enabled\">\r\n <label class=\"field-label\">{{'postal-code'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\r\n [formControl]=\"checkoutFormFacturacion.controls['postcode']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.postcode.touched && checkoutFormFacturacion.controls.postcode.errors?.required\">\r\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.postcode.touched && checkoutFormFacturacion.controls.postcode.errors?.pattern\">\r\n <span class=\"text-danger\">{{postalCodeErrorMessage |translate}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <!--Fila 5-->\r\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\r\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\r\n <label class=\"field-label\">{{'document-type'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\r\n class=\"required\">*</span></label>\r\n <select name=\"documentType\" class=\"form-select\"\r\n [formControl]=\"checkoutFormFacturacion.controls['documentType']\"\r\n (change)=\"onDocumentTypesSelectedFacturacion($event.target.value)\">\r\n <!-- <option [value]=\"''\" selected>{{'document-type'|translate}}</option> -->\r\n <option\r\n *ngFor=\"let item of documentTypes\"\r\n [value]=\"item.code\">{{item.name}}</option>\r\n </select>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.documentType.touched && checkoutFormFacturacion.controls.documentType.errors?.required\">\r\n <span class=\"text-danger\">\r\n {{'type-document-help'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\r\n <label class=\"field-label\">{{'document-number'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\"\r\n [type]=\"'text'\" name=\"documentNumber\"\r\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.documentNumber.touched && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\r\n <span class=\"text-danger\">\r\n {{'document-number-help'|translate}}\r\n </span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.documentNumber.touched && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\r\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\r\n <div class=\"form-group col-12 col-md-12\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\r\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}aaa <span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\r\n class=\"required\">*</span></label>\r\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelNotesHtml\">\r\n <div [innerHTML]=\"labelNotesHtml\"></div>\r\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span>\r\n </label>\r\n\r\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\r\n [formControl]=\"checkoutFormFacturacion.controls['notes']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n<ng-template #template>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modalRef.hide()\">\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal-body scrol-if\">\r\n <app-section-container-ec [name]=\"'terminos-y-condiciones'\"> </app-section-container-ec>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n\r\n<ng-template #addressBookNotResult>\r\n <div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-12 text-center my-2\">\r\n <h4> {{'address-book-not-result' | translate }} </h4>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #addressBookLoading>\r\n <div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-12 text-center my-2\">\r\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n</ng-container>\r\n\r\n<ng-template #pleaseLogin>\r\n <div class=\"container\">\r\n <p>Por favor <a [routerLink]=\"['/auth/login']\" > Inicie Sesi\u00F3n</a></p>\r\n </div>\r\n</ng-template>",
|
|
512
|
+
template: "<ng-container\r\n *ngIf=\"this.channelConfig.channelType != 'b2b' || (this.channelConfig.channelType == 'b2b' && authService.isAuthenticated()); else pleaseLogin\">\r\n <ng-container\r\n *ngIf=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null\">\r\n <div class=\"container card p-4 mb-3\">\r\n <div class=\"row justify-content-center\">\r\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\r\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\r\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\r\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\r\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\r\n </label>\r\n\r\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\"\r\n *ngIf=\"!getParamByChannelAndLanguage('btn_new_address_')\">\r\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\r\n (change)=\"setMode('carga')\">\r\n {{ 'new-address' | translate | titlecase}}\r\n </label>\r\n\r\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\"\r\n *ngIf=\"getParamByChannelAndLanguage('btn_new_address_') as param\">\r\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\r\n (change)=\"setMode('carga')\">\r\n {{ param.value}}\r\n </label>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getMode(); else addressSelection\">\r\n <div *ngIf=\"!require_login; else requireLoginView\">\r\n\r\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_LOAD_ADDRESS'\">\r\n <div class=\"checkout-title my-2\">\r\n <h3>{{'billing-details'|translate}}</h3>\r\n </div>\r\n </ng-container>\r\n\r\n <form (submit)=\"verifyValidate(false,this.cartService.items)\">\r\n <div class=\"row mt-df\"><!--Fila 1-->\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\r\n <label class=\"field-label\">{{'first-name'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\r\n class=\"required\">*</span></label>\r\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\r\n [formControl]=\"checkoutForm.controls['firstName']\" value=\"\" placeholder=\"\"\r\n autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.firstName.touched && checkoutForm.controls.firstName.errors?.required\">\r\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\r\n\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.firstName.touched && checkoutForm.controls.firstName.errors?.pattern\">\r\n <span class=\"text-danger\">\r\n {{'first-name-help2'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\r\n <label class=\"field-label\">{{'last-name'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\r\n class=\"required\">*</span></label>\r\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\r\n [formControl]=\"checkoutForm.controls['lastName']\" value=\"\" placeholder=\"\"\r\n autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.lastName.touched && checkoutForm.controls.lastName.errors?.required\">\r\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.lastName.touched && checkoutForm.controls.lastName.errors?.pattern\">\r\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 2-->\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\r\n <label class=\"field-label\">{{'phone'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\r\n [formControl]=\"checkoutForm.controls['phoneNumber']\" value=\"\" placeholder=\"\"\r\n autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.phoneNumber.touched && checkoutForm.controls.phoneNumber.errors?.required\">\r\n <span class=\"text-danger\">\r\n\r\n {{'phone-help1'|translate}}\r\n </span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.phoneNumber.touched && checkoutForm.controls.phoneNumber.errors?.pattern\">\r\n <span class=\"text-danger\">\r\n {{'phone-help2'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\r\n <label class=\"field-label\">{{'email-address'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\r\n [formControl]=\"checkoutForm.controls['email']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.email.touched && checkoutForm.controls.email.errors?.required\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help1'|translate}}\r\n </span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.email.touched && checkoutForm.controls.email.errors?.email\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help2'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-df\"><!--Fila 3-->\r\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\r\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(countries$ | async) as countries\">\r\n <label class=\"field-label\">{{'country'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\r\n class=\"required\">*</span></label>\r\n <select class=\"form-select\" name=\"countryCode\"\r\n [formControl]=\"checkoutForm.controls['countryCode']\"\r\n (change)=\"onCountrySelected($event.target.value)\">\r\n <!-- <option selected [value]=\"countries[0].code\">{{ 'choose-country' | translate }}</option> -->\r\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">{{ country.name }}\r\n </option>\r\n </select>\r\n <div *ngIf=\"checkoutForm.controls.countryCode.touched && checkoutForm.controls.countryCode.errors?.required\"\r\n class=\"text text-danger\">\r\n {{'country-help'|translate}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\r\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(provinces$ | async) as provinces\">\r\n <label class=\"field-label\">{{'state'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\r\n class=\"required\">*</span></label>\r\n <select class=\"form-select\" name=\"provinceCode\"\r\n (change)=\"onProvincesSelected($event.target.value)\"\r\n [formControl]=\"checkoutForm.controls['provinceCode']\">\r\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option>\r\n -->\r\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">{{ province.name }}\r\n </option>\r\n </select>\r\n <div *ngIf=\"checkoutForm.controls.provinceCode.touched && checkoutForm.controls.provinceCode.errors?.required\"\r\n class=\"text text-danger\">\r\n {{'state-help'|translate}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\r\n <label class=\"field-label\">{{'town-city'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\r\n [formControl]=\"checkoutForm.controls['city']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.city.touched && checkoutForm.controls.city.errors?.required\">\r\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-df\"><!--Fila 4-->\r\n <div class=\"form-group col-12 col-md-8\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\r\n <label class=\"field-label\">{{'address'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\r\n class=\"required\">*</span>\r\n <span class=\"char-count ms-2\" style=\"font-size: 0.9em; color: #888;\">\r\n {{ 50 - (checkoutForm.controls['street'].value?.length || 0) }} {{'remainingCharacters'|translate}}\r\n </span>\r\n </label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\r\n [formControl]=\"checkoutForm.controls['street']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.street.touched && checkoutForm.controls.street.errors?.required\">\r\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.street.touched && checkoutForm.controls.street.errors?.maxlength\">\r\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- form direcci\u00F3n -->\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.enabled\">\r\n <label class=\"field-label\">{{'postal-code'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\r\n [formControl]=\"checkoutForm.controls['postcode']\" value=\"\" placeholder=\"\"\r\n autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.postcode.touched && checkoutForm.controls.postcode.errors?.required\">\r\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.postcode.touched && checkoutForm.controls.postcode.errors?.pattern\">\r\n <span class=\"text-danger\"> {{postalCodeErrorMessage | translate}} </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-df\"><!--Fila 5-->\r\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\r\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\r\n <label class=\"field-label\">{{'document-type'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\r\n class=\"required\">*</span></label>\r\n <select name=\"documentType\" class=\"form-select\"\r\n (change)=\"onDocumentTypesSelected($event.target.value)\"\r\n [formControl]=\"checkoutForm.controls['documentType']\">\r\n <!-- <option [value]=\"''\" selected>{{'document-type'|translate}}</option>\r\n -->\r\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">{{item.name}}</option>\r\n </select>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.documentType.touched && checkoutForm.controls.documentType.errors?.required\">\r\n <span class=\"text-danger\">\r\n {{'type-document-help'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\r\n <label class=\"field-label\">{{'document-number'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\r\n [formControl]=\"checkoutForm.controls['documentNumber']\" placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.documentNumber.touched && checkoutForm.controls.documentNumber.errors?.required\">\r\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.documentNumber.touched && checkoutForm.controls.documentNumber.errors?.pattern\">\r\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\"><!--Fila 6-->\r\n <div class=\"form-group col-12 col-md-12\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\r\n\r\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\r\n class=\"required\">*</span></label>\r\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\r\n [innerHTML]=\"labelnotes.value\"><span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\r\n class=\"required\">*</span></label>\r\n\r\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\r\n [formControl]=\"checkoutForm.controls['notes']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\"><!--Fila 7-->\r\n <div class=\"form-group col-12 col-md-12\">\r\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\r\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\r\n id=\"formFact\"></label>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <div class=\"col-12\">\r\n <p>\r\n <!-- <span class=\"required\"></span> -->\r\n <label class=\"required text-underline\">* {{ 'required-fields' | translate }}</label>\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <div class=\"form-group col-12 col-md-12\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.enabled\">\r\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.required\"\r\n class=\"required\">*</span>\r\n <label class=\"\" for=\"\"> {{ 'accept-terms' | translate }} <input class=\"ms-2\" name=\"terms\"\r\n [formControl]=\"checkoutForm.controls['terms']\" type=\"checkbox\" required\r\n (change)=\"onInputChange()\" /> </label><br />\r\n <a (click)=\"openModal(template)\" role=\"button\" class=\"ms-3 nota-input text-dark\">{{ 'whats-this'\r\n |\r\n translate }}</a>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutForm.controls.terms.touched && !checkoutForm.controls.terms.value\">\r\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\" *ngIf=\"viewDataFacturacion ; else datosFormFacturacion\"> </div>\r\n <div class=\"checkout-btn-unique text-end\">\r\n <button type=\"submit\" [disabled]=\"!validado\" class=\"btn valid-btn mt-2\">\r\n {{(isLastOne ? 'finish-checkout' : (allready_data ? 'update' :\r\n 'ready-form')) | translate}}</button>\r\n\r\n\r\n </div>\r\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n </form>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #addressSelection>\r\n\r\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_ADDRESS_SELECTION'\">\r\n <div class=\"checkout-title my-2\">\r\n <h3>{{'address-selection'|translate}}</h3>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"this.addressBook; else addressBookNotResult\">\r\n\r\n <ng-container *ngIf=\"this.addressBook?.length ;else addressBookLoading\">\r\n <div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\r\n <div class=\"card p-3\">\r\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\r\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\r\n (change)=\"onInputChange()\">\r\n <div class=\"ms-5\">\r\n <h4 class=\"card-title\">\r\n <strong>{{'address'|translate}}</strong><br>\r\n <span class=\"text-uppercase h3\">{{item.street}}</span>\r\n </h4>\r\n <div class=\"row\">\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\r\n </h5>\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\r\n </h5>\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\r\n </h5>\r\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\r\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\r\n </h5>\r\n </div>\r\n <div class=\"row px-3\">\r\n <div class=\"card p-2 bg-light w-100\">\r\n <div class=\"card-body\">\r\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'first-name'|translate}}</strong>\r\n {{item.addressContact.firstName}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'last-name'|translate}}</strong>\r\n {{item.addressContact.lastName}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'document-type'|translate}}</strong>\r\n {{getDocumentType(item.addressContact.documentType)}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'document-number'|translate}}</strong>\r\n {{item.addressContact.documentNumber}}\r\n </h6>\r\n <h6 class=\"card-subtitle mb-2 text-muted\">\r\n <strong>{{'email-address'|translate}}</strong>\r\n {{item.addressContact.email}}\r\n </h6>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <!-- Se hardcodea el canal de mundo del juguete empresa A ya que se necesita con urgencia, se sustituira por un campo que llegara de backend. -->\r\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\r\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\r\n <div class=\"row mt-df\">\r\n <div class=\"form-group col-12 col-md-12\">\r\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\r\n class=\"required\">*</span></label>\r\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\r\n [innerHTML]=\"labelnotes.value\"></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\r\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"invalid-feedback d-block\" *ngIf=\"\r\n addressingService.getTypeForm().viewForms.notes.required\r\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\r\n \">\r\n {{ 'required-field' | translate }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"checkout-btn-unique text-end\">\r\n <button (click)=\"selectAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\">\r\n {{(isLastOne ? 'finish-checkout' : (allready_data ? 'update' :\r\n 'ready-form')) | translate}}\r\n </button>\r\n </div>\r\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-template>\r\n\r\n\r\n <ng-template #requireLoginView>\r\n <div id=\"loginCheckout\">\r\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\" *ngIf=\"require_login\">\r\n <div class=\"col-12\">\r\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\r\n </app-login-form-ec>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n\r\n\r\n <ng-template #datosFormFacturacion>\r\n <div class=\"container-fluid px-0 px-md-2\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"card \">\r\n <div class=\"card-header text-dark text-center\">\r\n <h3>{{'billing-data'|translate}}</h3>\r\n </div>\r\n <div class=\"card-body\">\r\n <form (submit)=\"verifyValidate()\">\r\n <div class=\"row mt-df\">\r\n <!--Fila 1-->\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\r\n <label class=\"field-label\">{{'first-name'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\r\n class=\"required\">*</span></label>\r\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\r\n [formControl]=\"checkoutFormFacturacion.controls['firstName']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.firstName.touched && checkoutFormFacturacion.controls.firstName.errors?.required\">\r\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\r\n\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.firstName.touched && checkoutFormFacturacion.controls.firstName.errors?.pattern\">\r\n <span class=\"text-danger\">\r\n {{'first-name-help2'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\r\n <label class=\"field-label\">{{'last-name'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\r\n class=\"required\">*</span></label>\r\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\r\n [formControl]=\"checkoutFormFacturacion.controls['lastName']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.lastName.touched && checkoutFormFacturacion.controls.lastName.errors?.required\">\r\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.lastName.touched && checkoutFormFacturacion.controls.lastName.errors?.pattern\">\r\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <!--Fila 2-->\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\r\n <label class=\"field-label\">{{'phone'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\"\r\n name=\"phoneNumber\"\r\n [formControl]=\"checkoutFormFacturacion.controls['phoneNumber']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.phoneNumber.touched && checkoutFormFacturacion.controls.phoneNumber.errors?.required\">\r\n <span class=\"text-danger\">\r\n {{'phone-help1'|translate}}\r\n </span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.phoneNumber.touched && checkoutFormFacturacion.controls.phoneNumber.errors?.pattern\">\r\n <span class=\"text-danger\">\r\n {{'phone-help2'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-12 col-md-6\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\r\n <label class=\"field-label\">{{'email-address'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\r\n [formControl]=\"checkoutFormFacturacion.controls['email']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.email.touched && checkoutFormFacturacion.controls.email.errors?.required\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help1'|translate}}\r\n </span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.email.touched && checkoutFormFacturacion.controls.email.errors?.email\">\r\n <span class=\"text-danger\">\r\n {{'email-address-help2'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <!--Fila 3-->\r\n\r\n <ng-container\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\r\n\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"(countriesFacturacion$ | async) as countries\">\r\n <label class=\"field-label\">{{'country'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\r\n class=\"required\">*</span></label>\r\n <select class=\"form-select\" name=\"countryCode\"\r\n [formControl]=\"checkoutFormFacturacion.controls['countryCode']\"\r\n (change)=\"onCountrySelectedFacturacion($event.target.value)\">\r\n <!-- <option selected [value]=\"null\">{{ 'choose-country' | translate }}</option> -->\r\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">\r\n {{ country.name }}</option>\r\n </select>\r\n <div *ngIf=\"checkoutFormFacturacion.controls.countryCode.touched && checkoutFormFacturacion.controls.countryCode.errors?.required\"\r\n class=\"text text-danger\">\r\n {{'country-help'|translate}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\r\n\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"(provincesFacturacion$ | async) as provinces\">\r\n <label class=\"field-label\">{{'state'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\r\n class=\"required\">*</span></label>\r\n <select class=\"form-select\" name=\"provinceCode\"\r\n (change)=\"onProvincesSelectedFacturacion($event.target.value)\"\r\n [formControl]=\"checkoutFormFacturacion.controls['provinceCode']\">\r\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option> -->\r\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">\r\n {{ province.name }}\r\n </option>\r\n </select>\r\n <div *ngIf=\"checkoutFormFacturacion.controls.provinceCode.touched && checkoutFormFacturacion.controls.provinceCode.errors?.required\"\r\n class=\"text text-danger\">\r\n {{'state-help'|translate}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\r\n <label class=\"field-label\">{{'town-city'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\r\n [formControl]=\"checkoutFormFacturacion.controls['city']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.city.touched && checkoutFormFacturacion.controls.city.errors?.required\">\r\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <!--Fila 4-->\r\n <div class=\"form-group col-12 col-md-8\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\r\n <label class=\"field-label\">{{'address'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\r\n [formControl]=\"checkoutFormFacturacion.controls['street']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.street.touched && checkoutFormFacturacion.controls.street.errors?.required\">\r\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.street.touched && checkoutFormFacturacion.controls.street.errors?.maxlength\">\r\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.enabled\">\r\n <label class=\"field-label\">{{'postal-code'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\"\r\n name=\"postcode\" [formControl]=\"checkoutFormFacturacion.controls['postcode']\"\r\n value=\"\" placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.postcode.touched && checkoutFormFacturacion.controls.postcode.errors?.required\">\r\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.postcode.touched && checkoutFormFacturacion.controls.postcode.errors?.pattern\">\r\n <span class=\"text-danger\">{{postalCodeErrorMessage |translate}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row mt-df\">\r\n <!--Fila 5-->\r\n <ng-container\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\r\n <label class=\"field-label\">{{'document-type'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\r\n class=\"required\">*</span></label>\r\n <select name=\"documentType\" class=\"form-select\"\r\n [formControl]=\"checkoutFormFacturacion.controls['documentType']\"\r\n (change)=\"onDocumentTypesSelectedFacturacion($event.target.value)\">\r\n <!-- <option [value]=\"''\" selected>{{'document-type'|translate}}</option> -->\r\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">\r\n {{item.name}}</option>\r\n </select>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.documentType.touched && checkoutFormFacturacion.controls.documentType.errors?.required\">\r\n <span class=\"text-danger\">\r\n {{'type-document-help'|translate}}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"form-group col-12 col-md-4\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\r\n <label class=\"field-label\">{{'document-number'|translate}}<span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\r\n class=\"required\">*</span></label>\r\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\r\n name=\"documentNumber\"\r\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.documentNumber.touched && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\r\n <span class=\"text-danger\">\r\n {{'document-number-help'|translate}}\r\n </span>\r\n </div>\r\n <div class=\"text-danger-container\"\r\n *ngIf=\"checkoutFormFacturacion.controls.documentNumber.touched && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\r\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\r\n <div class=\"form-group col-12 col-md-12\"\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\r\n <label class=\"field-label\"\r\n *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}} <span\r\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\r\n class=\"required\">*</span></label>\r\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelNotesHtml\">\r\n <div [innerHTML]=\"labelNotesHtml\"></div>\r\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\r\n class=\"required\">*</span>\r\n </label>\r\n\r\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\r\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\r\n [formControl]=\"checkoutFormFacturacion.controls['notes']\" value=\"\"\r\n placeholder=\"\" autocomplete=\"off\">\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n\r\n\r\n <ng-template #template>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modalRef.hide()\">\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal-body scrol-if\">\r\n <app-section-container-ec [name]=\"'terminos-y-condiciones'\"> </app-section-container-ec>\r\n </div>\r\n\r\n </ng-template>\r\n\r\n\r\n <ng-template #addressBookNotResult>\r\n <div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-12 text-center my-2\">\r\n <h4> {{'address-book-not-result' | translate }} </h4>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #addressBookLoading>\r\n <div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-12 text-center my-2\">\r\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\r\n <app-loading-full-ec></app-loading-full-ec>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ng-container>\r\n\r\n<ng-template #pleaseLogin>\r\n <div class=\"container\">\r\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\r\n </div>\r\n</ng-template>",
|
|
507
513
|
providers: [BsModalService],
|
|
508
514
|
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}"]
|
|
509
515
|
})
|
|
@@ -511,4 +517,4 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
511
517
|
return DataFormEcComponent;
|
|
512
518
|
}(ComponentHelper));
|
|
513
519
|
export { DataFormEcComponent };
|
|
514
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBd0IsS0FBSyxFQUFrQyxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQVFoRjtJQUF5Qyx1Q0FBZTtJQTBDcEQsNkJBQW1CLFdBQXdCLEVBQ2hDLEVBQWUsRUFDZixL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QUF5QztZQUV6QyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7O1NBQzlCLENBQUM7T0FDVyxtQkFBbUIsQ0F1ZC9CO0lBQUQsMEJBQUM7Q0FBQSxBQXZkRCxDQUF5QyxlQUFlLEdBdWR2RDtTQXZkWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvbXBvbmVudEhlbHBlciB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29tcG9uZW50LWhlbHBlcic7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBZGRyZXNzaW5nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoZWNrb3V0L2FkZHJlc3Npbmcuc2VydmljZSc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xyXG5pbXBvcnQgeyBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbC9icy1tb2RhbC1yZWYuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uLy4uL2NvcmUuY29uc3RzJztcclxuaW1wb3J0IHsgYWRkIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcclxuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wYXJhbWV0ZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDaGFubmVsQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2FwcC1kYXRhZm9ybS1lYycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2RhdGFmb3JtLWVjLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWydkYXRhZm9ybS1lYy5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbQnNNb2RhbFNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRhRm9ybUVjQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50SGVscGVyIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBASW5wdXQoKSBzdGVwX2lkO1xyXG4gICAgQElucHV0KCkgaXNMYXN0T25lOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBuZXh0U3RlcDogRnVuY3Rpb247XHJcblxyXG4gICAgcHJvdGVjdGVkIGNvdW50cmllc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XHJcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcclxuICAgIHByb3RlY3RlZCBkb2N1bWVudFR5cGVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcclxuICAgIHByb3RlY3RlZCBjb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XHJcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xyXG4gICAgcHJvdGVjdGVkIGRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XHJcblxyXG4gICAgcHVibGljIGNvdW50cmllcyQgPSB0aGlzLmNvdW50cmllc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwdWJsaWMgcHJvdmluY2VzJCA9IHRoaXMucHJvdmluY2VzU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVzJCA9IHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwdWJsaWMgY291bnRyaWVzRmFjdHVyYWNpb24kID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwdWJsaWMgcHJvdmluY2VzRmFjdHVyYWNpb24kID0gdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwdWJsaWMgZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uJCA9IHRoaXMuZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBwdWJsaWMgcmVxdWlyZV9sb2dpbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGNoZWNrb3V0Rm9ybTogRm9ybUdyb3VwO1xyXG4gICAgcHVibGljIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uOiBGb3JtR3JvdXA7XHJcbiAgICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgcHVibGljIGZvcm1fcmVhZHkgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBhbGxyZWFkeV9kYXRhID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgYWRkcmVzc0Jvb2sgPSBbXTtcclxuICAgIHB1YmxpYyBhZGRyZXNzQm9va1NlbGVjdGVkID0geyBpZDogMCwgbm90ZXM6IFwiXCIgfVxyXG4gICAgcHVibGljIGZpbmlzaDogYm9vbGVhbiA9IGZhbHNlOyAvL0VzdGEgdmFyaWFibGUgc2UgdXNhIHBhcmEgbW9zdHJhciBlbCBib3RvbiBkZSBmaW5hbGl6YXIuXHJcblxyXG4gICAgcHVibGljIHZhbGlkYWRvID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgdmlld0RhdGFGYWN0dXJhY2lvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgcHVibGljIG1vZGFsUmVmOiBCc01vZGFsUmVmIHwgbnVsbDtcclxuICAgIHB1YmxpYyBwYXJhbXM6IGFueSA9IHt9O1xyXG4gICAgcHVibGljIHNlbGVjdEFkZHJlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBwb3N0YWxDb2RlRXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIHBvc3RhbENvZGVFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbjogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBkb2N1bWVudEVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBkb2N1bWVudEVycm9yTWVzc2FnZUZhY3R1cmFjaW9uOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIGZiOiBGb3JtQnVpbGRlcixcclxuICAgICAgICBwdWJsaWMgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgICAgICBwdWJsaWMgYWRkcmVzc2luZ1NlcnZpY2U6IEFkZHJlc3NpbmdTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBwYXJhbXNTZXJ2aWNlOiBQYXJhbWV0ZXJzU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgY29uc3RzOiBDb25zdGFudHMsXHJcbiAgICAgICAgcHVibGljIGNoYW5uZWxDb25maWc6IENoYW5uZWxDb25maWdTZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1BZGRyZXMsXHJcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0gLy8gU2UgYWdyZWdhIHBhcmEgcXVlIHPDs2xvIGFjZXB0ZSBjw7NkaWdvcyBwb3N0YWxlcyBtYXlvcmVzIHF1ZSBjZXJvXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uc3RhdHVzQ2hhbmdlc1xyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7IHRoaXMub25Gb3JtQ2hhbmdlKCk7IHJldHVybiB0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCB9KSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRm9ybVZhbGlkKCkpO1xyXG5cclxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1CaWxsaW5nLFxyXG4gICAgICAgICAgICBwb3N0Y29kZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dIC8vIFNlIGFncmVnYSBwYXJhIHF1ZSBzw7NsbyBhY2VwdGUgY8OzZGlnb3MgcG9zdGFsZXMgbWF5b3JlcyBxdWUgY2Vyb1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uc3RhdHVzQ2hhbmdlc1xyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7IHRoaXMub25Gb3JtQ2hhbmdlKCk7IHJldHVybiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkIH0pKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtVmFsaWQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXNTZXJ2aWNlLnBhcmFtZXRlcnMuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLnBhcmFtcyA9IHJlcyk7XHJcbiAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5pbml0aWFsaXplKHRoaXMuc3RlcF9pZCk7XHJcbiAgICAgICAgY29uc3QgbG9jYWxFbWFpbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtYWlsJylcclxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLnNldFZhbHVlKHRoaXMuYXV0aFNlcnZpY2UuZ2V0Q3VzdG9tZXIoKT8uZW1haWwgfHwgbG9jYWxFbWFpbCk7XHJcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXQoJ2VtYWlsJykuZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0QWRkcmVzc2luZ0RhdGEoKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjb3VudHJpZXMgPSB0aGlzLmZpbHRlckNvdW50cnlCeUNvZGUocmVzKVxyXG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QubmV4dChjb3VudHJpZXMpO1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KGNvdW50cmllcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09PSAnTE9BRF9BRERSRVNTX0FORF9TRUxFQ1RJT04nIHx8XHJcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MgPT09ICdPTkxZX0FERFJFU1NfU0VMRUNUSU9OJykge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRBZGRyZXNzQm9vaygpLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPSByZXMgfHwgbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZHJlc3NCb29rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRBZGRyZXNzID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQWRkcmVzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShzZWxlY3RlZEFkZHJlc3MuY291bnRyeUNvZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQWRkcmVzcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2NhcmdhJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb3VudHJpZXMkLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShyZXNbMF0uY29kZSlcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24ocmVzWzBdKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBQcm92aW5jaWFcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcclxuICAgICAgICAgICAgICAgICAgICByZXNbMF0/LnByb3ZpbmNlc1swXS5jb2RlXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChyZXNbMF0/LnByb3ZpbmNlcylcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBEb2N1bWVudG9cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQocmVzWzBdPy5kb2N1bWVudFR5cGVzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy5lY09uSW5pdCgpXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBmaWx0cmEgbG9zIHBhaXNlcyBkZSBhY3VlcmRvIGFsIGEgbG9zIGNvZGlnb3MgcmV0b3JuYWRvcyBlbiBsYSBmdW5jaW9uIGdldENvdW50cmllcy5cclxuICAgICAqIENhc29zIGRlIHVzb3M6IFNpIGdldENvdW50cmllcyBlcyB2YWNpbywgcmV0b3JuYSBlbCBhcnJlZ2xvIHF1ZSBpbmdyZXNhIHBvciBwYXJhbWV0cm8uXHJcbiAgICAgKiBTaSBnZXRDb3VudHJpZXMgY29udGllbmUgdmFsb3JlcyBxdWUgbm8gY29pbmNpZGVuLCByZXRvcm5hIGVsIGFycmVnbG8gcXVlIGluZ3Jlc2EgcG9yIHBhcmFtZXRyby5cclxuICAgICAqIERlIGxvIGNvbnRyYXJpbyByZXRvcm5hIGxvcyB2YWxvcmVzIGZpbHRyYWRvcy5cclxuICAgICAqIEBwYXJhbSBjb3VudHJpZXMgQXJyZWdsbyBxdWUgY29udGllbmUgbG9zIGNvdW50cmllcyByZWNpYmlkb3MgZW4gbGEgc3Vic2NyaXBjaW9uIGRlbCBvYnNlcnZhYmxlLlxyXG4gICAgICogQHJldHVybnMgdW4gYXJyZWdsbyBkZSBjb3VudHJpZXMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmlsdGVyQ291bnRyeUJ5Q29kZSA9IChjb3VudHJpZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IGNvdW50cmllc0ZpbHRlcmVkID0gY291bnRyaWVzLmZpbHRlcihlbGVtID0+IHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmluY2x1ZGVzKGVsZW0uY29kZSkpXHJcbiAgICAgICAgICAgIGlmIChjb3VudHJpZXNGaWx0ZXJlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRyaWVzRmlsdGVyZWRcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0VsL2xvcyBjb2RpZ28vcyBpbmdyZXNhZG8vcyBubyBjb2luY2lkZW4gY29uIGxvcyBwcm92aXN0b3MgZGVzZGUgZWwgYmFja2VuZCcpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRyaWVzXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvdW50cmllc1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG93Rm9ybUZhY3R1cmFjaW9uID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiA9ICF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb25cclxuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbikge1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uJC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHJlc1swXS5jb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihyZXNbMF0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBQcm92aW5jaWFcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzWzBdPy5wcm92aW5jZXNbMF0uY29kZVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBEb2N1bWVudG9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbkZhY3R1cmFjaW9uKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocmVzWzBdPy5kb2N1bWVudFR5cGVzKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxyXG4gICAgfVxyXG5cclxuICAgIG9uRm9ybVZhbGlkID0gKCkgPT4ge1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkZvcm1DaGFuZ2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhZG8gPSB0cnVlXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYWRvID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52YWxpZGFkbyA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgb25JbnB1dENoYW5nZSA9ICgpID0+IHRoaXMuZm9ybV9yZWFkeSA9IGZhbHNlO1xyXG5cclxuICAgIG9uQ291bnRyeVNlbGVjdGVkID0gKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcclxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKCcnKTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkQ291bnRyeSA9IHRoaXMuY291bnRyaWVzU3ViamVjdC52YWx1ZS5maW5kKGNvdW50cnkgPT4gY291bnRyeS5jb2RlID09IHZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQ291bnRyeSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1Byb3ZpbmNlc1xyXG4gICAgICAgIGxldCBwcm92aW5jZXMgPSB2YWx1ZSAmJiB2YWx1ZSAhPSAnbnVsbCcgP1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSkucHJvdmluY2VzXHJcbiAgICAgICAgICAgIDpcclxuICAgICAgICAgICAgW11cclxuICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChwcm92aW5jZXMpO1xyXG4gICAgICAgIGlmIChwcm92aW5jZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShwcm92aW5jZXNbMF0uY29kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL0RvY3VtZW50IHR5cGVzXHJcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyA6IFtdO1xyXG4gICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QubmV4dChkb2N1bWVudFR5cGVzKTtcclxuICAgICAgICBpZiAoZG9jdW1lbnRUeXBlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKGRvY3VtZW50VHlwZXNbMF0uY29kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSBkb2N1bWVudFR5cGVzLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkRG9jdW1lbnRUeXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIG9uQ291bnRyeVNlbGVjdGVkRmFjdHVyYWNpb24gPSAodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoJycpO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkQ291bnRyeSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBQcm92aW5jZXNcclxuICAgICAgICBsZXQgcHJvdmluY2VzID0gc2VsZWN0ZWRDb3VudHJ5ID8gc2VsZWN0ZWRDb3VudHJ5LnByb3ZpbmNlcyA6IFtdO1xyXG4gICAgICAgIHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocHJvdmluY2VzKTtcclxuICAgICAgICBpZiAocHJvdmluY2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShwcm92aW5jZXNbMF0uY29kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEb2N1bWVudCB0eXBlc1xyXG4gICAgICAgIGxldCBkb2N1bWVudFR5cGVzID0gc2VsZWN0ZWRDb3VudHJ5ID8gc2VsZWN0ZWRDb3VudHJ5LmRvY3VtZW50VHlwZXMgOiBbXTtcclxuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChkb2N1bWVudFR5cGVzKTtcclxuICAgICAgICBpZiAoZG9jdW1lbnRUeXBlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoZG9jdW1lbnRUeXBlc1swXS5jb2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZERvY3VtZW50VHlwZSA9IGRvY3VtZW50VHlwZXMuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWUpO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcclxuXHJcbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkRmFjdHVyYWNpb24gPSAodmFsdWUpID0+IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XHJcblxyXG4gICAgb25Eb2N1bWVudFR5cGVzU2VsZWN0ZWQgPSAodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUodmFsdWUgPT0gJycgPyAnJyA6IHZhbHVlKTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC52YWx1ZS5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB2YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBvbkRvY3VtZW50VHlwZXNTZWxlY3RlZEZhY3R1cmFjaW9uID0gKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUodmFsdWUgPT0gJycgPyAnJyA6IHZhbHVlKTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0LnZhbHVlLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkRG9jdW1lbnRUeXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uRmFjdHVyYWNpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdmVyaWZ5VmFsaWRhdGUgPSBhc3luYyAoZSwgaXRlbXMpID0+IHtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiVmVyaWZ5aW5nOiBcIiwgZSlcclxuICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSBmYWxzZTtcclxuICAgICAgICBpZiAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS5zZXRWYWx1ZShlKTtcclxuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXQoJ2VtYWlsJykuZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XHJcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCl7XHJcbiAgICAgICAgICAgIC8vICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAvLyAgICAgICBpZiAoIWl0ZW0ubG90WzBdKXtcclxuICAgICAgICAgICAgLy8gICAgICAvLyAgICBjb25zb2xlLmxvZyh0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY2l0eSddWyd2YWx1ZSddKVxyXG4gICAgICAgICAgICAvLyAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvTG90KGl0ZW0ucHJvZHVjdCwwLGl0ZW0udmFyaWFudF9pZCwwLGl0ZW0uaXRlbV9pZCxpdGVtLnF1YW50aXR5LGl0ZW0ucHJvZHVjdC5wcmljZSxpdGVtLnF1YW50aXR5LGl0ZW0uZGlzY291bnQsaXRlbS5wcm9kdWN0LnByaWNlKml0ZW0ucXVhbnRpdHksJ25ldycsJycsJycsMCx0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY2l0eSddWyd2YWx1ZSddKyAnIC0gJyArIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydzdHJlZXQnXVsndmFsdWUnXSwgJ25ld2xvdCcpO1xyXG4gICAgICAgICAgICAvLyAgICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgfSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgdGhpcy5lbWl0UmVzdWx0KCk7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKCdpbnZhbGlkLWZvcm0nKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93RXJyb3IgPSAoZXJyb3JfbWVzc2FnZSkgPT4geyB0aGlzLnRvYXN0LnNob3coZXJyb3JfbWVzc2FnZSk7IHJldHVybiB0cnVlOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGVtaXRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBsZXQgZGF0YTogYW55ID0geyBzaGlwcGluZ0FkZHJlc3M6IHsgLi4udGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKSwgcGhvbmVOdW1iZXI6IHRoaXMuY2hlY2tvdXRGb3JtLnZhbHVlLnBob25lTnVtYmVyLnRvU3RyaW5nKCkgfSwgbm90ZXM6ICh0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpKS5ub3RlcyB9O1xyXG4gICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIGRhdGEgPSB7IC4uLmRhdGEsIG5vdGVzOiBkYXRhLm5vdGVzLCBiaWxsaW5nQWRkcmVzczogdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5nZXRSYXdWYWx1ZSgpIH07XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0QWRkcmVzcyhkYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdlbWFpbF9hbHJlYWR5X3JlZ2lzdGVyZWQnKVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgIT09IGZhbHNlICYmIHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1fcmVhZHkgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJykgfVxyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Nb2RhbCh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgICAgIHRoaXMubW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KHRlbXBsYXRlLCB7IGNsYXNzOiAnbW9kYWwtbGcgJywga2V5Ym9hcmQ6IGZhbHNlLCBiYWNrZHJvcDogJ3N0YXRpYycgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2VsZWN0QWRkcmVzcyA9IChhZGRyZXNzU2VsZWN0OiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmFkZHJlc3NCb29rLm1hcChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQgPSBhZGRyZXNzLmlkID09PSBhZGRyZXNzU2VsZWN0LmlkKVxyXG4gICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpLmlkIHx8IDBcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVWYWxpZGF0aW9uKFxyXG4gICAgICAgIHNlbGVjdGVkSXRlbTogYW55LFxyXG4gICAgICAgIGZvcm1Db250cm9sTmFtZTogc3RyaW5nLFxyXG4gICAgICAgIGZvcm06IGFueSxcclxuICAgICAgICBlcnJvck1lc3NhZ2VWYXI6IHN0cmluZyxcclxuICAgICAgICBpc051bWVyaWNLZXk6IHN0cmluZyxcclxuICAgICAgICBlcnJvcktleVByZWZpeDogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgICBpZiAoIXNlbGVjdGVkSXRlbSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBpc051bWVyaWMgPSBzZWxlY3RlZEl0ZW1baXNOdW1lcmljS2V5XSA/PyBmYWxzZTtcclxuICAgICAgICBjb25zdCBwYXR0ZXJuID0gaXNOdW1lcmljID8gL15cXGQrJC8gOiAvLiovO1xyXG4gICAgICAgIHRoaXNbZXJyb3JNZXNzYWdlVmFyXSA9IGlzTnVtZXJpYyA/IGAke2Vycm9yS2V5UHJlZml4fS5udW1lcmljYCA6IGAke2Vycm9yS2V5UHJlZml4fS5kZWZhdWx0YDtcclxuXHJcbiAgICAgICAgZm9ybS5jb250cm9sc1tmb3JtQ29udHJvbE5hbWVdLnNldFZhbGlkYXRvcnMoW1xyXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4ocGF0dGVybilcclxuICAgICAgICBdKTtcclxuICAgICAgICBmb3JtLmNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQ291bnRyeTogYW55KSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9uKFxyXG4gICAgICAgICAgICBzZWxlY3RlZENvdW50cnksXHJcbiAgICAgICAgICAgICdwb3N0Y29kZScsXHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLFxyXG4gICAgICAgICAgICAncG9zdGFsQ29kZUVycm9yTWVzc2FnZScsXHJcbiAgICAgICAgICAgICdpc1Bvc3RhbENvZGVOdW1lcmljJyxcclxuICAgICAgICAgICAgJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3InXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkQ291bnRyeTogYW55KSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9uKFxyXG4gICAgICAgICAgICBzZWxlY3RlZENvdW50cnksXHJcbiAgICAgICAgICAgICdwb3N0Y29kZScsXHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24sXHJcbiAgICAgICAgICAgICdwb3N0YWxDb2RlRXJyb3JNZXNzYWdlRmFjdHVyYWNpb24nLFxyXG4gICAgICAgICAgICAnaXNQb3N0YWxDb2RlTnVtZXJpYycsXHJcbiAgICAgICAgICAgICdwb3N0YWwtY29kZS1wYXR0ZXJuLWVycm9yJ1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oXHJcbiAgICAgICAgICAgIHNlbGVjdGVkRG9jdW1lbnRUeXBlLFxyXG4gICAgICAgICAgICAnZG9jdW1lbnROdW1iZXInLFxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybSxcclxuICAgICAgICAgICAgJ2RvY3VtZW50RXJyb3JNZXNzYWdlJyxcclxuICAgICAgICAgICAgJ2lzTnVtZXJpYycsXHJcbiAgICAgICAgICAgICdkb2N1bWVudC1wYXR0ZXJuLWVycm9yJ1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uRmFjdHVyYWNpb24oc2VsZWN0ZWREb2N1bWVudFR5cGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcclxuICAgICAgICAgICAgc2VsZWN0ZWREb2N1bWVudFR5cGUsXHJcbiAgICAgICAgICAgICdkb2N1bWVudE51bWJlcicsXHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24sXHJcbiAgICAgICAgICAgICdkb2N1bWVudEVycm9yTWVzc2FnZUZhY3R1cmFjaW9uJyxcclxuICAgICAgICAgICAgJ2lzTnVtZXJpYycsXHJcbiAgICAgICAgICAgICdkb2N1bWVudC1wYXR0ZXJuLWVycm9yJ1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0QWRkcmVzcyA9IGFzeW5jIChpdGVtcykgPT4geyAgICAgICAgXHJcbiAgICAgICAgY29uc3Qgbm90ZXNDZmcgPSB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCkudmlld0Zvcm1zLm5vdGVzO1xyXG4gICAgICAgIGlmIChub3Rlc0NmZy5yZXF1aXJlZCAmJiAoIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyB8fCAhdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdyZXF1aXJlZC1maWVsZHMnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBsZXQgYWRkcmVzc1NlbGVjdGVkID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZClcclxuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IGFkZHJlc3NTZWxlY3RlZC5pZCB8fCAwXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc2hpcHBpbmdBZGRyZXNzOiBhZGRyZXNzU2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdFNlZGUgPSBhd2FpdCB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLnNldEhlYWRxdWFydGVyKHJlcXVlc3QpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdFNlZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXJ0U2VydmljZS5jaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5sb3RbMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkVG9Mb3QoaXRlbS5wcm9kdWN0LCAwLCBpdGVtLnZhcmlhbnRfaWQsIDAsIGl0ZW0uaXRlbV9pZCwgaXRlbS5xdWFudGl0eSwgaXRlbS5wcm9kdWN0LnByaWNlLCBpdGVtLnF1YW50aXR5LCBpdGVtLmRpc2NvdW50LCBpdGVtLnByb2R1Y3QucHJpY2UgKiBpdGVtLnF1YW50aXR5LCAnbmV3JywgJycsICcnLCAwLCByZXN1bHRTZWRlLnNoaXBwaW5nQWRkcmVzcy5jaXR5ICsgJyAtICcgKyByZXN1bHRTZWRlLnNoaXBwaW5nQWRkcmVzcy5zdHJlZXQsICduZXdsb3QnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxyZWFkeV9kYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKClcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJykgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKCdpbnZhbGlkLWZvcm0nKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNb2RlID0gKCkgPT4ge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcykge1xyXG4gICAgICAgICAgICBjYXNlICdPTkxZX0xPQURfQUREUkVTUyc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICBjYXNlICdPTkxZX0FERFJFU1NfU0VMRUNUSU9OJzpcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICBjYXNlICdMT0FEX0FERFJFU1NfQU5EX1NFTEVDVElPTic6XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEFkZHJlc1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcnVlYmEoeCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldE1vZGUgPSAobW9kZSkgPT4gdGhpcy5zZWxlY3RBZGRyZXMgPSBtb2RlID09IFwiY2FyZ2FcIlxyXG5cclxuICAgIGdldENvdW50cnkgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5jb3VudHJpZXNMaXN0LmZpbmQocGFpc2VzID0+IHBhaXNlcy5jb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoY29kZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk/Lm5hbWUgfHwgXCJcIlxyXG5cclxuICAgIGdldFByb3ZpbmNlID0gKGNvZGUpID0+IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UucHJvdmluY2VMaXN0LmZpbmQoY3QgPT4gY3QuY29kZSA9PSBjb2RlKT8ubmFtZSB8fCBcIlwiXHJcblxyXG4gICAgZ2V0RG9jdW1lbnRUeXBlID0gKGNvZGUpID0+IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZG9jdW1lbnRUeXBlcy5maW5kKGR0ID0+IGR0LmNvZGUgPT0gY29kZSk/Lm5hbWUgfHwgXCJcIlxyXG5cclxuICAgIGdldExhYmVsTm90ZXNQYXJhbSA9ICgpID0+IHRoaXMuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCAnbGFiZWxfbm90ZXNfJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICdfJyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF0pXHJcblxyXG4gICAgZ2V0UGFyYW1CeUNoYW5uZWxBbmRMYW5ndWFnZSA9IChuYW1lUGFyYW0pID0+IHRoaXMuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCBuYW1lUGFyYW0gKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnXycgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKS5zcGxpdCgnXycpWzBdKVxyXG59XHJcbiJdfQ==
|
|
520
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBd0IsS0FBSyxFQUFrQyxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQVFoRjtJQUF5Qyx1Q0FBZTtJQTBDcEQsNkJBQW1CLFdBQXdCLEVBQ2hDLEVBQWUsRUFDZixL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LE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQzs7Z0JBcmErQixXQUFXO2dCQUM1QixXQUFXO2dCQUNSLFlBQVk7Z0JBQ0EsaUJBQWlCO2dCQUN2QixXQUFXO2dCQUNULGNBQWM7Z0JBQ2QsaUJBQWlCO2dCQUN4QixTQUFTO2dCQUNGLG9CQUFvQjs7SUFoRHJDO1FBQVIsS0FBSyxFQUFFO3dEQUFTO0lBQ1I7UUFBUixLQUFLLEVBQUU7MERBQTRCO0lBQzNCO1FBQVIsS0FBSyxFQUFFO3lEQUFvQjtJQUpuQixtQkFBbUI7UUFOL0IsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQiwrdnVEQUF5QztZQUV6QyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7O1NBQzlCLENBQUM7T0FDVyxtQkFBbUIsQ0E0ZC9CO0lBQUQsMEJBQUM7Q0FBQSxBQTVkRCxDQUF5QyxlQUFlLEdBNGR2RDtTQTVkWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvbXBvbmVudEhlbHBlciB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29tcG9uZW50LWhlbHBlcic7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBZGRyZXNzaW5nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoZWNrb3V0L2FkZHJlc3Npbmcuc2VydmljZSc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xyXG5pbXBvcnQgeyBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbC9icy1tb2RhbC1yZWYuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uLy4uL2NvcmUuY29uc3RzJztcclxuaW1wb3J0IHsgYWRkIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcclxuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wYXJhbWV0ZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDaGFubmVsQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2FwcC1kYXRhZm9ybS1lYycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ2RhdGFmb3JtLWVjLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWydkYXRhZm9ybS1lYy5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbQnNNb2RhbFNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRhRm9ybUVjQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50SGVscGVyIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBASW5wdXQoKSBzdGVwX2lkO1xyXG4gICAgQElucHV0KCkgaXNMYXN0T25lOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBuZXh0U3RlcDogRnVuY3Rpb247XHJcblxyXG4gICAgcHJvdGVjdGVkIGNvdW50cmllc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XHJcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcclxuICAgIHByb3RlY3RlZCBkb2N1bWVudFR5cGVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcclxuICAgIHByb3RlY3RlZCBjb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XHJcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xyXG4gICAgcHJvdGVjdGVkIGRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XHJcblxyXG4gICAgcHVibGljIGNvdW50cmllcyQgPSB0aGlzLmNvdW50cmllc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwdWJsaWMgcHJvdmluY2VzJCA9IHRoaXMucHJvdmluY2VzU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVzJCA9IHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwdWJsaWMgY291bnRyaWVzRmFjdHVyYWNpb24kID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwdWJsaWMgcHJvdmluY2VzRmFjdHVyYWNpb24kID0gdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwdWJsaWMgZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uJCA9IHRoaXMuZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBwdWJsaWMgcmVxdWlyZV9sb2dpbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGNoZWNrb3V0Rm9ybTogRm9ybUdyb3VwO1xyXG4gICAgcHVibGljIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uOiBGb3JtR3JvdXA7XHJcbiAgICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgcHVibGljIGZvcm1fcmVhZHkgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBhbGxyZWFkeV9kYXRhID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgYWRkcmVzc0Jvb2sgPSBbXTtcclxuICAgIHB1YmxpYyBhZGRyZXNzQm9va1NlbGVjdGVkID0geyBpZDogMCwgbm90ZXM6IFwiXCIgfVxyXG4gICAgcHVibGljIGZpbmlzaDogYm9vbGVhbiA9IGZhbHNlOyAvL0VzdGEgdmFyaWFibGUgc2UgdXNhIHBhcmEgbW9zdHJhciBlbCBib3RvbiBkZSBmaW5hbGl6YXIuXHJcblxyXG4gICAgcHVibGljIHZhbGlkYWRvID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgdmlld0RhdGFGYWN0dXJhY2lvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgcHVibGljIG1vZGFsUmVmOiBCc01vZGFsUmVmIHwgbnVsbDtcclxuICAgIHB1YmxpYyBwYXJhbXM6IGFueSA9IHt9O1xyXG4gICAgcHVibGljIHNlbGVjdEFkZHJlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBwb3N0YWxDb2RlRXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIHBvc3RhbENvZGVFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbjogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBkb2N1bWVudEVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBkb2N1bWVudEVycm9yTWVzc2FnZUZhY3R1cmFjaW9uOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIGZiOiBGb3JtQnVpbGRlcixcclxuICAgICAgICBwdWJsaWMgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgICAgICBwdWJsaWMgYWRkcmVzc2luZ1NlcnZpY2U6IEFkZHJlc3NpbmdTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBwYXJhbXNTZXJ2aWNlOiBQYXJhbWV0ZXJzU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgY29uc3RzOiBDb25zdGFudHMsXHJcbiAgICAgICAgcHVibGljIGNoYW5uZWxDb25maWc6IENoYW5uZWxDb25maWdTZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1BZGRyZXMsXHJcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0gLy8gU2UgYWdyZWdhIHBhcmEgcXVlIHPDs2xvIGFjZXB0ZSBjw7NkaWdvcyBwb3N0YWxlcyBtYXlvcmVzIHF1ZSBjZXJvXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uc3RhdHVzQ2hhbmdlc1xyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7IHRoaXMub25Gb3JtQ2hhbmdlKCk7IHJldHVybiB0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCB9KSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRm9ybVZhbGlkKCkpO1xyXG5cclxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1CaWxsaW5nLFxyXG4gICAgICAgICAgICBwb3N0Y29kZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dIC8vIFNlIGFncmVnYSBwYXJhIHF1ZSBzw7NsbyBhY2VwdGUgY8OzZGlnb3MgcG9zdGFsZXMgbWF5b3JlcyBxdWUgY2Vyb1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uc3RhdHVzQ2hhbmdlc1xyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7IHRoaXMub25Gb3JtQ2hhbmdlKCk7IHJldHVybiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkIH0pKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtVmFsaWQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXNTZXJ2aWNlLnBhcmFtZXRlcnMuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLnBhcmFtcyA9IHJlcyk7XHJcbiAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5pbml0aWFsaXplKHRoaXMuc3RlcF9pZCk7XHJcbiAgICAgICAgY29uc3QgbG9jYWxFbWFpbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtYWlsJylcclxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLnNldFZhbHVlKHRoaXMuYXV0aFNlcnZpY2UuZ2V0Q3VzdG9tZXIoKT8uZW1haWwgfHwgbG9jYWxFbWFpbCk7XHJcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXQoJ2VtYWlsJykuZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0QWRkcmVzc2luZ0RhdGEoKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjb3VudHJpZXMgPSB0aGlzLmZpbHRlckNvdW50cnlCeUNvZGUocmVzKVxyXG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QubmV4dChjb3VudHJpZXMpO1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KGNvdW50cmllcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09PSAnTE9BRF9BRERSRVNTX0FORF9TRUxFQ1RJT04nIHx8XHJcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MgPT09ICdPTkxZX0FERFJFU1NfU0VMRUNUSU9OJykge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRBZGRyZXNzQm9vaygpLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPSByZXMgfHwgbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZHJlc3NCb29rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRBZGRyZXNzID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQWRkcmVzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShzZWxlY3RlZEFkZHJlc3MuY291bnRyeUNvZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQWRkcmVzcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2NhcmdhJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb3VudHJpZXMkLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShyZXNbMF0uY29kZSlcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24ocmVzWzBdKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBQcm92aW5jaWFcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcclxuICAgICAgICAgICAgICAgICAgICByZXNbMF0/LnByb3ZpbmNlc1swXS5jb2RlXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChyZXNbMF0/LnByb3ZpbmNlcylcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBEb2N1bWVudG9cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQocmVzWzBdPy5kb2N1bWVudFR5cGVzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy5lY09uSW5pdCgpXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBmaWx0cmEgbG9zIHBhaXNlcyBkZSBhY3VlcmRvIGFsIGEgbG9zIGNvZGlnb3MgcmV0b3JuYWRvcyBlbiBsYSBmdW5jaW9uIGdldENvdW50cmllcy5cclxuICAgICAqIENhc29zIGRlIHVzb3M6IFNpIGdldENvdW50cmllcyBlcyB2YWNpbywgcmV0b3JuYSBlbCBhcnJlZ2xvIHF1ZSBpbmdyZXNhIHBvciBwYXJhbWV0cm8uXHJcbiAgICAgKiBTaSBnZXRDb3VudHJpZXMgY29udGllbmUgdmFsb3JlcyBxdWUgbm8gY29pbmNpZGVuLCByZXRvcm5hIGVsIGFycmVnbG8gcXVlIGluZ3Jlc2EgcG9yIHBhcmFtZXRyby5cclxuICAgICAqIERlIGxvIGNvbnRyYXJpbyByZXRvcm5hIGxvcyB2YWxvcmVzIGZpbHRyYWRvcy5cclxuICAgICAqIEBwYXJhbSBjb3VudHJpZXMgQXJyZWdsbyBxdWUgY29udGllbmUgbG9zIGNvdW50cmllcyByZWNpYmlkb3MgZW4gbGEgc3Vic2NyaXBjaW9uIGRlbCBvYnNlcnZhYmxlLlxyXG4gICAgICogQHJldHVybnMgdW4gYXJyZWdsbyBkZSBjb3VudHJpZXMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmlsdGVyQ291bnRyeUJ5Q29kZSA9IChjb3VudHJpZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgLy8gMS4gU2kgaGF5IHBhw61zZXMgRVhDTFVJRE9TLCBxdcOtdGFsb3Mgc2llbXByZVxyXG4gICAgICAgIGxldCBmaWx0ZXJlZCA9IGNvdW50cmllcztcclxuICAgICAgICBpZiAodGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMgJiYgdGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcihlbGVtID0+ICF0aGlzLmNvbnN0cy5leGNsdWRlZENvdW50cmllcy5pbmNsdWRlcyhlbGVtLmNvZGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gMi4gU2kgaGF5IHBhw61zZXMgSU5DTFVJRE9TLCBhcGxpY2EgZWwgZmlsdHJvIGRlIGluY2x1c2nDs25cclxuICAgICAgICBpZiAodGhpcy5jb25zdHMuZ2V0Q291bnRyaWVzKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgY291bnRyaWVzRmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoZWxlbSA9PiB0aGlzLmNvbnN0cy5nZXRDb3VudHJpZXMoKS5pbmNsdWRlcyhlbGVtLmNvZGUpKVxyXG4gICAgICAgICAgICBpZiAoY291bnRyaWVzRmlsdGVyZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50cmllc0ZpbHRlcmVkXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFbC9sb3MgY29kaWdvL3MgaW5ncmVzYWRvL3Mgbm8gY29pbmNpZGVuIGNvbiBsb3MgcHJvdmlzdG9zIGRlc2RlIGVsIGJhY2tlbmQnKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Zvcm1GYWN0dXJhY2lvbiA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gPSAhdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXHJcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvbiQuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShyZXNbMF0uY29kZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uRmFjdHVyYWNpb24ocmVzWzBdKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJvdmluY2lhXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1swXT8ucHJvdmluY2VzWzBdLmNvZGVcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChyZXNbMF0/LnByb3ZpbmNlcylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9jdW1lbnRvXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUocmVzWzBdPy5kb2N1bWVudFR5cGVzWzBdLmNvZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KHJlc1swXT8uZG9jdW1lbnRUeXBlcylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkZvcm1DaGFuZ2UoKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb25cclxuICAgIH1cclxuXHJcbiAgICBvbkZvcm1WYWxpZCA9ICgpID0+IHtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Gb3JtQ2hhbmdlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYWRvID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGFkbyA9IHRydWVcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmFsaWRhZG8gPSBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIG9uSW5wdXRDaGFuZ2UgPSAoKSA9PiB0aGlzLmZvcm1fcmVhZHkgPSBmYWxzZTtcclxuXHJcbiAgICBvbkNvdW50cnlTZWxlY3RlZCA9ICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSgnJyk7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZENvdW50cnkgPSB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9Qcm92aW5jZXNcclxuICAgICAgICBsZXQgcHJvdmluY2VzID0gdmFsdWUgJiYgdmFsdWUgIT0gJ251bGwnID9cclxuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpLnByb3ZpbmNlc1xyXG4gICAgICAgICAgICA6XHJcbiAgICAgICAgICAgIFtdXHJcbiAgICAgICAgdGhpcy5wcm92aW5jZXNTdWJqZWN0Lm5leHQocHJvdmluY2VzKTtcclxuICAgICAgICBpZiAocHJvdmluY2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUocHJvdmluY2VzWzBdLmNvZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9Eb2N1bWVudCB0eXBlc1xyXG4gICAgICAgIGxldCBkb2N1bWVudFR5cGVzID0gc2VsZWN0ZWRDb3VudHJ5ID8gc2VsZWN0ZWRDb3VudHJ5LmRvY3VtZW50VHlwZXMgOiBbXTtcclxuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQoZG9jdW1lbnRUeXBlcyk7XHJcbiAgICAgICAgaWYgKGRvY3VtZW50VHlwZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShkb2N1bWVudFR5cGVzWzBdLmNvZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlcy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWUpO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBvbkNvdW50cnlTZWxlY3RlZEZhY3R1cmFjaW9uID0gKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnbnVsbCcgPyBudWxsIDogdmFsdWUpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKCcnKTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkQ291bnRyeSA9IHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWRDb3VudHJ5KSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZENvdW50cnkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUHJvdmluY2VzXHJcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHNlbGVjdGVkQ291bnRyeSA/IHNlbGVjdGVkQ291bnRyeS5wcm92aW5jZXMgOiBbXTtcclxuICAgICAgICB0aGlzLnByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KHByb3ZpbmNlcyk7XHJcbiAgICAgICAgaWYgKHByb3ZpbmNlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUocHJvdmluY2VzWzBdLmNvZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRG9jdW1lbnQgdHlwZXNcclxuICAgICAgICBsZXQgZG9jdW1lbnRUeXBlcyA9IHNlbGVjdGVkQ291bnRyeSA/IHNlbGVjdGVkQ291bnRyeS5kb2N1bWVudFR5cGVzIDogW107XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQoZG9jdW1lbnRUeXBlcyk7XHJcbiAgICAgICAgaWYgKGRvY3VtZW50VHlwZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKGRvY3VtZW50VHlwZXNbMF0uY29kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSBkb2N1bWVudFR5cGVzLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnZhbHVlKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgb25Qcm92aW5jZXNTZWxlY3RlZCA9ICh2YWx1ZSkgPT4gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XHJcblxyXG4gICAgb25Qcm92aW5jZXNTZWxlY3RlZEZhY3R1cmFjaW9uID0gKHZhbHVlKSA9PiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnbnVsbCcgPyBudWxsIDogdmFsdWUpO1xyXG5cclxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHZhbHVlID09ICcnID8gJycgOiB2YWx1ZSk7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZERvY3VtZW50VHlwZSA9IHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QudmFsdWUuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgb25Eb2N1bWVudFR5cGVzU2VsZWN0ZWRGYWN0dXJhY2lvbiA9ICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHZhbHVlID09ICcnID8gJycgOiB2YWx1ZSk7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZERvY3VtZW50VHlwZSA9IHRoaXMuZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdC52YWx1ZS5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB2YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHZlcmlmeVZhbGlkYXRlID0gYXN5bmMgKGUsIGl0ZW1zKSA9PiB7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIlZlcmlmeWluZzogXCIsIGUpXHJcbiAgICAgICAgdGhpcy5yZXF1aXJlX2xvZ2luID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUoZSk7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgJiYgdGhpcy5jaGVja291dEZvcm0uZ2V0KCdlbWFpbCcpLmRpc2FibGUoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xyXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5jYXJ0U2VydmljZS5jaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3Qpe1xyXG4gICAgICAgICAgICAvLyAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgLy8gICAgICAgaWYgKCFpdGVtLmxvdFswXSl7XHJcbiAgICAgICAgICAgIC8vICAgICAgLy8gICAgY29uc29sZS5sb2codGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXVsndmFsdWUnXSlcclxuICAgICAgICAgICAgLy8gICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsMCxpdGVtLnZhcmlhbnRfaWQsMCxpdGVtLml0ZW1faWQsaXRlbS5xdWFudGl0eSxpdGVtLnByb2R1Y3QucHJpY2UsaXRlbS5xdWFudGl0eSxpdGVtLmRpc2NvdW50LGl0ZW0ucHJvZHVjdC5wcmljZSppdGVtLnF1YW50aXR5LCduZXcnLCcnLCcnLDAsdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXVsndmFsdWUnXSsgJyAtICcgKyB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snc3RyZWV0J11bJ3ZhbHVlJ10sICduZXdsb3QnKTtcclxuICAgICAgICAgICAgLy8gICAgICAgfVxyXG4gICAgICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc3VsdCgpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Vycm9yID0gKGVycm9yX21lc3NhZ2UpID0+IHsgdGhpcy50b2FzdC5zaG93KGVycm9yX21lc3NhZ2UpOyByZXR1cm4gdHJ1ZTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBlbWl0UmVzdWx0ID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgbGV0IGRhdGE6IGFueSA9IHsgc2hpcHBpbmdBZGRyZXNzOiB7IC4uLnRoaXMuY2hlY2tvdXRGb3JtLmdldFJhd1ZhbHVlKCksIHBob25lTnVtYmVyOiB0aGlzLmNoZWNrb3V0Rm9ybS52YWx1ZS5waG9uZU51bWJlci50b1N0cmluZygpIH0sIG5vdGVzOiAodGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKSkubm90ZXMgfTtcclxuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSBkYXRhID0geyAuLi5kYXRhLCBub3RlczogZGF0YS5ub3RlcywgYmlsbGluZ0FkZHJlc3M6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLnNldEFkZHJlc3MoZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlX2xvZ2luID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnZW1haWxfYWxyZWFkeV9yZWdpc3RlcmVkJylcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9PSBmYWxzZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxyZWFkeV9kYXRhID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpIH1cclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuTW9kYWwodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcclxuICAgICAgICB0aGlzLm1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyh0ZW1wbGF0ZSwgeyBjbGFzczogJ21vZGFsLWxnICcsIGtleWJvYXJkOiBmYWxzZSwgYmFja2Ryb3A6ICdzdGF0aWMnIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNlbGVjdEFkZHJlc3MgPSAoYWRkcmVzc1NlbGVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9vay5tYXAoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkID0gYWRkcmVzcy5pZCA9PT0gYWRkcmVzc1NlbGVjdC5pZClcclxuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKS5pZCB8fCAwXHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlVmFsaWRhdGlvbihcclxuICAgICAgICBzZWxlY3RlZEl0ZW06IGFueSxcclxuICAgICAgICBmb3JtQ29udHJvbE5hbWU6IHN0cmluZyxcclxuICAgICAgICBmb3JtOiBhbnksXHJcbiAgICAgICAgZXJyb3JNZXNzYWdlVmFyOiBzdHJpbmcsXHJcbiAgICAgICAgaXNOdW1lcmljS2V5OiBzdHJpbmcsXHJcbiAgICAgICAgZXJyb3JLZXlQcmVmaXg6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZEl0ZW0pIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgaXNOdW1lcmljID0gc2VsZWN0ZWRJdGVtW2lzTnVtZXJpY0tleV0gPz8gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IGlzTnVtZXJpYyA/IC9eXFxkKyQvIDogLy4qLztcclxuICAgICAgICB0aGlzW2Vycm9yTWVzc2FnZVZhcl0gPSBpc051bWVyaWMgPyBgJHtlcnJvcktleVByZWZpeH0ubnVtZXJpY2AgOiBgJHtlcnJvcktleVByZWZpeH0uZGVmYXVsdGA7XHJcblxyXG4gICAgICAgIGZvcm0uY29udHJvbHNbZm9ybUNvbnRyb2xOYW1lXS5zZXRWYWxpZGF0b3JzKFtcclxuICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgICAgVmFsaWRhdG9ycy5wYXR0ZXJuKHBhdHRlcm4pXHJcbiAgICAgICAgXSk7XHJcbiAgICAgICAgZm9ybS5jb250cm9sc1tmb3JtQ29udHJvbE5hbWVdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcclxuICAgICAgICAgICAgc2VsZWN0ZWRDb3VudHJ5LFxyXG4gICAgICAgICAgICAncG9zdGNvZGUnLFxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybSxcclxuICAgICAgICAgICAgJ3Bvc3RhbENvZGVFcnJvck1lc3NhZ2UnLFxyXG4gICAgICAgICAgICAnaXNQb3N0YWxDb2RlTnVtZXJpYycsXHJcbiAgICAgICAgICAgICdwb3N0YWwtY29kZS1wYXR0ZXJuLWVycm9yJ1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcclxuICAgICAgICAgICAgc2VsZWN0ZWRDb3VudHJ5LFxyXG4gICAgICAgICAgICAncG9zdGNvZGUnLFxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLFxyXG4gICAgICAgICAgICAncG9zdGFsQ29kZUVycm9yTWVzc2FnZUZhY3R1cmFjaW9uJyxcclxuICAgICAgICAgICAgJ2lzUG9zdGFsQ29kZU51bWVyaWMnLFxyXG4gICAgICAgICAgICAncG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvcidcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihzZWxlY3RlZERvY3VtZW50VHlwZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9uKFxyXG4gICAgICAgICAgICBzZWxlY3RlZERvY3VtZW50VHlwZSxcclxuICAgICAgICAgICAgJ2RvY3VtZW50TnVtYmVyJyxcclxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0sXHJcbiAgICAgICAgICAgICdkb2N1bWVudEVycm9yTWVzc2FnZScsXHJcbiAgICAgICAgICAgICdpc051bWVyaWMnLFxyXG4gICAgICAgICAgICAnZG9jdW1lbnQtcGF0dGVybi1lcnJvcidcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oXHJcbiAgICAgICAgICAgIHNlbGVjdGVkRG9jdW1lbnRUeXBlLFxyXG4gICAgICAgICAgICAnZG9jdW1lbnROdW1iZXInLFxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLFxyXG4gICAgICAgICAgICAnZG9jdW1lbnRFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbicsXHJcbiAgICAgICAgICAgICdpc051bWVyaWMnLFxyXG4gICAgICAgICAgICAnZG9jdW1lbnQtcGF0dGVybi1lcnJvcidcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdEFkZHJlc3MgPSBhc3luYyAoaXRlbXMpID0+IHtcclxuICAgICAgICBjb25zdCBub3Rlc0NmZyA9IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMubm90ZXM7XHJcbiAgICAgICAgaWYgKG5vdGVzQ2ZnLnJlcXVpcmVkICYmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMudHJpbSgpKSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ3JlcXVpcmVkLWZpZWxkcycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGxldCBhZGRyZXNzU2VsZWN0ZWQgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKVxyXG4gICAgICAgIGlmIChhZGRyZXNzU2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gYWRkcmVzc1NlbGVjdGVkLmlkIHx8IDBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZCxcclxuICAgICAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3M6IGFkZHJlc3NTZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0U2VkZSA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0SGVhZHF1YXJ0ZXIocmVxdWVzdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0U2VkZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgMCwgaXRlbS5pdGVtX2lkLCBpdGVtLnF1YW50aXR5LCBpdGVtLnByb2R1Y3QucHJpY2UsIGl0ZW0ucXVhbnRpdHksIGl0ZW0uZGlzY291bnQsIGl0ZW0ucHJvZHVjdC5wcmljZSAqIGl0ZW0ucXVhbnRpdHksICduZXcnLCAnJywgJycsIDAsIHJlc3VsdFNlZGUuc2hpcHBpbmdBZGRyZXNzLmNpdHkgKyAnIC0gJyArIHJlc3VsdFNlZGUuc2hpcHBpbmdBZGRyZXNzLnN0cmVldCwgJ25ld2xvdCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKSB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE1vZGUgPSAoKSA9PiB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfTE9BRF9BRERSRVNTJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfQUREUkVTU19TRUxFQ1RJT04nOlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgICAgIGNhc2UgJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJzpcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QWRkcmVzXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHBydWViYSh4KSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coeCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TW9kZSA9IChtb2RlKSA9PiB0aGlzLnNlbGVjdEFkZHJlcyA9IG1vZGUgPT0gXCJjYXJnYVwiXHJcblxyXG4gICAgZ2V0Q291bnRyeSA9IChjb2RlKSA9PiB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmNvdW50cmllc0xpc3QuZmluZChwYWlzZXMgPT4gcGFpc2VzLmNvZGUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyhjb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkpKT8ubmFtZSB8fCBcIlwiXHJcblxyXG4gICAgZ2V0UHJvdmluY2UgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5wcm92aW5jZUxpc3QuZmluZChjdCA9PiBjdC5jb2RlID09IGNvZGUpPy5uYW1lIHx8IFwiXCJcclxuXHJcbiAgICBnZXREb2N1bWVudFR5cGUgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5kb2N1bWVudFR5cGVzLmZpbmQoZHQgPT4gZHQuY29kZSA9PSBjb2RlKT8ubmFtZSB8fCBcIlwiXHJcblxyXG4gICAgZ2V0TGFiZWxOb3Rlc1BhcmFtID0gKCkgPT4gdGhpcy5oYXNQYXJhbXModGhpcy5wYXJhbXMsICdsYWJlbF9ub3Rlc18nICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJ18nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCkuc3BsaXQoJ18nKVswXSlcclxuXHJcbiAgICBnZXRQYXJhbUJ5Q2hhbm5lbEFuZExhbmd1YWdlID0gKG5hbWVQYXJhbSkgPT4gdGhpcy5oYXNQYXJhbXModGhpcy5wYXJhbXMsIG5hbWVQYXJhbSArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICdfJyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF0pXHJcbn1cclxuIl19
|