@qbs-origin/origin-form 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/lib/action-step-handler.mjs +163 -0
- package/esm2022/lib/auth-client.service.mjs +69 -0
- package/esm2022/lib/enums/label.keys.mjs +721 -0
- package/esm2022/lib/form-css.helper.mjs +367 -0
- package/esm2022/lib/formly/baseFormlyControlComponent.mjs +52 -0
- package/esm2022/lib/formly/baseFormlyStepComponent.mjs +59 -0
- package/esm2022/lib/formly/custom-section-separator.component.mjs +32 -0
- package/esm2022/lib/formly/form-section-separator.component.mjs +36 -0
- package/esm2022/lib/formly/formly-action.mjs +56 -0
- package/esm2022/lib/formly/formly-checkbox/formly-checkbox.component.mjs +52 -0
- package/esm2022/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.mjs +261 -0
- package/esm2022/lib/formly/formly-download-documents/formly-download-documents.component.mjs +126 -0
- package/esm2022/lib/formly/formly-enrol-card/formly-enrol-card.component.mjs +120 -0
- package/esm2022/lib/formly/formly-field-stepper/formly-field-stepper.component.mjs +762 -0
- package/esm2022/lib/formly/formly-generate-documents/formly-generate-documents.component.mjs +57 -0
- package/esm2022/lib/formly/formly-identification.component.mjs +84 -0
- package/esm2022/lib/formly/formly-open-banking/formly-open-banking.component.mjs +590 -0
- package/esm2022/lib/formly/formly-paragraph/formly-paragraph.component.mjs +35 -0
- package/esm2022/lib/formly/formly-radio/formly-radio-component.mjs +49 -0
- package/esm2022/lib/formly/formly-row-fille.mjs +12 -0
- package/esm2022/lib/formly/formly-scan-id/formly-scan-id.component.mjs +284 -0
- package/esm2022/lib/formly/formly-sign/formly-sign.component.mjs +173 -0
- package/esm2022/lib/formly/formly-upload-documents/formly-upload-documents.component.mjs +198 -0
- package/esm2022/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.mjs +124 -0
- package/esm2022/lib/formly/formly-view-documents/formly-view-documents.component.mjs +245 -0
- package/esm2022/lib/formly/formly-view-offers/formly-view-offers.component.mjs +160 -0
- package/esm2022/lib/model-population.helper.mjs +265 -0
- package/esm2022/lib/models/application-type.model.mjs +12 -0
- package/esm2022/lib/models/application.model.mjs +30 -0
- package/esm2022/lib/models/auth/users.model.mjs +2 -0
- package/esm2022/lib/models/dictionary.model.mjs +20 -0
- package/esm2022/lib/models/flux.model.mjs +105 -0
- package/esm2022/lib/models/forms.model.mjs +572 -0
- package/esm2022/lib/models/label-info.model.mjs +2 -0
- package/esm2022/lib/models/label.model.mjs +2 -0
- package/esm2022/lib/models/language.model.mjs +3 -0
- package/esm2022/lib/models/list.model.mjs +2 -0
- package/esm2022/lib/models/partner.model.mjs +3 -0
- package/esm2022/lib/models/treeview.model.mjs +15 -0
- package/esm2022/lib/origin-form-auth.service.mjs +40 -0
- package/esm2022/lib/origin-form-config.model.mjs +2 -0
- package/esm2022/lib/origin-form-token.interceptor.mjs +35 -0
- package/esm2022/lib/origin-form.component.mjs +2391 -0
- package/esm2022/lib/origin-form.module.mjs +479 -0
- package/esm2022/lib/origin-form.service.mjs +14 -0
- package/esm2022/lib/others/check-list.database.mjs +55 -0
- package/esm2022/lib/others/config-service.mjs +42 -0
- package/esm2022/lib/others/dictionary-label-info.mjs +3 -0
- package/esm2022/lib/others/environment-type.mjs +21 -0
- package/esm2022/lib/others/external-link.directive.mjs +49 -0
- package/esm2022/lib/others/flux-helper.mjs +1397 -0
- package/esm2022/lib/others/picker.component.mjs +119 -0
- package/esm2022/lib/others/translation.pipe.mjs +21 -0
- package/esm2022/lib/others/translations-helper.mjs +258 -0
- package/esm2022/lib/others/utils.mjs +272 -0
- package/esm2022/lib/services/applicationData.service.mjs +145 -0
- package/esm2022/lib/services/auth-http.service.mjs +80 -0
- package/esm2022/lib/services/dialog.service.mjs +56 -0
- package/esm2022/lib/services/dictionary.service.mjs +198 -0
- package/esm2022/lib/services/forms.service.mjs +47 -0
- package/esm2022/lib/services/labels.service.mjs +29 -0
- package/esm2022/lib/services/language.service.mjs +24 -0
- package/esm2022/lib/services/open-banking.service.mjs +194 -0
- package/esm2022/lib/services/origin-form-signalr-handler.service.mjs +107 -0
- package/esm2022/lib/services/origin-form-signalr.service.mjs +105 -0
- package/esm2022/lib/services/otp.service.mjs +28 -0
- package/esm2022/lib/services/proxy.service.mjs +79 -0
- package/esm2022/lib/services/scroll-to-error.service.mjs +369 -0
- package/esm2022/lib/services/translation.service.mjs +27 -0
- package/esm2022/lib/shared-components/confirmation.component.mjs +34 -0
- package/esm2022/lib/shared-components/dictionaries-tree.component.mjs +301 -0
- package/esm2022/lib/shared-components/grid.component.mjs +241 -0
- package/esm2022/lib/shared-components/treeview/treeview.component.mjs +224 -0
- package/esm2022/lib/theme-css.mjs +2254 -0
- package/esm2022/lib/theme-injector.service.mjs +26 -0
- package/esm2022/public-api.mjs +4 -0
- package/esm2022/qbs-origin-origin-form.mjs +5 -0
- package/fesm2022/qbs-origin-origin-form.mjs +15215 -0
- package/fesm2022/qbs-origin-origin-form.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/action-step-handler.d.ts +49 -0
- package/lib/auth-client.service.d.ts +17 -0
- package/lib/enums/label.keys.d.ts +720 -0
- package/lib/form-css.helper.d.ts +28 -0
- package/lib/formly/baseFormlyControlComponent.d.ts +25 -0
- package/lib/formly/baseFormlyStepComponent.d.ts +29 -0
- package/lib/formly/custom-section-separator.component.d.ts +6 -0
- package/lib/formly/form-section-separator.component.d.ts +10 -0
- package/lib/formly/formly-action.d.ts +13 -0
- package/lib/formly/formly-checkbox/formly-checkbox.component.d.ts +15 -0
- package/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.d.ts +45 -0
- package/lib/formly/formly-download-documents/formly-download-documents.component.d.ts +22 -0
- package/lib/formly/formly-enrol-card/formly-enrol-card.component.d.ts +114 -0
- package/lib/formly/formly-field-stepper/formly-field-stepper.component.d.ts +79 -0
- package/lib/formly/formly-generate-documents/formly-generate-documents.component.d.ts +17 -0
- package/lib/formly/formly-identification.component.d.ts +19 -0
- package/lib/formly/formly-open-banking/formly-open-banking.component.d.ts +119 -0
- package/lib/formly/formly-paragraph/formly-paragraph.component.d.ts +10 -0
- package/lib/formly/formly-radio/formly-radio-component.d.ts +15 -0
- package/lib/formly/formly-row-fille.d.ts +6 -0
- package/lib/formly/formly-scan-id/formly-scan-id.component.d.ts +41 -0
- package/lib/formly/formly-sign/formly-sign.component.d.ts +36 -0
- package/lib/formly/formly-upload-documents/formly-upload-documents.component.d.ts +25 -0
- package/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.d.ts +79 -0
- package/lib/formly/formly-view-documents/formly-view-documents.component.d.ts +33 -0
- package/lib/formly/formly-view-offers/formly-view-offers.component.d.ts +23 -0
- package/lib/model-population.helper.d.ts +8 -0
- package/lib/models/application-type.model.d.ts +27 -0
- package/lib/models/application.model.d.ts +107 -0
- package/lib/models/auth/users.model.d.ts +20 -0
- package/lib/models/dictionary.model.d.ts +77 -0
- package/lib/models/flux.model.d.ts +101 -0
- package/lib/models/forms.model.d.ts +504 -0
- package/lib/models/label-info.model.d.ts +10 -0
- package/lib/models/label.model.d.ts +4 -0
- package/lib/models/language.model.d.ts +5 -0
- package/lib/models/list.model.d.ts +8 -0
- package/lib/models/partner.model.d.ts +12 -0
- package/lib/models/treeview.model.d.ts +17 -0
- package/lib/origin-form-auth.service.d.ts +15 -0
- package/lib/origin-form-config.model.d.ts +12 -0
- package/lib/origin-form-token.interceptor.d.ts +12 -0
- package/lib/origin-form.component.d.ts +231 -0
- package/lib/origin-form.module.d.ts +84 -0
- package/lib/origin-form.service.d.ts +6 -0
- package/lib/others/check-list.database.d.ts +16 -0
- package/lib/others/config-service.d.ts +22 -0
- package/lib/others/dictionary-label-info.d.ts +6 -0
- package/lib/others/environment-type.d.ts +8 -0
- package/lib/others/external-link.directive.d.ts +12 -0
- package/lib/others/flux-helper.d.ts +115 -0
- package/lib/others/picker.component.d.ts +36 -0
- package/lib/others/translation.pipe.d.ts +10 -0
- package/lib/others/translations-helper.d.ts +31 -0
- package/lib/others/utils.d.ts +37 -0
- package/lib/services/applicationData.service.d.ts +35 -0
- package/lib/services/auth-http.service.d.ts +21 -0
- package/lib/services/dialog.service.d.ts +20 -0
- package/lib/services/dictionary.service.d.ts +89 -0
- package/lib/services/forms.service.d.ts +17 -0
- package/lib/services/labels.service.d.ts +13 -0
- package/lib/services/language.service.d.ts +14 -0
- package/lib/services/open-banking.service.d.ts +137 -0
- package/lib/services/origin-form-signalr-handler.service.d.ts +29 -0
- package/lib/services/origin-form-signalr.service.d.ts +24 -0
- package/lib/services/otp.service.d.ts +22 -0
- package/lib/services/proxy.service.d.ts +29 -0
- package/lib/services/scroll-to-error.service.d.ts +54 -0
- package/lib/services/translation.service.d.ts +10 -0
- package/lib/shared-components/confirmation.component.d.ts +77 -0
- package/lib/shared-components/dictionaries-tree.component.d.ts +51 -0
- package/lib/shared-components/grid.component.d.ts +138 -0
- package/lib/shared-components/treeview/treeview.component.d.ts +121 -0
- package/lib/theme-css.d.ts +2 -0
- package/lib/theme-injector.service.d.ts +8 -0
- package/package.json +42 -0
- package/public-api.d.ts +3 -0
- package/schematics-compiled/collection.json +10 -0
- package/schematics-compiled/ng-add/index.d.ts +2 -0
- package/schematics-compiled/ng-add/index.js +67 -0
- package/schematics-compiled/ng-add/index.js.map +1 -0
- package/schematics-compiled/ng-add/schema.json +8 -0
- package/src/lib/assets/fonts/Figtree-Bold.ttf +0 -0
- package/src/lib/assets/fonts/Figtree-Light.ttf +0 -0
- package/src/lib/assets/fonts/Figtree-Regular.ttf +0 -0
- package/src/lib/assets/fonts/Sora-ExtraBold.ttf +0 -0
- package/src/lib/assets/fonts/Sora-Light.ttf +0 -0
- package/src/lib/assets/fonts/Sora-Regular.ttf +0 -0
- package/src/lib/assets/fonts/ttrounds-bold-webfont.woff +0 -0
- package/src/lib/assets/fonts/ttrounds-bold-webfont.woff2 +0 -0
- package/src/lib/assets/fonts/ttrounds-regular-webfont.woff +0 -0
- package/src/lib/assets/fonts/ttrounds-regular-webfont.woff2 +0 -0
- package/src/lib/assets/fonts/ttrounds-thin-webfont.woff +0 -0
- package/src/lib/assets/fonts/ttrounds-thin-webfont.woff2 +0 -0
- package/src/lib/assets/images/flag/icon-flag-de.svg +10 -0
- package/src/lib/assets/images/flag/icon-flag-en.svg +1 -0
- package/src/lib/assets/images/flag/icon-flag-es.svg +11 -0
- package/src/lib/assets/images/flag/icon-flag-fr.svg +1 -0
- package/src/lib/assets/images/flag/icon-flag-ro.svg +11 -0
- package/src/lib/assets/images/flag/origin-form/new-id-card.png +0 -0
- package/src/lib/assets/images/flag/origin-form/old-id-card.png +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { BaseFormlyStepComponent } from '../baseFormlyStepComponent';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
import * as i2 from "../../others/external-link.directive";
|
|
6
|
+
export class FormlyParagraphComponent extends BaseFormlyStepComponent {
|
|
7
|
+
onInit() {
|
|
8
|
+
this.cssMargins = {
|
|
9
|
+
'margin-top': this.props?.['design']?.['.component-text-field']?.['margin-top'],
|
|
10
|
+
'margin-right': this.props?.['design']?.['.component-text-field']?.['margin-right'],
|
|
11
|
+
'margin-bottom': this.props?.['design']?.['.component-text-field']?.['margin-bottom'],
|
|
12
|
+
'margin-left': this.props?.['design']?.['.component-text-field']?.['margin-left'],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
get formattedLabel() {
|
|
16
|
+
return this.formatDateIfNeeded(this.field.defaultValue).toString();
|
|
17
|
+
}
|
|
18
|
+
formatDateIfNeeded(value) {
|
|
19
|
+
if (!value)
|
|
20
|
+
return '';
|
|
21
|
+
let cleanValue = value.toString().trim();
|
|
22
|
+
// cast eg: "Fri Feb 14 2025 00:00:00 GMT+0200" → "2025-02-14"
|
|
23
|
+
if (/^\w{3} \w{3} \d{1,2} \d{4} \d{2}:\d{2}:\d{2} GMT[\+\-]\d{4}/.test(cleanValue)) {
|
|
24
|
+
return new Date(cleanValue).toISOString().split('T')[0];
|
|
25
|
+
}
|
|
26
|
+
return cleanValue;
|
|
27
|
+
}
|
|
28
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyParagraphComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
29
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyParagraphComponent, selector: "formly-paragraph", usesInheritance: true, ngImport: i0, template: "<div\n class=\"mat-mdc-text-field-wrapper formly-paragraph\"\n [class.hasLabel]=\"title\"\n [ngStyle]=\"cssMargins\"\n appExternalLink\n>\n\n <ng-container *ngIf=\"props['controlType'] === 'Paragraph'\">\n <p *ngIf=\"props['translatedParagraphTitle']\" [ngStyle]=\"props['design']['.font-label']\">\n {{ props['translatedParagraphTitle'] }}\n </p>\n <p *ngIf=\"props['translatedDescription']\" [ngStyle]=\"props['design']['.font-paragraph']\">\n {{ props['translatedDescription'] }}\n </p>\n </ng-container>\n\n <ng-container *ngIf=\"props['controlType'] !== 'Paragraph'\">\n <div\n class=\"component-text-field\"\n *ngIf=\"field?.defaultValue !== undefined && field?.defaultValue !== null\"\n >\n <p [ngStyle]=\"props['design']['.font-label']\">\n {{ field.props?.label }}\n </p>\n <p [ngStyle]=\"props['design']['.font-paragraph']\">\n {{ field.defaultValue }}\n </p>\n </div>\n </ng-container>\n</div>\n", styles: [".formly-paragraph{border:none!important;background:none!important;padding:0;display:block}.formly-paragraph label{display:block}.formly-paragraph.hasLabel p{margin-top:.5rem}.mat-mdc-text-field-wrapper.formly-paragraph{padding:8px 16px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.ExternalLinkDirective, selector: "[appExternalLink]" }] }); }
|
|
30
|
+
}
|
|
31
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyParagraphComponent, decorators: [{
|
|
32
|
+
type: Component,
|
|
33
|
+
args: [{ selector: 'formly-paragraph', template: "<div\n class=\"mat-mdc-text-field-wrapper formly-paragraph\"\n [class.hasLabel]=\"title\"\n [ngStyle]=\"cssMargins\"\n appExternalLink\n>\n\n <ng-container *ngIf=\"props['controlType'] === 'Paragraph'\">\n <p *ngIf=\"props['translatedParagraphTitle']\" [ngStyle]=\"props['design']['.font-label']\">\n {{ props['translatedParagraphTitle'] }}\n </p>\n <p *ngIf=\"props['translatedDescription']\" [ngStyle]=\"props['design']['.font-paragraph']\">\n {{ props['translatedDescription'] }}\n </p>\n </ng-container>\n\n <ng-container *ngIf=\"props['controlType'] !== 'Paragraph'\">\n <div\n class=\"component-text-field\"\n *ngIf=\"field?.defaultValue !== undefined && field?.defaultValue !== null\"\n >\n <p [ngStyle]=\"props['design']['.font-label']\">\n {{ field.props?.label }}\n </p>\n <p [ngStyle]=\"props['design']['.font-paragraph']\">\n {{ field.defaultValue }}\n </p>\n </div>\n </ng-container>\n</div>\n", styles: [".formly-paragraph{border:none!important;background:none!important;padding:0;display:block}.formly-paragraph label{display:block}.formly-paragraph.hasLabel p{margin-top:.5rem}.mat-mdc-text-field-wrapper.formly-paragraph{padding:8px 16px}\n"] }]
|
|
34
|
+
}] });
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXBhcmFncmFwaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL2Zvcm1seS9mb3JtbHktcGFyYWdyYXBoL2Zvcm1seS1wYXJhZ3JhcGguY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXBhcmFncmFwaC9mb3JtbHktcGFyYWdyYXBoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFPckUsTUFBTSxPQUFPLHdCQUF5QixTQUFRLHVCQUF1QjtJQUcxRCxNQUFNO1FBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixZQUFZLEVBQ1YsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUNuRSxjQUFjLEVBQ1osSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUNyRSxlQUFlLEVBQ2IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUN0RSxhQUFhLEVBQ1gsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztTQUNyRSxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JFLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxLQUFVO1FBQ25DLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFdEIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXpDLDhEQUE4RDtRQUM5RCxJQUNFLDZEQUE2RCxDQUFDLElBQUksQ0FDaEUsVUFBVSxDQUNYLEVBQ0QsQ0FBQztZQUNELE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDOytHQW5DVSx3QkFBd0I7bUdBQXhCLHdCQUF3QiwrRUNSckMsKzlCQThCQTs7NEZEdEJhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDRSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhc2VGb3JtbHlTdGVwQ29tcG9uZW50IH0gZnJvbSAnLi4vYmFzZUZvcm1seVN0ZXBDb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmb3JtbHktcGFyYWdyYXBoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm1seS1wYXJhZ3JhcGguY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZm9ybWx5LXBhcmFncmFwaC5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seVBhcmFncmFwaENvbXBvbmVudCBleHRlbmRzIEJhc2VGb3JtbHlTdGVwQ29tcG9uZW50IHtcbiAgY3NzTWFyZ2luczogYW55O1xuXG4gIG92ZXJyaWRlIG9uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNzc01hcmdpbnMgPSB7XG4gICAgICAnbWFyZ2luLXRvcCc6XG4gICAgICAgIHRoaXMucHJvcHM/LlsnZGVzaWduJ10/LlsnLmNvbXBvbmVudC10ZXh0LWZpZWxkJ10/LlsnbWFyZ2luLXRvcCddLFxuICAgICAgJ21hcmdpbi1yaWdodCc6XG4gICAgICAgIHRoaXMucHJvcHM/LlsnZGVzaWduJ10/LlsnLmNvbXBvbmVudC10ZXh0LWZpZWxkJ10/LlsnbWFyZ2luLXJpZ2h0J10sXG4gICAgICAnbWFyZ2luLWJvdHRvbSc6XG4gICAgICAgIHRoaXMucHJvcHM/LlsnZGVzaWduJ10/LlsnLmNvbXBvbmVudC10ZXh0LWZpZWxkJ10/LlsnbWFyZ2luLWJvdHRvbSddLFxuICAgICAgJ21hcmdpbi1sZWZ0JzpcbiAgICAgICAgdGhpcy5wcm9wcz8uWydkZXNpZ24nXT8uWycuY29tcG9uZW50LXRleHQtZmllbGQnXT8uWydtYXJnaW4tbGVmdCddLFxuICAgIH07XG4gIH1cblxuICBnZXQgZm9ybWF0dGVkTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlSWZOZWVkZWQodGhpcy5maWVsZC5kZWZhdWx0VmFsdWUpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdERhdGVJZk5lZWRlZCh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XG5cbiAgICBsZXQgY2xlYW5WYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpO1xuXG4gICAgLy8gY2FzdCBlZzogXCJGcmkgRmViIDE0IDIwMjUgMDA6MDA6MDAgR01UKzAyMDBcIiDihpIgXCIyMDI1LTAyLTE0XCJcbiAgICBpZiAoXG4gICAgICAvXlxcd3szfSBcXHd7M30gXFxkezEsMn0gXFxkezR9IFxcZHsyfTpcXGR7Mn06XFxkezJ9IEdNVFtcXCtcXC1dXFxkezR9Ly50ZXN0KFxuICAgICAgICBjbGVhblZhbHVlXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoY2xlYW5WYWx1ZSkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBjbGVhblZhbHVlO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwibWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXIgZm9ybWx5LXBhcmFncmFwaFwiXG4gIFtjbGFzcy5oYXNMYWJlbF09XCJ0aXRsZVwiXG4gIFtuZ1N0eWxlXT1cImNzc01hcmdpbnNcIlxuICBhcHBFeHRlcm5hbExpbmtcbj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvcHNbJ2NvbnRyb2xUeXBlJ10gPT09ICdQYXJhZ3JhcGgnXCI+XG4gICAgPHAgKm5nSWY9XCJwcm9wc1sndHJhbnNsYXRlZFBhcmFncmFwaFRpdGxlJ11cIiBbbmdTdHlsZV09XCJwcm9wc1snZGVzaWduJ11bJy5mb250LWxhYmVsJ11cIj5cbiAgICAgIHt7IHByb3BzWyd0cmFuc2xhdGVkUGFyYWdyYXBoVGl0bGUnXSB9fVxuICAgIDwvcD5cbiAgICA8cCAqbmdJZj1cInByb3BzWyd0cmFuc2xhdGVkRGVzY3JpcHRpb24nXVwiIFtuZ1N0eWxlXT1cInByb3BzWydkZXNpZ24nXVsnLmZvbnQtcGFyYWdyYXBoJ11cIj5cbiAgICAgIHt7IHByb3BzWyd0cmFuc2xhdGVkRGVzY3JpcHRpb24nXSB9fVxuICAgIDwvcD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BzWydjb250cm9sVHlwZSddICE9PSAnUGFyYWdyYXBoJ1wiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY29tcG9uZW50LXRleHQtZmllbGRcIlxuICAgICAgKm5nSWY9XCJmaWVsZD8uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgZmllbGQ/LmRlZmF1bHRWYWx1ZSAhPT0gbnVsbFwiXG4gICAgPlxuICAgICAgPHAgW25nU3R5bGVdPVwicHJvcHNbJ2Rlc2lnbiddWycuZm9udC1sYWJlbCddXCI+XG4gICAgICAgIHt7IGZpZWxkLnByb3BzPy5sYWJlbCB9fVxuICAgICAgPC9wPlxuICAgICAgPHAgW25nU3R5bGVdPVwicHJvcHNbJ2Rlc2lnbiddWycuZm9udC1wYXJhZ3JhcGgnXVwiPlxuICAgICAgICB7eyBmaWVsZC5kZWZhdWx0VmFsdWUgfX1cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { FieldType } from '@ngx-formly/core';
|
|
3
|
+
import { FormControl } from '@angular/forms';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
import * as i2 from "ngx-markdown";
|
|
7
|
+
import * as i3 from "@angular/material/radio";
|
|
8
|
+
import * as i4 from "@ngx-formly/core";
|
|
9
|
+
import * as i5 from "../../others/external-link.directive";
|
|
10
|
+
export class FormlyRadioComponent extends FieldType {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments);
|
|
13
|
+
this.radioOptionsList = [];
|
|
14
|
+
this.title = '';
|
|
15
|
+
this.langIso = 'en';
|
|
16
|
+
}
|
|
17
|
+
ngOnInit() {
|
|
18
|
+
this.langIso = this.props['currentLanguageIso'];
|
|
19
|
+
this.title = this.props['label'] || '';
|
|
20
|
+
if (Array.isArray(this.to.options)) {
|
|
21
|
+
this.radioOptionsList = this.to.options;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
get formControl() {
|
|
25
|
+
if (this.field.key) {
|
|
26
|
+
const keyPath = typeof this.field.key === 'string' || Array.isArray(this.field.key)
|
|
27
|
+
? this.field.key
|
|
28
|
+
: String(this.field.key);
|
|
29
|
+
return this.form.get(keyPath);
|
|
30
|
+
}
|
|
31
|
+
return new FormControl();
|
|
32
|
+
}
|
|
33
|
+
onRadioChange(e) {
|
|
34
|
+
const selected = this.radioOptionsList.find((opt) => opt.value.id === e.value);
|
|
35
|
+
if (selected) {
|
|
36
|
+
this.formControl.setValue(selected.value);
|
|
37
|
+
if (this.props['onSelectedValueChanged']) {
|
|
38
|
+
this.props['onSelectedValueChanged'](selected.value);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyRadioComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
43
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyRadioComponent, selector: "formly-radio", usesInheritance: true, ngImport: i0, template: "<div class=\"mat-mdc-text-field-wrapper mdc-radiobox-field\" appExternalLink>\n <label>\n <markdown [data]=\"title\"></markdown>\n </label>\n <div *ngIf=\"radioOptionsList.length > 0\">\n <mat-radio-group [value]=\"formControl.value?.id\"\n (change)=\"onRadioChange($event)\">\n <ng-container *ngFor=\"let option of radioOptionsList\">\n <div>\n <mat-radio-button [value]=\"option.value.id\">\n {{ option.label }}\n </mat-radio-button>\n </div>\n </ng-container>\n </mat-radio-group>\n </div>\n <formly-validation-message *ngIf=\"showError\" [field]=\"field\">\n </formly-validation-message>\n</div>\n", styles: ["formly-validation-message{color:red;font-size:12px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "directive", type: i3.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i3.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: i4.ɵFormlyValidationMessage, selector: "formly-validation-message", inputs: ["field"] }, { kind: "directive", type: i5.ExternalLinkDirective, selector: "[appExternalLink]" }] }); }
|
|
44
|
+
}
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyRadioComponent, decorators: [{
|
|
46
|
+
type: Component,
|
|
47
|
+
args: [{ selector: 'formly-radio', template: "<div class=\"mat-mdc-text-field-wrapper mdc-radiobox-field\" appExternalLink>\n <label>\n <markdown [data]=\"title\"></markdown>\n </label>\n <div *ngIf=\"radioOptionsList.length > 0\">\n <mat-radio-group [value]=\"formControl.value?.id\"\n (change)=\"onRadioChange($event)\">\n <ng-container *ngFor=\"let option of radioOptionsList\">\n <div>\n <mat-radio-button [value]=\"option.value.id\">\n {{ option.label }}\n </mat-radio-button>\n </div>\n </ng-container>\n </mat-radio-group>\n </div>\n <formly-validation-message *ngIf=\"showError\" [field]=\"field\">\n </formly-validation-message>\n</div>\n", styles: ["formly-validation-message{color:red;font-size:12px}\n"] }]
|
|
48
|
+
}] });
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXJhZGlvLWNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29yaWdpbi1mb3JtL3NyYy9saWIvZm9ybWx5L2Zvcm1seS1yYWRpby9mb3JtbHktcmFkaW8tY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXJhZGlvL2Zvcm1seS1yYWRpby1jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFTN0MsTUFBTSxPQUFPLG9CQUFxQixTQUFRLFNBQVM7SUFObkQ7O1FBT0UscUJBQWdCLEdBQVUsRUFBRSxDQUFDO1FBQzdCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFDbkIsWUFBTyxHQUFXLElBQUksQ0FBQztLQWdDeEI7SUE5QkMsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFhLFdBQVc7UUFDdEIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25CLE1BQU0sT0FBTyxHQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0JBQ2pFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7Z0JBQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBZ0IsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxhQUFhLENBQUMsQ0FBaUI7UUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FDekMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQ2xDLENBQUM7UUFDRixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOytHQWxDVSxvQkFBb0I7bUdBQXBCLG9CQUFvQiwyRUNYakMsbXJCQW1CQTs7NEZEUmEsb0JBQW9CO2tCQU5oQyxTQUFTOytCQUNFLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFJhZGlvQ2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmb3JtbHktcmFkaW8nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybWx5LXJhZGlvLWNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybWx5LXJhZGlvLWNvbXBvbmVudC5zY3NzJ10sXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seVJhZGlvQ29tcG9uZW50IGV4dGVuZHMgRmllbGRUeXBlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcmFkaW9PcHRpb25zTGlzdDogYW55W10gPSBbXTtcbiAgdGl0bGU6IHN0cmluZyA9ICcnO1xuICBsYW5nSXNvOiBzdHJpbmcgPSAnZW4nO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubGFuZ0lzbyA9IHRoaXMucHJvcHNbJ2N1cnJlbnRMYW5ndWFnZUlzbyddO1xuICAgIHRoaXMudGl0bGUgPSB0aGlzLnByb3BzWydsYWJlbCddIHx8ICcnO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudG8ub3B0aW9ucykpIHtcbiAgICAgIHRoaXMucmFkaW9PcHRpb25zTGlzdCA9IHRoaXMudG8ub3B0aW9ucztcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBnZXQgZm9ybUNvbnRyb2woKTogRm9ybUNvbnRyb2wge1xuICAgIGlmICh0aGlzLmZpZWxkLmtleSkge1xuICAgICAgY29uc3Qga2V5UGF0aCA9XG4gICAgICAgIHR5cGVvZiB0aGlzLmZpZWxkLmtleSA9PT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheSh0aGlzLmZpZWxkLmtleSlcbiAgICAgICAgICA/IHRoaXMuZmllbGQua2V5XG4gICAgICAgICAgOiBTdHJpbmcodGhpcy5maWVsZC5rZXkpO1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoa2V5UGF0aCkgYXMgRm9ybUNvbnRyb2w7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRm9ybUNvbnRyb2woKTtcbiAgfVxuXG4gIG9uUmFkaW9DaGFuZ2UoZTogTWF0UmFkaW9DaGFuZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMucmFkaW9PcHRpb25zTGlzdC5maW5kKFxuICAgICAgKG9wdCkgPT4gb3B0LnZhbHVlLmlkID09PSBlLnZhbHVlXG4gICAgKTtcbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoc2VsZWN0ZWQudmFsdWUpO1xuICAgICAgaWYgKHRoaXMucHJvcHNbJ29uU2VsZWN0ZWRWYWx1ZUNoYW5nZWQnXSkge1xuICAgICAgICB0aGlzLnByb3BzWydvblNlbGVjdGVkVmFsdWVDaGFuZ2VkJ10oc2VsZWN0ZWQudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVyIG1kYy1yYWRpb2JveC1maWVsZFwiIGFwcEV4dGVybmFsTGluaz5cbiAgPGxhYmVsPlxuICAgIDxtYXJrZG93biBbZGF0YV09XCJ0aXRsZVwiPjwvbWFya2Rvd24+XG4gIDwvbGFiZWw+XG4gIDxkaXYgKm5nSWY9XCJyYWRpb09wdGlvbnNMaXN0Lmxlbmd0aCA+IDBcIj5cbiAgICA8bWF0LXJhZGlvLWdyb3VwIFt2YWx1ZV09XCJmb3JtQ29udHJvbC52YWx1ZT8uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblJhZGlvQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiByYWRpb09wdGlvbnNMaXN0XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZS5pZFwiPlxuICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XG4gICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICA8L2Rpdj5cbiAgPGZvcm1seS12YWxpZGF0aW9uLW1lc3NhZ2UgKm5nSWY9XCJzaG93RXJyb3JcIiBbZmllbGRdPVwiZmllbGRcIj5cbiAgPC9mb3JtbHktdmFsaWRhdGlvbi1tZXNzYWdlPlxuPC9kaXY+XG4iXX0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { FieldType } from '@ngx-formly/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class RowFillerComponent extends FieldType {
|
|
5
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RowFillerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
6
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RowFillerComponent, selector: "formly-row-filler", usesInheritance: true, ngImport: i0, template: `<div class="row-filler"></div>`, isInline: true, styles: [".row-filler{width:100%}\n"] }); }
|
|
7
|
+
}
|
|
8
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RowFillerComponent, decorators: [{
|
|
9
|
+
type: Component,
|
|
10
|
+
args: [{ selector: 'formly-row-filler', template: `<div class="row-filler"></div>`, styles: [".row-filler{width:100%}\n"] }]
|
|
11
|
+
}] });
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXJvdy1maWxsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29yaWdpbi1mb3JtL3NyYy9saWIvZm9ybWx5L2Zvcm1seS1yb3ctZmlsbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBYTdDLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxTQUFTOytHQUFwQyxrQkFBa0I7bUdBQWxCLGtCQUFrQixnRkFUbkIsZ0NBQWdDOzs0RkFTL0Isa0JBQWtCO2tCQVg5QixTQUFTOytCQUNFLG1CQUFtQixZQUNuQixnQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmb3JtbHktcm93LWZpbGxlcicsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInJvdy1maWxsZXJcIj48L2Rpdj5gLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAucm93LWZpbGxlciB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFJvd0ZpbGxlckNvbXBvbmVudCBleHRlbmRzIEZpZWxkVHlwZSB7fSJdfQ==
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { Component, ViewChild, } from '@angular/core';
|
|
2
|
+
import { FormControl, Validators } from '@angular/forms';
|
|
3
|
+
import { FieldType } from '@ngx-formly/core';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../../services/applicationData.service";
|
|
6
|
+
import * as i2 from "@angular/common";
|
|
7
|
+
import * as i3 from "@angular/material/button";
|
|
8
|
+
import * as i4 from "@angular/material/icon";
|
|
9
|
+
import * as i5 from "@angular/material/progress-spinner";
|
|
10
|
+
export class FormlyScanIdComponent extends FieldType {
|
|
11
|
+
constructor(appDataService, cdr) {
|
|
12
|
+
super();
|
|
13
|
+
this.appDataService = appDataService;
|
|
14
|
+
this.cdr = cdr;
|
|
15
|
+
this.control = new FormControl('', [Validators.required]);
|
|
16
|
+
this.fileError = null;
|
|
17
|
+
this.fileNameFront = '';
|
|
18
|
+
this.fileNameBack = '';
|
|
19
|
+
this.validFormats = [];
|
|
20
|
+
this.maxFileSizeKB = 0;
|
|
21
|
+
this.cardTypeSelected = false;
|
|
22
|
+
this.oldIdCard = false;
|
|
23
|
+
this.frontPhotoUploaded = false;
|
|
24
|
+
this.backPhotoUploaded = false;
|
|
25
|
+
this.photoBase64Front = '';
|
|
26
|
+
this.photoBase64Back = '';
|
|
27
|
+
this.isLoading = false;
|
|
28
|
+
this.successMessage = null;
|
|
29
|
+
this.videoStream = null;
|
|
30
|
+
this.isScanValid = true;
|
|
31
|
+
}
|
|
32
|
+
ngOnInit() {
|
|
33
|
+
const group = this.form;
|
|
34
|
+
group.addControl(this.props['identifier'], this.control);
|
|
35
|
+
this.validFormats = this.props['config'].allowedFormats?.split(',') || [
|
|
36
|
+
'.jpg',
|
|
37
|
+
'.png',
|
|
38
|
+
];
|
|
39
|
+
this.maxFileSizeKB = this.props['config'].maxFileSizeKB || 2000;
|
|
40
|
+
if (this.props['config'].collected) {
|
|
41
|
+
const value = this.form.get(this.props['config'].componentCollected)?.value;
|
|
42
|
+
this.control.setValue(value);
|
|
43
|
+
this.form
|
|
44
|
+
.get(this.props['config'].componentCollected)
|
|
45
|
+
?.valueChanges.subscribe(() => {
|
|
46
|
+
this.control.setValue(this.form.get(this.props['config'].componentCollected)?.value);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
selectCardType(isOldIdCard) {
|
|
51
|
+
this.oldIdCard = isOldIdCard;
|
|
52
|
+
this.cardTypeSelected = true;
|
|
53
|
+
this.resetForm();
|
|
54
|
+
}
|
|
55
|
+
onFileSelected(event, isFront) {
|
|
56
|
+
const file = event.target.files[0];
|
|
57
|
+
if (file) {
|
|
58
|
+
const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase();
|
|
59
|
+
const fileSizeKB = file.size / 1024;
|
|
60
|
+
if (!this.validFormats.includes(fileExtension)) {
|
|
61
|
+
this.fileError = (this.props['errorMessages']?.invalidType ||
|
|
62
|
+
`Invalid file type. Allowed formats are ${this.validFormats.join(', ')}`).replace('{formats}', this.validFormats.join(', '));
|
|
63
|
+
this.control.setErrors({ invalidType: true });
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (fileSizeKB > this.maxFileSizeKB || fileSizeKB < 1) {
|
|
67
|
+
this.fileError = (this.props['errorMessages']?.maxSize ||
|
|
68
|
+
`File size must be between 1KB and ${this.maxFileSizeKB}KB.`).replace('{size}', this.maxFileSizeKB);
|
|
69
|
+
this.control.setErrors({ invalidSize: true });
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this.fileError = null;
|
|
73
|
+
const reader = new FileReader();
|
|
74
|
+
reader.readAsDataURL(file);
|
|
75
|
+
reader.onload = () => {
|
|
76
|
+
if (isFront) {
|
|
77
|
+
this.fileNameFront = file.name;
|
|
78
|
+
this.photoBase64Front = reader.result?.toString().split(',')[1] || '';
|
|
79
|
+
this.frontPhotoUploaded = true;
|
|
80
|
+
this.cdr.detectChanges();
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this.fileNameBack = file.name;
|
|
84
|
+
this.photoBase64Back = reader.result?.toString().split(',')[1] || '';
|
|
85
|
+
this.backPhotoUploaded = true;
|
|
86
|
+
this.cdr.detectChanges();
|
|
87
|
+
}
|
|
88
|
+
this.checkUploadCondition();
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
takePicture() {
|
|
93
|
+
this.resetForm();
|
|
94
|
+
if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
|
|
95
|
+
navigator.mediaDevices
|
|
96
|
+
.enumerateDevices()
|
|
97
|
+
.then((devices) => {
|
|
98
|
+
const videoDevices = devices.filter((device) => device.kind === 'videoinput');
|
|
99
|
+
if (videoDevices.length === 0) {
|
|
100
|
+
this.fileError = 'No camera devices found.';
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (videoDevices.length === 1) {
|
|
104
|
+
this.startCamera(videoDevices[0].deviceId);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
const selectedDeviceId = prompt('Select camera', videoDevices.map((device) => device.label).join(', '));
|
|
108
|
+
const selectedDevice = videoDevices.find((device) => device.label === selectedDeviceId);
|
|
109
|
+
if (selectedDevice) {
|
|
110
|
+
this.startCamera(selectedDevice.deviceId);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this.fileError = 'Invalid camera selection.';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
})
|
|
117
|
+
.catch(() => {
|
|
118
|
+
this.fileError = 'Unable to access the camera devices.';
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.fileError = 'Camera not supported by this device.';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
startCamera(deviceId) {
|
|
126
|
+
navigator.mediaDevices
|
|
127
|
+
.getUserMedia({ video: { deviceId } })
|
|
128
|
+
.then((stream) => {
|
|
129
|
+
this.videoStream = stream;
|
|
130
|
+
this.videoElement.nativeElement.srcObject = stream;
|
|
131
|
+
this.videoElement.nativeElement.play();
|
|
132
|
+
})
|
|
133
|
+
.catch(() => {
|
|
134
|
+
this.fileError = 'Unable to access the selected camera.';
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
capturePhoto(isFront) {
|
|
138
|
+
if (!this.videoElement.nativeElement) {
|
|
139
|
+
this.fileError = 'No video element available.';
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const video = this.videoElement.nativeElement;
|
|
143
|
+
const canvas = document.createElement('canvas');
|
|
144
|
+
canvas.width = video.videoWidth;
|
|
145
|
+
canvas.height = video.videoHeight;
|
|
146
|
+
const context = canvas.getContext('2d');
|
|
147
|
+
context?.drawImage(video, 0, 0, canvas.width, canvas.height);
|
|
148
|
+
this.isLoading = true;
|
|
149
|
+
canvas.toBlob((blob) => {
|
|
150
|
+
if (blob) {
|
|
151
|
+
const reader = new FileReader();
|
|
152
|
+
reader.readAsDataURL(blob);
|
|
153
|
+
reader.onloadend = () => {
|
|
154
|
+
if (isFront) {
|
|
155
|
+
this.photoBase64Front =
|
|
156
|
+
reader.result?.toString().split(',')[1] || '';
|
|
157
|
+
this.frontPhotoUploaded = true;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
this.photoBase64Back =
|
|
161
|
+
reader.result?.toString().split(',')[1] || '';
|
|
162
|
+
this.backPhotoUploaded = true;
|
|
163
|
+
}
|
|
164
|
+
this.isLoading = false;
|
|
165
|
+
this.checkUploadCondition();
|
|
166
|
+
this.cdr.detectChanges();
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (this.videoStream) {
|
|
170
|
+
this.videoStream.getTracks().forEach((track) => track.stop());
|
|
171
|
+
this.videoStream = null;
|
|
172
|
+
}
|
|
173
|
+
}, 'image/jpeg');
|
|
174
|
+
}
|
|
175
|
+
uploadPhoto() {
|
|
176
|
+
this.isLoading = true;
|
|
177
|
+
this.cdr.detectChanges();
|
|
178
|
+
const command = {
|
|
179
|
+
appId: this.props['appId'],
|
|
180
|
+
appDataId: this.props['appDataId'],
|
|
181
|
+
stepId: this.props['stepId'],
|
|
182
|
+
oldIdCard: this.oldIdCard,
|
|
183
|
+
photos: this.oldIdCard
|
|
184
|
+
? [{ base64: this.photoBase64Front }]
|
|
185
|
+
: [{ base64: this.photoBase64Front }, { base64: this.photoBase64Back }],
|
|
186
|
+
};
|
|
187
|
+
this.appDataService.scanId(command).subscribe({
|
|
188
|
+
next: async (result) => {
|
|
189
|
+
console.log('Scan ID result:', result);
|
|
190
|
+
this.isLoading = false;
|
|
191
|
+
var appData = await this.appDataService.getSteps(this.props['appDataId']);
|
|
192
|
+
if (appData) {
|
|
193
|
+
const status = this.extractStatusFromAppData(appData);
|
|
194
|
+
console.log('[SCAN-ID] extracted status:', status);
|
|
195
|
+
if (status?.toLowerCase().includes('invalid')) {
|
|
196
|
+
this.fileError =
|
|
197
|
+
this.props['errorMessages']?.invalidStatus ||
|
|
198
|
+
'Invalid status response.';
|
|
199
|
+
this.resetForm(true);
|
|
200
|
+
this.control.setErrors({ invalidStatus: true });
|
|
201
|
+
this.cdr.detectChanges();
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
this.isScanValid = true;
|
|
205
|
+
this.successMessage = 'Upload successful!';
|
|
206
|
+
if (this.props['event']) {
|
|
207
|
+
this.props['event'](appData);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
this.cdr.detectChanges();
|
|
211
|
+
},
|
|
212
|
+
error: (err) => {
|
|
213
|
+
this.fileError = 'An error occurred while processing the scan.';
|
|
214
|
+
console.error('Scan ID error:', err);
|
|
215
|
+
this.isLoading = false;
|
|
216
|
+
this.cdr.detectChanges();
|
|
217
|
+
this.resetForm();
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
resetForm(preserveError = false) {
|
|
222
|
+
this.fileNameFront = '';
|
|
223
|
+
this.fileNameBack = '';
|
|
224
|
+
this.photoBase64Front = '';
|
|
225
|
+
this.photoBase64Back = '';
|
|
226
|
+
this.frontPhotoUploaded = false;
|
|
227
|
+
this.backPhotoUploaded = false;
|
|
228
|
+
if (!preserveError) {
|
|
229
|
+
this.fileError = null;
|
|
230
|
+
}
|
|
231
|
+
this.videoStream = null;
|
|
232
|
+
this.control.reset();
|
|
233
|
+
this.isLoading = false;
|
|
234
|
+
this.successMessage = null;
|
|
235
|
+
}
|
|
236
|
+
checkUploadCondition() {
|
|
237
|
+
if (this.oldIdCard || (this.frontPhotoUploaded && this.backPhotoUploaded)) {
|
|
238
|
+
this.uploadPhoto();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
extractStatusFromAppData(appData) {
|
|
242
|
+
if (!appData?.fillData || !this.props['stepId'])
|
|
243
|
+
return null;
|
|
244
|
+
let fillData;
|
|
245
|
+
try {
|
|
246
|
+
fillData =
|
|
247
|
+
typeof appData.fillData === 'string'
|
|
248
|
+
? JSON.parse(appData.fillData)
|
|
249
|
+
: appData.fillData;
|
|
250
|
+
}
|
|
251
|
+
catch (e) {
|
|
252
|
+
console.error('[extractStatusFromAppData] JSON parse error', e);
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
const step = fillData.flux.find((s) => s.stepId === this.props['stepId']);
|
|
256
|
+
if (!step?.sections)
|
|
257
|
+
return null;
|
|
258
|
+
for (const section of step.sections) {
|
|
259
|
+
for (const control of section.controls || []) {
|
|
260
|
+
if (typeof control.fillValue === 'string' &&
|
|
261
|
+
control.fillValue.trim() !== '') {
|
|
262
|
+
return control.fillValue.trim();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyScanIdComponent, deps: [{ token: i1.ApplicationDataService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
269
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormlyScanIdComponent, selector: "app-formly-scan-id", viewQueries: [{ propertyName: "fileInputFront", first: true, predicate: ["fileInputFront"], descendants: true }, { propertyName: "fileInputBack", first: true, predicate: ["fileInputBack"], descendants: true }, { propertyName: "videoElement", first: true, predicate: ["videoElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"scan-id-container\">\n <h2 class=\"title\">{{ props[\"name\"] }}</h2>\n <p class=\"description\">{{ props[\"description\"] }}</p>\n\n <!-- Selection Step -->\n <div class=\"card-selection-container\">\n <div class=\"card-options\">\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === true && cardTypeSelected\"\n (click)=\"selectCardType(true)\">\n <img src=\"assets/images/origin-form/old-id-card.png\" alt=\"Old ID Card\" />\n </div>\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === false && cardTypeSelected\"\n (click)=\"selectCardType(false)\">\n <img src=\"assets/images/origin-form/new-id-card.png\" alt=\"New ID Card\" />\n </div>\n </div>\n </div>\n\n <div *ngIf=\"isLoading\" class=\"loading-spinner\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div *ngIf=\"cardTypeSelected && !isLoading\" class=\"actions\">\n <!-- Step 1: Upload Front Photo -->\n <div *ngIf=\"!frontPhotoUploaded\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadFrontPrompt || 'Please upload the front photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputFront (change)=\"onFileSelected($event, true)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputFront.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameFront ? fileNameFront : props['labels'].uploadFileButtonTranslations || 'Upload Front Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div>\n\n <!-- Step 2: Upload Back Photo (Only for New ID Cards) -->\n <div *ngIf=\"frontPhotoUploaded && !oldIdCard && !isLoading\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadBackPrompt || 'Please upload the back photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputBack (change)=\"onFileSelected($event, false)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputBack.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameBack ? fileNameBack : props['labels'].uploadFileButtonTranslations || 'Upload Back Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div> \n <!-- Take Photo Button (Optional) -->\n <div *ngIf=\"props['config'].showTakePictureButton\" class=\"take-photo-container\">\n <button mat-flat-button color=\"accent\" (click)=\"takePicture()\">\n <mat-icon>camera_alt</mat-icon>\n {{ props['labels'].takePictureButtonTranslations || 'Take a photo' }}\n </button>\n <video #videoElement *ngIf=\"videoStream\" width=\"100%\" class=\"video-preview\" autoplay></video>\n\n <!-- Take Front Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && !frontPhotoUploaded\" (click)=\"capturePhoto(true)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.frontId || 'Take a photo' }}\n </button>\n\n <!-- Take Back Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && frontPhotoUploaded && !oldIdCard\" (click)=\"capturePhoto(false)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.backId || 'Take a photo' }}\n </button>\n </div>\n </div>\n <div *ngIf=\"successMessage && isScanValid\" class=\"success-message-container\">\n <mat-icon class=\"large-icon\" color=\"primary\">check_circle</mat-icon>\n </div>\n</div>", styles: [".loading-spinner{display:flex;justify-content:center;align-items:center;margin-top:20px}.success-message-container{display:flex;align-items:center;gap:8px;color:green;font-weight:700;justify-content:center}.large-icon{font-size:36px;width:36px;height:36px}.scan-id-container{max-width:600px;margin:0 auto 16px;padding:20px;background-color:#fff;border-radius:8px;box-shadow:0 4px 8px #0000001a;text-align:center}.scan-id-container .card-selection-container{margin-bottom:20px}.scan-id-container .card-options{display:flex;justify-content:space-around}.scan-id-container .card-option{border:2px solid transparent;border-radius:10px;cursor:pointer;padding:10px;text-align:center;transition:border-color .3s,background-color .3s}.scan-id-container .card-option:hover{border-color:#3f51b5}.scan-id-container .card-option img{max-width:100%;height:auto;margin-bottom:10px}.scan-id-container .card-option p{font-weight:700}.scan-id-container .card-option.selected{border-color:#3f51b5;background-color:#e3f2fd;box-shadow:0 0 10px #0000001a}.scan-id-container .title{font-size:24px;font-weight:700;color:#333;margin-bottom:10px}.scan-id-container .description{font-size:16px;color:#666;margin-bottom:20px}.scan-id-container .actions{display:flex;flex-direction:column;gap:20px}.scan-id-container .actions .upload-button-container,.scan-id-container .actions .take-photo-container{display:flex;flex-direction:column;align-items:center}.scan-id-container .actions .upload-button-container button,.scan-id-container .actions .take-photo-container button{display:flex;align-items:center;gap:8px;padding:10px 20px;font-size:16px;font-weight:600;border-radius:50px;transition:background-color .3s}.scan-id-container .actions .upload-button-container button mat-icon,.scan-id-container .actions .take-photo-container button mat-icon{font-size:20px}.scan-id-container .actions .upload-button-container button:hover,.scan-id-container .actions .take-photo-container button:hover{background-color:#0069c0}.scan-id-container .actions .upload-button-container .error-message,.scan-id-container .actions .take-photo-container .error-message{color:#e53935;font-size:14px;margin-top:10px}.scan-id-container .actions .video-preview{margin-top:20px;border-radius:8px;box-shadow:0 2px 4px #0003}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
270
|
+
}
|
|
271
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormlyScanIdComponent, decorators: [{
|
|
272
|
+
type: Component,
|
|
273
|
+
args: [{ selector: 'app-formly-scan-id', template: "<div class=\"scan-id-container\">\n <h2 class=\"title\">{{ props[\"name\"] }}</h2>\n <p class=\"description\">{{ props[\"description\"] }}</p>\n\n <!-- Selection Step -->\n <div class=\"card-selection-container\">\n <div class=\"card-options\">\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === true && cardTypeSelected\"\n (click)=\"selectCardType(true)\">\n <img src=\"assets/images/origin-form/old-id-card.png\" alt=\"Old ID Card\" />\n </div>\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === false && cardTypeSelected\"\n (click)=\"selectCardType(false)\">\n <img src=\"assets/images/origin-form/new-id-card.png\" alt=\"New ID Card\" />\n </div>\n </div>\n </div>\n\n <div *ngIf=\"isLoading\" class=\"loading-spinner\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div *ngIf=\"cardTypeSelected && !isLoading\" class=\"actions\">\n <!-- Step 1: Upload Front Photo -->\n <div *ngIf=\"!frontPhotoUploaded\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadFrontPrompt || 'Please upload the front photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputFront (change)=\"onFileSelected($event, true)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputFront.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameFront ? fileNameFront : props['labels'].uploadFileButtonTranslations || 'Upload Front Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div>\n\n <!-- Step 2: Upload Back Photo (Only for New ID Cards) -->\n <div *ngIf=\"frontPhotoUploaded && !oldIdCard && !isLoading\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadBackPrompt || 'Please upload the back photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputBack (change)=\"onFileSelected($event, false)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputBack.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameBack ? fileNameBack : props['labels'].uploadFileButtonTranslations || 'Upload Back Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div> \n <!-- Take Photo Button (Optional) -->\n <div *ngIf=\"props['config'].showTakePictureButton\" class=\"take-photo-container\">\n <button mat-flat-button color=\"accent\" (click)=\"takePicture()\">\n <mat-icon>camera_alt</mat-icon>\n {{ props['labels'].takePictureButtonTranslations || 'Take a photo' }}\n </button>\n <video #videoElement *ngIf=\"videoStream\" width=\"100%\" class=\"video-preview\" autoplay></video>\n\n <!-- Take Front Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && !frontPhotoUploaded\" (click)=\"capturePhoto(true)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.frontId || 'Take a photo' }}\n </button>\n\n <!-- Take Back Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && frontPhotoUploaded && !oldIdCard\" (click)=\"capturePhoto(false)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.backId || 'Take a photo' }}\n </button>\n </div>\n </div>\n <div *ngIf=\"successMessage && isScanValid\" class=\"success-message-container\">\n <mat-icon class=\"large-icon\" color=\"primary\">check_circle</mat-icon>\n </div>\n</div>", styles: [".loading-spinner{display:flex;justify-content:center;align-items:center;margin-top:20px}.success-message-container{display:flex;align-items:center;gap:8px;color:green;font-weight:700;justify-content:center}.large-icon{font-size:36px;width:36px;height:36px}.scan-id-container{max-width:600px;margin:0 auto 16px;padding:20px;background-color:#fff;border-radius:8px;box-shadow:0 4px 8px #0000001a;text-align:center}.scan-id-container .card-selection-container{margin-bottom:20px}.scan-id-container .card-options{display:flex;justify-content:space-around}.scan-id-container .card-option{border:2px solid transparent;border-radius:10px;cursor:pointer;padding:10px;text-align:center;transition:border-color .3s,background-color .3s}.scan-id-container .card-option:hover{border-color:#3f51b5}.scan-id-container .card-option img{max-width:100%;height:auto;margin-bottom:10px}.scan-id-container .card-option p{font-weight:700}.scan-id-container .card-option.selected{border-color:#3f51b5;background-color:#e3f2fd;box-shadow:0 0 10px #0000001a}.scan-id-container .title{font-size:24px;font-weight:700;color:#333;margin-bottom:10px}.scan-id-container .description{font-size:16px;color:#666;margin-bottom:20px}.scan-id-container .actions{display:flex;flex-direction:column;gap:20px}.scan-id-container .actions .upload-button-container,.scan-id-container .actions .take-photo-container{display:flex;flex-direction:column;align-items:center}.scan-id-container .actions .upload-button-container button,.scan-id-container .actions .take-photo-container button{display:flex;align-items:center;gap:8px;padding:10px 20px;font-size:16px;font-weight:600;border-radius:50px;transition:background-color .3s}.scan-id-container .actions .upload-button-container button mat-icon,.scan-id-container .actions .take-photo-container button mat-icon{font-size:20px}.scan-id-container .actions .upload-button-container button:hover,.scan-id-container .actions .take-photo-container button:hover{background-color:#0069c0}.scan-id-container .actions .upload-button-container .error-message,.scan-id-container .actions .take-photo-container .error-message{color:#e53935;font-size:14px;margin-top:10px}.scan-id-container .actions .video-preview{margin-top:20px;border-radius:8px;box-shadow:0 2px 4px #0003}\n"] }]
|
|
274
|
+
}], ctorParameters: () => [{ type: i1.ApplicationDataService }, { type: i0.ChangeDetectorRef }], propDecorators: { fileInputFront: [{
|
|
275
|
+
type: ViewChild,
|
|
276
|
+
args: ['fileInputFront']
|
|
277
|
+
}], fileInputBack: [{
|
|
278
|
+
type: ViewChild,
|
|
279
|
+
args: ['fileInputBack']
|
|
280
|
+
}], videoElement: [{
|
|
281
|
+
type: ViewChild,
|
|
282
|
+
args: ['videoElement']
|
|
283
|
+
}] } });
|
|
284
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXNjYW4taWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNjYW4taWQvZm9ybWx5LXNjYW4taWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNjYW4taWQvZm9ybWx5LXNjYW4taWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFHVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7QUFVN0MsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFNBQVM7SUFzQmxELFlBQ1UsY0FBc0MsRUFDdEMsR0FBc0I7UUFFOUIsS0FBSyxFQUFFLENBQUM7UUFIQSxtQkFBYyxHQUFkLGNBQWMsQ0FBd0I7UUFDdEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF2QmhDLFlBQU8sR0FBZ0IsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEUsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFDaEMsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBYSxFQUFFLENBQUM7UUFDNUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLHNCQUFpQixH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UUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxJQUNFLE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxRQUFRO29CQUNyQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFDL0IsQ0FBQztvQkFDRCxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzsrR0F6VFUscUJBQXFCO21HQUFyQixxQkFBcUIsbVlDbEJsQyxraUhBMEVNOzs0RkR4RE8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG9CQUFvQjsySEFvQkQsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0MsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNDLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHBsaWNhdGlvbkRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBTY2FuSWREdG8gfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwbGljYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgQXBwRGF0YUZpbGwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZm9ybXMubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZm9ybWx5LXNjYW4taWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybWx5LXNjYW4taWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtbHktc2Nhbi1pZC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlTY2FuSWRDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGUgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb250cm9sOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgZmlsZUVycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZmlsZU5hbWVGcm9udDogc3RyaW5nID0gJyc7XG4gIGZpbGVOYW1lQmFjazogc3RyaW5nID0gJyc7XG4gIHZhbGlkRm9ybWF0czogc3RyaW5nW10gPSBbXTtcbiAgbWF4RmlsZVNpemVLQjogbnVtYmVyID0gMDtcbiAgY2FyZFR5cGVTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBvbGRJZENhcmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZnJvbnRQaG90b1VwbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGJhY2tQaG90b1VwbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHBob3RvQmFzZTY0RnJvbnQ6IHN0cmluZyA9ICcnO1xuICBwaG90b0Jhc2U2NEJhY2s6IHN0cmluZyA9ICcnO1xuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc3VjY2Vzc01lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dEZyb250JykgZmlsZUlucHV0RnJvbnQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dEJhY2snKSBmaWxlSW5wdXRCYWNrOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd2aWRlb0VsZW1lbnQnKSB2aWRlb0VsZW1lbnQ6IEVsZW1lbnRSZWY7XG4gIHZpZGVvU3RyZWFtOiBNZWRpYVN0cmVhbSB8IG51bGwgPSBudWxsO1xuICBpc1NjYW5WYWxpZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhcHBEYXRhU2VydmljZTogQXBwbGljYXRpb25EYXRhU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5mb3JtIGFzIEZvcm1Hcm91cDtcbiAgICBncm91cC5hZGRDb250cm9sKHRoaXMucHJvcHNbJ2lkZW50aWZpZXInXSwgdGhpcy5jb250cm9sKTtcblxuICAgIHRoaXMudmFsaWRGb3JtYXRzID0gdGhpcy5wcm9wc1snY29uZmlnJ10uYWxsb3dlZEZvcm1hdHM/LnNwbGl0KCcsJykgfHwgW1xuICAgICAgJy5qcGcnLFxuICAgICAgJy5wbmcnLFxuICAgIF07XG4gICAgdGhpcy5tYXhGaWxlU2l6ZUtCID0gdGhpcy5wcm9wc1snY29uZmlnJ10ubWF4RmlsZVNpemVLQiB8fCAyMDAwO1xuXG4gICAgaWYgKHRoaXMucHJvcHNbJ2NvbmZpZyddLmNvbGxlY3RlZCkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm0uZ2V0KFxuICAgICAgICB0aGlzLnByb3BzWydjb25maWcnXS5jb21wb25lbnRDb2xsZWN0ZWRcbiAgICAgICk/LnZhbHVlO1xuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTtcblxuICAgICAgdGhpcy5mb3JtXG4gICAgICAgIC5nZXQodGhpcy5wcm9wc1snY29uZmlnJ10uY29tcG9uZW50Q29sbGVjdGVkKVxuICAgICAgICA/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5wcm9wc1snY29uZmlnJ10uY29tcG9uZW50Q29sbGVjdGVkKT8udmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RDYXJkVHlwZShpc09sZElkQ2FyZDogYm9vbGVhbikge1xuICAgIHRoaXMub2xkSWRDYXJkID0gaXNPbGRJZENhcmQ7XG4gICAgdGhpcy5jYXJkVHlwZVNlbGVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICB9XG5cbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IGFueSwgaXNGcm9udDogYm9vbGVhbikge1xuICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSAnLicgKyBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKT8udG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGZpbGVTaXplS0IgPSBmaWxlLnNpemUgLyAxMDI0O1xuXG4gICAgICBpZiAoIXRoaXMudmFsaWRGb3JtYXRzLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIHRoaXMuZmlsZUVycm9yID0gKFxuICAgICAgICAgIHRoaXMucHJvcHNbJ2Vycm9yTWVzc2FnZXMnXT8uaW52YWxpZFR5cGUgfHxcbiAgICAgICAgICBgSW52YWxpZCBmaWxlIHR5cGUuIEFsbG93ZWQgZm9ybWF0cyBhcmUgJHt0aGlzLnZhbGlkRm9ybWF0cy5qb2luKFxuICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICl9YFxuICAgICAgICApLnJlcGxhY2UoJ3tmb3JtYXRzfScsIHRoaXMudmFsaWRGb3JtYXRzLmpvaW4oJywgJykpO1xuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKHsgaW52YWxpZFR5cGU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVTaXplS0IgPiB0aGlzLm1heEZpbGVTaXplS0IgfHwgZmlsZVNpemVLQiA8IDEpIHtcbiAgICAgICAgdGhpcy5maWxlRXJyb3IgPSAoXG4gICAgICAgICAgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5tYXhTaXplIHx8XG4gICAgICAgICAgYEZpbGUgc2l6ZSBtdXN0IGJlIGJldHdlZW4gMUtCIGFuZCAke3RoaXMubWF4RmlsZVNpemVLQn1LQi5gXG4gICAgICAgICkucmVwbGFjZSgne3NpemV9JywgdGhpcy5tYXhGaWxlU2l6ZUtCKTtcbiAgICAgICAgdGhpcy5jb250cm9sLnNldEVycm9ycyh7IGludmFsaWRTaXplOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChpc0Zyb250KSB7XG4gICAgICAgICAgdGhpcy5maWxlTmFtZUZyb250ID0gZmlsZS5uYW1lO1xuICAgICAgICAgIHRoaXMucGhvdG9CYXNlNjRGcm9udCA9IHJlYWRlci5yZXN1bHQ/LnRvU3RyaW5nKCkuc3BsaXQoJywnKVsxXSB8fCAnJztcbiAgICAgICAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZmlsZU5hbWVCYWNrID0gZmlsZS5uYW1lO1xuICAgICAgICAgIHRoaXMucGhvdG9CYXNlNjRCYWNrID0gcmVhZGVyLnJlc3VsdD8udG9TdHJpbmcoKS5zcGxpdCgnLCcpWzFdIHx8ICcnO1xuICAgICAgICAgIHRoaXMuYmFja1Bob3RvVXBsb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hlY2tVcGxvYWRDb25kaXRpb24oKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdGFrZVBpY3R1cmUoKSB7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcblxuICAgIGlmIChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzICYmIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcykge1xuICAgICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgICAuZW51bWVyYXRlRGV2aWNlcygpXG4gICAgICAgIC50aGVuKChkZXZpY2VzKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmlkZW9EZXZpY2VzID0gZGV2aWNlcy5maWx0ZXIoXG4gICAgICAgICAgICAoZGV2aWNlKSA9PiBkZXZpY2Uua2luZCA9PT0gJ3ZpZGVvaW5wdXQnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh2aWRlb0RldmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVFcnJvciA9ICdObyBjYW1lcmEgZGV2aWNlcyBmb3VuZC4nO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2aWRlb0RldmljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0Q2FtZXJhKHZpZGVvRGV2aWNlc1swXS5kZXZpY2VJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRGV2aWNlSWQgPSBwcm9tcHQoXG4gICAgICAgICAgICAgICdTZWxlY3QgY2FtZXJhJyxcbiAgICAgICAgICAgICAgdmlkZW9EZXZpY2VzLm1hcCgoZGV2aWNlKSA9PiBkZXZpY2UubGFiZWwpLmpvaW4oJywgJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERldmljZSA9IHZpZGVvRGV2aWNlcy5maW5kKFxuICAgICAgICAgICAgICAoZGV2aWNlKSA9PiBkZXZpY2UubGFiZWwgPT09IHNlbGVjdGVkRGV2aWNlSWRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERldmljZSkge1xuICAgICAgICAgICAgICB0aGlzLnN0YXJ0Q2FtZXJhKHNlbGVjdGVkRGV2aWNlLmRldmljZUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlsZUVycm9yID0gJ0ludmFsaWQgY2FtZXJhIHNlbGVjdGlvbi4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZpbGVFcnJvciA9ICdVbmFibGUgdG8gYWNjZXNzIHRoZSBjYW1lcmEgZGV2aWNlcy4nO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAnQ2FtZXJhIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuJztcbiAgICB9XG4gIH1cblxuICBzdGFydENhbWVyYShkZXZpY2VJZDogc3RyaW5nKSB7XG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB7IGRldmljZUlkIH0gfSlcbiAgICAgIC50aGVuKChzdHJlYW0pID0+IHtcbiAgICAgICAgdGhpcy52aWRlb1N0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQubmF0aXZlRWxlbWVudC5zcmNPYmplY3QgPSBzdHJlYW07XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGxheSgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsZUVycm9yID0gJ1VuYWJsZSB0byBhY2Nlc3MgdGhlIHNlbGVjdGVkIGNhbWVyYS4nO1xuICAgICAgfSk7XG4gIH1cblxuICBjYXB0dXJlUGhvdG8oaXNGcm9udDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy52aWRlb0VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAnTm8gdmlkZW8gZWxlbWVudCBhdmFpbGFibGUuJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdmlkZW8udmlkZW9XaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGNvbnRleHQ/LmRyYXdJbWFnZSh2aWRlbywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgIGlmIChibG9iKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChpc0Zyb250KSB7XG4gICAgICAgICAgICB0aGlzLnBob3RvQmFzZTY0RnJvbnQgPVxuICAgICAgICAgICAgICByZWFkZXIucmVzdWx0Py50b1N0cmluZygpLnNwbGl0KCcsJylbMV0gfHwgJyc7XG4gICAgICAgICAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGhvdG9CYXNlNjRCYWNrID1cbiAgICAgICAgICAgICAgcmVhZGVyLnJlc3VsdD8udG9TdHJpbmcoKS5zcGxpdCgnLCcpWzFdIHx8ICcnO1xuICAgICAgICAgICAgdGhpcy5iYWNrUGhvdG9VcGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNoZWNrVXBsb2FkQ29uZGl0aW9uKCk7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy52aWRlb1N0cmVhbSkge1xuICAgICAgICB0aGlzLnZpZGVvU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHRyYWNrKSA9PiB0cmFjay5zdG9wKCkpO1xuICAgICAgICB0aGlzLnZpZGVvU3RyZWFtID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAnaW1hZ2UvanBlZycpO1xuICB9XG5cbiAgdXBsb2FkUGhvdG8oKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICBjb25zdCBjb21tYW5kOiBTY2FuSWREdG8gPSB7XG4gICAgICBhcHBJZDogdGhpcy5wcm9wc1snYXBwSWQnXSxcbiAgICAgIGFwcERhdGFJZDogdGhpcy5wcm9wc1snYXBwRGF0YUlkJ10sXG4gICAgICBzdGVwSWQ6IHRoaXMucHJvcHNbJ3N0ZXBJZCddLFxuICAgICAgb2xkSWRDYXJkOiB0aGlzLm9sZElkQ2FyZCxcbiAgICAgIHBob3RvczogdGhpcy5vbGRJZENhcmRcbiAgICAgICAgPyBbeyBiYXNlNjQ6IHRoaXMucGhvdG9CYXNlNjRGcm9udCB9XVxuICAgICAgICA6IFt7IGJhc2U2NDogdGhpcy5waG90b0Jhc2U2NEZyb250IH0sIHsgYmFzZTY0OiB0aGlzLnBob3RvQmFzZTY0QmFjayB9XSxcbiAgICB9O1xuXG4gICAgdGhpcy5hcHBEYXRhU2VydmljZS5zY2FuSWQoY29tbWFuZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1NjYW4gSUQgcmVzdWx0OicsIHJlc3VsdCk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIGFwcERhdGEgPSBhd2FpdCB0aGlzLmFwcERhdGFTZXJ2aWNlLmdldFN0ZXBzKFxuICAgICAgICAgIHRoaXMucHJvcHNbJ2FwcERhdGFJZCddXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFwcERhdGEpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmV4dHJhY3RTdGF0dXNGcm9tQXBwRGF0YShhcHBEYXRhKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NDQU4tSURdIGV4dHJhY3RlZCBzdGF0dXM6Jywgc3RhdHVzKTtcblxuICAgICAgICAgIGlmIChzdGF0dXM/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ludmFsaWQnKSkge1xuICAgICAgICAgICAgdGhpcy5maWxlRXJyb3IgPVxuICAgICAgICAgICAgICB0aGlzLnByb3BzWydlcnJvck1lc3NhZ2VzJ10/LmludmFsaWRTdGF0dXMgfHxcbiAgICAgICAgICAgICAgJ0ludmFsaWQgc3RhdHVzIHJlc3BvbnNlLic7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoeyBpbnZhbGlkU3RhdHVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuaXNTY2FuVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2UgPSAnVXBsb2FkIHN1Y2Nlc3NmdWwhJztcbiAgICAgICAgICBpZiAodGhpcy5wcm9wc1snZXZlbnQnXSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wc1snZXZlbnQnXShhcHBEYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsZUVycm9yID0gJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHNjYW4uJztcbiAgICAgICAgY29uc29sZS5lcnJvcignU2NhbiBJRCBlcnJvcjonLCBlcnIpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRGb3JtKHByZXNlcnZlRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuZmlsZU5hbWVGcm9udCA9ICcnO1xuICAgIHRoaXMuZmlsZU5hbWVCYWNrID0gJyc7XG4gICAgdGhpcy5waG90b0Jhc2U2NEZyb250ID0gJyc7XG4gICAgdGhpcy5waG90b0Jhc2U2NEJhY2sgPSAnJztcbiAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuYmFja1Bob3RvVXBsb2FkZWQgPSBmYWxzZTtcbiAgICBpZiAoIXByZXNlcnZlRXJyb3IpIHtcbiAgICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy52aWRlb1N0cmVhbSA9IG51bGw7XG4gICAgdGhpcy5jb250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gbnVsbDtcbiAgfVxuXG4gIGNoZWNrVXBsb2FkQ29uZGl0aW9uKCkge1xuICAgIGlmICh0aGlzLm9sZElkQ2FyZCB8fCAodGhpcy5mcm9udFBob3RvVXBsb2FkZWQgJiYgdGhpcy5iYWNrUGhvdG9VcGxvYWRlZCkpIHtcbiAgICAgIHRoaXMudXBsb2FkUGhvdG8oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RTdGF0dXNGcm9tQXBwRGF0YShhcHBEYXRhOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWFwcERhdGE/LmZpbGxEYXRhIHx8ICF0aGlzLnByb3BzWydzdGVwSWQnXSkgcmV0dXJuIG51bGw7XG5cbiAgICBsZXQgZmlsbERhdGE6IEFwcERhdGFGaWxsO1xuICAgIHRyeSB7XG4gICAgICBmaWxsRGF0YSA9XG4gICAgICAgIHR5cGVvZiBhcHBEYXRhLmZpbGxEYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gKEpTT04ucGFyc2UoYXBwRGF0YS5maWxsRGF0YSkgYXMgQXBwRGF0YUZpbGwpXG4gICAgICAgICAgOiBhcHBEYXRhLmZpbGxEYXRhO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tleHRyYWN0U3RhdHVzRnJvbUFwcERhdGFdIEpTT04gcGFyc2UgZXJyb3InLCBlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXAgPSBmaWxsRGF0YS5mbHV4LmZpbmQoXG4gICAgICAoczogYW55KSA9PiBzLnN0ZXBJZCA9PT0gdGhpcy5wcm9wc1snc3RlcElkJ11cbiAgICApO1xuICAgIGlmICghc3RlcD8uc2VjdGlvbnMpIHJldHVybiBudWxsO1xuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHN0ZXAuc2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBzZWN0aW9uLmNvbnRyb2xzIHx8IFtdKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgY29udHJvbC5maWxsVmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgY29udHJvbC5maWxsVmFsdWUudHJpbSgpICE9PSAnJ1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY29udHJvbC5maWxsVmFsdWUudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzY2FuLWlkLWNvbnRhaW5lclwiPlxuICA8aDIgY2xhc3M9XCJ0aXRsZVwiPnt7IHByb3BzW1wibmFtZVwiXSB9fTwvaDI+XG4gIDxwIGNsYXNzPVwiZGVzY3JpcHRpb25cIj57eyBwcm9wc1tcImRlc2NyaXB0aW9uXCJdIH19PC9wPlxuXG4gIDwhLS0gU2VsZWN0aW9uIFN0ZXAgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLXNlbGVjdGlvbi1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1vcHRpb25zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1vcHRpb25cIlxuICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwib2xkSWRDYXJkID09PSB0cnVlICYmIGNhcmRUeXBlU2VsZWN0ZWRcIlxuICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2FyZFR5cGUodHJ1ZSlcIj5cbiAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL29yaWdpbi1mb3JtL29sZC1pZC1jYXJkLnBuZ1wiIGFsdD1cIk9sZCBJRCBDYXJkXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtb3B0aW9uXCJcbiAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cIm9sZElkQ2FyZCA9PT0gZmFsc2UgJiYgY2FyZFR5cGVTZWxlY3RlZFwiXG4gICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDYXJkVHlwZShmYWxzZSlcIj5cbiAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL29yaWdpbi1mb3JtL25ldy1pZC1jYXJkLnBuZ1wiIGFsdD1cIk5ldyBJRCBDYXJkXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj5cbiAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImNhcmRUeXBlU2VsZWN0ZWQgJiYgIWlzTG9hZGluZ1wiIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgIDwhLS0gU3RlcCAxOiBVcGxvYWQgRnJvbnQgUGhvdG8gLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFmcm9udFBob3RvVXBsb2FkZWRcIiBjbGFzcz1cInVwbG9hZC1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICA8cD57eyBwcm9wc1snbGFiZWxzJ10udXBsb2FkRnJvbnRQcm9tcHQgfHwgJ1BsZWFzZSB1cGxvYWQgdGhlIGZyb250IHBob3RvIG9mIHlvdXIgSUQgY2FyZC4nIH19PC9wPlxuICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgI2ZpbGVJbnB1dEZyb250IChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50LCB0cnVlKVwiIGhpZGRlbiAvPlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImZpbGVJbnB1dEZyb250LmNsaWNrKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmNsb3VkX3VwbG9hZDwvbWF0LWljb24+XG4gICAgICAgIHt7IGZpbGVOYW1lRnJvbnQgPyBmaWxlTmFtZUZyb250IDogcHJvcHNbJ2xhYmVscyddLnVwbG9hZEZpbGVCdXR0b25UcmFuc2xhdGlvbnMgfHwgJ1VwbG9hZCBGcm9udCBQaG90bycgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdiAqbmdJZj1cImZpbGVFcnJvclwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICB7eyBmaWxlRXJyb3IgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdGVwIDI6IFVwbG9hZCBCYWNrIFBob3RvIChPbmx5IGZvciBOZXcgSUQgQ2FyZHMpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJmcm9udFBob3RvVXBsb2FkZWQgJiYgIW9sZElkQ2FyZCAmJiAhaXNMb2FkaW5nXCIgY2xhc3M9XCJ1cGxvYWQtYnV0dG9uLWNvbnRhaW5lclwiPlxuICAgICAgPHA+e3sgcHJvcHNbJ2xhYmVscyddLnVwbG9hZEJhY2tQcm9tcHQgfHwgJ1BsZWFzZSB1cGxvYWQgdGhlIGJhY2sgcGhvdG8gb2YgeW91ciBJRCBjYXJkLicgfX08L3A+XG4gICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAjZmlsZUlucHV0QmFjayAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudCwgZmFsc2UpXCIgaGlkZGVuIC8+XG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZmlsZUlucHV0QmFjay5jbGljaygpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5jbG91ZF91cGxvYWQ8L21hdC1pY29uPlxuICAgICAgICB7eyBmaWxlTmFtZUJhY2sgPyBmaWxlTmFtZUJhY2sgOiBwcm9wc1snbGFiZWxzJ10udXBsb2FkRmlsZUJ1dHRvblRyYW5zbGF0aW9ucyB8fCAnVXBsb2FkIEJhY2sgUGhvdG8nIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWxlRXJyb3JcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAge3sgZmlsZUVycm9yIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gXG4gICAgPCEtLSBUYWtlIFBob3RvIEJ1dHRvbiAoT3B0aW9uYWwpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJwcm9wc1snY29uZmlnJ10uc2hvd1Rha2VQaWN0dXJlQnV0dG9uXCIgY2xhc3M9XCJ0YWtlLXBob3RvLWNvbnRhaW5lclwiPlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJhY2NlbnRcIiAoY2xpY2spPVwidGFrZVBpY3R1cmUoKVwiPlxuICAgICAgICA8bWF0LWljb24+Y2FtZXJhX2FsdDwvbWF0LWljb24+XG4gICAgICAgIHt7IHByb3BzWydsYWJlbHMnXS50YWtlUGljdHVyZUJ1dHRvblRyYW5zbGF0aW9ucyB8fCAnVGFrZSBhIHBob3RvJyB9fVxuICAgICAgPC9idXR0b24+XG4gICAgICA8dmlkZW8gI3ZpZGVvRWxlbWVudCAqbmdJZj1cInZpZGVvU3RyZWFtXCIgd2lkdGg9XCIxMDAlXCIgY2xhc3M9XCJ2aWRlby1wcmV2aWV3XCIgYXV0b3BsYXk+PC92aWRlbz5cblxuICAgICAgPCEtLSBUYWtlIEZyb250IFBob3RvIC0tPlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJ3YXJuXCIgKm5nSWY9XCJ2aWRlb1N0cmVhbSAmJiAhZnJvbnRQaG90b1VwbG9hZGVkXCIgKGNsaWNrKT1cImNhcHR1cmVQaG90byh0cnVlKVwiPlxuICAgICAgICA8bWF0LWljb24+cGhvdG9fY2FtZXJhPC9tYXQtaWNvbj5cbiAgICAgICAge3sgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5mcm9udElkIHx8ICdUYWtlIGEgcGhvdG8nIH19XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPCEtLSBUYWtlIEJhY2sgUGhvdG8gLS0+XG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cIndhcm5cIiAqbmdJZj1cInZpZGVvU3RyZWFtICYmIGZyb250UGhvdG9VcGxvYWRlZCAmJiAhb2xkSWRDYXJkXCIgKGNsaWNrKT1cImNhcHR1cmVQaG90byhmYWxzZSlcIj5cbiAgICAgICAgPG1hdC1pY29uPnBob3RvX2NhbWVyYTwvbWF0LWljb24+XG4gICAgICAgIHt7IHRoaXMucHJvcHNbJ2Vycm9yTWVzc2FnZXMnXT8uYmFja0lkICB8fCAnVGFrZSBhIHBob3RvJyB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwic3VjY2Vzc01lc3NhZ2UgJiYgaXNTY2FuVmFsaWRcIiBjbGFzcz1cInN1Y2Nlc3MtbWVzc2FnZS1jb250YWluZXJcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJsYXJnZS1pY29uXCIgY29sb3I9XCJwcmltYXJ5XCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|