@gnggln/ng-ui-system 1.0.0-alpha.2 → 1.0.0-alpha.21
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/accordion/entry-accordion.d.ts +4 -0
- package/accordion/index.d.ts +5 -0
- package/accordion/lib/components/accordion/accordion.component.d.ts +125 -0
- package/accordion/lib/components/accordion/accordion.types.d.ts +64 -0
- package/accordion/lib/components/accordion/index.d.ts +2 -0
- package/accordion/lib/core/types/index.d.ts +133 -0
- package/base-layout/entry-base-layout.d.ts +4 -0
- package/base-layout/index.d.ts +5 -0
- package/base-layout/lib/components/base-layout/base-layout.component.d.ts +108 -0
- package/base-layout/lib/components/base-layout/base-layout.types.d.ts +40 -0
- package/base-layout/lib/components/base-layout/index.d.ts +13 -0
- package/base-layout/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
- package/base-layout/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
- package/base-layout/lib/components/blackbox/blackbox.service.d.ts +144 -0
- package/base-layout/lib/components/blackbox/blackbox.types.d.ts +238 -0
- package/base-layout/lib/components/button/button-area.component.d.ts +93 -0
- package/base-layout/lib/components/button/button.component.d.ts +61 -0
- package/base-layout/lib/components/button/button.types.d.ts +75 -0
- package/base-layout/lib/components/page-header/breadcrumb.service.d.ts +96 -0
- package/base-layout/lib/components/page-header/page-header.component.d.ts +59 -0
- package/base-layout/lib/components/page-header/page-header.types.d.ts +96 -0
- package/base-layout/lib/core/types/index.d.ts +133 -0
- package/blackbox/entry-blackbox.d.ts +4 -0
- package/blackbox/index.d.ts +5 -0
- package/blackbox/lib/components/blackbox/blackbox-debugger.component.d.ts +80 -0
- package/blackbox/lib/components/blackbox/blackbox-debugger.service.d.ts +34 -0
- package/blackbox/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
- package/blackbox/lib/components/blackbox/blackbox-json-viewer.component.d.ts +18 -0
- package/blackbox/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
- package/blackbox/lib/components/blackbox/blackbox.interceptor.d.ts +38 -0
- package/blackbox/lib/components/blackbox/blackbox.service.d.ts +144 -0
- package/blackbox/lib/components/blackbox/blackbox.types.d.ts +238 -0
- package/blackbox/lib/components/blackbox/index.d.ts +23 -0
- package/blackbox/lib/components/blackbox/ui-track.directive.d.ts +20 -0
- package/blackbox/lib/components/button/button-area.component.d.ts +93 -0
- package/blackbox/lib/components/button/button.component.d.ts +61 -0
- package/blackbox/lib/components/button/button.types.d.ts +75 -0
- package/blackbox/lib/components/button/index.d.ts +15 -0
- package/blackbox/lib/components/modal/confirm-dialog.component.d.ts +46 -0
- package/blackbox/lib/components/modal/index.d.ts +4 -0
- package/blackbox/lib/components/modal/modal.component.d.ts +44 -0
- package/blackbox/lib/components/modal/modal.service.d.ts +93 -0
- package/blackbox/lib/components/modal/modal.types.d.ts +110 -0
- package/blackbox/lib/core/types/index.d.ts +133 -0
- package/button/entry-button.d.ts +4 -0
- package/button/index.d.ts +5 -0
- package/button/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
- package/button/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
- package/button/lib/components/blackbox/blackbox.service.d.ts +144 -0
- package/button/lib/components/blackbox/blackbox.types.d.ts +238 -0
- package/button/lib/components/button/button-area.component.d.ts +93 -0
- package/button/lib/components/button/button.component.d.ts +61 -0
- package/button/lib/components/button/button.types.d.ts +75 -0
- package/button/lib/components/button/index.d.ts +15 -0
- package/button/lib/core/types/index.d.ts +133 -0
- package/core/entry-core.d.ts +5 -0
- package/core/index.d.ts +5 -0
- package/core/lib/core/types/index.d.ts +133 -0
- package/core/lib/core/utils/index.d.ts +60 -0
- package/crud-table/entry-crud-table.d.ts +4 -0
- package/crud-table/index.d.ts +5 -0
- package/crud-table/lib/components/accordion/accordion.component.d.ts +125 -0
- package/crud-table/lib/components/accordion/accordion.types.d.ts +64 -0
- package/crud-table/lib/components/accordion/index.d.ts +2 -0
- package/crud-table/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
- package/crud-table/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
- package/crud-table/lib/components/blackbox/blackbox.service.d.ts +144 -0
- package/crud-table/lib/components/blackbox/blackbox.types.d.ts +238 -0
- package/crud-table/lib/components/button/button-area.component.d.ts +93 -0
- package/crud-table/lib/components/button/button.component.d.ts +61 -0
- package/crud-table/lib/components/button/button.types.d.ts +75 -0
- package/crud-table/lib/components/button/index.d.ts +15 -0
- package/crud-table/lib/components/crud-table/crud-table.component.d.ts +143 -0
- package/crud-table/lib/components/crud-table/crud-table.types.d.ts +207 -0
- package/crud-table/lib/components/crud-table/index.d.ts +15 -0
- package/crud-table/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
- package/crud-table/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
- package/crud-table/lib/components/form-builder/form-builder.component.d.ts +279 -0
- package/crud-table/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
- package/crud-table/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
- package/crud-table/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
- package/crud-table/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
- package/crud-table/lib/components/form-builder/services/location.service.d.ts +83 -0
- package/crud-table/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
- package/crud-table/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +31 -0
- package/crud-table/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
- package/crud-table/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
- package/crud-table/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
- package/crud-table/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
- package/crud-table/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
- package/crud-table/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
- package/crud-table/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
- package/crud-table/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
- package/crud-table/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
- package/crud-table/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
- package/crud-table/lib/components/form-builder/types/condition.types.d.ts +51 -0
- package/crud-table/lib/components/form-builder/types/field.types.d.ts +330 -0
- package/crud-table/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
- package/crud-table/lib/components/form-builder/types/schema.types.d.ts +304 -0
- package/crud-table/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
- package/crud-table/lib/components/form-builder/types/validation.types.d.ts +179 -0
- package/crud-table/lib/components/modal/confirm-dialog.component.d.ts +46 -0
- package/crud-table/lib/components/modal/modal.service.d.ts +93 -0
- package/crud-table/lib/components/modal/modal.types.d.ts +110 -0
- package/crud-table/lib/core/logging/logger.config.d.ts +18 -0
- package/crud-table/lib/core/logging/logger.service.d.ts +75 -0
- package/crud-table/lib/core/logging/logger.types.d.ts +70 -0
- package/crud-table/lib/core/types/index.d.ts +133 -0
- package/esm2022/accordion/entry-accordion.mjs +5 -0
- package/esm2022/accordion/gnggln-ng-ui-system-accordion.mjs +5 -0
- package/esm2022/accordion/lib/components/accordion/accordion.component.mjs +398 -0
- package/esm2022/accordion/lib/components/accordion/accordion.types.mjs +6 -0
- package/esm2022/accordion/lib/components/accordion/index.mjs +2 -0
- package/esm2022/accordion/lib/core/types/index.mjs +6 -0
- package/esm2022/base-layout/entry-base-layout.mjs +5 -0
- package/esm2022/base-layout/gnggln-ng-ui-system-base-layout.mjs +5 -0
- package/esm2022/base-layout/lib/components/base-layout/base-layout.component.mjs +272 -0
- package/esm2022/base-layout/lib/components/base-layout/base-layout.types.mjs +6 -0
- package/esm2022/base-layout/lib/components/base-layout/index.mjs +14 -0
- package/esm2022/base-layout/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
- package/esm2022/base-layout/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
- package/esm2022/base-layout/lib/components/blackbox/blackbox.service.mjs +323 -0
- package/esm2022/base-layout/lib/components/blackbox/blackbox.types.mjs +25 -0
- package/esm2022/base-layout/lib/components/button/button-area.component.mjs +210 -0
- package/esm2022/base-layout/lib/components/button/button.component.mjs +180 -0
- package/esm2022/base-layout/lib/components/button/button.types.mjs +6 -0
- package/esm2022/base-layout/lib/components/page-header/breadcrumb.service.mjs +243 -0
- package/esm2022/base-layout/lib/components/page-header/page-header.component.mjs +243 -0
- package/esm2022/base-layout/lib/components/page-header/page-header.types.mjs +21 -0
- package/esm2022/base-layout/lib/core/types/index.mjs +6 -0
- package/esm2022/blackbox/entry-blackbox.mjs +5 -0
- package/esm2022/blackbox/gnggln-ng-ui-system-blackbox.mjs +5 -0
- package/esm2022/blackbox/lib/components/blackbox/blackbox-debugger.component.mjs +904 -0
- package/esm2022/blackbox/lib/components/blackbox/blackbox-debugger.service.mjs +51 -0
- package/esm2022/blackbox/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
- package/esm2022/blackbox/lib/components/blackbox/blackbox-json-viewer.component.mjs +66 -0
- package/esm2022/blackbox/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
- package/esm2022/blackbox/lib/components/blackbox/blackbox.interceptor.mjs +135 -0
- package/esm2022/blackbox/lib/components/blackbox/blackbox.service.mjs +323 -0
- package/esm2022/blackbox/lib/components/blackbox/blackbox.types.mjs +25 -0
- package/esm2022/blackbox/lib/components/blackbox/index.mjs +27 -0
- package/esm2022/blackbox/lib/components/blackbox/ui-track.directive.mjs +69 -0
- package/esm2022/blackbox/lib/components/button/button-area.component.mjs +210 -0
- package/esm2022/blackbox/lib/components/button/button.component.mjs +180 -0
- package/esm2022/blackbox/lib/components/button/button.types.mjs +6 -0
- package/esm2022/blackbox/lib/components/button/index.mjs +16 -0
- package/esm2022/blackbox/lib/components/modal/confirm-dialog.component.mjs +151 -0
- package/esm2022/blackbox/lib/components/modal/index.mjs +4 -0
- package/esm2022/blackbox/lib/components/modal/modal.component.mjs +139 -0
- package/esm2022/blackbox/lib/components/modal/modal.service.mjs +197 -0
- package/esm2022/blackbox/lib/components/modal/modal.types.mjs +6 -0
- package/esm2022/blackbox/lib/core/types/index.mjs +6 -0
- package/esm2022/button/entry-button.mjs +5 -0
- package/esm2022/button/gnggln-ng-ui-system-button.mjs +5 -0
- package/esm2022/button/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
- package/esm2022/button/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
- package/esm2022/button/lib/components/blackbox/blackbox.service.mjs +323 -0
- package/esm2022/button/lib/components/blackbox/blackbox.types.mjs +25 -0
- package/esm2022/button/lib/components/button/button-area.component.mjs +210 -0
- package/esm2022/button/lib/components/button/button.component.mjs +180 -0
- package/esm2022/button/lib/components/button/button.types.mjs +6 -0
- package/esm2022/button/lib/components/button/index.mjs +16 -0
- package/esm2022/button/lib/core/types/index.mjs +6 -0
- package/esm2022/core/entry-core.mjs +6 -0
- package/esm2022/core/gnggln-ng-ui-system-core.mjs +5 -0
- package/esm2022/core/lib/core/types/index.mjs +6 -0
- package/esm2022/core/lib/core/utils/index.mjs +102 -0
- package/esm2022/crud-table/entry-crud-table.mjs +5 -0
- package/esm2022/crud-table/gnggln-ng-ui-system-crud-table.mjs +5 -0
- package/esm2022/crud-table/lib/components/accordion/accordion.component.mjs +398 -0
- package/esm2022/crud-table/lib/components/accordion/accordion.types.mjs +6 -0
- package/esm2022/crud-table/lib/components/accordion/index.mjs +2 -0
- package/esm2022/crud-table/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
- package/esm2022/crud-table/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
- package/esm2022/crud-table/lib/components/blackbox/blackbox.service.mjs +323 -0
- package/esm2022/crud-table/lib/components/blackbox/blackbox.types.mjs +25 -0
- package/esm2022/crud-table/lib/components/button/button-area.component.mjs +210 -0
- package/esm2022/crud-table/lib/components/button/button.component.mjs +180 -0
- package/esm2022/crud-table/lib/components/button/button.types.mjs +6 -0
- package/esm2022/crud-table/lib/components/button/index.mjs +16 -0
- package/esm2022/crud-table/lib/components/crud-table/crud-table.component.mjs +789 -0
- package/esm2022/crud-table/lib/components/crud-table/crud-table.types.mjs +6 -0
- package/esm2022/crud-table/lib/components/crud-table/index.mjs +16 -0
- package/esm2022/crud-table/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
- package/esm2022/crud-table/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
- package/esm2022/crud-table/lib/components/form-builder/form-builder.component.mjs +1351 -0
- package/esm2022/crud-table/lib/components/form-builder/services/form-condition.service.mjs +132 -0
- package/esm2022/crud-table/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
- package/esm2022/crud-table/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
- package/esm2022/crud-table/lib/components/form-builder/services/form-validation.service.mjs +381 -0
- package/esm2022/crud-table/lib/components/form-builder/services/location.service.mjs +141 -0
- package/esm2022/crud-table/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
- package/esm2022/crud-table/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +190 -0
- package/esm2022/crud-table/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
- package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
- package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
- package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
- package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
- package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
- package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
- package/esm2022/crud-table/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
- package/esm2022/crud-table/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
- package/esm2022/crud-table/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
- package/esm2022/crud-table/lib/components/form-builder/types/condition.types.mjs +6 -0
- package/esm2022/crud-table/lib/components/form-builder/types/field.types.mjs +6 -0
- package/esm2022/crud-table/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
- package/esm2022/crud-table/lib/components/form-builder/types/schema.types.mjs +6 -0
- package/esm2022/crud-table/lib/components/form-builder/types/territoriale.types.mjs +6 -0
- package/esm2022/crud-table/lib/components/form-builder/types/validation.types.mjs +10 -0
- package/esm2022/crud-table/lib/components/modal/confirm-dialog.component.mjs +151 -0
- package/esm2022/crud-table/lib/components/modal/modal.service.mjs +197 -0
- package/esm2022/crud-table/lib/components/modal/modal.types.mjs +6 -0
- package/esm2022/crud-table/lib/core/logging/logger.config.mjs +18 -0
- package/esm2022/crud-table/lib/core/logging/logger.service.mjs +295 -0
- package/esm2022/crud-table/lib/core/logging/logger.types.mjs +7 -0
- package/esm2022/crud-table/lib/core/types/index.mjs +6 -0
- package/esm2022/crud-table/lib/sources/location-data.opt.json +8942 -0
- package/esm2022/crud-table/lib/sources/nazioni.opt.json +215 -0
- package/esm2022/form-builder/entry-form-builder.mjs +5 -0
- package/esm2022/form-builder/gnggln-ng-ui-system-form-builder.mjs +5 -0
- package/esm2022/form-builder/lib/components/accordion/accordion.component.mjs +398 -0
- package/esm2022/form-builder/lib/components/accordion/accordion.types.mjs +6 -0
- package/esm2022/form-builder/lib/components/accordion/index.mjs +2 -0
- package/esm2022/form-builder/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
- package/esm2022/form-builder/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
- package/esm2022/form-builder/lib/components/blackbox/blackbox.service.mjs +323 -0
- package/esm2022/form-builder/lib/components/blackbox/blackbox.types.mjs +25 -0
- package/esm2022/form-builder/lib/components/button/button-area.component.mjs +210 -0
- package/esm2022/form-builder/lib/components/button/button.component.mjs +180 -0
- package/esm2022/form-builder/lib/components/button/button.types.mjs +6 -0
- package/esm2022/form-builder/lib/components/button/index.mjs +16 -0
- package/esm2022/form-builder/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
- package/esm2022/form-builder/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
- package/esm2022/form-builder/lib/components/form-builder/form-builder.component.mjs +1351 -0
- package/esm2022/form-builder/lib/components/form-builder/form-wizard.component.mjs +1064 -0
- package/esm2022/form-builder/lib/components/form-builder/index.mjs +24 -0
- package/esm2022/form-builder/lib/components/form-builder/services/form-condition.service.mjs +132 -0
- package/esm2022/form-builder/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
- package/esm2022/form-builder/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
- package/esm2022/form-builder/lib/components/form-builder/services/form-validation.service.mjs +381 -0
- package/esm2022/form-builder/lib/components/form-builder/services/location.service.mjs +141 -0
- package/esm2022/form-builder/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
- package/esm2022/form-builder/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
- package/esm2022/form-builder/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +190 -0
- package/esm2022/form-builder/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
- package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
- package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
- package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
- package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
- package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
- package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
- package/esm2022/form-builder/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
- package/esm2022/form-builder/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
- package/esm2022/form-builder/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
- package/esm2022/form-builder/lib/components/form-builder/types/condition.types.mjs +6 -0
- package/esm2022/form-builder/lib/components/form-builder/types/field.types.mjs +6 -0
- package/esm2022/form-builder/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
- package/esm2022/form-builder/lib/components/form-builder/types/index.mjs +3 -0
- package/esm2022/form-builder/lib/components/form-builder/types/schema.types.mjs +6 -0
- package/esm2022/form-builder/lib/components/form-builder/types/territoriale.types.mjs +6 -0
- package/esm2022/form-builder/lib/components/form-builder/types/validation.types.mjs +10 -0
- package/esm2022/form-builder/lib/core/logging/logger.config.mjs +18 -0
- package/esm2022/form-builder/lib/core/logging/logger.service.mjs +295 -0
- package/esm2022/form-builder/lib/core/logging/logger.types.mjs +7 -0
- package/esm2022/form-builder/lib/core/types/index.mjs +6 -0
- package/esm2022/form-builder/lib/sources/location-data.opt.json +8942 -0
- package/esm2022/form-builder/lib/sources/nazioni.opt.json +215 -0
- package/esm2022/form-builder-editor/entry-form-builder-editor.mjs +5 -0
- package/esm2022/form-builder-editor/gnggln-ng-ui-system-form-builder-editor.mjs +5 -0
- package/esm2022/form-builder-editor/lib/components/accordion/accordion.component.mjs +398 -0
- package/esm2022/form-builder-editor/lib/components/accordion/accordion.types.mjs +6 -0
- package/esm2022/form-builder-editor/lib/components/accordion/index.mjs +2 -0
- package/esm2022/form-builder-editor/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
- package/esm2022/form-builder-editor/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
- package/esm2022/form-builder-editor/lib/components/blackbox/blackbox.service.mjs +323 -0
- package/esm2022/form-builder-editor/lib/components/blackbox/blackbox.types.mjs +25 -0
- package/esm2022/form-builder-editor/lib/components/button/button-area.component.mjs +210 -0
- package/esm2022/form-builder-editor/lib/components/button/button.component.mjs +180 -0
- package/esm2022/form-builder-editor/lib/components/button/button.types.mjs +6 -0
- package/esm2022/form-builder-editor/lib/components/button/index.mjs +16 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/form-builder.component.mjs +1351 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/services/form-condition.service.mjs +132 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/services/form-validation.service.mjs +381 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/services/location.service.mjs +141 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +190 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/types/condition.types.mjs +6 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/types/field.types.mjs +6 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/types/index.mjs +3 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/types/schema.types.mjs +6 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/types/territoriale.types.mjs +6 -0
- package/esm2022/form-builder-editor/lib/components/form-builder/types/validation.types.mjs +10 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/index.mjs +23 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/presets/editor-presets.mjs +395 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +473 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
- package/esm2022/form-builder-editor/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
- package/esm2022/form-builder-editor/lib/components/modal/confirm-dialog.component.mjs +151 -0
- package/esm2022/form-builder-editor/lib/components/modal/index.mjs +4 -0
- package/esm2022/form-builder-editor/lib/components/modal/modal.component.mjs +139 -0
- package/esm2022/form-builder-editor/lib/components/modal/modal.service.mjs +197 -0
- package/esm2022/form-builder-editor/lib/components/modal/modal.types.mjs +6 -0
- package/esm2022/form-builder-editor/lib/core/logging/logger.config.mjs +18 -0
- package/esm2022/form-builder-editor/lib/core/logging/logger.service.mjs +295 -0
- package/esm2022/form-builder-editor/lib/core/logging/logger.types.mjs +7 -0
- package/esm2022/form-builder-editor/lib/core/types/index.mjs +6 -0
- package/esm2022/form-builder-editor/lib/sources/location-data.opt.json +8942 -0
- package/esm2022/form-builder-editor/lib/sources/nazioni.opt.json +215 -0
- package/esm2022/http/entry-http.mjs +5 -0
- package/esm2022/http/gnggln-ng-ui-system-http.mjs +5 -0
- package/esm2022/http/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
- package/esm2022/http/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
- package/esm2022/http/lib/components/blackbox/blackbox.service.mjs +323 -0
- package/esm2022/http/lib/components/blackbox/blackbox.types.mjs +25 -0
- package/esm2022/http/lib/components/http/http-message.handler.mjs +143 -0
- package/esm2022/http/lib/components/http/http.service.mjs +228 -0
- package/esm2022/http/lib/components/http/http.tokens.mjs +29 -0
- package/esm2022/http/lib/components/http/http.types.mjs +6 -0
- package/esm2022/http/lib/components/http/index.mjs +19 -0
- package/esm2022/http/lib/components/layout-builder/layout-builder.types.mjs +9 -0
- package/esm2022/http/lib/components/layout-builder/layout.service.mjs +239 -0
- package/esm2022/http/lib/components/toast/toast-container.component.mjs +80 -0
- package/esm2022/http/lib/components/toast/toast.component.mjs +151 -0
- package/esm2022/http/lib/components/toast/toast.service.mjs +156 -0
- package/esm2022/http/lib/components/toast/toast.types.mjs +12 -0
- package/esm2022/http/lib/core/types/index.mjs +6 -0
- package/esm2022/http/lib/core/utils/index.mjs +102 -0
- package/esm2022/layout-builder/entry-layout-builder.mjs +5 -0
- package/esm2022/layout-builder/gnggln-ng-ui-system-layout-builder.mjs +5 -0
- package/esm2022/layout-builder/lib/components/layout-builder/index.mjs +18 -0
- package/esm2022/layout-builder/lib/components/layout-builder/layout-builder.component.mjs +1804 -0
- package/esm2022/layout-builder/lib/components/layout-builder/layout-builder.types.mjs +9 -0
- package/esm2022/layout-builder/lib/components/layout-builder/layout.service.mjs +239 -0
- package/esm2022/layout-builder/lib/core/types/index.mjs +6 -0
- package/esm2022/lib/components/accordion/accordion.component.mjs +106 -61
- package/esm2022/lib/components/accordion/accordion.types.mjs +1 -1
- package/esm2022/lib/components/base-layout/base-layout.component.mjs +88 -34
- package/esm2022/lib/components/base-layout/base-layout.types.mjs +1 -1
- package/esm2022/lib/components/base-layout/index.mjs +1 -1
- package/esm2022/lib/components/blackbox/blackbox-debugger.component.mjs +904 -0
- package/esm2022/lib/components/blackbox/blackbox-debugger.service.mjs +51 -0
- package/esm2022/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
- package/esm2022/lib/components/blackbox/blackbox-json-viewer.component.mjs +66 -0
- package/esm2022/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
- package/esm2022/lib/components/blackbox/blackbox.interceptor.mjs +135 -0
- package/esm2022/lib/components/blackbox/blackbox.service.mjs +323 -0
- package/esm2022/lib/components/blackbox/blackbox.types.mjs +25 -0
- package/esm2022/lib/components/blackbox/index.mjs +27 -0
- package/esm2022/lib/components/blackbox/ui-track.directive.mjs +69 -0
- package/esm2022/lib/components/button/button-area.component.mjs +16 -2
- package/esm2022/lib/components/button/button.component.mjs +23 -7
- package/esm2022/lib/components/button/button.types.mjs +1 -1
- package/esm2022/lib/components/crud-table/crud-table.component.mjs +14 -14
- package/esm2022/lib/components/form-builder/form-builder.component.mjs +710 -183
- package/esm2022/lib/components/form-builder/form-wizard.component.mjs +789 -235
- package/esm2022/lib/components/form-builder/index.mjs +7 -2
- package/esm2022/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
- package/esm2022/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
- package/esm2022/lib/components/form-builder/services/location.service.mjs +4 -3
- package/esm2022/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
- package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +142 -113
- package/esm2022/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
- package/esm2022/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
- package/esm2022/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
- package/esm2022/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
- package/esm2022/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
- package/esm2022/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
- package/esm2022/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
- package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +3 -3
- package/esm2022/lib/components/form-builder/types/field.types.mjs +1 -1
- package/esm2022/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/index.mjs +3 -2
- package/esm2022/lib/components/form-builder/types/schema.types.mjs +1 -1
- package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -2
- package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +3 -3
- package/esm2022/lib/components/form-builder-editor/index.mjs +3 -1
- package/esm2022/lib/components/form-builder-editor/presets/editor-presets.mjs +395 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +2 -2
- package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +2 -1
- package/esm2022/lib/components/http/http-message.handler.mjs +143 -0
- package/esm2022/lib/components/http/http.service.mjs +228 -0
- package/esm2022/lib/components/http/http.tokens.mjs +29 -0
- package/esm2022/lib/components/http/http.types.mjs +6 -0
- package/esm2022/lib/components/http/index.mjs +19 -0
- package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +27 -15
- package/esm2022/lib/components/modal/confirm-dialog.component.mjs +3 -3
- package/esm2022/lib/components/modal/modal.service.mjs +5 -2
- package/esm2022/lib/components/page-header/breadcrumb.service.mjs +5 -4
- package/esm2022/lib/components/table/paginated-table.component.mjs +17 -3
- package/esm2022/lib/components/table/table.types.mjs +1 -1
- package/esm2022/lib/components/toast/index.mjs +18 -0
- package/esm2022/lib/components/toast/toast-container.component.mjs +80 -0
- package/esm2022/lib/components/toast/toast.component.mjs +151 -0
- package/esm2022/lib/components/toast/toast.service.mjs +156 -0
- package/esm2022/lib/components/toast/toast.types.mjs +12 -0
- package/esm2022/lib/core/logging/index.mjs +10 -0
- package/esm2022/lib/core/logging/logger.config.mjs +18 -0
- package/esm2022/lib/core/logging/logger.service.mjs +295 -0
- package/esm2022/lib/core/logging/logger.types.mjs +7 -0
- package/esm2022/lib/core/types/index.mjs +1 -1
- package/esm2022/lib/core/utils/index.mjs +50 -1
- package/esm2022/lib/version/ng-ui-system-version.mjs +12 -0
- package/esm2022/modal/entry-modal.mjs +5 -0
- package/esm2022/modal/gnggln-ng-ui-system-modal.mjs +5 -0
- package/esm2022/modal/lib/components/button/button.component.mjs +180 -0
- package/esm2022/modal/lib/components/button/button.types.mjs +6 -0
- package/esm2022/modal/lib/components/modal/confirm-dialog.component.mjs +151 -0
- package/esm2022/modal/lib/components/modal/index.mjs +4 -0
- package/esm2022/modal/lib/components/modal/modal.component.mjs +139 -0
- package/esm2022/modal/lib/components/modal/modal.service.mjs +197 -0
- package/esm2022/modal/lib/components/modal/modal.types.mjs +6 -0
- package/esm2022/modal/lib/core/types/index.mjs +6 -0
- package/esm2022/page-header/entry-page-header.mjs +5 -0
- package/esm2022/page-header/gnggln-ng-ui-system-page-header.mjs +5 -0
- package/esm2022/page-header/lib/components/page-header/breadcrumb.service.mjs +243 -0
- package/esm2022/page-header/lib/components/page-header/index.mjs +20 -0
- package/esm2022/page-header/lib/components/page-header/page-header.component.mjs +243 -0
- package/esm2022/page-header/lib/components/page-header/page-header.types.mjs +21 -0
- package/esm2022/public-api.mjs +17 -8
- package/esm2022/table/entry-table.mjs +5 -0
- package/esm2022/table/gnggln-ng-ui-system-table.mjs +5 -0
- package/esm2022/table/lib/components/table/index.mjs +2 -0
- package/esm2022/table/lib/components/table/paginated-table.component.mjs +421 -0
- package/esm2022/table/lib/components/table/table.types.mjs +6 -0
- package/esm2022/table/lib/core/utils/index.mjs +102 -0
- package/esm2022/toast/entry-toast.mjs +5 -0
- package/esm2022/toast/gnggln-ng-ui-system-toast.mjs +5 -0
- package/esm2022/toast/lib/components/toast/index.mjs +18 -0
- package/esm2022/toast/lib/components/toast/toast-container.component.mjs +80 -0
- package/esm2022/toast/lib/components/toast/toast.component.mjs +151 -0
- package/esm2022/toast/lib/components/toast/toast.service.mjs +156 -0
- package/esm2022/toast/lib/components/toast/toast.types.mjs +12 -0
- package/esm2022/toast/lib/core/types/index.mjs +6 -0
- package/esm2022/toast/lib/core/utils/index.mjs +102 -0
- package/fesm2022/gnggln-ng-ui-system-accordion.mjs +409 -0
- package/fesm2022/gnggln-ng-ui-system-accordion.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-base-layout.mjs +1905 -0
- package/fesm2022/gnggln-ng-ui-system-base-layout.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-blackbox.mjs +2829 -0
- package/fesm2022/gnggln-ng-ui-system-blackbox.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-button.mjs +1148 -0
- package/fesm2022/gnggln-ng-ui-system-button.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-core.mjs +117 -0
- package/fesm2022/gnggln-ng-ui-system-core.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-crud-table.mjs +49600 -0
- package/fesm2022/gnggln-ng-ui-system-crud-table.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs +54332 -0
- package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-form-builder.mjs +49609 -0
- package/fesm2022/gnggln-ng-ui-system-form-builder.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-http.mjs +1878 -0
- package/fesm2022/gnggln-ng-ui-system-http.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-layout-builder.mjs +2064 -0
- package/fesm2022/gnggln-ng-ui-system-layout-builder.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-modal.mjs +664 -0
- package/fesm2022/gnggln-ng-ui-system-modal.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-page-header.mjs +526 -0
- package/fesm2022/gnggln-ng-ui-system-page-header.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-table.mjs +533 -0
- package/fesm2022/gnggln-ng-ui-system-table.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system-toast.mjs +516 -0
- package/fesm2022/gnggln-ng-ui-system-toast.mjs.map +1 -0
- package/fesm2022/gnggln-ng-ui-system.mjs +10068 -4234
- package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -1
- package/form-builder/entry-form-builder.d.ts +4 -0
- package/form-builder/index.d.ts +5 -0
- package/form-builder/lib/components/accordion/accordion.component.d.ts +125 -0
- package/form-builder/lib/components/accordion/accordion.types.d.ts +64 -0
- package/form-builder/lib/components/accordion/index.d.ts +2 -0
- package/form-builder/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
- package/form-builder/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
- package/form-builder/lib/components/blackbox/blackbox.service.d.ts +144 -0
- package/form-builder/lib/components/blackbox/blackbox.types.d.ts +238 -0
- package/form-builder/lib/components/button/button-area.component.d.ts +93 -0
- package/form-builder/lib/components/button/button.component.d.ts +61 -0
- package/form-builder/lib/components/button/button.types.d.ts +75 -0
- package/form-builder/lib/components/button/index.d.ts +15 -0
- package/form-builder/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
- package/form-builder/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
- package/form-builder/lib/components/form-builder/form-builder.component.d.ts +279 -0
- package/form-builder/lib/components/form-builder/form-wizard.component.d.ts +172 -0
- package/form-builder/lib/components/form-builder/index.d.ts +19 -0
- package/form-builder/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
- package/form-builder/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
- package/form-builder/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
- package/form-builder/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
- package/form-builder/lib/components/form-builder/services/location.service.d.ts +83 -0
- package/form-builder/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
- package/form-builder/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
- package/form-builder/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +31 -0
- package/form-builder/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
- package/form-builder/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
- package/form-builder/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
- package/form-builder/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
- package/form-builder/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
- package/form-builder/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
- package/form-builder/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
- package/form-builder/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
- package/form-builder/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
- package/form-builder/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
- package/form-builder/lib/components/form-builder/types/condition.types.d.ts +51 -0
- package/form-builder/lib/components/form-builder/types/field.types.d.ts +330 -0
- package/form-builder/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
- package/form-builder/lib/components/form-builder/types/index.d.ts +6 -0
- package/form-builder/lib/components/form-builder/types/schema.types.d.ts +304 -0
- package/form-builder/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
- package/form-builder/lib/components/form-builder/types/validation.types.d.ts +179 -0
- package/form-builder/lib/core/logging/logger.config.d.ts +18 -0
- package/form-builder/lib/core/logging/logger.service.d.ts +75 -0
- package/form-builder/lib/core/logging/logger.types.d.ts +70 -0
- package/form-builder/lib/core/types/index.d.ts +133 -0
- package/form-builder-editor/entry-form-builder-editor.d.ts +4 -0
- package/form-builder-editor/index.d.ts +5 -0
- package/form-builder-editor/lib/components/accordion/accordion.component.d.ts +125 -0
- package/form-builder-editor/lib/components/accordion/accordion.types.d.ts +64 -0
- package/form-builder-editor/lib/components/accordion/index.d.ts +2 -0
- package/form-builder-editor/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
- package/form-builder-editor/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
- package/form-builder-editor/lib/components/blackbox/blackbox.service.d.ts +144 -0
- package/form-builder-editor/lib/components/blackbox/blackbox.types.d.ts +238 -0
- package/form-builder-editor/lib/components/button/button-area.component.d.ts +93 -0
- package/form-builder-editor/lib/components/button/button.component.d.ts +61 -0
- package/form-builder-editor/lib/components/button/button.types.d.ts +75 -0
- package/form-builder-editor/lib/components/button/index.d.ts +15 -0
- package/form-builder-editor/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
- package/form-builder-editor/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
- package/form-builder-editor/lib/components/form-builder/form-builder.component.d.ts +279 -0
- package/form-builder-editor/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
- package/form-builder-editor/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
- package/form-builder-editor/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
- package/form-builder-editor/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
- package/form-builder-editor/lib/components/form-builder/services/location.service.d.ts +83 -0
- package/form-builder-editor/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
- package/form-builder-editor/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +31 -0
- package/form-builder-editor/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
- package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
- package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
- package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
- package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
- package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
- package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
- package/form-builder-editor/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
- package/form-builder-editor/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
- package/form-builder-editor/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
- package/form-builder-editor/lib/components/form-builder/types/condition.types.d.ts +51 -0
- package/form-builder-editor/lib/components/form-builder/types/field.types.d.ts +330 -0
- package/form-builder-editor/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
- package/form-builder-editor/lib/components/form-builder/types/index.d.ts +6 -0
- package/form-builder-editor/lib/components/form-builder/types/schema.types.d.ts +304 -0
- package/form-builder-editor/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
- package/form-builder-editor/lib/components/form-builder/types/validation.types.d.ts +179 -0
- package/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
- package/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
- package/form-builder-editor/lib/components/form-builder-editor/index.d.ts +17 -0
- package/form-builder-editor/lib/components/form-builder-editor/presets/editor-presets.d.ts +25 -0
- package/form-builder-editor/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
- package/form-builder-editor/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
- package/form-builder-editor/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
- package/form-builder-editor/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
- package/form-builder-editor/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
- package/form-builder-editor/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
- package/form-builder-editor/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
- package/form-builder-editor/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
- package/form-builder-editor/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
- package/form-builder-editor/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
- package/form-builder-editor/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
- package/form-builder-editor/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
- package/form-builder-editor/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
- package/form-builder-editor/lib/components/modal/confirm-dialog.component.d.ts +46 -0
- package/form-builder-editor/lib/components/modal/index.d.ts +4 -0
- package/form-builder-editor/lib/components/modal/modal.component.d.ts +44 -0
- package/form-builder-editor/lib/components/modal/modal.service.d.ts +93 -0
- package/form-builder-editor/lib/components/modal/modal.types.d.ts +110 -0
- package/form-builder-editor/lib/core/logging/logger.config.d.ts +18 -0
- package/form-builder-editor/lib/core/logging/logger.service.d.ts +75 -0
- package/form-builder-editor/lib/core/logging/logger.types.d.ts +70 -0
- package/form-builder-editor/lib/core/types/index.d.ts +133 -0
- package/http/entry-http.d.ts +4 -0
- package/http/index.d.ts +5 -0
- package/http/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
- package/http/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
- package/http/lib/components/blackbox/blackbox.service.d.ts +144 -0
- package/http/lib/components/blackbox/blackbox.types.d.ts +238 -0
- package/http/lib/components/http/http-message.handler.d.ts +59 -0
- package/http/lib/components/http/http.service.d.ts +98 -0
- package/http/lib/components/http/http.tokens.d.ts +29 -0
- package/http/lib/components/http/http.types.d.ts +50 -0
- package/http/lib/components/http/index.d.ts +17 -0
- package/http/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
- package/http/lib/components/layout-builder/layout.service.d.ts +100 -0
- package/http/lib/components/toast/toast-container.component.d.ts +27 -0
- package/http/lib/components/toast/toast.component.d.ts +37 -0
- package/http/lib/components/toast/toast.service.d.ts +39 -0
- package/http/lib/components/toast/toast.types.d.ts +52 -0
- package/http/lib/core/types/index.d.ts +133 -0
- package/http/lib/core/utils/index.d.ts +60 -0
- package/layout-builder/entry-layout-builder.d.ts +4 -0
- package/layout-builder/index.d.ts +5 -0
- package/layout-builder/lib/components/layout-builder/index.d.ts +16 -0
- package/layout-builder/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
- package/layout-builder/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
- package/layout-builder/lib/components/layout-builder/layout.service.d.ts +100 -0
- package/layout-builder/lib/core/types/index.d.ts +133 -0
- package/lib/components/accordion/accordion.component.d.ts +10 -3
- package/lib/components/accordion/accordion.types.d.ts +2 -0
- package/lib/components/base-layout/base-layout.component.d.ts +36 -11
- package/lib/components/base-layout/base-layout.types.d.ts +14 -0
- package/lib/components/base-layout/index.d.ts +1 -1
- package/lib/components/blackbox/blackbox-debugger.component.d.ts +80 -0
- package/lib/components/blackbox/blackbox-debugger.service.d.ts +34 -0
- package/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
- package/lib/components/blackbox/blackbox-json-viewer.component.d.ts +18 -0
- package/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
- package/lib/components/blackbox/blackbox.interceptor.d.ts +38 -0
- package/lib/components/blackbox/blackbox.service.d.ts +144 -0
- package/lib/components/blackbox/blackbox.types.d.ts +238 -0
- package/lib/components/blackbox/index.d.ts +23 -0
- package/lib/components/blackbox/ui-track.directive.d.ts +20 -0
- package/lib/components/button/button-area.component.d.ts +6 -1
- package/lib/components/button/button.component.d.ts +8 -2
- package/lib/components/button/button.types.d.ts +5 -0
- package/lib/components/form-builder/form-builder.component.d.ts +125 -29
- package/lib/components/form-builder/form-wizard.component.d.ts +89 -4
- package/lib/components/form-builder/index.d.ts +7 -1
- package/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
- package/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
- package/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
- package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +9 -6
- package/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
- package/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
- package/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
- package/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
- package/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
- package/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
- package/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
- package/lib/components/form-builder/types/field.types.d.ts +48 -6
- package/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
- package/lib/components/form-builder/types/index.d.ts +4 -3
- package/lib/components/form-builder/types/schema.types.d.ts +83 -6
- package/lib/components/form-builder/types/validation.types.d.ts +5 -0
- package/lib/components/form-builder-editor/index.d.ts +2 -0
- package/lib/components/form-builder-editor/presets/editor-presets.d.ts +25 -0
- package/lib/components/http/http-message.handler.d.ts +59 -0
- package/lib/components/http/http.service.d.ts +98 -0
- package/lib/components/http/http.tokens.d.ts +29 -0
- package/lib/components/http/http.types.d.ts +50 -0
- package/lib/components/http/index.d.ts +17 -0
- package/lib/components/page-header/breadcrumb.service.d.ts +2 -2
- package/lib/components/table/table.types.d.ts +5 -0
- package/lib/components/toast/index.d.ts +17 -0
- package/lib/components/toast/toast-container.component.d.ts +27 -0
- package/lib/components/toast/toast.component.d.ts +37 -0
- package/lib/components/toast/toast.service.d.ts +39 -0
- package/lib/components/toast/toast.types.d.ts +52 -0
- package/lib/core/logging/index.d.ts +8 -0
- package/lib/core/logging/logger.config.d.ts +18 -0
- package/lib/core/logging/logger.service.d.ts +75 -0
- package/lib/core/logging/logger.types.d.ts +70 -0
- package/lib/core/types/index.d.ts +76 -0
- package/lib/core/utils/index.d.ts +31 -0
- package/lib/version/ng-ui-system-version.d.ts +9 -0
- package/modal/entry-modal.d.ts +4 -0
- package/modal/index.d.ts +5 -0
- package/modal/lib/components/button/button.component.d.ts +61 -0
- package/modal/lib/components/button/button.types.d.ts +75 -0
- package/modal/lib/components/modal/confirm-dialog.component.d.ts +46 -0
- package/modal/lib/components/modal/index.d.ts +4 -0
- package/modal/lib/components/modal/modal.component.d.ts +44 -0
- package/modal/lib/components/modal/modal.service.d.ts +93 -0
- package/modal/lib/components/modal/modal.types.d.ts +110 -0
- package/modal/lib/core/types/index.d.ts +133 -0
- package/package.json +93 -8
- package/page-header/entry-page-header.d.ts +4 -0
- package/page-header/index.d.ts +5 -0
- package/page-header/lib/components/page-header/breadcrumb.service.d.ts +96 -0
- package/page-header/lib/components/page-header/index.d.ts +16 -0
- package/page-header/lib/components/page-header/page-header.component.d.ts +59 -0
- package/page-header/lib/components/page-header/page-header.types.d.ts +96 -0
- package/public-api.d.ts +11 -6
- package/table/entry-table.d.ts +4 -0
- package/table/index.d.ts +5 -0
- package/table/lib/components/table/index.d.ts +2 -0
- package/table/lib/components/table/paginated-table.component.d.ts +85 -0
- package/table/lib/components/table/table.types.d.ts +86 -0
- package/table/lib/core/utils/index.d.ts +60 -0
- package/toast/entry-toast.d.ts +4 -0
- package/toast/index.d.ts +5 -0
- package/toast/lib/components/toast/index.d.ts +17 -0
- package/toast/lib/components/toast/toast-container.component.d.ts +27 -0
- package/toast/lib/components/toast/toast.component.d.ts +37 -0
- package/toast/lib/components/toast/toast.service.d.ts +39 -0
- package/toast/lib/components/toast/toast.types.d.ts +52 -0
- package/toast/lib/core/types/index.d.ts +133 -0
- package/toast/lib/core/utils/index.d.ts +60 -0
|
@@ -0,0 +1,1064 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ChangeDetectorRef, ViewEncapsulation, ViewChild, inject, HostListener, } from '@angular/core';
|
|
2
|
+
import { LucideAngularModule } from 'lucide-angular';
|
|
3
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
4
|
+
import { UiButtonComponent } from '../../components/button/index';
|
|
5
|
+
import { UiFormBuilderComponent } from './form-builder.component';
|
|
6
|
+
import { UiWizardSyncService, } from './services/wizard-sync.service';
|
|
7
|
+
import { UiLoggerService } from '../../core/logging/logger.service';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "lucide-angular";
|
|
10
|
+
// ─── Componenti interni ───────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Header del wizard: progresso e info dello step corrente.
|
|
13
|
+
* Con `progressStyle: 'steps'` emette `stepSelect` per saltare a uno step già completato.
|
|
14
|
+
*/
|
|
15
|
+
export class UiWizardHeaderComponent {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.stepGroups = [];
|
|
18
|
+
this.progressPercent = 0;
|
|
19
|
+
this.currentStepTitle = '';
|
|
20
|
+
this.currentStepDescription = '';
|
|
21
|
+
/** Quando true, i bullet step non sono interattivi (es. wizard disabilitato). */
|
|
22
|
+
this.disableStepIndicators = false;
|
|
23
|
+
this.stepSelect = new EventEmitter();
|
|
24
|
+
}
|
|
25
|
+
/** Indice step selezionabile tramite bullet/titolo (solo step già completati, non il corrente). */
|
|
26
|
+
isStepIndicatorNavigable(stepIndex) {
|
|
27
|
+
if (this.config.allowStepIndicatorNavigation === false)
|
|
28
|
+
return false;
|
|
29
|
+
if (this.disableStepIndicators)
|
|
30
|
+
return false;
|
|
31
|
+
if (this.config.allowBackNavigation === false)
|
|
32
|
+
return false;
|
|
33
|
+
return (stepIndex !== this.state.currentStep &&
|
|
34
|
+
this.state.completedSteps.has(stepIndex));
|
|
35
|
+
}
|
|
36
|
+
/** Testo accessibile per il pulsante step (navigazione). */
|
|
37
|
+
stepAriaLabel(stepTitle) {
|
|
38
|
+
return `Vai allo step: ${stepTitle}`;
|
|
39
|
+
}
|
|
40
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
41
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiWizardHeaderComponent, isStandalone: true, selector: "ui-wizard-header", inputs: { config: "config", stepGroups: "stepGroups", state: "state", progressPercent: "progressPercent", currentStepTitle: "currentStepTitle", currentStepDescription: "currentStepDescription", disableStepIndicators: "disableStepIndicators" }, outputs: { stepSelect: "stepSelect" }, ngImport: i0, template: `
|
|
42
|
+
<div class="ui-form-wizard__header">
|
|
43
|
+
@if (config.showProgress !== false) {
|
|
44
|
+
@if (config.progressStyle !== 'steps') {
|
|
45
|
+
<div class="ui-form-wizard__progress-bar">
|
|
46
|
+
<div
|
|
47
|
+
class="ui-form-wizard__progress-fill"
|
|
48
|
+
[style.width.%]="progressPercent"
|
|
49
|
+
></div>
|
|
50
|
+
</div>
|
|
51
|
+
<span class="ui-form-wizard__progress-text">
|
|
52
|
+
{{ progressPercent }}% completato
|
|
53
|
+
</span>
|
|
54
|
+
} @else {
|
|
55
|
+
<div class="ui-form-wizard__steps">
|
|
56
|
+
@for (
|
|
57
|
+
group of stepGroups;
|
|
58
|
+
track $index;
|
|
59
|
+
let i = $index
|
|
60
|
+
) {
|
|
61
|
+
<div
|
|
62
|
+
class="ui-form-wizard__step"
|
|
63
|
+
[class.ui-form-wizard__step--current]="
|
|
64
|
+
i === state.currentStep
|
|
65
|
+
"
|
|
66
|
+
[class.ui-form-wizard__step--completed]="
|
|
67
|
+
state.completedSteps.has(i)
|
|
68
|
+
"
|
|
69
|
+
[class.ui-form-wizard__step--visited]="
|
|
70
|
+
state.visitedSteps.has(i)
|
|
71
|
+
"
|
|
72
|
+
[class.ui-form-wizard__step--navigable]="
|
|
73
|
+
isStepIndicatorNavigable(i)
|
|
74
|
+
"
|
|
75
|
+
>
|
|
76
|
+
@if (isStepIndicatorNavigable(i)) {
|
|
77
|
+
<button
|
|
78
|
+
type="button"
|
|
79
|
+
class="ui-form-wizard__step-trigger"
|
|
80
|
+
[attr.aria-label]="
|
|
81
|
+
stepAriaLabel(
|
|
82
|
+
group[0].wizardStep?.stepTitle ||
|
|
83
|
+
group[0].title ||
|
|
84
|
+
'Step ' + (i + 1)
|
|
85
|
+
)
|
|
86
|
+
"
|
|
87
|
+
(click)="stepSelect.emit(i)"
|
|
88
|
+
>
|
|
89
|
+
<div class="ui-form-wizard__step-circle">
|
|
90
|
+
@if (state.completedSteps.has(i)) {
|
|
91
|
+
<lucide-icon name="check" [size]="16" />
|
|
92
|
+
} @else {
|
|
93
|
+
<span>{{ i + 1 }}</span>
|
|
94
|
+
}
|
|
95
|
+
</div>
|
|
96
|
+
<div class="ui-form-wizard__step-label">
|
|
97
|
+
{{
|
|
98
|
+
group[0].wizardStep?.stepTitle ||
|
|
99
|
+
group[0].title ||
|
|
100
|
+
'Step ' + (i + 1)
|
|
101
|
+
}}
|
|
102
|
+
</div>
|
|
103
|
+
</button>
|
|
104
|
+
} @else {
|
|
105
|
+
<div
|
|
106
|
+
class="ui-form-wizard__step-static"
|
|
107
|
+
[attr.aria-current]="
|
|
108
|
+
i === state.currentStep ? 'step' : null
|
|
109
|
+
"
|
|
110
|
+
>
|
|
111
|
+
<div class="ui-form-wizard__step-circle">
|
|
112
|
+
@if (state.completedSteps.has(i)) {
|
|
113
|
+
<lucide-icon name="check" [size]="16" />
|
|
114
|
+
} @else {
|
|
115
|
+
<span>{{ i + 1 }}</span>
|
|
116
|
+
}
|
|
117
|
+
</div>
|
|
118
|
+
<div class="ui-form-wizard__step-label">
|
|
119
|
+
{{
|
|
120
|
+
group[0].wizardStep?.stepTitle ||
|
|
121
|
+
group[0].title ||
|
|
122
|
+
'Step ' + (i + 1)
|
|
123
|
+
}}
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
}
|
|
127
|
+
</div>
|
|
128
|
+
}
|
|
129
|
+
</div>
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
<div class="ui-form-wizard__step-info">
|
|
134
|
+
<h2 class="ui-form-wizard__step-title">{{ currentStepTitle }}</h2>
|
|
135
|
+
@if (currentStepDescription) {
|
|
136
|
+
<p class="ui-form-wizard__step-description">
|
|
137
|
+
{{ currentStepDescription }}
|
|
138
|
+
</p>
|
|
139
|
+
}
|
|
140
|
+
<span class="ui-form-wizard__step-counter">
|
|
141
|
+
Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}
|
|
142
|
+
</span>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
146
|
+
}
|
|
147
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardHeaderComponent, decorators: [{
|
|
148
|
+
type: Component,
|
|
149
|
+
args: [{
|
|
150
|
+
selector: 'ui-wizard-header',
|
|
151
|
+
standalone: true,
|
|
152
|
+
imports: [LucideAngularModule],
|
|
153
|
+
encapsulation: ViewEncapsulation.None,
|
|
154
|
+
template: `
|
|
155
|
+
<div class="ui-form-wizard__header">
|
|
156
|
+
@if (config.showProgress !== false) {
|
|
157
|
+
@if (config.progressStyle !== 'steps') {
|
|
158
|
+
<div class="ui-form-wizard__progress-bar">
|
|
159
|
+
<div
|
|
160
|
+
class="ui-form-wizard__progress-fill"
|
|
161
|
+
[style.width.%]="progressPercent"
|
|
162
|
+
></div>
|
|
163
|
+
</div>
|
|
164
|
+
<span class="ui-form-wizard__progress-text">
|
|
165
|
+
{{ progressPercent }}% completato
|
|
166
|
+
</span>
|
|
167
|
+
} @else {
|
|
168
|
+
<div class="ui-form-wizard__steps">
|
|
169
|
+
@for (
|
|
170
|
+
group of stepGroups;
|
|
171
|
+
track $index;
|
|
172
|
+
let i = $index
|
|
173
|
+
) {
|
|
174
|
+
<div
|
|
175
|
+
class="ui-form-wizard__step"
|
|
176
|
+
[class.ui-form-wizard__step--current]="
|
|
177
|
+
i === state.currentStep
|
|
178
|
+
"
|
|
179
|
+
[class.ui-form-wizard__step--completed]="
|
|
180
|
+
state.completedSteps.has(i)
|
|
181
|
+
"
|
|
182
|
+
[class.ui-form-wizard__step--visited]="
|
|
183
|
+
state.visitedSteps.has(i)
|
|
184
|
+
"
|
|
185
|
+
[class.ui-form-wizard__step--navigable]="
|
|
186
|
+
isStepIndicatorNavigable(i)
|
|
187
|
+
"
|
|
188
|
+
>
|
|
189
|
+
@if (isStepIndicatorNavigable(i)) {
|
|
190
|
+
<button
|
|
191
|
+
type="button"
|
|
192
|
+
class="ui-form-wizard__step-trigger"
|
|
193
|
+
[attr.aria-label]="
|
|
194
|
+
stepAriaLabel(
|
|
195
|
+
group[0].wizardStep?.stepTitle ||
|
|
196
|
+
group[0].title ||
|
|
197
|
+
'Step ' + (i + 1)
|
|
198
|
+
)
|
|
199
|
+
"
|
|
200
|
+
(click)="stepSelect.emit(i)"
|
|
201
|
+
>
|
|
202
|
+
<div class="ui-form-wizard__step-circle">
|
|
203
|
+
@if (state.completedSteps.has(i)) {
|
|
204
|
+
<lucide-icon name="check" [size]="16" />
|
|
205
|
+
} @else {
|
|
206
|
+
<span>{{ i + 1 }}</span>
|
|
207
|
+
}
|
|
208
|
+
</div>
|
|
209
|
+
<div class="ui-form-wizard__step-label">
|
|
210
|
+
{{
|
|
211
|
+
group[0].wizardStep?.stepTitle ||
|
|
212
|
+
group[0].title ||
|
|
213
|
+
'Step ' + (i + 1)
|
|
214
|
+
}}
|
|
215
|
+
</div>
|
|
216
|
+
</button>
|
|
217
|
+
} @else {
|
|
218
|
+
<div
|
|
219
|
+
class="ui-form-wizard__step-static"
|
|
220
|
+
[attr.aria-current]="
|
|
221
|
+
i === state.currentStep ? 'step' : null
|
|
222
|
+
"
|
|
223
|
+
>
|
|
224
|
+
<div class="ui-form-wizard__step-circle">
|
|
225
|
+
@if (state.completedSteps.has(i)) {
|
|
226
|
+
<lucide-icon name="check" [size]="16" />
|
|
227
|
+
} @else {
|
|
228
|
+
<span>{{ i + 1 }}</span>
|
|
229
|
+
}
|
|
230
|
+
</div>
|
|
231
|
+
<div class="ui-form-wizard__step-label">
|
|
232
|
+
{{
|
|
233
|
+
group[0].wizardStep?.stepTitle ||
|
|
234
|
+
group[0].title ||
|
|
235
|
+
'Step ' + (i + 1)
|
|
236
|
+
}}
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
}
|
|
240
|
+
</div>
|
|
241
|
+
}
|
|
242
|
+
</div>
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
<div class="ui-form-wizard__step-info">
|
|
247
|
+
<h2 class="ui-form-wizard__step-title">{{ currentStepTitle }}</h2>
|
|
248
|
+
@if (currentStepDescription) {
|
|
249
|
+
<p class="ui-form-wizard__step-description">
|
|
250
|
+
{{ currentStepDescription }}
|
|
251
|
+
</p>
|
|
252
|
+
}
|
|
253
|
+
<span class="ui-form-wizard__step-counter">
|
|
254
|
+
Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}
|
|
255
|
+
</span>
|
|
256
|
+
</div>
|
|
257
|
+
</div>
|
|
258
|
+
`,
|
|
259
|
+
}]
|
|
260
|
+
}], propDecorators: { config: [{
|
|
261
|
+
type: Input
|
|
262
|
+
}], stepGroups: [{
|
|
263
|
+
type: Input
|
|
264
|
+
}], state: [{
|
|
265
|
+
type: Input
|
|
266
|
+
}], progressPercent: [{
|
|
267
|
+
type: Input
|
|
268
|
+
}], currentStepTitle: [{
|
|
269
|
+
type: Input
|
|
270
|
+
}], currentStepDescription: [{
|
|
271
|
+
type: Input
|
|
272
|
+
}], disableStepIndicators: [{
|
|
273
|
+
type: Input
|
|
274
|
+
}], stepSelect: [{
|
|
275
|
+
type: Output
|
|
276
|
+
}] } });
|
|
277
|
+
/**
|
|
278
|
+
* Footer del wizard: pulsanti di navigazione e salvataggio.
|
|
279
|
+
* Emette eventi per Previous, Next, Finish, Save.
|
|
280
|
+
*/
|
|
281
|
+
export class UiWizardFooterComponent {
|
|
282
|
+
constructor() {
|
|
283
|
+
this.isLastStep = false;
|
|
284
|
+
this.previous = new EventEmitter();
|
|
285
|
+
this.next = new EventEmitter();
|
|
286
|
+
this.finish = new EventEmitter();
|
|
287
|
+
this.save = new EventEmitter();
|
|
288
|
+
}
|
|
289
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
290
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiWizardFooterComponent, isStandalone: true, selector: "ui-wizard-footer", inputs: { config: "config", state: "state", isLastStep: "isLastStep" }, outputs: { previous: "previous", next: "next", finish: "finish", save: "save" }, ngImport: i0, template: `
|
|
291
|
+
<div class="ui-form-wizard__footer">
|
|
292
|
+
@if (
|
|
293
|
+
config.allowBackNavigation !== false && state.currentStep > 0
|
|
294
|
+
) {
|
|
295
|
+
<div class="ui-form-wizard__nav-action">
|
|
296
|
+
<ui-button
|
|
297
|
+
[label]="config.buttonLabels?.previous ?? 'Indietro'"
|
|
298
|
+
variant="outline"
|
|
299
|
+
icon="chevron-left"
|
|
300
|
+
(click)="previous.emit()"
|
|
301
|
+
/>
|
|
302
|
+
<span class="ui-form-wizard__nav-hint">Ctrl + ←</span>
|
|
303
|
+
</div>
|
|
304
|
+
} @else {
|
|
305
|
+
<div></div>
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
<div class="ui-form-wizard__footer-right">
|
|
309
|
+
@if (config.autoSave && config.buttonLabels?.save) {
|
|
310
|
+
<ui-button
|
|
311
|
+
[label]="config.buttonLabels!.save!"
|
|
312
|
+
variant="outline"
|
|
313
|
+
(click)="save.emit()"
|
|
314
|
+
/>
|
|
315
|
+
}
|
|
316
|
+
<div class="ui-form-wizard__nav-action">
|
|
317
|
+
@if (isLastStep) {
|
|
318
|
+
<ui-button
|
|
319
|
+
[label]="config.buttonLabels?.finish ?? 'Completa'"
|
|
320
|
+
variant="primary"
|
|
321
|
+
icon="check"
|
|
322
|
+
iconPosition="trailing"
|
|
323
|
+
(click)="finish.emit()"
|
|
324
|
+
/>
|
|
325
|
+
} @else {
|
|
326
|
+
<ui-button
|
|
327
|
+
[label]="
|
|
328
|
+
config.buttonLabels?.next ??
|
|
329
|
+
config.buttonLabels?.submit ??
|
|
330
|
+
'Avanti'
|
|
331
|
+
"
|
|
332
|
+
variant="primary"
|
|
333
|
+
icon="chevron-right"
|
|
334
|
+
iconPosition="trailing"
|
|
335
|
+
(click)="next.emit()"
|
|
336
|
+
/>
|
|
337
|
+
}
|
|
338
|
+
<span class="ui-form-wizard__nav-hint">Ctrl + →</span>
|
|
339
|
+
</div>
|
|
340
|
+
</div>
|
|
341
|
+
</div>
|
|
342
|
+
`, isInline: true, dependencies: [{ kind: "component", type: UiButtonComponent, selector: "ui-button", inputs: ["label", "tooltip", "variant", "size", "icon", "iconPosition", "loading", "disabled", "fullWidth", "type", "ariaLabel", "customClass"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
343
|
+
}
|
|
344
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardFooterComponent, decorators: [{
|
|
345
|
+
type: Component,
|
|
346
|
+
args: [{
|
|
347
|
+
selector: 'ui-wizard-footer',
|
|
348
|
+
standalone: true,
|
|
349
|
+
imports: [UiButtonComponent],
|
|
350
|
+
encapsulation: ViewEncapsulation.None,
|
|
351
|
+
template: `
|
|
352
|
+
<div class="ui-form-wizard__footer">
|
|
353
|
+
@if (
|
|
354
|
+
config.allowBackNavigation !== false && state.currentStep > 0
|
|
355
|
+
) {
|
|
356
|
+
<div class="ui-form-wizard__nav-action">
|
|
357
|
+
<ui-button
|
|
358
|
+
[label]="config.buttonLabels?.previous ?? 'Indietro'"
|
|
359
|
+
variant="outline"
|
|
360
|
+
icon="chevron-left"
|
|
361
|
+
(click)="previous.emit()"
|
|
362
|
+
/>
|
|
363
|
+
<span class="ui-form-wizard__nav-hint">Ctrl + ←</span>
|
|
364
|
+
</div>
|
|
365
|
+
} @else {
|
|
366
|
+
<div></div>
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
<div class="ui-form-wizard__footer-right">
|
|
370
|
+
@if (config.autoSave && config.buttonLabels?.save) {
|
|
371
|
+
<ui-button
|
|
372
|
+
[label]="config.buttonLabels!.save!"
|
|
373
|
+
variant="outline"
|
|
374
|
+
(click)="save.emit()"
|
|
375
|
+
/>
|
|
376
|
+
}
|
|
377
|
+
<div class="ui-form-wizard__nav-action">
|
|
378
|
+
@if (isLastStep) {
|
|
379
|
+
<ui-button
|
|
380
|
+
[label]="config.buttonLabels?.finish ?? 'Completa'"
|
|
381
|
+
variant="primary"
|
|
382
|
+
icon="check"
|
|
383
|
+
iconPosition="trailing"
|
|
384
|
+
(click)="finish.emit()"
|
|
385
|
+
/>
|
|
386
|
+
} @else {
|
|
387
|
+
<ui-button
|
|
388
|
+
[label]="
|
|
389
|
+
config.buttonLabels?.next ??
|
|
390
|
+
config.buttonLabels?.submit ??
|
|
391
|
+
'Avanti'
|
|
392
|
+
"
|
|
393
|
+
variant="primary"
|
|
394
|
+
icon="chevron-right"
|
|
395
|
+
iconPosition="trailing"
|
|
396
|
+
(click)="next.emit()"
|
|
397
|
+
/>
|
|
398
|
+
}
|
|
399
|
+
<span class="ui-form-wizard__nav-hint">Ctrl + →</span>
|
|
400
|
+
</div>
|
|
401
|
+
</div>
|
|
402
|
+
</div>
|
|
403
|
+
`,
|
|
404
|
+
}]
|
|
405
|
+
}], propDecorators: { config: [{
|
|
406
|
+
type: Input
|
|
407
|
+
}], state: [{
|
|
408
|
+
type: Input
|
|
409
|
+
}], isLastStep: [{
|
|
410
|
+
type: Input
|
|
411
|
+
}], previous: [{
|
|
412
|
+
type: Output
|
|
413
|
+
}], next: [{
|
|
414
|
+
type: Output
|
|
415
|
+
}], finish: [{
|
|
416
|
+
type: Output
|
|
417
|
+
}], save: [{
|
|
418
|
+
type: Output
|
|
419
|
+
}] } });
|
|
420
|
+
// ─── Componente wizard principale ─────────────────────────────────
|
|
421
|
+
/**
|
|
422
|
+
* Componente wizard che wrappa `UiFormBuilderComponent`
|
|
423
|
+
* aggiungendo navigazione multi-step, barra di progresso,
|
|
424
|
+
* validazione per step e sincronizzazione wireless.
|
|
425
|
+
* Più sezioni schema con lo stesso `wizardStep.stepNumber` formano un unico passo
|
|
426
|
+
* (es. più blocchi collassabili per step); metadati del passo dalla prima sezione del gruppo.
|
|
427
|
+
*
|
|
428
|
+
* @selector ui-form-wizard
|
|
429
|
+
*
|
|
430
|
+
* @example
|
|
431
|
+
* ```html
|
|
432
|
+
* <ui-form-wizard
|
|
433
|
+
* [schema]="wizardSchema"
|
|
434
|
+
* [wizardConfig]="wizardConfig"
|
|
435
|
+
* (wizardComplete)="onComplete($event)"
|
|
436
|
+
* (stepChange)="onStepChange($event)"
|
|
437
|
+
* />
|
|
438
|
+
* ```
|
|
439
|
+
*/
|
|
440
|
+
export class UiFormWizardComponent {
|
|
441
|
+
constructor() {
|
|
442
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
443
|
+
this.wizardSync = inject(UiWizardSyncService);
|
|
444
|
+
this.logger = inject(UiLoggerService, { optional: true });
|
|
445
|
+
this.destroy$ = new Subject();
|
|
446
|
+
/** Metodi di validazione custom per step. */
|
|
447
|
+
this.customValidationMethods = {};
|
|
448
|
+
/** Dati iniziali. */
|
|
449
|
+
this.initialData = {};
|
|
450
|
+
/** Modalita sola lettura. */
|
|
451
|
+
this.readonly = false;
|
|
452
|
+
/** Stato disabilitato. */
|
|
453
|
+
this.disabled = false;
|
|
454
|
+
/** Pulsante in caricamento. */
|
|
455
|
+
this.loadingFor = null;
|
|
456
|
+
/** Template per campi `type: 'custom'` (inoltro al form builder). */
|
|
457
|
+
this.customFieldTemplates = {};
|
|
458
|
+
// ─── Output ─────────────────────────────────────────────────────
|
|
459
|
+
this.stepChange = new EventEmitter();
|
|
460
|
+
this.stepComplete = new EventEmitter();
|
|
461
|
+
this.stepValidationFailed = new EventEmitter();
|
|
462
|
+
this.wizardComplete = new EventEmitter();
|
|
463
|
+
this.valueChange = new EventEmitter();
|
|
464
|
+
this.validationChange = new EventEmitter();
|
|
465
|
+
this.customEvent = new EventEmitter();
|
|
466
|
+
// ─── Stato ──────────────────────────────────────────────────────
|
|
467
|
+
this.state = {
|
|
468
|
+
currentStep: 0,
|
|
469
|
+
totalSteps: 0,
|
|
470
|
+
completedSteps: new Set(),
|
|
471
|
+
visitedSteps: new Set([0]),
|
|
472
|
+
isValid: false,
|
|
473
|
+
stepErrors: {},
|
|
474
|
+
};
|
|
475
|
+
/**
|
|
476
|
+
* Gruppi di sezioni schema per passo logico del wizard.
|
|
477
|
+
* Sezioni con lo stesso `wizardStep.stepNumber` compongono un unico passo (ordine: come in `schema.sections` dopo sort per numero).
|
|
478
|
+
*/
|
|
479
|
+
this.wizardStepGroups = [];
|
|
480
|
+
/** Dati accumulati del form. */
|
|
481
|
+
this.accumulatedData = {};
|
|
482
|
+
/**
|
|
483
|
+
* Schema cachato per lo step corrente.
|
|
484
|
+
* Evita di creare un nuovo oggetto ad ogni ciclo di change detection,
|
|
485
|
+
* cosa che causerebbe rebuild infiniti nel form builder.
|
|
486
|
+
*/
|
|
487
|
+
this._cachedStepSchema = null;
|
|
488
|
+
this._cachedStepIndex = -1;
|
|
489
|
+
}
|
|
490
|
+
// ─── Getter calcolati ───────────────────────────────────────────
|
|
491
|
+
get currentStepSchema() {
|
|
492
|
+
// Se lo step non e cambiato, restituisci lo schema cachato
|
|
493
|
+
if (this._cachedStepIndex === this.state.currentStep &&
|
|
494
|
+
this._cachedStepSchema) {
|
|
495
|
+
return this._cachedStepSchema;
|
|
496
|
+
}
|
|
497
|
+
const group = this.wizardStepGroups[this.state.currentStep];
|
|
498
|
+
if (!group?.length)
|
|
499
|
+
return null;
|
|
500
|
+
this._cachedStepSchema = {
|
|
501
|
+
id: this.schema.id + '-step-' + this.state.currentStep,
|
|
502
|
+
sections: group,
|
|
503
|
+
config: { ...this.schema.config, hideFooter: true, showButtons: false },
|
|
504
|
+
};
|
|
505
|
+
this._cachedStepIndex = this.state.currentStep;
|
|
506
|
+
return this._cachedStepSchema;
|
|
507
|
+
}
|
|
508
|
+
get currentStepTitle() {
|
|
509
|
+
const primary = this.wizardStepGroups[this.state.currentStep]?.[0];
|
|
510
|
+
return primary?.wizardStep?.stepTitle || primary?.title || '';
|
|
511
|
+
}
|
|
512
|
+
get currentStepDescription() {
|
|
513
|
+
const primary = this.wizardStepGroups[this.state.currentStep]?.[0];
|
|
514
|
+
return primary?.wizardStep?.stepDescription || primary?.description || '';
|
|
515
|
+
}
|
|
516
|
+
get isLastStep() {
|
|
517
|
+
return this.state.currentStep >= this.state.totalSteps - 1;
|
|
518
|
+
}
|
|
519
|
+
get progressPercent() {
|
|
520
|
+
if (this.state.totalSteps <= 1)
|
|
521
|
+
return 100;
|
|
522
|
+
return Math.round((this.state.currentStep / (this.state.totalSteps - 1)) * 100);
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Dati passati al form builder: unione tra valori forniti dal consumer e
|
|
526
|
+
* stato accumulato tra gli step. Senza questo, tornando indietro il builder
|
|
527
|
+
* riceverebbe solo `initialData` e ricreerebbe i campi vuoti, pur avendo
|
|
528
|
+
* i valori ancora in `accumulatedData`.
|
|
529
|
+
*/
|
|
530
|
+
get mergedInitialDataForBuilder() {
|
|
531
|
+
return { ...this.initialData, ...this.accumulatedData };
|
|
532
|
+
}
|
|
533
|
+
/** Mostra la navigazione sopra il form builder. */
|
|
534
|
+
get showTopNav() {
|
|
535
|
+
if (this.wizardConfig.showNavigationButtons === false)
|
|
536
|
+
return false;
|
|
537
|
+
const pos = this.wizardConfig.navigationPosition;
|
|
538
|
+
return pos === 'top' || pos === 'both';
|
|
539
|
+
}
|
|
540
|
+
/** Mostra la navigazione sotto il form builder. */
|
|
541
|
+
get showBottomNav() {
|
|
542
|
+
if (this.wizardConfig.showNavigationButtons === false)
|
|
543
|
+
return false;
|
|
544
|
+
const pos = this.wizardConfig.navigationPosition;
|
|
545
|
+
return pos === 'bottom' || pos === 'both' || pos == null;
|
|
546
|
+
}
|
|
547
|
+
// ─── Lifecycle ──────────────────────────────────────────────────
|
|
548
|
+
ngOnInit() {
|
|
549
|
+
if (!this.schema) {
|
|
550
|
+
this.logger?.logWizardAction('init', { wizardId: this.wizardConfig?.wizardId, error: 'schema non presente' });
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
this.wizardStepGroups = this.buildWizardStepGroups(this.schema.sections);
|
|
554
|
+
this.state.totalSteps = this.wizardStepGroups.length;
|
|
555
|
+
this.accumulatedData = { ...this.initialData };
|
|
556
|
+
this.logger?.logWizardAction('init', {
|
|
557
|
+
wizardId: this.wizardConfig?.wizardId,
|
|
558
|
+
schemaId: this.schema.id,
|
|
559
|
+
totalSteps: this.state.totalSteps,
|
|
560
|
+
totalSections: this.wizardStepGroups.reduce((sum, g) => sum + g.length, 0),
|
|
561
|
+
});
|
|
562
|
+
// Sincronizzazione wireless
|
|
563
|
+
if (this.wizardConfig.wizardId) {
|
|
564
|
+
this.syncWizardState();
|
|
565
|
+
// Ascolta navigazione esterna
|
|
566
|
+
this.wizardSync
|
|
567
|
+
.getWizardState$(this.wizardConfig.wizardId)
|
|
568
|
+
.pipe(takeUntil(this.destroy$))
|
|
569
|
+
.subscribe((data) => {
|
|
570
|
+
if (data && data.wizardState.currentStep !== this.state.currentStep) {
|
|
571
|
+
this.navigateToStep(data.wizardState.currentStep);
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
ngOnDestroy() {
|
|
577
|
+
this.logger?.logWizardAction('destroy', {
|
|
578
|
+
wizardId: this.wizardConfig?.wizardId,
|
|
579
|
+
schemaId: this.schema?.id,
|
|
580
|
+
currentStep: this.state.currentStep,
|
|
581
|
+
});
|
|
582
|
+
this.destroy$.next();
|
|
583
|
+
this.destroy$.complete();
|
|
584
|
+
if (this.wizardConfig?.wizardId) {
|
|
585
|
+
this.wizardSync.unregisterWizard(this.wizardConfig.wizardId);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Scorciatoia: Ctrl + Freccia sinistra/destra per navigare come i pulsanti
|
|
590
|
+
* Indietro / Avanti (sull'ultimo step, Avanti equivale a Completa).
|
|
591
|
+
* Ignorata se il focus è in un campo di input per non interferire con la digitazione.
|
|
592
|
+
*/
|
|
593
|
+
onDocumentKeydown(event) {
|
|
594
|
+
if (!this.schema || !this.wizardConfig || this.disabled)
|
|
595
|
+
return;
|
|
596
|
+
if (this.wizardConfig.showNavigationButtons === false)
|
|
597
|
+
return;
|
|
598
|
+
if (!event.ctrlKey || event.altKey || event.metaKey || event.shiftKey)
|
|
599
|
+
return;
|
|
600
|
+
if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')
|
|
601
|
+
return;
|
|
602
|
+
if (this.isEditableKeyboardTarget(event.target))
|
|
603
|
+
return;
|
|
604
|
+
if (event.key === 'ArrowLeft') {
|
|
605
|
+
if (this.wizardConfig.allowBackNavigation === false)
|
|
606
|
+
return;
|
|
607
|
+
if (this.state.currentStep <= 0)
|
|
608
|
+
return;
|
|
609
|
+
event.preventDefault();
|
|
610
|
+
this.logger?.logWizardAction('keyboardNavigation', {
|
|
611
|
+
wizardId: this.wizardConfig.wizardId,
|
|
612
|
+
direction: 'previous',
|
|
613
|
+
fromStep: this.state.currentStep,
|
|
614
|
+
});
|
|
615
|
+
this.goToPreviousStep();
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
// ArrowRight
|
|
619
|
+
event.preventDefault();
|
|
620
|
+
this.logger?.logWizardAction('keyboardNavigation', {
|
|
621
|
+
wizardId: this.wizardConfig.wizardId,
|
|
622
|
+
direction: this.isLastStep ? 'finish' : 'next',
|
|
623
|
+
fromStep: this.state.currentStep,
|
|
624
|
+
});
|
|
625
|
+
if (this.isLastStep) {
|
|
626
|
+
void this.finishWizard();
|
|
627
|
+
}
|
|
628
|
+
else {
|
|
629
|
+
void this.goToNextStep();
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
/** True se il target del keydown è un elemento dove la digitazione ha priorità sulla shortcut wizard. */
|
|
633
|
+
isEditableKeyboardTarget(target) {
|
|
634
|
+
if (!target || !(target instanceof HTMLElement))
|
|
635
|
+
return false;
|
|
636
|
+
const el = target;
|
|
637
|
+
if (el.isContentEditable)
|
|
638
|
+
return true;
|
|
639
|
+
const tag = el.tagName;
|
|
640
|
+
if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT')
|
|
641
|
+
return true;
|
|
642
|
+
return false;
|
|
643
|
+
}
|
|
644
|
+
// ─── Navigazione ────────────────────────────────────────────────
|
|
645
|
+
/** Vai allo step successivo con validazione. */
|
|
646
|
+
async goToNextStep() {
|
|
647
|
+
if (this.isLastStep)
|
|
648
|
+
return;
|
|
649
|
+
// Valida step corrente
|
|
650
|
+
if (!(await this.validateCurrentStep()))
|
|
651
|
+
return;
|
|
652
|
+
// Salva dati step corrente
|
|
653
|
+
this.state.completedSteps.add(this.state.currentStep);
|
|
654
|
+
await this.autoSaveIfNeeded();
|
|
655
|
+
this.navigateToStep(this.state.currentStep + 1);
|
|
656
|
+
}
|
|
657
|
+
/** Torna allo step precedente. */
|
|
658
|
+
goToPreviousStep() {
|
|
659
|
+
if (this.state.currentStep <= 0)
|
|
660
|
+
return;
|
|
661
|
+
this.navigateToStep(this.state.currentStep - 1);
|
|
662
|
+
}
|
|
663
|
+
/**
|
|
664
|
+
* Navigazione tramite indicatori step (bullet + titolo) quando `progressStyle` è `'steps'`.
|
|
665
|
+
* Consentito solo verso step già marcati completati.
|
|
666
|
+
*/
|
|
667
|
+
onWizardStepIndicatorSelect(stepIndex) {
|
|
668
|
+
if (this.disabled)
|
|
669
|
+
return;
|
|
670
|
+
if (this.wizardConfig.allowStepIndicatorNavigation === false)
|
|
671
|
+
return;
|
|
672
|
+
if (this.wizardConfig.allowBackNavigation === false)
|
|
673
|
+
return;
|
|
674
|
+
if (stepIndex === this.state.currentStep)
|
|
675
|
+
return;
|
|
676
|
+
if (!this.state.completedSteps.has(stepIndex))
|
|
677
|
+
return;
|
|
678
|
+
this.logger?.logWizardAction('navigation', {
|
|
679
|
+
wizardId: this.wizardConfig.wizardId,
|
|
680
|
+
via: 'stepIndicator',
|
|
681
|
+
fromStep: this.state.currentStep,
|
|
682
|
+
toStep: stepIndex,
|
|
683
|
+
});
|
|
684
|
+
this.navigateToStep(stepIndex);
|
|
685
|
+
}
|
|
686
|
+
/** Completa il wizard. */
|
|
687
|
+
async finishWizard() {
|
|
688
|
+
if (!(await this.validateCurrentStep())) {
|
|
689
|
+
this.logger?.logWizardAction('stepValidationFailed', {
|
|
690
|
+
wizardId: this.wizardConfig.wizardId,
|
|
691
|
+
step: this.state.currentStep,
|
|
692
|
+
context: 'finish',
|
|
693
|
+
});
|
|
694
|
+
return;
|
|
695
|
+
}
|
|
696
|
+
this.state.completedSteps.add(this.state.currentStep);
|
|
697
|
+
await this.autoSaveIfNeeded();
|
|
698
|
+
this.logger?.logWizardAction('complete', {
|
|
699
|
+
wizardId: this.wizardConfig.wizardId,
|
|
700
|
+
schemaId: this.schema?.id,
|
|
701
|
+
totalSteps: this.state.totalSteps,
|
|
702
|
+
completedSteps: Array.from(this.state.completedSteps),
|
|
703
|
+
});
|
|
704
|
+
this.wizardComplete.emit(this.accumulatedData);
|
|
705
|
+
}
|
|
706
|
+
/** Salva lo step corrente manualmente. */
|
|
707
|
+
async saveCurrentStep() {
|
|
708
|
+
if (this.wizardConfig.onStepSave) {
|
|
709
|
+
const data = this.formBuilder?.getFormValue() || {};
|
|
710
|
+
this.logger?.logWizardAction('save', {
|
|
711
|
+
wizardId: this.wizardConfig.wizardId,
|
|
712
|
+
step: this.state.currentStep,
|
|
713
|
+
schemaId: this.schema?.id,
|
|
714
|
+
});
|
|
715
|
+
await this.wizardConfig.onStepSave(data, this.state.currentStep);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
// ─── Callback form builder ─────────────────────────────────────
|
|
719
|
+
onValueChange(data) {
|
|
720
|
+
this.accumulatedData = { ...this.accumulatedData, ...data };
|
|
721
|
+
this.logger?.logWizardAction('valueChange', {
|
|
722
|
+
wizardId: this.wizardConfig.wizardId,
|
|
723
|
+
step: this.state.currentStep,
|
|
724
|
+
schemaId: this.schema?.id,
|
|
725
|
+
changedKeys: Object.keys(data),
|
|
726
|
+
});
|
|
727
|
+
this.valueChange.emit(this.accumulatedData);
|
|
728
|
+
}
|
|
729
|
+
onValidationChange(state) {
|
|
730
|
+
this.state.isValid = state.valid;
|
|
731
|
+
this.validationChange.emit(state);
|
|
732
|
+
}
|
|
733
|
+
// ─── Navigazione interna ───────────────────────────────────────
|
|
734
|
+
navigateToStep(targetStep) {
|
|
735
|
+
if (targetStep < 0 || targetStep >= this.state.totalSteps)
|
|
736
|
+
return;
|
|
737
|
+
const from = this.state.currentStep;
|
|
738
|
+
this.state.currentStep = targetStep;
|
|
739
|
+
this.state.visitedSteps.add(targetStep);
|
|
740
|
+
// Invalida la cache per forzare la creazione di un nuovo schema
|
|
741
|
+
this._cachedStepSchema = null;
|
|
742
|
+
this._cachedStepIndex = -1;
|
|
743
|
+
this.logger?.logWizardAction('stepChange', {
|
|
744
|
+
wizardId: this.wizardConfig.wizardId,
|
|
745
|
+
from,
|
|
746
|
+
to: targetStep,
|
|
747
|
+
direction: targetStep > from ? 'next' : 'previous',
|
|
748
|
+
schemaId: this.schema?.id,
|
|
749
|
+
});
|
|
750
|
+
this.stepChange.emit({
|
|
751
|
+
from,
|
|
752
|
+
to: targetStep,
|
|
753
|
+
direction: targetStep > from ? 'next' : 'previous',
|
|
754
|
+
});
|
|
755
|
+
this.syncWizardState();
|
|
756
|
+
this.cdr.markForCheck();
|
|
757
|
+
}
|
|
758
|
+
async validateCurrentStep() {
|
|
759
|
+
this.formBuilder?.validateAllFields();
|
|
760
|
+
const group = this.wizardStepGroups[this.state.currentStep];
|
|
761
|
+
const primary = group?.[0];
|
|
762
|
+
const validateCustomComponents = primary?.wizardStep?.validation?.validateCustomComponents !== false;
|
|
763
|
+
const customFieldKeys = new Set(this.getCustomFieldKeysForGroup(group));
|
|
764
|
+
const isFormValid = validateCustomComponents
|
|
765
|
+
? (this.formBuilder?.isFormValid() ?? true)
|
|
766
|
+
: (this.formBuilder?.isFormValidExcludingFieldKeys(customFieldKeys) ??
|
|
767
|
+
true);
|
|
768
|
+
const customFnName = primary?.wizardStep?.customValidationFn;
|
|
769
|
+
if (customFnName && this.customValidationMethods[customFnName]) {
|
|
770
|
+
const customValid = await this.customValidationMethods[customFnName](this.accumulatedData, this.state.currentStep, isFormValid);
|
|
771
|
+
if (!customValid) {
|
|
772
|
+
this.stepValidationFailed.emit({
|
|
773
|
+
step: this.state.currentStep,
|
|
774
|
+
errors: ['Validazione custom fallita'],
|
|
775
|
+
});
|
|
776
|
+
return false;
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
if (!isFormValid && primary?.wizardStep?.validation?.required !== false) {
|
|
780
|
+
let details = this.formBuilder?.getDetailedFormErrors() || [];
|
|
781
|
+
if (!validateCustomComponents && group?.length) {
|
|
782
|
+
details = this.filterErrorDetailsExcludingCustomFields(details, group, customFieldKeys);
|
|
783
|
+
}
|
|
784
|
+
const errors = details.flatMap((e) => e.errors);
|
|
785
|
+
this.logger?.logWizardAction('stepValidationFailed', {
|
|
786
|
+
wizardId: this.wizardConfig.wizardId,
|
|
787
|
+
step: this.state.currentStep,
|
|
788
|
+
errors,
|
|
789
|
+
});
|
|
790
|
+
this.stepValidationFailed.emit({
|
|
791
|
+
step: this.state.currentStep,
|
|
792
|
+
errors,
|
|
793
|
+
});
|
|
794
|
+
return false;
|
|
795
|
+
}
|
|
796
|
+
this.logger?.logWizardAction('stepComplete', {
|
|
797
|
+
wizardId: this.wizardConfig.wizardId,
|
|
798
|
+
step: this.state.currentStep,
|
|
799
|
+
schemaId: this.schema?.id,
|
|
800
|
+
});
|
|
801
|
+
this.stepComplete.emit({
|
|
802
|
+
step: this.state.currentStep,
|
|
803
|
+
data: this.formBuilder?.getFormValue() || {},
|
|
804
|
+
});
|
|
805
|
+
return true;
|
|
806
|
+
}
|
|
807
|
+
/**
|
|
808
|
+
* Raggruppa le sezioni con `wizardStep` per `stepNumber` (ordine stabile per numero, poi ordine di apparizione nello schema).
|
|
809
|
+
*/
|
|
810
|
+
buildWizardStepGroups(sections) {
|
|
811
|
+
const withWizard = sections.filter((s) => s.wizardStep);
|
|
812
|
+
withWizard.sort((a, b) => (a.wizardStep.stepNumber || 0) - (b.wizardStep.stepNumber || 0));
|
|
813
|
+
const groups = [];
|
|
814
|
+
for (const s of withWizard) {
|
|
815
|
+
const num = s.wizardStep.stepNumber;
|
|
816
|
+
const prev = groups[groups.length - 1];
|
|
817
|
+
if (prev?.length &&
|
|
818
|
+
(prev[0].wizardStep.stepNumber || 0) === (num || 0)) {
|
|
819
|
+
prev.push(s);
|
|
820
|
+
}
|
|
821
|
+
else {
|
|
822
|
+
groups.push([s]);
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
return groups;
|
|
826
|
+
}
|
|
827
|
+
/** Chiavi dei campi `custom` in tutte le sezioni del passo corrente. */
|
|
828
|
+
getCustomFieldKeysForGroup(group) {
|
|
829
|
+
if (!group?.length)
|
|
830
|
+
return [];
|
|
831
|
+
const keys = [];
|
|
832
|
+
for (const section of group) {
|
|
833
|
+
for (const f of section.fields || []) {
|
|
834
|
+
if (f.type === 'custom')
|
|
835
|
+
keys.push(f.key);
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
return keys;
|
|
839
|
+
}
|
|
840
|
+
/** Rimuove dagli errori i campi custom quando `validateCustomComponents` è false. */
|
|
841
|
+
filterErrorDetailsExcludingCustomFields(details, group, customKeys) {
|
|
842
|
+
const sectionIds = group.map((s) => s.id);
|
|
843
|
+
return details.filter((d) => {
|
|
844
|
+
const logicalKey = this.logicalFieldKeyFromDetailKeyForGroup(d.fieldKey, sectionIds);
|
|
845
|
+
return !customKeys.has(logicalKey);
|
|
846
|
+
});
|
|
847
|
+
}
|
|
848
|
+
/**
|
|
849
|
+
* Risolve la chiave logica del campo rispetto a tutte le sezioni del gruppo (campi flat o repeatable).
|
|
850
|
+
*/
|
|
851
|
+
logicalFieldKeyFromDetailKeyForGroup(fieldKey, sectionIds) {
|
|
852
|
+
for (const id of sectionIds) {
|
|
853
|
+
const k = this.logicalFieldKeyFromDetailKey(fieldKey, id);
|
|
854
|
+
if (k !== fieldKey)
|
|
855
|
+
return k;
|
|
856
|
+
}
|
|
857
|
+
return fieldKey;
|
|
858
|
+
}
|
|
859
|
+
/** Estrae la chiave campo da `fieldKey` flat o `sectionId[i].fieldKey`. */
|
|
860
|
+
logicalFieldKeyFromDetailKey(fieldKey, sectionId) {
|
|
861
|
+
const re = new RegExp(`^${this.escapeRegExp(sectionId)}\\[\\d+\\]\\.(.+)$`);
|
|
862
|
+
const m = fieldKey.match(re);
|
|
863
|
+
return m ? m[1] : fieldKey;
|
|
864
|
+
}
|
|
865
|
+
escapeRegExp(s) {
|
|
866
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
867
|
+
}
|
|
868
|
+
async autoSaveIfNeeded() {
|
|
869
|
+
if (this.wizardConfig.autoSave && this.wizardConfig.onStepSave) {
|
|
870
|
+
const data = this.formBuilder?.getFormValue() || {};
|
|
871
|
+
await this.wizardConfig.onStepSave(data, this.state.currentStep);
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
syncWizardState() {
|
|
875
|
+
if (!this.wizardConfig.wizardId)
|
|
876
|
+
return;
|
|
877
|
+
const syncData = {
|
|
878
|
+
wizardId: this.wizardConfig.wizardId,
|
|
879
|
+
wizardState: { ...this.state },
|
|
880
|
+
wizardSteps: this.wizardStepGroups.map((g) => ({
|
|
881
|
+
title: g[0]?.wizardStep?.stepTitle || g[0]?.title,
|
|
882
|
+
description: g[0]?.wizardStep?.stepDescription || g[0]?.description,
|
|
883
|
+
})),
|
|
884
|
+
isWizardMode: true,
|
|
885
|
+
schema: this.schema,
|
|
886
|
+
};
|
|
887
|
+
this.wizardSync.registerWizard(this.wizardConfig.wizardId, syncData);
|
|
888
|
+
}
|
|
889
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormWizardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
890
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiFormWizardComponent, isStandalone: true, selector: "ui-form-wizard", inputs: { schema: "schema", wizardConfig: "wizardConfig", customValidationMethods: "customValidationMethods", initialData: "initialData", readonly: "readonly", disabled: "disabled", loadingFor: "loadingFor", customFieldTemplates: "customFieldTemplates", customFieldTemplateFallback: "customFieldTemplateFallback" }, outputs: { stepChange: "stepChange", stepComplete: "stepComplete", stepValidationFailed: "stepValidationFailed", wizardComplete: "wizardComplete", valueChange: "valueChange", validationChange: "validationChange", customEvent: "customEvent" }, host: { listeners: { "document:keydown": "onDocumentKeydown($event)" } }, viewQueries: [{ propertyName: "formBuilder", first: true, predicate: UiFormBuilderComponent, descendants: true }], ngImport: i0, template: `
|
|
891
|
+
@if (schema && wizardConfig) {
|
|
892
|
+
<div class="ui-form-wizard">
|
|
893
|
+
<!-- Header wizard (nascosto se wireless) -->
|
|
894
|
+
@if (!wizardConfig.wirelessHeading) {
|
|
895
|
+
<ui-wizard-header
|
|
896
|
+
[config]="wizardConfig"
|
|
897
|
+
[stepGroups]="wizardStepGroups"
|
|
898
|
+
[state]="state"
|
|
899
|
+
[progressPercent]="progressPercent"
|
|
900
|
+
[currentStepTitle]="currentStepTitle"
|
|
901
|
+
[currentStepDescription]="currentStepDescription"
|
|
902
|
+
[disableStepIndicators]="disabled"
|
|
903
|
+
(stepSelect)="onWizardStepIndicatorSelect($event)"
|
|
904
|
+
/>
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
<!-- Navigazione sopra il form -->
|
|
908
|
+
@if (showTopNav) {
|
|
909
|
+
<ui-wizard-footer
|
|
910
|
+
class="ui-form-wizard__footer ui-form-wizard__footer--top"
|
|
911
|
+
[config]="wizardConfig"
|
|
912
|
+
[state]="state"
|
|
913
|
+
[isLastStep]="isLastStep"
|
|
914
|
+
(previous)="goToPreviousStep()"
|
|
915
|
+
(next)="goToNextStep()"
|
|
916
|
+
(finish)="finishWizard()"
|
|
917
|
+
(save)="saveCurrentStep()"
|
|
918
|
+
/>
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
<div class="ui-form-wizard__content">
|
|
922
|
+
<!-- Form builder per lo step corrente -->
|
|
923
|
+
<ui-form-builder
|
|
924
|
+
[schema]="currentStepSchema!"
|
|
925
|
+
[initialData]="mergedInitialDataForBuilder"
|
|
926
|
+
[readonly]="readonly"
|
|
927
|
+
[disabled]="disabled"
|
|
928
|
+
[loadingFor]="loadingFor"
|
|
929
|
+
[customFieldTemplates]="customFieldTemplates"
|
|
930
|
+
[customFieldTemplateFallback]="customFieldTemplateFallback"
|
|
931
|
+
(valueChange)="onValueChange($event)"
|
|
932
|
+
(validationChange)="onValidationChange($event)"
|
|
933
|
+
(customEvent)="customEvent.emit($event)"
|
|
934
|
+
/>
|
|
935
|
+
</div>
|
|
936
|
+
|
|
937
|
+
<!-- Navigazione sotto il form -->
|
|
938
|
+
@if (showBottomNav) {
|
|
939
|
+
<ui-wizard-footer
|
|
940
|
+
class="ui-form-wizard__footer"
|
|
941
|
+
[config]="wizardConfig"
|
|
942
|
+
[state]="state"
|
|
943
|
+
[isLastStep]="isLastStep"
|
|
944
|
+
(previous)="goToPreviousStep()"
|
|
945
|
+
(next)="goToNextStep()"
|
|
946
|
+
(finish)="finishWizard()"
|
|
947
|
+
(save)="saveCurrentStep()"
|
|
948
|
+
/>
|
|
949
|
+
}
|
|
950
|
+
</div>
|
|
951
|
+
}
|
|
952
|
+
`, isInline: true, styles: [".ui-form-wizard{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-wizard__header{display:flex;flex-direction:column;gap:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-4);border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__progress-bar{height:6px;background:var(--ui-color-bg-subtle);border-radius:var(--ui-radius-full);overflow:hidden}.ui-form-wizard__progress-fill{height:100%;background:var(--ui-color-primary);border-radius:var(--ui-radius-full);transition:width var(--ui-transition-normal)}.ui-form-wizard__progress-text{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);margin-top:var(--ui-spacing-1)}.ui-form-wizard__steps{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ui-spacing-2);position:relative}.ui-form-wizard__steps:before{content:\"\";position:absolute;top:16px;left:24px;right:24px;height:2px;background:var(--ui-color-border);z-index:0}.ui-form-wizard__step{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);z-index:1;flex:1}.ui-form-wizard__step-trigger,.ui-form-wizard__step-static{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);width:100%;margin:0;padding:0;border:none;background:transparent;font:inherit;color:inherit;text-align:center}.ui-form-wizard__step-trigger{cursor:pointer;border-radius:var(--ui-radius-md);transition:background-color var(--ui-transition-fast)}.ui-form-wizard__step-trigger:hover{background-color:var(--ui-color-bg-subtle)}.ui-form-wizard__step-trigger:focus-visible{outline:2px solid var(--ui-color-primary);outline-offset:2px}.ui-form-wizard__step-static{cursor:default}.ui-form-wizard__step--navigable:not(.ui-form-wizard__step--current) .ui-form-wizard__step-trigger:hover .ui-form-wizard__step-label{color:var(--ui-color-primary)}.ui-form-wizard__step-circle{width:32px;height:32px;border-radius:var(--ui-radius-full);display:flex;align-items:center;justify-content:center;border:2px solid var(--ui-color-border);background:var(--ui-color-surface);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text-muted);transition:background-color var(--ui-transition-fast),border-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-form-wizard__step--current .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);background:var(--ui-color-primary);color:#fff}.ui-form-wizard__step--completed .ui-form-wizard__step-circle{border-color:var(--ui-color-success, #16a34a);background:var(--ui-color-success, #16a34a);color:#fff}.ui-form-wizard__step--visited:not(.ui-form-wizard__step--current):not(.ui-form-wizard__step--completed) .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);color:var(--ui-color-primary)}.ui-form-wizard__step-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);text-align:center;max-width:100px;line-height:1.3}.ui-form-wizard__step--current .ui-form-wizard__step-label{color:var(--ui-color-primary);font-weight:var(--ui-font-weight-semibold)}.ui-form-wizard__step-info{text-align:center}.ui-form-wizard__step-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-counter{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-wizard__footer{display:flex;justify-content:space-between;align-items:center;width:100%}.ui-form-wizard__footer--top{padding-top:0;padding-bottom:var(--ui-spacing-4);border-top:none;border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__footer-right{display:flex;gap:var(--ui-spacing-3)}.ui-form-wizard__nav-action{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1)}.ui-form-wizard__nav-hint{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);line-height:1}\n"], dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: UiFormBuilderComponent, selector: "ui-form-builder", inputs: ["schema", "initialData", "readonly", "disabled", "buttonsOverride", "loadingFor", "customFieldTemplates", "customFieldTemplateFallback"], outputs: ["valueChange", "validationChange", "formSubmit", "formReset", "customEvent"] }, { kind: "component", type: UiWizardHeaderComponent, selector: "ui-wizard-header", inputs: ["config", "stepGroups", "state", "progressPercent", "currentStepTitle", "currentStepDescription", "disableStepIndicators"], outputs: ["stepSelect"] }, { kind: "component", type: UiWizardFooterComponent, selector: "ui-wizard-footer", inputs: ["config", "state", "isLastStep"], outputs: ["previous", "next", "finish", "save"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
953
|
+
}
|
|
954
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormWizardComponent, decorators: [{
|
|
955
|
+
type: Component,
|
|
956
|
+
args: [{ selector: 'ui-form-wizard', standalone: true, imports: [
|
|
957
|
+
LucideAngularModule,
|
|
958
|
+
UiButtonComponent,
|
|
959
|
+
UiFormBuilderComponent,
|
|
960
|
+
UiWizardHeaderComponent,
|
|
961
|
+
UiWizardFooterComponent,
|
|
962
|
+
], encapsulation: ViewEncapsulation.None, template: `
|
|
963
|
+
@if (schema && wizardConfig) {
|
|
964
|
+
<div class="ui-form-wizard">
|
|
965
|
+
<!-- Header wizard (nascosto se wireless) -->
|
|
966
|
+
@if (!wizardConfig.wirelessHeading) {
|
|
967
|
+
<ui-wizard-header
|
|
968
|
+
[config]="wizardConfig"
|
|
969
|
+
[stepGroups]="wizardStepGroups"
|
|
970
|
+
[state]="state"
|
|
971
|
+
[progressPercent]="progressPercent"
|
|
972
|
+
[currentStepTitle]="currentStepTitle"
|
|
973
|
+
[currentStepDescription]="currentStepDescription"
|
|
974
|
+
[disableStepIndicators]="disabled"
|
|
975
|
+
(stepSelect)="onWizardStepIndicatorSelect($event)"
|
|
976
|
+
/>
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
<!-- Navigazione sopra il form -->
|
|
980
|
+
@if (showTopNav) {
|
|
981
|
+
<ui-wizard-footer
|
|
982
|
+
class="ui-form-wizard__footer ui-form-wizard__footer--top"
|
|
983
|
+
[config]="wizardConfig"
|
|
984
|
+
[state]="state"
|
|
985
|
+
[isLastStep]="isLastStep"
|
|
986
|
+
(previous)="goToPreviousStep()"
|
|
987
|
+
(next)="goToNextStep()"
|
|
988
|
+
(finish)="finishWizard()"
|
|
989
|
+
(save)="saveCurrentStep()"
|
|
990
|
+
/>
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
<div class="ui-form-wizard__content">
|
|
994
|
+
<!-- Form builder per lo step corrente -->
|
|
995
|
+
<ui-form-builder
|
|
996
|
+
[schema]="currentStepSchema!"
|
|
997
|
+
[initialData]="mergedInitialDataForBuilder"
|
|
998
|
+
[readonly]="readonly"
|
|
999
|
+
[disabled]="disabled"
|
|
1000
|
+
[loadingFor]="loadingFor"
|
|
1001
|
+
[customFieldTemplates]="customFieldTemplates"
|
|
1002
|
+
[customFieldTemplateFallback]="customFieldTemplateFallback"
|
|
1003
|
+
(valueChange)="onValueChange($event)"
|
|
1004
|
+
(validationChange)="onValidationChange($event)"
|
|
1005
|
+
(customEvent)="customEvent.emit($event)"
|
|
1006
|
+
/>
|
|
1007
|
+
</div>
|
|
1008
|
+
|
|
1009
|
+
<!-- Navigazione sotto il form -->
|
|
1010
|
+
@if (showBottomNav) {
|
|
1011
|
+
<ui-wizard-footer
|
|
1012
|
+
class="ui-form-wizard__footer"
|
|
1013
|
+
[config]="wizardConfig"
|
|
1014
|
+
[state]="state"
|
|
1015
|
+
[isLastStep]="isLastStep"
|
|
1016
|
+
(previous)="goToPreviousStep()"
|
|
1017
|
+
(next)="goToNextStep()"
|
|
1018
|
+
(finish)="finishWizard()"
|
|
1019
|
+
(save)="saveCurrentStep()"
|
|
1020
|
+
/>
|
|
1021
|
+
}
|
|
1022
|
+
</div>
|
|
1023
|
+
}
|
|
1024
|
+
`, styles: [".ui-form-wizard{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-wizard__header{display:flex;flex-direction:column;gap:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-4);border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__progress-bar{height:6px;background:var(--ui-color-bg-subtle);border-radius:var(--ui-radius-full);overflow:hidden}.ui-form-wizard__progress-fill{height:100%;background:var(--ui-color-primary);border-radius:var(--ui-radius-full);transition:width var(--ui-transition-normal)}.ui-form-wizard__progress-text{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);margin-top:var(--ui-spacing-1)}.ui-form-wizard__steps{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ui-spacing-2);position:relative}.ui-form-wizard__steps:before{content:\"\";position:absolute;top:16px;left:24px;right:24px;height:2px;background:var(--ui-color-border);z-index:0}.ui-form-wizard__step{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);z-index:1;flex:1}.ui-form-wizard__step-trigger,.ui-form-wizard__step-static{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);width:100%;margin:0;padding:0;border:none;background:transparent;font:inherit;color:inherit;text-align:center}.ui-form-wizard__step-trigger{cursor:pointer;border-radius:var(--ui-radius-md);transition:background-color var(--ui-transition-fast)}.ui-form-wizard__step-trigger:hover{background-color:var(--ui-color-bg-subtle)}.ui-form-wizard__step-trigger:focus-visible{outline:2px solid var(--ui-color-primary);outline-offset:2px}.ui-form-wizard__step-static{cursor:default}.ui-form-wizard__step--navigable:not(.ui-form-wizard__step--current) .ui-form-wizard__step-trigger:hover .ui-form-wizard__step-label{color:var(--ui-color-primary)}.ui-form-wizard__step-circle{width:32px;height:32px;border-radius:var(--ui-radius-full);display:flex;align-items:center;justify-content:center;border:2px solid var(--ui-color-border);background:var(--ui-color-surface);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text-muted);transition:background-color var(--ui-transition-fast),border-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-form-wizard__step--current .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);background:var(--ui-color-primary);color:#fff}.ui-form-wizard__step--completed .ui-form-wizard__step-circle{border-color:var(--ui-color-success, #16a34a);background:var(--ui-color-success, #16a34a);color:#fff}.ui-form-wizard__step--visited:not(.ui-form-wizard__step--current):not(.ui-form-wizard__step--completed) .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);color:var(--ui-color-primary)}.ui-form-wizard__step-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);text-align:center;max-width:100px;line-height:1.3}.ui-form-wizard__step--current .ui-form-wizard__step-label{color:var(--ui-color-primary);font-weight:var(--ui-font-weight-semibold)}.ui-form-wizard__step-info{text-align:center}.ui-form-wizard__step-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-counter{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-wizard__footer{display:flex;justify-content:space-between;align-items:center;width:100%}.ui-form-wizard__footer--top{padding-top:0;padding-bottom:var(--ui-spacing-4);border-top:none;border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__footer-right{display:flex;gap:var(--ui-spacing-3)}.ui-form-wizard__nav-action{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1)}.ui-form-wizard__nav-hint{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);line-height:1}\n"] }]
|
|
1025
|
+
}], propDecorators: { formBuilder: [{
|
|
1026
|
+
type: ViewChild,
|
|
1027
|
+
args: [UiFormBuilderComponent]
|
|
1028
|
+
}], schema: [{
|
|
1029
|
+
type: Input
|
|
1030
|
+
}], wizardConfig: [{
|
|
1031
|
+
type: Input
|
|
1032
|
+
}], customValidationMethods: [{
|
|
1033
|
+
type: Input
|
|
1034
|
+
}], initialData: [{
|
|
1035
|
+
type: Input
|
|
1036
|
+
}], readonly: [{
|
|
1037
|
+
type: Input
|
|
1038
|
+
}], disabled: [{
|
|
1039
|
+
type: Input
|
|
1040
|
+
}], loadingFor: [{
|
|
1041
|
+
type: Input
|
|
1042
|
+
}], customFieldTemplates: [{
|
|
1043
|
+
type: Input
|
|
1044
|
+
}], customFieldTemplateFallback: [{
|
|
1045
|
+
type: Input
|
|
1046
|
+
}], stepChange: [{
|
|
1047
|
+
type: Output
|
|
1048
|
+
}], stepComplete: [{
|
|
1049
|
+
type: Output
|
|
1050
|
+
}], stepValidationFailed: [{
|
|
1051
|
+
type: Output
|
|
1052
|
+
}], wizardComplete: [{
|
|
1053
|
+
type: Output
|
|
1054
|
+
}], valueChange: [{
|
|
1055
|
+
type: Output
|
|
1056
|
+
}], validationChange: [{
|
|
1057
|
+
type: Output
|
|
1058
|
+
}], customEvent: [{
|
|
1059
|
+
type: Output
|
|
1060
|
+
}], onDocumentKeydown: [{
|
|
1061
|
+
type: HostListener,
|
|
1062
|
+
args: ['document:keydown', ['$event']]
|
|
1063
|
+
}] } });
|
|
1064
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS13aXphcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXIvZm9ybS13aXphcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxFQUVOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQWdCbEUsT0FBTyxFQUNMLG1CQUFtQixHQUVwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7O0FBRXBFLHFFQUFxRTtBQUVyRTs7O0dBR0c7QUFnSEgsTUFBTSxPQUFPLHVCQUF1QjtJQS9HcEM7UUFpSFcsZUFBVSxHQUFzQixFQUFFLENBQUM7UUFFbkMsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDcEIscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLDJCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUNyQyxpRkFBaUY7UUFDeEUsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0tBaUJuRDtJQWZDLG1HQUFtRztJQUNuRyx3QkFBd0IsQ0FBQyxTQUFpQjtRQUN4QyxJQUFJ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QUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUdHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFJSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUlHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkF3SlAsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG4gIFZpZXdDaGlsZCxcclxuICBpbmplY3QsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMdWNpZGVBbmd1bGFyTW9kdWxlIH0gZnJvbSAnbHVjaWRlLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVWlCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2J1dHRvbi9pbmRleCc7XHJcblxyXG5pbXBvcnQgeyBVaUZvcm1CdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9mb3JtLWJ1aWxkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBVaUZvcm1TY2hlbWEsXHJcbiAgVWlGb3JtU2VjdGlvbixcclxuICBVaUZvcm1EYXRhLFxyXG4gIFVpV2l6YXJkQ29uZmlnLFxyXG4gIFVpV2l6YXJkU3RhdGUsXHJcbiAgVWlXaXphcmRTdGVwQ2hhbmdlRXZlbnQsXHJcbiAgVWlXaXphcmRTdGVwQ29tcGxldGVFdmVudCxcclxuICBVaVdpemFyZFZhbGlkYXRpb25GbixcclxuICBVaUZvcm1DdXN0b21FdmVudCxcclxufSBmcm9tICcuL3R5cGVzL3NjaGVtYS50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgVWlGb3JtRXJyb3JEZXRhaWwsXHJcbiAgVWlGb3JtVmFsaWRhdGlvblN0YXRlLFxyXG59IGZyb20gJy4vdHlwZXMvdmFsaWRhdGlvbi50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgVWlXaXphcmRTeW5jU2VydmljZSxcclxuICBVaVdpemFyZFN5bmNEYXRhLFxyXG59IGZyb20gJy4vc2VydmljZXMvd2l6YXJkLXN5bmMuc2VydmljZSc7XHJcbmltcG9ydCB7IFVpTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvbG9nZ2luZy9sb2dnZXIuc2VydmljZSc7XHJcblxyXG4vLyDilIDilIDilIAgQ29tcG9uZW50aSBpbnRlcm5pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuLyoqXHJcbiAqIEhlYWRlciBkZWwgd2l6YXJkOiBwcm9ncmVzc28gZSBpbmZvIGRlbGxvIHN0ZXAgY29ycmVudGUuXHJcbiAqIENvbiBgcHJvZ3Jlc3NTdHlsZTogJ3N0ZXBzJ2AgZW1ldHRlIGBzdGVwU2VsZWN0YCBwZXIgc2FsdGFyZSBhIHVubyBzdGVwIGdpw6AgY29tcGxldGF0by5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndWktd2l6YXJkLWhlYWRlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTHVjaWRlQW5ndWxhck1vZHVsZV0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19oZWFkZXJcIj5cclxuICAgICAgQGlmIChjb25maWcuc2hvd1Byb2dyZXNzICE9PSBmYWxzZSkge1xyXG4gICAgICAgIEBpZiAoY29uZmlnLnByb2dyZXNzU3R5bGUgIT09ICdzdGVwcycpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fcHJvZ3Jlc3MtYmFyXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19wcm9ncmVzcy1maWxsXCJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJwcm9ncmVzc1BlcmNlbnRcIlxyXG4gICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3Byb2dyZXNzLXRleHRcIj5cclxuICAgICAgICAgICAge3sgcHJvZ3Jlc3NQZXJjZW50IH19JSBjb21wbGV0YXRvXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXBzXCI+XHJcbiAgICAgICAgICAgIEBmb3IgKFxyXG4gICAgICAgICAgICAgIGdyb3VwIG9mIHN0ZXBHcm91cHM7XHJcbiAgICAgICAgICAgICAgdHJhY2sgJGluZGV4O1xyXG4gICAgICAgICAgICAgIGxldCBpID0gJGluZGV4XHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXBcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLnVpLWZvcm0td2l6YXJkX19zdGVwLS1jdXJyZW50XT1cIlxyXG4gICAgICAgICAgICAgICAgICBpID09PSBzdGF0ZS5jdXJyZW50U3RlcFxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy51aS1mb3JtLXdpemFyZF9fc3RlcC0tY29tcGxldGVkXT1cIlxyXG4gICAgICAgICAgICAgICAgICBzdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoaSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MudWktZm9ybS13aXphcmRfX3N0ZXAtLXZpc2l0ZWRdPVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0YXRlLnZpc2l0ZWRTdGVwcy5oYXMoaSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MudWktZm9ybS13aXphcmRfX3N0ZXAtLW5hdmlnYWJsZV09XCJcclxuICAgICAgICAgICAgICAgICAgaXNTdGVwSW5kaWNhdG9yTmF2aWdhYmxlKGkpXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIEBpZiAoaXNTdGVwSW5kaWNhdG9yTmF2aWdhYmxlKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLXRyaWdnZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwQXJpYUxhYmVsKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS50aXRsZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdTdGVwICcgKyAoaSArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3RlcFNlbGVjdC5lbWl0KGkpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc3RhdGUuY29tcGxldGVkU3RlcHMuaGFzKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwiY2hlY2tcIiBbc2l6ZV09XCIxNlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaSArIDEgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS50aXRsZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdTdGVwICcgKyAoaSArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1zdGF0aWNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGkgPT09IHN0YXRlLmN1cnJlbnRTdGVwID8gJ3N0ZXAnIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtY2lyY2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHN0YXRlLmNvbXBsZXRlZFN0ZXBzLmhhcyhpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGkgKyAxIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBbMF0ud2l6YXJkU3RlcD8uc3RlcFRpdGxlIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBbMF0udGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAnU3RlcCAnICsgKGkgKyAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWluZm9cIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC10aXRsZVwiPnt7IGN1cnJlbnRTdGVwVGl0bGUgfX08L2gyPlxyXG4gICAgICAgIEBpZiAoY3VycmVudFN0ZXBEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgPHAgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1kZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICB7eyBjdXJyZW50U3RlcERlc2NyaXB0aW9uIH19XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtY291bnRlclwiPlxyXG4gICAgICAgICAgUGFzc28ge3sgc3RhdGUuY3VycmVudFN0ZXAgKyAxIH19IGRpIHt7IHN0YXRlLnRvdGFsU3RlcHMgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpV2l6YXJkSGVhZGVyQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBjb25maWchOiBVaVdpemFyZENvbmZpZztcclxuICBASW5wdXQoKSBzdGVwR3JvdXBzOiBVaUZvcm1TZWN0aW9uW11bXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHN0YXRlITogVWlXaXphcmRTdGF0ZTtcclxuICBASW5wdXQoKSBwcm9ncmVzc1BlcmNlbnQgPSAwO1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRTdGVwVGl0bGUgPSAnJztcclxuICBASW5wdXQoKSBjdXJyZW50U3RlcERlc2NyaXB0aW9uID0gJyc7XHJcbiAgLyoqIFF1YW5kbyB0cnVlLCBpIGJ1bGxldCBzdGVwIG5vbiBzb25vIGludGVyYXR0aXZpIChlcy4gd2l6YXJkIGRpc2FiaWxpdGF0bykuICovXHJcbiAgQElucHV0KCkgZGlzYWJsZVN0ZXBJbmRpY2F0b3JzID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSBzdGVwU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gIC8qKiBJbmRpY2Ugc3RlcCBzZWxlemlvbmFiaWxlIHRyYW1pdGUgYnVsbGV0L3RpdG9sbyAoc29sbyBzdGVwIGdpw6AgY29tcGxldGF0aSwgbm9uIGlsIGNvcnJlbnRlKS4gKi9cclxuICBpc1N0ZXBJbmRpY2F0b3JOYXZpZ2FibGUoc3RlcEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd1N0ZXBJbmRpY2F0b3JOYXZpZ2F0aW9uID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZVN0ZXBJbmRpY2F0b3JzKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5jb25maWcuYWxsb3dCYWNrTmF2aWdhdGlvbiA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHN0ZXBJbmRleCAhPT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAmJlxyXG4gICAgICB0aGlzLnN0YXRlLmNvbXBsZXRlZFN0ZXBzLmhhcyhzdGVwSW5kZXgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRlc3RvIGFjY2Vzc2liaWxlIHBlciBpbCBwdWxzYW50ZSBzdGVwIChuYXZpZ2F6aW9uZSkuICovXHJcbiAgc3RlcEFyaWFMYWJlbChzdGVwVGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYFZhaSBhbGxvIHN0ZXA6ICR7c3RlcFRpdGxlfWA7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRm9vdGVyIGRlbCB3aXphcmQ6IHB1bHNhbnRpIGRpIG5hdmlnYXppb25lIGUgc2FsdmF0YWdnaW8uXHJcbiAqIEVtZXR0ZSBldmVudGkgcGVyIFByZXZpb3VzLCBOZXh0LCBGaW5pc2gsIFNhdmUuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLXdpemFyZC1mb290ZXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1VpQnV0dG9uQ29tcG9uZW50XSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX2Zvb3RlclwiPlxyXG4gICAgICBAaWYgKFxyXG4gICAgICAgIGNvbmZpZy5hbGxvd0JhY2tOYXZpZ2F0aW9uICE9PSBmYWxzZSAmJiBzdGF0ZS5jdXJyZW50U3RlcCA+IDBcclxuICAgICAgKSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19uYXYtYWN0aW9uXCI+XHJcbiAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcuYnV0dG9uTGFiZWxzPy5wcmV2aW91cyA/PyAnSW5kaWV0cm8nXCJcclxuICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICBpY29uPVwiY2hldnJvbi1sZWZ0XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInByZXZpb3VzLmVtaXQoKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fbmF2LWhpbnRcIj5DdHJsICsg4oaQPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX2Zvb3Rlci1yaWdodFwiPlxyXG4gICAgICAgIEBpZiAoY29uZmlnLmF1dG9TYXZlICYmIGNvbmZpZy5idXR0b25MYWJlbHM/LnNhdmUpIHtcclxuICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy5idXR0b25MYWJlbHMhLnNhdmUhXCJcclxuICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2F2ZS5lbWl0KClcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19uYXYtYWN0aW9uXCI+XHJcbiAgICAgICAgICBAaWYgKGlzTGFzdFN0ZXApIHtcclxuICAgICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcuYnV0dG9uTGFiZWxzPy5maW5pc2ggPz8gJ0NvbXBsZXRhJ1wiXHJcbiAgICAgICAgICAgICAgdmFyaWFudD1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgIGljb249XCJjaGVja1wiXHJcbiAgICAgICAgICAgICAgaWNvblBvc2l0aW9uPVwidHJhaWxpbmdcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJmaW5pc2guZW1pdCgpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cIlxyXG4gICAgICAgICAgICAgICAgY29uZmlnLmJ1dHRvbkxhYmVscz8ubmV4dCA/P1xyXG4gICAgICAgICAgICAgICAgICBjb25maWcuYnV0dG9uTGFiZWxzPy5zdWJtaXQgPz9cclxuICAgICAgICAgICAgICAgICAgJ0F2YW50aSdcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICBpY29uPVwiY2hldnJvbi1yaWdodFwiXHJcbiAgICAgICAgICAgICAgaWNvblBvc2l0aW9uPVwidHJhaWxpbmdcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJuZXh0LmVtaXQoKVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19uYXYtaGludFwiPkN0cmwgKyDihpI8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpV2l6YXJkRm9vdGVyQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBjb25maWchOiBVaVdpemFyZENvbmZpZztcclxuICBASW5wdXQoKSBzdGF0ZSE6IFVpV2l6YXJkU3RhdGU7XHJcbiAgQElucHV0KCkgaXNMYXN0U3RlcCA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgcHJldmlvdXMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIG5leHQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGZpbmlzaCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgc2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSAIENvbXBvbmVudGUgd2l6YXJkIHByaW5jaXBhbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4vKipcclxuICogQ29tcG9uZW50ZSB3aXphcmQgY2hlIHdyYXBwYSBgVWlGb3JtQnVpbGRlckNvbXBvbmVudGBcclxuICogYWdnaXVuZ2VuZG8gbmF2aWdhemlvbmUgbXVsdGktc3RlcCwgYmFycmEgZGkgcHJvZ3Jlc3NvLFxyXG4gKiB2YWxpZGF6aW9uZSBwZXIgc3RlcCBlIHNpbmNyb25penphemlvbmUgd2lyZWxlc3MuXHJcbiAqIFBpw7kgc2V6aW9uaSBzY2hlbWEgY29uIGxvIHN0ZXNzbyBgd2l6YXJkU3RlcC5zdGVwTnVtYmVyYCBmb3JtYW5vIHVuIHVuaWNvIHBhc3NvXHJcbiAqIChlcy4gcGnDuSBibG9jY2hpIGNvbGxhc3NhYmlsaSBwZXIgc3RlcCk7IG1ldGFkYXRpIGRlbCBwYXNzbyBkYWxsYSBwcmltYSBzZXppb25lIGRlbCBncnVwcG8uXHJcbiAqXHJcbiAqIEBzZWxlY3RvciB1aS1mb3JtLXdpemFyZFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDx1aS1mb3JtLXdpemFyZFxyXG4gKiAgIFtzY2hlbWFdPVwid2l6YXJkU2NoZW1hXCJcclxuICogICBbd2l6YXJkQ29uZmlnXT1cIndpemFyZENvbmZpZ1wiXHJcbiAqICAgKHdpemFyZENvbXBsZXRlKT1cIm9uQ29tcGxldGUoJGV2ZW50KVwiXHJcbiAqICAgKHN0ZXBDaGFuZ2UpPVwib25TdGVwQ2hhbmdlKCRldmVudClcIlxyXG4gKiAvPlxyXG4gKiBgYGBcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndWktZm9ybS13aXphcmQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTHVjaWRlQW5ndWxhck1vZHVsZSxcclxuICAgIFVpQnV0dG9uQ29tcG9uZW50LFxyXG4gICAgVWlGb3JtQnVpbGRlckNvbXBvbmVudCxcclxuICAgIFVpV2l6YXJkSGVhZGVyQ29tcG9uZW50LFxyXG4gICAgVWlXaXphcmRGb290ZXJDb21wb25lbnQsXHJcbiAgXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICBAaWYgKHNjaGVtYSAmJiB3aXphcmRDb25maWcpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkXCI+XHJcbiAgICAgICAgPCEtLSBIZWFkZXIgd2l6YXJkIChuYXNjb3N0byBzZSB3aXJlbGVzcykgLS0+XHJcbiAgICAgICAgQGlmICghd2l6YXJkQ29uZmlnLndpcmVsZXNzSGVhZGluZykge1xyXG4gICAgICAgICAgPHVpLXdpemFyZC1oZWFkZXJcclxuICAgICAgICAgICAgW2NvbmZpZ109XCJ3aXphcmRDb25maWdcIlxyXG4gICAgICAgICAgICBbc3RlcEdyb3Vwc109XCJ3aXphcmRTdGVwR3JvdXBzXCJcclxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcclxuICAgICAgICAgICAgW3Byb2dyZXNzUGVyY2VudF09XCJwcm9ncmVzc1BlcmNlbnRcIlxyXG4gICAgICAgICAgICBbY3VycmVudFN0ZXBUaXRsZV09XCJjdXJyZW50U3RlcFRpdGxlXCJcclxuICAgICAgICAgICAgW2N1cnJlbnRTdGVwRGVzY3JpcHRpb25dPVwiY3VycmVudFN0ZXBEZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlU3RlcEluZGljYXRvcnNdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAoc3RlcFNlbGVjdCk9XCJvbldpemFyZFN0ZXBJbmRpY2F0b3JTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSBOYXZpZ2F6aW9uZSBzb3ByYSBpbCBmb3JtIC0tPlxyXG4gICAgICAgIEBpZiAoc2hvd1RvcE5hdikge1xyXG4gICAgICAgICAgPHVpLXdpemFyZC1mb290ZXJcclxuICAgICAgICAgICAgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyIHVpLWZvcm0td2l6YXJkX19mb290ZXItLXRvcFwiXHJcbiAgICAgICAgICAgIFtjb25maWddPVwid2l6YXJkQ29uZmlnXCJcclxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcclxuICAgICAgICAgICAgW2lzTGFzdFN0ZXBdPVwiaXNMYXN0U3RlcFwiXHJcbiAgICAgICAgICAgIChwcmV2aW91cyk9XCJnb1RvUHJldmlvdXNTdGVwKClcIlxyXG4gICAgICAgICAgICAobmV4dCk9XCJnb1RvTmV4dFN0ZXAoKVwiXHJcbiAgICAgICAgICAgIChmaW5pc2gpPVwiZmluaXNoV2l6YXJkKClcIlxyXG4gICAgICAgICAgICAoc2F2ZSk9XCJzYXZlQ3VycmVudFN0ZXAoKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19jb250ZW50XCI+XHJcbiAgICAgICAgICA8IS0tIEZvcm0gYnVpbGRlciBwZXIgbG8gc3RlcCBjb3JyZW50ZSAtLT5cclxuICAgICAgICAgIDx1aS1mb3JtLWJ1aWxkZXJcclxuICAgICAgICAgICAgW3NjaGVtYV09XCJjdXJyZW50U3RlcFNjaGVtYSFcIlxyXG4gICAgICAgICAgICBbaW5pdGlhbERhdGFdPVwibWVyZ2VkSW5pdGlhbERhdGFGb3JCdWlsZGVyXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgW2xvYWRpbmdGb3JdPVwibG9hZGluZ0ZvclwiXHJcbiAgICAgICAgICAgIFtjdXN0b21GaWVsZFRlbXBsYXRlc109XCJjdXN0b21GaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgIFtjdXN0b21GaWVsZFRlbXBsYXRlRmFsbGJhY2tdPVwiY3VzdG9tRmllbGRUZW1wbGF0ZUZhbGxiYWNrXCJcclxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICh2YWxpZGF0aW9uQ2hhbmdlKT1cIm9uVmFsaWRhdGlvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGN1c3RvbUV2ZW50KT1cImN1c3RvbUV2ZW50LmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIE5hdmlnYXppb25lIHNvdHRvIGlsIGZvcm0gLS0+XHJcbiAgICAgICAgQGlmIChzaG93Qm90dG9tTmF2KSB7XHJcbiAgICAgICAgICA8dWktd2l6YXJkLWZvb3RlclxyXG4gICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19mb290ZXJcIlxyXG4gICAgICAgICAgICBbY29uZmlnXT1cIndpemFyZENvbmZpZ1wiXHJcbiAgICAgICAgICAgIFtzdGF0ZV09XCJzdGF0ZVwiXHJcbiAgICAgICAgICAgIFtpc0xhc3RTdGVwXT1cImlzTGFzdFN0ZXBcIlxyXG4gICAgICAgICAgICAocHJldmlvdXMpPVwiZ29Ub1ByZXZpb3VzU3RlcCgpXCJcclxuICAgICAgICAgICAgKG5leHQpPVwiZ29Ub05leHRTdGVwKClcIlxyXG4gICAgICAgICAgICAoZmluaXNoKT1cImZpbmlzaFdpemFyZCgpXCJcclxuICAgICAgICAgICAgKHNhdmUpPVwic2F2ZUN1cnJlbnRTdGVwKClcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIGAsXHJcbiAgc3R5bGVVcmw6ICcuL2Zvcm0td2l6YXJkLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpRm9ybVdpemFyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB3aXphcmRTeW5jID0gaW5qZWN0KFVpV2l6YXJkU3luY1NlcnZpY2UpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gaW5qZWN0KFVpTG9nZ2VyU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZChVaUZvcm1CdWlsZGVyQ29tcG9uZW50KSBmb3JtQnVpbGRlcj86IFVpRm9ybUJ1aWxkZXJDb21wb25lbnQ7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBJbnB1dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIFNjaGVtYSBjb21wbGV0byBkZWwgZm9ybSAodHV0dGUgbGUgc2V6aW9uaSBjb24gd2l6YXJkU3RlcCkuICovXHJcbiAgQElucHV0KCkgc2NoZW1hITogVWlGb3JtU2NoZW1hO1xyXG5cclxuICAvKiogQ29uZmlndXJhemlvbmUgZGVsIHdpemFyZC4gKi9cclxuICBASW5wdXQoKSB3aXphcmRDb25maWchOiBVaVdpemFyZENvbmZpZztcclxuXHJcbiAgLyoqIE1ldG9kaSBkaSB2YWxpZGF6aW9uZSBjdXN0b20gcGVyIHN0ZXAuICovXHJcbiAgQElucHV0KCkgY3VzdG9tVmFsaWRhdGlvbk1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIFVpV2l6YXJkVmFsaWRhdGlvbkZuPiA9IHt9O1xyXG5cclxuICAvKiogRGF0aSBpbml6aWFsaS4gKi9cclxuICBASW5wdXQoKSBpbml0aWFsRGF0YTogVWlGb3JtRGF0YSA9IHt9O1xyXG5cclxuICAvKiogTW9kYWxpdGEgc29sYSBsZXR0dXJhLiAqL1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XHJcblxyXG4gIC8qKiBTdGF0byBkaXNhYmlsaXRhdG8uICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFB1bHNhbnRlIGluIGNhcmljYW1lbnRvLiAqL1xyXG4gIEBJbnB1dCgpIGxvYWRpbmdGb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogVGVtcGxhdGUgcGVyIGNhbXBpIGB0eXBlOiAnY3VzdG9tJ2AgKGlub2x0cm8gYWwgZm9ybSBidWlsZGVyKS4gKi9cclxuICBASW5wdXQoKSBjdXN0b21GaWVsZFRlbXBsYXRlczogUmVjb3JkPHN0cmluZywgVGVtcGxhdGVSZWY8dW5rbm93bj4+ID0ge307XHJcblxyXG4gIC8qKiBGYWxsYmFjayB0ZW1wbGF0ZSBwZXIgY2FtcGkgY3VzdG9tIChpbm9sdHJvIGFsIGZvcm0gYnVpbGRlcikuICovXHJcbiAgQElucHV0KCkgY3VzdG9tRmllbGRUZW1wbGF0ZUZhbGxiYWNrPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBPdXRwdXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIEBPdXRwdXQoKSBzdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVdpemFyZFN0ZXBDaGFuZ2VFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgc3RlcENvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVdpemFyZFN0ZXBDb21wbGV0ZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBzdGVwVmFsaWRhdGlvbkZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgc3RlcDogbnVtYmVyO1xyXG4gICAgZXJyb3JzOiBzdHJpbmdbXTtcclxuICB9PigpO1xyXG4gIEBPdXRwdXQoKSB3aXphcmRDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VWlGb3JtRGF0YT4oKTtcclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybURhdGE+KCk7XHJcbiAgQE91dHB1dCgpIHZhbGlkYXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybVZhbGlkYXRpb25TdGF0ZT4oKTtcclxuICBAT3V0cHV0KCkgY3VzdG9tRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybUN1c3RvbUV2ZW50PigpO1xyXG5cclxuICAvLyDilIDilIDilIAgU3RhdG8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHN0YXRlOiBVaVdpemFyZFN0YXRlID0ge1xyXG4gICAgY3VycmVudFN0ZXA6IDAsXHJcbiAgICB0b3RhbFN0ZXBzOiAwLFxyXG4gICAgY29tcGxldGVkU3RlcHM6IG5ldyBTZXQ8bnVtYmVyPigpLFxyXG4gICAgdmlzaXRlZFN0ZXBzOiBuZXcgU2V0PG51bWJlcj4oWzBdKSxcclxuICAgIGlzVmFsaWQ6IGZhbHNlLFxyXG4gICAgc3RlcEVycm9yczoge30sXHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogR3J1cHBpIGRpIHNlemlvbmkgc2NoZW1hIHBlciBwYXNzbyBsb2dpY28gZGVsIHdpemFyZC5cclxuICAgKiBTZXppb25pIGNvbiBsbyBzdGVzc28gYHdpemFyZFN0ZXAuc3RlcE51bWJlcmAgY29tcG9uZ29ubyB1biB1bmljbyBwYXNzbyAob3JkaW5lOiBjb21lIGluIGBzY2hlbWEuc2VjdGlvbnNgIGRvcG8gc29ydCBwZXIgbnVtZXJvKS5cclxuICAgKi9cclxuICB3aXphcmRTdGVwR3JvdXBzOiBVaUZvcm1TZWN0aW9uW11bXSA9IFtdO1xyXG5cclxuICAvKiogRGF0aSBhY2N1bXVsYXRpIGRlbCBmb3JtLiAqL1xyXG4gIHByaXZhdGUgYWNjdW11bGF0ZWREYXRhOiBVaUZvcm1EYXRhID0ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIFNjaGVtYSBjYWNoYXRvIHBlciBsbyBzdGVwIGNvcnJlbnRlLlxyXG4gICAqIEV2aXRhIGRpIGNyZWFyZSB1biBudW92byBvZ2dldHRvIGFkIG9nbmkgY2ljbG8gZGkgY2hhbmdlIGRldGVjdGlvbixcclxuICAgKiBjb3NhIGNoZSBjYXVzZXJlYmJlIHJlYnVpbGQgaW5maW5pdGkgbmVsIGZvcm0gYnVpbGRlci5cclxuICAgKi9cclxuICBfY2FjaGVkU3RlcFNjaGVtYTogVWlGb3JtU2NoZW1hIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY2FjaGVkU3RlcEluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIEdldHRlciBjYWxjb2xhdGkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIGdldCBjdXJyZW50U3RlcFNjaGVtYSgpOiBVaUZvcm1TY2hlbWEgfCBudWxsIHtcclxuICAgIC8vIFNlIGxvIHN0ZXAgbm9uIGUgY2FtYmlhdG8sIHJlc3RpdHVpc2NpIGxvIHNjaGVtYSBjYWNoYXRvXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9PT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAmJlxyXG4gICAgICB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWE7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLndpemFyZFN0ZXBHcm91cHNbdGhpcy5zdGF0ZS5jdXJyZW50U3RlcF07XHJcbiAgICBpZiAoIWdyb3VwPy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG5cclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWEgPSB7XHJcbiAgICAgIGlkOiB0aGlzLnNjaGVtYS5pZCArICctc3RlcC0nICsgdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgc2VjdGlvbnM6IGdyb3VwLFxyXG4gICAgICBjb25maWc6IHsgLi4udGhpcy5zY2hlbWEuY29uZmlnLCBoaWRlRm9vdGVyOiB0cnVlLCBzaG93QnV0dG9uczogZmFsc2UgfSxcclxuICAgIH07XHJcbiAgICB0aGlzLl9jYWNoZWRTdGVwSW5kZXggPSB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwO1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWE7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVudFN0ZXBUaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcHJpbWFyeSA9IHRoaXMud2l6YXJkU3RlcEdyb3Vwc1t0aGlzLnN0YXRlLmN1cnJlbnRTdGVwXT8uWzBdO1xyXG4gICAgcmV0dXJuIHByaW1hcnk/LndpemFyZFN0ZXA/LnN0ZXBUaXRsZSB8fCBwcmltYXJ5Py50aXRsZSB8fCAnJztcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50U3RlcERlc2NyaXB0aW9uKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwcmltYXJ5ID0gdGhpcy53aXphcmRTdGVwR3JvdXBzW3RoaXMuc3RhdGUuY3VycmVudFN0ZXBdPy5bMF07XHJcbiAgICByZXR1cm4gcHJpbWFyeT8ud2l6YXJkU3RlcD8uc3RlcERlc2NyaXB0aW9uIHx8IHByaW1hcnk/LmRlc2NyaXB0aW9uIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTGFzdFN0ZXAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCA+PSB0aGlzLnN0YXRlLnRvdGFsU3RlcHMgLSAxO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByb2dyZXNzUGVyY2VudCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUudG90YWxTdGVwcyA8PSAxKSByZXR1cm4gMTAwO1xyXG4gICAgcmV0dXJuIE1hdGgucm91bmQoXHJcbiAgICAgICh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIC8gKHRoaXMuc3RhdGUudG90YWxTdGVwcyAtIDEpKSAqIDEwMCxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRpIHBhc3NhdGkgYWwgZm9ybSBidWlsZGVyOiB1bmlvbmUgdHJhIHZhbG9yaSBmb3JuaXRpIGRhbCBjb25zdW1lciBlXHJcbiAgICogc3RhdG8gYWNjdW11bGF0byB0cmEgZ2xpIHN0ZXAuIFNlbnphIHF1ZXN0bywgdG9ybmFuZG8gaW5kaWV0cm8gaWwgYnVpbGRlclxyXG4gICAqIHJpY2V2ZXJlYmJlIHNvbG8gYGluaXRpYWxEYXRhYCBlIHJpY3JlZXJlYmJlIGkgY2FtcGkgdnVvdGksIHB1ciBhdmVuZG9cclxuICAgKiBpIHZhbG9yaSBhbmNvcmEgaW4gYGFjY3VtdWxhdGVkRGF0YWAuXHJcbiAgICovXHJcbiAgZ2V0IG1lcmdlZEluaXRpYWxEYXRhRm9yQnVpbGRlcigpOiBVaUZvcm1EYXRhIHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMuaW5pdGlhbERhdGEsIC4uLnRoaXMuYWNjdW11bGF0ZWREYXRhIH07XHJcbiAgfVxyXG5cclxuICAvKiogTW9zdHJhIGxhIG5hdmlnYXppb25lIHNvcHJhIGlsIGZvcm0gYnVpbGRlci4gKi9cclxuICBnZXQgc2hvd1RvcE5hdigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZy5zaG93TmF2aWdhdGlvbkJ1dHRvbnMgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBwb3MgPSB0aGlzLndpemFyZENvbmZpZy5uYXZpZ2F0aW9uUG9zaXRpb247XHJcbiAgICByZXR1cm4gcG9zID09PSAndG9wJyB8fCBwb3MgPT09ICdib3RoJztcclxuICB9XHJcblxyXG4gIC8qKiBNb3N0cmEgbGEgbmF2aWdhemlvbmUgc290dG8gaWwgZm9ybSBidWlsZGVyLiAqL1xyXG4gIGdldCBzaG93Qm90dG9tTmF2KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLnNob3dOYXZpZ2F0aW9uQnV0dG9ucyA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IHBvcyA9IHRoaXMud2l6YXJkQ29uZmlnLm5hdmlnYXRpb25Qb3NpdGlvbjtcclxuICAgIHJldHVybiBwb3MgPT09ICdib3R0b20nIHx8IHBvcyA9PT0gJ2JvdGgnIHx8IHBvcyA9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2NoZW1hKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ2luaXQnLCB7IHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQsIGVycm9yOiAnc2NoZW1hIG5vbiBwcmVzZW50ZScgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLndpemFyZFN0ZXBHcm91cHMgPSB0aGlzLmJ1aWxkV2l6YXJkU3RlcEdyb3Vwcyh0aGlzLnNjaGVtYS5zZWN0aW9ucyk7XHJcbiAgICB0aGlzLnN0YXRlLnRvdGFsU3RlcHMgPSB0aGlzLndpemFyZFN0ZXBHcm91cHMubGVuZ3RoO1xyXG4gICAgdGhpcy5hY2N1bXVsYXRlZERhdGEgPSB7IC4uLnRoaXMuaW5pdGlhbERhdGEgfTtcclxuXHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdpbml0Jywge1xyXG4gICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWc/LndpemFyZElkLFxyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWEuaWQsXHJcbiAgICAgIHRvdGFsU3RlcHM6IHRoaXMuc3RhdGUudG90YWxTdGVwcyxcclxuICAgICAgdG90YWxTZWN0aW9uczogdGhpcy53aXphcmRTdGVwR3JvdXBzLnJlZHVjZSgoc3VtLCBnKSA9PiBzdW0gKyBnLmxlbmd0aCwgMCksXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBTaW5jcm9uaXp6YXppb25lIHdpcmVsZXNzXHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpIHtcclxuICAgICAgdGhpcy5zeW5jV2l6YXJkU3RhdGUoKTtcclxuXHJcbiAgICAgIC8vIEFzY29sdGEgbmF2aWdhemlvbmUgZXN0ZXJuYVxyXG4gICAgICB0aGlzLndpemFyZFN5bmNcclxuICAgICAgICAuZ2V0V2l6YXJkU3RhdGUkKHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLndpemFyZFN0YXRlLmN1cnJlbnRTdGVwICE9PSB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb1N0ZXAoZGF0YS53aXphcmRTdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ2Rlc3Ryb3knLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQsXHJcbiAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYT8uaWQsXHJcbiAgICAgIGN1cnJlbnRTdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQpIHtcclxuICAgICAgdGhpcy53aXphcmRTeW5jLnVucmVnaXN0ZXJXaXphcmQodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2NvcmNpYXRvaWE6IEN0cmwgKyBGcmVjY2lhIHNpbmlzdHJhL2Rlc3RyYSBwZXIgbmF2aWdhcmUgY29tZSBpIHB1bHNhbnRpXHJcbiAgICogSW5kaWV0cm8gLyBBdmFudGkgKHN1bGwndWx0aW1vIHN0ZXAsIEF2YW50aSBlcXVpdmFsZSBhIENvbXBsZXRhKS5cclxuICAgKiBJZ25vcmF0YSBzZSBpbCBmb2N1cyDDqCBpbiB1biBjYW1wbyBkaSBpbnB1dCBwZXIgbm9uIGludGVyZmVyaXJlIGNvbiBsYSBkaWdpdGF6aW9uZS5cclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbkRvY3VtZW50S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNjaGVtYSB8fCAhdGhpcy53aXphcmRDb25maWcgfHwgdGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLnNob3dOYXZpZ2F0aW9uQnV0dG9ucyA9PT0gZmFsc2UpIHJldHVybjtcclxuICAgIGlmICghZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5zaGlmdEtleSlcclxuICAgICAgcmV0dXJuO1xyXG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ0Fycm93TGVmdCcgJiYgZXZlbnQua2V5ICE9PSAnQXJyb3dSaWdodCcpIHJldHVybjtcclxuICAgIGlmICh0aGlzLmlzRWRpdGFibGVLZXlib2FyZFRhcmdldChldmVudC50YXJnZXQpKSByZXR1cm47XHJcblxyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcclxuICAgICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLmFsbG93QmFja05hdmlnYXRpb24gPT09IGZhbHNlKSByZXR1cm47XHJcbiAgICAgIGlmICh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIDw9IDApIHJldHVybjtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbigna2V5Ym9hcmROYXZpZ2F0aW9uJywge1xyXG4gICAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgICBkaXJlY3Rpb246ICdwcmV2aW91cycsXHJcbiAgICAgICAgZnJvbVN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmdvVG9QcmV2aW91c1N0ZXAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFycm93UmlnaHRcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdrZXlib2FyZE5hdmlnYXRpb24nLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgZGlyZWN0aW9uOiB0aGlzLmlzTGFzdFN0ZXAgPyAnZmluaXNoJyA6ICduZXh0JyxcclxuICAgICAgZnJvbVN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLmlzTGFzdFN0ZXApIHtcclxuICAgICAgdm9pZCB0aGlzLmZpbmlzaFdpemFyZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdm9pZCB0aGlzLmdvVG9OZXh0U3RlcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFRydWUgc2UgaWwgdGFyZ2V0IGRlbCBrZXlkb3duIMOoIHVuIGVsZW1lbnRvIGRvdmUgbGEgZGlnaXRhemlvbmUgaGEgcHJpb3JpdMOgIHN1bGxhIHNob3J0Y3V0IHdpemFyZC4gKi9cclxuICBwcml2YXRlIGlzRWRpdGFibGVLZXlib2FyZFRhcmdldCh0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0YXJnZXQgfHwgISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IGVsID0gdGFyZ2V0O1xyXG4gICAgaWYgKGVsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gdHJ1ZTtcclxuICAgIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XHJcbiAgICBpZiAodGFnID09PSAnSU5QVVQnIHx8IHRhZyA9PT0gJ1RFWFRBUkVBJyB8fCB0YWcgPT09ICdTRUxFQ1QnKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBOYXZpZ2F6aW9uZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIFZhaSBhbGxvIHN0ZXAgc3VjY2Vzc2l2byBjb24gdmFsaWRhemlvbmUuICovXHJcbiAgYXN5bmMgZ29Ub05leHRTdGVwKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuaXNMYXN0U3RlcCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIFZhbGlkYSBzdGVwIGNvcnJlbnRlXHJcbiAgICBpZiAoIShhd2FpdCB0aGlzLnZhbGlkYXRlQ3VycmVudFN0ZXAoKSkpIHJldHVybjtcclxuXHJcbiAgICAvLyBTYWx2YSBkYXRpIHN0ZXAgY29ycmVudGVcclxuICAgIHRoaXMuc3RhdGUuY29tcGxldGVkU3RlcHMuYWRkKHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgYXdhaXQgdGhpcy5hdXRvU2F2ZUlmTmVlZGVkKCk7XHJcblxyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcCh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwICsgMSk7XHJcbiAgfVxyXG5cclxuICAvKiogVG9ybmEgYWxsbyBzdGVwIHByZWNlZGVudGUuICovXHJcbiAgZ29Ub1ByZXZpb3VzU3RlcCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIDw9IDApIHJldHVybjtcclxuICAgIHRoaXMubmF2aWdhdGVUb1N0ZXAodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhemlvbmUgdHJhbWl0ZSBpbmRpY2F0b3JpIHN0ZXAgKGJ1bGxldCArIHRpdG9sbykgcXVhbmRvIGBwcm9ncmVzc1N0eWxlYCDDqCBgJ3N0ZXBzJ2AuXHJcbiAgICogQ29uc2VudGl0byBzb2xvIHZlcnNvIHN0ZXAgZ2nDoCBtYXJjYXRpIGNvbXBsZXRhdGkuXHJcbiAgICovXHJcbiAgb25XaXphcmRTdGVwSW5kaWNhdG9yU2VsZWN0KHN0ZXBJbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLmFsbG93U3RlcEluZGljYXRvck5hdmlnYXRpb24gPT09IGZhbHNlKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuYWxsb3dCYWNrTmF2aWdhdGlvbiA9PT0gZmFsc2UpIHJldHVybjtcclxuICAgIGlmIChzdGVwSW5kZXggPT09IHRoaXMuc3RhdGUuY3VycmVudFN0ZXApIHJldHVybjtcclxuICAgIGlmICghdGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoc3RlcEluZGV4KSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ25hdmlnYXRpb24nLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgdmlhOiAnc3RlcEluZGljYXRvcicsXHJcbiAgICAgIGZyb21TdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICB0b1N0ZXA6IHN0ZXBJbmRleCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcChzdGVwSW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbXBsZXRhIGlsIHdpemFyZC4gKi9cclxuICBhc3luYyBmaW5pc2hXaXphcmQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIShhd2FpdCB0aGlzLnZhbGlkYXRlQ3VycmVudFN0ZXAoKSkpIHtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignc3RlcFZhbGlkYXRpb25GYWlsZWQnLCB7XHJcbiAgICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgY29udGV4dDogJ2ZpbmlzaCcsXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcy5hZGQodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICBhd2FpdCB0aGlzLmF1dG9TYXZlSWZOZWVkZWQoKTtcclxuXHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdjb21wbGV0ZScsIHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWE/LmlkLFxyXG4gICAgICB0b3RhbFN0ZXBzOiB0aGlzLnN0YXRlLnRvdGFsU3RlcHMsXHJcbiAgICAgIGNvbXBsZXRlZFN0ZXBzOiBBcnJheS5mcm9tKHRoaXMuc3RhdGUuY29tcGxldGVkU3RlcHMpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLndpemFyZENvbXBsZXRlLmVtaXQodGhpcy5hY2N1bXVsYXRlZERhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNhbHZhIGxvIHN0ZXAgY29ycmVudGUgbWFudWFsbWVudGUuICovXHJcbiAgYXN5bmMgc2F2ZUN1cnJlbnRTdGVwKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLm9uU3RlcFNhdmUpIHtcclxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybUJ1aWxkZXI/LmdldEZvcm1WYWx1ZSgpIHx8IHt9O1xyXG4gICAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdzYXZlJywge1xyXG4gICAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYT8uaWQsXHJcbiAgICAgIH0pO1xyXG4gICAgICBhd2FpdCB0aGlzLndpemFyZENvbmZpZy5vblN0ZXBTYXZlKGRhdGEsIHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIENhbGxiYWNrIGZvcm0gYnVpbGRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgb25WYWx1ZUNoYW5nZShkYXRhOiBVaUZvcm1EYXRhKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjY3VtdWxhdGVkRGF0YSA9IHsgLi4udGhpcy5hY2N1bXVsYXRlZERhdGEsIC4uLmRhdGEgfTtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3ZhbHVlQ2hhbmdlJywge1xyXG4gICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsXHJcbiAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYT8uaWQsXHJcbiAgICAgIGNoYW5nZWRLZXlzOiBPYmplY3Qua2V5cyhkYXRhKSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuYWNjdW11bGF0ZWREYXRhKTtcclxuICB9XHJcblxyXG4gIG9uVmFsaWRhdGlvbkNoYW5nZShzdGF0ZTogVWlGb3JtVmFsaWRhdGlvblN0YXRlKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXRlLmlzVmFsaWQgPSBzdGF0ZS52YWxpZDtcclxuICAgIHRoaXMudmFsaWRhdGlvbkNoYW5nZS5lbWl0KHN0YXRlKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBOYXZpZ2F6aW9uZSBpbnRlcm5hIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRlVG9TdGVwKHRhcmdldFN0ZXA6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRhcmdldFN0ZXAgPCAwIHx8IHRhcmdldFN0ZXAgPj0gdGhpcy5zdGF0ZS50b3RhbFN0ZXBzKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgZnJvbSA9IHRoaXMuc3RhdGUuY3VycmVudFN0ZXA7XHJcbiAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwID0gdGFyZ2V0U3RlcDtcclxuICAgIHRoaXMuc3RhdGUudmlzaXRlZFN0ZXBzLmFkZCh0YXJnZXRTdGVwKTtcclxuXHJcbiAgICAvLyBJbnZhbGlkYSBsYSBjYWNoZSBwZXIgZm9yemFyZSBsYSBjcmVhemlvbmUgZGkgdW4gbnVvdm8gc2NoZW1hXHJcbiAgICB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hID0gbnVsbDtcclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9IC0xO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3N0ZXBDaGFuZ2UnLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgZnJvbSxcclxuICAgICAgdG86IHRhcmdldFN0ZXAsXHJcbiAgICAgIGRpcmVjdGlvbjogdGFyZ2V0U3RlcCA+IGZyb20gPyAnbmV4dCcgOiAncHJldmlvdXMnLFxyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWE/LmlkLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdGVwQ2hhbmdlLmVtaXQoe1xyXG4gICAgICBmcm9tLFxyXG4gICAgICB0bzogdGFyZ2V0U3RlcCxcclxuICAgICAgZGlyZWN0aW9uOiB0YXJnZXRTdGVwID4gZnJvbSA/ICduZXh0JyA6ICdwcmV2aW91cycsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN5bmNXaXphcmRTdGF0ZSgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQ3VycmVudFN0ZXAoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLmZvcm1CdWlsZGVyPy52YWxpZGF0ZUFsbEZpZWxkcygpO1xyXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLndpemFyZFN0ZXBHcm91cHNbdGhpcy5zdGF0ZS5jdXJyZW50U3RlcF07XHJcbiAgICBjb25zdCBwcmltYXJ5ID0gZ3JvdXA/LlswXTtcclxuICAgIGNvbnN0IHZhbGlkYXRlQ3VzdG9tQ29tcG9uZW50cyA9XHJcbiAgICAgIHByaW1hcnk/LndpemFyZFN0ZXA/LnZhbGlkYXRpb24/LnZhbGlkYXRlQ3VzdG9tQ29tcG9uZW50cyAhPT0gZmFsc2U7XHJcbiAgICBjb25zdCBjdXN0b21GaWVsZEtleXMgPSBuZXcgU2V0KHRoaXMuZ2V0Q3VzdG9tRmllbGRLZXlzRm9yR3JvdXAoZ3JvdXApKTtcclxuXHJcbiAgICBjb25zdCBpc0Zvcm1WYWxpZCA9IHZhbGlkYXRlQ3VzdG9tQ29tcG9uZW50c1xyXG4gICAgICA/ICh0aGlzLmZvcm1CdWlsZGVyPy5pc0Zvcm1WYWxpZCgpID8/IHRydWUpXHJcbiAgICAgIDogKHRoaXMuZm9ybUJ1aWxkZXI/LmlzRm9ybVZhbGlkRXhjbHVkaW5nRmllbGRLZXlzKGN1c3RvbUZpZWxkS2V5cykgPz9cclxuICAgICAgICB0cnVlKTtcclxuXHJcbiAgICBjb25zdCBjdXN0b21Gbk5hbWUgPSBwcmltYXJ5Py53aXphcmRTdGVwPy5jdXN0b21WYWxpZGF0aW9uRm47XHJcblxyXG4gICAgaWYgKGN1c3RvbUZuTmFtZSAmJiB0aGlzLmN1c3RvbVZhbGlkYXRpb25NZXRob2RzW2N1c3RvbUZuTmFtZV0pIHtcclxuICAgICAgY29uc3QgY3VzdG9tVmFsaWQgPSBhd2FpdCB0aGlzLmN1c3RvbVZhbGlkYXRpb25NZXRob2RzW2N1c3RvbUZuTmFtZV0oXHJcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZERhdGEsXHJcbiAgICAgICAgdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgICBpc0Zvcm1WYWxpZCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICghY3VzdG9tVmFsaWQpIHtcclxuICAgICAgICB0aGlzLnN0ZXBWYWxpZGF0aW9uRmFpbGVkLmVtaXQoe1xyXG4gICAgICAgICAgc3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgICAgIGVycm9yczogWydWYWxpZGF6aW9uZSBjdXN0b20gZmFsbGl0YSddLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghaXNGb3JtVmFsaWQgJiYgcHJpbWFyeT8ud2l6YXJkU3RlcD8udmFsaWRhdGlvbj8ucmVxdWlyZWQgIT09IGZhbHNlKSB7XHJcbiAgICAgIGxldCBkZXRhaWxzID0gdGhpcy5mb3JtQnVpbGRlcj8uZ2V0RGV0YWlsZWRGb3JtRXJyb3JzKCkgfHwgW107XHJcbiAgICAgIGlmICghdmFsaWRhdGVDdXN0b21Db21wb25lbnRzICYmIGdyb3VwPy5sZW5ndGgpIHtcclxuICAgICAgICBkZXRhaWxzID0gdGhpcy5maWx0ZXJFcnJvckRldGFpbHNFeGNsdWRpbmdDdXN0b21GaWVsZHMoXHJcbiAgICAgICAgICBkZXRhaWxzLFxyXG4gICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICBjdXN0b21GaWVsZEtleXMsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBlcnJvcnMgPSBkZXRhaWxzLmZsYXRNYXAoKGUpID0+IGUuZXJyb3JzKTtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignc3RlcFZhbGlkYXRpb25GYWlsZWQnLCB7XHJcbiAgICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgZXJyb3JzLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5zdGVwVmFsaWRhdGlvbkZhaWxlZC5lbWl0KHtcclxuICAgICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgIGVycm9ycyxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdzdGVwQ29tcGxldGUnLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgc3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdGVwQ29tcGxldGUuZW1pdCh7XHJcbiAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIGRhdGE6IHRoaXMuZm9ybUJ1aWxkZXI/LmdldEZvcm1WYWx1ZSgpIHx8IHt9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSYWdncnVwcGEgbGUgc2V6aW9uaSBjb24gYHdpemFyZFN0ZXBgIHBlciBgc3RlcE51bWJlcmAgKG9yZGluZSBzdGFiaWxlIHBlciBudW1lcm8sIHBvaSBvcmRpbmUgZGkgYXBwYXJpemlvbmUgbmVsbG8gc2NoZW1hKS5cclxuICAgKi9cclxuICBwcml2YXRlIGJ1aWxkV2l6YXJkU3RlcEdyb3VwcyhzZWN0aW9uczogVWlGb3JtU2VjdGlvbltdKTogVWlGb3JtU2VjdGlvbltdW10ge1xyXG4gICAgY29uc3Qgd2l0aFdpemFyZCA9IHNlY3Rpb25zLmZpbHRlcigocykgPT4gcy53aXphcmRTdGVwKTtcclxuICAgIHdpdGhXaXphcmQuc29ydChcclxuICAgICAgKGEsIGIpID0+XHJcbiAgICAgICAgKGEud2l6YXJkU3RlcCEuc3RlcE51bWJlciB8fCAwKSAtIChiLndpemFyZFN0ZXAhLnN0ZXBOdW1iZXIgfHwgMCksXHJcbiAgICApO1xyXG4gICAgY29uc3QgZ3JvdXBzOiBVaUZvcm1TZWN0aW9uW11bXSA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBzIG9mIHdpdGhXaXphcmQpIHtcclxuICAgICAgY29uc3QgbnVtID0gcy53aXphcmRTdGVwIS5zdGVwTnVtYmVyO1xyXG4gICAgICBjb25zdCBwcmV2ID0gZ3JvdXBzW2dyb3Vwcy5sZW5ndGggLSAxXTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHByZXY/Lmxlbmd0aCAmJlxyXG4gICAgICAgIChwcmV2WzBdLndpemFyZFN0ZXAhLnN0ZXBOdW1iZXIgfHwgMCkgPT09IChudW0gfHwgMClcclxuICAgICAgKSB7XHJcbiAgICAgICAgcHJldi5wdXNoKHMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGdyb3Vwcy5wdXNoKFtzXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBncm91cHM7XHJcbiAgfVxyXG5cclxuICAvKiogQ2hpYXZpIGRlaSBjYW1waSBgY3VzdG9tYCBpbiB0dXR0ZSBsZSBzZXppb25pIGRlbCBwYXNzbyBjb3JyZW50ZS4gKi9cclxuICBwcml2YXRlIGdldEN1c3RvbUZpZWxkS2V5c0Zvckdyb3VwKFxyXG4gICAgZ3JvdXA6IFVpRm9ybVNlY3Rpb25bXSB8IHVuZGVmaW5lZCxcclxuICApOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAoIWdyb3VwPy5sZW5ndGgpIHJldHVybiBbXTtcclxuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ3JvdXApIHtcclxuICAgICAgZm9yIChjb25zdCBmIG9mIHNlY3Rpb24uZmllbGRzIHx8IFtdKSB7XHJcbiAgICAgICAgaWYgKGYudHlwZSA9PT0gJ2N1c3RvbScpIGtleXMucHVzaChmLmtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBrZXlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJpbXVvdmUgZGFnbGkgZXJyb3JpIGkgY2FtcGkgY3VzdG9tIHF1YW5kbyBgdmFsaWRhdGVDdXN0b21Db21wb25lbnRzYCDDqCBmYWxzZS4gKi9cclxuICBwcml2YXRlIGZpbHRlckVycm9yRGV0YWlsc0V4Y2x1ZGluZ0N1c3RvbUZpZWxkcyhcclxuICAgIGRldGFpbHM6IFVpRm9ybUVycm9yRGV0YWlsW10sXHJcbiAgICBncm91cDogVWlGb3JtU2VjdGlvbltdLFxyXG4gICAgY3VzdG9tS2V5czogU2V0PHN0cmluZz4sXHJcbiAgKTogVWlGb3JtRXJyb3JEZXRhaWxbXSB7XHJcbiAgICBjb25zdCBzZWN0aW9uSWRzID0gZ3JvdXAubWFwKChzKSA9PiBzLmlkKTtcclxuICAgIHJldHVybiBkZXRhaWxzLmZpbHRlcigoZCkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dpY2FsS2V5ID0gdGhpcy5sb2dpY2FsRmllbGRLZXlGcm9tRGV0YWlsS2V5Rm9yR3JvdXAoXHJcbiAgICAgICAgZC5maWVsZEtleSxcclxuICAgICAgICBzZWN0aW9uSWRzLFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gIWN1c3RvbUtleXMuaGFzKGxvZ2ljYWxLZXkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaXNvbHZlIGxhIGNoaWF2ZSBsb2dpY2EgZGVsIGNhbXBvIHJpc3BldHRvIGEgdHV0dGUgbGUgc2V6aW9uaSBkZWwgZ3J1cHBvIChjYW1waSBmbGF0IG8gcmVwZWF0YWJsZSkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2dpY2FsRmllbGRLZXlGcm9tRGV0YWlsS2V5Rm9yR3JvdXAoXHJcbiAgICBmaWVsZEtleTogc3RyaW5nLFxyXG4gICAgc2VjdGlvbklkczogc3RyaW5nW10sXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGZvciAoY29uc3QgaWQgb2Ygc2VjdGlvbklkcykge1xyXG4gICAgICBjb25zdCBrID0gdGhpcy5sb2dpY2FsRmllbGRLZXlGcm9tRGV0YWlsS2V5KGZpZWxkS2V5LCBpZCk7XHJcbiAgICAgIGlmIChrICE9PSBmaWVsZEtleSkgcmV0dXJuIGs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGRLZXk7XHJcbiAgfVxyXG5cclxuICAvKiogRXN0cmFlIGxhIGNoaWF2ZSBjYW1wbyBkYSBgZmllbGRLZXlgIGZsYXQgbyBgc2VjdGlvbklkW2ldLmZpZWxkS2V5YC4gKi9cclxuICBwcml2YXRlIGxvZ2ljYWxGaWVsZEtleUZyb21EZXRhaWxLZXkoXHJcbiAgICBmaWVsZEtleTogc3RyaW5nLFxyXG4gICAgc2VjdGlvbklkOiBzdHJpbmcsXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXiR7dGhpcy5lc2NhcGVSZWdFeHAoc2VjdGlvbklkKX1cXFxcW1xcXFxkK1xcXFxdXFxcXC4oLispJGApO1xyXG4gICAgY29uc3QgbSA9IGZpZWxkS2V5Lm1hdGNoKHJlKTtcclxuICAgIHJldHVybiBtID8gbVsxXSA6IGZpZWxkS2V5O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlc2NhcGVSZWdFeHAoczogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGF1dG9TYXZlSWZOZWVkZWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuYXV0b1NhdmUgJiYgdGhpcy53aXphcmRDb25maWcub25TdGVwU2F2ZSkge1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5mb3JtQnVpbGRlcj8uZ2V0Rm9ybVZhbHVlKCkgfHwge307XHJcbiAgICAgIGF3YWl0IHRoaXMud2l6YXJkQ29uZmlnLm9uU3RlcFNhdmUoZGF0YSwgdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNXaXphcmRTdGF0ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzeW5jRGF0YTogVWlXaXphcmRTeW5jRGF0YSA9IHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICB3aXphcmRTdGF0ZTogeyAuLi50aGlzLnN0YXRlIH0sXHJcbiAgICAgIHdpemFyZFN0ZXBzOiB0aGlzLndpemFyZFN0ZXBHcm91cHMubWFwKChnKSA9PiAoe1xyXG4gICAgICAgIHRpdGxlOiBnWzBdPy53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHwgZ1swXT8udGl0bGUsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGdbMF0/LndpemFyZFN0ZXA/LnN0ZXBEZXNjcmlwdGlvbiB8fCBnWzBdPy5kZXNjcmlwdGlvbixcclxuICAgICAgfSkpLFxyXG4gICAgICBpc1dpemFyZE1vZGU6IHRydWUsXHJcbiAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMud2l6YXJkU3luYy5yZWdpc3RlcldpemFyZCh0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCwgc3luY0RhdGEpO1xyXG4gIH1cclxufVxyXG4iXX0=
|