{"version":3,"file":"mosaic-design-infosec-components-external-object-hash-utils.mjs","sources":["../../../libs/external/object-hash/utils/src/lib/compare/is-equal-by-hash/is-equal-by-hash.ts","../../../libs/external/object-hash/utils/src/lib/forms/validation-group.ts","../../../libs/external/object-hash/utils/src/lib/route/route.ts","../../../libs/external/object-hash/utils/src/lib/rxjs/distinct-until-changed-by-hash/distinct-until-changed-by-hash.ts","../../../libs/external/object-hash/utils/mosaic-design-infosec-components-external-object-hash-utils.ts"],"sourcesContent":["import objectHash from 'object-hash';\n\nexport const isEqualByHash = <T>(a: T, b: T, options?: objectHash.NormalOption): boolean => {\n    if (a === undefined || b === undefined) {\n        return a === b;\n    } else {\n        return objectHash(a, options) === objectHash(b, options);\n    }\n};\n","import { ValidatorFn, AbstractControl, ValidationErrors } from '@angular/forms';\n\nimport { RevalidationState } from '@mosaic-design/infosec-components/types';\nimport { getControlName, refreshControlValidationErrors, isObject } from '@mosaic-design/infosec-components/utils';\n\nimport { isEqualByHash } from '../compare';\n\nexport type RevalidateFn = () => ValidationErrors | null;\n\nexport interface ValidationGroup {\n    /**\n     * Triggers validation when value was changed and return validation errors.\n     */\n    validate: ValidatorFn;\n\n    /**\n     * Just get current validation errors without trigger validation.\n     */\n    validationErrors: ValidatorFn;\n\n    /**\n     * Triggers validation when value was changed but returns null always.\n     */\n    link: ValidatorFn;\n\n    /**\n     * Can be used to full revalidation of validation group. F.e. when external data which was used for validation was changed.\n     */\n    revalidate: RevalidateFn;\n}\n\nexport type ValidationGroupValidatorFn<T> = (formValue: T) => ValidationErrors | null;\n\nexport type Validator<T> = ValidationGroupValidatorFn<Partial<T>> | ValidationGroupValidatorFn<Partial<T>>[];\nexport type IsEqualComparer<T> = (previousFormValue: Partial<T>, formValue: Partial<T>) => boolean;\n\nexport interface ValidationGroupRevalidationOptions {\n    onlySelf?: boolean;\n    emitEvent?: boolean;\n}\n\nexport interface ValidationGroupOptions<T> {\n    validator: Validator<T>;\n    revalidationOptions?: ValidationGroupRevalidationOptions;\n    isEqualComparer?: IsEqualComparer<T>;\n}\n\nexport type ValidationGroupInput<T> = Validator<T> | ValidationGroupOptions<T>;\n\ninterface ComposedValidationGroupOptions<T> {\n    validator: ValidationGroupValidatorFn<Partial<T>>;\n    revalidationOptions: ValidationGroupRevalidationOptions;\n    isEqualComparer: IsEqualComparer<T>;\n}\n\ninterface ValidationGroupState<T> {\n    validatableControls: AbstractControl[];\n    options: ComposedValidationGroupOptions<T>;\n    form: Partial<T>;\n    validationErrors: ValidationErrors | null;\n    previousValidationErrors: ValidationErrors | null;\n}\n\nfunction createDefaultValidationGroupState<T>(options: ComposedValidationGroupOptions<T>): ValidationGroupState<T> {\n    return {\n        form: {},\n        options,\n        validatableControls: [],\n        validationErrors: null,\n        previousValidationErrors: null\n    };\n}\n\nfunction isOptionsObj<T>(validatorOrOpts: ValidationGroupInput<T>): validatorOrOpts is ValidationGroupOptions<T> {\n    return !Array.isArray(validatorOrOpts) && isObject(validatorOrOpts);\n}\n\nfunction isValidatorArray<T>(validator: Validator<T>): validator is ValidationGroupValidatorFn<Partial<T>>[] {\n    return Array.isArray(validator);\n}\n\nfunction composeValidators<T>(validators: ValidationGroupValidatorFn<T>[]): ValidationGroupValidatorFn<T> {\n    return (value: T) =>\n        validators\n            .map((validator) => validator(value))\n            .reduce(\n                (prev, current) =>\n                    current\n                        ? {\n                              ...prev,\n                              ...current\n                          }\n                        : prev,\n                {}\n            );\n}\n\nfunction mapValidator<T>(validator: Validator<Partial<T>>): ValidationGroupValidatorFn<Partial<T>> {\n    if (isValidatorArray(validator)) {\n        if (!validator.length) {\n            throw new Error(`Validation group: validators array is empty`);\n        }\n\n        return composeValidators(validator);\n    } else {\n        return validator;\n    }\n}\n\nconst defaultRevalidationOptions: ValidationGroupRevalidationOptions = {\n    emitEvent: false,\n    onlySelf: true\n};\n\nfunction defaultIsEqualComparer<T>(previousFormValue: Partial<T>, formValue: Partial<T>): boolean {\n    return isEqualByHash(previousFormValue, formValue);\n}\n\nfunction mapComposedValidationGroupOptions<T>(\n    validatorOrOpts: ValidationGroupInput<T>\n): ComposedValidationGroupOptions<T> {\n    let validator: ValidationGroupValidatorFn<Partial<T>>;\n    let revalidationOptions: ValidationGroupRevalidationOptions = defaultRevalidationOptions;\n    let isEqualComparer: IsEqualComparer<T> = defaultIsEqualComparer;\n\n    if (isOptionsObj(validatorOrOpts)) {\n        validator = mapValidator(validatorOrOpts.validator);\n        revalidationOptions = {\n            ...defaultRevalidationOptions,\n            ...validatorOrOpts.revalidationOptions\n        };\n        isEqualComparer = validatorOrOpts.isEqualComparer || isEqualComparer;\n    } else {\n        validator = mapValidator(validatorOrOpts);\n    }\n\n    return {\n        validator,\n        revalidationOptions,\n        isEqualComparer\n    };\n}\n\nfunction actualizeFormValue<T>(formValue: Partial<T>, control: AbstractControl): Partial<T> {\n    const name = getControlName(control) as keyof T;\n    if (!name) {\n        return formValue;\n    }\n\n    const result = {\n        ...formValue\n    };\n\n    result[name] = control.value as T[keyof T];\n\n    return result;\n}\n\nfunction refreshControlsValidationErrors<T>(state: ValidationGroupState<T>): void {\n    const { validatableControls, options, validationErrors, previousValidationErrors } = state;\n\n    validatableControls.forEach((control) => {\n        const revalidationState: RevalidationState = {\n            control,\n            revalidationOptions: options.revalidationOptions,\n            validationErrors,\n            previousValidationErrors\n        };\n\n        refreshControlValidationErrors(revalidationState);\n    });\n}\n\nfunction addValidatableControlIfNotExists<T>(state: ValidationGroupState<T>, control: AbstractControl): void {\n    if (!state.validatableControls.includes(control)) {\n        state.validatableControls.push(control);\n    }\n}\n\nfunction refreshValidationErrors<T>(state: ValidationGroupState<T>): void {\n    state.previousValidationErrors = state.validationErrors;\n    state.validationErrors = state.options.validator(state.form);\n}\n\nexport function createValidationGroup<T>(validatorOrOpts: ValidationGroupInput<T>): ValidationGroup {\n    const state = createDefaultValidationGroupState(mapComposedValidationGroupOptions(validatorOrOpts));\n\n    const actualize = (control: AbstractControl): void => {\n        const actualizedForm = actualizeFormValue(state.form, control);\n        const isEqual = state.options.isEqualComparer(state.form, actualizedForm);\n\n        if (!isEqual) {\n            state.form = actualizedForm;\n            refreshValidationErrors(state);\n            refreshControlsValidationErrors(state);\n        }\n    };\n\n    return {\n        link: (control) => {\n            actualize(control);\n\n            return null;\n        },\n        validate: (control) => {\n            addValidatableControlIfNotExists(state, control);\n            actualize(control);\n\n            return state.validationErrors;\n        },\n        revalidate: () => {\n            refreshValidationErrors(state);\n            refreshControlsValidationErrors(state);\n\n            return state.validationErrors;\n        },\n        validationErrors: (control) => {\n            addValidatableControlIfNotExists(state, control);\n\n            return state.validationErrors;\n        }\n    };\n}\n","import { ActivatedRouteSnapshot, Data, UrlSegment, UrlSegmentGroup, UrlTree } from '@angular/router';\n\nimport { isNonNullable } from '@mosaic-design/infosec-components/utils';\n\nimport { isEqualByHash } from '../compare';\n\nexport function getRouteData(route: ActivatedRouteSnapshot | undefined): Data {\n    if (!route) {\n        return {};\n    }\n\n    const currentData = route.data;\n    const primaryChild = route.children.find((c) => c.outlet === 'primary') || route.firstChild || undefined;\n\n    return { ...currentData, ...getRouteData(primaryChild) };\n}\n\nexport function getRouteSnapshotUrlSegments(route: ActivatedRouteSnapshot | undefined): UrlSegment[] {\n    if (!route) {\n        return [];\n    }\n\n    let segments: UrlSegment[] = [];\n\n    let child = route.firstChild;\n    while (child) {\n        segments = [...segments, ...child.url];\n        child = child.firstChild;\n    }\n\n    return segments;\n}\n\nfunction isChildUrlSegments(current: UrlSegment[], possibleChild: UrlSegment[]): boolean {\n    return possibleChild.length >= current.length && current.every((a, i) => a.path === possibleChild[i]?.path);\n}\n\nexport function isUrlSegmentsEquals(first: UrlSegment[], second: UrlSegment[]): boolean {\n    return first.length === second.length && isChildUrlSegments(first, second);\n}\n\nexport function isUrlSegmentGroupsEquals(first: UrlSegmentGroup, second: UrlSegmentGroup): boolean {\n    if (!isUrlSegmentsEquals(first.segments, second.segments)) {\n        return false;\n    }\n\n    if (first.numberOfChildren !== second.numberOfChildren) {\n        return false;\n    }\n\n    const firstUrlKeys = Object.keys(first.children);\n    const secondUrlKeys = Object.keys(second.children);\n\n    const hasDifferentSegmentGroups = (key: string): boolean => {\n        const firstChildren = first.children[key];\n        const secondChildren = second.children[key];\n\n        return (\n            isNonNullable(firstChildren) &&\n            isNonNullable(secondChildren) &&\n            !isUrlSegmentGroupsEquals(firstChildren, secondChildren)\n        );\n    };\n\n    const hasDifferentSegments = (firstKeys: string[], secondKeys: string[]): boolean =>\n        firstKeys.some((key) => !secondKeys.includes(key) || hasDifferentSegmentGroups(key));\n\n    if (hasDifferentSegments(firstUrlKeys, secondUrlKeys)) {\n        return false;\n    }\n\n    if (hasDifferentSegments(secondUrlKeys, firstUrlKeys)) {\n        return false;\n    }\n\n    return true;\n}\n\nfunction isChildUrlSegmentsGroup(first: UrlSegmentGroup, second: UrlSegmentGroup): boolean {\n    return isChildUrlSegments(first.segments, second.segments);\n}\n\nexport function isUrlEquals(first: UrlTree, second: UrlTree): boolean {\n    return isUrlSegmentGroupsEquals(first.root, second.root);\n}\n\nexport function isChildRoute(currentUrl: UrlTree, possibleChildUrl: UrlTree): boolean {\n    const firstUrlKeys = Object.keys(currentUrl.root.children);\n\n    return firstUrlKeys.every((key) => {\n        const currentUrlChild = currentUrl.root.children[key];\n        const possibleChildUrlChild = possibleChildUrl.root.children[key];\n\n        return (\n            isNonNullable(possibleChildUrlChild) &&\n            isNonNullable(currentUrlChild) &&\n            isChildUrlSegmentsGroup(currentUrlChild, possibleChildUrlChild)\n        );\n    });\n}\n\nexport function isOnlyQueryParamsChanged(first: UrlTree, second: UrlTree): boolean {\n    return isUrlEquals(first, second) && !isEqualByHash(first.queryParams, second.queryParams);\n}\n\nexport function formatReturnUrl(url: string): string | undefined {\n    return url && url !== '/' ? encodeURIComponent(url) : undefined;\n}\n\nexport function whenAnySegmentChanged(from: ActivatedRouteSnapshot, to: ActivatedRouteSnapshot): boolean {\n    const fromSegments = getRouteSnapshotUrlSegments(from);\n    const toSegments = getRouteSnapshotUrlSegments(to);\n\n    return !isUrlSegmentsEquals(fromSegments, toSegments);\n}\n","import objectHash from 'object-hash';\nimport { distinctUntilChanged, MonoTypeOperatorFunction } from 'rxjs';\n\nimport { isEqualByHash } from '../../compare';\n\n/**\n * Same as {@link distinctUntilChanged} but compare input with objectHash.\n */\nexport function distinctUntilChangedByHash<T>(options?: objectHash.NormalOption): MonoTypeOperatorFunction<T> {\n    return distinctUntilChanged<T>((a, b) => isEqualByHash(a, b, options));\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAEa,MAAA,aAAa,GAAG,CAAI,CAAI,EAAE,CAAI,EAAE,OAAiC,KAAa;IACvF,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE;QACpC,OAAO,CAAC,KAAK,CAAC,CAAC;KAClB;SAAM;AACH,QAAA,OAAO,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;KAC5D;AACL;;ACuDA,SAAS,iCAAiC,CAAI,OAA0C,EAAA;IACpF,OAAO;AACH,QAAA,IAAI,EAAE,EAAE;QACR,OAAO;AACP,QAAA,mBAAmB,EAAE,EAAE;AACvB,QAAA,gBAAgB,EAAE,IAAI;AACtB,QAAA,wBAAwB,EAAE,IAAI;KACjC,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAI,eAAwC,EAAA;AAC7D,IAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,QAAQ,CAAC,eAAe,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,gBAAgB,CAAI,SAAuB,EAAA;AAChD,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,iBAAiB,CAAI,UAA2C,EAAA;AACrE,IAAA,OAAO,CAAC,KAAQ,KACZ,UAAU;SACL,GAAG,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC;SACpC,MAAM,CACH,CAAC,IAAI,EAAE,OAAO,KACV,OAAO;AACH,UAAE;AACI,YAAA,GAAG,IAAI;AACP,YAAA,GAAG,OAAO;AACb,SAAA;AACH,UAAE,IAAI,EACd,EAAE,CACL,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAI,SAAgC,EAAA;AACrD,IAAA,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,2CAAA,CAA6C,CAAC,CAAC;SAClE;AAED,QAAA,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;KACvC;SAAM;AACH,QAAA,OAAO,SAAS,CAAC;KACpB;AACL,CAAC;AAED,MAAM,0BAA0B,GAAuC;AACnE,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,QAAQ,EAAE,IAAI;CACjB,CAAC;AAEF,SAAS,sBAAsB,CAAI,iBAA6B,EAAE,SAAqB,EAAA;AACnF,IAAA,OAAO,aAAa,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,iCAAiC,CACtC,eAAwC,EAAA;AAExC,IAAA,IAAI,SAAiD,CAAC;IACtD,IAAI,mBAAmB,GAAuC,0BAA0B,CAAC;IACzF,IAAI,eAAe,GAAuB,sBAAsB,CAAC;AAEjE,IAAA,IAAI,YAAY,CAAC,eAAe,CAAC,EAAE;AAC/B,QAAA,SAAS,GAAG,YAAY,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;AACpD,QAAA,mBAAmB,GAAG;AAClB,YAAA,GAAG,0BAA0B;YAC7B,GAAG,eAAe,CAAC,mBAAmB;SACzC,CAAC;AACF,QAAA,eAAe,GAAG,eAAe,CAAC,eAAe,IAAI,eAAe,CAAC;KACxE;SAAM;AACH,QAAA,SAAS,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;KAC7C;IAED,OAAO;QACH,SAAS;QACT,mBAAmB;QACnB,eAAe;KAClB,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CAAI,SAAqB,EAAE,OAAwB,EAAA;AAC1E,IAAA,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAY,CAAC;IAChD,IAAI,CAAC,IAAI,EAAE;AACP,QAAA,OAAO,SAAS,CAAC;KACpB;AAED,IAAA,MAAM,MAAM,GAAG;AACX,QAAA,GAAG,SAAS;KACf,CAAC;AAEF,IAAA,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAmB,CAAC;AAE3C,IAAA,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,+BAA+B,CAAI,KAA8B,EAAA;IACtE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,GAAG,KAAK,CAAC;AAE3F,IAAA,mBAAmB,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;AACpC,QAAA,MAAM,iBAAiB,GAAsB;YACzC,OAAO;YACP,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;YAChD,gBAAgB;YAChB,wBAAwB;SAC3B,CAAC;QAEF,8BAA8B,CAAC,iBAAiB,CAAC,CAAC;AACtD,KAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,gCAAgC,CAAI,KAA8B,EAAE,OAAwB,EAAA;IACjG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC9C,QAAA,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KAC3C;AACL,CAAC;AAED,SAAS,uBAAuB,CAAI,KAA8B,EAAA;AAC9D,IAAA,KAAK,CAAC,wBAAwB,GAAG,KAAK,CAAC,gBAAgB,CAAC;AACxD,IAAA,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAEK,SAAU,qBAAqB,CAAI,eAAwC,EAAA;IAC7E,MAAM,KAAK,GAAG,iCAAiC,CAAC,iCAAiC,CAAC,eAAe,CAAC,CAAC,CAAC;AAEpG,IAAA,MAAM,SAAS,GAAG,CAAC,OAAwB,KAAU;QACjD,MAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/D,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAE1E,IAAI,CAAC,OAAO,EAAE;AACV,YAAA,KAAK,CAAC,IAAI,GAAG,cAAc,CAAC;YAC5B,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC/B,+BAA+B,CAAC,KAAK,CAAC,CAAC;SAC1C;AACL,KAAC,CAAC;IAEF,OAAO;AACH,QAAA,IAAI,EAAE,CAAC,OAAO,KAAI;YACd,SAAS,CAAC,OAAO,CAAC,CAAC;AAEnB,YAAA,OAAO,IAAI,CAAC;SACf;AACD,QAAA,QAAQ,EAAE,CAAC,OAAO,KAAI;AAClB,YAAA,gCAAgC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACjD,SAAS,CAAC,OAAO,CAAC,CAAC;YAEnB,OAAO,KAAK,CAAC,gBAAgB,CAAC;SACjC;QACD,UAAU,EAAE,MAAK;YACb,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC/B,+BAA+B,CAAC,KAAK,CAAC,CAAC;YAEvC,OAAO,KAAK,CAAC,gBAAgB,CAAC;SACjC;AACD,QAAA,gBAAgB,EAAE,CAAC,OAAO,KAAI;AAC1B,YAAA,gCAAgC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAEjD,OAAO,KAAK,CAAC,gBAAgB,CAAC;SACjC;KACJ,CAAC;AACN;;ACxNM,SAAU,YAAY,CAAC,KAAyC,EAAA;IAClE,IAAI,CAAC,KAAK,EAAE;AACR,QAAA,OAAO,EAAE,CAAC;KACb;AAED,IAAA,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;IAC/B,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;IAEzG,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;AAC7D,CAAC;AAEK,SAAU,2BAA2B,CAAC,KAAyC,EAAA;IACjF,IAAI,CAAC,KAAK,EAAE;AACR,QAAA,OAAO,EAAE,CAAC;KACb;IAED,IAAI,QAAQ,GAAiB,EAAE,CAAC;AAEhC,IAAA,IAAI,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;IAC7B,OAAO,KAAK,EAAE;QACV,QAAQ,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AACvC,QAAA,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;KAC5B;AAED,IAAA,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAqB,EAAE,aAA2B,EAAA;AAC1E,IAAA,OAAO,aAAa,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAChH,CAAC;AAEe,SAAA,mBAAmB,CAAC,KAAmB,EAAE,MAAoB,EAAA;AACzE,IAAA,OAAO,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC/E,CAAC;AAEe,SAAA,wBAAwB,CAAC,KAAsB,EAAE,MAAuB,EAAA;AACpF,IAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE;AACvD,QAAA,OAAO,KAAK,CAAC;KAChB;IAED,IAAI,KAAK,CAAC,gBAAgB,KAAK,MAAM,CAAC,gBAAgB,EAAE;AACpD,QAAA,OAAO,KAAK,CAAC;KAChB;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEnD,IAAA,MAAM,yBAAyB,GAAG,CAAC,GAAW,KAAa;QACvD,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAE5C,QAAA,QACI,aAAa,CAAC,aAAa,CAAC;YAC5B,aAAa,CAAC,cAAc,CAAC;AAC7B,YAAA,CAAC,wBAAwB,CAAC,aAAa,EAAE,cAAc,CAAC,EAC1D;AACN,KAAC,CAAC;AAEF,IAAA,MAAM,oBAAoB,GAAG,CAAC,SAAmB,EAAE,UAAoB,KACnE,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC;AAEzF,IAAA,IAAI,oBAAoB,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE;AACnD,QAAA,OAAO,KAAK,CAAC;KAChB;AAED,IAAA,IAAI,oBAAoB,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE;AACnD,QAAA,OAAO,KAAK,CAAC;KAChB;AAED,IAAA,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAsB,EAAE,MAAuB,EAAA;IAC5E,OAAO,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAEe,SAAA,WAAW,CAAC,KAAc,EAAE,MAAe,EAAA;IACvD,OAAO,wBAAwB,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC;AAEe,SAAA,YAAY,CAAC,UAAmB,EAAE,gBAAyB,EAAA;AACvE,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAE3D,IAAA,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,KAAI;QAC9B,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAElE,QAAA,QACI,aAAa,CAAC,qBAAqB,CAAC;YACpC,aAAa,CAAC,eAAe,CAAC;AAC9B,YAAA,uBAAuB,CAAC,eAAe,EAAE,qBAAqB,CAAC,EACjE;AACN,KAAC,CAAC,CAAC;AACP,CAAC;AAEe,SAAA,wBAAwB,CAAC,KAAc,EAAE,MAAe,EAAA;AACpE,IAAA,OAAO,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;AAC/F,CAAC;AAEK,SAAU,eAAe,CAAC,GAAW,EAAA;AACvC,IAAA,OAAO,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;AACpE,CAAC;AAEe,SAAA,qBAAqB,CAAC,IAA4B,EAAE,EAA0B,EAAA;AAC1F,IAAA,MAAM,YAAY,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;AACvD,IAAA,MAAM,UAAU,GAAG,2BAA2B,CAAC,EAAE,CAAC,CAAC;AAEnD,IAAA,OAAO,CAAC,mBAAmB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAC1D;;AC7GA;;AAEG;AACG,SAAU,0BAA0B,CAAI,OAAiC,EAAA;AAC3E,IAAA,OAAO,oBAAoB,CAAI,CAAC,CAAC,EAAE,CAAC,KAAK,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3E;;ACVA;;AAEG;;;;"}