UNPKG

@versatiledatakit/shared

Version:

Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.

155 lines • 27 kB
/* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { CollectionsUtil } from '../../../../utils'; import { RequestFilterImpl, RequestOrderImpl, RequestPageImpl } from '../../../../common'; import { ErrorStoreImpl } from '../../../error'; import { IDLE } from './component-status.model'; /** * ** ComponentState implementation will all methods and other utilities. */ export class ComponentStateImpl { /** * ** Constructor. * * <p><b> * Important: * </b></p> * <p> * If you add new Property in {@link LiteralComponentState}/{@link ComponentState} * <ul> * <li> * Implement field in {@link ComponentStateImpl} and handle null/undefined, assign defaults (required for Collections). * </li> * <li> * Copy/Clone process have to be handled manually (for performance gain) in methods: * * {@link ComponentStateImpl.fromLiteralComponentState} * {@link ComponentStateImpl.cloneDeepLiteral} * {@link ComponentStateImpl.toLiteral} * </li> * </ul> * </p> */ constructor(stateModelProp) { const stateModel = CollectionsUtil.isDefined(stateModelProp) ? stateModelProp : {}; this.id = stateModel.id; this.status = stateModel.status ?? IDLE; this.navigationId = stateModel.navigationId ?? null; this.routePath = stateModel.routePath; this.routePathSegments = stateModel.routePathSegments ?? []; this.search = stateModel.search ?? ''; this.page = stateModel.page ?? RequestPageImpl.empty(); this.order = stateModel.order ?? RequestOrderImpl.empty(); this.filter = stateModel.filter ?? RequestFilterImpl.empty(); this.requestParams = stateModel.requestParams ?? new Map(); this.task = stateModel.task ?? null; this.errors = stateModel.errors ?? ErrorStoreImpl.empty(); this.data = stateModel.data ?? new Map(); this.uiState = stateModel.uiState ?? new Map(); } /** * ** Factory method. */ static of(stateModel) { return new ComponentStateImpl(stateModel); } /** * ** Convert provided {@link LiteralComponentState} into instance of {@link ComponentStateImpl}. * <p> * Every literals could be transformed to their original Collection format. * <ul> * <li> * Object literals could be transformed to Map/WeakMap/Set depends of the needs. * </li> * <li> * Array is keep as it is. * </li> * </ul> * </p> * * @see CollectionsUtil.transformObjectToMap * @see CollectionsUtil.transformMapToObject */ static fromLiteralComponentState(literalStateModel) { return ComponentStateImpl.of({ ...literalStateModel, errors: ErrorStoreImpl.fromLiteral(literalStateModel.errors), page: RequestPageImpl.fromLiteral(literalStateModel.page), order: RequestOrderImpl.fromLiteral(literalStateModel.order), filter: RequestFilterImpl.fromLiteral(literalStateModel.filter), requestParams: CollectionsUtil.transformObjectToMap(literalStateModel.requestParams), data: CollectionsUtil.transformObjectToMap(literalStateModel.data), uiState: CollectionsUtil.transformObjectToMap(literalStateModel.uiState) }); } /** * ** Make deep clone from Literal Component State. */ static cloneDeepLiteral(literalStateModel) { return { id: literalStateModel.id, status: literalStateModel.status, data: CollectionsUtil.cloneDeep(literalStateModel.data), routePath: literalStateModel.routePath, routePathSegments: [...literalStateModel.routePathSegments], search: literalStateModel.search, page: CollectionsUtil.cloneDeep(literalStateModel.page), order: CollectionsUtil.cloneDeep(literalStateModel.order), filter: CollectionsUtil.cloneDeep(literalStateModel.filter), requestParams: CollectionsUtil.cloneDeep(literalStateModel.requestParams), task: literalStateModel.task, navigationId: literalStateModel.navigationId, errors: ErrorStoreImpl.cloneDeepErrorRecords(literalStateModel.errors), uiState: CollectionsUtil.cloneDeep(literalStateModel.uiState) }; } /** * <p> * Every Collection should be transformed to format of JSON supported literals, ready for LocalStorage/SessionStorage persist. * <ul> * <li> * Map/WeakMap/Set have to be transform to Object literal. * </li> * <li> * Array is keep as it is. * </li> * </ul> * </p> * * @see CollectionsUtil.transformObjectToMap * @see CollectionsUtil.transformMapToObject * * @inheritDoc */ toLiteral() { return { ...this, page: this.page.toLiteral(), order: this.order.toLiteral(), filter: this.filter.toLiteral(), errors: this.errors.toLiteral(), requestParams: CollectionsUtil.transformMapToObject(this.requestParams), data: CollectionsUtil.transformMapToObject(this.data), uiState: CollectionsUtil.transformMapToObject(this.uiState) }; } /** * @inheritDoc */ toLiteralCloneDeep() { return ComponentStateImpl.cloneDeepLiteral(this.toLiteral()); } /** * @inheritDoc */ copy(state = {}) { return ComponentStateImpl.of({ ...this, ...state }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXN0YXRlLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvY29yZS9jb21wb25lbnQvbW9kZWwvc3RhdGUvY29tcG9uZW50LXN0YXRlLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsT0FBTyxFQVFILGlCQUFpQixFQUVqQixnQkFBZ0IsRUFFaEIsZUFBZSxFQUNsQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsSUFBSSxFQUFjLE1BQU0sMEJBQTBCLENBQUM7QUE0TDVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQXVFM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXFCRztJQUNILFlBQVksY0FBdUM7UUFDL0MsTUFBTSxVQUFVLEdBQTRCLGVBQWUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRTVHLElBQUksQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUM7UUFDcEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxD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QUFFLGlCQUFpQixDQUFDLFlBQVk7WUFDNUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7WUFDdEUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO1NBQ2hFLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O09BaUJHO0lBQ0gsU0FBUztRQUNMLE9BQU87WUFDSCxHQUFHLElBQUk7WUFDUCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO1lBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDL0IsYUFBYSxFQUFFLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3ZFLElBQUksRUFBRSxlQUFlLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNyRCxPQUFPLEVBQUUsZUFBZSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDOUQsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNkLE9BQU8sa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLFFBQWlDLEVBQUU7UUFDcEMsT0FBTyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7WUFDekIsR0FBRyxJQUFJO1lBQ1AsR0FBRyxLQUFLO1NBQ1gsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDIzLTIwMjUgQnJvYWRjb21cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5pbXBvcnQgeyBDb2xsZWN0aW9uc1V0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCB7XG4gICAgQ29weSxcbiAgICBFcnJvclJlY29yZCxcbiAgICBFcnJvclN0b3JlLFxuICAgIExpdGVyYWwsXG4gICAgTGl0ZXJhbEFwaVByZWRpY2F0ZXMsXG4gICAgTGl0ZXJhbFJlcXVlc3RQYWdlLFxuICAgIFJlcXVlc3RGaWx0ZXIsXG4gICAgUmVxdWVzdEZpbHRlckltcGwsXG4gICAgUmVxdWVzdE9yZGVyLFxuICAgIFJlcXVlc3RPcmRlckltcGwsXG4gICAgUmVxdWVzdFBhZ2UsXG4gICAgUmVxdWVzdFBhZ2VJbXBsXG59IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbic7XG5cbmltcG9ydCB7IEVycm9yU3RvcmVJbXBsIH0gZnJvbSAnLi4vLi4vLi4vZXJyb3InO1xuXG5pbXBvcnQgeyBJRExFLCBTdGF0dXNUeXBlIH0gZnJvbSAnLi9jb21wb25lbnQtc3RhdHVzLm1vZGVsJztcblxuLyoqXG4gKiAqKiBMaXRlcmFsIENvbXBvbmVudCBTdGF0ZSBpbiBwdXJlc3QgZm9ybWF0IHJlYWR5IGZvciBTdG9yZSBwZXJzaXN0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpdGVyYWxDb21wb25lbnRTdGF0ZSB7XG4gICAgLyoqXG4gICAgICogKiogSWRlbnRpZmllciBmb3IgQ29tcG9uZW50IFN0YXRlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAqKiBTdGF0dXMgZm9yIENvbXBvbmVudCBTdGF0ZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBzdGF0dXM6IFN0YXR1c1R5cGU7XG5cbiAgICAvKipcbiAgICAgKiAqKiBDb21wb25lbnQgU3RhdGUgRGF0YS5cbiAgICAgKiA8cD5cbiAgICAgKiAgICAgLSBGcmVlIGZvcm1hdCBMaXRlcmFsIE9iamVjdC5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgcmVhZG9ubHkgZGF0YT86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgICAvKipcbiAgICAgKiAqKiBSb3V0ZSBwYXRoIGZvciBjdXJyZW50IFN0YXRlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJvdXRlUGF0aD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqICoqIFJvdXRlIHBhdGggc2VnbWVudHMgZm9yIGN1cnJlbnQgU3RhdGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgcm91dGVQYXRoU2VnbWVudHM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqICoqIFNlYXJjaCBxdWVyeSBmb3IgSHR0cCByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBzZWFyY2g/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAqKiBQYWdlIGZvciBIdHRwIHJlcXVlc3RzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhZ2U/OiBMaXRlcmFsUmVxdWVzdFBhZ2U7XG5cbiAgICAvKipcbiAgICAgKiAqKiBPcmRlciBmb3IgSHR0cCByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBvcmRlcj86IExpdGVyYWxBcGlQcmVkaWNhdGVzO1xuXG4gICAgLyoqXG4gICAgICogKiogRmlsdGVyIGZvciBIdHRwIHJlcXVlc3RzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZpbHRlcj86IExpdGVyYWxBcGlQcmVkaWNhdGVzO1xuXG4gICAgLyoqXG4gICAgICogKiogT3JkZXIgZm9yIEh0dHAgcmVxdWVzdHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmVxdWVzdFBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgICAvKipcbiAgICAgKiAqKiBUYXNrIGlzIHByb3BlcnR5IHRoYXQgZ2l2ZSBiaS1kaXJlY3Rpb25hbCByZWZpbmVtZW50IGNvbnRleHQuXG4gICAgICpcbiAgICAgKiAgICAgIC0gR2l2ZXMgY29udGV4dCB0byBFZmZlY3QgdGhyb3VnaCBBY3Rpb24uXG4gICAgICogICAgICAtIEdpdmVzIGNvbnRleHQgdG8gQ29tcG9uZW50IHRocm91Z2ggQ29tcG9uZW50U3RhdGUgKENvbXBvbmVudE1vZGVsKS5cbiAgICAgKi9cbiAgICByZWFkb25seSB0YXNrPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogKiogUm91dGVyIE5hdmlnYXRpb25JZCBib3VuZCB0byB0aGlzIENvbXBvbmVudCBTdGF0ZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYXZpZ2F0aW9uSWQ/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiAqKiBFcnJvciBzdG9yZSBmb3IgRXJyb3JSZWNvcmRzIHRoYXQgaGFwcGVuIGluIHN0cmVhbSBtYW5pcHVsYXRpb24gZG93biB0byB0aGUgQ29tcG9uZW50cy5cbiAgICAgKiA8cD5cbiAgICAgKiAgICAgLSBJZGVhbCBmb3Igc3RvcmluZyBIdHRwIGVycm9ycyBhbmQgb3RoZXIgcnVudGltZSBlcnJvcnMsIHNvIENvbXBvbmVudCBjb3VsZCBlYXNpbHkgbGV2ZXJhZ2UgdGhhdCBrbm93bGVkZ2UgYW5kIHNob3cgaW5mbyBmb3IgVXNlci5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgcmVhZG9ubHkgZXJyb3JzPzogRXJyb3JSZWNvcmRbXTtcblxuICAgIC8qKlxuICAgICAqICoqIENvbXBvbmVudCBTdGF0ZSBVaVN0YXRlLCB0aGF0IGhvbGRzIGFsbCBpbmZvcm1hdGlvbiBmb3IgVWlFbGVtZW50cy5cbiAgICAgKiA8cD5cbiAgICAgKiAgICAgLSBGcmVlIGZvcm1hdCBMaXRlcmFsIE9iamVjdCB3aGVyZSBrZXkgaWRlbnRpZmllciBjb3VsZCBiZSAoQ29tcG9uZW50L0h0bWwgRWxlbWVudCkgbmFtZS9pZC9jbGFzcyBldGMuLi5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgcmVhZG9ubHkgdWlTdGF0ZT86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50U3RhdGUgZXh0ZW5kcyBMaXRlcmFsPExpdGVyYWxDb21wb25lbnRTdGF0ZT4sIENvcHk8Q29tcG9uZW50U3RhdGU+IHtcbiAgICAvKipcbiAgICAgKiAqKiBJZGVudGlmaWVyIGZvciBDb21wb25lbnQgU3RhdGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqICoqIFN0YXR1cyBmb3IgQ29tcG9uZW50IFN0YXRlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHN0YXR1czogU3RhdHVzVHlwZTtcblxuICAgIC8qKlxuICAgICAqICoqIENvbXBvbmVudCBTdGF0ZSBEYXRhLlxuICAgICAqIDxwPlxuICAgICAqICAgICAtIEZyZWUgZm9ybWF0IE1hcC5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgcmVhZG9ubHkgZGF0YT86IE1hcDxzdHJpbmcsIGFueT47XG5cbiAgICAvKipcbiAgICAgKiAqKiBSb3V0ZSBwYXRoIGZvciBjdXJyZW50IFN0YXRlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJvdXRlUGF0aD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqICoqIFJvdXRlIFBhdGggU2VnbWVudHMgZm9yIGN1cnJlbnQgU3RhdGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgcm91dGVQYXRoU2VnbWVudHM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqICoqIFNlYXJjaCBxdWVyeSBmb3IgSHR0cCByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBzZWFyY2g/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAqKiBQYWdlIGZvciBIdHRwIHJlcXVlc3RzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhZ2U/OiBSZXF1ZXN0UGFnZTtcblxuICAgIC8qKlxuICAgICAqICoqIE9yZGVyIGZvciBIdHRwIHJlcXVlc3RzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG9yZGVyPzogUmVxdWVzdE9yZGVyO1xuXG4gICAgLyoqXG4gICAgICogKiogRmlsdGVyIGZvciBIdHRwIHJlcXVlc3RzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZpbHRlcj86IFJlcXVlc3RGaWx0ZXI7XG5cbiAgICAvKipcbiAgICAgKiAqKiBNYXAgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycyBmb3IgSHR0cCByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICByZWFkb25seSByZXF1ZXN0UGFyYW1zPzogTWFwPHN0cmluZywgYW55PjtcblxuICAgIC8qKlxuICAgICAqICoqIFRhc2sgaXMgcHJvcGVydHkgdGhhdCBnaXZlIGJpLWRpcmVjdGlvbmFsIHJlZmluZW1lbnQgY29udGV4dC5cbiAgICAgKlxuICAgICAqICAgICAgLSBHaXZlcyBjb250ZXh0IHRvIEVmZmVjdCB0aHJvdWdoIEFjdGlvbi5cbiAgICAgKiAgICAgIC0gR2l2ZXMgY29udGV4dCB0byBDb21wb25lbnQgdGhyb3VnaCBDb21wb25lbnRTdGF0ZSAoQ29tcG9uZW50TW9kZWwpLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHRhc2s/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAqKiBSb3V0ZXIgTmF2aWdhdGlvbklkIGJvdW5kIHRvIHRoaXMgQ29tcG9uZW50IFN0YXRlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hdmlnYXRpb25JZD86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqICoqIEVycm9yIHN0b3JlIGZvciBFcnJvclJlY29yZHMgdGhhdCBoYXBwZW4gaW4gc3RyZWFtIG1hbmlwdWxhdGlvbiBkb3duIHRvIHRoZSBDb21wb25lbnRzLlxuICAgICAqIDxwPlxuICAgICAqICAgICAtIElkZWFsIGZvciBzdG9yaW5nIEh0dHAgZXJyb3JzIGFuZCBvdGhlciBydW50aW1lIGVycm9ycywgc28gQ29tcG9uZW50IGNvdWxkIGVhc2lseSBsZXZlcmFnZSB0aGF0IGtub3dsZWRnZSBhbmQgc2hvdyBpbmZvIGZvciBVc2VyLlxuICAgICAqIDwvcD5cbiAgICAgKi9cbiAgICByZWFkb25seSBlcnJvcnM/OiBFcnJvclN0b3JlO1xuXG4gICAgLyoqXG4gICAgICogKiogQ29tcG9uZW50IFN0YXRlIFVpU3RhdGUsIHRoYXQgaG9sZHMgYWxsIGluZm9ybWF0aW9uIGZvciBVaUVsZW1lbnRzLlxuICAgICAqIDxwPlxuICAgICAqICAgICAtIEZyZWUgZm9ybWF0IE1hcCB3aGVyZSBrZXkgaWRlbnRpZmllciBjb3VsZCBiZSAoQ29tcG9uZW50L0h0bWwgRWxlbWVudCkgbmFtZS9pZC9jbGFzcyBldGMuLi5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgcmVhZG9ubHkgdWlTdGF0ZT86IE1hcDxzdHJpbmcsIGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHRvTGl0ZXJhbCgpOiBMaXRlcmFsQ29tcG9uZW50U3RhdGU7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHRvTGl0ZXJhbENsb25lRGVlcCgpOiBMaXRlcmFsQ29tcG9uZW50U3RhdGU7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIGNvcHkoc3RhdGU/OiBQYXJ0aWFsPENvbXBvbmVudFN0YXRlPik6IENvbXBvbmVudFN0YXRlO1xufVxuXG4vKipcbiAqICoqIENvbXBvbmVudFN0YXRlIGltcGxlbWVudGF0aW9uIHdpbGwgYWxsIG1ldGhvZHMgYW5kIG90aGVyIHV0aWxpdGllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvbmVudFN0YXRlSW1wbCBpbXBsZW1lbnRzIENvbXBvbmVudFN0YXRlIHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHN0YXR1czogU3RhdHVzVHlwZTtcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGF0YTogTWFwPHN0cmluZywgYW55PjtcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgcmVhZG9ubHkgcm91dGVQYXRoOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHJvdXRlUGF0aFNlZ21lbnRzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VhcmNoOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhZ2U6IFJlcXVlc3RQYWdlSW1wbDtcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgcmVhZG9ubHkgb3JkZXI6IFJlcXVlc3RPcmRlckltcGw7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGZpbHRlcjogUmVxdWVzdEZpbHRlckltcGw7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHJlcXVlc3RQYXJhbXM6IE1hcDxzdHJpbmcsIGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHRhc2s6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgcmVhZG9ubHkgbmF2aWdhdGlvbklkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGVycm9yczogRXJyb3JTdG9yZTtcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgcmVhZG9ubHkgdWlTdGF0ZTogTWFwPHN0cmluZywgYW55PjtcblxuICAgIC8qKlxuICAgICAqICoqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogPHA+PGI+XG4gICAgICogICAgIEltcG9ydGFudDpcbiAgICAgKiA8L2I+PC9wPlxuICAgICAqIDxwPlxuICAgICAqICAgICBJZiB5b3UgYWRkIG5ldyBQcm9wZXJ0eSBpbiB7QGxpbmsgTGl0ZXJhbENvbXBvbmVudFN0YXRlfS97QGxpbmsgQ29tcG9uZW50U3RhdGV9XG4gICAgICogIDx1bD5cbiAgICAgKiAgICAgPGxpPlxuICAgICAqICAgICAgICBJbXBsZW1lbnQgZmllbGQgaW4ge0BsaW5rIENvbXBvbmVudFN0YXRlSW1wbH0gYW5kIGhhbmRsZSBudWxsL3VuZGVmaW5lZCwgYXNzaWduIGRlZmF1bHRzIChyZXF1aXJlZCBmb3IgQ29sbGVjdGlvbnMpLlxuICAgICAqICAgICA8L2xpPlxuICAgICAqICAgICA8bGk+XG4gICAgICogICAgICAgIENvcHkvQ2xvbmUgcHJvY2VzcyBoYXZlIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgKGZvciBwZXJmb3JtYW5jZSBnYWluKSBpbiBtZXRob2RzOlxuICAgICAqXG4gICAgICogICAgICAgIHtAbGluayBDb21wb25lbnRTdGF0ZUltcGwuZnJvbUxpdGVyYWxDb21wb25lbnRTdGF0ZX1cbiAgICAgKiAgICAgICAge0BsaW5rIENvbXBvbmVudFN0YXRlSW1wbC5jbG9uZURlZXBMaXRlcmFsfVxuICAgICAqICAgICAgICB7QGxpbmsgQ29tcG9uZW50U3RhdGVJbXBsLnRvTGl0ZXJhbH1cbiAgICAgKiAgICAgPC9saT5cbiAgICAgKiAgPC91bD5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc3RhdGVNb2RlbFByb3A6IFBhcnRpYWw8Q29tcG9uZW50U3RhdGU+KSB7XG4gICAgICAgIGNvbnN0IHN0YXRlTW9kZWw6IFBhcnRpYWw8Q29tcG9uZW50U3RhdGU+ID0gQ29sbGVjdGlvbnNVdGlsLmlzRGVmaW5lZChzdGF0ZU1vZGVsUHJvcCkgPyBzdGF0ZU1vZGVsUHJvcCA6IHt9O1xuXG4gICAgICAgIHRoaXMuaWQgPSBzdGF0ZU1vZGVsLmlkO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXRlTW9kZWwuc3RhdHVzID8/IElETEU7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbklkID0gc3RhdGVNb2RlbC5uYXZpZ2F0aW9uSWQgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5yb3V0ZVBhdGggPSBzdGF0ZU1vZGVsLnJvdXRlUGF0aDtcbiAgICAgICAgdGhpcy5yb3V0ZVBhdGhTZWdtZW50cyA9IHN0YXRlTW9kZWwucm91dGVQYXRoU2VnbWVudHMgPz8gW107XG4gICAgICAgIHRoaXMuc2VhcmNoID0gc3RhdGVNb2RlbC5zZWFyY2ggPz8gJyc7XG4gICAgICAgIHRoaXMucGFnZSA9IHN0YXRlTW9kZWwucGFnZSA/PyBSZXF1ZXN0UGFnZUltcGwuZW1wdHkoKTtcbiAgICAgICAgdGhpcy5vcmRlciA9IHN0YXRlTW9kZWwub3JkZXIgPz8gUmVxdWVzdE9yZGVySW1wbC5lbXB0eSgpO1xuICAgICAgICB0aGlzLmZpbHRlciA9IHN0YXRlTW9kZWwuZmlsdGVyID8/IFJlcXVlc3RGaWx0ZXJJbXBsLmVtcHR5KCk7XG4gICAgICAgIHRoaXMucmVxdWVzdFBhcmFtcyA9IHN0YXRlTW9kZWwucmVxdWVzdFBhcmFtcyA/PyBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICB0aGlzLnRhc2sgPSBzdGF0ZU1vZGVsLnRhc2sgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBzdGF0ZU1vZGVsLmVycm9ycyA/PyBFcnJvclN0b3JlSW1wbC5lbXB0eSgpO1xuICAgICAgICB0aGlzLmRhdGEgPSBzdGF0ZU1vZGVsLmRhdGEgPz8gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgICAgdGhpcy51aVN0YXRlID0gc3RhdGVNb2RlbC51aVN0YXRlID8/IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogRmFjdG9yeSBtZXRob2QuXG4gICAgICovXG4gICAgc3RhdGljIG9mKHN0YXRlTW9kZWw6IFBhcnRpYWw8Q29tcG9uZW50U3RhdGU+KTogQ29tcG9uZW50U3RhdGVJbXBsIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRTdGF0ZUltcGwoc3RhdGVNb2RlbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogQ29udmVydCBwcm92aWRlZCB7QGxpbmsgTGl0ZXJhbENvbXBvbmVudFN0YXRlfSBpbnRvIGluc3RhbmNlIG9mIHtAbGluayBDb21wb25lbnRTdGF0ZUltcGx9LlxuICAgICAqIDxwPlxuICAgICAqICAgICBFdmVyeSBsaXRlcmFscyBjb3VsZCBiZSB0cmFuc2Zvcm1lZCB0byB0aGVpciBvcmlnaW5hbCBDb2xsZWN0aW9uIGZvcm1hdC5cbiAgICAgKiAgICAgPHVsPlxuICAgICAqICAgICAgICAgPGxpPlxuICAgICAqICAgICAgICAgICAgIE9iamVjdCBsaXRlcmFscyBjb3VsZCBiZSB0cmFuc2Zvcm1lZCB0byBNYXAvV2Vha01hcC9TZXQgZGVwZW5kcyBvZiB0aGUgbmVlZHMuXG4gICAgICogICAgICAgICA8L2xpPlxuICAgICAqICAgICAgICAgPGxpPlxuICAgICAqICAgICAgICAgICAgIEFycmF5IGlzIGtlZXAgYXMgaXQgaXMuXG4gICAgICogICAgICAgICA8L2xpPlxuICAgICAqICAgICA8L3VsPlxuICAgICAqIDwvcD5cbiAgICAgKlxuICAgICAqIEBzZWUgQ29sbGVjdGlvbnNVdGlsLnRyYW5zZm9ybU9iamVjdFRvTWFwXG4gICAgICogQHNlZSBDb2xsZWN0aW9uc1V0aWwudHJhbnNmb3JtTWFwVG9PYmplY3RcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUxpdGVyYWxDb21wb25lbnRTdGF0ZShsaXRlcmFsU3RhdGVNb2RlbDogTGl0ZXJhbENvbXBvbmVudFN0YXRlKTogQ29tcG9uZW50U3RhdGVJbXBsIHtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudFN0YXRlSW1wbC5vZih7XG4gICAgICAgICAgICAuLi5saXRlcmFsU3RhdGVNb2RlbCxcbiAgICAgICAgICAgIGVycm9yczogRXJyb3JTdG9yZUltcGwuZnJvbUxpdGVyYWwobGl0ZXJhbFN0YXRlTW9kZWwuZXJyb3JzKSxcbiAgICAgICAgICAgIHBhZ2U6IFJlcXVlc3RQYWdlSW1wbC5mcm9tTGl0ZXJhbChsaXRlcmFsU3RhdGVNb2RlbC5wYWdlKSxcbiAgICAgICAgICAgIG9yZGVyOiBSZXF1ZXN0T3JkZXJJbXBsLmZyb21MaXRlcmFsKGxpdGVyYWxTdGF0ZU1vZGVsLm9yZGVyKSxcbiAgICAgICAgICAgIGZpbHRlcjogUmVxdWVzdEZpbHRlckltcGwuZnJvbUxpdGVyYWwobGl0ZXJhbFN0YXRlTW9kZWwuZmlsdGVyKSxcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbXM6IENvbGxlY3Rpb25zVXRpbC50cmFuc2Zvcm1PYmplY3RUb01hcChsaXRlcmFsU3RhdGVNb2RlbC5yZXF1ZXN0UGFyYW1zKSxcbiAgICAgICAgICAgIGRhdGE6IENvbGxlY3Rpb25zVXRpbC50cmFuc2Zvcm1PYmplY3RUb01hcChsaXRlcmFsU3RhdGVNb2RlbC5kYXRhKSxcbiAgICAgICAgICAgIHVpU3RhdGU6IENvbGxlY3Rpb25zVXRpbC50cmFuc2Zvcm1PYmplY3RUb01hcChsaXRlcmFsU3RhdGVNb2RlbC51aVN0YXRlKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBNYWtlIGRlZXAgY2xvbmUgZnJvbSBMaXRlcmFsIENvbXBvbmVudCBTdGF0ZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY2xvbmVEZWVwTGl0ZXJhbChsaXRlcmFsU3RhdGVNb2RlbDogTGl0ZXJhbENvbXBvbmVudFN0YXRlKTogTGl0ZXJhbENvbXBvbmVudFN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBsaXRlcmFsU3RhdGVNb2RlbC5pZCxcbiAgICAgICAgICAgIHN0YXR1czogbGl0ZXJhbFN0YXRlTW9kZWwuc3RhdHVzLFxuICAgICAgICAgICAgZGF0YTogQ29sbGVjdGlvbnNVdGlsLmNsb25lRGVlcChsaXRlcmFsU3RhdGVNb2RlbC5kYXRhKSxcbiAgICAgICAgICAgIHJvdXRlUGF0aDogbGl0ZXJhbFN0YXRlTW9kZWwucm91dGVQYXRoLFxuICAgICAgICAgICAgcm91dGVQYXRoU2VnbWVudHM6IFsuLi5saXRlcmFsU3RhdGVNb2RlbC5yb3V0ZVBhdGhTZWdtZW50c10sXG4gICAgICAgICAgICBzZWFyY2g6IGxpdGVyYWxTdGF0ZU1vZGVsLnNlYXJjaCxcbiAgICAgICAgICAgIHBhZ2U6IENvbGxlY3Rpb25zVXRpbC5jbG9uZURlZXAobGl0ZXJhbFN0YXRlTW9kZWwucGFnZSksXG4gICAgICAgICAgICBvcmRlcjogQ29sbGVjdGlvbnNVdGlsLmNsb25lRGVlcChsaXRlcmFsU3RhdGVNb2RlbC5vcmRlciksXG4gICAgICAgICAgICBmaWx0ZXI6IENvbGxlY3Rpb25zVXRpbC5jbG9uZURlZXAobGl0ZXJhbFN0YXRlTW9kZWwuZmlsdGVyKSxcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbXM6IENvbGxlY3Rpb25zVXRpbC5jbG9uZURlZXAobGl0ZXJhbFN0YXRlTW9kZWwucmVxdWVzdFBhcmFtcyksXG4gICAgICAgICAgICB0YXNrOiBsaXRlcmFsU3RhdGVNb2RlbC50YXNrLFxuICAgICAgICAgICAgbmF2aWdhdGlvbklkOiBsaXRlcmFsU3RhdGVNb2RlbC5uYXZpZ2F0aW9uSWQsXG4gICAgICAgICAgICBlcnJvcnM6IEVycm9yU3RvcmVJbXBsLmNsb25lRGVlcEVycm9yUmVjb3JkcyhsaXRlcmFsU3RhdGVNb2RlbC5lcnJvcnMpLFxuICAgICAgICAgICAgdWlTdGF0ZTogQ29sbGVjdGlvbnNVdGlsLmNsb25lRGVlcChsaXRlcmFsU3RhdGVNb2RlbC51aVN0YXRlKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxwPlxuICAgICAqICAgICBFdmVyeSBDb2xsZWN0aW9uIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCB0byBmb3JtYXQgb2YgSlNPTiBzdXBwb3J0ZWQgbGl0ZXJhbHMsIHJlYWR5IGZvciBMb2NhbFN0b3JhZ2UvU2Vzc2lvblN0b3JhZ2UgcGVyc2lzdC5cbiAgICAgKiAgICAgPHVsPlxuICAgICAqICAgICAgICAgPGxpPlxuICAgICAqICAgICAgICAgICAgIE1hcC9XZWFrTWFwL1NldCBoYXZlIHRvIGJlIHRyYW5zZm9ybSB0byBPYmplY3QgbGl0ZXJhbC5cbiAgICAgKiAgICAgICAgIDwvbGk+XG4gICAgICogICAgICAgICA8bGk+XG4gICAgICogICAgICAgICAgICAgQXJyYXkgaXMga2VlcCBhcyBpdCBpcy5cbiAgICAgKiAgICAgICAgIDwvbGk+XG4gICAgICogICAgIDwvdWw+XG4gICAgICogPC9wPlxuICAgICAqXG4gICAgICogQHNlZSBDb2xsZWN0aW9uc1V0aWwudHJhbnNmb3JtT2JqZWN0VG9NYXBcbiAgICAgKiBAc2VlIENvbGxlY3Rpb25zVXRpbC50cmFuc2Zvcm1NYXBUb09iamVjdFxuICAgICAqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICB0b0xpdGVyYWwoKTogTGl0ZXJhbENvbXBvbmVudFN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UudG9MaXRlcmFsKCksXG4gICAgICAgICAgICBvcmRlcjogdGhpcy5vcmRlci50b0xpdGVyYWwoKSxcbiAgICAgICAgICAgIGZpbHRlcjogdGhpcy5maWx0ZXIudG9MaXRlcmFsKCksXG4gICAgICAgICAgICBlcnJvcnM6IHRoaXMuZXJyb3JzLnRvTGl0ZXJhbCgpLFxuICAgICAgICAgICAgcmVxdWVzdFBhcmFtczogQ29sbGVjdGlvbnNVdGlsLnRyYW5zZm9ybU1hcFRvT2JqZWN0KHRoaXMucmVxdWVzdFBhcmFtcyksXG4gICAgICAgICAgICBkYXRhOiBDb2xsZWN0aW9uc1V0aWwudHJhbnNmb3JtTWFwVG9PYmplY3QodGhpcy5kYXRhKSxcbiAgICAgICAgICAgIHVpU3RhdGU6IENvbGxlY3Rpb25zVXRpbC50cmFuc2Zvcm1NYXBUb09iamVjdCh0aGlzLnVpU3RhdGUpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICB0b0xpdGVyYWxDbG9uZURlZXAoKTogTGl0ZXJhbENvbXBvbmVudFN0YXRlIHtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudFN0YXRlSW1wbC5jbG9uZURlZXBMaXRlcmFsKHRoaXMudG9MaXRlcmFsKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgY29weShzdGF0ZTogUGFydGlhbDxDb21wb25lbnRTdGF0ZT4gPSB7fSk6IENvbXBvbmVudFN0YXRlSW1wbCB7XG4gICAgICAgIHJldHVybiBDb21wb25lbnRTdGF0ZUltcGwub2Yoe1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIC4uLnN0YXRlXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==