UNPKG

@ogs-gmbh/ngx-utils

Version:

A lightweight collection of utility functions and helpers for Angular applications

1 lines 33.2 kB
{"version":3,"file":"ogs-gmbh-ngx-utils.mjs","sources":["../../src/types/timestamp.ts","../../src/types/storage.ts","../../src/types/custom-validators.ts","../../src/consts/keyboard-keys.ts","../../src/directives/text-clamp/services/canvas-measurer-service.service.ts","../../src/directives/text-clamp/text-clamp.directive.ts","../../src/directives/throttle-click.directive.ts","../../src/public-api.ts","../../src/ogs-gmbh-ngx-utils.ts"],"sourcesContent":["/**\n * Static timestamp helper functions\n */\n/* eslint-disable-next-line @tseslint/no-extraneous-class */\nexport class TimestampUtil {\n /**\n * Validate timestamp by its value against current timestamp\n * @param {number} timestamp - Timestamp, that'll be checked\n * @return {boolean} - Returns true if Timestamp is greater than current Timestamp, otherwise false\n */\n public static isValidAgainstNow (timestamp: number): boolean {\n return timestamp > Date.now();\n }\n}\n","/**\n * Static storage helper methods\n *\n */\n/* eslint-disable-next-line @tseslint/no-extraneous-class */\nexport class StorageUtil {\n /**\n * Generate random UUID\n * @return {string} - Random UUID\n */\n public static generateRandomUUID (): string {\n return crypto.randomUUID();\n }\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\n\nexport namespace CustomValidators {\n /* eslint-disable-next-line @tseslint/no-shadow */\n export const length = (requiredLength: number): ValidatorFn => (control: AbstractControl): ValidationErrors | null => ((control.value as string).length === requiredLength\n ? { invalid: true }\n : null);\n}\n","export namespace KeyboardKeys {\n export const BACKSPACE: string = \"Backspace\";\n export const ENTER: string = \"Enter\";\n export const ESCAPE: string = \"Escape\";\n export const COMMA: string = \",\";\n export const PERIOD: string = \".\";\n export const COLON: string = \":\";\n export const HASH: string = \"#\";\n export const SPACE: string = \" \";\n export const PLUS: string = \"+\";\n export const MINUS: string = \"-\";\n export const DIGIT_0: string = \"0\";\n export const DIGIT_1: string = \"1\";\n export const DIGIT_2: string = \"2\";\n export const DIGIT_3: string = \"3\";\n export const DIGIT_4: string = \"4\";\n export const DIGIT_5: string = \"5\";\n export const DIGIT_6: string = \"6\";\n export const DIGIT_7: string = \"7\";\n export const DIGIT_8: string = \"8\";\n export const DIGIT_9: string = \"9\";\n export const LOWER_A: string = \"a\";\n export const LOWER_B: string = \"b\";\n export const LOWER_C: string = \"c\";\n export const LOWER_D: string = \"d\";\n export const LOWER_E: string = \"e\";\n export const LOWER_F: string = \"f\";\n export const LOWER_G: string = \"g\";\n export const LOWER_H: string = \"h\";\n export const LOWER_I: string = \"i\";\n export const LOWER_J: string = \"j\";\n export const LOWER_K: string = \"k\";\n export const LOWER_L: string = \"l\";\n export const LOWER_M: string = \"m\";\n export const LOWER_N: string = \"n\";\n export const LOWER_O: string = \"o\";\n export const LOWER_P: string = \"p\";\n export const LOWER_Q: string = \"q\";\n export const LOWER_R: string = \"r\";\n export const LOWER_S: string = \"s\";\n export const LOWER_T: string = \"t\";\n export const LOWER_U: string = \"u\";\n export const LOWER_V: string = \"v\";\n export const LOWER_W: string = \"w\";\n export const LOWER_X: string = \"x\";\n export const LOWER_Y: string = \"y\";\n export const LOWER_Z: string = \"z\";\n export const UPPER_A: string = \"A\";\n export const UPPER_B: string = \"B\";\n export const UPPER_C: string = \"C\";\n export const UPPER_D: string = \"D\";\n export const UPPER_E: string = \"E\";\n export const UPPER_F: string = \"F\";\n export const UPPER_G: string = \"G\";\n export const UPPER_H: string = \"H\";\n export const UPPER_I: string = \"I\";\n export const UPPER_J: string = \"J\";\n export const UPPER_K: string = \"K\";\n export const UPPER_L: string = \"L\";\n export const UPPER_M: string = \"M\";\n export const UPPER_N: string = \"N\";\n export const UPPER_O: string = \"O\";\n export const UPPER_P: string = \"P\";\n export const UPPER_Q: string = \"Q\";\n export const UPPER_R: string = \"R\";\n export const UPPER_S: string = \"S\";\n export const UPPER_T: string = \"T\";\n export const UPPER_U: string = \"U\";\n export const UPPER_V: string = \"V\";\n export const UPPER_W: string = \"W\";\n export const UPPER_X: string = \"X\";\n export const UPPER_Y: string = \"Y\";\n export const UPPER_Z: string = \"Z\";\n}\nexport namespace KeyboardKeyArrays {\n export const DIGITS: string[] = [ KeyboardKeys.DIGIT_0,\n KeyboardKeys.DIGIT_1,\n KeyboardKeys.DIGIT_2,\n KeyboardKeys.DIGIT_3,\n KeyboardKeys.DIGIT_4,\n KeyboardKeys.DIGIT_5,\n KeyboardKeys.DIGIT_6,\n KeyboardKeys.DIGIT_7,\n KeyboardKeys.DIGIT_8,\n KeyboardKeys.DIGIT_9 ];\n export const UPPER_LETTERS: string[] = [ KeyboardKeys.UPPER_A,\n KeyboardKeys.UPPER_B,\n KeyboardKeys.UPPER_C,\n KeyboardKeys.UPPER_D,\n KeyboardKeys.UPPER_E,\n KeyboardKeys.UPPER_F,\n KeyboardKeys.UPPER_G,\n KeyboardKeys.UPPER_H,\n KeyboardKeys.UPPER_I,\n KeyboardKeys.UPPER_J,\n KeyboardKeys.UPPER_K,\n KeyboardKeys.UPPER_L,\n KeyboardKeys.UPPER_M,\n KeyboardKeys.UPPER_N,\n KeyboardKeys.UPPER_O,\n KeyboardKeys.UPPER_P,\n KeyboardKeys.UPPER_Q,\n KeyboardKeys.UPPER_R,\n KeyboardKeys.UPPER_S,\n KeyboardKeys.UPPER_T,\n KeyboardKeys.UPPER_U,\n KeyboardKeys.UPPER_V,\n KeyboardKeys.UPPER_W,\n KeyboardKeys.UPPER_X,\n KeyboardKeys.UPPER_Y,\n KeyboardKeys.UPPER_Z ];\n export const LOWER_LETTERS: string[] = [ KeyboardKeys.LOWER_A,\n KeyboardKeys.LOWER_B,\n KeyboardKeys.LOWER_C,\n KeyboardKeys.LOWER_D,\n KeyboardKeys.LOWER_E,\n KeyboardKeys.LOWER_F,\n KeyboardKeys.LOWER_G,\n KeyboardKeys.LOWER_H,\n KeyboardKeys.LOWER_I,\n KeyboardKeys.LOWER_J,\n KeyboardKeys.LOWER_K,\n KeyboardKeys.LOWER_L,\n KeyboardKeys.LOWER_M,\n KeyboardKeys.LOWER_N,\n KeyboardKeys.LOWER_O,\n KeyboardKeys.LOWER_P,\n KeyboardKeys.LOWER_Q,\n KeyboardKeys.LOWER_R,\n KeyboardKeys.LOWER_S,\n KeyboardKeys.LOWER_T,\n KeyboardKeys.LOWER_U,\n KeyboardKeys.LOWER_V,\n KeyboardKeys.LOWER_W,\n KeyboardKeys.LOWER_X,\n KeyboardKeys.LOWER_Y,\n KeyboardKeys.LOWER_Z ];\n export const LETTERS: string[] = [ ...UPPER_LETTERS, ...LOWER_LETTERS ];\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * Builds a CSS font shorthand string from a computed style declaration.\n *\n * @param elementStyle - The computed CSS style of an element, containing font properties.\n * @param options.isFontKey - If true, includes letter-spacing in the resulting string for use as a cache key.\n * @returns A font shorthand string suitable for CanvasRenderingContext2D.font or as a unique font key.\n */\nfunction getFontString (elementStyle: CSSStyleDeclaration, options: { isFontKey: boolean; } | undefined = undefined): string {\n let fontString: string = `${ elementStyle.fontStyle } ${ elementStyle.fontVariant } ${ elementStyle.fontWeight } ${ elementStyle.fontSize }/${ elementStyle.lineHeight } ${ elementStyle.fontFamily }`;\n\n if (options?.isFontKey) {\n fontString += elementStyle.letterSpacing;\n fontString.trim();\n }\n\n return fontString;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CanvasMeasurerService {\n private _canvas: HTMLCanvasElement | undefined;\n\n private get canvas (): HTMLCanvasElement {\n if (this._canvas) return this._canvas;\n\n this._canvas = document.createElement(\"canvas\");\n\n return this._canvas;\n }\n\n private _canvasContext: CanvasRenderingContext2D | null = this.canvas.getContext(\"2d\");\n\n // Map of maps where each child-map represents a font and each child-map-entry is a string with the measured width\n private _stringWidthCache: Map<string, Map<string, number>> = new Map<string, Map<string, number>>();\n\n /**\n * Measures text width for a given element style and string,\n * caching results per font configuration.\n *\n * @param style - Computed CSS style of the element (font info).\n * @param text - The string to measure.\n * @returns The width in pixels, or undefined if measurement failed.\n */\n public getRenderedStringWidth (elementStyle: CSSStyleDeclaration | undefined, stringToMeasure: string): number | undefined {\n if (!elementStyle) return undefined;\n\n const fontString: string = getFontString(elementStyle, { isFontKey: true });\n\n let fontMap: Map<string, number> | undefined = this._stringWidthCache.get(fontString);\n\n if (!fontMap) {\n fontMap = new Map<string, number>();\n this._stringWidthCache.set(fontString, fontMap);\n }\n\n let width: number | undefined = fontMap.get(stringToMeasure);\n\n if (width) return width;\n\n\n if (this._canvasContext) {\n this.setCanvasFont(elementStyle);\n width = this._canvasContext.measureText(stringToMeasure).width;\n fontMap.set(stringToMeasure, width);\n\n return width;\n }\n\n return undefined;\n }\n\n private setCanvasFont (elementStyle: CSSStyleDeclaration): void {\n if (this._canvasContext?.font) {\n const fontString: string = getFontString(elementStyle);\n\n if (this._canvasContext.font === fontString && this._canvasContext.letterSpacing === elementStyle.letterSpacing) return;\n\n this._canvasContext.font = fontString;\n this._canvasContext.letterSpacing = elementStyle.letterSpacing;\n }\n }\n}\n","/* eslint-disable @tseslint/no-non-null-assertion */\nimport { AfterViewInit, computed, Directive, ElementRef, inject, input, InputSignal, Renderer2, Signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { animationFrameScheduler, debounceTime, filter, fromEvent, merge, Observable, throttleTime } from 'rxjs';\nimport { CanvasMeasurerService } from './services/canvas-measurer-service.service';\n\n/**\n * Rounds a number up only if its fractional part is at or above the given threshold.\n *\n * @param value - The value to round.\n * @param threshold - The fractional cutoff (0–1) above which to round up.\n * @returns The rounded integer.\n */\nfunction roundWithThreshold (value: number, threshold: number): number {\n const integerPart: number = Math.floor(value);\n const fraction: number = value - integerPart;\n\n return fraction >= threshold\n ? Math.ceil(value)\n : integerPart;\n}\n\n/**\n * Determines whether a word of a given width fits into the remaining line width,\n * taking into account the ellipsis width on the last line.\n *\n * @param wordWidth - Pixel width of the current word.\n * @param remainingWidth - Remaining pixel width in the current line.\n * @param currentLine - 1-based index of the current line.\n * @param maxLines - Total number of allowed lines.\n * @param ellipsisWidth - Pixel width of the ellipsis string.\n * @returns True if the word can fit, false otherwise.\n */\n// eslint-disable-next-line @tseslint/max-params\nfunction fits (\n wordWidth: number,\n remainingWidth: number,\n currentLine: number,\n maxLines: number,\n ellipsisWidth: number\n): boolean {\n // If last word reached take ellipsis into account\n if (currentLine === maxLines)\n return wordWidth + ellipsisWidth <= remainingWidth;\n\n return wordWidth <= remainingWidth;\n}\n\n/**\n * Clamps text to its available space and appends a custom ellipsis.\n *\n * @remarks\n * Limits content automatically to the available size of the parent container.\n * Takes Line height into account as well as preserving whole words.\n * Works with changing input in form of signals as well as static input.\n *\n * @example **Template (HTML)**\n * ```html\n * <p\n * textClamp\n * [text]=\"myText()\"\n * [ellipsis]=\"'… more'\"></p>\n * ```\n *\n * @example **Component (TypeScript)**\n * ```ts\n * @Component({\n * standalone: true,\n * selector: 'app-foo',\n * imports: [TextClampDirective]\n * })\n * export class ArticleCardComponent {\n * protected myText: WritableSignal<string> = signal<string>(\"...\");\n *\n * protected onMyEvent(): void {\n * this.myText.set(\"something else...\")\n * }\n * }\n * ```\n */\n\n@Directive({\n selector: '[textClamp]',\n standalone: true\n})\nexport class TextClampDirective implements AfterViewInit {\n private _isTextInitialized: boolean = false;\n\n private readonly _renderer: Renderer2 = inject(Renderer2);\n\n private _htmlElement: ElementRef<HTMLElement> | undefined = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\n\n private get _nativeElement (): HTMLElement | undefined {\n if (this._htmlElement?.nativeElement)\n return this._htmlElement.nativeElement;\n\n\n return undefined;\n }\n\n public text: InputSignal<string | undefined> = input.required();\n\n public ellipsis: InputSignal<string> = input(\"...\");\n\n private _textChange$: Observable<string | undefined> = toObservable(this.text);\n\n private _canvasMeasureService: CanvasMeasurerService = inject(CanvasMeasurerService);\n\n // eslint-disable-next-line @unicorn/consistent-function-scoping\n private _words: Signal<string[]> = computed(() => {\n let words: string[] = [];\n\n if (this.text())\n\n words = this.text()!.split(\" \");\n\n return words;\n });\n\n ngAfterViewInit (): void {\n const visibility$: Observable<Event> = fromEvent(document, \"visibilitychange\");\n const focus$: Observable<Event> = fromEvent(window, \"focus\");\n const resize$: Observable<Event> = fromEvent(window, \"resize\");\n // Slower throttle for refocus\n // eslint-disable-next-line @tseslint/typedef\n const refocus$ = merge(visibility$, focus$).pipe(throttleTime(500));\n // Fast throttle for change in text or resize\n // eslint-disable-next-line @tseslint/typedef\n const fastChange$ = merge(resize$, this._textChange$).pipe(debounceTime(10));\n\n merge(refocus$, fastChange$)\n .pipe(\n filter(() => !document.hidden),\n debounceTime(0, animationFrameScheduler)\n )\n .subscribe(() => {\n void this.scheduleEllipsis();\n });\n // Setting initial text\n setTimeout(() => {\n if (this._isTextInitialized)\n void this.scheduleEllipsis();\n }, 0);\n }\n\n setText (text: string): void {\n if (this._nativeElement)\n this._renderer.setProperty(this._nativeElement, 'textContent', text);\n }\n\n /**\n * Schedules the ellipsis calculation by waiting for the font to be fully loaded so it can be measured correctly\n */\n private async scheduleEllipsis (): Promise<void> {\n await document.fonts.ready;\n setTimeout(() => {\n if (this._nativeElement && this.text()) {\n // Setting text for the text-container to adjust to its full possible height\n this.setText(this.text()!);\n\n if (this._nativeElement.clientHeight === this._nativeElement.scrollHeight) return;\n\n requestAnimationFrame(() => {\n const clampedText: string | undefined = this.getClampedText();\n\n if (clampedText)\n this.setText(clampedText);\n });\n }\n }, 0);\n }\n\n\n /**\n * Calculates the multiline ellipsis by measuring word widths\n * against the available space and line count.\n *\n * @returns clamped text or undefined if measurement went wrong\n */\n getClampedText (): string | undefined {\n if (this._nativeElement && this.text()) {\n if (!this._isTextInitialized)\n this._isTextInitialized = true;\n\n\n let clampText: string = \"\";\n\n const elementStyle: CSSStyleDeclaration | undefined = getComputedStyle(this._nativeElement);\n const lineHeight: number = Number.parseFloat(elementStyle.lineHeight);\n const lineCount: number = roundWithThreshold(this._nativeElement.clientHeight / lineHeight, 0.9);\n const ellipsisWidth: number | undefined = this._canvasMeasureService.getRenderedStringWidth(elementStyle, ` ${ this.ellipsis() } `);\n\n if (!ellipsisWidth) return undefined;\n\n let usedWordsCount: number = 0;\n let linePointer: number = 1;\n let remainingLineWidth: number = this._nativeElement.clientWidth;\n\n if (lineCount > 0) {\n for (let i: number = 0; i < this._words().length; i++) {\n // eslint-disable-next-line prefer-template\n const word: string = i === 0 ? this._words()[ i ]! : \" \" + this._words()[ i ]!;\n const wordWidth: number | undefined = this._canvasMeasureService.getRenderedStringWidth(elementStyle, word);\n\n if (!wordWidth) return undefined;\n\n // Check if word fits in line\n if (fits(wordWidth, remainingLineWidth, linePointer, lineCount, ellipsisWidth)) {\n clampText += word;\n remainingLineWidth -= wordWidth;\n usedWordsCount++;\n // eslint-disable-next-line @stylistic/ts/brace-style\n }\n // Check if there is a next line\n else if (linePointer < lineCount) {\n linePointer++;\n remainingLineWidth = this._nativeElement.clientWidth;\n\n // Check if word fits in line\n if (fits(wordWidth, remainingLineWidth, linePointer, lineCount, ellipsisWidth)) {\n clampText += word;\n remainingLineWidth -= wordWidth;\n usedWordsCount++;\n } else\n break;\n } else\n break;\n }\n\n\n if (usedWordsCount > 0 && usedWordsCount < this._words().length)\n clampText += this.ellipsis();\n }\n\n return clampText;\n }\n\n return undefined;\n }\n}\n\n","import { Directive, ElementRef, EventEmitter, inject, input, InputSignal, Output } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent, throttleTime } from 'rxjs';\n\n/**\n * Throttles click events on an HTML element.\n *\n * @remarks\n * Prevents rapid repeated clicks by allowing only one `(throttleClick)` event\n * to fire within the configured interval. Works with any clickable element.\n *\n * @example **Template (HTML)**\n * ```html\n * <button\n * (throttleClick)=\"onCounterClick($event)\"\n * [throttleTimeMs]=\"300\">\n * Counter\n * </button>\n * ```\n *\n * @example **Component (TypeScript)**\n * ```ts\n * @Component({\n * standalone: true,\n * selector: 'app-foo',\n * imports: [ThrottleClickDirective]\n * })\n * export class FooComponent {\n * onCounterClick(mouseEvent: MouseEvent): void {\n * // ...\n * }\n * }\n * ```\n */\n@Directive({\n selector: '[throttleClick]',\n standalone: true\n})\nexport class ThrottleClickDirective {\n private readonly _element: ElementRef<HTMLElement> = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Whether the first click is emitted - default is true\n */\n public leading: InputSignal<boolean> = input(true);\n\n /**\n * Whether the last click is emitted - default is true\n */\n public trailing: InputSignal<boolean> = input(true);\n\n public throttleTimeMs: InputSignal<number> = input(800);\n\n @Output() public readonly throttleClick: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>();\n\n constructor () {\n fromEvent<MouseEvent>(this._element.nativeElement, \"click\")\n .pipe(\n throttleTime(this.throttleTimeMs(), undefined, {\n leading: this.leading(),\n trailing: this.trailing()\n }),\n takeUntilDestroyed()\n )\n .subscribe((mouseEvent: MouseEvent) => {\n this.throttleClick.emit(mouseEvent);\n });\n }\n}\n","/*\n * Public API Surface of utils\n */\n\nexport * from \"./types/timestamp\";\nexport * from \"./types/storage\";\nexport * from \"./types/custom-validators\";\nexport * from \"./consts/keyboard-keys\";\nexport * from \"./directives/text-clamp/text-clamp.directive\";\nexport * from \"./directives/throttle-click.directive\";\nexport * from \"./types/to-form.type\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAAA;;AAEG;AACH;MACa,aAAa,CAAA;AACxB;;;;AAIG;IACI,OAAO,iBAAiB,CAAE,SAAiB,EAAA;AAChD,QAAA,OAAO,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;IAC/B;AACD;;ACbD;;;AAGG;AACH;MACa,WAAW,CAAA;AACtB;;;AAGG;AACI,IAAA,OAAO,kBAAkB,GAAA;AAC9B,QAAA,OAAO,MAAM,CAAC,UAAU,EAAE;IAC5B;AACD;;ACXK,IAAW;AAAjB,CAAA,UAAiB,gBAAgB,EAAA;;AAElB,IAAA,gBAAA,CAAA,MAAM,GAAG,CAAC,cAAsB,KAAkB,CAAC,OAAwB,MAAgC,OAAO,CAAC,KAAgB,CAAC,MAAM,KAAK;AAC1J,UAAE,EAAE,OAAO,EAAE,IAAI;UACf,IAAI,CAAC;AACX,CAAC,EALgB,gBAAgB,KAAhB,gBAAgB,GAAA,EAAA,CAAA,CAAA;;ACF3B,IAAW;AAAjB,CAAA,UAAiB,YAAY,EAAA;IACd,YAAA,CAAA,SAAS,GAAW,WAAW;IAC/B,YAAA,CAAA,KAAK,GAAW,OAAO;IACvB,YAAA,CAAA,MAAM,GAAW,QAAQ;IACzB,YAAA,CAAA,KAAK,GAAW,GAAG;IACnB,YAAA,CAAA,MAAM,GAAW,GAAG;IACpB,YAAA,CAAA,KAAK,GAAW,GAAG;IACnB,YAAA,CAAA,IAAI,GAAW,GAAG;IAClB,YAAA,CAAA,KAAK,GAAW,GAAG;IACnB,YAAA,CAAA,IAAI,GAAW,GAAG;IAClB,YAAA,CAAA,KAAK,GAAW,GAAG;IACnB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IACrB,YAAA,CAAA,OAAO,GAAW,GAAG;IA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"}