Add yet-another-react-lightbox package and update .gitignore to exclude node_modules

This commit is contained in:
IGNY8 VPS (Salman)
2025-11-12 18:50:30 +00:00
parent bd2a5570a9
commit c92f4a5edd
9304 changed files with 29 additions and 2008667 deletions

View File

@@ -1,29 +0,0 @@
import type { XYCoord } from '../interfaces.js';
import type { State } from '../reducers/dragOffset.js';
/**
* Coordinate addition
* @param a The first coordinate
* @param b The second coordinate
*/
export declare function add(a: XYCoord, b: XYCoord): XYCoord;
/**
* Coordinate subtraction
* @param a The first coordinate
* @param b The second coordinate
*/
export declare function subtract(a: XYCoord, b: XYCoord): XYCoord;
/**
* Returns the cartesian distance of the drag source component's position, based on its position
* at the time when the current drag operation has started, and the movement difference.
*
* Returns null if no item is being dragged.
*
* @param state The offset state to compute from
*/
export declare function getSourceClientOffset(state: State): XYCoord | null;
/**
* Determines the x,y offset between the client offset and the initial client offset
*
* @param state The offset state to compute from
*/
export declare function getDifferenceFromInitialOffset(state: State): XYCoord | null;

View File

@@ -1,47 +0,0 @@
/**
* Coordinate addition
* @param a The first coordinate
* @param b The second coordinate
*/ export function add(a, b) {
return {
x: a.x + b.x,
y: a.y + b.y
};
}
/**
* Coordinate subtraction
* @param a The first coordinate
* @param b The second coordinate
*/ export function subtract(a, b) {
return {
x: a.x - b.x,
y: a.y - b.y
};
}
/**
* Returns the cartesian distance of the drag source component's position, based on its position
* at the time when the current drag operation has started, and the movement difference.
*
* Returns null if no item is being dragged.
*
* @param state The offset state to compute from
*/ export function getSourceClientOffset(state) {
const { clientOffset , initialClientOffset , initialSourceClientOffset } = state;
if (!clientOffset || !initialClientOffset || !initialSourceClientOffset) {
return null;
}
return subtract(add(clientOffset, initialSourceClientOffset), initialClientOffset);
}
/**
* Determines the x,y offset between the client offset and the initial client offset
*
* @param state The offset state to compute from
*/ export function getDifferenceFromInitialOffset(state) {
const { clientOffset , initialClientOffset } = state;
if (!clientOffset || !initialClientOffset) {
return null;
}
return subtract(clientOffset, initialClientOffset);
}
//# sourceMappingURL=coords.js.map

View File

@@ -1 +0,0 @@
{"version":3,"sources":["../../src/utils/coords.ts"],"sourcesContent":["import type { XYCoord } from '../interfaces.js'\nimport type { State } from '../reducers/dragOffset.js'\n\n/**\n * Coordinate addition\n * @param a The first coordinate\n * @param b The second coordinate\n */\nexport function add(a: XYCoord, b: XYCoord): XYCoord {\n\treturn {\n\t\tx: a.x + b.x,\n\t\ty: a.y + b.y,\n\t}\n}\n\n/**\n * Coordinate subtraction\n * @param a The first coordinate\n * @param b The second coordinate\n */\nexport function subtract(a: XYCoord, b: XYCoord): XYCoord {\n\treturn {\n\t\tx: a.x - b.x,\n\t\ty: a.y - b.y,\n\t}\n}\n\n/**\n * Returns the cartesian distance of the drag source component's position, based on its position\n * at the time when the current drag operation has started, and the movement difference.\n *\n * Returns null if no item is being dragged.\n *\n * @param state The offset state to compute from\n */\nexport function getSourceClientOffset(state: State): XYCoord | null {\n\tconst { clientOffset, initialClientOffset, initialSourceClientOffset } = state\n\tif (!clientOffset || !initialClientOffset || !initialSourceClientOffset) {\n\t\treturn null\n\t}\n\treturn subtract(\n\t\tadd(clientOffset, initialSourceClientOffset),\n\t\tinitialClientOffset,\n\t)\n}\n\n/**\n * Determines the x,y offset between the client offset and the initial client offset\n *\n * @param state The offset state to compute from\n */\nexport function getDifferenceFromInitialOffset(state: State): XYCoord | null {\n\tconst { clientOffset, initialClientOffset } = state\n\tif (!clientOffset || !initialClientOffset) {\n\t\treturn null\n\t}\n\treturn subtract(clientOffset, initialClientOffset)\n}\n"],"names":["add","a","b","x","y","subtract","getSourceClientOffset","state","clientOffset","initialClientOffset","initialSourceClientOffset","getDifferenceFromInitialOffset"],"mappings":"AAGA;;;;GAIG,CACH,OAAO,SAASA,GAAG,CAACC,CAAU,EAAEC,CAAU,EAAW;IACpD,OAAO;QACNC,CAAC,EAAEF,CAAC,CAACE,CAAC,GAAGD,CAAC,CAACC,CAAC;QACZC,CAAC,EAAEH,CAAC,CAACG,CAAC,GAAGF,CAAC,CAACE,CAAC;KACZ,CAAA;CACD;AAED;;;;GAIG,CACH,OAAO,SAASC,QAAQ,CAACJ,CAAU,EAAEC,CAAU,EAAW;IACzD,OAAO;QACNC,CAAC,EAAEF,CAAC,CAACE,CAAC,GAAGD,CAAC,CAACC,CAAC;QACZC,CAAC,EAAEH,CAAC,CAACG,CAAC,GAAGF,CAAC,CAACE,CAAC;KACZ,CAAA;CACD;AAED;;;;;;;GAOG,CACH,OAAO,SAASE,qBAAqB,CAACC,KAAY,EAAkB;IACnE,MAAM,EAAEC,YAAY,CAAA,EAAEC,mBAAmB,CAAA,EAAEC,yBAAyB,CAAA,EAAE,GAAGH,KAAK;IAC9E,IAAI,CAACC,YAAY,IAAI,CAACC,mBAAmB,IAAI,CAACC,yBAAyB,EAAE;QACxE,OAAO,IAAI,CAAA;KACX;IACD,OAAOL,QAAQ,CACdL,GAAG,CAACQ,YAAY,EAAEE,yBAAyB,CAAC,EAC5CD,mBAAmB,CACnB,CAAA;CACD;AAED;;;;GAIG,CACH,OAAO,SAASE,8BAA8B,CAACJ,KAAY,EAAkB;IAC5E,MAAM,EAAEC,YAAY,CAAA,EAAEC,mBAAmB,CAAA,EAAE,GAAGF,KAAK;IACnD,IAAI,CAACC,YAAY,IAAI,CAACC,mBAAmB,EAAE;QAC1C,OAAO,IAAI,CAAA;KACX;IACD,OAAOJ,QAAQ,CAACG,YAAY,EAAEC,mBAAmB,CAAC,CAAA;CAClD"}

View File

@@ -1,9 +0,0 @@
export declare const NONE: string[];
export declare const ALL: string[];
/**
* Determines if the given handler IDs are dirty or not.
*
* @param dirtyIds The set of dirty handler ids
* @param handlerIds The set of handler ids to check
*/
export declare function areDirty(dirtyIds: string[], handlerIds: string[] | undefined): boolean;

View File

@@ -1,22 +0,0 @@
import { intersection } from './js_utils.js';
export const NONE = [];
export const ALL = [];
NONE.__IS_NONE__ = true;
ALL.__IS_ALL__ = true;
/**
* Determines if the given handler IDs are dirty or not.
*
* @param dirtyIds The set of dirty handler ids
* @param handlerIds The set of handler ids to check
*/ export function areDirty(dirtyIds, handlerIds) {
if (dirtyIds === NONE) {
return false;
}
if (dirtyIds === ALL || typeof handlerIds === 'undefined') {
return true;
}
const commonIds = intersection(handlerIds, dirtyIds);
return commonIds.length > 0;
}
//# sourceMappingURL=dirtiness.js.map

View File

@@ -1 +0,0 @@
{"version":3,"sources":["../../src/utils/dirtiness.ts"],"sourcesContent":["import { intersection } from './js_utils.js'\n\nexport const NONE: string[] = []\nexport const ALL: string[] = []\n// Add these flags for debug\n;(NONE as any).__IS_NONE__ = true\n;(ALL as any).__IS_ALL__ = true\n\n/**\n * Determines if the given handler IDs are dirty or not.\n *\n * @param dirtyIds The set of dirty handler ids\n * @param handlerIds The set of handler ids to check\n */\nexport function areDirty(\n\tdirtyIds: string[],\n\thandlerIds: string[] | undefined,\n): boolean {\n\tif (dirtyIds === NONE) {\n\t\treturn false\n\t}\n\n\tif (dirtyIds === ALL || typeof handlerIds === 'undefined') {\n\t\treturn true\n\t}\n\n\tconst commonIds = intersection(handlerIds, dirtyIds)\n\treturn commonIds.length > 0\n}\n"],"names":["intersection","NONE","ALL","__IS_NONE__","__IS_ALL__","areDirty","dirtyIds","handlerIds","commonIds","length"],"mappings":"AAAA,SAASA,YAAY,QAAQ,eAAe,CAAA;AAE5C,OAAO,MAAMC,IAAI,GAAa,EAAE,CAAA;AAChC,OAAO,MAAMC,GAAG,GAAa,EAAE,CAE9B;AAAA,AAACD,IAAI,CAASE,WAAW,GAAG,IAAI,CAChC;AAAA,AAACD,GAAG,CAASE,UAAU,GAAG,IAAI;AAE/B;;;;;GAKG,CACH,OAAO,SAASC,QAAQ,CACvBC,QAAkB,EAClBC,UAAgC,EACtB;IACV,IAAID,QAAQ,KAAKL,IAAI,EAAE;QACtB,OAAO,KAAK,CAAA;KACZ;IAED,IAAIK,QAAQ,KAAKJ,GAAG,IAAI,OAAOK,UAAU,KAAK,WAAW,EAAE;QAC1D,OAAO,IAAI,CAAA;KACX;IAED,MAAMC,SAAS,GAAGR,YAAY,CAACO,UAAU,EAAED,QAAQ,CAAC;IACpD,OAAOE,SAAS,CAACC,MAAM,GAAG,CAAC,CAAA;CAC3B"}

View File

@@ -1,15 +0,0 @@
import type { XYCoord } from '../interfaces.js';
export declare type EqualityCheck<T> = (a: T, b: T) => boolean;
export declare const strictEquality: <T>(a: T, b: T) => boolean;
/**
* Determine if two cartesian coordinate offsets are equal
* @param offsetA
* @param offsetB
*/
export declare function areCoordsEqual(offsetA: XYCoord | null | undefined, offsetB: XYCoord | null | undefined): boolean;
/**
* Determines if two arrays of items are equal
* @param a The first array of items
* @param b The second array of items
*/
export declare function areArraysEqual<T>(a: T[], b: T[], isEqual?: EqualityCheck<T>): boolean;

View File

@@ -1,32 +0,0 @@
export const strictEquality = (a, b)=>a === b
;
/**
* Determine if two cartesian coordinate offsets are equal
* @param offsetA
* @param offsetB
*/ export function areCoordsEqual(offsetA, offsetB) {
if (!offsetA && !offsetB) {
return true;
} else if (!offsetA || !offsetB) {
return false;
} else {
return offsetA.x === offsetB.x && offsetA.y === offsetB.y;
}
}
/**
* Determines if two arrays of items are equal
* @param a The first array of items
* @param b The second array of items
*/ export function areArraysEqual(a, b, isEqual = strictEquality) {
if (a.length !== b.length) {
return false;
}
for(let i = 0; i < a.length; ++i){
if (!isEqual(a[i], b[i])) {
return false;
}
}
return true;
}
//# sourceMappingURL=equality.js.map

View File

@@ -1 +0,0 @@
{"version":3,"sources":["../../src/utils/equality.ts"],"sourcesContent":["import type { XYCoord } from '../interfaces.js'\n\nexport type EqualityCheck<T> = (a: T, b: T) => boolean\nexport const strictEquality = <T>(a: T, b: T): boolean => a === b\n\n/**\n * Determine if two cartesian coordinate offsets are equal\n * @param offsetA\n * @param offsetB\n */\nexport function areCoordsEqual(\n\toffsetA: XYCoord | null | undefined,\n\toffsetB: XYCoord | null | undefined,\n): boolean {\n\tif (!offsetA && !offsetB) {\n\t\treturn true\n\t} else if (!offsetA || !offsetB) {\n\t\treturn false\n\t} else {\n\t\treturn offsetA.x === offsetB.x && offsetA.y === offsetB.y\n\t}\n}\n\n/**\n * Determines if two arrays of items are equal\n * @param a The first array of items\n * @param b The second array of items\n */\nexport function areArraysEqual<T>(\n\ta: T[],\n\tb: T[],\n\tisEqual: EqualityCheck<T> = strictEquality,\n): boolean {\n\tif (a.length !== b.length) {\n\t\treturn false\n\t}\n\tfor (let i = 0; i < a.length; ++i) {\n\t\tif (!isEqual(a[i] as T, b[i] as T)) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"],"names":["strictEquality","a","b","areCoordsEqual","offsetA","offsetB","x","y","areArraysEqual","isEqual","length","i"],"mappings":"AAGA,OAAO,MAAMA,cAAc,GAAG,CAAIC,CAAI,EAAEC,CAAI,GAAcD,CAAC,KAAKC,CAAC;AAAA,CAAA;AAEjE;;;;GAIG,CACH,OAAO,SAASC,cAAc,CAC7BC,OAAmC,EACnCC,OAAmC,EACzB;IACV,IAAI,CAACD,OAAO,IAAI,CAACC,OAAO,EAAE;QACzB,OAAO,IAAI,CAAA;KACX,MAAM,IAAI,CAACD,OAAO,IAAI,CAACC,OAAO,EAAE;QAChC,OAAO,KAAK,CAAA;KACZ,MAAM;QACN,OAAOD,OAAO,CAACE,CAAC,KAAKD,OAAO,CAACC,CAAC,IAAIF,OAAO,CAACG,CAAC,KAAKF,OAAO,CAACE,CAAC,CAAA;KACzD;CACD;AAED;;;;GAIG,CACH,OAAO,SAASC,cAAc,CAC7BP,CAAM,EACNC,CAAM,EACNO,OAAyB,GAAGT,cAAc,EAChC;IACV,IAAIC,CAAC,CAACS,MAAM,KAAKR,CAAC,CAACQ,MAAM,EAAE;QAC1B,OAAO,KAAK,CAAA;KACZ;IACD,IAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGV,CAAC,CAACS,MAAM,EAAE,EAAEC,CAAC,CAAE;QAClC,IAAI,CAACF,OAAO,CAACR,CAAC,CAACU,CAAC,CAAC,EAAOT,CAAC,CAACS,CAAC,CAAC,CAAM,EAAE;YACnC,OAAO,KAAK,CAAA;SACZ;KACD;IACD,OAAO,IAAI,CAAA;CACX"}

View File

@@ -1 +0,0 @@
export declare function getNextUniqueId(): number;

View File

@@ -1,6 +0,0 @@
let nextUniqueId = 0;
export function getNextUniqueId() {
return nextUniqueId++;
}
//# sourceMappingURL=getNextUniqueId.js.map

View File

@@ -1 +0,0 @@
{"version":3,"sources":["../../src/utils/getNextUniqueId.ts"],"sourcesContent":["let nextUniqueId = 0\n\nexport function getNextUniqueId(): number {\n\treturn nextUniqueId++\n}\n"],"names":["nextUniqueId","getNextUniqueId"],"mappings":"AAAA,IAAIA,YAAY,GAAG,CAAC;AAEpB,OAAO,SAASC,eAAe,GAAW;IACzC,OAAOD,YAAY,EAAE,CAAA;CACrB"}

View File

@@ -1,33 +0,0 @@
/**
* drop-in replacement for _.get
* @param obj
* @param path
* @param defaultValue
*/
export declare function get<T>(obj: any, path: string, defaultValue: T): T;
/**
* drop-in replacement for _.without
*/
export declare function without<T>(items: T[], item: T): T[];
/**
* drop-in replacement for _.isString
* @param input
*/
export declare function isString(input: any): boolean;
/**
* drop-in replacement for _.isString
* @param input
*/
export declare function isObject(input: any): boolean;
/**
* replacement for _.xor
* @param itemsA
* @param itemsB
*/
export declare function xor<T extends string | number>(itemsA: T[], itemsB: T[]): T[];
/**
* replacement for _.intersection
* @param itemsA
* @param itemsB
*/
export declare function intersection<T>(itemsA: T[], itemsB: T[]): T[];

View File

@@ -1,57 +0,0 @@
// cheap lodash replacements
/**
* drop-in replacement for _.get
* @param obj
* @param path
* @param defaultValue
*/ export function get(obj, path, defaultValue) {
return path.split('.').reduce((a, c)=>a && a[c] ? a[c] : defaultValue || null
, obj);
}
/**
* drop-in replacement for _.without
*/ export function without(items, item) {
return items.filter((i)=>i !== item
);
}
/**
* drop-in replacement for _.isString
* @param input
*/ export function isString(input) {
return typeof input === 'string';
}
/**
* drop-in replacement for _.isString
* @param input
*/ export function isObject(input) {
return typeof input === 'object';
}
/**
* replacement for _.xor
* @param itemsA
* @param itemsB
*/ export function xor(itemsA, itemsB) {
const map = new Map();
const insertItem = (item)=>{
map.set(item, map.has(item) ? map.get(item) + 1 : 1);
};
itemsA.forEach(insertItem);
itemsB.forEach(insertItem);
const result = [];
map.forEach((count, key)=>{
if (count === 1) {
result.push(key);
}
});
return result;
}
/**
* replacement for _.intersection
* @param itemsA
* @param itemsB
*/ export function intersection(itemsA, itemsB) {
return itemsA.filter((t)=>itemsB.indexOf(t) > -1
);
}
//# sourceMappingURL=js_utils.js.map

View File

@@ -1 +0,0 @@
{"version":3,"sources":["../../src/utils/js_utils.ts"],"sourcesContent":["// cheap lodash replacements\n\n/**\n * drop-in replacement for _.get\n * @param obj\n * @param path\n * @param defaultValue\n */\nexport function get<T>(obj: any, path: string, defaultValue: T): T {\n\treturn path\n\t\t.split('.')\n\t\t.reduce((a, c) => (a && a[c] ? a[c] : defaultValue || null), obj) as T\n}\n\n/**\n * drop-in replacement for _.without\n */\nexport function without<T>(items: T[], item: T): T[] {\n\treturn items.filter((i) => i !== item)\n}\n\n/**\n * drop-in replacement for _.isString\n * @param input\n */\nexport function isString(input: any): boolean {\n\treturn typeof input === 'string'\n}\n\n/**\n * drop-in replacement for _.isString\n * @param input\n */\nexport function isObject(input: any): boolean {\n\treturn typeof input === 'object'\n}\n\n/**\n * replacement for _.xor\n * @param itemsA\n * @param itemsB\n */\nexport function xor<T extends string | number>(itemsA: T[], itemsB: T[]): T[] {\n\tconst map = new Map<T, number>()\n\tconst insertItem = (item: T) => {\n\t\tmap.set(item, map.has(item) ? (map.get(item) as number) + 1 : 1)\n\t}\n\titemsA.forEach(insertItem)\n\titemsB.forEach(insertItem)\n\n\tconst result: T[] = []\n\tmap.forEach((count, key) => {\n\t\tif (count === 1) {\n\t\t\tresult.push(key)\n\t\t}\n\t})\n\treturn result\n}\n\n/**\n * replacement for _.intersection\n * @param itemsA\n * @param itemsB\n */\nexport function intersection<T>(itemsA: T[], itemsB: T[]): T[] {\n\treturn itemsA.filter((t) => itemsB.indexOf(t) > -1)\n}\n"],"names":["get","obj","path","defaultValue","split","reduce","a","c","without","items","item","filter","i","isString","input","isObject","xor","itemsA","itemsB","map","Map","insertItem","set","has","forEach","result","count","key","push","intersection","t","indexOf"],"mappings":"AAAA,4BAA4B;AAE5B;;;;;GAKG,CACH,OAAO,SAASA,GAAG,CAAIC,GAAQ,EAAEC,IAAY,EAAEC,YAAe,EAAK;IAClE,OAAOD,IAAI,CACTE,KAAK,CAAC,GAAG,CAAC,CACVC,MAAM,CAAC,CAACC,CAAC,EAAEC,CAAC,GAAMD,CAAC,IAAIA,CAAC,CAACC,CAAC,CAAC,GAAGD,CAAC,CAACC,CAAC,CAAC,GAAGJ,YAAY,IAAI,IAAI;IAAC,EAAEF,GAAG,CAAC,CAAK;CACvE;AAED;;GAEG,CACH,OAAO,SAASO,OAAO,CAAIC,KAAU,EAAEC,IAAO,EAAO;IACpD,OAAOD,KAAK,CAACE,MAAM,CAAC,CAACC,CAAC,GAAKA,CAAC,KAAKF,IAAI;IAAA,CAAC,CAAA;CACtC;AAED;;;GAGG,CACH,OAAO,SAASG,QAAQ,CAACC,KAAU,EAAW;IAC7C,OAAO,OAAOA,KAAK,KAAK,QAAQ,CAAA;CAChC;AAED;;;GAGG,CACH,OAAO,SAASC,QAAQ,CAACD,KAAU,EAAW;IAC7C,OAAO,OAAOA,KAAK,KAAK,QAAQ,CAAA;CAChC;AAED;;;;GAIG,CACH,OAAO,SAASE,GAAG,CAA4BC,MAAW,EAAEC,MAAW,EAAO;IAC7E,MAAMC,GAAG,GAAG,IAAIC,GAAG,EAAa;IAChC,MAAMC,UAAU,GAAG,CAACX,IAAO,GAAK;QAC/BS,GAAG,CAACG,GAAG,CAACZ,IAAI,EAAES,GAAG,CAACI,GAAG,CAACb,IAAI,CAAC,GAAG,AAACS,GAAG,CAACnB,GAAG,CAACU,IAAI,CAAC,GAAc,CAAC,GAAG,CAAC,CAAC;KAChE;IACDO,MAAM,CAACO,OAAO,CAACH,UAAU,CAAC;IAC1BH,MAAM,CAACM,OAAO,CAACH,UAAU,CAAC;IAE1B,MAAMI,MAAM,GAAQ,EAAE;IACtBN,GAAG,CAACK,OAAO,CAAC,CAACE,KAAK,EAAEC,GAAG,GAAK;QAC3B,IAAID,KAAK,KAAK,CAAC,EAAE;YAChBD,MAAM,CAACG,IAAI,CAACD,GAAG,CAAC;SAChB;KACD,CAAC;IACF,OAAOF,MAAM,CAAA;CACb;AAED;;;;GAIG,CACH,OAAO,SAASI,YAAY,CAAIZ,MAAW,EAAEC,MAAW,EAAO;IAC9D,OAAOD,MAAM,CAACN,MAAM,CAAC,CAACmB,CAAC,GAAKZ,MAAM,CAACa,OAAO,CAACD,CAAC,CAAC,GAAG,CAAC,CAAC;IAAA,CAAC,CAAA;CACnD"}

View File

@@ -1,2 +0,0 @@
import type { Identifier } from '../interfaces.js';
export declare function matchesType(targetType: Identifier | Identifier[] | null, draggedItemType: Identifier | null): boolean;

View File

@@ -1,9 +0,0 @@
export function matchesType(targetType, draggedItemType) {
if (draggedItemType === null) {
return targetType === null;
}
return Array.isArray(targetType) ? targetType.some((t)=>t === draggedItemType
) : targetType === draggedItemType;
}
//# sourceMappingURL=matchesType.js.map

View File

@@ -1 +0,0 @@
{"version":3,"sources":["../../src/utils/matchesType.ts"],"sourcesContent":["import type { Identifier } from '../interfaces.js'\n\nexport function matchesType(\n\ttargetType: Identifier | Identifier[] | null,\n\tdraggedItemType: Identifier | null,\n): boolean {\n\tif (draggedItemType === null) {\n\t\treturn targetType === null\n\t}\n\treturn Array.isArray(targetType)\n\t\t? (targetType as Identifier[]).some((t) => t === draggedItemType)\n\t\t: targetType === draggedItemType\n}\n"],"names":["matchesType","targetType","draggedItemType","Array","isArray","some","t"],"mappings":"AAEA,OAAO,SAASA,WAAW,CAC1BC,UAA4C,EAC5CC,eAAkC,EACxB;IACV,IAAIA,eAAe,KAAK,IAAI,EAAE;QAC7B,OAAOD,UAAU,KAAK,IAAI,CAAA;KAC1B;IACD,OAAOE,KAAK,CAACC,OAAO,CAACH,UAAU,CAAC,GAC7B,AAACA,UAAU,CAAkBI,IAAI,CAAC,CAACC,CAAC,GAAKA,CAAC,KAAKJ,eAAe;IAAA,CAAC,GAC/DD,UAAU,KAAKC,eAAe,CAAA;CACjC"}