@mediusinc/mng-commons 6.0.0-rc.4 → 6.0.0-rc.6
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/core/components/notification/notification-wrapper.component.d.ts +4 -4
- package/core/error/error.model.d.ts +4 -4
- package/core/helpers/notification.d.ts +2 -2
- package/core/provide.d.ts +3 -3
- package/core/styles/style-constants.d.ts +9 -8
- package/core/styles/style.model.d.ts +2 -1
- package/fesm2022/mediusinc-mng-commons-core.mjs +91 -104
- package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form-api.mjs +8 -9
- package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form.mjs +149 -49
- package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-DTSBP9WQ.mjs +31 -0
- package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-DTSBP9WQ.mjs.map +1 -0
- package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-JZpyiDIL.mjs +2118 -0
- package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-JZpyiDIL.mjs.map +1 -0
- package/fesm2022/mediusinc-mng-commons-table.mjs +1 -2154
- package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +97 -49
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview.mjs +340 -309
- package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
- package/form/api/index.d.ts +1 -0
- package/form/api/models/empty-value.model.d.ts +7 -0
- package/form/components/autocomplete/autocomplete.component.d.ts +1 -2
- package/form/components/date-range/date-range.component.d.ts +4 -3
- package/form/components/dropdown/dropdown.component.d.ts +3 -2
- package/form/components/number-range/number-range.component.d.ts +3 -2
- package/form/directives/input-empty-value.directive.d.ts +40 -0
- package/form/directives/input-trim.directive.d.ts +3 -5
- package/form/index.d.ts +1 -0
- package/i18n/en.json +57 -8
- package/i18n/sl.json +1 -3
- package/package.json +16 -42
- package/provide.d.ts +2 -2
- package/table/components/column-toggle/column-toggle.component.d.ts +12 -0
- package/table/components/filter/filter-form/filter-form.component.d.ts +2 -2
- package/table/components/table/table.component.d.ts +0 -1
- package/table/helpers/filters.d.ts +3 -2
- package/table/helpers/notification.d.ts +2 -2
- package/table/services/table-metadata.service.d.ts +3 -3
- package/tableview/action/components/action/action.component.d.ts +1 -0
- package/tableview/action/components/editor/action-editor.component.d.ts +1 -1
- package/tableview/action/components/table/action-table.component.d.ts +2 -1
- package/tableview/action/helpers/notification.d.ts +3 -3
- package/tableview/action/models/execution/action-context.model.d.ts +2 -2
- package/tableview/action/services/action-executor.service.d.ts +1 -1
- package/tableview/api/action/models/execution/action-context.model.d.ts +2 -2
- package/tableview/api/editor/descriptors/editor.descriptor.d.ts +5 -0
- package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +14 -10
- package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +10 -0
- package/tableview/api/editor/descriptors/field.descriptor.d.ts +36 -9
- package/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.d.ts +1 -1
- package/tableview/api/editor/models/field-action-context.model.d.ts +1 -1
- package/tableview/api/editor/models/field.model.d.ts +1 -2
- package/tableview/api/editor/models/form-editor.interface.d.ts +2 -2
- package/tableview/api/editor/models/formly-custom-field.model.d.ts +1 -1
- package/tableview/api/editor/models/formly-field.model.d.ts +2 -2
- package/tableview/editor/components/editor/form-editor.component.d.ts +2 -2
- package/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.d.ts +1 -1
- package/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.d.ts +2 -1
- package/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +4 -6
- package/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +0 -2
- package/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +2 -2
- package/tableview/editor/components/formly/fields/formly-field-type.abstract.component.d.ts +8 -15
- package/tableview/editor/components/formly/fields/formly-group-type.abstract.component.d.ts +7 -0
- package/tableview/editor/components/formly/fields/formly-type.abstract.component.d.ts +20 -0
- package/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +11 -4
- package/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +2 -1
- package/tableview/editor/helpers/formly-config.d.ts +1 -1
- package/tableview/editor/helpers/notification.d.ts +3 -3
- package/tableview/editor/models/formly-config.model.d.ts +10 -1
- package/tableview/editor/models/formly.model.d.ts +23 -0
- package/tableview/editor/services/form-editor.service.d.ts +2 -2
- package/tableview/tableview/router/tableview-route-builder.d.ts +10 -3
- package/tableview/tableview/services/tableview-feature-config.token.d.ts +1 -1
- package/version-info.json +3 -3
- package/esm2022/core/action/action-data.model.mjs +0 -2
- package/esm2022/core/action/action-parameters.model.mjs +0 -2
- package/esm2022/core/components/notification/notification-wrapper.component.mjs +0 -50
- package/esm2022/core/data-list/data-list-params-helpers.mjs +0 -465
- package/esm2022/core/data-list/data-list.model.mjs +0 -2
- package/esm2022/core/data-list/filter-match.model.mjs +0 -105
- package/esm2022/core/data-list/filter-metadata.model.mjs +0 -2
- package/esm2022/core/data-providers/base.data-provider.mjs +0 -16
- package/esm2022/core/data-providers/lookup.data-provider.mjs +0 -2
- package/esm2022/core/descriptors/action.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/column.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/editor.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/enum.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/filter.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/lookup.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/model.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/table.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/tableview.descriptor.mjs +0 -2
- package/esm2022/core/directives/component.directive.mjs +0 -75
- package/esm2022/core/directives/rerender.directive.mjs +0 -25
- package/esm2022/core/directives/template.directive.mjs +0 -29
- package/esm2022/core/enum/enum-helpers.mjs +0 -90
- package/esm2022/core/enum/enum.model.mjs +0 -2
- package/esm2022/core/error/error-handler.mjs +0 -20
- package/esm2022/core/error/error-helpers.mjs +0 -273
- package/esm2022/core/error/error.model.mjs +0 -33
- package/esm2022/core/helpers/coercion.mjs +0 -55
- package/esm2022/core/helpers/date.mjs +0 -119
- package/esm2022/core/helpers/notification.mjs +0 -21
- package/esm2022/core/helpers/number.mjs +0 -19
- package/esm2022/core/helpers/object.mjs +0 -152
- package/esm2022/core/helpers/route.mjs +0 -58
- package/esm2022/core/helpers/string.mjs +0 -57
- package/esm2022/core/helpers/templates.mjs +0 -4
- package/esm2022/core/helpers/type-helpers.mjs +0 -2
- package/esm2022/core/i18n/i18n-common.mjs +0 -24
- package/esm2022/core/i18n/i18n-error.mjs +0 -29
- package/esm2022/core/i18n/i18n-type.mjs +0 -46
- package/esm2022/core/index.mjs +0 -107
- package/esm2022/core/log/log-publisher-console.service.mjs +0 -40
- package/esm2022/core/log/log.model.mjs +0 -10
- package/esm2022/core/log/logger.service.mjs +0 -131
- package/esm2022/core/mediusinc-mng-commons-core.mjs +0 -5
- package/esm2022/core/models/class-attribute.model.mjs +0 -2
- package/esm2022/core/models/class-service.model.mjs +0 -2
- package/esm2022/core/models/getter.model.mjs +0 -2
- package/esm2022/core/models/i18n.model.mjs +0 -2
- package/esm2022/core/models/menu.model.mjs +0 -2
- package/esm2022/core/models/user.model.mjs +0 -2
- package/esm2022/core/models/version.model.mjs +0 -2
- package/esm2022/core/pipes/boolean.pipe.mjs +0 -34
- package/esm2022/core/pipes/class-map.pipe.mjs +0 -23
- package/esm2022/core/pipes/enum.pipe.mjs +0 -38
- package/esm2022/core/pipes/enumerate-async.pipe.mjs +0 -36
- package/esm2022/core/pipes/enumerate.pipe.mjs +0 -49
- package/esm2022/core/pipes/getter.pipe.mjs +0 -21
- package/esm2022/core/pipes/i18n-property.pipe.mjs +0 -19
- package/esm2022/core/pipes/json-path.pipe.mjs +0 -25
- package/esm2022/core/pipes/parametrize.pipe.mjs +0 -86
- package/esm2022/core/pipes/template.pipe.mjs +0 -25
- package/esm2022/core/provide.mjs +0 -79
- package/esm2022/core/reactivity/effect.mjs +0 -22
- package/esm2022/core/reflect/type-enum-decorator.mjs +0 -12
- package/esm2022/core/reflect/type-enum-metadata.mjs +0 -62
- package/esm2022/core/registry/registry.model.mjs +0 -2
- package/esm2022/core/registry/type-registry.mjs +0 -106
- package/esm2022/core/router/route-builder.mjs +0 -431
- package/esm2022/core/router/router.model.mjs +0 -2
- package/esm2022/core/router/routes-builder.mjs +0 -52
- package/esm2022/core/rxjs/map-data-list-result-operator.mjs +0 -22
- package/esm2022/core/security/permission-helpers.mjs +0 -14
- package/esm2022/core/security/permission.guard.mjs +0 -15
- package/esm2022/core/security/permission.service.mjs +0 -101
- package/esm2022/core/security/permissions.model.mjs +0 -93
- package/esm2022/core/services/commons-configuration.service.mjs +0 -189
- package/esm2022/core/services/commons-init.service.mjs +0 -111
- package/esm2022/core/services/commons-router.service.mjs +0 -181
- package/esm2022/core/services/commons-storage.service.mjs +0 -31
- package/esm2022/core/services/commons.service.mjs +0 -324
- package/esm2022/core/services/providers/commons-init.provider.mjs +0 -4
- package/esm2022/core/services/tokens/browser-storage.token.mjs +0 -3
- package/esm2022/core/services/tokens/commons-init.token.mjs +0 -3
- package/esm2022/core/services/tokens/log-publisher.token.mjs +0 -3
- package/esm2022/core/services/tokens/module-config.token.mjs +0 -3
- package/esm2022/core/styles/style-constants.mjs +0 -11
- package/esm2022/core/styles/style.model.mjs +0 -20
- package/esm2022/filter/descriptors/filter-generic.descriptor.mjs +0 -31
- package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +0 -168
- package/esm2022/filter/descriptors/filter.descriptor.mjs +0 -421
- package/esm2022/filter/index.mjs +0 -8
- package/esm2022/filter/mediusinc-mng-commons-filter.mjs +0 -5
- package/esm2022/filter/models/filter-generic-property.model.mjs +0 -2
- package/esm2022/filter/models/filter.model.mjs +0 -20
- package/esm2022/form/api/data-providers/lookup-data-provider.factory.mjs +0 -15
- package/esm2022/form/api/data-providers/lookup.data-provider.mjs +0 -15
- package/esm2022/form/api/descriptors/action-button.descriptor.mjs +0 -56
- package/esm2022/form/api/descriptors/button-style.builder.mjs +0 -153
- package/esm2022/form/api/index.mjs +0 -10
- package/esm2022/form/api/mediusinc-mng-commons-form-api.mjs +0 -5
- package/esm2022/form/api/models/button.model.mjs +0 -2
- package/esm2022/form/api/models/trim.model.mjs +0 -2
- package/esm2022/form/components/autocomplete/autocomplete.component.mjs +0 -436
- package/esm2022/form/components/date-range/date-range.component.mjs +0 -147
- package/esm2022/form/components/dropdown/dropdown.component.mjs +0 -372
- package/esm2022/form/components/number-range/number-range.component.mjs +0 -123
- package/esm2022/form/directives/input-trim.directive.mjs +0 -50
- package/esm2022/form/index.mjs +0 -8
- package/esm2022/form/mediusinc-mng-commons-form.mjs +0 -5
- package/esm2022/index.mjs +0 -2
- package/esm2022/mediusinc-mng-commons.mjs +0 -5
- package/esm2022/model/class/data-providers/base-from-class-data-provider.factory.mjs +0 -5
- package/esm2022/model/class/descriptors/model-class.descriptor.mjs +0 -28
- package/esm2022/model/class/descriptors/type-class.descriptor.mjs +0 -6
- package/esm2022/model/class/helpers/model.mjs +0 -53
- package/esm2022/model/class/index.mjs +0 -8
- package/esm2022/model/class/mediusinc-mng-commons-model-class.mjs +0 -5
- package/esm2022/model/data-providers/base-from-type-data-provider.factory.mjs +0 -13
- package/esm2022/model/descriptors/enum.descriptor.mjs +0 -28
- package/esm2022/model/descriptors/model.descriptor.mjs +0 -53
- package/esm2022/model/descriptors/type.descriptor.mjs +0 -7
- package/esm2022/model/helpers/i18n.mjs +0 -47
- package/esm2022/model/index.mjs +0 -9
- package/esm2022/model/mediusinc-mng-commons-model.mjs +0 -5
- package/esm2022/provide.mjs +0 -6
- package/esm2022/table/api/class/class-table-attribute-converter.mjs +0 -80
- package/esm2022/table/api/class/class-table-attribute.model.mjs +0 -2
- package/esm2022/table/api/class/class-table-data-provider.factory.mjs +0 -5
- package/esm2022/table/api/class/class-table-descriptor-helpers.mjs +0 -99
- package/esm2022/table/api/class/class-table-descriptor.factory.mjs +0 -21
- package/esm2022/table/api/class/index.mjs +0 -6
- package/esm2022/table/api/class/mediusinc-mng-commons-table-api-class.mjs +0 -5
- package/esm2022/table/api/data-providers/table-data-provider.factory.mjs +0 -15
- package/esm2022/table/api/data-providers/table.data-provider.mjs +0 -33
- package/esm2022/table/api/descriptors/column.descriptor.mjs +0 -475
- package/esm2022/table/api/descriptors/sort.descriptor.mjs +0 -67
- package/esm2022/table/api/descriptors/table-descriptor.factory.mjs +0 -22
- package/esm2022/table/api/descriptors/table.descriptor.mjs +0 -1116
- package/esm2022/table/api/helpers/column-converter.mjs +0 -25
- package/esm2022/table/api/helpers/table-data-provider-descriptor-convert.mjs +0 -7
- package/esm2022/table/api/index.mjs +0 -19
- package/esm2022/table/api/mediusinc-mng-commons-table-api.mjs +0 -5
- package/esm2022/table/api/models/column-value.model.mjs +0 -2
- package/esm2022/table/api/models/column.model.mjs +0 -21
- package/esm2022/table/api/models/row-expandable-component.model.mjs +0 -2
- package/esm2022/table/api/models/table-columns.model.mjs +0 -2
- package/esm2022/table/api/models/table-event.model.mjs +0 -2
- package/esm2022/table/api/models/table.model.mjs +0 -21
- package/esm2022/table/components/column-filter/column-filter.component.mjs +0 -389
- package/esm2022/table/components/column-value/column-value.component.mjs +0 -78
- package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +0 -55
- package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +0 -226
- package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +0 -219
- package/esm2022/table/components/table/table.component.mjs +0 -319
- package/esm2022/table/helpers/filters.mjs +0 -312
- package/esm2022/table/helpers/notification.mjs +0 -21
- package/esm2022/table/helpers/table-layout-prefs.mjs +0 -10
- package/esm2022/table/helpers/table.mjs +0 -24
- package/esm2022/table/index.mjs +0 -24
- package/esm2022/table/mediusinc-mng-commons-table.mjs +0 -5
- package/esm2022/table/models/column-preferences.model.mjs +0 -2
- package/esm2022/table/models/filter.model.mjs +0 -2
- package/esm2022/table/pipes/filter-value.pipe.mjs +0 -77
- package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +0 -27
- package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +0 -25
- package/esm2022/table/provide.mjs +0 -19
- package/esm2022/table/services/table-data.service.mjs +0 -194
- package/esm2022/table/services/table-feature-config.token.mjs +0 -3
- package/esm2022/table/services/table-metadata.service.mjs +0 -136
- package/esm2022/table/services/table-preferences.service.mjs +0 -142
- package/esm2022/tableview/action/components/action/action.component.mjs +0 -277
- package/esm2022/tableview/action/components/editor/action-editor.component.mjs +0 -86
- package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +0 -428
- package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +0 -35
- package/esm2022/tableview/action/components/route/action-route.component.mjs +0 -146
- package/esm2022/tableview/action/components/table/action-table.component.mjs +0 -102
- package/esm2022/tableview/action/guards/unsaved-changes.guard.mjs +0 -4
- package/esm2022/tableview/action/helpers/action-execution.mjs +0 -25
- package/esm2022/tableview/action/helpers/i18n.mjs +0 -102
- package/esm2022/tableview/action/helpers/notification.mjs +0 -78
- package/esm2022/tableview/action/helpers/styles.mjs +0 -32
- package/esm2022/tableview/action/models/action-editor-dialog-data.model.mjs +0 -2
- package/esm2022/tableview/action/models/can-component-deactivate.model.mjs +0 -2
- package/esm2022/tableview/action/models/execution/action-context.model.mjs +0 -64
- package/esm2022/tableview/action/models/execution/action-instance.model.mjs +0 -169
- package/esm2022/tableview/action/services/action-error-mapper.service.mjs +0 -20
- package/esm2022/tableview/action/services/action-executor.service.mjs +0 -777
- package/esm2022/tableview/action/services/component-action-executor.service.mjs +0 -19
- package/esm2022/tableview/action/services/data-provider-executor.service.mjs +0 -41
- package/esm2022/tableview/action/services/navigation.service.mjs +0 -53
- package/esm2022/tableview/action/services/providers/provide-action-executor.mjs +0 -9
- package/esm2022/tableview/action/services/providers/provide-view-container.mjs +0 -17
- package/esm2022/tableview/action/services/root-action-executor.service.mjs +0 -18
- package/esm2022/tableview/action/services/tokens/action-editor.token.mjs +0 -3
- package/esm2022/tableview/action/services/view-container.service.mjs +0 -40
- package/esm2022/tableview/api/action/descriptors/action-descriptor.factory.mjs +0 -28
- package/esm2022/tableview/api/action/descriptors/action-editor-descriptor.factory.mjs +0 -30
- package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +0 -223
- package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +0 -32
- package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +0 -74
- package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +0 -302
- package/esm2022/tableview/api/action/descriptors/editor-action-descriptor.factory.mjs +0 -21
- package/esm2022/tableview/api/action/descriptors/editor-action-editor-descriptor.factory.mjs +0 -21
- package/esm2022/tableview/api/action/descriptors/table-action-descriptor.factory.mjs +0 -37
- package/esm2022/tableview/api/action/descriptors/table-action-editor-descriptor.factory.mjs +0 -40
- package/esm2022/tableview/api/action/helpers/data-provider-executors.mjs +0 -100
- package/esm2022/tableview/api/action/models/action-component.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/action-confirmation.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/action-descriptor.types.mjs +0 -2
- package/esm2022/tableview/api/action/models/action-editor.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/action-error.model.mjs +0 -14
- package/esm2022/tableview/api/action/models/action.type.mjs +0 -26
- package/esm2022/tableview/api/action/models/execution/action-context-validation.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/execution/action-context.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/execution/action-execution-error.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/execution/action-instance-state.model.mjs +0 -32
- package/esm2022/tableview/api/action/models/execution/action-instance.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/execution/view-container.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/tableview-action-default-categories.model.mjs +0 -11
- package/esm2022/tableview/api/action/services/data-provider-executor.service.mjs +0 -28
- package/esm2022/tableview/api/action/services/tokens/data-language-dropdown.token.mjs +0 -3
- package/esm2022/tableview/api/class/editor/class-editor-attribute-converter.mjs +0 -85
- package/esm2022/tableview/api/class/editor/class-editor-attribute.model.mjs +0 -2
- package/esm2022/tableview/api/class/editor/class-editor-data-provider.factory.mjs +0 -5
- package/esm2022/tableview/api/class/editor/class-editor-descriptor-helpers.mjs +0 -95
- package/esm2022/tableview/api/class/editor/class-editor-descriptor.factory.mjs +0 -21
- package/esm2022/tableview/api/class/index.mjs +0 -13
- package/esm2022/tableview/api/class/mediusinc-mng-commons-tableview-api-class.mjs +0 -5
- package/esm2022/tableview/api/class/tableview/class-tableview-attribute-converter.mjs +0 -35
- package/esm2022/tableview/api/class/tableview/class-tableview-attribute.model.mjs +0 -2
- package/esm2022/tableview/api/class/tableview/class-tableview-data-provider.factory.mjs +0 -5
- package/esm2022/tableview/api/class/tableview/class-tableview-descriptor-helpers.mjs +0 -111
- package/esm2022/tableview/api/class/tableview/class-tableview-descriptor.factory.mjs +0 -26
- package/esm2022/tableview/api/editor/data-providers/editor-data-provider.factory.mjs +0 -15
- package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +0 -114
- package/esm2022/tableview/api/editor/descriptors/editor-descriptor.factory.mjs +0 -15
- package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +0 -437
- package/esm2022/tableview/api/editor/descriptors/field-action.descriptor.mjs +0 -51
- package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +0 -314
- package/esm2022/tableview/api/editor/descriptors/field-group.descriptor.mjs +0 -103
- package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +0 -211
- package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +0 -142
- package/esm2022/tableview/api/editor/descriptors/field-validation.descriptor.mjs +0 -25
- package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +0 -402
- package/esm2022/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.mjs +0 -51
- package/esm2022/tableview/api/editor/models/editor-fields.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/editor.model.mjs +0 -9
- package/esm2022/tableview/api/editor/models/field-action-context.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/field-image-preview.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/field-validation.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/field.model.mjs +0 -57
- package/esm2022/tableview/api/editor/models/form-editor.event.mjs +0 -28
- package/esm2022/tableview/api/editor/models/form-editor.interface.mjs +0 -2
- package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +0 -70
- package/esm2022/tableview/api/editor/models/formly-field.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/formly-options.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/radio.model.mjs +0 -2
- package/esm2022/tableview/api/index.mjs +0 -76
- package/esm2022/tableview/api/mediusinc-mng-commons-tableview-api.mjs +0 -5
- package/esm2022/tableview/api/tableview/data-providers/tableview-data-provider.factory.mjs +0 -18
- package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +0 -84
- package/esm2022/tableview/api/tableview/descriptors/tableview-descriptor.factory.mjs +0 -34
- package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +0 -377
- package/esm2022/tableview/api/tableview/helpers/files-export.mjs +0 -34
- package/esm2022/tableview/api/tableview/helpers/tableview-create.mjs +0 -26
- package/esm2022/tableview/api/tableview/helpers/tableview-data-provider-descriptor-convert.mjs +0 -7
- package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +0 -324
- package/esm2022/tableview/api/tableview/helpers/tableview-input-builder.mjs +0 -319
- package/esm2022/tableview/api/tableview/models/tableview-descriptor-fields-manage-helper.type.mjs +0 -2
- package/esm2022/tableview/api/tableview/models/tableview-descriptor-helper.type.mjs +0 -2
- package/esm2022/tableview/api/tableview/models/tableview-input.model.mjs +0 -2
- package/esm2022/tableview/api/tableview/models/tableview-route.model.mjs +0 -2
- package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +0 -82
- package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +0 -480
- package/esm2022/tableview/editor/components/formly/constants.mjs +0 -2
- package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +0 -66
- package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +0 -47
- package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +0 -39
- package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +0 -165
- package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +0 -42
- package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +0 -34
- package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +0 -211
- package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +0 -23
- package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +0 -195
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +0 -239
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +0 -205
- package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +0 -28
- package/esm2022/tableview/editor/components/formly/fields/formly-field-type.abstract.component.mjs +0 -46
- package/esm2022/tableview/editor/components/formly/pipes/formly-field-label.pipe.mjs +0 -19
- package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +0 -33
- package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +0 -59
- package/esm2022/tableview/editor/helpers/editor-autosave.mjs +0 -49
- package/esm2022/tableview/editor/helpers/editor-field.mjs +0 -39
- package/esm2022/tableview/editor/helpers/editor-formly.mjs +0 -388
- package/esm2022/tableview/editor/helpers/editor-validators.mjs +0 -25
- package/esm2022/tableview/editor/helpers/field-create.mjs +0 -21
- package/esm2022/tableview/editor/helpers/formly-config.mjs +0 -260
- package/esm2022/tableview/editor/helpers/notification.mjs +0 -11
- package/esm2022/tableview/editor/models/editor-auto-save-preview.model.mjs +0 -2
- package/esm2022/tableview/editor/models/formly-config.model.mjs +0 -2
- package/esm2022/tableview/editor/services/form-editor.service.mjs +0 -96
- package/esm2022/tableview/editor/services/formly-config.provider.mjs +0 -31
- package/esm2022/tableview/index.mjs +0 -67
- package/esm2022/tableview/mediusinc-mng-commons-tableview.mjs +0 -5
- package/esm2022/tableview/provide.mjs +0 -105
- package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +0 -15
- package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +0 -59
- package/esm2022/tableview/tableview/router/tableview-route-builder.mjs +0 -175
- package/esm2022/tableview/tableview/services/tableview-feature-config.token.mjs +0 -3
|
@@ -1,777 +0,0 @@
|
|
|
1
|
-
import { HttpErrorResponse } from '@angular/common/http';
|
|
2
|
-
import { Injector, inject } from '@angular/core';
|
|
3
|
-
import { Router } from '@angular/router';
|
|
4
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
5
|
-
import { ConfirmationService, MessageService } from 'primeng/api';
|
|
6
|
-
import { DialogService } from 'primeng/dynamicdialog';
|
|
7
|
-
import { from, mergeMap, of, switchMap, take, timeout } from 'rxjs';
|
|
8
|
-
import { catchError, filter, first, map, startWith } from 'rxjs/operators';
|
|
9
|
-
import { CommonsHttpError, CommonsInternalError, CommonsService, LoggerService, ParametrizePipe, StyleLevelEnum, StyleSizeEnum, escapeHtmlAny, toObservable } from '@mediusinc/mng-commons/core';
|
|
10
|
-
import { ButtonStyleBuilder } from '@mediusinc/mng-commons/form/api';
|
|
11
|
-
import { ActionActivationTriggerEnum, ActionEditorDescriptorInst, ActionInstanceStateEnum, ActionTypeEnum, CommonsActionError, DataProviderExecutor, TableviewActionDefaultCategories } from '@mediusinc/mng-commons/tableview/api';
|
|
12
|
-
import { COMMONS_TABLEVIEW_FEATURE_CONFIG_IT } from '../../tableview/services/tableview-feature-config.token';
|
|
13
|
-
import { actionExecutionSelectDataProvider } from '../helpers/action-execution';
|
|
14
|
-
import { getI18nForAction } from '../helpers/i18n';
|
|
15
|
-
import { actionNotificationError, actionNotificationSuccess } from '../helpers/notification';
|
|
16
|
-
import { ActionContext, ActionDataProviderSource } from '../models/execution/action-context.model';
|
|
17
|
-
import { ActionInstance } from '../models/execution/action-instance.model';
|
|
18
|
-
import { ActionErrorMapperService } from './action-error-mapper.service';
|
|
19
|
-
import { NavigationService } from './navigation.service';
|
|
20
|
-
import { ACTION_EDITOR_COMPONENT_IT } from './tokens/action-editor.token';
|
|
21
|
-
import { ViewContainer } from './view-container.service';
|
|
22
|
-
export class ActionExecutorService {
|
|
23
|
-
constructor() {
|
|
24
|
-
this.injector = inject(Injector);
|
|
25
|
-
this.router = inject(Router);
|
|
26
|
-
this.dialogService = inject(DialogService);
|
|
27
|
-
this.translate = inject(TranslateService);
|
|
28
|
-
this.commons = inject(CommonsService);
|
|
29
|
-
this.dataProviderExecutor = inject(DataProviderExecutor);
|
|
30
|
-
this.navigationService = inject(NavigationService);
|
|
31
|
-
this.errorMapper = inject(ActionErrorMapperService);
|
|
32
|
-
this.config = inject(COMMONS_TABLEVIEW_FEATURE_CONFIG_IT, { optional: true });
|
|
33
|
-
this.defaultEditorDialogComponent = inject(ACTION_EDITOR_COMPONENT_IT);
|
|
34
|
-
this.messageService = inject(MessageService);
|
|
35
|
-
this.confirmationService = inject(ConfirmationService);
|
|
36
|
-
this.viewContainer = inject(ViewContainer, { optional: true });
|
|
37
|
-
this.parametrize = new ParametrizePipe();
|
|
38
|
-
this.instancesBufferMax = 100;
|
|
39
|
-
this.logger = inject(LoggerService).create(ActionExecutorService.className);
|
|
40
|
-
}
|
|
41
|
-
static { this.className = 'ActionExecutorService'; }
|
|
42
|
-
/**
|
|
43
|
-
* Prepares action context for usage in validation.
|
|
44
|
-
* @param action Action descriptor.
|
|
45
|
-
* @param parameters Action parameters.
|
|
46
|
-
* @param dataProvider Data provider.
|
|
47
|
-
*/
|
|
48
|
-
prepareActionContextValidation(action, parameters, dataProvider) {
|
|
49
|
-
const ctxDataProvider = actionExecutionSelectDataProvider(action, dataProvider, this.viewContainer);
|
|
50
|
-
return {
|
|
51
|
-
descriptor: action,
|
|
52
|
-
parameters: parameters,
|
|
53
|
-
serviceInstance: this.dataProviderExecutor.getDataProviderService(this.injector, ctxDataProvider.dataProvider) ?? undefined,
|
|
54
|
-
dataProvider: ctxDataProvider.dataProvider
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Runs action context by submitting execution results/errors to context, watching over instance results/errors, displaying notifications,
|
|
59
|
-
* running next/error action and triggering dismiss of action. Confirmation is also processed here.
|
|
60
|
-
*
|
|
61
|
-
* @param ctx Action context to run.
|
|
62
|
-
*/
|
|
63
|
-
run(ctx) {
|
|
64
|
-
const isMainRunFn = ctx.functionName === 'submit' || ctx.functionName === 'run';
|
|
65
|
-
if (isMainRunFn && ctx.instance.action.runConfirmation != null) {
|
|
66
|
-
// only direct action can be configured with run confirmation
|
|
67
|
-
// if editor, then run confirmation is mapped to submit action and ignored as editor run
|
|
68
|
-
const confirmationDescriptor = ctx.instance.action.runConfirmation;
|
|
69
|
-
const item = ctx.parameters.item;
|
|
70
|
-
const escapedItem = escapeHtmlAny(item);
|
|
71
|
-
const getTranslationOrUndefined = (label, defLabel, fallback, escapeItem = false) => label !== null
|
|
72
|
-
? (getI18nForAction(this.translate, ctx.instance.action, defLabel, {
|
|
73
|
-
customKey: label,
|
|
74
|
-
item: escapeItem ? escapedItem : item,
|
|
75
|
-
fallbackKey: fallback
|
|
76
|
-
}) ?? undefined)
|
|
77
|
-
: undefined;
|
|
78
|
-
const getButtonStyle = (style, def) => (style instanceof ButtonStyleBuilder ? style : ButtonStyleBuilder.from({ ...def, ...style } ?? def)).build();
|
|
79
|
-
let confirmParams = {
|
|
80
|
-
icon: confirmationDescriptor.icon !== null ? (confirmationDescriptor.icon ?? 'pi pi-exclamation-triangle') : undefined,
|
|
81
|
-
header: getTranslationOrUndefined(confirmationDescriptor.title, 'confirm.title', 'general.confirmation'),
|
|
82
|
-
message: getTranslationOrUndefined(confirmationDescriptor.title, 'confirm.message', 'general.confirmation'),
|
|
83
|
-
acceptVisible: true,
|
|
84
|
-
acceptLabel: getTranslationOrUndefined(confirmationDescriptor.title, 'confirm.accept', 'general.yes'),
|
|
85
|
-
acceptIcon: confirmationDescriptor.acceptButton?.icon !== null
|
|
86
|
-
? (confirmationDescriptor.acceptButton?.icon ?? ctx.instance.action.button?.icon ?? 'pi pi-check')
|
|
87
|
-
: undefined,
|
|
88
|
-
acceptButtonStyleClass: getButtonStyle(confirmationDescriptor.acceptButton?.style, { level: ctx.instance.action.button?.style?.level }),
|
|
89
|
-
rejectVisible: !(confirmationDescriptor.rejectButton === false ||
|
|
90
|
-
(confirmationDescriptor.rejectButton?.label === null && confirmationDescriptor.rejectButton?.icon === null)),
|
|
91
|
-
rejectLabel: getTranslationOrUndefined(confirmationDescriptor.title, 'confirm.reject', 'general.no'),
|
|
92
|
-
rejectIcon: confirmationDescriptor.rejectButton !== false && confirmationDescriptor.rejectButton?.icon !== null
|
|
93
|
-
? (confirmationDescriptor.rejectButton?.icon ?? 'pi pi-times')
|
|
94
|
-
: undefined,
|
|
95
|
-
rejectButtonStyleClass: confirmationDescriptor.rejectButton !== false ? getButtonStyle(confirmationDescriptor.rejectButton?.style, { level: StyleLevelEnum.Secondary }) : undefined,
|
|
96
|
-
closeOnEscape: confirmationDescriptor.closeOnEscape,
|
|
97
|
-
accept: () => {
|
|
98
|
-
ctx.instance.state = ActionInstanceStateEnum.RunConfirmationEndAccept;
|
|
99
|
-
this.runWithoutConfirmation(ctx);
|
|
100
|
-
},
|
|
101
|
-
reject: () => {
|
|
102
|
-
ctx.instance.state = ActionInstanceStateEnum.RunConfirmationEndReject;
|
|
103
|
-
if (ctx.instance.action.type !== ActionTypeEnum.Editor) {
|
|
104
|
-
// if not editor, the it can be closed
|
|
105
|
-
this.finishAction(ctx.instance);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
if (confirmationDescriptor.configMapFn) {
|
|
110
|
-
confirmParams = confirmationDescriptor.configMapFn(ctx, confirmParams);
|
|
111
|
-
}
|
|
112
|
-
ctx.confirmation = confirmParams;
|
|
113
|
-
ctx.instance.state = ActionInstanceStateEnum.RunConfirmationStart;
|
|
114
|
-
this.confirmationService.confirm(confirmParams);
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
this.runWithoutConfirmation(ctx);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Runs action context by submitting execution results/errors to context, watching over instance results/errors, displaying notifications,
|
|
122
|
-
* running next/error action and triggering dismiss of action. Confirmation
|
|
123
|
-
*
|
|
124
|
-
* @param ctx Action context to run.
|
|
125
|
-
*
|
|
126
|
-
* @returns Action context for submit (=run) function.
|
|
127
|
-
*/
|
|
128
|
-
runWithoutConfirmation(ctx) {
|
|
129
|
-
const isMainRunFn = ctx.functionName === 'submit' || ctx.functionName === 'run';
|
|
130
|
-
const isErrorCriticalRunFn = ctx.functionName === 'run';
|
|
131
|
-
let actionEditor;
|
|
132
|
-
let fnObs;
|
|
133
|
-
switch (ctx.functionName) {
|
|
134
|
-
case 'submit':
|
|
135
|
-
actionEditor = ctx.instance.action;
|
|
136
|
-
if (typeof actionEditor.submitFunction !== 'function') {
|
|
137
|
-
if (actionEditor.tableviewCategory === TableviewActionDefaultCategories.ADD) {
|
|
138
|
-
fnObs = this.dataProviderExecutor.runCreateOrFail.bind(this.dataProviderExecutor);
|
|
139
|
-
}
|
|
140
|
-
else if (actionEditor.tableviewCategory === TableviewActionDefaultCategories.EDIT) {
|
|
141
|
-
fnObs = this.dataProviderExecutor.runUpdateOrFail.bind(this.dataProviderExecutor);
|
|
142
|
-
}
|
|
143
|
-
else if (ctx.dataProviderSource > ActionDataProviderSource.ViewContainer) {
|
|
144
|
-
// if data provider is given directly on descriptor or as input, use it
|
|
145
|
-
const defaultSubmit = of(ctx.parameters?.item ?? undefined);
|
|
146
|
-
fnObs = ctx => {
|
|
147
|
-
if (ctx.parameters.itemId) {
|
|
148
|
-
return this.dataProviderExecutor.runUpdate(ctx, defaultSubmit);
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
return this.dataProviderExecutor.runCreate(ctx, defaultSubmit);
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
fnObs = ctx => ctx.parameters?.item ?? undefined;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
fnObs = actionEditor.submitFunction;
|
|
161
|
-
}
|
|
162
|
-
break;
|
|
163
|
-
case 'fetch':
|
|
164
|
-
actionEditor = ctx.instance.action;
|
|
165
|
-
if (typeof actionEditor.fetchFunction !== 'function') {
|
|
166
|
-
if (actionEditor.tableviewCategory === TableviewActionDefaultCategories.EDIT || actionEditor.tableviewCategory === TableviewActionDefaultCategories.DETAILS) {
|
|
167
|
-
const isEdit = actionEditor.tableviewCategory === TableviewActionDefaultCategories.EDIT;
|
|
168
|
-
fnObs = ctx => this.dataProviderExecutor.runFetchOrFail(ctx, isEdit ? 'update' : undefined);
|
|
169
|
-
}
|
|
170
|
-
else if (ctx.dataProviderSource > ActionDataProviderSource.ViewContainer) {
|
|
171
|
-
const defaultFetch = of(ctx.parameters?.item ?? undefined);
|
|
172
|
-
fnObs = ctx => {
|
|
173
|
-
if (ctx.parameters.itemId || typeof ctx.parameters.item === 'object') {
|
|
174
|
-
return this.dataProviderExecutor.runFetch(ctx, undefined, defaultFetch);
|
|
175
|
-
}
|
|
176
|
-
return defaultFetch;
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
fnObs = ctx => ctx.parameters?.item ?? undefined;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
fnObs = actionEditor.fetchFunction;
|
|
185
|
-
}
|
|
186
|
-
break;
|
|
187
|
-
case 'run':
|
|
188
|
-
default:
|
|
189
|
-
if (!ctx.instance.action.hasRunFunction && ctx.instance.action.tableviewCategory === TableviewActionDefaultCategories.DELETE) {
|
|
190
|
-
fnObs = this.dataProviderExecutor.runDeleteOrFail.bind(this.dataProviderExecutor);
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
fnObs = ctx.instance.action.runFunction;
|
|
194
|
-
}
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
|
-
const retObs = of(void 0).pipe(take(1), switchMap(() => {
|
|
198
|
-
if (isMainRunFn) {
|
|
199
|
-
// if main run function, also set loading to true
|
|
200
|
-
ctx.instance.state = ActionInstanceStateEnum.RunStart;
|
|
201
|
-
ctx.instance.isRunLoadingSubject.next(true);
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
204
|
-
ctx.instance.state = ActionInstanceStateEnum.FetchStart;
|
|
205
|
-
}
|
|
206
|
-
// start context execution to mark execution loading
|
|
207
|
-
ctx.executionStart();
|
|
208
|
-
return toObservable(fnObs(ctx));
|
|
209
|
-
}), mergeMap(runResult => {
|
|
210
|
-
// handle notifications
|
|
211
|
-
const notificationItem = {
|
|
212
|
-
...ctx.parameters?.item,
|
|
213
|
-
...ctx.parameters?.formItem,
|
|
214
|
-
...ctx.parameters?.submitResult,
|
|
215
|
-
...runResult
|
|
216
|
-
};
|
|
217
|
-
if (isMainRunFn && (ctx.instance.action.runNotificationOnSuccess ?? true)) {
|
|
218
|
-
ctx.notification = actionNotificationSuccess(this.translate, this.messageService, ctx.instance.action, {
|
|
219
|
-
functionName: ctx.functionName,
|
|
220
|
-
item: notificationItem,
|
|
221
|
-
...(typeof ctx.instance.action.runNotificationOnSuccess === 'object' ? ctx.instance.action.runNotificationOnSuccess : {})
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
else if (!isMainRunFn && (actionEditor.fetchNotificationOnSuccess ?? false)) {
|
|
225
|
-
ctx.notification = actionNotificationSuccess(this.translate, this.messageService, actionEditor, {
|
|
226
|
-
functionName: ctx.functionName,
|
|
227
|
-
item: notificationItem,
|
|
228
|
-
...(typeof actionEditor.fetchNotificationOnSuccess === 'object' ? actionEditor.fetchNotificationOnSuccess : {})
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
// set next state depending on run
|
|
232
|
-
ctx.instance.state = isMainRunFn ? ActionInstanceStateEnum.RunEnd : ActionInstanceStateEnum.FetchEnd;
|
|
233
|
-
// set execution result
|
|
234
|
-
ctx.executionNext(runResult, isMainRunFn);
|
|
235
|
-
if (isMainRunFn) {
|
|
236
|
-
// set instance final result on main run execution
|
|
237
|
-
ctx.instance.result = runResult;
|
|
238
|
-
ctx.instance.isRunLoadingSubject.next(false);
|
|
239
|
-
// handle possible after run action
|
|
240
|
-
if (ctx.instance.action.afterRunAction) {
|
|
241
|
-
// mark new state for next action start
|
|
242
|
-
const afterRunAction = typeof ctx.instance.action.afterRunAction === 'function' ? ctx.instance.action.afterRunAction(ctx) : ctx.instance.action.afterRunAction;
|
|
243
|
-
const nextActionInstance = this.activateAction(afterRunAction, {
|
|
244
|
-
itemId: ctx.parameters.itemId,
|
|
245
|
-
item: runResult,
|
|
246
|
-
actionData: ctx.parameters.actionData,
|
|
247
|
-
route: ctx.parameters.route,
|
|
248
|
-
sourceComponent: ctx.parameters.sourceComponent
|
|
249
|
-
}, undefined, ctx.instance, true);
|
|
250
|
-
ctx.instance.nextActionInstance = nextActionInstance;
|
|
251
|
-
ctx.instance.state = ActionInstanceStateEnum.NextActionStart;
|
|
252
|
-
// finish current action when next action finishes
|
|
253
|
-
return nextActionInstance.state$.pipe(startWith(nextActionInstance.state), // provide first state cause it might be finished already
|
|
254
|
-
filter(state => state >= ActionInstanceStateEnum.FinishSuccessFinal), take(1), map(() => {
|
|
255
|
-
ctx.instance.state = ActionInstanceStateEnum.NextActionEnd;
|
|
256
|
-
return runResult;
|
|
257
|
-
}));
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
return of(runResult);
|
|
261
|
-
}), map(runResult => {
|
|
262
|
-
if (isMainRunFn) {
|
|
263
|
-
// deactivate action
|
|
264
|
-
this.finishAction(ctx.instance);
|
|
265
|
-
}
|
|
266
|
-
return runResult;
|
|
267
|
-
}), catchError(err => {
|
|
268
|
-
// transform error to action error
|
|
269
|
-
const actionError = this.toActionError(err, ctx);
|
|
270
|
-
// set instance state to error
|
|
271
|
-
ctx.instance.state = isMainRunFn ? ActionInstanceStateEnum.RunError : ActionInstanceStateEnum.FetchError;
|
|
272
|
-
// mark execution error on context
|
|
273
|
-
ctx.executionError(actionError);
|
|
274
|
-
let errorObs = of(void 0);
|
|
275
|
-
if (isMainRunFn) {
|
|
276
|
-
ctx.instance.error = err;
|
|
277
|
-
ctx.instance.isRunLoadingSubject.next(false);
|
|
278
|
-
if (ctx.instance.action.runNotificationOnError ?? true) {
|
|
279
|
-
actionError.notification = actionNotificationError(this.translate, this.messageService, ctx.instance.action, actionError, undefined, {
|
|
280
|
-
functionName: ctx.functionName,
|
|
281
|
-
item: ctx.parameters.item,
|
|
282
|
-
...(typeof ctx.instance.action.runNotificationOnError === 'object' ? ctx.instance.action.runNotificationOnError : {})
|
|
283
|
-
});
|
|
284
|
-
actionError.notificationEmitSource = ActionExecutorService.className;
|
|
285
|
-
ctx.notification = actionError.notification;
|
|
286
|
-
}
|
|
287
|
-
// handle possible error action if run
|
|
288
|
-
if (isMainRunFn && ctx.instance.action.onRunErrorAction) {
|
|
289
|
-
const onRunErrorAction = typeof ctx.instance.action.onRunErrorAction === 'function' ? ctx.instance.action.onRunErrorAction(ctx) : ctx.instance.action.onRunErrorAction;
|
|
290
|
-
// cannot start with trigger, because routing might be problematic (lousing previous results etc.)
|
|
291
|
-
const errorActionInstance = this.activateAction(onRunErrorAction, {
|
|
292
|
-
itemId: ctx.parameters.itemId,
|
|
293
|
-
item: ctx.parameters.item,
|
|
294
|
-
actionData: ctx.parameters.actionData,
|
|
295
|
-
route: ctx.parameters.route,
|
|
296
|
-
sourceComponent: ctx.parameters.sourceComponent
|
|
297
|
-
}, undefined, undefined, true);
|
|
298
|
-
ctx.instance.errorActionInstance = errorActionInstance;
|
|
299
|
-
ctx.instance.state = ActionInstanceStateEnum.ErrorActionStart;
|
|
300
|
-
errorObs = errorActionInstance.state$.pipe(startWith(errorActionInstance.state), // provide first state cause it might be finished already
|
|
301
|
-
filter(state => state >= ActionInstanceStateEnum.FinishSuccessFinal), take(1), map(() => {
|
|
302
|
-
ctx.instance.state = ActionInstanceStateEnum.ErrorActionEnd;
|
|
303
|
-
return void 0;
|
|
304
|
-
}));
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
else if (actionEditor.fetchNotificationOnError ?? true) {
|
|
308
|
-
ctx.notification = actionNotificationError(this.translate, this.messageService, actionEditor, actionError, undefined, {
|
|
309
|
-
functionName: ctx.functionName,
|
|
310
|
-
item: {
|
|
311
|
-
...ctx.parameters.item
|
|
312
|
-
},
|
|
313
|
-
...(typeof actionEditor.fetchNotificationOnError === 'object' ? actionEditor.fetchNotificationOnError : {})
|
|
314
|
-
});
|
|
315
|
-
actionError.notificationEmitSource = ActionExecutorService.className;
|
|
316
|
-
ctx.notification = actionError.notification;
|
|
317
|
-
}
|
|
318
|
-
// list and map only to mark instance state as finished error state
|
|
319
|
-
return errorObs.pipe(map(() => {
|
|
320
|
-
// deactivate action only if critical (fetch on editor or run on button actions)
|
|
321
|
-
if (isErrorCriticalRunFn) {
|
|
322
|
-
this.finishAction(ctx.instance);
|
|
323
|
-
}
|
|
324
|
-
// rethrow error to propagate further
|
|
325
|
-
throw actionError;
|
|
326
|
-
}));
|
|
327
|
-
}));
|
|
328
|
-
ctx.runSubscription = retObs.subscribe({
|
|
329
|
-
next: res => {
|
|
330
|
-
this.logger.debug(`ActionContext ${ctx.contextLongName} execution next event`, res);
|
|
331
|
-
},
|
|
332
|
-
error: err => {
|
|
333
|
-
if (err?.type !== 'CommonsActionError') {
|
|
334
|
-
this.logger.error(`Non action error occurred`, err);
|
|
335
|
-
}
|
|
336
|
-
else {
|
|
337
|
-
this.logger.debug(`Action context ${ctx.contextLongName} execution error event`, err);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
return retObs;
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Prepares editor action's fetch function by creating new action context for action instance.
|
|
345
|
-
*
|
|
346
|
-
* @param action Action descriptor.
|
|
347
|
-
* @param parameters Action parameters for context.
|
|
348
|
-
* @param dataProvider Editor data provider for context.
|
|
349
|
-
* @param instance Optional existing action instance (if non provided, new will be created).
|
|
350
|
-
* @param previousActionInstance Optional previous action instance to link in next instance.
|
|
351
|
-
*
|
|
352
|
-
* @returns Action context for fetch function.
|
|
353
|
-
*/
|
|
354
|
-
prepareContextForEditorFetch(action, parameters, dataProvider, instance, previousActionInstance) {
|
|
355
|
-
instance = this.getOrCreateInstance(instance, action, parameters, ActionInstanceStateEnum.ActivationEnd);
|
|
356
|
-
return this.prepareContextForEditor(instance, parameters, 'fetch', dataProvider, previousActionInstance);
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* Runs editor action's submit (=main run) function by creating new action context for action instance.
|
|
360
|
-
*
|
|
361
|
-
* @param action Action descriptor.
|
|
362
|
-
* @param parameters Action parameters for context.
|
|
363
|
-
* @param dataProvider Editor data provider for context.
|
|
364
|
-
* @param instance Optional existing action instance (if non provided, new will be created).
|
|
365
|
-
* @param previousActionInstance Optional previous action instance to link in next instance.
|
|
366
|
-
*
|
|
367
|
-
* @returns Action context for submit (=run) function.
|
|
368
|
-
*/
|
|
369
|
-
prepareContextForEditorSubmit(action, parameters, dataProvider, instance, previousActionInstance) {
|
|
370
|
-
instance = this.getOrCreateInstance(instance, action, parameters, ActionInstanceStateEnum.ActivationEnd);
|
|
371
|
-
return this.prepareContextForEditor(instance, parameters, 'submit', dataProvider, previousActionInstance);
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* Prepares action exec context for action of type editor.
|
|
375
|
-
*
|
|
376
|
-
* @param instance Action instance.
|
|
377
|
-
* @param parameters Action parameters for context.
|
|
378
|
-
* @param functionName Action function name parameter.
|
|
379
|
-
* @param dataProvider Optional data provider. If not provided data provider from either the action editor or view container will be used.
|
|
380
|
-
* @param previousActionInstance Optional previous action instance to link in next instance.
|
|
381
|
-
*/
|
|
382
|
-
prepareContextForEditor(instance, parameters, functionName, dataProvider, previousActionInstance) {
|
|
383
|
-
if (instance.action.type !== ActionTypeEnum.Editor) {
|
|
384
|
-
throw new CommonsInternalError(`Cannot create editor context for action ${instance.action.actionNameLong} of type ${instance.action.type}.`);
|
|
385
|
-
}
|
|
386
|
-
const editorAction = instance.action;
|
|
387
|
-
const ctxDataProvider = actionExecutionSelectDataProvider(editorAction, dataProvider, this.viewContainer);
|
|
388
|
-
const ctx = new ActionContext(this.injector, instance, parameters, functionName, (this.dataProviderExecutor.getDataProviderService(this.injector, ctxDataProvider.dataProvider) ?? undefined), ctxDataProvider.dataProvider, this.viewContainer ?? undefined);
|
|
389
|
-
ctx.dataProviderSource = ctxDataProvider.source;
|
|
390
|
-
ctx.previousActionInstance = previousActionInstance;
|
|
391
|
-
instance.newContext(ctx);
|
|
392
|
-
return ctx;
|
|
393
|
-
}
|
|
394
|
-
/**
|
|
395
|
-
* Runs action's main run function by creating new action context for action instance.
|
|
396
|
-
*
|
|
397
|
-
* @param action Action descriptor.
|
|
398
|
-
* @param parameters Action parameters for context run.
|
|
399
|
-
* @param instance Optional existing action instance (if non provided, new will be created).
|
|
400
|
-
* @param previousActionInstance Optional previous action instance to link in next instance.
|
|
401
|
-
*
|
|
402
|
-
* @returns Action context for run function.
|
|
403
|
-
*/
|
|
404
|
-
prepareContext(action, parameters, instance, previousActionInstance) {
|
|
405
|
-
instance = this.getOrCreateInstance(instance, action, parameters, ActionInstanceStateEnum.ActivationEnd);
|
|
406
|
-
const ctxDataProvider = actionExecutionSelectDataProvider(action, undefined, this.viewContainer);
|
|
407
|
-
const ctx = new ActionContext(this.injector, instance, parameters, 'run', (this.dataProviderExecutor.getDataProviderService(this.injector, ctxDataProvider.dataProvider) ?? undefined), ctxDataProvider.dataProvider, this.viewContainer ?? undefined);
|
|
408
|
-
ctx.dataProviderSource = ctxDataProvider.source;
|
|
409
|
-
ctx.previousActionInstance = previousActionInstance;
|
|
410
|
-
instance.newContext(ctx);
|
|
411
|
-
return ctx;
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Activates action (in case of dialog, dialog will be opened).
|
|
415
|
-
*
|
|
416
|
-
* @param action Action descriptor.
|
|
417
|
-
* @param parameters Action parameters for activation of action instance.
|
|
418
|
-
* @param instance Optional existing action instance (if non provided, new will be created).
|
|
419
|
-
* @param previousActionInstance Optional previous action instance to link in next instance.
|
|
420
|
-
* @param runContext Marks if context should be run.
|
|
421
|
-
*
|
|
422
|
-
* @returns Action instance - if non provided in parameters, the newly created will be returned.
|
|
423
|
-
*/
|
|
424
|
-
activateAction(action, parameters, instance, previousActionInstance, runContext = false) {
|
|
425
|
-
instance = this.getOrCreateInstance(instance, action, parameters, ActionInstanceStateEnum.ActivationStart);
|
|
426
|
-
instance.state = ActionInstanceStateEnum.ActivationStart;
|
|
427
|
-
instance.activationParameters = parameters;
|
|
428
|
-
// start activation instance
|
|
429
|
-
if (action.type === ActionTypeEnum.Editor) {
|
|
430
|
-
let dialogComponent = this.defaultEditorDialogComponent;
|
|
431
|
-
const dialogClassNames = ['mng-dialog'];
|
|
432
|
-
const dialogConfig = {
|
|
433
|
-
duplicate: true
|
|
434
|
-
};
|
|
435
|
-
if (action instanceof ActionEditorDescriptorInst) {
|
|
436
|
-
dialogClassNames.push(action.dialogClassName ?? 'mng-action-editor-dialog');
|
|
437
|
-
switch (action.dialogSize) {
|
|
438
|
-
case StyleSizeEnum.ExtraSmall:
|
|
439
|
-
dialogClassNames.push('mng-dialog-xs');
|
|
440
|
-
break;
|
|
441
|
-
case StyleSizeEnum.Small:
|
|
442
|
-
dialogClassNames.push('mng-dialog-sm');
|
|
443
|
-
break;
|
|
444
|
-
case StyleSizeEnum.Large:
|
|
445
|
-
dialogClassNames.push('mng-dialog-lg');
|
|
446
|
-
break;
|
|
447
|
-
case StyleSizeEnum.ExtraLarge:
|
|
448
|
-
dialogClassNames.push('mng-dialog-xl');
|
|
449
|
-
break;
|
|
450
|
-
case StyleSizeEnum.Normal:
|
|
451
|
-
default:
|
|
452
|
-
break;
|
|
453
|
-
}
|
|
454
|
-
if (action.editorComponent) {
|
|
455
|
-
dialogComponent = action.editorComponent;
|
|
456
|
-
}
|
|
457
|
-
dialogConfig.data = {
|
|
458
|
-
action: {
|
|
459
|
-
descriptor: action,
|
|
460
|
-
instance: instance,
|
|
461
|
-
previousInstance: previousActionInstance
|
|
462
|
-
},
|
|
463
|
-
injector: this.injector
|
|
464
|
-
};
|
|
465
|
-
}
|
|
466
|
-
dialogConfig.styleClass = dialogClassNames.join(' ');
|
|
467
|
-
if (action.activationTrigger === ActionActivationTriggerEnum.OnRoute) {
|
|
468
|
-
dialogConfig.closable = false;
|
|
469
|
-
dialogConfig.closeOnEscape = false;
|
|
470
|
-
}
|
|
471
|
-
const dialogRef = this.dialogService.open(dialogComponent, dialogConfig);
|
|
472
|
-
dialogRef.onClose.pipe(take(1)).subscribe(() => {
|
|
473
|
-
// to close dialog on 'X' click or esc button
|
|
474
|
-
this.finishAction(instance);
|
|
475
|
-
});
|
|
476
|
-
instance.activationDialogRef = dialogRef;
|
|
477
|
-
return instance;
|
|
478
|
-
}
|
|
479
|
-
else {
|
|
480
|
-
// directly execute action
|
|
481
|
-
instance.state = ActionInstanceStateEnum.ActivationEnd;
|
|
482
|
-
const context = this.prepareContext(action, parameters, instance, previousActionInstance);
|
|
483
|
-
if (runContext) {
|
|
484
|
-
this.run(context);
|
|
485
|
-
}
|
|
486
|
-
return context.instance;
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
/**
|
|
490
|
-
* To be called when action editor is initialized to correctly activate action.
|
|
491
|
-
* @param action Action descriptor.
|
|
492
|
-
* @param instance Action instance (if available).
|
|
493
|
-
* @param componentRef Optional action editor component reference.
|
|
494
|
-
*/
|
|
495
|
-
onActionEditorInit(action, instance, componentRef) {
|
|
496
|
-
if (action.type !== ActionTypeEnum.Editor) {
|
|
497
|
-
throw new Error(`Action ${action.actionName} is not of type editor, cannot be activated through "onActionEditorOnInit"`);
|
|
498
|
-
}
|
|
499
|
-
if (instance && action.activationTrigger === ActionActivationTriggerEnum.OnRoute) {
|
|
500
|
-
const triggeredInstance = this.viewContainer?.routeTriggeredActionInstance();
|
|
501
|
-
if (triggeredInstance && triggeredInstance.instanceLongName !== instance.instanceLongName) {
|
|
502
|
-
this.logger.debug(`WARNING: Found triggered parameters view container instance ${triggeredInstance.instanceLongName} and it does not match instance ${instance.instanceLongName} retrieved on editor init.`);
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
instance = this.getOrCreateInstance(instance, action, undefined, ActionInstanceStateEnum.ActivationStart);
|
|
506
|
-
instance.state = ActionInstanceStateEnum.ActivationEnd;
|
|
507
|
-
instance.activationEditorComponentRef = componentRef;
|
|
508
|
-
return instance;
|
|
509
|
-
}
|
|
510
|
-
/**
|
|
511
|
-
* To be called when action editor cmp is being destroyed to correctly finish action.
|
|
512
|
-
* @param instance Action instance.
|
|
513
|
-
*/
|
|
514
|
-
onActionDestroy(instance) {
|
|
515
|
-
if (!instance) {
|
|
516
|
-
return;
|
|
517
|
-
}
|
|
518
|
-
instance = this.getOrCreateInstance(instance);
|
|
519
|
-
if (instance.action.activationTrigger !== ActionActivationTriggerEnum.OnClick) {
|
|
520
|
-
return;
|
|
521
|
-
}
|
|
522
|
-
this.finishAction(instance, true);
|
|
523
|
-
}
|
|
524
|
-
/**
|
|
525
|
-
* To be called when action editor cmp is being destroyed to correctly finish action.
|
|
526
|
-
* @param instance Action instance.
|
|
527
|
-
*/
|
|
528
|
-
onActionEditorDestroy(instance) {
|
|
529
|
-
if (!instance) {
|
|
530
|
-
return;
|
|
531
|
-
}
|
|
532
|
-
instance = this.getOrCreateInstance(instance);
|
|
533
|
-
if (instance.action.type !== ActionTypeEnum.Editor) {
|
|
534
|
-
throw new Error(`Action instance ${instance.instanceLongName} is not of type editor, cannot be deactivated through "onActionEditorOnDestroy"`);
|
|
535
|
-
}
|
|
536
|
-
if (instance.action.activationTrigger !== ActionActivationTriggerEnum.OnRoute) {
|
|
537
|
-
this.finishAction(instance, true);
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
/**
|
|
541
|
-
* To be called when action route cmp is being destroyed to correctly finish action.
|
|
542
|
-
* @param instance Action instance.
|
|
543
|
-
*/
|
|
544
|
-
onActionRouteDestroy(instance) {
|
|
545
|
-
if (!instance) {
|
|
546
|
-
return;
|
|
547
|
-
}
|
|
548
|
-
instance = this.getOrCreateInstance(instance);
|
|
549
|
-
if (instance.action.activationTrigger !== ActionActivationTriggerEnum.OnRoute) {
|
|
550
|
-
throw new Error(`Action instance ${instance.instanceLongName} is not triggered on route, cannot be deactivated through "onActionRouteOnDestroy"`);
|
|
551
|
-
}
|
|
552
|
-
this.finishAction(instance, true);
|
|
553
|
-
}
|
|
554
|
-
/**
|
|
555
|
-
* Deactivates action by choosing final state, closing dialog and completing all subjects in instance and contexts.
|
|
556
|
-
*
|
|
557
|
-
* @param instance Action instance.
|
|
558
|
-
* @param onDestroy Marks if finish is called on component destroy lifecycle hook.
|
|
559
|
-
*/
|
|
560
|
-
finishAction(instance, onDestroy = false) {
|
|
561
|
-
instance = this.getOrCreateInstance(instance);
|
|
562
|
-
if (instance.state >= ActionInstanceStateEnum.FinishSuccessFinal) {
|
|
563
|
-
this.logger.trace(`ActionInstance ${instance.instanceLongName} already finished`);
|
|
564
|
-
return;
|
|
565
|
-
}
|
|
566
|
-
let finalState;
|
|
567
|
-
if (typeof instance.result !== 'undefined') {
|
|
568
|
-
finalState = ActionInstanceStateEnum.FinishSuccessFinal;
|
|
569
|
-
}
|
|
570
|
-
else if (typeof instance.error !== 'undefined') {
|
|
571
|
-
finalState = ActionInstanceStateEnum.FinishErrorFinal;
|
|
572
|
-
}
|
|
573
|
-
else if (onDestroy) {
|
|
574
|
-
finalState = ActionInstanceStateEnum.FinishComponentDestroyFinal;
|
|
575
|
-
}
|
|
576
|
-
else {
|
|
577
|
-
finalState = ActionInstanceStateEnum.FinishDismissedFinal;
|
|
578
|
-
}
|
|
579
|
-
if (instance.action.type === ActionTypeEnum.Editor) {
|
|
580
|
-
const hasDialog = typeof instance.activationDialogRef !== 'undefined';
|
|
581
|
-
const resubmitEnabled = instance.action.resubmitEnabled;
|
|
582
|
-
if (finalState === ActionInstanceStateEnum.FinishSuccessFinal) {
|
|
583
|
-
if ((hasDialog && resubmitEnabled === true) || (!hasDialog && resubmitEnabled !== false)) {
|
|
584
|
-
finalState = ActionInstanceStateEnum.FinishSuccessReactivateFinal;
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
if (hasDialog && finalState !== ActionInstanceStateEnum.FinishSuccessReactivateFinal) {
|
|
588
|
-
// if state is finish and not called from dialog listener, close the dialog first which will retrigger this function, then finish it
|
|
589
|
-
instance.activationDialogRef.close(instance.result);
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
// unset instance in view container
|
|
593
|
-
if (this.viewContainer) {
|
|
594
|
-
this.viewContainer.routeTriggeredActionInstance.set(undefined);
|
|
595
|
-
}
|
|
596
|
-
// set final state on instance
|
|
597
|
-
instance.state = finalState;
|
|
598
|
-
if (finalState === ActionInstanceStateEnum.FinishSuccessReactivateFinal) {
|
|
599
|
-
// prepare reactivation instance
|
|
600
|
-
const newInstanceStatus = instance.action.resubmitRefetch
|
|
601
|
-
? ActionInstanceStateEnum.ActivationEnd
|
|
602
|
-
: ActionInstanceStateEnum.FetchEnd;
|
|
603
|
-
// must skip initialization from view container, because it would only get old instance.
|
|
604
|
-
// we need new instance before we can set new one on the view container.
|
|
605
|
-
const newInstance = this.getOrCreateInstance(undefined, instance.action, undefined, newInstanceStatus, true);
|
|
606
|
-
newInstance.reactivationPreviousInstance = instance;
|
|
607
|
-
// copy some additional settings
|
|
608
|
-
newInstance.activationDialogRef = instance.activationDialogRef;
|
|
609
|
-
newInstance.triggerParameters = instance.triggerParameters;
|
|
610
|
-
newInstance.activationParameters = instance.activationParameters;
|
|
611
|
-
if (this.viewContainer) {
|
|
612
|
-
this.viewContainer.routeTriggeredActionInstance.set(newInstance);
|
|
613
|
-
}
|
|
614
|
-
instance.reactivationInstance = newInstance;
|
|
615
|
-
}
|
|
616
|
-
// finish related actions
|
|
617
|
-
if (instance.nextActionInstance && instance.nextActionInstance instanceof ActionInstance) {
|
|
618
|
-
this.logger.debug(`Finishing instance ${instance.instanceLongName} related next action instance: ${instance.nextActionInstance.instanceLongName}`);
|
|
619
|
-
this.finishAction(instance.nextActionInstance, onDestroy);
|
|
620
|
-
}
|
|
621
|
-
if (instance.errorActionInstance && instance.errorActionInstance instanceof ActionInstance) {
|
|
622
|
-
this.logger.debug(`Finishing instance ${instance.instanceLongName} related error action instance: ${instance.errorActionInstance.instanceLongName}`);
|
|
623
|
-
this.finishAction(instance.errorActionInstance, onDestroy);
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
/**
|
|
627
|
-
* Triggers action with parameters.
|
|
628
|
-
*
|
|
629
|
-
* @param action Action descriptor.
|
|
630
|
-
* @param parameters Action parameters for action execution to construct new route.
|
|
631
|
-
* @param runContext Marks if context should be run.
|
|
632
|
-
*
|
|
633
|
-
* @returns Action instance - if non provided in parameters, the newly created will be returned.
|
|
634
|
-
*/
|
|
635
|
-
triggerAction(action, parameters, runContext = false) {
|
|
636
|
-
const instance = this.getOrCreateInstance(undefined, action, parameters);
|
|
637
|
-
instance.triggerParameters = parameters;
|
|
638
|
-
instance.state = ActionInstanceStateEnum.TriggerStart;
|
|
639
|
-
if (action.activationTrigger === ActionActivationTriggerEnum.OnRoute) {
|
|
640
|
-
const baseUrl = this.router.url.split('?')[0];
|
|
641
|
-
const parsedUrl = this.router.parseUrl(this.router.url);
|
|
642
|
-
let actionUrl = action.routeUrl ?? '';
|
|
643
|
-
if (actionUrl.startsWith('/')) {
|
|
644
|
-
actionUrl = actionUrl.substring(1);
|
|
645
|
-
}
|
|
646
|
-
const actionUrlSegments = this.parametrize.transform(actionUrl, parameters.itemId, parameters.item, parameters.actionData).split('/');
|
|
647
|
-
// set instance in view container
|
|
648
|
-
if (this.viewContainer) {
|
|
649
|
-
this.viewContainer.routeTriggeredActionInstance.set(instance);
|
|
650
|
-
}
|
|
651
|
-
from(this.router.navigate([baseUrl, ...actionUrlSegments], { relativeTo: parameters.route, queryParams: parsedUrl.queryParams }))
|
|
652
|
-
.pipe(take(1))
|
|
653
|
-
.subscribe(() => (instance.state = ActionInstanceStateEnum.TriggerEnd));
|
|
654
|
-
return instance;
|
|
655
|
-
}
|
|
656
|
-
else {
|
|
657
|
-
instance.state = ActionInstanceStateEnum.TriggerEnd;
|
|
658
|
-
this.activateAction(action, parameters, instance);
|
|
659
|
-
if (runContext) {
|
|
660
|
-
const context = instance.context;
|
|
661
|
-
if (context) {
|
|
662
|
-
this.run(context);
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
return instance;
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
/**
|
|
669
|
-
* Deactivates on route triggered action by trying to reroute back to location where action was triggered.
|
|
670
|
-
* @param instance Action instance.
|
|
671
|
-
*/
|
|
672
|
-
finishActionRouteUntrigger(instance) {
|
|
673
|
-
if (instance.action.activationTrigger !== ActionActivationTriggerEnum.OnRoute) {
|
|
674
|
-
return;
|
|
675
|
-
}
|
|
676
|
-
instance = this.getOrCreateInstance(instance);
|
|
677
|
-
instance.state = ActionInstanceStateEnum.FinishRouteUntriggerStart;
|
|
678
|
-
let url = this.navigationService.getCurrentLocationFromHistory() ?? this.navigationService.getCurrentLocationFromUrl();
|
|
679
|
-
if (!url) {
|
|
680
|
-
this.navigationService.back();
|
|
681
|
-
}
|
|
682
|
-
else {
|
|
683
|
-
if (url.startsWith('/')) {
|
|
684
|
-
url = url.substring(1);
|
|
685
|
-
}
|
|
686
|
-
const splitUrlQueryParam = url.split('?');
|
|
687
|
-
const urlPathSegments = splitUrlQueryParam[0].split('#')[0].split('/');
|
|
688
|
-
const queryParam = splitUrlQueryParam[1]?.split('#')[0];
|
|
689
|
-
let actionUrl = instance.action?.routeUrl ?? '';
|
|
690
|
-
if (actionUrl.startsWith('/')) {
|
|
691
|
-
actionUrl = actionUrl.substring(1);
|
|
692
|
-
}
|
|
693
|
-
const actionUrlSegments = actionUrl.split('/');
|
|
694
|
-
let redirectUrl = '/' + urlPathSegments.slice(0, urlPathSegments.length - actionUrlSegments.length).join('/');
|
|
695
|
-
if (typeof queryParam !== 'undefined') {
|
|
696
|
-
redirectUrl = `${redirectUrl}?${queryParam}`;
|
|
697
|
-
}
|
|
698
|
-
// No URL replaces, probably ok, to allow going back
|
|
699
|
-
from(this.router.navigateByUrl(redirectUrl))
|
|
700
|
-
.pipe(first(), timeout(1000))
|
|
701
|
-
.subscribe({
|
|
702
|
-
next: () => (instance.state = ActionInstanceStateEnum.FinishRouteUntriggerEndFinal),
|
|
703
|
-
error: () => (instance.state = ActionInstanceStateEnum.FinishRouteUntriggerTimeoutFinal)
|
|
704
|
-
});
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
/**
|
|
708
|
-
* Transform error of any type to error by using error mapper that could be provided by final project.
|
|
709
|
-
* @param error error of any type.
|
|
710
|
-
* @param context Action context.
|
|
711
|
-
*
|
|
712
|
-
* @returns mapped ICommonsError.
|
|
713
|
-
*/
|
|
714
|
-
toActionError(error, context) {
|
|
715
|
-
let commonsError;
|
|
716
|
-
if (context) {
|
|
717
|
-
const options = {
|
|
718
|
-
cause: error,
|
|
719
|
-
location: this.router.url
|
|
720
|
-
};
|
|
721
|
-
if (error instanceof HttpErrorResponse) {
|
|
722
|
-
options.httpError = error;
|
|
723
|
-
}
|
|
724
|
-
commonsError = new CommonsActionError(error?.message ?? 'Unknown error', context.contextLongName);
|
|
725
|
-
}
|
|
726
|
-
else if (error instanceof HttpErrorResponse) {
|
|
727
|
-
// should not really happen (should always be wrapped in MngActionError), just in case
|
|
728
|
-
commonsError = new CommonsHttpError(`Http Error occurred in action`, error, {
|
|
729
|
-
location: this.router.url
|
|
730
|
-
});
|
|
731
|
-
}
|
|
732
|
-
else {
|
|
733
|
-
// not from action, so unknown source of error
|
|
734
|
-
commonsError = new CommonsInternalError(error?.message ?? 'Unknown error', {
|
|
735
|
-
name: error?.name ?? 'UnknownError',
|
|
736
|
-
location: this.router.url,
|
|
737
|
-
cause: error
|
|
738
|
-
});
|
|
739
|
-
}
|
|
740
|
-
// just trace it, allow user to set if this is error or not
|
|
741
|
-
this.logger.trace(commonsError);
|
|
742
|
-
return this.errorMapper.toCommonsError(error, commonsError);
|
|
743
|
-
}
|
|
744
|
-
/**
|
|
745
|
-
* Creates or gets existing action instance.
|
|
746
|
-
* @param instance Action instance.
|
|
747
|
-
* @param action Action descriptor.
|
|
748
|
-
* @param parameters Action parameters.
|
|
749
|
-
* @param instanceInitialStatus Action instance initial status.
|
|
750
|
-
* @param skipInitializationFromViewContainer If initialization of instance from view container should be skipped.
|
|
751
|
-
* @private
|
|
752
|
-
*/
|
|
753
|
-
getOrCreateInstance(instance, action, parameters, instanceInitialStatus, skipInitializationFromViewContainer = false) {
|
|
754
|
-
if (!skipInitializationFromViewContainer && !instance && action?.activationTrigger === ActionActivationTriggerEnum.OnRoute && parameters) {
|
|
755
|
-
instance = this.viewContainer?.routeTriggeredActionInstance();
|
|
756
|
-
}
|
|
757
|
-
if (!instance) {
|
|
758
|
-
if (!action) {
|
|
759
|
-
throw new CommonsInternalError('Action descriptor is not provided, instance cannot be created.', { name: 'ActionExecutorServiceError' });
|
|
760
|
-
}
|
|
761
|
-
// create new instance if non provided
|
|
762
|
-
instance = new ActionInstance(action, instanceInitialStatus);
|
|
763
|
-
}
|
|
764
|
-
if (this.config?.actions?.debugInstances && !this.instances.some(i => i.instanceLongName === instance.instanceLongName)) {
|
|
765
|
-
if (this.instances.length >= this.instancesBufferMax) {
|
|
766
|
-
const lastInstance = this.instances.shift();
|
|
767
|
-
if (lastInstance.state < ActionInstanceStateEnum.FinishSuccessFinal) {
|
|
768
|
-
this.logger.debug(`ERROR: Not all instances are finished! Finishing instance ${instance.instanceLongName} with dismissal.`);
|
|
769
|
-
lastInstance.forceFinish();
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
this.instances.push(instance);
|
|
773
|
-
}
|
|
774
|
-
return instance;
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWV4ZWN1dG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90YWJsZXZpZXcvc3JjL2FjdGlvbi9zZXJ2aWNlcy9hY3Rpb24tZXhlY3V0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUMsUUFBUSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUMsTUFBTSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFFaEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFlLG1CQUFtQixFQUFFLGNBQWMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM5RSxPQUFPLEVBQUMsYUFBYSxFQUFzQixNQUFNLHVCQUF1QixDQUFDO0FBQ3pFLE9BQU8sRUFBYSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFFSCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGNBQWMsRUFHZCxhQUFhLEVBRWIsZUFBZSxFQUNmLGNBQWMsRUFDZCxhQUFhLEVBQ2IsYUFBYSxFQUNiLFlBQVksRUFDZixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBQyxrQkFBa0IsRUFBeUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRixPQUFPLEVBQ0gsMkJBQTJCLEVBRzNCLDBCQUEwQixFQUMxQix1QkFBdUIsRUFFdkIsY0FBYyxFQUNkLGtCQUFrQixFQUVsQixvQkFBb0IsRUFHcEIsZ0NBQWdD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RTVDLElBQUksWUFBYSxDQUFDLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw2REFBNkQsUUFBUSxDQUFDLGdCQUFnQixrQkFBa0IsQ0FBQyxDQUFDO29CQUM1SCxZQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2hDLENBQUM7WUFDTCxDQUFDO1lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0luamVjdG9yLCBpbmplY3R9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtSb3V0ZXIsIFVybFRyZWV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0NvbmZpcm1hdGlvbiwgQ29uZmlybWF0aW9uU2VydmljZSwgTWVzc2FnZVNlcnZpY2V9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7RGlhbG9nU2VydmljZSwgRHluYW1pY0RpYWxvZ0NvbmZpZ30gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgZnJvbSwgbWVyZ2VNYXAsIG9mLCBzd2l0Y2hNYXAsIHRha2UsIHRpbWVvdXR9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBmaWx0ZXIsIGZpcnN0LCBtYXAsIHN0YXJ0V2l0aH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICAgIEFjdGlvblBhcmFtZXRlcnMsXG4gICAgQ29tbW9uc0h0dHBFcnJvcixcbiAgICBDb21tb25zSW50ZXJuYWxFcnJvcixcbiAgICBDb21tb25zU2VydmljZSxcbiAgICBJQ29tbW9uc0Vycm9yLFxuICAgIElEYXRhUHJvdmlkZXIsXG4gICAgTG9nZ2VyU2VydmljZSxcbiAgICBOdWxsYWJsZSxcbiAgICBQYXJhbWV0cml6ZVBpcGUsXG4gICAgU3R5bGVMZXZlbEVudW0sXG4gICAgU3R5bGVTaXplRW51bSxcbiAgICBlc2NhcGVIdG1sQW55LFxuICAgIHRvT2JzZXJ2YWJsZVxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtCdXR0b25TdHlsZUJ1aWxkZXIsIElCdXR0b25TdHlsZURlc2NyaXB0b3J9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZm9ybS9hcGknO1xuaW1wb3J0IHtcbiAgICBBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0sXG4gICAgQWN0aW9uQ29udGV4dFZhbGlkYXRpb24sXG4gICAgQWN0aW9uRGVzY3JpcHRvckluc3QsXG4gICAgQWN0aW9uRWRpdG9yRGVzY3JpcHRvckluc3QsXG4gICAgQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0sXG4gICAgQWN0aW9uUnVuRm5UeXBlLFxuICAgIEFjdGlvblR5cGVFbnVtLFxuICAgIENvbW1vbnNBY3Rpb25FcnJvcixcbiAgICBDb21tb25zQWN0aW9uRXJyb3JPcHRpb25zLFxuICAgIERhdGFQcm92aWRlckV4ZWN1dG9yLFxuICAgIElBY3Rpb25FZGl0b3JDb21wb25lbnQsXG4gICAgSUFjdGlvbkluc3RhbmNlLFxuICAgIFRhYmxldmlld0FjdGlvbkRlZmF1bHRDYXRlZ29yaWVzXG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvdGFibGV2aWV3L2FwaSc7XG5cbmltcG9ydCB7Q09NTU9OU19UQUJMRVZJRVdfRkVBVFVSRV9DT05GSUdfSVR9IGZyb20gJy4uLy4uL3RhYmxldmlldy9zZXJ2aWNlcy90YWJsZXZpZXctZmVhdHVyZS1jb25maWcudG9rZW4nO1xuaW1wb3J0IHthY3Rpb25FeGVjdXRpb25TZWxlY3REYXRhUHJvdmlkZXJ9IGZyb20gJy4uL2hlbHBlcnMvYWN0aW9uLWV4ZWN1dGlvbic7XG5pbXBvcnQge2dldEkxOG5Gb3JBY3Rpb259IGZyb20gJy4uL2hlbHBlcnMvaTE4bic7XG5pbXBvcnQge2FjdGlvbk5vdGlmaWNhdGlvbkVycm9yLCBhY3Rpb25Ob3RpZmljYXRpb25TdWNjZXNzfSBmcm9tICcuLi9oZWxwZXJzL25vdGlmaWNhdGlvbic7XG5pbXBvcnQge0FjdGlvbkVkaXRvckRpYWxvZ0RhdGF9IGZyb20gJy4uL21vZGVscy9hY3Rpb24tZWRpdG9yLWRpYWxvZy1kYXRhLm1vZGVsJztcbmltcG9ydCB7QWN0aW9uQ29udGV4dCwgQWN0aW9uRGF0YVByb3ZpZGVyU291cmNlfSBmcm9tICcuLi9tb2RlbHMvZXhlY3V0aW9uL2FjdGlvbi1jb250ZXh0Lm1vZGVsJztcbmltcG9ydCB7QWN0aW9uSW5zdGFuY2V9IGZyb20gJy4uL21vZGVscy9leGVjdXRpb24vYWN0aW9uLWluc3RhbmNlLm1vZGVsJztcbmltcG9ydCB7QWN0aW9uRXJyb3JNYXBwZXJTZXJ2aWNlfSBmcm9tICcuL2FjdGlvbi1lcnJvci1tYXBwZXIuc2VydmljZSc7XG5pbXBvcnQge05hdmlnYXRpb25TZXJ2aWNlfSBmcm9tICcuL25hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQge0FDVElPTl9FRElUT1JfQ09NUE9ORU5UX0lUfSBmcm9tICcuL3Rva2Vucy9hY3Rpb24tZWRpdG9yLnRva2VuJztcbmltcG9ydCB7Vmlld0NvbnRhaW5lcn0gZnJvbSAnLi92aWV3LWNvbnRhaW5lci5zZXJ2aWNlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFjdGlvbkV4ZWN1dG9yU2VydmljZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ0FjdGlvbkV4ZWN1dG9yU2VydmljZSc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2UgPSBpbmplY3QoRGlhbG9nU2VydmljZSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29tbW9ucyA9IGluamVjdChDb21tb25zU2VydmljZSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGFQcm92aWRlckV4ZWN1dG9yID0gaW5qZWN0KERhdGFQcm92aWRlckV4ZWN1dG9yKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmF2aWdhdGlvblNlcnZpY2UgPSBpbmplY3QoTmF2aWdhdGlvblNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBlcnJvck1hcHBlciA9IGluamVjdChBY3Rpb25FcnJvck1hcHBlclNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjb25maWcgPSBpbmplY3QoQ09NTU9OU19UQUJMRVZJRVdfRkVBVFVSRV9DT05GSUdfSVQsIHtvcHRpb25hbDogdHJ1ZX0pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0RWRpdG9yRGlhbG9nQ29tcG9uZW50ID0gaW5qZWN0KEFDVElPTl9FRElUT1JfQ09NUE9ORU5UX0lUKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2UgPSBpbmplY3QoTWVzc2FnZVNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjb25maXJtYXRpb25TZXJ2aWNlID0gaW5qZWN0KENvbmZpcm1hdGlvblNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB2aWV3Q29udGFpbmVyID0gaW5qZWN0KFZpZXdDb250YWluZXIsIHtvcHRpb25hbDogdHJ1ZX0pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwYXJhbWV0cml6ZSA9IG5ldyBQYXJhbWV0cml6ZVBpcGUoKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBpbnN0YW5jZXNCdWZmZXJNYXggPSAxMDA7XG4gICAgcHJvdGVjdGVkIGxvZ2dlciA9IGluamVjdChMb2dnZXJTZXJ2aWNlKS5jcmVhdGUoQWN0aW9uRXhlY3V0b3JTZXJ2aWNlLmNsYXNzTmFtZSk7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGluc3RhbmNlcygpOiBBY3Rpb25JbnN0YW5jZTxhbnksIGFueT5bXTtcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGFjdGlvbiBjb250ZXh0IGZvciB1c2FnZSBpbiB2YWxpZGF0aW9uLlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGRhdGFQcm92aWRlciBEYXRhIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBwcmVwYXJlQWN0aW9uQ29udGV4dFZhbGlkYXRpb248SXRlbSwgUGFyYW1ldGVyc0l0ZW0sIFNlcnZpY2U+KFxuICAgICAgICBhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3JJbnN0PEl0ZW0+LFxuICAgICAgICBwYXJhbWV0ZXJzOiBBY3Rpb25QYXJhbWV0ZXJzPFBhcmFtZXRlcnNJdGVtPixcbiAgICAgICAgZGF0YVByb3ZpZGVyPzogSURhdGFQcm92aWRlcjxJdGVtLCBTZXJ2aWNlPlxuICAgICk6IEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPiB7XG4gICAgICAgIGNvbnN0IGN0eERhdGFQcm92aWRlciA9IGFjdGlvbkV4ZWN1dGlvblNlbGVjdERhdGFQcm92aWRlcihhY3Rpb24sIGRhdGFQcm92aWRlciwgdGhpcy52aWV3Q29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuIDxBY3Rpb25Db250ZXh0VmFsaWRhdGlvbjxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZT4+e1xuICAgICAgICAgICAgZGVzY3JpcHRvcjogYWN0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyxcbiAgICAgICAgICAgIHNlcnZpY2VJbnN0YW5jZTogdGhpcy5kYXRhUHJvdmlkZXJFeGVjdXRvci5nZXREYXRhUHJvdmlkZXJTZXJ2aWNlKHRoaXMuaW5qZWN0b3IsIGN0eERhdGFQcm92aWRlci5kYXRhUHJvdmlkZXIpID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRhdGFQcm92aWRlcjogY3R4RGF0YVByb3ZpZGVyLmRhdGFQcm92aWRlclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgYWN0aW9uIGNvbnRleHQgYnkgc3VibWl0dGluZyBleGVjdXRpb24gcmVzdWx0cy9lcnJvcnMgdG8gY29udGV4dCwgd2F0Y2hpbmcgb3ZlciBpbnN0YW5jZSByZXN1bHRzL2Vycm9ycywgZGlzcGxheWluZyBub3RpZmljYXRpb25zLFxuICAgICAqIHJ1bm5pbmcgbmV4dC9lcnJvciBhY3Rpb24gYW5kIHRyaWdnZXJpbmcgZGlzbWlzcyBvZiBhY3Rpb24uIENvbmZpcm1hdGlvbiBpcyBhbHNvIHByb2Nlc3NlZCBoZXJlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGN0eCBBY3Rpb24gY29udGV4dCB0byBydW4uXG4gICAgICovXG4gICAgcHVibGljIHJ1bjxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZSA9IHVuZGVmaW5lZD4oY3R4OiBBY3Rpb25Db250ZXh0PEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPikge1xuICAgICAgICBjb25zdCBpc01haW5SdW5GbiA9IGN0eC5mdW5jdGlvbk5hbWUgPT09ICdzdWJtaXQnIHx8IGN0eC5mdW5jdGlvbk5hbWUgPT09ICdydW4nO1xuXG4gICAgICAgIGlmIChpc01haW5SdW5GbiAmJiBjdHguaW5zdGFuY2UuYWN0aW9uLnJ1bkNvbmZpcm1hdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBvbmx5IGRpcmVjdCBhY3Rpb24gY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBydW4gY29uZmlybWF0aW9uXG4gICAgICAgICAgICAvLyBpZiBlZGl0b3IsIHRoZW4gcnVuIGNvbmZpcm1hdGlvbiBpcyBtYXBwZWQgdG8gc3VibWl0IGFjdGlvbiBhbmQgaWdub3JlZCBhcyBlZGl0b3IgcnVuXG4gICAgICAgICAgICBjb25zdCBjb25maXJtYXRpb25EZXNjcmlwdG9yID0gY3R4Lmluc3RhbmNlLmFjdGlvbi5ydW5Db25maXJtYXRpb247XG5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdHgucGFyYW1ldGVycy5pdGVtO1xuICAgICAgICAgICAgY29uc3QgZXNjYXBlZEl0ZW0gPSBlc2NhcGVIdG1sQW55KGl0ZW0pO1xuXG4gICAgICAgICAgICBjb25zdCBnZXRUcmFuc2xhdGlvbk9yVW5kZWZpbmVkID0gKGxhYmVsOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBkZWZMYWJlbDogc3RyaW5nLCBmYWxsYmFjazogc3RyaW5nLCBlc2NhcGVJdGVtID0gZmFsc2UpID0+XG4gICAgICAgICAgICAgICAgbGFiZWwgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgPyAoZ2V0STE4bkZvckFjdGlvbih0aGlzLnRyYW5zbGF0ZSwgY3R4Lmluc3RhbmNlLmFjdGlvbiwgZGVmTGFiZWwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tS2V5OiBsYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogZXNjYXBlSXRlbSA/IGVzY2FwZWRJdGVtIDogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tLZXk6IGZhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgICAgfSkgPz8gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGdldEJ1dHRvblN0eWxlID0gKHN0eWxlPzogSUJ1dHRvblN0eWxlRGVzY3JpcHRvciwgZGVmPzogSUJ1dHRvblN0eWxlRGVzY3JpcHRvcikgPT5cbiAgICAgICAgICAgICAgICAoc3R5bGUgaW5zdGFuY2VvZiBCdXR0b25TdHlsZUJ1aWxkZXIgPyBzdHlsZSA6IEJ1dHRvblN0eWxlQnVpbGRlci5mcm9tKHsuLi5kZWYsIC4uLnN0eWxlfSA/PyBkZWYpKS5idWlsZCgpO1xuXG4gICAgICAgICAgICBsZXQgY29uZmlybVBhcmFtczogQ29uZmlybWF0aW9uID0ge1xuICAgICAgICAgICAgICAgIGljb246IGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IuaWNvbiAhPT0gbnVsbCA/IChjb25maXJtYXRpb25EZXNjcmlwdG9yLmljb24gPz8gJ3BpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJykgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBnZXRUcmFuc2xhdGlvbk9yVW5kZWZpbmVkKGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IudGl0bGUsICdjb25maXJtLnRpdGxlJywgJ2dlbmVyYWwuY29uZmlybWF0aW9uJyksXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZ2V0VHJhbnNsYXRpb25PclVuZGVmaW5lZChjb25maXJtYXRpb25EZXNjcmlwdG9yLnRpdGxlLCAnY29uZmlybS5tZXNzYWdlJywgJ2dlbmVyYWwuY29uZmlybWF0aW9uJyksXG4gICAgICAgICAgICAgICAgYWNjZXB0VmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhY2NlcHRMYWJlbDogZ2V0VHJhbnNsYXRpb25PclVuZGVmaW5lZChjb25maXJtYXRpb25EZXNjcmlwdG9yLnRpdGxlLCAnY29uZmlybS5hY2NlcHQnLCAnZ2VuZXJhbC55ZXMnKSxcbiAgICAgICAgICAgICAgICBhY2NlcHRJY29uOlxuICAgICAgICAgICAgICAgICAgICBjb25maXJtYXRpb25EZXNjcmlwdG9yLmFjY2VwdEJ1dHRvbj8uaWNvbiAhPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoY29uZmlybWF0aW9uRGVzY3JpcHRvci5hY2NlcHRCdXR0b24/Lmljb24gPz8gY3R4Lmluc3RhbmNlLmFjdGlvbi5idXR0b24/Lmljb24gPz8gJ3BpIHBpLWNoZWNrJylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGFjY2VwdEJ1dHRvblN0eWxlQ2xhc3M6IGdldEJ1dHRvblN0eWxlKGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IuYWNjZXB0QnV0dG9uPy5zdHlsZSwge2xldmVsOiBjdHguaW5zdGFuY2UuYWN0aW9uLmJ1dHRvbj8uc3R5bGU/LmxldmVsfSksXG4gICAgICAgICAgICAgICAgcmVqZWN0VmlzaWJsZTogIShcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybWF0aW9uRGVzY3JpcHRvci5yZWplY3RCdXR0b24gPT09IGZhbHNlIHx8XG4gICAgICAgICAgICAgICAgICAgIChjb25maXJtYXRpb25EZXNjcmlwdG9yLnJlamVjdEJ1dHRvbj8ubGFiZWwgPT09IG51bGwgJiYgY29uZmlybWF0aW9uRGVzY3JpcHRvci5yZWplY3RCdXR0b24/Lmljb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICByZWplY3RMYWJlbDogZ2V0VHJhbnNsYXRpb25PclVuZGVmaW5lZChjb25maXJtYXRpb25EZXNjcmlwdG9yLnRpdGxlLCAnY29uZmlybS5yZWplY3QnLCAnZ2VuZXJhbC5ubycpLFxuICAgICAgICAgICAgICAgIHJlamVjdEljb246XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IucmVqZWN0QnV0dG9uICE9PSBmYWxzZSAmJiBjb25maXJtYXRpb25EZXNjcmlwdG9yLnJlamVjdEJ1dHRvbj8uaWNvbiAhPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoY29uZmlybWF0aW9uRGVzY3JpcHRvci5yZWplY3RCdXR0b24/Lmljb24gPz8gJ3BpIHBpLXRpbWVzJylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlamVjdEJ1dHRvblN0eWxlQ2xhc3M6XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IucmVqZWN0QnV0dG9uICE9PSBmYWxzZSA/IGdldEJ1dHRvblN0eWxlKGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IucmVqZWN0QnV0dG9uPy5zdHlsZSwge2xldmVsOiBTdHlsZUxldmVsRW51bS5TZWNvbmRhcnl9KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjbG9zZU9uRXNjYXBlOiBjb25maXJtYXRpb25EZXNjcmlwdG9yLmNsb3NlT25Fc2NhcGUsXG4gICAgICAgICAgICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1bkNvbmZpcm1hdGlvbkVuZEFjY2VwdDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5XaXRob3V0Q29uZmlybWF0aW9uKGN0eCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZWplY3Q6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLnN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uUnVuQ29uZmlybWF0aW9uRW5kUmVqZWN0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3R4Lmluc3RhbmNlLmFjdGlvbi50eXBlICE9PSBBY3Rpb25UeXBlRW51bS5FZGl0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBlZGl0b3IsIHRoZSBpdCBjYW4gYmUgY2xvc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaEFjdGlvbihjdHguaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpcm1hdGlvbkRlc2NyaXB0b3IuY29uZmlnTWFwRm4pIHtcbiAgICAgICAgICAgICAgICBjb25maXJtUGFyYW1zID0gY29uZmlybWF0aW9uRGVzY3JpcHRvci5jb25maWdNYXBGbihjdHgsIGNvbmZpcm1QYXJhbXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdHguY29uZmlybWF0aW9uID0gY29uZmlybVBhcmFtcztcbiAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1bkNvbmZpcm1hdGlvblN0YXJ0O1xuXG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybShjb25maXJtUGFyYW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucnVuV2l0aG91dENvbmZpcm1hdGlvbihjdHgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBhY3Rpb24gY29udGV4dCBieSBzdWJtaXR0aW5nIGV4ZWN1dGlvbiByZXN1bHRzL2Vycm9ycyB0byBjb250ZXh0LCB3YXRjaGluZyBvdmVyIGluc3RhbmNlIHJlc3VsdHMvZXJyb3JzLCBkaXNwbGF5aW5nIG5vdGlmaWNhdGlvbnMsXG4gICAgICogcnVubmluZyBuZXh0L2Vycm9yIGFjdGlvbiBhbmQgdHJpZ2dlcmluZyBkaXNtaXNzIG9mIGFjdGlvbi4gQ29uZmlybWF0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY3R4IEFjdGlvbiBjb250ZXh0IHRvIHJ1bi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFjdGlvbiBjb250ZXh0IGZvciBzdWJtaXQgKD1ydW4pIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgcnVuV2l0aG91dENvbmZpcm1hdGlvbjxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZSA9IHVuZGVmaW5lZD4oY3R4OiBBY3Rpb25Db250ZXh0PEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPik6IE9ic2VydmFibGU8SXRlbSB8IG51bGwgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgaXNNYWluUnVuRm4gPSBjdHguZnVuY3Rpb25OYW1lID09PSAnc3VibWl0JyB8fCBjdHguZnVuY3Rpb25OYW1lID09PSAncnVuJztcbiAgICAgICAgY29uc3QgaXNFcnJvckNyaXRpY2FsUnVuRm4gPSBjdHguZnVuY3Rpb25OYW1lID09PSAncnVuJztcbiAgICAgICAgbGV0IGFjdGlvbkVkaXRvcjogQWN0aW9uRWRpdG9yRGVzY3JpcHRvckluc3Q8SXRlbSwgU2VydmljZSwgYW55LCBhbnksIGFueSwgYW55PjtcblxuICAgICAgICBsZXQgZm5PYnM6IEFjdGlvblJ1bkZuVHlwZTxJdGVtLCBTZXJ2aWNlLCBQYXJhbWV0ZXJzSXRlbT47XG4gICAgICAgIHN3aXRjaCAoY3R4LmZ1bmN0aW9uTmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnc3VibWl0JzpcbiAgICAgICAgICAgICAgICBhY3Rpb25FZGl0b3IgPSBjdHguaW5zdGFuY2UuYWN0aW9uIGFzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3JJbnN0PEl0ZW0sIFNlcnZpY2UsIGFueSwgYW55LCBhbnksIGFueT47XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb25FZGl0b3Iuc3VibWl0RnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkVkaXRvci50YWJsZXZpZXdDYXRlZ29yeSA9PT0gVGFibGV2aWV3QWN0aW9uRGVmYXVsdENhdGVnb3JpZXMuQUREKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbk9icyA9IHRoaXMuZGF0YVByb3ZpZGVyRXhlY3V0b3IucnVuQ3JlYXRlT3JGYWlsLmJpbmQodGhpcy5kYXRhUHJvdmlkZXJFeGVjdXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uRWRpdG9yLnRhYmxldmlld0NhdGVnb3J5ID09PSBUYWJsZXZpZXdBY3Rpb25EZWZhdWx0Q2F0ZWdvcmllcy5FRElUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbk9icyA9IHRoaXMuZGF0YVByb3ZpZGVyRXhlY3V0b3IucnVuVXBkYXRlT3JGYWlsLmJpbmQodGhpcy5kYXRhUHJvdmlkZXJFeGVjdXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R4LmRhdGFQcm92aWRlclNvdXJjZSA+IEFjdGlvbkRhdGFQcm92aWRlclNvdXJjZS5WaWV3Q29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkYXRhIHByb3ZpZGVyIGlzIGdpdmVuIGRpcmVjdGx5IG9uIGRlc2NyaXB0b3Igb3IgYXMgaW5wdXQsIHVzZSBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdFN1Ym1pdCA9IG9mKChjdHgucGFyYW1ldGVycz8uaXRlbSBhcyBOdWxsYWJsZTxJdGVtPikgPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuT2JzID0gY3R4ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3R4LnBhcmFtZXRlcnMuaXRlbUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFQcm92aWRlckV4ZWN1dG9yLnJ1blVwZGF0ZShjdHgsIGRlZmF1bHRTdWJtaXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFQcm92aWRlckV4ZWN1dG9yLnJ1bkNyZWF0ZShjdHgsIGRlZmF1bHRTdWJtaXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbk9icyA9IGN0eCA9PiAoY3R4LnBhcmFtZXRlcnM/Lml0ZW0gYXMgTnVsbGFibGU8SXRlbT4pID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZuT2JzID0gYWN0aW9uRWRpdG9yLnN1Ym1pdEZ1bmN0aW9uIGFzIHVua25vd24gYXMgQWN0aW9uUnVuRm5UeXBlPEl0ZW0sIFNlcnZpY2UsIFBhcmFtZXRlcnNJdGVtPjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmZXRjaCc6XG4gICAgICAgICAgICAgICAgYWN0aW9uRWRpdG9yID0gY3R4Lmluc3RhbmNlLmFjdGlvbiBhcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9ySW5zdDxJdGVtLCBTZXJ2aWNlLCBhbnksIGFueSwgYW55LCBhbnk+O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uRWRpdG9yLmZldGNoRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkVkaXRvci50YWJsZXZpZXdDYXRlZ29yeSA9PT0gVGFibGV2aWV3QWN0aW9uRGVmYXVsdENhdGVnb3JpZXMuRURJVCB8fCBhY3Rpb25FZGl0b3IudGFibGV2aWV3Q2F0ZWdvcnkgPT09IFRhYmxldmlld0FjdGlvbkRlZmF1bHRDYXRlZ29yaWVzLkRFVEFJTFMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRWRpdCA9IGFjdGlvbkVkaXRvci50YWJsZXZpZXdDYXRlZ29yeSA9PT0gVGFibGV2aWV3QWN0aW9uRGVmYXVsdENhdGVnb3JpZXMuRURJVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuT2JzID0gY3R4ID0+IHRoaXMuZGF0YVByb3ZpZGVyRXhlY3V0b3IucnVuRmV0Y2hPckZhaWwoY3R4LCBpc0VkaXQgPyAndXBkYXRlJyA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R4LmRhdGFQcm92aWRlclNvdXJjZSA+IEFjdGlvbkRhdGFQcm92aWRlclNvdXJjZS5WaWV3Q29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0RmV0Y2ggPSBvZigoY3R4LnBhcmFtZXRlcnM/Lml0ZW0gYXMgTnVsbGFibGU8SXRlbT4pID8/IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbk9icyA9IGN0eCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC5wYXJhbWV0ZXJzLml0ZW1JZCB8fCB0eXBlb2YgY3R4LnBhcmFtZXRlcnMuaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVByb3ZpZGVyRXhlY3V0b3IucnVuRmV0Y2goY3R4LCB1bmRlZmluZWQsIGRlZmF1bHRGZXRjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0RmV0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm5PYnMgPSBjdHggPT4gKGN0eC5wYXJhbWV0ZXJzPy5pdGVtIGFzIE51bGxhYmxlPEl0ZW0+KSA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbk9icyA9IGFjdGlvbkVkaXRvci5mZXRjaEZ1bmN0aW9uIGFzIHVua25vd24gYXMgQWN0aW9uUnVuRm5UeXBlPEl0ZW0sIFNlcnZpY2UsIFBhcmFtZXRlcnNJdGVtPjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdydW4nOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAoIWN0eC5pbnN0YW5jZS5hY3Rpb24uaGFzUnVuRnVuY3Rpb24gJiYgY3R4Lmluc3RhbmNlLmFjdGlvbi50YWJsZXZpZXdDYXRlZ29yeSA9PT0gVGFibGV2aWV3QWN0aW9uRGVmYXVsdENhdGVnb3JpZXMuREVMRVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIGZuT2JzID0gdGhpcy5kYXRhUHJvdmlkZXJFeGVjdXRvci5ydW5EZWxldGVPckZhaWwuYmluZCh0aGlzLmRhdGFQcm92aWRlckV4ZWN1dG9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbk9icyA9IGN0eC5pbnN0YW5jZS5hY3Rpb24ucnVuRnVuY3Rpb24gYXMgdW5rbm93biBhcyBBY3Rpb25SdW5GblR5cGU8SXRlbSwgU2VydmljZSwgUGFyYW1ldGVyc0l0ZW0+O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldE9icyA9IG9mKHZvaWQgMCkucGlwZShcbiAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc01haW5SdW5Gbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBtYWluIHJ1biBmdW5jdGlvbiwgYWxzbyBzZXQgbG9hZGluZyB0byB0cnVlXG4gICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1blN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuaXNSdW5Mb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZldGNoU3RhcnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGNvbnRleHQgZXhlY3V0aW9uIHRvIG1hcmsgZXhlY3V0aW9uIGxvYWRpbmdcbiAgICAgICAgICAgICAgICBjdHguZXhlY3V0aW9uU3RhcnQoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0b09ic2VydmFibGUoZm5PYnMoY3R4KSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1lcmdlTWFwKHJ1blJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIG5vdGlmaWNhdGlvbnNcbiAgICAgICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25JdGVtID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jdHgucGFyYW1ldGVycz8uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LnBhcmFtZXRlcnM/LmZvcm1JdGVtLFxuICAgICAgICAgICAgICAgICAgICAuLi5jdHgucGFyYW1ldGVycz8uc3VibWl0UmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAuLi5ydW5SZXN1bHRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChpc01haW5SdW5GbiAmJiAoY3R4Lmluc3RhbmNlLmFjdGlvbi5ydW5Ob3RpZmljYXRpb25PblN1Y2Nlc3MgPz8gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4Lm5vdGlmaWNhdGlvbiA9IGFjdGlvbk5vdGlmaWNhdGlvblN1Y2Nlc3ModGhpcy50cmFuc2xhdGUsIHRoaXMubWVzc2FnZVNlcnZpY2UsIGN0eC5pbnN0YW5jZS5hY3Rpb24sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogY3R4LmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IG5vdGlmaWNhdGlvbkl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4odHlwZW9mIGN0eC5pbnN0YW5jZS5hY3Rpb24ucnVuTm90aWZpY2F0aW9uT25TdWNjZXNzID09PSAnb2JqZWN0JyA/IGN0eC5pbnN0YW5jZS5hY3Rpb24ucnVuTm90aWZpY2F0aW9uT25TdWNjZXNzIDoge30pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzTWFpblJ1bkZuICYmIChhY3Rpb25FZGl0b3IuZmV0Y2hOb3RpZmljYXRpb25PblN1Y2Nlc3MgPz8gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5ub3RpZmljYXRpb24gPSBhY3Rpb25Ob3RpZmljYXRpb25TdWNjZXNzKHRoaXMudHJhbnNsYXRlLCB0aGlzLm1lc3NhZ2VTZXJ2aWNlLCBhY3Rpb25FZGl0b3IsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogY3R4LmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IG5vdGlmaWNhdGlvbkl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4odHlwZW9mIGFjdGlvbkVkaXRvci5mZXRjaE5vdGlmaWNhdGlvbk9uU3VjY2VzcyA9PT0gJ29iamVjdCcgPyBhY3Rpb25FZGl0b3IuZmV0Y2hOb3RpZmljYXRpb25PblN1Y2Nlc3MgOiB7fSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gc2V0IG5leHQgc3RhdGUgZGVwZW5kaW5nIG9uIHJ1blxuICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IGlzTWFpblJ1bkZuID8gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uUnVuRW5kIDogQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmV0Y2hFbmQ7XG4gICAgICAgICAgICAgICAgLy8gc2V0IGV4ZWN1dGlvbiByZXN1bHRcbiAgICAgICAgICAgICAgICBjdHguZXhlY3V0aW9uTmV4dChydW5SZXN1bHQsIGlzTWFpblJ1bkZuKTtcblxuICAgICAgICAgICAgICAgIGlmIChpc01haW5SdW5Gbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaW5zdGFuY2UgZmluYWwgcmVzdWx0IG9uIG1haW4gcnVuIGV4ZWN1dGlvblxuICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UucmVzdWx0ID0gcnVuUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuaXNSdW5Mb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgcG9zc2libGUgYWZ0ZXIgcnVuIGFjdGlvblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3R4Lmluc3RhbmNlLmFjdGlvbi5hZnRlclJ1bkFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayBuZXcgc3RhdGUgZm9yIG5leHQgYWN0aW9uIHN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZnRlclJ1bkFjdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGN0eC5pbnN0YW5jZS5hY3Rpb24uYWZ0ZXJSdW5BY3Rpb24gPT09ICdmdW5jdGlvbicgPyBjdHguaW5zdGFuY2UuYWN0aW9uLmFmdGVyUnVuQWN0aW9uKGN0eCkgOiBjdHguaW5zdGFuY2UuYWN0aW9uLmFmdGVyUnVuQWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dEFjdGlvbkluc3RhbmNlID0gdGhpcy5hY3RpdmF0ZUFjdGlvbjxhbnksIEl0ZW0sIGFueT4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJSdW5BY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFjdGlvblBhcmFtZXRlcnM8SXRlbT4+e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IGN0eC5wYXJhbWV0ZXJzLml0ZW1JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogcnVuUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25EYXRhOiBjdHgucGFyYW1ldGVycy5hY3Rpb25EYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZTogY3R4LnBhcmFtZXRlcnMucm91dGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvbXBvbmVudDogY3R4LnBhcmFtZXRlcnMuc291cmNlQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlIGFzIEFjdGlvbkluc3RhbmNlPHVua25vd24sIHVua25vd24+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UubmV4dEFjdGlvbkluc3RhbmNlID0gbmV4dEFjdGlvbkluc3RhbmNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5OZXh0QWN0aW9uU3RhcnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaCBjdXJyZW50IGFjdGlvbiB3aGVuIG5leHQgYWN0aW9uIGZpbmlzaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEFjdGlvbkluc3RhbmNlLnN0YXRlJC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0V2l0aChuZXh0QWN0aW9uSW5zdGFuY2Uuc3RhdGUpLCAvLyBwcm92aWRlIGZpcnN0IHN0YXRlIGNhdXNlIGl0IG1pZ2h0IGJlIGZpbmlzaGVkIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc3RhdGUgPT4gc3RhdGUgPj0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoU3VjY2Vzc0ZpbmFsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLk5leHRBY3Rpb25FbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBydW5SZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gb2YocnVuUmVzdWx0KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKHJ1blJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTWFpblJ1bkZuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlYWN0aXZhdGUgYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoQWN0aW9uKGN0eC5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBydW5SZXN1bHQ7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0cmFuc2Zvcm0gZXJyb3IgdG8gYWN0aW9uIGVycm9yXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uRXJyb3IgPSB0aGlzLnRvQWN0aW9uRXJyb3IoZXJyLCBjdHgpO1xuXG4gICAgICAgICAgICAgICAgLy8gc2V0IGluc3RhbmNlIHN0YXRlIHRvIGVycm9yXG4gICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLnN0YXRlID0gaXNNYWluUnVuRm4gPyBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5SdW5FcnJvciA6IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZldGNoRXJyb3I7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBleGVjdXRpb24gZXJyb3Igb24gY29udGV4dFxuICAgICAgICAgICAgICAgIGN0eC5leGVjdXRpb25FcnJvcihhY3Rpb25FcnJvcik7XG5cbiAgICAgICAgICAgICAgICBsZXQgZXJyb3JPYnMgPSBvZih2b2lkIDApO1xuICAgICAgICAgICAgICAgIGlmIChpc01haW5SdW5Gbikge1xuICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5pc1J1bkxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdHguaW5zdGFuY2UuYWN0aW9uLnJ1bk5vdGlmaWNhdGlvbk9uRXJyb3IgPz8gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRXJyb3Iubm90aWZpY2F0aW9uID0gYWN0aW9uTm90aWZpY2F0aW9uRXJyb3IodGhpcy50cmFuc2xhdGUsIHRoaXMubWVzc2FnZVNlcnZpY2UsIGN0eC5pbnN0YW5jZS5hY3Rpb24sIGFjdGlvbkVycm9yLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGN0eC5mdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogY3R4LnBhcmFtZXRlcnMuaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4odHlwZW9mIGN0eC5pbnN0YW5jZS5hY3Rpb24ucnVuTm90aWZpY2F0aW9uT25FcnJvciA9PT0gJ29iamVjdCcgPyBjdHguaW5zdGFuY2UuYWN0aW9uLnJ1bk5vdGlmaWNhdGlvbk9uRXJyb3IgOiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRXJyb3Iubm90aWZpY2F0aW9uRW1pdFNvdXJjZSA9IEFjdGlvbkV4ZWN1dG9yU2VydmljZS5jbGFzc05hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHgubm90aWZpY2F0aW9uID0gYWN0aW9uRXJyb3Iubm90aWZpY2F0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHBvc3NpYmxlIGVycm9yIGFjdGlvbiBpZiBydW5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWFpblJ1bkZuICYmIGN0eC5pbnN0YW5jZS5hY3Rpb24ub25SdW5FcnJvckFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25SdW5FcnJvckFjdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGN0eC5pbnN0YW5jZS5hY3Rpb24ub25SdW5FcnJvckFjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IGN0eC5pbnN0YW5jZS5hY3Rpb24ub25SdW5FcnJvckFjdGlvbihjdHgpIDogY3R4Lmluc3RhbmNlLmFjdGlvbi5vblJ1bkVycm9yQWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IHN0YXJ0IHdpdGggdHJpZ2dlciwgYmVjYXVzZSByb3V0aW5nIG1pZ2h0IGJlIHByb2JsZW1hdGljIChsb3VzaW5nIHByZXZpb3VzIHJlc3VsdHMgZXRjLilcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQWN0aW9uSW5zdGFuY2UgPSB0aGlzLmFjdGl2YXRlQWN0aW9uPEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblJ1bkVycm9yQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBY3Rpb25QYXJhbWV0ZXJzPFBhcmFtZXRlcnNJdGVtPj57XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZDogY3R4LnBhcmFtZXRlcnMuaXRlbUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBjdHgucGFyYW1ldGVycy5pdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25EYXRhOiBjdHgucGFyYW1ldGVycy5hY3Rpb25EYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZTogY3R4LnBhcmFtZXRlcnMucm91dGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvbXBvbmVudDogY3R4LnBhcmFtZXRlcnMuc291cmNlQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuZXJyb3JBY3Rpb25JbnN0YW5jZSA9IGVycm9yQWN0aW9uSW5zdGFuY2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5pbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkVycm9yQWN0aW9uU3RhcnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yT2JzID0gZXJyb3JBY3Rpb25JbnN0YW5jZS5zdGF0ZSQucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFdpdGgoZXJyb3JBY3Rpb25JbnN0YW5jZS5zdGF0ZSksIC8vIHByb3ZpZGUgZmlyc3Qgc3RhdGUgY2F1c2UgaXQgbWlnaHQgYmUgZmluaXNoZWQgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihzdGF0ZSA9PiBzdGF0ZSA+PSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hTdWNjZXNzRmluYWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lmluc3RhbmNlLnN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRXJyb3JBY3Rpb25FbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbkVkaXRvci5mZXRjaE5vdGlmaWNhdGlvbk9uRXJyb3IgPz8gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHgubm90aWZpY2F0aW9uID0gYWN0aW9uTm90aWZpY2F0aW9uRXJyb3IodGhpcy50cmFuc2xhdGUsIHRoaXMubWVzc2FnZVNlcnZpY2UsIGFjdGlvbkVkaXRvciwgYWN0aW9uRXJyb3IsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBjdHguZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN0eC5wYXJhbWV0ZXJzLml0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4odHlwZW9mIGFjdGlvbkVkaXRvci5mZXRjaE5vdGlmaWNhdGlvbk9uRXJyb3IgPT09ICdvYmplY3QnID8gYWN0aW9uRWRpdG9yLmZldGNoTm90aWZpY2F0aW9uT25FcnJvciA6IHt9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uRXJyb3Iubm90aWZpY2F0aW9uRW1pdFNvdXJjZSA9IEFjdGlvbkV4ZWN1dG9yU2VydmljZS5jbGFzc05hbWU7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5ub3RpZmljYXRpb24gPSBhY3Rpb25FcnJvci5ub3RpZmljYXRpb247XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gbGlzdCBhbmQgbWFwIG9ubHkgdG8gbWFyayBpbnN0YW5jZSBzdGF0ZSBhcyBmaW5pc2hlZCBlcnJvciBzdGF0ZVxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvck9icy5waXBlKFxuICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVhY3RpdmF0ZSBhY3Rpb24gb25seSBpZiBjcml0aWNhbCAoZmV0Y2ggb24gZWRpdG9yIG9yIHJ1biBvbiBidXR0b24gYWN0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Vycm9yQ3JpdGljYWxSdW5Gbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoQWN0aW9uKGN0eC5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRocm93IGVycm9yIHRvIHByb3BhZ2F0ZSBmdXJ0aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBhY3Rpb25FcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBjdHgucnVuU3Vic2NyaXB0aW9uID0gcmV0T2JzLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBBY3Rpb25Db250ZXh0ICR7Y3R4LmNvbnRleHRMb25nTmFtZX0gZXhlY3V0aW9uIG5leHQgZXZlbnRgLCByZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICgoZXJyIGFzIElDb21tb25zRXJyb3IgfCB1bmRlZmluZWQpPy50eXBlICE9PSAnQ29tbW9uc0FjdGlvbkVycm9yJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgTm9uIGFjdGlvbiBlcnJvciBvY2N1cnJlZGAsIGVycik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEFjdGlvbiBjb250ZXh0ICR7Y3R4LmNvbnRleHRMb25nTmFtZX0gZXhlY3V0aW9uIGVycm9yIGV2ZW50YCwgZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXRPYnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgZWRpdG9yIGFjdGlvbidzIGZldGNoIGZ1bmN0aW9uIGJ5IGNyZWF0aW5nIG5ldyBhY3Rpb24gY29udGV4dCBmb3IgYWN0aW9uIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBBY3Rpb24gcGFyYW1ldGVycyBmb3IgY29udGV4dC5cbiAgICAgKiBAcGFyYW0gZGF0YVByb3ZpZGVyIEVkaXRvciBkYXRhIHByb3ZpZGVyIGZvciBjb250ZXh0LlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBPcHRpb25hbCBleGlzdGluZyBhY3Rpb24gaW5zdGFuY2UgKGlmIG5vbiBwcm92aWRlZCwgbmV3IHdpbGwgYmUgY3JlYXRlZCkuXG4gICAgICogQHBhcmFtIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UgT3B0aW9uYWwgcHJldmlvdXMgYWN0aW9uIGluc3RhbmNlIHRvIGxpbmsgaW4gbmV4dCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFjdGlvbiBjb250ZXh0IGZvciBmZXRjaCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlcGFyZUNvbnRleHRGb3JFZGl0b3JGZXRjaDxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZT4oXG4gICAgICAgIGFjdGlvbjogQWN0aW9uRWRpdG9yRGVzY3JpcHRvckluc3Q8SXRlbSwgYW55LCBhbnksIFBhcmFtZXRlcnNJdGVtLCBhbnksIGFueT4sXG4gICAgICAgIHBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcnM8UGFyYW1ldGVyc0l0ZW0+LFxuICAgICAgICBkYXRhUHJvdmlkZXI/OiBJRGF0YVByb3ZpZGVyPEl0ZW0sIFNlcnZpY2U+LFxuICAgICAgICBpbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+LFxuICAgICAgICBwcmV2aW91c0FjdGlvbkluc3RhbmNlPzogSUFjdGlvbkluc3RhbmNlPGFueSwgYW55PlxuICAgICk6IEFjdGlvbkNvbnRleHQ8SXRlbSwgUGFyYW1ldGVyc0l0ZW0sIFNlcnZpY2U+IHtcbiAgICAgICAgaW5zdGFuY2UgPSB0aGlzLmdldE9yQ3JlYXRlSW5zdGFuY2UoaW5zdGFuY2UsIGFjdGlvbiwgcGFyYW1ldGVycywgQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uQWN0aXZhdGlvbkVuZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVDb250ZXh0Rm9yRWRpdG9yKGluc3RhbmNlLCBwYXJhbWV0ZXJzLCAnZmV0Y2gnLCBkYXRhUHJvdmlkZXIsIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgZWRpdG9yIGFjdGlvbidzIHN1Ym1pdCAoPW1haW4gcnVuKSBmdW5jdGlvbiBieSBjcmVhdGluZyBuZXcgYWN0aW9uIGNvbnRleHQgZm9yIGFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMgZm9yIGNvbnRleHQuXG4gICAgICogQHBhcmFtIGRhdGFQcm92aWRlciBFZGl0b3IgZGF0YSBwcm92aWRlciBmb3IgY29udGV4dC5cbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgT3B0aW9uYWwgZXhpc3RpbmcgYWN0aW9uIGluc3RhbmNlIChpZiBub24gcHJvdmlkZWQsIG5ldyB3aWxsIGJlIGNyZWF0ZWQpLlxuICAgICAqIEBwYXJhbSBwcmV2aW91c0FjdGlvbkluc3RhbmNlIE9wdGlvbmFsIHByZXZpb3VzIGFjdGlvbiBpbnN0YW5jZSB0byBsaW5rIGluIG5leHQgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBY3Rpb24gY29udGV4dCBmb3Igc3VibWl0ICg9cnVuKSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlcGFyZUNvbnRleHRGb3JFZGl0b3JTdWJtaXQ8SXRlbSwgUGFyYW1ldGVyc0l0ZW0sIFNlcnZpY2U+KFxuICAgICAgICBhY3Rpb246IEFjdGlvbkVkaXRvckRlc2NyaXB0b3JJbnN0PEl0ZW0sIGFueSwgUGFyYW1ldGVyc0l0ZW0sIGFueSwgYW55LCBhbnk+LFxuICAgICAgICBwYXJhbWV0ZXJzOiBBY3Rpb25QYXJhbWV0ZXJzPFBhcmFtZXRlcnNJdGVtPixcbiAgICAgICAgZGF0YVByb3ZpZGVyPzogSURhdGFQcm92aWRlcjxJdGVtLCBTZXJ2aWNlPixcbiAgICAgICAgaW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTxJdGVtLCBTZXJ2aWNlPixcbiAgICAgICAgcHJldmlvdXNBY3Rpb25JbnN0YW5jZT86IElBY3Rpb25JbnN0YW5jZTxhbnksIGFueT5cbiAgICApOiBBY3Rpb25Db250ZXh0PEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPiB7XG4gICAgICAgIGluc3RhbmNlID0gdGhpcy5nZXRPckNyZWF0ZUluc3RhbmNlKGluc3RhbmNlLCBhY3Rpb24sIHBhcmFtZXRlcnMsIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkFjdGl2YXRpb25FbmQpO1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlQ29udGV4dEZvckVkaXRvcihpbnN0YW5jZSwgcGFyYW1ldGVycywgJ3N1Ym1pdCcsIGRhdGFQcm92aWRlciwgcHJldmlvdXNBY3Rpb25JbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgYWN0aW9uIGV4ZWMgY29udGV4dCBmb3IgYWN0aW9uIG9mIHR5cGUgZWRpdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluc3RhbmNlIEFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBBY3Rpb24gcGFyYW1ldGVycyBmb3IgY29udGV4dC5cbiAgICAgKiBAcGFyYW0gZnVuY3Rpb25OYW1lIEFjdGlvbiBmdW5jdGlvbiBuYW1lIHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0gZGF0YVByb3ZpZGVyIE9wdGlvbmFsIGRhdGEgcHJvdmlkZXIuIElmIG5vdCBwcm92aWRlZCBkYXRhIHByb3ZpZGVyIGZyb20gZWl0aGVyIHRoZSBhY3Rpb24gZWRpdG9yIG9yIHZpZXcgY29udGFpbmVyIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAcGFyYW0gcHJldmlvdXNBY3Rpb25JbnN0YW5jZSBPcHRpb25hbCBwcmV2aW91cyBhY3Rpb24gaW5zdGFuY2UgdG8gbGluayBpbiBuZXh0IGluc3RhbmNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgcHJlcGFyZUNvbnRleHRGb3JFZGl0b3I8SXRlbSwgUGFyYW1ldGVyc0l0ZW0sIFNlcnZpY2U+KFxuICAgICAgICBpbnN0YW5jZTogQWN0aW9uSW5zdGFuY2U8SXRlbSwgU2VydmljZT4sXG4gICAgICAgIHBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcnM8UGFyYW1ldGVyc0l0ZW0+LFxuICAgICAgICBmdW5jdGlvbk5hbWU6ICdzdWJtaXQnIHwgJ2ZldGNoJyxcbiAgICAgICAgZGF0YVByb3ZpZGVyPzogSURhdGFQcm92aWRlcixcbiAgICAgICAgcHJldmlvdXNBY3Rpb25JbnN0YW5jZT86IElBY3Rpb25JbnN0YW5jZTxhbnksIGFueT5cbiAgICApOiBBY3Rpb25Db250ZXh0PEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPiB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5hY3Rpb24udHlwZSAhPT0gQWN0aW9uVHlwZUVudW0uRWRpdG9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYENhbm5vdCBjcmVhdGUgZWRpdG9yIGNvbnRleHQgZm9yIGFjdGlvbiAke2luc3RhbmNlLmFjdGlvbi5hY3Rpb25OYW1lTG9uZ30gb2YgdHlwZSAke2luc3RhbmNlLmFjdGlvbi50eXBlfS5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlZGl0b3JBY3Rpb24gPSBpbnN0YW5jZS5hY3Rpb24gYXMgQWN0aW9uRWRpdG9yRGVzY3JpcHRvckluc3Q8SXRlbSwgU2VydmljZSwgYW55LCBhbnksIGFueSwgYW55PjtcbiAgICAgICAgY29uc3QgY3R4RGF0YVByb3ZpZGVyID0gYWN0aW9uRXhlY3V0aW9uU2VsZWN0RGF0YVByb3ZpZGVyPEl0ZW0sIFNlcnZpY2U+KGVkaXRvckFjdGlvbiwgZGF0YVByb3ZpZGVyLCB0aGlzLnZpZXdDb250YWluZXIpO1xuICAgICAgICBjb25zdCBjdHggPSBuZXcgQWN0aW9uQ29udGV4dDxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZT4oXG4gICAgICAgICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgKHRoaXMuZGF0YVByb3ZpZGVyRXhlY3V0b3IuZ2V0RGF0YVByb3ZpZGVyU2VydmljZSh0aGlzLmluamVjdG9yLCBjdHhEYXRhUHJvdmlkZXIuZGF0YVByb3ZpZGVyKSA/PyB1bmRlZmluZWQpIGFzIFNlcnZpY2UsXG4gICAgICAgICAgICBjdHhEYXRhUHJvdmlkZXIuZGF0YVByb3ZpZGVyLFxuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyID8/IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgICBjdHguZGF0YVByb3ZpZGVyU291cmNlID0gY3R4RGF0YVByb3ZpZGVyLnNvdXJjZTtcbiAgICAgICAgY3R4LnByZXZpb3VzQWN0aW9uSW5zdGFuY2UgPSBwcmV2aW91c0FjdGlvbkluc3RhbmNlO1xuICAgICAgICBpbnN0YW5jZS5uZXdDb250ZXh0KGN0eCk7XG4gICAgICAgIHJldHVybiBjdHg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBhY3Rpb24ncyBtYWluIHJ1biBmdW5jdGlvbiBieSBjcmVhdGluZyBuZXcgYWN0aW9uIGNvbnRleHQgZm9yIGFjdGlvbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMgZm9yIGNvbnRleHQgcnVuLlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBPcHRpb25hbCBleGlzdGluZyBhY3Rpb24gaW5zdGFuY2UgKGlmIG5vbiBwcm92aWRlZCwgbmV3IHdpbGwgYmUgY3JlYXRlZCkuXG4gICAgICogQHBhcmFtIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UgT3B0aW9uYWwgcHJldmlvdXMgYWN0aW9uIGluc3RhbmNlIHRvIGxpbmsgaW4gbmV4dCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFjdGlvbiBjb250ZXh0IGZvciBydW4gZnVuY3Rpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcmVwYXJlQ29udGV4dDxJdGVtLCBQYXJhbWV0ZXJzSXRlbSwgU2VydmljZT4oXG4gICAgICAgIGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvckluc3Q8SXRlbSwgU2VydmljZSwgUGFyYW1ldGVyc0l0ZW0sIGFueSwgYW55PixcbiAgICAgICAgcGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyczxQYXJhbWV0ZXJzSXRlbT4sXG4gICAgICAgIGluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8SXRlbSwgU2VydmljZT4sXG4gICAgICAgIHByZXZpb3VzQWN0aW9uSW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTxhbnksIGFueT5cbiAgICApOiBBY3Rpb25Db250ZXh0PEl0ZW0sIFBhcmFtZXRlcnNJdGVtLCBTZXJ2aWNlPiB7XG4gICAgICAgIGluc3RhbmNlID0gdGhpcy5nZXRPckNyZWF0ZUluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+KGluc3RhbmNlLCBhY3Rpb24sIHBhcmFtZXRlcnMsIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkFjdGl2YXRpb25FbmQpO1xuXG4gICAgICAgIGNvbnN0IGN0eERhdGFQcm92aWRlciA9IGFjdGlvbkV4ZWN1dGlvblNlbGVjdERhdGFQcm92aWRlcjxJdGVtLCBTZXJ2aWNlPihhY3Rpb24sIHVuZGVmaW5lZCwgdGhpcy52aWV3Q29udGFpbmVyKTtcbiAgICAgICAgY29uc3QgY3R4ID0gbmV3IEFjdGlvbkNvbnRleHQ8SXRlbSwgUGFyYW1ldGVyc0l0ZW0sIFNlcnZpY2U+KFxuICAgICAgICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgICdydW4nLFxuICAgICAgICAgICAgKHRoaXMuZGF0YVByb3ZpZGVyRXhlY3V0b3IuZ2V0RGF0YVByb3ZpZGVyU2VydmljZSh0aGlzLmluamVjdG9yLCBjdHhEYXRhUHJvdmlkZXIuZGF0YVByb3ZpZGVyKSA/PyB1bmRlZmluZWQpIGFzIFNlcnZpY2UsXG4gICAgICAgICAgICBjdHhEYXRhUHJvdmlkZXIuZGF0YVByb3ZpZGVyLFxuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyID8/IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgICBjdHguZGF0YVByb3ZpZGVyU291cmNlID0gY3R4RGF0YVByb3ZpZGVyLnNvdXJjZTtcbiAgICAgICAgY3R4LnByZXZpb3VzQWN0aW9uSW5zdGFuY2UgPSBwcmV2aW91c0FjdGlvbkluc3RhbmNlO1xuICAgICAgICBpbnN0YW5jZS5uZXdDb250ZXh0KGN0eCk7XG5cbiAgICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBY3RpdmF0ZXMgYWN0aW9uIChpbiBjYXNlIG9mIGRpYWxvZywgZGlhbG9nIHdpbGwgYmUgb3BlbmVkKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMgZm9yIGFjdGl2YXRpb24gb2YgYWN0aW9uIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBPcHRpb25hbCBleGlzdGluZyBhY3Rpb24gaW5zdGFuY2UgKGlmIG5vbiBwcm92aWRlZCwgbmV3IHdpbGwgYmUgY3JlYXRlZCkuXG4gICAgICogQHBhcmFtIHByZXZpb3VzQWN0aW9uSW5zdGFuY2UgT3B0aW9uYWwgcHJldmlvdXMgYWN0aW9uIGluc3RhbmNlIHRvIGxpbmsgaW4gbmV4dCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gcnVuQ29udGV4dCBNYXJrcyBpZiBjb250ZXh0IHNob3VsZCBiZSBydW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBY3Rpb24gaW5zdGFuY2UgLSBpZiBub24gcHJvdmlkZWQgaW4gcGFyYW1ldGVycywgdGhlIG5ld2x5IGNyZWF0ZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWN0aXZhdGVBY3Rpb248SXRlbSwgUGFyYW1ldGVyc0l0ZW0sIFNlcnZpY2UgPSB1bmRlZmluZWQ+KFxuICAgICAgICBhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3JJbnN0PEl0ZW0sIGFueSwgUGFyYW1ldGVyc0l0ZW0sIGFueSwgYW55PixcbiAgICAgICAgcGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyczxQYXJhbWV0ZXJzSXRlbT4sXG4gICAgICAgIGluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8SXRlbSwgU2VydmljZT4sXG4gICAgICAgIHByZXZpb3VzQWN0aW9uSW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTxhbnksIGFueT4sXG4gICAgICAgIHJ1bkNvbnRleHQgPSBmYWxzZVxuICAgICk6IEFjdGlvbkluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+IHtcbiAgICAgICAgaW5zdGFuY2UgPSB0aGlzLmdldE9yQ3JlYXRlSW5zdGFuY2U8SXRlbSwgU2VydmljZT4oaW5zdGFuY2UsIGFjdGlvbiwgcGFyYW1ldGVycywgQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uQWN0aXZhdGlvblN0YXJ0KTtcbiAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5BY3RpdmF0aW9uU3RhcnQ7XG4gICAgICAgIGluc3RhbmNlLmFjdGl2YXRpb25QYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgLy8gc3RhcnQgYWN0aXZhdGlvbiBpbnN0YW5jZVxuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVFbnVtLkVkaXRvcikge1xuICAgICAgICAgICAgbGV0IGRpYWxvZ0NvbXBvbmVudCA9IHRoaXMuZGVmYXVsdEVkaXRvckRpYWxvZ0NvbXBvbmVudDtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ0NsYXNzTmFtZXMgPSBbJ21uZy1kaWFsb2cnXTtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ0NvbmZpZzogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGU6IHRydWVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChhY3Rpb24gaW5zdGFuY2VvZiBBY3Rpb25FZGl0b3JEZXNjcmlwdG9ySW5zdCkge1xuICAgICAgICAgICAgICAgIGRpYWxvZ0NsYXNzTmFtZXMucHVzaChhY3Rpb24uZGlhbG9nQ2xhc3NOYW1lID8/ICdtbmctYWN0aW9uLWVkaXRvci1kaWFsb2cnKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbi5kaWFsb2dTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU3R5bGVTaXplRW51bS5FeHRyYVNtYWxsOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nQ2xhc3NOYW1lcy5wdXNoKCdtbmctZGlhbG9nLXhzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHlsZVNpemVFbnVtLlNtYWxsOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nQ2xhc3NOYW1lcy5wdXNoKCdtbmctZGlhbG9nLXNtJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHlsZVNpemVFbnVtLkxhcmdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nQ2xhc3NOYW1lcy5wdXNoKCdtbmctZGlhbG9nLWxnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHlsZVNpemVFbnVtLkV4dHJhTGFyZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2dDbGFzc05hbWVzLnB1c2goJ21uZy1kaWFsb2cteGwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFN0eWxlU2l6ZUVudW0uTm9ybWFsOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uZWRpdG9yQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0NvbXBvbmVudCA9IGFjdGlvbi5lZGl0b3JDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRpYWxvZ0NvbmZpZy5kYXRhID0gPEFjdGlvbkVkaXRvckRpYWxvZ0RhdGE8SXRlbSwgU2VydmljZT4+e1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3I6IGFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSW5zdGFuY2U6IHByZXZpb3VzQWN0aW9uSW5zdGFuY2VcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3JcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkaWFsb2dDb25maWcuc3R5bGVDbGFzcyA9IGRpYWxvZ0NsYXNzTmFtZXMuam9pbignICcpO1xuXG4gICAgICAgICAgICBpZiAoYWN0aW9uLmFjdGl2YXRpb25UcmlnZ2VyID09PSBBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0uT25Sb3V0ZSkge1xuICAgICAgICAgICAgICAgIGRpYWxvZ0NvbmZpZy5jbG9zYWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGRpYWxvZ0NvbmZpZy5jbG9zZU9uRXNjYXBlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKGRpYWxvZ0NvbXBvbmVudCwgZGlhbG9nQ29uZmlnKTtcbiAgICAgICAgICAgIGRpYWxvZ1JlZi5vbkNsb3NlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0byBjbG9zZSBkaWFsb2cgb24gJ1gnIGNsaWNrIG9yIGVzYyBidXR0b25cbiAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaEFjdGlvbihpbnN0YW5jZSEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnN0YW5jZS5hY3RpdmF0aW9uRGlhbG9nUmVmID0gZGlhbG9nUmVmO1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGlyZWN0bHkgZXhlY3V0ZSBhY3Rpb25cbiAgICAgICAgICAgIGluc3RhbmNlLnN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uQWN0aXZhdGlvbkVuZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnByZXBhcmVDb250ZXh0PEl0ZW0sIGFueSwgU2VydmljZT4oYWN0aW9uLCBwYXJhbWV0ZXJzLCBpbnN0YW5jZSwgcHJldmlvdXNBY3Rpb25JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIGlmIChydW5Db250ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW4oY29udGV4dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0Lmluc3RhbmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG8gYmUgY2FsbGVkIHdoZW4gYWN0aW9uIGVkaXRvciBpcyBpbml0aWFsaXplZCB0byBjb3JyZWN0bHkgYWN0aXZhdGUgYWN0aW9uLlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIGluc3RhbmNlIEFjdGlvbiBpbnN0YW5jZSAoaWYgYXZhaWxhYmxlKS5cbiAgICAgKiBAcGFyYW0gY29tcG9uZW50UmVmIE9wdGlvbmFsIGFjdGlvbiBlZGl0b3IgY29tcG9uZW50IHJlZmVyZW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25BY3Rpb25FZGl0b3JJbml0PFQsIFM+KGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvckluc3Q8VD4sIGluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8VCwgUz4sIGNvbXBvbmVudFJlZj86IElBY3Rpb25FZGl0b3JDb21wb25lbnQpOiBBY3Rpb25JbnN0YW5jZTxULCBTPiB7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSAhPT0gQWN0aW9uVHlwZUVudW0uRWRpdG9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGlvbiAke2FjdGlvbi5hY3Rpb25OYW1lfSBpcyBub3Qgb2YgdHlwZSBlZGl0b3IsIGNhbm5vdCBiZSBhY3RpdmF0ZWQgdGhyb3VnaCBcIm9uQWN0aW9uRWRpdG9yT25Jbml0XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5zdGFuY2UgJiYgYWN0aW9uLmFjdGl2YXRpb25UcmlnZ2VyID09PSBBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0uT25Sb3V0ZSkge1xuICAgICAgICAgICAgY29uc3QgdHJpZ2dlcmVkSW5zdGFuY2UgPSB0aGlzLnZpZXdDb250YWluZXI/LnJvdXRlVHJpZ2dlcmVkQWN0aW9uSW5zdGFuY2UoKTtcbiAgICAgICAgICAgIGlmICh0cmlnZ2VyZWRJbnN0YW5jZSAmJiB0cmlnZ2VyZWRJbnN0YW5jZS5pbnN0YW5jZUxvbmdOYW1lICE9PSBpbnN0YW5jZS5pbnN0YW5jZUxvbmdOYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBXQVJOSU5HOiBGb3VuZCB0cmlnZ2VyZWQgcGFyYW1ldGVycyB2aWV3IGNvbnRhaW5lciBpbnN0YW5jZSAke3RyaWdnZXJlZEluc3RhbmNlLmluc3RhbmNlTG9uZ05hbWV9IGFuZCBpdCBkb2VzIG5vdCBtYXRjaCBpbnN0YW5jZSAke2luc3RhbmNlLmluc3RhbmNlTG9uZ05hbWV9IHJldHJpZXZlZCBvbiBlZGl0b3IgaW5pdC5gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JDcmVhdGVJbnN0YW5jZShpbnN0YW5jZSwgYWN0aW9uLCB1bmRlZmluZWQsIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkFjdGl2YXRpb25TdGFydCk7XG4gICAgICAgIGluc3RhbmNlLnN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uQWN0aXZhdGlvbkVuZDtcbiAgICAgICAgaW5zdGFuY2UuYWN0aXZhdGlvbkVkaXRvckNvbXBvbmVudFJlZiA9IGNvbXBvbmVudFJlZjtcblxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG8gYmUgY2FsbGVkIHdoZW4gYWN0aW9uIGVkaXRvciBjbXAgaXMgYmVpbmcgZGVzdHJveWVkIHRvIGNvcnJlY3RseSBmaW5pc2ggYWN0aW9uLlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBBY3Rpb24gaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIG9uQWN0aW9uRGVzdHJveTxULCBTPihpbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPFQsIFM+KTogdm9pZCB7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JDcmVhdGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIGlmIChpbnN0YW5jZS5hY3Rpb24uYWN0aXZhdGlvblRyaWdnZXIgIT09IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PbkNsaWNrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hBY3Rpb24oaW5zdGFuY2UsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvIGJlIGNhbGxlZCB3aGVuIGFjdGlvbiBlZGl0b3IgY21wIGlzIGJlaW5nIGRlc3Ryb3llZCB0byBjb3JyZWN0bHkgZmluaXNoIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgQWN0aW9uIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkFjdGlvbkVkaXRvckRlc3Ryb3k8VCwgUz4oaW5zdGFuY2U/OiBBY3Rpb25JbnN0YW5jZTxULCBTPik6IHZvaWQge1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UgPSB0aGlzLmdldE9yQ3JlYXRlSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICBpZiAoaW5zdGFuY2UuYWN0aW9uLnR5cGUgIT09IEFjdGlvblR5cGVFbnVtLkVkaXRvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBY3Rpb24gaW5zdGFuY2UgJHtpbnN0YW5jZS5pbnN0YW5jZUxvbmdOYW1lfSBpcyBub3Qgb2YgdHlwZSBlZGl0b3IsIGNhbm5vdCBiZSBkZWFjdGl2YXRlZCB0aHJvdWdoIFwib25BY3Rpb25FZGl0b3JPbkRlc3Ryb3lcImApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnN0YW5jZS5hY3Rpb24uYWN0aXZhdGlvblRyaWdnZXIgIT09IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PblJvdXRlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmlzaEFjdGlvbihpbnN0YW5jZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUbyBiZSBjYWxsZWQgd2hlbiBhY3Rpb24gcm91dGUgY21wIGlzIGJlaW5nIGRlc3Ryb3llZCB0byBjb3JyZWN0bHkgZmluaXNoIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgQWN0aW9uIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkFjdGlvblJvdXRlRGVzdHJveTxULCBTPihpbnN0YW5jZT86IEFjdGlvbkluc3RhbmNlPFQsIFM+KTogdm9pZCB7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JDcmVhdGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIGlmIChpbnN0YW5jZS5hY3Rpb24uYWN0aXZhdGlvblRyaWdnZXIgIT09IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PblJvdXRlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGlvbiBpbnN0YW5jZSAke2luc3RhbmNlLmluc3RhbmNlTG9uZ05hbWV9IGlzIG5vdCB0cmlnZ2VyZWQgb24gcm91dGUsIGNhbm5vdCBiZSBkZWFjdGl2YXRlZCB0aHJvdWdoIFwib25BY3Rpb25Sb3V0ZU9uRGVzdHJveVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hBY3Rpb24oaW5zdGFuY2UsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlYWN0aXZhdGVzIGFjdGlvbiBieSBjaG9vc2luZyBmaW5hbCBzdGF0ZSwgY2xvc2luZyBkaWFsb2cgYW5kIGNvbXBsZXRpbmcgYWxsIHN1YmplY3RzIGluIGluc3RhbmNlIGFuZCBjb250ZXh0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBBY3Rpb24gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG9uRGVzdHJveSBNYXJrcyBpZiBmaW5pc2ggaXMgY2FsbGVkIG9uIGNvbXBvbmVudCBkZXN0cm95IGxpZmVjeWNsZSBob29rLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5pc2hBY3Rpb248SXRlbSwgU2VydmljZSA9IHVuZGVmaW5lZD4oaW5zdGFuY2U6IEFjdGlvbkluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+LCBvbkRlc3Ryb3kgPSBmYWxzZSkge1xuICAgICAgICBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JDcmVhdGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSA+PSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hTdWNjZXNzRmluYWwpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKGBBY3Rpb25JbnN0YW5jZSAke2luc3RhbmNlLmluc3RhbmNlTG9uZ05hbWV9IGFscmVhZHkgZmluaXNoZWRgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmaW5hbFN0YXRlOiBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5yZXN1bHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBmaW5hbFN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoU3VjY2Vzc0ZpbmFsO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5lcnJvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZpbmFsU3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hFcnJvckZpbmFsO1xuICAgICAgICB9IGVsc2UgaWYgKG9uRGVzdHJveSkge1xuICAgICAgICAgICAgZmluYWxTdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaENvbXBvbmVudERlc3Ryb3lGaW5hbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmFsU3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hEaXNtaXNzZWRGaW5hbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnN0YW5jZS5hY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZUVudW0uRWRpdG9yKSB7XG4gICAgICAgICAgICBjb25zdCBoYXNEaWFsb2cgPSB0eXBlb2YgaW5zdGFuY2UuYWN0aXZhdGlvbkRpYWxvZ1JlZiAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICBjb25zdCByZXN1Ym1pdEVuYWJsZWQgPSAoaW5zdGFuY2UuYWN0aW9uIGFzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3JJbnN0PEl0ZW0+KS5yZXN1Ym1pdEVuYWJsZWQ7XG5cbiAgICAgICAgICAgIGlmIChmaW5hbFN0YXRlID09PSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hTdWNjZXNzRmluYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoKGhhc0RpYWxvZyAmJiByZXN1Ym1pdEVuYWJsZWQgPT09IHRydWUpIHx8ICghaGFzRGlhbG9nICYmIHJlc3VibWl0RW5hYmxlZCAhPT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsU3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hTdWNjZXNzUmVhY3RpdmF0ZUZpbmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhhc0RpYWxvZyAmJiBmaW5hbFN0YXRlICE9PSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GaW5pc2hTdWNjZXNzUmVhY3RpdmF0ZUZpbmFsKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgc3RhdGUgaXMgZmluaXNoIGFuZCBub3QgY2FsbGVkIGZyb20gZGlhbG9nIGxpc3RlbmVyLCBjbG9zZSB0aGUgZGlhbG9nIGZpcnN0IHdoaWNoIHdpbGwgcmV0cmlnZ2VyIHRoaXMgZnVuY3Rpb24sIHRoZW4gZmluaXNoIGl0XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuYWN0aXZhdGlvbkRpYWxvZ1JlZiEuY2xvc2UoaW5zdGFuY2UucmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVuc2V0IGluc3RhbmNlIGluIHZpZXcgY29udGFpbmVyXG4gICAgICAgIGlmICh0aGlzLnZpZXdDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5yb3V0ZVRyaWdnZXJlZEFjdGlvbkluc3RhbmNlLnNldCh1bmRlZmluZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0IGZpbmFsIHN0YXRlIG9uIGluc3RhbmNlXG4gICAgICAgIGluc3RhbmNlLnN0YXRlID0gZmluYWxTdGF0ZTtcblxuICAgICAgICBpZiAoZmluYWxTdGF0ZSA9PT0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoU3VjY2Vzc1JlYWN0aXZhdGVGaW5hbCkge1xuICAgICAgICAgICAgLy8gcHJlcGFyZSByZWFjdGl2YXRpb24gaW5zdGFuY2VcbiAgICAgICAgICAgIGNvbnN0IG5ld0luc3RhbmNlU3RhdHVzID0gKGluc3RhbmNlLmFjdGlvbiBhcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9ySW5zdDxJdGVtPikucmVzdWJtaXRSZWZldGNoXG4gICAgICAgICAgICAgICAgPyBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5BY3RpdmF0aW9uRW5kXG4gICAgICAgICAgICAgICAgOiBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5GZXRjaEVuZDtcbiAgICAgICAgICAgIC8vIG11c3Qgc2tpcCBpbml0aWFsaXphdGlvbiBmcm9tIHZpZXcgY29udGFpbmVyLCBiZWNhdXNlIGl0IHdvdWxkIG9ubHkgZ2V0IG9sZCBpbnN0YW5jZS5cbiAgICAgICAgICAgIC8vIHdlIG5lZWQgbmV3IGluc3RhbmNlIGJlZm9yZSB3ZSBjYW4gc2V0IG5ldyBvbmUgb24gdGhlIHZpZXcgY29udGFpbmVyLlxuICAgICAgICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSB0aGlzLmdldE9yQ3JlYXRlSW5zdGFuY2U8SXRlbSwgU2VydmljZT4odW5kZWZpbmVkLCBpbnN0YW5jZS5hY3Rpb24sIHVuZGVmaW5lZCwgbmV3SW5zdGFuY2VTdGF0dXMsIHRydWUpO1xuICAgICAgICAgICAgbmV3SW5zdGFuY2UucmVhY3RpdmF0aW9uUHJldmlvdXNJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgLy8gY29weSBzb21lIGFkZGl0aW9uYWwgc2V0dGluZ3NcbiAgICAgICAgICAgIG5ld0luc3RhbmNlLmFjdGl2YXRpb25EaWFsb2dSZWYgPSBpbnN0YW5jZS5hY3RpdmF0aW9uRGlhbG9nUmVmO1xuICAgICAgICAgICAgbmV3SW5zdGFuY2UudHJpZ2dlclBhcmFtZXRlcnMgPSBpbnN0YW5jZS50cmlnZ2VyUGFyYW1ldGVycztcbiAgICAgICAgICAgIG5ld0luc3RhbmNlLmFjdGl2YXRpb25QYXJhbWV0ZXJzID0gaW5zdGFuY2UuYWN0aXZhdGlvblBhcmFtZXRlcnM7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXIucm91dGVUcmlnZ2VyZWRBY3Rpb25JbnN0YW5jZS5zZXQobmV3SW5zdGFuY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZS5yZWFjdGl2YXRpb25JbnN0YW5jZSA9IG5ld0luc3RhbmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluaXNoIHJlbGF0ZWQgYWN0aW9uc1xuICAgICAgICBpZiAoaW5zdGFuY2UubmV4dEFjdGlvbkluc3RhbmNlICYmIGluc3RhbmNlLm5leHRBY3Rpb25JbnN0YW5jZSBpbnN0YW5jZW9mIEFjdGlvbkluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRmluaXNoaW5nIGluc3RhbmNlICR7aW5zdGFuY2UuaW5zdGFuY2VMb25nTmFtZX0gcmVsYXRlZCBuZXh0IGFjdGlvbiBpbnN0YW5jZTogJHtpbnN0YW5jZS5uZXh0QWN0aW9uSW5zdGFuY2UuaW5zdGFuY2VMb25nTmFtZX1gKTtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoQWN0aW9uKGluc3RhbmNlLm5leHRBY3Rpb25JbnN0YW5jZSwgb25EZXN0cm95KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5zdGFuY2UuZXJyb3JBY3Rpb25JbnN0YW5jZSAmJiBpbnN0YW5jZS5lcnJvckFjdGlvbkluc3RhbmNlIGluc3RhbmNlb2YgQWN0aW9uSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBGaW5pc2hpbmcgaW5zdGFuY2UgJHtpbnN0YW5jZS5pbnN0YW5jZUxvbmdOYW1lfSByZWxhdGVkIGVycm9yIGFjdGlvbiBpbnN0YW5jZTogJHtpbnN0YW5jZS5lcnJvckFjdGlvbkluc3RhbmNlLmluc3RhbmNlTG9uZ05hbWV9YCk7XG4gICAgICAgICAgICB0aGlzLmZpbmlzaEFjdGlvbihpbnN0YW5jZS5lcnJvckFjdGlvbkluc3RhbmNlLCBvbkRlc3Ryb3kpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgYWN0aW9uIHdpdGggcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQWN0aW9uIHBhcmFtZXRlcnMgZm9yIGFjdGlvbiBleGVjdXRpb24gdG8gY29uc3RydWN0IG5ldyByb3V0ZS5cbiAgICAgKiBAcGFyYW0gcnVuQ29udGV4dCBNYXJrcyBpZiBjb250ZXh0IHNob3VsZCBiZSBydW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBY3Rpb24gaW5zdGFuY2UgLSBpZiBub24gcHJvdmlkZWQgaW4gcGFyYW1ldGVycywgdGhlIG5ld2x5IGNyZWF0ZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJpZ2dlckFjdGlvbjxJdGVtLCBTZXJ2aWNlID0gdW5kZWZpbmVkPihhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3JJbnN0PEl0ZW0+LCBwYXJhbWV0ZXJzOiBBY3Rpb25QYXJhbWV0ZXJzPEl0ZW0+LCBydW5Db250ZXh0ID0gZmFsc2UpOiBBY3Rpb25JbnN0YW5jZTxJdGVtLCBTZXJ2aWNlPiB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5nZXRPckNyZWF0ZUluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+KHVuZGVmaW5lZCwgYWN0aW9uLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgaW5zdGFuY2UudHJpZ2dlclBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlRyaWdnZXJTdGFydDtcbiAgICAgICAgaWYgKGFjdGlvbi5hY3RpdmF0aW9uVHJpZ2dlciA9PT0gQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtLk9uUm91dGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJz8nKVswXTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybDogVXJsVHJlZSA9IHRoaXMucm91dGVyLnBhcnNlVXJsKHRoaXMucm91dGVyLnVybCk7XG4gICAgICAgICAgICBsZXQgYWN0aW9uVXJsID0gYWN0aW9uLnJvdXRlVXJsID8/ICcnO1xuICAgICAgICAgICAgaWYgKGFjdGlvblVybC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25VcmwgPSBhY3Rpb25Vcmwuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25VcmxTZWdtZW50cyA9IHRoaXMucGFyYW1ldHJpemUudHJhbnNmb3JtKGFjdGlvblVybCwgcGFyYW1ldGVycy5pdGVtSWQsIHBhcmFtZXRlcnMuaXRlbSwgcGFyYW1ldGVycy5hY3Rpb25EYXRhKS5zcGxpdCgnLycpO1xuXG4gICAgICAgICAgICAvLyBzZXQgaW5zdGFuY2UgaW4gdmlldyBjb250YWluZXJcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXIucm91dGVUcmlnZ2VyZWRBY3Rpb25JbnN0YW5jZS5zZXQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcm9tKHRoaXMucm91dGVyLm5hdmlnYXRlKFtiYXNlVXJsLCAuLi5hY3Rpb25VcmxTZWdtZW50c10sIHtyZWxhdGl2ZVRvOiBwYXJhbWV0ZXJzLnJvdXRlLCBxdWVyeVBhcmFtczogcGFyc2VkVXJsLnF1ZXJ5UGFyYW1zfSkpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IChpbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlRyaWdnZXJFbmQpKTtcblxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5UcmlnZ2VyRW5kO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUFjdGlvbihhY3Rpb24sIHBhcmFtZXRlcnMsIGluc3RhbmNlKTtcblxuICAgICAgICAgICAgaWYgKHJ1bkNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bihjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlYWN0aXZhdGVzIG9uIHJvdXRlIHRyaWdnZXJlZCBhY3Rpb24gYnkgdHJ5aW5nIHRvIHJlcm91dGUgYmFjayB0byBsb2NhdGlvbiB3aGVyZSBhY3Rpb24gd2FzIHRyaWdnZXJlZC5cbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgQWN0aW9uIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5pc2hBY3Rpb25Sb3V0ZVVudHJpZ2dlcjxJdGVtLCBTZXJ2aWNlID0gdW5kZWZpbmVkPihpbnN0YW5jZTogQWN0aW9uSW5zdGFuY2U8SXRlbSwgU2VydmljZT4pIHtcbiAgICAgICAgaWYgKGluc3RhbmNlLmFjdGlvbi5hY3RpdmF0aW9uVHJpZ2dlciAhPT0gQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtLk9uUm91dGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGluc3RhbmNlID0gdGhpcy5nZXRPckNyZWF0ZUluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+KGluc3RhbmNlKTtcblxuICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaFJvdXRlVW50cmlnZ2VyU3RhcnQ7XG5cbiAgICAgICAgbGV0IHVybCA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0Q3VycmVudExvY2F0aW9uRnJvbUhpc3RvcnkoKSA/PyB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRMb2NhdGlvbkZyb21VcmwoKTtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYmFjaygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzcGxpdFVybFF1ZXJ5UGFyYW0gPSB1cmwuc3BsaXQoJz8nKTtcbiAgICAgICAgICAgIGNvbnN0IHVybFBhdGhTZWdtZW50cyA9IHNwbGl0VXJsUXVlcnlQYXJhbVswXS5zcGxpdCgnIycpWzBdLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtID0gc3BsaXRVcmxRdWVyeVBhcmFtWzFdPy5zcGxpdCgnIycpWzBdO1xuXG4gICAgICAgICAgICBsZXQgYWN0aW9uVXJsID0gaW5zdGFuY2UuYWN0aW9uPy5yb3V0ZVVybCA/PyAnJztcbiAgICAgICAgICAgIGlmIChhY3Rpb25Vcmwuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uVXJsID0gYWN0aW9uVXJsLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjdGlvblVybFNlZ21lbnRzID0gYWN0aW9uVXJsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBsZXQgcmVkaXJlY3RVcmwgPSAnLycgKyB1cmxQYXRoU2VnbWVudHMuc2xpY2UoMCwgdXJsUGF0aFNlZ21lbnRzLmxlbmd0aCAtIGFjdGlvblVybFNlZ21lbnRzLmxlbmd0aCkuam9pbignLycpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBxdWVyeVBhcmFtICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJsID0gYCR7cmVkaXJlY3RVcmx9PyR7cXVlcnlQYXJhbX1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBObyBVUkwgcmVwbGFjZXMsIHByb2JhYmx5IG9rLCB0byBhbGxvdyBnb2luZyBiYWNrXG4gICAgICAgICAgICBmcm9tKHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwocmVkaXJlY3RVcmwpKVxuICAgICAgICAgICAgICAgIC5waXBlKGZpcnN0KCksIHRpbWVvdXQoMTAwMCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgICAgIG5leHQ6ICgpID0+IChpbnN0YW5jZS5zdGF0ZSA9IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaFJvdXRlVW50cmlnZ2VyRW5kRmluYWwpLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogKCkgPT4gKGluc3RhbmNlLnN0YXRlID0gQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRmluaXNoUm91dGVVbnRyaWdnZXJUaW1lb3V0RmluYWwpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gZXJyb3Igb2YgYW55IHR5cGUgdG8gZXJyb3IgYnkgdXNpbmcgZXJyb3IgbWFwcGVyIHRoYXQgY291bGQgYmUgcHJvdmlkZWQgYnkgZmluYWwgcHJvamVjdC5cbiAgICAgKiBAcGFyYW0gZXJyb3IgZXJyb3Igb2YgYW55IHR5cGUuXG4gICAgICogQHBhcmFtIGNvbnRleHQgQWN0aW9uIGNvbnRleHQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBtYXBwZWQgSUNvbW1vbnNFcnJvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9BY3Rpb25FcnJvcihlcnJvcj86IGFueSwgY29udGV4dD86IEFjdGlvbkNvbnRleHQ8YW55LCBhbnksIGFueT4pOiBJQ29tbW9uc0Vycm9yIHtcbiAgICAgICAgbGV0IGNvbW1vbnNFcnJvcjogSUNvbW1vbnNFcnJvcjtcbiAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnM6IENvbW1vbnNBY3Rpb25FcnJvck9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiB0aGlzLnJvdXRlci51cmxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuaHR0cEVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbW1vbnNFcnJvciA9IG5ldyBDb21tb25zQWN0aW9uRXJyb3IoZXJyb3I/Lm1lc3NhZ2UgPz8gJ1Vua25vd24gZXJyb3InLCBjb250ZXh0LmNvbnRleHRMb25nTmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCByZWFsbHkgaGFwcGVuIChzaG91bGQgYWx3YXlzIGJlIHdyYXBwZWQgaW4gTW5nQWN0aW9uRXJyb3IpLCBqdXN0IGluIGNhc2VcbiAgICAgICAgICAgIGNvbW1vbnNFcnJvciA9IG5ldyBDb21tb25zSHR0cEVycm9yKGBIdHRwIEVycm9yIG9jY3VycmVkIGluIGFjdGlvbmAsIGVycm9yLCB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb246IHRoaXMucm91dGVyLnVybFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBub3QgZnJvbSBhY3Rpb24sIHNvIHVua25vd24gc291cmNlIG9mIGVycm9yXG4gICAgICAgICAgICBjb21tb25zRXJyb3IgPSBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoZXJyb3I/Lm1lc3NhZ2UgPz8gJ1Vua25vd24gZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgbmFtZTogZXJyb3I/Lm5hbWUgPz8gJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgbG9jYXRpb246IHRoaXMucm91dGVyLnVybCxcbiAgICAgICAgICAgICAgICBjYXVzZTogZXJyb3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8ganVzdCB0cmFjZSBpdCwgYWxsb3cgdXNlciB0byBzZXQgaWYgdGhpcyBpcyBlcnJvciBvciBub3RcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoY29tbW9uc0Vycm9yKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5lcnJvck1hcHBlci50b0NvbW1vbnNFcnJvcihlcnJvciwgY29tbW9uc0Vycm9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9yIGdldHMgZXhpc3RpbmcgYWN0aW9uIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBBY3Rpb24gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBBY3Rpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gaW5zdGFuY2VJbml0aWFsU3RhdHVzIEFjdGlvbiBpbnN0YW5jZSBpbml0aWFsIHN0YXR1cy5cbiAgICAgKiBAcGFyYW0gc2tpcEluaXRpYWxpemF0aW9uRnJvbVZpZXdDb250YWluZXIgSWYgaW5pdGlhbGl6YXRpb24gb2YgaW5zdGFuY2UgZnJvbSB2aWV3IGNvbnRhaW5lciBzaG91bGQgYmUgc2tpcHBlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRPckNyZWF0ZUluc3RhbmNlPEl0ZW0sIFNlcnZpY2UgPSB1bmRlZmluZWQ+KFxuICAgICAgICBpbnN0YW5jZTogQWN0aW9uSW5zdGFuY2U8SXRlbSwgU2VydmljZT4gfCB1bmRlZmluZWQsXG4gICAgICAgIGFjdGlvbj86IEFjdGlvbkRlc2NyaXB0b3JJbnN0PEl0ZW0sIFNlcnZpY2UsIGFueSwgYW55LCBhbnk+LFxuICAgICAgICBwYXJhbWV0ZXJzPzogQWN0aW9uUGFyYW1ldGVyczxhbnk+LFxuICAgICAgICBpbnN0YW5jZUluaXRpYWxTdGF0dXM/OiBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bSxcbiAgICAgICAgc2tpcEluaXRpYWxpemF0aW9uRnJvbVZpZXdDb250YWluZXIgPSBmYWxzZVxuICAgICk6IEFjdGlvbkluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+IHtcbiAgICAgICAgaWYgKCFza2lwSW5pdGlhbGl6YXRpb25Gcm9tVmlld0NvbnRhaW5lciAmJiAhaW5zdGFuY2UgJiYgYWN0aW9uPy5hY3RpdmF0aW9uVHJpZ2dlciA9PT0gQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtLk9uUm91dGUgJiYgcGFyYW1ldGVycykge1xuICAgICAgICAgICAgaW5zdGFuY2UgPSB0aGlzLnZpZXdDb250YWluZXI/LnJvdXRlVHJpZ2dlcmVkQWN0aW9uSW5zdGFuY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICBpZiAoIWFjdGlvbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcignQWN0aW9uIGRlc2NyaXB0b3IgaXMgbm90IHByb3ZpZGVkLCBpbnN0YW5jZSBjYW5ub3QgYmUgY3JlYXRlZC4nLCB7bmFtZTogJ0FjdGlvbkV4ZWN1dG9yU2VydmljZUVycm9yJ30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBpbnN0YW5jZSBpZiBub24gcHJvdmlkZWRcbiAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IEFjdGlvbkluc3RhbmNlPEl0ZW0sIFNlcnZpY2U+KGFjdGlvbiwgaW5zdGFuY2VJbml0aWFsU3RhdHVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZz8uYWN0aW9ucz8uZGVidWdJbnN0YW5jZXMgJiYgIXRoaXMuaW5zdGFuY2VzLnNvbWUoaSA9PiBpLmluc3RhbmNlTG9uZ05hbWUgPT09IGluc3RhbmNlIS5pbnN0YW5jZUxvbmdOYW1lKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VzLmxlbmd0aCA+PSB0aGlzLmluc3RhbmNlc0J1ZmZlck1heCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RJbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzLnNoaWZ0KCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobGFzdEluc3RhbmNlIS5zdGF0ZSA8IEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkZpbmlzaFN1Y2Nlc3NGaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRVJST1I6IE5vdCBhbGwgaW5zdGFuY2VzIGFyZSBmaW5pc2hlZCEgRmluaXNoaW5nIGluc3RhbmNlICR7aW5zdGFuY2UuaW5zdGFuY2VMb25nTmFtZX0gd2l0aCBkaXNtaXNzYWwuYCk7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RJbnN0YW5jZSEuZm9yY2VGaW5pc2goKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzLnB1c2goaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbn1cbiJdfQ==
|